Skip to content

Instantly share code, notes, and snippets.

@rmmh
Created January 23, 2025 18:31
Show Gist options
  • Save rmmh/d4d94502c42937519bfecae20c6fdb68 to your computer and use it in GitHub Desktop.
Save rmmh/d4d94502c42937519bfecae20c6fdb68 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python3
import os
import time
import traceback
import pychromecast
import RPi.GPIO as GPIO
from mfrc522 import MFRC522
import glog as log
HTTP_SERVER = 'http://192.168.1.236/'
CHROMECAST_NAME = 'Playroom'
log.setLevel('INFO')
def get_chromecast():
return list(pychromecast.get_listed_chromecasts(friendly_names=[CHROMECAST_NAME])[0])[0]
tracks = {}
def reload_tracks():
global tracks
tmtime = os.stat('tracks').st_mtime
if tracks.get('mtime') != tmtime:
f = [x.split() for x in open('tracks').read().splitlines()]
tracks = {int(x): y for x, y in f}
tracks['mtime'] = tmtime
def stream_pause():
log.info('pause')
cc.wait()
cc.media_controller.pause()
def stream_fastforward():
log.info('fastforwars')
cc.wait()
cc.media_controller.seek(cc.media_controller.status.adjusted_current_time + 60)
def stream_play(uid):
log.info('play %s', tracks[uid])
cc.wait()
cc.media_controller.play_media(HTTP_SERVER + tracks[uid], 'audio/mp3')
reload_tracks()
cc = get_chromecast()
naks = 0
stream = None
last_stream = 0
reader = MFRC522()
try:
while 1:
if naks > 3:
if stream:
stream_pause()
stream, last_stream = None, stream
stat, tt = reader.MFRC522_Request(reader.PICC_REQIDL)
if stat != reader.MI_OK:
naks += 1
time.sleep(.1)
continue
stat, uidraw = reader.MFRC522_Anticoll()
try:
if stat != reader.MI_OK:
naks += 1
log.warn("nak2")
continue
naks = 0
uid = int.from_bytes(uidraw[:4], 'little')
reload_tracks()
if uid in tracks:
if tracks[uid] == "fastforward":
stream_fastforward()
naks = -30
stream = stream or last_stream
time.sleep(3)
continue
elif stream != uid:
stream_play(uid)
stream = uid
else:
log.warn('unknown card: %s', uid)
naks += 1
except pychromecast.error.NotConnected:
log.exception('chromecast disconnected')
cc = get_chromecast()
except Exception:
traceback.print_exc()
finally:
GPIO.cleanup()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment