From 22ded54d64dfd7cc3f741a398a248d0c2214e78e Mon Sep 17 00:00:00 2001 From: Tilman Date: Fri, 30 Nov 2018 22:25:20 +0000 Subject: [PATCH] Update piplayer4.py --- code/piplayer4.py | 96 ++++++++++++++++++++++++++++------------------- 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/code/piplayer4.py b/code/piplayer4.py index 70e9417..ef658c3 100644 --- a/code/piplayer4.py +++ b/code/piplayer4.py @@ -1,14 +1,17 @@ # piplayer4 - AudioLauncher # http://www.tilman.de/piplayer4 +# TODO +# logging evtl. ausdünnen +# implement seek forward/back + import RPi.GPIO as GPIO import logging import time import subprocess import select # for polling zbarcam, see http://stackoverflow.com/a/10759061/3761783 -import os -import urllib from socketIO_client import SocketIO, LoggingNamespace # https://gist.github.com/ivesdebruycker/4b08bdd5415609ce95e597c1d28e9b9e +from threading import Thread logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s - %(message)s') @@ -16,10 +19,10 @@ logging.info('Initializing TEST') # Configuration MUSIC_BASE_DIRECTORY = "mnt/NAS/" -SOUND_SCANNING = "~/sounds/scanning.mp3" -SOUND_OK = "~/sounds/ok.mp3" -SOUND_SCAN_FAIL = "~/sounds/fail.mp3" -SOUND_PLAYBACK_ERROR = "~/sounds/error.mp3" +SOUND_SCANNING = "mnt/INTERNAL/sounds/scanning.mp3" +SOUND_OK = "mnt/INTERNAL/sounds/ok-05.mp3" +SOUND_SCAN_FAIL = "mnt/INTERNAL/sounds/fail-05.mp3" +SOUND_PLAYBACK_ERROR = "mnt/INTERNAL/sounds/error.mp3" QR_SCANNER_TIMEOUT = 3 @@ -49,46 +52,62 @@ GPIO.setup(PIN_PLAY, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_NEXT, GPIO.IN, pull_up_down=GPIO.PUD_UP) -pending_play = False # to determine whether we should send a play command when we receive a pushQueue event -is_paused = True # for toggling play/pause +pending_play = False # to determine whether we should send a play command after we received a pushQueue event +is_playing = False # for toggling play/pause (stores the current status from the pushState events) socketIO = SocketIO('127.0.0.1', 3000) def play_sound(filename): socketIO.emit('clearQueue') - logging.debug('Cleared queue, now playing ' + filename) + logging.info('Cleared queue, now playing ' + filename) + global pending_play pending_play = True - socketIO.emit('addToQueue', {'uri':filename}) + socketIO.emit('addToQueue', {'service':'mpd','uri':filename}) def prev_callback(channel): - logging.info("PREVIOUS") - socketIO.emit('previous') + logging.info("PREV") + socketIO.emit('prev') ## TODO implement seek def play_callback(channel): - if (is_paused): - logging.info("PLAY") - socketIO.emit('play') - is_paused = False - else: + global is_playing + if is_playing: logging.info("PAUSE") socketIO.emit('pause') - is_paused = True + is_playing = False + else: + logging.info("PLAY") + socketIO.emit('play') + is_playing = True def next_callback(channel): logging.info("NEXT") socketIO.emit('next') ## TODO implement seek +def on_pushState(*args): + logging.debug(args[0]['status']) + global is_playing + if args[0]['status'] == 'play': + is_playing = True + else: + is_playing = False + def on_pushQueue(*args): - logging.debug("pushQueue: " + args[0]) + logging.info("pushQueue") + logging.info(args[0]) + global pending_play + logging.info(pending_play) if pending_play: - if not args[0]: - play_sound(SOUND_PLAYBACK_ERROR) - else: - socketIO.emit('play') - pending_play = False +# if not args[0]: +# play_sound(SOUND_PLAYBACK_ERROR) +# else: + socketIO.emit('play') + pending_play = False + +def queue_events_thread(): + socketIO.wait() GPIO.add_event_detect(PIN_PREV, GPIO.FALLING, callback=prev_callback, bouncetime=400) @@ -97,16 +116,20 @@ GPIO.add_event_detect(PIN_NEXT, GPIO.FALLING, callback=next_callback, bouncetime try: - # play_sound(SOUND_OK) + play_sound(SOUND_OK) + + socketIO.on('pushQueue', on_pushQueue) + socketIO.on('pushState', on_pushState) + listener_thread = Thread(target=queue_events_thread) + listener_thread.daemon = True + listener_thread.start() - #socketIO.on('pushQueue', on_pushQueue) - while True: logging.info('Wait for photo sensor') GPIO.wait_for_edge(PIN_SENSOR, GPIO.FALLING) # TEST logging.info('Photo sensor active, activating light and camera') - #play_sound(SOUND_SCANNING) + play_sound(SOUND_SCANNING) # turn LED on GPIO.output(PIN_LED, GPIO.HIGH) @@ -126,8 +149,8 @@ try: if (poll_result): # play confirmation sound - #play_sound(SOUND_OK) - #socketIO.emit('removeFromQueue', 0) + play_sound(SOUND_OK) + socketIO.emit('removeFromQueue', 0) qr_code = zbarcam.stdout.readline().rstrip() qr_code = qr_code.decode("utf-8") # python3 @@ -135,20 +158,17 @@ try: pending_play = True - if (not qr_code.startswith("http://")): + if qr_code.startswith("http://"): + socketIO.emit('addToQueue', {'service':'webradio','uri':qr_code}) + elif qr_code.startswith("spotify:"): + socketIO.emit('addToQueue', {'service':'spop','uri':qr_code}) + else: # create full path if (qr_code.startswith("/")): qr_code = qr_code[1:] full_path = MUSIC_BASE_DIRECTORY + qr_code logging.info("full_path: " + full_path) socketIO.emit('addToQueue', {'uri':full_path}) - else: - socketIO.emit('addToQueue', {'service':'webradio','uri':qr_code}) - - ###########socketIO.wait() -#https://github.com/invisibleroads/socketIO-client/issues/145 -#https://github.com/miguelgrinberg/Flask-SocketIO/issues/194 - socketIO.emit('play') else: logging.warning('Timeout on zbarcam')