#!/usr/bin/python import pygame import os import glob # on va verifier que le code barre lu par le scanneur est bien compose de digits, donc on cree un tableau definissant ce que sont des digits digits = ['0','1','2','3','4','5','6','7','8','9'] # on definit un code barre tres particulier : si il est scanne, on eteint le Raspberry shutdownbarcode = '1111111111116' # on definit le chemin ou se trouve le script, la base de donnees et quelques fichiers son cheminabsolu = "/home/sylvain/Jukebox" # on definit le chemin ou se trouve la music, sous la forme Artist/Album cheminmusic = "/home/sylvain/Jukebox/music" # on ouvre le fichier qui contient la base CSV composee de "code barre,artist,album" Par exemple : 724357808101,The Divine Comedy,Absent Friends fichier = open(os.path.join(cheminabsolu,"base.txt"), "r") # on definit une variable qui dit si le code barre scanne correspond a un album en base. par defaut il est positionne a FAUX albumindatabase=False # on definit la valeur de l evenement 'fin de chanson' pour pygame SONG_END = pygame.USEREVENT +1 pygame.init() pygame.mixer.music.set_endevent(SONG_END) #on charge la musique de demarrage du programme pour verifier que le raspberry a bien demarre. Par exemple ce bon vieux son de boot windows95:-) pygame.mixer.music.load(os.path.join(cheminabsolu,'Win95boot.wav')) pygame.mixer.music.play(0) #on attaque une boucle infinie... while True: fichier.seek(0) # tres important pour bien recommencer la recherche des barcodes depuis le debut du fichier a chaque while barcode = raw_input("scanner le disque ---> ") # on attend que l utilisateur scanne un disque, ce qui remplit automatiquement la variable barcode # on verifie si le barcode est bien compose de digits barcodelist = list(barcode) barcodeconforme = True # petite boucle pour s'assurer que le code barre n est compose que de digits for i in barcodelist : if ((i in digits) == False) : barcodeconforme = False # cas ou le code barre est conforme if barcodeconforme : # cas ou on a scanne le code barre qui donne l ordre d eteindre le raspberry if barcode == shutdownbarcode : print ('shutdown...') pygame.mixer.music.load(os.path.join(cheminabsolu,'Win95boot.wav')) pygame.mixer.music.play(0) fichier.close() os.system('sudo shutdown -h now') # dans les autres cas on cherche dans la base a quel album correspond le code barre else: albumindatabase = False #par defaut on suppose le disque pas en base for ligne in fichier: donnees = ligne.rstrip('\n\r').split(",") # pour chaque ligne on extrait donnees une liste avec 3 champs if donnees[0] == barcode : # ok on a trouve le code barre en base, on charge tous les fichiers mp3 du repertoire de l album dans la liste songs chemin = os.path.join(cheminmusic,donnees[1], donnees[2]) songs = glob.glob(chemin+'/*.mp3') # cas ou aucun mp3 dans le repertoire de l'album, on joue un fichier son qui l'explique if songs == [] : pygame.mixer.music.load(os.path.join(cheminabsolu,'baseOKmusiqueNOK.mp3')) # cas contraire, on va jouer les chansons else : albumindatabase=True # si les pistes sont numerotees, autant les jouer dans l ordre mais attention car le queing de pygame se fait en sens inverse... # numerotees veut dire 01 Titre .mp3, 02 Titre .mp3 etc orderedsongs = sorted(songs, reverse = True) # on affiche a l ecran le nombre de pistes print 'il y a '+str(len(orderedsongs))+' titres' # c est parti, on met la derniere chanson de la liste dans currentsong currentsong=orderedsongs.pop() # on la charge pygame.mixer.music.load( currentsong) print 'je joue '+currentsong # et on lance la lecture pygame.mixer.music.play(0) Playing = True # et on se met en veille pour detecter la fin de chanson pour enchainer sur la suivante while Playing: events = pygame.event.get() for event in events : if event.type == SONG_END: # cas ou pygame detecte un evenement de fin de chanson print("fin chanson") if len ( orderedsongs ) > 0: # il reste des chansons dans la liste, on continue currentsong=orderedsongs.pop() pygame.mixer.music.load( currentsong) print 'je joue '+currentsong pygame.mixer.music.play(0) else: # on a fini, on l affiche et on sort de la boucle d'evenement pour attendre un nouveau scan print("fin album") Playing = False break # cas ou le code barre n est pas en base, on joue un fichier son qui le dit if albumindatabase == False : pygame.mixer.music.load(os.path.join(cheminabsolu,'pasdanslabase.mp3')) pygame.mixer.music.play(0) else : pygame.mixer.music.load(os.path.join(cheminabsolu,'barcodeNOK.mp3')) pygame.mixer.music.play(0) fichier.close()