diff --git a/README.md b/README.md index 14cdf3e..3f2246c 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,51 @@ # Raspberry Pi CD Player (in python) -A simple and very lightweight cd player written in python (using vlc) made for raspberry pi (in my case Rpi 3b+, but it uses ~1.5% Cpu) with 1602 lcd and six buttons. +A simple and very lightweight cd player written in python (using vlc) made for raspberry pi (in my case Rpi 3b+, but it uses ~1.5% Cpu) with 1602 lcd and six buttons. I highly recommend using it inside a venv! ## Why i made it? Some time ago i made an amplifier using tpa3116 (i will put the shematic someday) to replace my cheap Panasonic. As i was suprised with change of quality event with same speakers i thought that it would also be nice if i made an cd player (i mostly play music from my cd collection). For ~1.5 year i was using either [Volumio](https://volumio.com/en/get-started/) and [Raudio](https://github.com/rern/raudio). Why either? Each one has some problems, so i was changing from time to time. On Volumio cd playback is behind a paywall, nanomesher cd plugin runs cd drive too fast (its very loud). Raudio on the other hand tends to lag and interrupt cd playback. So i thought that maybe i would be able to make one. Yes, without a web interface, but lcd and buttons are even better for me. -## What is not yet done? --airplay integration
--maybe spotify connect
--maybe usb playback
--maybe eink instead of lcd
--maybe webui as an alternative to buttons
-...
+## Plan for nearest future + - add webui + - make display refresh only if something changed + ## Dependencies -⚠ I'm sure that this list is not full and not in correct order. + +## Alpine linux +Recently I switched from raspbian to Alpine to reduce boot time. Tools like [this](https://github.com/macmpi/alpine-linux-headless-bootstrap) really make it simpler to setup. +However I was still struggling with gpio permision problems ( [solution](https://raspberrypi.stackexchange.com/questions/40105/access-gpio-pins-without-root-no-access-to-dev-mem-try-running-as-root) ), and needed to compile lgpio from source ([script](install_scripts/lgpio_compile.sh)), but libiso9660 and libcdio-utils installation wasn't nessesary. Also idk why but I needed to change `vlc.Instance()` to `vlc.Instance('--aout=alsa', '--alsa-audio-device=plughw:0,0')`, because otherways it would play audio to dummy. +Apart from that, everything works as it should. diff --git a/boot.py b/boot.py new file mode 100644 index 0000000..9acd60d --- /dev/null +++ b/boot.py @@ -0,0 +1,521 @@ +# A runatboot file +import vlc #play music +import time #control time +import discid #read discid +import musicbrainzngs #fetch data +import sys +import cdio, pycdio #cdtxt & trackcount +from multiprocessing import Process, Pipe +import threading #scheduling +from math import floor#round down +import signal +import board +from digitalio import DigitalInOut +from adafruit_character_lcd.character_lcd import Character_LCD_Mono +import os +import pylast +from pydbus import SystemBus +import timeout_decorator +import configparser +from unidecode import unidecode#decoding characters to their english ASCII version +from gpiozero import Button +from subprocess import check_call#for shutdown only +#from fonts.py import * + + +#------------PARSING CONFIG------------- +config = configparser.ConfigParser() +dir_path = os.path.dirname(os.path.realpath(__file__)) +config.read(dir_path + '/config.ini') +is_lastfm = config.getboolean('Last_Fm', 'Enable') +API_SECRET = config.get('Last_Fm', 'Api_secret') +os.environ['LAST_FM_API_SECRET'] = API_SECRET +API_KEY = config.get('Last_Fm', 'Api_key') +username = config.get('Last_Fm', 'Username') +password_hash = pylast.md5(config.get('Last_Fm', 'Password')) + +lcd_columns = config.getint('Lcd', 'Columns') +lcd_rows = config.getint('Lcd', 'Rows') + +lcd_rs = DigitalInOut(board.D26) +lcd_en = DigitalInOut(board.D25) +lcd_d4 = DigitalInOut(board.D10) +lcd_d5 = DigitalInOut(board.D9) +lcd_d6 = DigitalInOut(board.D11) +lcd_d7 = DigitalInOut(board.D0) +# Initialise the LCD class +lcd = Character_LCD_Mono( + lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) +lcd.clear() +lcd.cursor = False +lcd.blink = False + +Button_up = Button(config.get('Buttons', 'Up')) +Button_right = Button(config.get('Buttons', 'Right'),bounce_time=0.05) +Button_left = Button(config.get('Buttons', 'Left')) +Button_middle = Button(config.get('Buttons', 'Middle')) +Button_down = Button(config.get('Buttons', 'Down')) + + +command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev +textb = 15 +page = 0 +MAX_PAGE = 2 +start = 0 + +playchar = [ + 0b01000, + 0b01100, + 0b01110, + 0b01111, + 0b01110, + 0b01100, + 0b01000, + 0b00000] +pausechar = [ + 0b00000, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b00000] +stopchar = [ + 0b00000, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b00000, + 0b00000] +lcd.create_char(0, playchar) +lcd.create_char(1, pausechar) +lcd.create_char(2, stopchar) + +def MsToTime(start, end): + now_secs= '0' + str(floor((start/1000)%60)) if floor((start/1000)%60) < 10 else str(floor((start/1000)%60)) + now_min= '0' + str(floor((start/1000)/60)) if floor((start/1000)/60) < 10 else str(floor((start/1000)/60)) + end_secs= '0' + str(floor((end/1000)%60)) if floor((end/1000)%60) < 10 else str(floor((end/1000)%60)) + end_min= '0' + str(floor((end/1000)/60)) if floor((end/1000)/60) < 10 else str(floor((end/1000)/60)) + Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs + return Timer +def SearchExactTracklist(data): #function to find exalctly wchich cd was inserted + for x in range(0,len(data["disc"]["release-list"])): + for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): + for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): + if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: + return x, y +@timeout_decorator.timeout(5)#handling crash of Musicbrainzg +def FetchDataMB(): + musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", config.get('MusicBrainz', 'Mail')) + disc = discid.read()#id read + try: + result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz + return result + except musicbrainzngs.ResponseError: #if not available search for cdtext + raise ValueError("Error:can't find on musicbrainzngs") + +def FetchData(): + try: + d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) + drive_name = d.get_device() + i_tracks = d.get_num_tracks()#ilosc trackow + artists = ["Unknown"] * i_tracks + track_list = ["Unknown"] * i_tracks + album = "Unknown" + except IOError: + print("Problem finding a CD-ROM") + sys.exit(1) #if no drive exit + + try: + result = FetchDataMB() + except (ValueError, timeout_decorator.timeout_decorator.TimeoutError): #if not available search for cdtext + print("disc not found or bad response, using cdtxt instead") + cdt = d.get_cdtext() + i_first_track = pycdio.get_first_track_num(d.cd) + + for t in range(i_first_track, i_tracks + i_first_track): + for i in range(pycdio.MIN_CDTEXT_FIELD, pycdio.MAX_CDTEXT_FIELDS): + #print(pycdio.cdtext_field2str(i)) ##0-TITLE 1-PERFORMER 2-SONGWRITER 3-COMPOSER 4-MESSAGE 5-ARRANGER 6-ISRC 7-UPC_EAN 8-GENERE 9-DISC_ID + value = cdt.get(i, t) + if value is not None: + if i == 0: + track_list[t-1] = value + pass + elif i == 1: + artists[t-1] = value + pass + pass + pass + if(track_list[t-1] == "Unknown"): + track_list[t-1] = "Untitled-" + str(t) + artists[t-1] = "Unknown" + else: #if available pull from Musicbrainz + a, b=SearchExactTracklist(result) + if result.get("disc"): + artists = [result["disc"]["release-list"][a]["artist-credit-phrase"]] * i_tracks + album = result["disc"]["release-list"][a]["title"] + elif result.get("cdstub"): + artists = [result["cdstub"]["artist"]] * i_tracks + album = result["cdstub"]["title"] + if(len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) < i_tracks): #i have some albums that idk why have 1 more track according to pcdio than it should + for t in range(0,len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"])): + track_list[t]=(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][t]["recording"]["title"]) #uzupelnij tracklist + for t in range(len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]), i_tracks): + track_list[t]="Untitled-" + str(t+1) + else: + for t in range(0,i_tracks): + #print(t) + track_list[t]=(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][t]["recording"]["title"]) #uzupelnij tracklist + #print(track_list) + if(artists[0] =="Various Artists"): #if musicbrainz returns Variouus artists check if cdtxt has better info + cdt = d.get_cdtext() + i_first_track = pycdio.get_first_track_num(d.cd) + for t in range(i_first_track, i_tracks + i_first_track): + value = cdt.get(1, t) + if value != "Unknown" and value is not None: + artists[t-1] = value + pass + print(artists, '\n', track_list, '\n', album, '\n', i_tracks) + return artists, track_list, album, i_tracks +def PlayCd(conn): + try: + artists, track_list, album, i_tracks = FetchData() + except cdio.TrackError: + print("NO CD DUMBASS") + else: + instance = vlc.Instance() #uruchom vlc + player = instance.media_player_new() + medialist = instance.media_list_new() + listplayer = instance.media_list_player_new() + listplayer.set_media_player(player) + for i in (range(1,i_tracks+1)): #second option + track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) + medialist.add_media(track) + listplayer.set_media_list(medialist) + + listplayer.play() + time.sleep(5)#wait to spin + + last_scrobble="" + network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) + while True: + dump = conn.recv() + index = medialist.index_of_item(listplayer.get_media_player().get_media()) + match dump: + case 0: + conn.send([index+1, i_tracks, track_list[index], artists[index], album, MsToTime(player.get_time(), player.get_length()), player.get_state()]) + #case 1: + #listplayer.play() + case 2: + if(player.get_state() == vlc.State.Stopped): + listplayer.play() + else: + listplayer.pause() + case 3: + listplayer.stop() + #last_scrobble="" + case 4: + listplayer.next() + #last_scrobble="" + case 5: + if(player.get_position()>0.4): + player.set_position(0) + else: + listplayer.previous() + if((player.get_position()*100 > 50) and last_scrobble != track_list[index]): + last_scrobble= track_list[index] + try: + if album != "Unknown": + network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time()), album=album) + elif track_list[index] != "Unknown" and artists[index] != "Unknown": + network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time())) + print("Scrobbling success: " + artists[index] + track_list[index] + album + str(time.time())) + except Exception as e: + print("Scrobbling failed: " + artists[index] + track_list[index] + album + str(time.time())) + print("Reason? ->") + print(e) + +def loop_media(event): + print("Station ended. Moving to next station...") + listplayer.next() + +def PlayRadio(conn): + instance = vlc.Instance() + player = instance.media_player_new() + listplayer = instance.media_list_player_new() + listplayer.set_media_player(player) + + # Create a playlist + playlist = instance.media_list_new() + + radio_stations = { + "RP Main mix": "http://stream.radioparadise.com/flacm", + "RP Mellow mix": "http://stream.radioparadise.com/mellow-flacm", + "RP Rock mix": "http://stream.radioparadise.com/rock-flacm", + "RP Global mix": "http://stream.radioparadise.com/global-flacm", + "Radio 357": "https://stream.radio357.pl", + "Tok Fm": "http://radiostream.pl/tuba10-1.mp3", + "Rock Radio": "http://radiostream.pl/tuba8-1.mp3" + } + i_tracks = len(radio_stations) + # Add streams to the playlist + for station_name, stream_url in radio_stations.items(): + media = instance.media_new(stream_url) + media.set_meta(vlc.Meta.Title, station_name) + playlist.add_media(media) + + # Set the media list to the player + listplayer.set_media_list(playlist) + + # Register the callback + event_manager = player.event_manager() + event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, loop_media) + + # Start playing the first item in the playlist + print("Playing Radio Paradise streams...") + listplayer.play() + while True: + dump = conn.recv() + index = playlist.index_of_item(listplayer.get_media_player().get_media()) + current_media = player.get_media() + match dump: + case 0: + conn.send([index+1, i_tracks, list(radio_stations.keys())[index], current_media.get_meta(vlc.Meta.Artist),current_media.get_meta(vlc.Meta.Album), MsToTime(player.get_time(), player.get_length()), player.get_state()]) + #case 1: + #listplayer.play() + case 2: + if(player.get_state() == vlc.State.Stopped): + listplayer.play() + else: + listplayer.pause() + case 3: + listplayer.stop() + #last_scrobble="" + case 4: + listplayer.next() + #last_scrobble="" + case 5: + listplayer.previous() + + +def ShowCd(dump): + global textb + lcd.clear() + if(len(dump[2])>16): + if textb >= len(dump[2])+1: + textb = 16 + TrimMessage=dump[2][textb-16:textb] + textb+=1 + else: + TrimMessage=dump[2] + lcd.message=unidecode(TrimMessage) #title + lcd.cursor_position(0,1) + lcd.message=unidecode(dump[5]) # time + lcd.cursor_position(15,1) + match dump[6]: + case vlc.State.Playing: + lcd.message='\x00' + case vlc.State.Paused: + lcd.message='\x01' + case vlc.State.Stopped: + lcd.message='\x02' + case "playing": + lcd.message='\x00' + case "paused": + lcd.message='\x01' + +class BtPlayer(object): + def __new__(self): + bus = SystemBus() + manager = bus.get('org.bluez', '/') + + for obj in manager.GetManagedObjects(): + if obj.endswith('/player0') or obj.endswith('/player2') or obj.endswith('/player1'): + return bus.get('org.bluez', obj) + + raise BtPlayer.DeviceNotFoundError + + class DeviceNotFoundError(Exception): + def __init__(self): + super().__init__('No music bluetooth device was found') + +def next(): + global run, command + match page: + case 0: + if(not run): + command = 4 + else: + parent_conn.send(4) + case 2: + if(not run): + command = 4 + else: + parent_conn.send(4) + case 1: + + command = 4 +def back(): + global run, command + match page: + case 0: + if(not run): + command = 5 + else: + parent_conn.send(5) + case 2: + if(not run): + command = 5 + else: + parent_conn.send(5) + case 1: + + command = 5 +def stop(): + global run, command + match page: + case 0: + parent_conn.send(3) + case 2: + parent_conn.send(3) + case 1: + command = 3 +def pause(): + global run, command + match page: + case 0: + parent_conn.send(2) + case 2: + parent_conn.send(2) + case 1: + command = 2 +def middle(): + global start + start = time.time() + +def shutdown(): + global start, command + end = time.time() + if(end-start>2): + lcd.clear() + lcd.message="Goodbye" + check_call(['sudo', 'poweroff']) + else: + command = -1 + +Button_up.when_pressed = pause +Button_left.when_pressed = back +Button_right.when_pressed = next +Button_down.when_pressed = stop +Button_middle.when_pressed = middle +Button_middle.when_released = shutdown + +parent_conn, child_conn = Pipe() +lcd.clear() + +while True: + run = False + match command: + case 4: + page+=1 + case 5: + page-=1 + case -1: + run = True + command = 0 + if page == -1: + page = MAX_PAGE + elif page > MAX_PAGE: + page = 0 + + match page: + case 0: + lcd.clear() + lcd.message = "CD Player" + if(run): + lcd.clear() + lcd.message = "Loading..." + cdplayer = Process(target=PlayCd, args=(child_conn,)) + cdplayer.start() + time.sleep(5) + while(run): + if command == -1 and cdplayer.is_alive(): + cdplayer.kill() + cdplayer.join() + run = False + elif cdplayer.is_alive(): + parent_conn.send(0)#you must send to recive + time.sleep(0.1) + dump=parent_conn.recv() + if(dump[6] == vlc.State.Ended): + cdplayer.kill() + cdplayer.join() + lcd.clear() + run = False + else: + ShowCd(dump) + else: + run = False + command=0 + time.sleep(1) + case 1: + lcd.clear() + lcd.message = "Bluetooth" + while(run): + try: + handle = BtPlayer() + ShowCd([1,1,handle.Track['Title'], handle.Track['Artist'], 'Untitled', MsToTime(handle.Position, handle.Track['Duration']), handle.Status]) + match command: + case -1: + run=False + case 1: + handle.Play() + case 2: + handle.Pause() + case 4: + handle.Next() + case 5: + handle.Previous() + case 3: + handle.Stop() + except: + #print("Something crashed, try again") #dbus-monitor --address "unix:path=/run/dbus/system_bus_socket" "type='signal',sender='org.bluez'" + lcd.clear() + lcd.message = "Something\nwent wrong" + if(command == -1): + run=False + command = 0 + time.sleep(1) + case 2: + lcd.clear() + lcd.message = "Internet\nRadio" + if(run): + lcd.clear() + lcd.message = "Loading..." + cdplayer = Process(target=PlayRadio, args=(child_conn,)) + cdplayer.start() + time.sleep(2) + while(run): + if command == -1 and cdplayer.is_alive(): + cdplayer.kill() + cdplayer.join() + run = False + elif cdplayer.is_alive(): + parent_conn.send(0)#you must send to recive + time.sleep(0.1) + dump=parent_conn.recv() + if(dump[6] == vlc.State.Ended): + cdplayer.kill() + cdplayer.join() + lcd.clear() + run = False + else: + ShowCd(dump) + else: + run = False + command=0 + time.sleep(1) + time.sleep(0.5) diff --git a/config.ini b/config.ini new file mode 100644 index 0000000..f6a99cf --- /dev/null +++ b/config.ini @@ -0,0 +1,20 @@ +[Last_Fm] +Enable = True +Api_secret = SECRET +Api_key = KEY +Username = URNM +Password = PASS + +[Buttons] +Up = GPIO22 +Down = GPIO23 +Right = GPIO5 +Left = GPIO24 +Middle = GPIO6 + +[Lcd] +Columns = 16 +Rows = 2 + +[MusicBrainz] +Mail = example@mail.com diff --git a/install_scripts/lgpio_compile.sh b/install_scripts/lgpio_compile.sh new file mode 100644 index 0000000..9bcb24a --- /dev/null +++ b/install_scripts/lgpio_compile.sh @@ -0,0 +1,7 @@ +sudo apk add gcc g++ musl-dev make +git clone https://github.com/joan2937/lg.git +cd lg +make +sudo make install +ls /usr/local/lib | grep lgpio +pip install lgpio diff --git a/install_scripts/pip_requirements.txt b/install_scripts/pip_requirements.txt new file mode 100644 index 0000000..3004b2d --- /dev/null +++ b/install_scripts/pip_requirements.txt @@ -0,0 +1,16 @@ +Adafruit_Blinka==8.39.1 +adafruit_circuitpython_charlcd==3.4.10 +board==1.0 +discid==1.2.0 +musicbrainzngs==0.7.1 +pycdio==2.1.1 +pydbus==0.6.0 +pylast==5.3.0 +python_vlc==3.0.20123 +timeout_decorator==0.5.0 +configparser==7.0.0 +unidecode==1.3.8 +RPi.GPIO==0.7.1 +gpiozero==2.0.1 +PyGObject==3.50.0 +lgpio==0.2.2.0 diff --git a/more archival versions/README.md b/more archival versions/README.md deleted file mode 100644 index f7c60d8..0000000 --- a/more archival versions/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# Archival versions -so basically there's no rule in nameing and numeration, its just a folder of milestones which served as backup diff --git a/more archival versions/SimpleCDPlayerMenu(1 1 update to circutpythonlibrary).py b/more archival versions/SimpleCDPlayerMenu(1 1 update to circutpythonlibrary).py deleted file mode 100644 index dc87ab0..0000000 --- a/more archival versions/SimpleCDPlayerMenu(1 1 update to circutpythonlibrary).py +++ /dev/null @@ -1,61 +0,0 @@ -import subprocess -import time #control time -import RPi.GPIO as GPIO -import signal -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows -) - -GPIO.setmode(GPIO.BCM) -button_pin = 12 -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -lcd.clear() -lcd.message =" Welcome to my \n cd player" -time.sleep(2) - -''' -def run_script(): - process = subprocess.run(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py'], check=True) - lcd.clear() - lcd.message("Ejected") - return process.returncode - -while True: - lcd.clear() - lcd.message("Click for\nloading") - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - time.sleep(1) - return_code = run_script() - print(f"The script returned: {return_code}") - time.sleep(1) -''' -GPIO.setmode(GPIO.BCM) -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -process = None - -while True: - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - input_state = GPIO.input(button_pin) - time.sleep(0.5) - if input_state == False: - if process is None or process.poll() is not None: - process = subprocess.Popen(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py']) - else: - process.send_signal(signal.SIGINT) - lcd.clear() - lcd.message('Eject/Input') diff --git a/more archival versions/SimpleCDPlayerMenu(1 1).py b/more archival versions/SimpleCDPlayerMenu(1 1).py deleted file mode 100644 index 8c226df..0000000 --- a/more archival versions/SimpleCDPlayerMenu(1 1).py +++ /dev/null @@ -1,48 +0,0 @@ -import subprocess -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import time #control time -import RPi.GPIO as GPIO -import signal - -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -GPIO.setmode(GPIO.BCM) -button_pin = 12 -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -lcd.clear() -lcd.message(" Welcome to my \n cd player") -time.sleep(2) - -''' -def run_script(): - process = subprocess.run(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py'], check=True) - lcd.clear() - lcd.message("Ejected") - return process.returncode - -while True: - lcd.clear() - lcd.message("Click for\nloading") - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - time.sleep(1) - return_code = run_script() - print(f"The script returned: {return_code}") - time.sleep(1) -''' -GPIO.setmode(GPIO.BCM) -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -lcd.show_cursor(True) -process = None - -while True: - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - input_state = GPIO.input(button_pin) - time.sleep(0.5) - if input_state == False: - if process is None or process.poll() is not None: - process = subprocess.Popen(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py']) - else: - process.send_signal(signal.SIGINT) - lcd.clear() - lcd.message('Eject/Input') diff --git a/more archival versions/SimpleCDPlayerMenu(1 2 update to circutpythonlibrary).py b/more archival versions/SimpleCDPlayerMenu(1 2 update to circutpythonlibrary).py deleted file mode 100644 index 5bff2fc..0000000 --- a/more archival versions/SimpleCDPlayerMenu(1 2 update to circutpythonlibrary).py +++ /dev/null @@ -1,65 +0,0 @@ -import subprocess -import time #control time -import RPi.GPIO as GPIO -import signal -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows -) - -GPIO.setmode(GPIO.BCM) -button_pin = 12 -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -lcd.clear() -lcd.cursor = False -lcd.blink = False -lcd.message =" Welcome to my \n cd player" -time.sleep(2) - -''' -def run_script(): - process = subprocess.run(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py'], check=True) - lcd.clear() - lcd.message("Ejected") - return process.returncode - -while True: - lcd.clear() - lcd.message("Click for\nloading") - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - time.sleep(1) - return_code = run_script() - print(f"The script returned: {return_code}") - time.sleep(1) -''' -GPIO.setmode(GPIO.BCM) -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -process = None - -while True: - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - input_state = GPIO.input(button_pin) - time.sleep(0.5) - if input_state == False: - if process is None or process.poll() is not None: - process = subprocess.Popen(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py']) - else: - process.send_signal(signal.SIGINT) - lcd.clear() - lcd.cursor = True - lcd.blink = True - lcd.message('Eject/Input') diff --git a/more archival versions/SimpleCDPlayerMenu.py b/more archival versions/SimpleCDPlayerMenu.py deleted file mode 100644 index ca39044..0000000 --- a/more archival versions/SimpleCDPlayerMenu.py +++ /dev/null @@ -1,48 +0,0 @@ -import subprocess -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import time #control time -import RPi.GPIO as GPIO -import signal - -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -GPIO.setmode(GPIO.BCM) -button_pin = 12 -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) -lcd.clear() -lcd.message(" Welcome to my \n cd player") -time.sleep(2) - -''' -def run_script(): - process = subprocess.run(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py'], check=True) - lcd.clear() - lcd.message("Ejected") - return process.returncode - -while True: - lcd.clear() - lcd.message("Click for\nloading") - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - time.sleep(1) - return_code = run_script() - print(f"The script returned: {return_code}") - time.sleep(1) -''' -GPIO.setmode(GPIO.BCM) -GPIO.setup(button_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -process = None - -while True: - GPIO.wait_for_edge(button_pin, GPIO.FALLING) - input_state = GPIO.input(button_pin) - time.sleep(0.5) - if input_state == False: - if process is None or process.poll() is not None: - process = subprocess.Popen(['python', '/home/mtryb/pytest/SimpleCDPlayerv1.py']) - else: - process.send_signal(signal.SIGINT) - lcd.clear() - lcd.message('Eject/Input') diff --git a/more archival versions/SimpleCDPlayerv(1 2 state).py b/more archival versions/SimpleCDPlayerv(1 2 state).py deleted file mode 100644 index 4779816..0000000 --- a/more archival versions/SimpleCDPlayerv(1 2 state).py +++ /dev/null @@ -1,208 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import math - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - global statep - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.set_cursor(0,1) - lcd.message(wiadomosc) - lcd.set_cursor(15,1) - match statep: - case 0: - lcd.message('\x00') - case 1: - lcd.message('\x01') - case 2: - lcd.message('\x02') -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -lcd.show_cursor(False) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass diff --git a/more archival versions/SimpleCDPlayerv(1 3 multi disc).py b/more archival versions/SimpleCDPlayerv(1 3 multi disc).py deleted file mode 100644 index 68b341d..0000000 --- a/more archival versions/SimpleCDPlayerv(1 3 multi disc).py +++ /dev/null @@ -1,216 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import math - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop - -def search_exact_tracklist(data): - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - global statep - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.set_cursor(0,1) - lcd.message(wiadomosc) - lcd.set_cursor(15,1) - match statep: - case 0: - lcd.message('\x00') - case 1: - lcd.message('\x01') - case 2: - lcd.message('\x02') -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -lcd.show_cursor(False) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass diff --git a/more archival versions/SimpleCDPlayerv(1 4 1 better stopend).py b/more archival versions/SimpleCDPlayerv(1 4 1 better stopend).py deleted file mode 100644 index edf089d..0000000 --- a/more archival versions/SimpleCDPlayerv(1 4 1 better stopend).py +++ /dev/null @@ -1,215 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import math#round down -import signal - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted (previously multi cd releases didnt work) - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - stop_track(0) - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - global statep - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.set_cursor(0,1) - lcd.message(wiadomosc) - lcd.set_cursor(15,1) - match statep: - case 0: - lcd.message('\x00') - case 1: - lcd.message('\x01') - case 2: - lcd.message('\x02') -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -lcd.show_cursor(False) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -signal.pause() #wait for signal, previously it While True: pass, but it consumed 100% of cpu diff --git a/more archival versions/SimpleCDPlayerv(1 4 low usage).py b/more archival versions/SimpleCDPlayerv(1 4 low usage).py deleted file mode 100644 index 4400cb3..0000000 --- a/more archival versions/SimpleCDPlayerv(1 4 low usage).py +++ /dev/null @@ -1,216 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import math#round down -import signal - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted (previously multi cd releases didnt work) - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - global statep - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.set_cursor(0,1) - lcd.message(wiadomosc) - lcd.set_cursor(15,1) - match statep: - case 0: - lcd.message('\x00') - case 1: - lcd.message('\x01') - case 2: - lcd.message('\x02') -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -lcd.show_cursor(False) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -signal.pause() #wait for signal, previously it While True: pass, but it consumed 100% of cpu diff --git a/more archival versions/SimpleCDPlayerv1 (1 5 circuit python).py b/more archival versions/SimpleCDPlayerv1 (1 5 circuit python).py deleted file mode 100644 index 201929a..0000000 --- a/more archival versions/SimpleCDPlayerv1 (1 5 circuit python).py +++ /dev/null @@ -1,229 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -import math#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows -) -lcd.clear() -lcd.cursor = True -lcd.blink = True -lcd.message="Running\nModule" - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted (previously multi cd releases didnt work) - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - stop_track(0) - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - global statep - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message=track_list[songnumber] - lcd.cursor_position(0,1) - lcd.message=wiadomosc - lcd.cursor_position(15,1) - match statep: - case 0: - lcd.message='\x00' - case 1: - lcd.message='\x01' - case 2: - lcd.message='\x02' -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback -lcd.cursor = False -lcd.blink = False -auto_time() #run showing time -signal.pause() #wait for signal, previously it While True: pass, but it consumed 100% of cpu diff --git a/more archival versions/SimpleCDPlayerv1(1 1).py b/more archival versions/SimpleCDPlayerv1(1 1).py deleted file mode 100644 index 2569db0..0000000 --- a/more archival versions/SimpleCDPlayerv1(1 1).py +++ /dev/null @@ -1,196 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD -import math - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] - -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] - -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - listplayer.stop() - songnumber=0 -def pause_track(channel): - listplayer.pause() - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - listplayer.play() - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - #wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.set_cursor(0,1) - lcd.message(wiadomosc) - lcd.set_cursor(13,1) - lcd.message('\x00') - lcd.message('\x01') - lcd.message('\x02') -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -lcd.show_cursor(False) -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass diff --git a/more archival versions/SimpleCDPlayerv1.py b/more archival versions/SimpleCDPlayerv1.py deleted file mode 100644 index 471c4ce..0000000 --- a/more archival versions/SimpleCDPlayerv1.py +++ /dev/null @@ -1,153 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -from Adafruit_CharLCD import Adafruit_CharLCD #LCD - -# instantiate lcd and specify pins -lcd = Adafruit_CharLCD(rs=26, en=25, - d4=10, d5=9, d6=11, d7=0, - cols=16, lines=2) -lcd.clear() -lcd.message("Running\nModule") - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - listplayer.stop() - songnumber=0 -def pause_track(channel): - listplayer.pause() - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - listplayer.play() - print("Resuming ",track_list[songnumber]) -def time_track(channel): - global songnumber - #print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - wiadomosc=time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)) + "-" + time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000)) - lcd.clear() - lcd.message(track_list[songnumber]) - lcd.message('\n') - lcd.message(wiadomosc) -def auto_time(): - time_track(0) - threading.Timer(2, auto_time).start()# schedule the function to run every 2 second -def exiting(channel): - time.sleep(1) - sys.exit(0) #it wont work in VScodium/code - print('konczymy') - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -#GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=exiting, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass diff --git a/more archival versions/aio(1 0).py b/more archival versions/aio(1 0).py deleted file mode 100644 index 1b4ec51..0000000 --- a/more archival versions/aio(1 0).py +++ /dev/null @@ -1,239 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -import math#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop -i_tracks = 0 -t = None -playstop = True - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -#end of setup - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) -def next_media_playing(event): - global songnumber - global i_tracks - songnumber +=1 - if songnumber == i_tracks: - stop_track(0) - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(): - global songnumber - global statep - global t - t=threading.Timer(2,time_track) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message=track_list[songnumber] - lcd.cursor_position(0,1) - lcd.message=wiadomosc - lcd.cursor_position(15,1) - match statep: - case 0: - lcd.message='\x00' - case 1: - lcd.message='\x01' - case 2: - lcd.message='\x02' - t.start() -def exiting(channel): - global t - global playstop - print(playstop) - if playstop==True: - playstop=False - print('konczymy') - t.cancel() - stop_track(0) - lcd.clear() - else: - playstop=True - print('startujemy') - maincd() -def maincd(): - global medialist - global listplayer - global statep - global track_list - statep = 0 - track_list = [] - - fetchdata() - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - lcd.cursor = True - lcd.blink = True - lcd.message="Starting CD" - listplayer.play() - time.sleep(10)#wait to spin - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - lcd.cursor = False - lcd.blink = False - time_track() - -#setting buttons -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=exiting, bouncetime=1000) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -maincd() -signal.pause() \ No newline at end of file diff --git a/more archival versions/aio(1 1 light debugging).py b/more archival versions/aio(1 1 light debugging).py deleted file mode 100644 index 8fb5357..0000000 --- a/more archival versions/aio(1 1 light debugging).py +++ /dev/null @@ -1,243 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -import math#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop -i_tracks = 0 -t = None -playstop = True - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -#end of setup - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) -def next_media_playing(event): - global songnumber - global i_tracks - songnumber +=1 - if songnumber == i_tracks: - stop_track(0) - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(): - global songnumber - global statep - global t - t=threading.Timer(2,time_track) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message=track_list[songnumber] - lcd.cursor_position(0,1) - lcd.message=wiadomosc - lcd.cursor_position(15,1) - match statep: - case 0: - lcd.message='\x00' - case 1: - lcd.message='\x01' - case 2: - lcd.message='\x02' - t.start() -def exiting(channel): - global t - global playstop - print(playstop) - if playstop==True: - playstop=False - print('konczymy') - lcd.cursor = True - lcd.blink = True - lcd.clear() - lcd.message='Change medium' - t.cancel() - stop_track(0) - else: - playstop=True - print('startujemy') - maincd() -def maincd(): - global medialist - global listplayer - global statep - global track_list - statep = 0 - track_list = [] - fetchdata() - medialist = instance.media_list_new() - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - lcd.cursor = True - lcd.blink = True - lcd.clear() - lcd.message="Starting CD" - listplayer.play() - time.sleep(10)#wait to spin - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - lcd.cursor = False - lcd.blink = False - time_track() - -#setting buttons -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=exiting, bouncetime=1000) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -maincd() -signal.pause() \ No newline at end of file diff --git a/more archival versions/lcdandbuttons (1 3 full).py b/more archival versions/lcdandbuttons (1 3 full).py deleted file mode 100644 index ed38ca3..0000000 --- a/more archival versions/lcdandbuttons (1 3 full).py +++ /dev/null @@ -1,210 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - Timer= str(floor((player.get_time()/1000)/60)) + ":" + str(floor((player.get_time()/1000)%60)) + " - " + str(floor((player.get_length()/1000)/60)) + ":" + str(floor((player.get_length()/1000)%60)) - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command, cdplayer - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - - lcd.clear() - lcd.message=dump[2] - lcd.cursor_position(0,1) - lcd.message=dump[5] - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/more archival versions/lcdandbuttons.py b/more archival versions/lcdandbuttons.py deleted file mode 100644 index 6b06c8f..0000000 --- a/more archival versions/lcdandbuttons.py +++ /dev/null @@ -1,202 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - Timer= str(floor((player.get_time()/1000)/60)) + ":" + str(floor((player.get_time()/1000)%60)) + " - " + str(floor((player.get_length()/1000)/60)) + ":" + str(floor((player.get_length()/1000)%60)) - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command - if cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - command=0 - dump=parent_conn.recv() - print(dump) - - lcd.clear() - lcd.message=dump[2] - lcd.cursor_position(0,1) - lcd.message=dump[5] - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/more archival versions/multiproccess1.py b/more archival versions/multiproccess1.py deleted file mode 100644 index 40fb129..0000000 --- a/more archival versions/multiproccess1.py +++ /dev/null @@ -1,117 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling - - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - songnumber = 0 - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - event_manager = player.event_manager()# Get the event manager from the player - event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, lambda event: locals().update(songnumber = songnumber + 1))# Register the callback - while True: - dump = conn.recv() - conn.send([songnumber, i_tracks, track_list, data, player.get_time(), player.get_length()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - songnumber=0 - case 4: - listplayer.next() - songnumber+=1 - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command - if cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - P=threading.Timer(1, PlayerGlobalSync) - P.start() - - - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - diff --git a/more archival versions/multiprocess ( 1 0 keyboard working).py b/more archival versions/multiprocess ( 1 0 keyboard working).py deleted file mode 100644 index a7db810..0000000 --- a/more archival versions/multiprocess ( 1 0 keyboard working).py +++ /dev/null @@ -1,126 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev -kill = False - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], floor(player.get_time()/1000), floor(player.get_length()/1000), dump]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command - if cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - command=0 - dump=parent_conn.recv() - print(dump) - P=threading.Timer(1, PlayerGlobalSync) - P.start() - - - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/more archival versions/vlcbuttons(1).py b/more archival versions/vlcbuttons(1).py deleted file mode 100644 index 9e3f7f8..0000000 --- a/more archival versions/vlcbuttons(1).py +++ /dev/null @@ -1,153 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 12, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - listplayer.stop() - songnumber=0 -def pause_track(channel): - listplayer.pause() - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - listplayer.play() - print("Resuming ",track_list[songnumber]) -def time_track(channel): - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def auto_time(): - time_track(0) - threading.Timer(1, auto_time).start()# schedule the function to run every second - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=time_track, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass - -''' for event which wxecution can be stopped -import threading - -stop_event = False - -def print_hello(): - global stop_event - if not stop_event: - print("Hello!") - # Call this function again in 1 second - threading.Timer(1, print_hello).start() - -print_hello() - -# When you want to stop the event, set stop_event to True -# stop_event = True -''' \ No newline at end of file diff --git a/more archival versions/vlcbuttons(ordewr).py b/more archival versions/vlcbuttons(ordewr).py deleted file mode 100644 index 020092c..0000000 --- a/more archival versions/vlcbuttons(ordewr).py +++ /dev/null @@ -1,153 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 12, 22, 23, 24] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -#ogarnianie cd -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - listplayer.stop() - songnumber=0 -def pause_track(channel): - listplayer.pause() - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - listplayer.play() - print("Resuming ",track_list[songnumber]) -def time_track(channel): - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def auto_time(): - time_track(0) - threading.Timer(1, auto_time).start()# schedule the function to run every second - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) #ustaw eventy -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=play_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=time_track, bouncetime=1000) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -auto_time() #run showing time -while True: - pass - -''' for event which wxecution can be stopped -import threading - -stop_event = False - -def print_hello(): - global stop_event - if not stop_event: - print("Hello!") - # Call this function again in 1 second - threading.Timer(1, print_hello).start() - -print_hello() - -# When you want to stop the event, set stop_event to True -# stop_event = True -''' \ No newline at end of file diff --git a/more archival versions/vlckeyboard(1 2).py b/more archival versions/vlckeyboard(1 2).py deleted file mode 100644 index f1bd564..0000000 --- a/more archival versions/vlckeyboard(1 2).py +++ /dev/null @@ -1,147 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio - -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks() - #print("Ilosc trackow: ", i_tracks) -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown", "Utwory" : track_list} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) - except musicbrainzngs.ResponseError: - print("disc not found or bad response") - print("using cdtxt instead") - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) - -def next_media_playing(event): - print("A new media is playing.") - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) #idk what happens here -#medialist.add_media("cdda:///dev/cdrom") -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -#print(medialist.item_at_index(3)) #rozne testy -#print(medialist.item_at_index(5)) -#print(medialist.item_at_index(3).get_mrl()) -#print(medialist.count()) - -print("Now playing: " , track_list[songnumber]) -listplayer.play() - -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - - -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - - -while True: - dump = input() - match dump: - case "next": - listplayer.next() - songnumber+=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "prev": - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) - case "pause": - listplayer.pause() - case "play": - listplayer.play() - case "stop": - listplayer.stop() - songnumber=0 - case "exit": - break - case "time": - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "procent": - print(round(player.get_position()*100,2), '%') #idealne do progress bara set_position(0.2) - case "media5": - listplayer.play_item_at_index(4) #numeracja od 0 - songnumber=4 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case _: - print("zła komenda, spróbuj ponownie") - - -#player.get_media() gives -#MediaPlayerForward, MediaPlayerBackward, \ No newline at end of file diff --git a/more archival versions/vlckeyboard(1 3 adnotacje).py b/more archival versions/vlckeyboard(1 3 adnotacje).py deleted file mode 100644 index c7a5957..0000000 --- a/more archival versions/vlckeyboard(1 3 adnotacje).py +++ /dev/null @@ -1,136 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt i trackcount - -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - -def next_media_playing(event): - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -#medialist.add_media("cdda:///dev/cdrom") #to laduje jako 1 medoim, wiec nie mozna odpalac np 6 piosenki -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -print("Now playing: " , track_list[songnumber]) #startujemy -listplayer.play() -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - - -while True: - dump = input() - match dump: #sterowanie - case "next": - listplayer.next() - next_media_playing(0) - case "prev": - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) - case "pause": - listplayer.pause() - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "play": - listplayer.play() - print("Resuming ",track_list[songnumber]) - case "stop": - listplayer.stop() - songnumber=0 - case "exit": - break - case "time": - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "procent": - print(round(player.get_position()*100,2), '%') #idealne do progress bara set_position(0.2) - case "media5": - listplayer.play_item_at_index(4) #numeracja od 0 - songnumber=4 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case _: - print("zła komenda, spróbuj ponownie") - - -#player.get_media() gives -#MediaPlayerForward, MediaPlayerBackward, -#print(medialist.item_at_index(3)) #rozne testy -#print(medialist.item_at_index(5)) -#print(medialist.item_at_index(3).get_mrl()) -#print(medialist.count()) \ No newline at end of file diff --git a/more archival versions/vlckeyboard(1 3 mb cdtxt unknwn).py b/more archival versions/vlckeyboard(1 3 mb cdtxt unknwn).py deleted file mode 100644 index 59ec405..0000000 --- a/more archival versions/vlckeyboard(1 3 mb cdtxt unknwn).py +++ /dev/null @@ -1,146 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio - -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks() - #print("Ilosc trackow: ", i_tracks) -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - - -songnumber = 0 -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} - -def fetchdata(): - global track_list - global data - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][0]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][0]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - for i in range(0,i_tracks-1): - track_list.append(medium["track-list"][i]["recording"]["title"]) - -def next_media_playing(event): - print("A new media is playing.") - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -fetchdata() -print(data["Autor"],'\t',data["Album"]) -print('\n') - -instance = vlc.Instance() -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) #idk what happens here -#medialist.add_media("cdda:///dev/cdrom") -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -#print(medialist.item_at_index(3)) #rozne testy -#print(medialist.item_at_index(5)) -#print(medialist.item_at_index(3).get_mrl()) -#print(medialist.count()) - -print("Now playing: " , track_list[songnumber]) -listplayer.play() - -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - - -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - - -while True: - dump = input() - match dump: - case "next": - listplayer.next() - songnumber+=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "prev": - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) - case "pause": - listplayer.pause() - case "play": - listplayer.play() - case "stop": - listplayer.stop() - songnumber=0 - case "exit": - break - case "time": - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "procent": - print(round(player.get_position()*100,2), '%') #idealne do progress bara set_position(0.2) - case "media5": - listplayer.play_item_at_index(4) #numeracja od 0 - songnumber=4 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case _: - print("zła komenda, spróbuj ponownie") - - -#player.get_media() gives -#MediaPlayerForward, MediaPlayerBackward, \ No newline at end of file diff --git a/more archival versions/vlckeyboard.py b/more archival versions/vlckeyboard.py deleted file mode 100644 index 6fde874..0000000 --- a/more archival versions/vlckeyboard.py +++ /dev/null @@ -1,132 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio - -try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks() - #print("Ilosc trackow: ", i_tracks) -except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) - -songnumber = 0 -track_list = [] - -def fetchdata(): - global track_list - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) - except musicbrainzngs.ResponseError: - print("disc not found or bad response") - else: #Artist and album info - if result.get("disc"): - print("artist:\t%s" % - result["disc"]["release-list"][0]["artist-credit-phrase"]) - print("title:\t%s" % result["disc"]["release-list"][0]["title"]) - elif result.get("cdstub"): - print("artist:\t" % result["cdstub"]["artist"]) - print("title:\t" % result["cdstub"]["title"]) - release = result["disc"]["release-list"][0] #tracklist - medium = release["medium-list"][0] - track_list = medium["track-list"] #print(type(track_list)) #list[][][] - -def next_media_playing(event): - print("A new media is playing.") - global songnumber - songnumber +=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]["recording"]["title"]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - -fetchdata() - -print('\n') - -instance = vlc.Instance() -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) #idk what happens here -#medialist.add_media("cdda:///dev/cdrom") -for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) -listplayer.set_media_list(medialist) - - -#print(medialist.item_at_index(3)) #rozne testy -#print(medialist.item_at_index(5)) -#print(medialist.item_at_index(3).get_mrl()) -#print(medialist.count()) - -print("Now playing: " , track_list[songnumber]["recording"]["title"]) -listplayer.play() - -time.sleep(10)#wait to spin -print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - - -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - - -while True: - dump = input() - match dump: - case "next": - listplayer.next() - songnumber+=1 - if songnumber == i_tracks: - listplayer.stop() - songnumber=0 - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]["recording"]["title"]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "prev": - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]["recording"]["title"]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) - case "pause": - listplayer.pause() - case "play": - listplayer.play() - case "stop": - listplayer.stop() - songnumber=0 - case "exit": - break - case "time": - print(time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case "procent": - print(round(player.get_position()*100,2), '%') #idealne do progress bara set_position(0.2) - case "media5": - listplayer.play_item_at_index(4) #numeracja od 0 - songnumber=4 - print("Now playing: " , track_list[songnumber]["recording"]["title"]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - case _: - print("zła komenda, spróbuj ponownie") - - -#player.get_media() gives -#MediaPlayerForward, MediaPlayerBackward, \ No newline at end of file diff --git a/more archival versions/withlcd.py b/more archival versions/withlcd.py deleted file mode 100644 index 3fd8ec9..0000000 --- a/more archival versions/withlcd.py +++ /dev/null @@ -1,195 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000 -] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000 -] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000 -] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - Timer= str(floor((player.get_time()/1000)/60)) + ":" + str(floor((player.get_time()/1000)%60)) + " - " + str(floor((player.get_length()/1000)/60)) + ":" + str(floor((player.get_length()/1000)%60)) - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command - if cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - command=0 - dump=parent_conn.recv() - print(dump) - - lcd.clear() - lcd.message=dump[2] - lcd.cursor_position(0,1) - lcd.message=dump[5] - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - - P=threading.Timer(1, PlayerGlobalSync) - P.start() - - - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/releases/V1.2Multiprocessing.py b/releases/V1.2Multiprocessing.py deleted file mode 100644 index ed38ca3..0000000 --- a/releases/V1.2Multiprocessing.py +++ /dev/null @@ -1,210 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - Timer= str(floor((player.get_time()/1000)/60)) + ":" + str(floor((player.get_time()/1000)%60)) + " - " + str(floor((player.get_length()/1000)/60)) + ":" + str(floor((player.get_length()/1000)%60)) - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command, cdplayer - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - - lcd.clear() - lcd.message=dump[2] - lcd.cursor_position(0,1) - lcd.message=dump[5] - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/releases/aio.1.1.py b/releases/aio.1.1.py deleted file mode 100644 index 8fb5357..0000000 --- a/releases/aio.1.1.py +++ /dev/null @@ -1,243 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -import RPi.GPIO as GPIO#buttons -import threading #scheduling -import math#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono - -# Modify this if you have a different sized character LCD -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -# Store the custom character in the LCD's memory (in location 0) -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -songnumber = 0 #zmienne kontrolujace wyswietlanie -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -statep = 0 #0-play 1-pause 2-stop -i_tracks = 0 -t = None -playstop = True - -instance = vlc.Instance() #uruchom vlc -player = instance.media_player_new() -medialist = instance.media_list_new() -listplayer = instance.media_list_player_new() -listplayer.set_media_player(player) -#end of setup - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist - print(track_list) -def next_media_playing(event): - global songnumber - global i_tracks - songnumber +=1 - if songnumber == i_tracks: - stop_track(0) - print("Koniec tej wycieczki") - else: - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def next_track(channel): - listplayer.next() - next_media_playing(0) -def prev_track(channel): - global songnumber - listplayer.previous() - if songnumber == 0: - print("bardziej sie nie cofniesz") - else: - songnumber-=1 - print("Now playing: " , track_list[songnumber]) - time.sleep(0.25) - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) #set_time(1000) -def stop_track(channel): - global songnumber - global statep - listplayer.stop() - songnumber=0 - statep = 2 -def pause_track(channel): - global statep - listplayer.pause() - statep = 1 - print("Paused at: ", time.strftime("%H:%M:%S", time.gmtime(player.get_time()/1000)), "---", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) -def play_track(channel): - global songnumber - global statep - listplayer.play() - statep = 0 - print("Resuming ",track_list[songnumber]) -def time_track(): - global songnumber - global statep - global t - t=threading.Timer(2,time_track) - wiadomosc= str(math.floor((player.get_time()/1000)/60)) + ":" + str(math.floor((player.get_time()/1000)%60)) + " - " + str(math.floor((player.get_length()/1000)/60)) + ":" + str(math.floor((player.get_length()/1000)%60)) - lcd.clear() - lcd.message=track_list[songnumber] - lcd.cursor_position(0,1) - lcd.message=wiadomosc - lcd.cursor_position(15,1) - match statep: - case 0: - lcd.message='\x00' - case 1: - lcd.message='\x01' - case 2: - lcd.message='\x02' - t.start() -def exiting(channel): - global t - global playstop - print(playstop) - if playstop==True: - playstop=False - print('konczymy') - lcd.cursor = True - lcd.blink = True - lcd.clear() - lcd.message='Change medium' - t.cancel() - stop_track(0) - else: - playstop=True - print('startujemy') - maincd() -def maincd(): - global medialist - global listplayer - global statep - global track_list - statep = 0 - track_list = [] - fetchdata() - medialist = instance.media_list_new() - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - lcd.cursor = True - lcd.blink = True - lcd.clear() - lcd.message="Starting CD" - listplayer.play() - time.sleep(10)#wait to spin - print("Duration: ", time.strftime("%H:%M:%S", time.gmtime(player.get_length()/1000))) - lcd.cursor = False - lcd.blink = False - time_track() - -#setting buttons -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=next_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=prev_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=stop_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=pause_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=play_track, bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=exiting, bouncetime=1000) - -#auto jak sie piosenka zmienia sama -event_manager = player.event_manager()# Get the event manager from the player -event_manager.event_attach(vlc.EventType.MediaPlayerEndReached, next_media_playing)# Register the callback - -maincd() -signal.pause() \ No newline at end of file diff --git a/releases/v1.3_Scrolling.py b/releases/v1.3_Scrolling.py deleted file mode 100644 index b5bbb74..0000000 --- a/releases/v1.3_Scrolling.py +++ /dev/null @@ -1,223 +0,0 @@ -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev -textb = 15 - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "miki.klopsiki@o2.pl") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - now_secs= '0' + str(floor((player.get_time()/1000)%60)) if floor((player.get_time()/1000)%60) < 10 else str(floor((player.get_time()/1000)%60)) - now_min= '0' + str(floor((player.get_time()/1000)/60)) if floor((player.get_time()/1000)/60) < 10 else str(floor((player.get_time()/1000)/60)) - end_secs= '0' + str(floor((player.get_length()/1000)%60)) if floor((player.get_length()/1000)%60) < 10 else str(floor((player.get_length()/1000)%60)) - end_min= '0' + str(floor((player.get_length()/1000)/60)) if floor((player.get_length()/1000)/60) < 10 else str(floor((player.get_length()/1000)/60)) - Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command, cdplayer, textb - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - - lcd.clear() - - if(len(dump[2])>16): - if textb >= len(dump[2])+1: - textb = 16 - TrimMessage=dump[2][textb-16:textb] - textb+=1 - else: - TrimMessage=dump[2] - lcd.message=TrimMessage #title - lcd.cursor_position(0,1) - lcd.message=dump[5] # time - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/releases/v1.4.1_scrobblehotfix.py b/releases/v1.4.1_scrobblehotfix.py deleted file mode 100644 index bc4009e..0000000 --- a/releases/v1.4.1_scrobblehotfix.py +++ /dev/null @@ -1,254 +0,0 @@ -# A runatboot file -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons -import os -os.environ['LAST_FM_API_SECRET'] = -import pylast -API_KEY = #Lastfm login data -API_SECRET = -username = -password_hash = - - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev -textb = 15 - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - - - for t in range(i_first_track, i_tracks + i_first_track): - for i in range(pycdio.MIN_CDTEXT_FIELD, pycdio.MAX_CDTEXT_FIELDS): - #print(pycdio.cdtext_field2str(i)) ##0-TITLE 1-PERFORMER 2-SONGWRITER 3-COMPOSER 4-MESSAGE 5-ARRANGER 6-ISRC 7-UPC_EAN 8-GENERE 9-DISC_ID - value = cdt.get(i, t) - if value is not None: - if i == 0: - track_list.append(value) - pass - elif i == 1: - data["Autor"] = value - pass - pass - elif i == 0: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - last_scrobble="" - network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - now_secs= '0' + str(floor((player.get_time()/1000)%60)) if floor((player.get_time()/1000)%60) < 10 else str(floor((player.get_time()/1000)%60)) - now_min= '0' + str(floor((player.get_time()/1000)/60)) if floor((player.get_time()/1000)/60) < 10 else str(floor((player.get_time()/1000)/60)) - end_secs= '0' + str(floor((player.get_length()/1000)%60)) if floor((player.get_length()/1000)%60) < 10 else str(floor((player.get_length()/1000)%60)) - end_min= '0' + str(floor((player.get_length()/1000)/60)) if floor((player.get_length()/1000)/60) < 10 else str(floor((player.get_length()/1000)/60)) - Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - last_scrobble="" - case 4: - listplayer.next() - last_scrobble="" - case 5: - listplayer.previous() - last_scrobble="" - if((player.get_position()*100 > 50) and last_scrobble != track_list[index]): - last_scrobble= track_list[index] - if data["Album"] != "Unknown": - network.scrobble(artist=data["Autor"], title=track_list[index], timestamp=int(time.time()), album=data["Album"]) - elif track_list[index] != "Unknown" and data["Autor"] != "Unknown": - network.scrobble(artist=data["Autor"], title=track_list[index], timestamp=int(time.time())) - -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command, cdplayer, textb - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - - lcd.clear() - - if(len(dump[2])>16): - if textb >= len(dump[2])+1: - textb = 16 - TrimMessage=dump[2][textb-16:textb] - textb+=1 - else: - TrimMessage=dump[2] - lcd.message=TrimMessage #title - lcd.cursor_position(0,1) - lcd.message=dump[5] # time - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/releases/v1.4.2_hotfix2(2).py b/releases/v1.4.2_hotfix2(2).py deleted file mode 100644 index d7f1db6..0000000 --- a/releases/v1.4.2_hotfix2(2).py +++ /dev/null @@ -1,240 +0,0 @@ -# A runatboot file -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons -import os -os.environ['LAST_FM_API_SECRET'] = '' -import pylast -API_KEY = ""#Lastfm login data -API_SECRET = "" -username = "" -password_hash = pylast.md5(b"") - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev -textb = 15 - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - artists = [None] * i_tracks - track_list = [None] * i_tracks - album = "Unknown" - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - - for t in range(i_first_track, i_tracks + i_first_track): - for i in range(pycdio.MIN_CDTEXT_FIELD, pycdio.MAX_CDTEXT_FIELDS): - #print(pycdio.cdtext_field2str(i)) ##0-TITLE 1-PERFORMER 2-SONGWRITER 3-COMPOSER 4-MESSAGE 5-ARRANGER 6-ISRC 7-UPC_EAN 8-GENERE 9-DISC_ID - value = cdt.get(i, t) - if value is not None: - if i == 0: - track_list[t-1] = value - pass - elif i == 1: - artists[t-1] = value - pass - pass - pass - if(track_list[t-1] == None): - track_list[t-1] = "Untitled-" + str(t) - artists[t-1] = "Unknown" - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - artists = [result["disc"]["release-list"][a]["artist-credit-phrase"]] * i_tracks - album = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - artists = [result["cdstub"]["artist"]] * i_tracks - album = result["cdstub"]["title"] - for t in range(0,i_tracks): - track_list[t]=(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][t]["recording"]["title"]) #uzupelnij tracklist - #print(artists, '\n', track_list, '\n', album, '\n', i_tracks) - return artists, track_list, album, i_tracks -def playcd(conn): - artists, track_list, album, i_tracks = fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - last_scrobble="" - network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - now_secs= '0' + str(floor((player.get_time()/1000)%60)) if floor((player.get_time()/1000)%60) < 10 else str(floor((player.get_time()/1000)%60)) - now_min= '0' + str(floor((player.get_time()/1000)/60)) if floor((player.get_time()/1000)/60) < 10 else str(floor((player.get_time()/1000)/60)) - end_secs= '0' + str(floor((player.get_length()/1000)%60)) if floor((player.get_length()/1000)%60) < 10 else str(floor((player.get_length()/1000)%60)) - end_min= '0' + str(floor((player.get_length()/1000)/60)) if floor((player.get_length()/1000)/60) < 10 else str(floor((player.get_length()/1000)/60)) - Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs - conn.send([index+1, i_tracks, track_list[index], artists[index], album, Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - last_scrobble="" - case 4: - listplayer.next() - last_scrobble="" - case 5: - listplayer.previous() - last_scrobble="" - if((player.get_position()*100 > 50) and last_scrobble != track_list[index]): - last_scrobble= track_list[index] - if album != "Unknown": - network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time()), album=album) - elif track_list[index] != "Unknown" and artists[index] != "Unknown": - network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time())) - -def PlayerGlobalSync(): - global command, cdplayer, textb - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - #print(dump) - lcd.clear() - if(dump[6] == vlc.State.Ended): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "CD ended\nChange medium" - else: - if(len(dump[2])>16): - if textb >= len(dump[2])+1: - textb = 16 - TrimMessage=dump[2][textb-16:textb] - textb+=1 - else: - TrimMessage=dump[2] - lcd.message=TrimMessage #title - lcd.cursor_position(0,1) - lcd.message=dump[5] # time - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - diff --git a/releases/v1.4_scrobble.py b/releases/v1.4_scrobble.py deleted file mode 100644 index bfa1c47..0000000 --- a/releases/v1.4_scrobble.py +++ /dev/null @@ -1,239 +0,0 @@ -# A runatboot file -import vlc #play music -import time #control time -import discid #read discid -import musicbrainzngs #fetch data -import sys -import cdio, pycdio #cdtxt & trackcount -from multiprocessing import Process, Pipe -import threading #scheduling -from math import floor#round down -import signal#last 4 is for LCD -import board -from digitalio import DigitalInOut -from adafruit_character_lcd.character_lcd import Character_LCD_Mono -import RPi.GPIO as GPIO#buttons -import os -#---------Last fm----------- -os.environ['LAST_FM_API_SECRET'] = 'xxx'#fill with your data -import pylast -API_KEY = "yyy" -API_SECRET = "xxx" -username = "zzz" -password_hash = pylast.md5(b"aaa") - - -lcd_columns = 16 -lcd_rows = 2 - -lcd_rs = DigitalInOut(board.D26) -lcd_en = DigitalInOut(board.D25) -lcd_d4 = DigitalInOut(board.D10) -lcd_d5 = DigitalInOut(board.D9) -lcd_d6 = DigitalInOut(board.D11) -lcd_d7 = DigitalInOut(board.D0) -# Initialise the LCD class -lcd = Character_LCD_Mono( - lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) -lcd.clear() -lcd.cursor = False -lcd.blink = False - -GPIO.setmode(GPIO.BCM) #przyciski -BUTTONS = [5, 6, 22, 23, 24, 12] -GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP) - -track_list = [] -data = {"Autor" : "Unknown", "Album": "Unknown"} -i_tracks = 0 -command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev -textb = 15 - -playchar = [ - 0b01000, - 0b01100, - 0b01110, - 0b01111, - 0b01110, - 0b01100, - 0b01000, - 0b00000] -pausechar = [ - 0b00000, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b10010, - 0b00000] -stopchar = [ - 0b00000, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b11111, - 0b00000, - 0b00000] -lcd.create_char(0, playchar) -lcd.create_char(1, pausechar) -lcd.create_char(2, stopchar) - -def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted - for x in range(0,len(data["disc"]["release-list"])): - for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): - for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): - if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: - return x, y -def fetchdata(): - global track_list - global data - global i_tracks - #ogarnianie cd - try: - d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) - drive_name = d.get_device() - i_tracks = d.get_num_tracks()#ilosc trackow - except IOError: - print("Problem finding a CD-ROM") - sys.exit(1) #if no drive exit - - musicbrainzngs.set_useragent("Small_diy_cd_player", "1.4", "your@email.com") - disc = discid.read()#id read - try: - result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz - except musicbrainzngs.ResponseError: - print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext - cdt = d.get_cdtext() - i_first_track = pycdio.get_first_track_num(d.cd) - for t in range(i_first_track, i_tracks + i_first_track): - value = cdt.get(0, t) - if value is not None: - track_list.append(value) - pass - else: #if there isnt anything just type Unknowsn - track_list.append("Unknown-%s" % t) - pass - pass - else: #Artist and album info - a, b=search_exact_tracklist(result) - if result.get("disc"): - data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"] - data["Album"] = result["disc"]["release-list"][a]["title"] - elif result.get("cdstub"): - data["Autor"] = result["cdstub"]["artist"] - data["Album"] = result["cdstub"]["title"] - #print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) - for i in range(0,i_tracks): - track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist -def playcd(conn): - fetchdata() - - instance = vlc.Instance() #uruchom vlc - player = instance.media_player_new() - medialist = instance.media_list_new() - listplayer = instance.media_list_player_new() - listplayer.set_media_player(player) - for i in (range(1,i_tracks+1)): #second option - track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) - medialist.add_media(track) - listplayer.set_media_list(medialist) - - listplayer.play() - time.sleep(5)#wait to spin - - last_scrobble="" - network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) - while True: - dump = conn.recv() - index = medialist.index_of_item(listplayer.get_media_player().get_media()) - now_secs= '0' + str(floor((player.get_time()/1000)%60)) if floor((player.get_time()/1000)%60) < 10 else str(floor((player.get_time()/1000)%60)) - now_min= '0' + str(floor((player.get_time()/1000)/60)) if floor((player.get_time()/1000)/60) < 10 else str(floor((player.get_time()/1000)/60)) - end_secs= '0' + str(floor((player.get_length()/1000)%60)) if floor((player.get_length()/1000)%60) < 10 else str(floor((player.get_length()/1000)%60)) - end_min= '0' + str(floor((player.get_length()/1000)/60)) if floor((player.get_length()/1000)/60) < 10 else str(floor((player.get_length()/1000)/60)) - Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs - conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()]) - match dump: - case 0: - pass - case 1: - listplayer.play() - case 2: - listplayer.pause() - case 3: - listplayer.stop() - case 4: - listplayer.next() - case 5: - listplayer.previous() - if((player.get_position()*100 > 50) and last_scrobble != track_list[index]): - last_scrobble= track_list[index] - network.scrobble(artist=data["Autor"], title=track_list[index], timestamp=int(time.time())) - -def PlayerGlobalSync(): - global songnumber, track_list, data, i_tracks, command, cdplayer, textb - if command == -1: - if cdplayer.is_alive(): - cdplayer.kill() - cdplayer.join() - lcd.clear() - lcd.message = "Change\nmedium" - else: - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - elif cdplayer.is_alive(): - parent_conn.send(command) - time.sleep(0.1) - dump=parent_conn.recv() - print(dump) - - lcd.clear() - - if(len(dump[2])>16): - if textb >= len(dump[2])+1: - textb = 16 - TrimMessage=dump[2][textb-16:textb] - textb+=1 - else: - TrimMessage=dump[2] - lcd.message=TrimMessage #title - lcd.cursor_position(0,1) - lcd.message=dump[5] # time - lcd.cursor_position(15,1) - match dump[6]: - case vlc.State.Playing: - lcd.message='\x00' - case vlc.State.Paused: - lcd.message='\x01' - case vlc.State.Stopped: - lcd.message='\x02' - command=0 - P=threading.Timer(1, PlayerGlobalSync) - P.start() - -GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) -GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) - -parent_conn, child_conn = Pipe() -cdplayer = Process(target=playcd, args=(child_conn,)) - -cdplayer.start() -PlayerGlobalSync() - - -while True: - dump = input() - if dump == '-1': - cdplayer.kill() - cdplayer.join() - elif (dump == '-2') and not cdplayer.is_alive(): - cdplayer = Process(target=playcd, args=(child_conn,)) - cdplayer.start() - else: - command=int(dump) - diff --git a/wip_webui/README.md b/wip_webui/README.md new file mode 100644 index 0000000..ded8523 --- /dev/null +++ b/wip_webui/README.md @@ -0,0 +1,2 @@ +# Webui +It's stil work in progress, so far im just experimenting with socketio library diff --git a/wip_webui/boot_async.py b/wip_webui/boot_async.py new file mode 100644 index 0000000..2a05672 --- /dev/null +++ b/wip_webui/boot_async.py @@ -0,0 +1,484 @@ +# A runatboot file +import vlc #play music +import time #control time +import discid #read discid +import musicbrainzngs #fetch data +import sys +import cdio, pycdio #cdtxt & trackcount +from multiprocessing import Process, Pipe +import threading #scheduling +from math import floor#round down +import signal +import board +from digitalio import DigitalInOut +from adafruit_character_lcd.character_lcd import Character_LCD_Mono +import os +import pylast +from pydbus import SystemBus +import timeout_decorator +import configparser +from unidecode import unidecode#decoding characters to their english ASCII version +from gpiozero import Button +from subprocess import check_call#for shutdown only +#from fonts.py import * + + +import socketio +import asyncio + +# Create an async Socket.IO server +sio = socketio.AsyncServer(async_mode='asgi', cors_allowed_origins='*') + +# Handle a connection event +@sio.event +async def connect(sid, environ): + print(f"Client connected: {sid}") + +# Handle a message event when the client sends the name +@sio.on('send_name') +async def handle_message(sid, data): + print(f"Received name: {data}") + # Send a "hello" response back to the client asynchronously + await sio.emit('hello_response', f"Hello, {data}!", to=sid) + +# Handle a disconnection event +@sio.event +async def disconnect(sid): + print(f"Client disconnected: {sid}") + +# Create an ASGI application +app = socketio.ASGIApp(sio) + +async def run_server(): + """Run the server using Hypercorn in the background.""" + import hypercorn.asyncio + from hypercorn.config import Config + + # Create a Hypercorn config for ASGI app + config = Config() + config.bind = ["0.0.0.0:5000"] + + print("Server starting...") + # Start the server asynchronously + await hypercorn.asyncio.serve(app, config) + +#------------PARSING CONFIG------------- +config = configparser.ConfigParser() +dir_path = os.path.dirname(os.path.realpath(__file__)) +config.read(dir_path + '/config.ini') +is_lastfm = config.getboolean('Last_Fm', 'Enable') +API_SECRET = config.get('Last_Fm', 'Api_secret') +os.environ['LAST_FM_API_SECRET'] = API_SECRET +API_KEY = config.get('Last_Fm', 'Api_key') +username = config.get('Last_Fm', 'Username') +password_hash = pylast.md5(config.get('Last_Fm', 'Password')) + +lcd_columns = config.getint('Lcd', 'Columns') +lcd_rows = config.getint('Lcd', 'Rows') + +lcd_rs = DigitalInOut(board.D26) +lcd_en = DigitalInOut(board.D25) +lcd_d4 = DigitalInOut(board.D10) +lcd_d5 = DigitalInOut(board.D9) +lcd_d6 = DigitalInOut(board.D11) +lcd_d7 = DigitalInOut(board.D0) +# Initialise the LCD class +lcd = Character_LCD_Mono( + lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows) +lcd.clear() +lcd.cursor = False +lcd.blink = False + +Button_up = Button(config.get('Buttons', 'Up')) +Button_right = Button(config.get('Buttons', 'Right')) +Button_left = Button(config.get('Buttons', 'Left')) +Button_middle = Button(config.get('Buttons', 'Middle')) +Button_down = Button(config.get('Buttons', 'Down')) + + +command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev +textb = 15 +page = 0 +MAX_PAGE = 1 +start = 0 +run = False +dump=[0,0,0,0,0,0,0] + +playchar = [ + 0b01000, + 0b01100, + 0b01110, + 0b01111, + 0b01110, + 0b01100, + 0b01000, + 0b00000] +pausechar = [ + 0b00000, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b10010, + 0b00000] +stopchar = [ + 0b00000, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b11111, + 0b00000, + 0b00000] +lcd.create_char(0, playchar) +lcd.create_char(1, pausechar) +lcd.create_char(2, stopchar) + +def MsToTime(start, end): + now_secs= '0' + str(floor((start/1000)%60)) if floor((start/1000)%60) < 10 else str(floor((start/1000)%60)) + now_min= '0' + str(floor((start/1000)/60)) if floor((start/1000)/60) < 10 else str(floor((start/1000)/60)) + end_secs= '0' + str(floor((end/1000)%60)) if floor((end/1000)%60) < 10 else str(floor((end/1000)%60)) + end_min= '0' + str(floor((end/1000)/60)) if floor((end/1000)/60) < 10 else str(floor((end/1000)/60)) + Timer= now_min + ":" + now_secs + " - " + end_min + ":" + end_secs + return Timer +def SearchExactTracklist(data): #function to find exalctly wchich cd was inserted + for x in range(0,len(data["disc"]["release-list"])): + for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])): + for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])): + if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]: + return x, y +@timeout_decorator.timeout(5)#handling crash of Musicbrainzg +def FetchDataMB(): + musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", config.get('MusicBrainz', 'Mail')) + disc = discid.read()#id read + try: + result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz + return result + except musicbrainzngs.ResponseError: #if not available search for cdtext + raise ValueError("Error:can't find on musicbrainzngs") + +def FetchData(): + try: + d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN) + drive_name = d.get_device() + i_tracks = d.get_num_tracks()#ilosc trackow + artists = ["Unknown"] * i_tracks + track_list = ["Unknown"] * i_tracks + album = "Unknown" + except IOError: + print("Problem finding a CD-ROM") + sys.exit(1) #if no drive exit + + try: + result = FetchDataMB() + except (ValueError, timeout_decorator.timeout_decorator.TimeoutError): #if not available search for cdtext + print("disc not found or bad response, using cdtxt instead") + cdt = d.get_cdtext() + i_first_track = pycdio.get_first_track_num(d.cd) + + for t in range(i_first_track, i_tracks + i_first_track): + for i in range(pycdio.MIN_CDTEXT_FIELD, pycdio.MAX_CDTEXT_FIELDS): + #print(pycdio.cdtext_field2str(i)) ##0-TITLE 1-PERFORMER 2-SONGWRITER 3-COMPOSER 4-MESSAGE 5-ARRANGER 6-ISRC 7-UPC_EAN 8-GENERE 9-DISC_ID + value = cdt.get(i, t) + if value is not None: + if i == 0: + track_list[t-1] = value + pass + elif i == 1: + artists[t-1] = value + pass + pass + pass + if(track_list[t-1] == "Unknown"): + track_list[t-1] = "Untitled-" + str(t) + artists[t-1] = "Unknown" + else: #if available pull from Musicbrainz + a, b=SearchExactTracklist(result) + if result.get("disc"): + artists = [result["disc"]["release-list"][a]["artist-credit-phrase"]] * i_tracks + album = result["disc"]["release-list"][a]["title"] + elif result.get("cdstub"): + artists = [result["cdstub"]["artist"]] * i_tracks + album = result["cdstub"]["title"] + if(len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]) < i_tracks): #i have some albums that idk why have 1 more track according to pcdio than it should + for t in range(0,len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"])): + track_list[t]=(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][t]["recording"]["title"]) #uzupelnij tracklist + for t in range(len(result["disc"]["release-list"][a]["medium-list"][b]["track-list"]), i_tracks): + track_list[t]="Untitled-" + str(t+1) + else: + for t in range(0,i_tracks): + #print(t) + track_list[t]=(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][t]["recording"]["title"]) #uzupelnij tracklist + #print(track_list) + if(artists[0] =="Various Artists"): #if musicbrainz returns Variouus artists check if cdtxt has better info + cdt = d.get_cdtext() + i_first_track = pycdio.get_first_track_num(d.cd) + for t in range(i_first_track, i_tracks + i_first_track): + value = cdt.get(1, t) + if value != "Unknown" and value is not None: + artists[t-1] = value + pass + print(artists, '\n', track_list, '\n', album, '\n', i_tracks) + return artists, track_list, album, i_tracks +def PlayCd(conn): + try: + artists, track_list, album, i_tracks = FetchData() + except cdio.TrackError: + print("NO CD DUMBASS") + else: + instance = vlc.Instance() #uruchom vlc + player = instance.media_player_new() + medialist = instance.media_list_new() + listplayer = instance.media_list_player_new() + listplayer.set_media_player(player) + for i in (range(1,i_tracks+1)): #second option + track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i))) + medialist.add_media(track) + listplayer.set_media_list(medialist) + + listplayer.play() + time.sleep(5)#wait to spin + + last_scrobble="" + network = pylast.LastFMNetwork(api_key=API_KEY, api_secret=API_SECRET, username=username, password_hash=password_hash) + while True: + dump = conn.recv() + index = medialist.index_of_item(listplayer.get_media_player().get_media()) + match dump: + case 0: + conn.send([index+1, i_tracks, track_list[index], artists[index], album, MsToTime(player.get_time(), player.get_length()), player.get_state()]) + #case 1: + #listplayer.play() + case 2: + if(player.get_state() == vlc.State.Stopped): + listplayer.play() + else: + listplayer.pause() + case 3: + listplayer.stop() + #last_scrobble="" + case 4: + listplayer.next() + #last_scrobble="" + case 5: + if(player.get_position()>0.4): + player.set_position(0) + else: + listplayer.previous() + if((player.get_position()*100 > 50) and last_scrobble != track_list[index]): + last_scrobble= track_list[index] + try: + if album != "Unknown": + network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time()), album=album) + elif track_list[index] != "Unknown" and artists[index] != "Unknown": + network.scrobble(artist=artists[index], title=track_list[index], timestamp=int(time.time())) + print("Scrobbling success: " + artists[index] + track_list[index] + album + str(time.time())) + except Exception as e: + print("Scrobbling failed: " + artists[index] + track_list[index] + album + str(time.time())) + print("Reason? ->") + print(e) +def ShowCd(dump): + global textb + lcd.clear() + if(len(dump[2])>16): + if textb >= len(dump[2])+1: + textb = 16 + TrimMessage=dump[2][textb-16:textb] + textb+=1 + else: + TrimMessage=dump[2] + lcd.message=unidecode(TrimMessage) #title + lcd.cursor_position(0,1) + lcd.message=unidecode(dump[5]) # time + lcd.cursor_position(15,1) + match dump[6]: + case vlc.State.Playing: + lcd.message='\x00' + case vlc.State.Paused: + lcd.message='\x01' + case vlc.State.Stopped: + lcd.message='\x02' + case "playing": + lcd.message='\x00' + case "paused": + lcd.message='\x01' + +class BtPlayer(object): + def __new__(self): + bus = SystemBus() + manager = bus.get('org.bluez', '/') + + for obj in manager.GetManagedObjects(): + if obj.endswith('/player0') or obj.endswith('/player2') or obj.endswith('/player1'): + return bus.get('org.bluez', obj) + + raise BtPlayer.DeviceNotFoundError + + class DeviceNotFoundError(Exception): + def __init__(self): + super().__init__('No music bluetooth device was found') + +def next(): + global run, command + match page: + case 0: + if(not run): + command = 4 + else: + parent_conn.send(4) + case 1: + + command = 4 +def back(): + global run, command + match page: + case 0: + if(not run): + command = 5 + else: + parent_conn.send(5) + case 1: + + command = 5 +def stop(): + global run, command + match page: + case 0: + parent_conn.send(3) + case 1: + command = 3 +def pause(): + global run, command + match page: + case 0: + parent_conn.send(2) + case 1: + command = 2 +def middle(): + global start + start = time.time() + + +def shutdown(): + global start, command + end = time.time() + if(end-start>2): + lcd.clear() + lcd.message="Goodbye" + check_call(['sudo', 'poweroff']) + else: + command = -1 + +Button_up.when_pressed = pause +Button_left.when_pressed = back +Button_right.when_pressed = next +Button_down.when_pressed = stop +Button_middle.when_pressed = middle +Button_middle.when_released = shutdown + +parent_conn, child_conn = Pipe() +lcd.clear() + + +@sio.on('request_data') +async def handle_message(sid, data): + global dump + print(f"Received name: {data}") + # Send a "hello" response back to the client asynchronously + await sio.emit('playing_data', [dump[0], dump[1],dump[2],dump[3], dump[4],dump[5]], to=sid) + +async def main(): + global command, textb, page, MAX_PAGE, start, run, dump + """Main function to run the server in the background and continue.""" + # Run the server in the background + background_task = asyncio.create_task(run_server()) + + # Print a message indicating the server has started + print("Server has started") + + # Optionally, run other code or keep the main function alive + try: + # Keep the main function running while the server is in the background + while True: + run = False + match command: + case 4: + page+=1 + case 5: + page-=1 + case -1: + run = True + command = 0 + if page == -1: + page = MAX_PAGE + elif page > MAX_PAGE: + page = 0 + + match page: + case 0: + lcd.clear() + lcd.message = "CD Player" + if(run): + lcd.clear() + lcd.message = "Loading..." + cdplayer = Process(target=PlayCd, args=(child_conn,)) + cdplayer.start() + await asyncio.sleep(5) + while(run): + if command == -1 and cdplayer.is_alive(): + cdplayer.kill() + cdplayer.join() + run = False + elif cdplayer.is_alive(): + parent_conn.send(0)#you must send to recive + time.sleep(0.1) + dump=parent_conn.recv() + if(dump[6] == vlc.State.Ended): + cdplayer.kill() + cdplayer.join() + lcd.clear() + run = False + else: + ShowCd(dump) + else: + run = False + command=0 + await asyncio.sleep(1) + case 1: + lcd.clear() + lcd.message = "Bluetooth" + while(run): + try: + handle = BtPlayer() + ShowCd([1,1,handle.Track['Title'], handle.Track['Artist'], 'Untitled', MsToTime(handle.Position, handle.Track['Duration']), handle.Status]) + match command: + case -1: + run=False + case 1: + handle.Play() + case 2: + handle.Pause() + case 4: + handle.Next() + case 5: + handle.Previous() + case 3: + handle.Stop() + except: + #print("Something crashed, try again") #dbus-monitor --address "unix:path=/run/dbus/system_bus_socket" "type='signal',sender='org.bluez'" + lcd.clear() + lcd.message = "Something\nwent wrong" + if(command == -1): + run=False + command = 0 + await asyncio.sleep(1) + + await asyncio.sleep(0.5) + except KeyboardInterrupt: + print("Server stopped") + + +if __name__ == '__main__': + # Run the main function with asyncio + asyncio.run(main()) diff --git a/wip_webui/index.html b/wip_webui/index.html new file mode 100644 index 0000000..4d939ab --- /dev/null +++ b/wip_webui/index.html @@ -0,0 +1,67 @@ + + + + + + CD Socket.IO Client + + + + + Server disconnected +
+ +
+
+ Track:
...

+ Total tracks:
...

+ Title:
...

+ Artist:
...

+ Album:
...

+ Time:
...

+
+ + + + +