From e13a7d260c80e93c80c81c1040fa6a90b8a9a9df Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sun, 4 Feb 2024 21:54:43 +0100
Subject: [PATCH 01/48] Add files via upload
---
releases/v1.4.3_hotfix3.py | 248 +++++++++++++++++++++++++++++++++++++
1 file changed, 248 insertions(+)
create mode 100644 releases/v1.4.3_hotfix3.py
diff --git a/releases/v1.4.3_hotfix3.py b/releases/v1.4.3_hotfix3.py
new file mode 100644
index 0000000..f27b8b5
--- /dev/null
+++ b/releases/v1.4.3_hotfix3.py
@@ -0,0 +1,248 @@
+# 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
+ if(artists[0] =="Various Artists"):
+ 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 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):
+ 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()
+
From 1f95b943f3d03990a2bb411ed29e6c7d258b7604 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sat, 17 Feb 2024 12:10:11 +0100
Subject: [PATCH 02/48] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 14cdf3e..136cfa9 100644
--- a/README.md
+++ b/README.md
@@ -46,5 +46,6 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
1602 LCD setup
Airplay setup
PulseAudio quality settings
+ Epaper display tutorial (EPD comming soon)
From 0c51b228546a35c58107be0a3da4c9bd61dcee40 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 26 Feb 2024 18:15:37 +0100
Subject: [PATCH 03/48] Update README.md
Bluetooth script
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 136cfa9..9d0f4f4 100644
--- a/README.md
+++ b/README.md
@@ -46,6 +46,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
1602 LCD setup
Airplay setup
PulseAudio quality settings
- Epaper display tutorial (EPD comming soon)
+ Epaper display tutorial (EPD comming soon)
+ Bluetooth
From b6f7d05a0f0686ff86621d230b11d790e8ae3570 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 26 Feb 2024 19:02:40 +0100
Subject: [PATCH 04/48] Update README.md
Bt meta
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 9d0f4f4..b54c6e3 100644
--- a/README.md
+++ b/README.md
@@ -48,5 +48,6 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
PulseAudio quality settings
Epaper display tutorial (EPD comming soon)
Bluetooth
+ Bluetooth metadata readout
From 5235c027b614b66dda61ade98b8db3d0c4e9feff Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sun, 3 Mar 2024 18:47:09 +0100
Subject: [PATCH 05/48] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index b54c6e3..3cbe800 100644
--- a/README.md
+++ b/README.md
@@ -44,8 +44,8 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- DAC PCM5102 setup
- 1602 LCD setup
- - Airplay setup
- - PulseAudio quality settings
+ Airplay setup
+ PulseAudio quality settings
- Epaper display tutorial (EPD comming soon)
- Bluetooth
- Bluetooth metadata readout
From 6c3aae165c92f101f859d65f4c8bc35e8f5c0582 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sun, 3 Mar 2024 18:47:49 +0100
Subject: [PATCH 06/48] Update README.md
---
README.md | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 3cbe800..8dedb65 100644
--- a/README.md
+++ b/README.md
@@ -5,10 +5,8 @@ A simple and very lightweight cd player written in python (using vlc) made for r
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 another display
-maybe webui as an alternative to buttons
...
From 631086ee15501f214b382480bc62cda64b11cfcc Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sat, 20 Apr 2024 11:38:37 +0200
Subject: [PATCH 07/48] Update README.md
---
README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/README.md b/README.md
index 8dedb65..29f0367 100644
--- a/README.md
+++ b/README.md
@@ -26,6 +26,8 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- adafruit-circuitpython-charlcd
- digitalio
- pylast
+ - pycairo
+ - PyGObject
Apt
@@ -37,6 +39,9 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- libdiscid0-dev
- python3-pip (I assume that python is already installed by default)
- vlc
+ - libcairo2-dev
+ - libxt-dev
+ - libgirepository1.0-dev
Useful links
From 5e7937d3463caf3801eb009174712d07beb5c956 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sat, 20 Apr 2024 12:06:19 +0200
Subject: [PATCH 08/48] Added requirements txt for pip
---
requirements.txt | 110 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 110 insertions(+)
create mode 100644 requirements.txt
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..a01098e
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,110 @@
+#
+# This file is autogenerated by pip-compile with Python 3.11
+# by the following command:
+#
+# pip-compile requirements.in
+#
+--extra-index-url https://www.piwheels.org/simple
+
+adafruit-blinka==8.39.1
+ # via
+ # adafruit-circuitpython-74hc595
+ # adafruit-circuitpython-busdevice
+ # adafruit-circuitpython-charlcd
+ # adafruit-circuitpython-connectionmanager
+ # adafruit-circuitpython-mcp230xx
+ # adafruit-circuitpython-requests
+ # adafruit-circuitpython-typing
+adafruit-circuitpython-74hc595==1.4.4
+ # via adafruit-circuitpython-charlcd
+adafruit-circuitpython-busdevice==5.2.6
+ # via
+ # adafruit-circuitpython-74hc595
+ # adafruit-circuitpython-charlcd
+ # adafruit-circuitpython-mcp230xx
+ # adafruit-circuitpython-typing
+adafruit-circuitpython-charlcd==3.4.10
+ # via -r requirements.in
+adafruit-circuitpython-connectionmanager==1.0.1
+ # via adafruit-circuitpython-requests
+adafruit-circuitpython-mcp230xx==2.5.13
+ # via adafruit-circuitpython-charlcd
+adafruit-circuitpython-requests==3.2.5
+ # via adafruit-circuitpython-typing
+adafruit-circuitpython-typing==1.10.3
+ # via
+ # adafruit-blinka
+ # adafruit-circuitpython-74hc595
+ # adafruit-circuitpython-busdevice
+ # adafruit-circuitpython-charlcd
+adafruit-platformdetect==3.62.0
+ # via adafruit-blinka
+adafruit-pureio==1.1.11
+ # via adafruit-blinka
+anyio==4.3.0
+ # via httpx
+board==1.0
+ # via -r requirements.in
+certifi==2024.2.2
+ # via
+ # httpcore
+ # httpx
+discid==1.2.0
+ # via -r requirements.in
+gpep517==15
+ # via -r requirements.in
+h11==0.14.0
+ # via httpcore
+httpcore==1.0.5
+ # via httpx
+httpx==0.27.0
+ # via pylast
+idna==3.7
+ # via
+ # anyio
+ # httpx
+iniconfig==2.0.0
+ # via pytest
+installer==0.7.0
+ # via gpep517
+musicbrainzngs==0.7.1
+ # via -r requirements.in
+packaging==24.0
+ # via pytest
+pluggy==1.4.0
+ # via pytest
+pycairo==1.26.0
+ # via
+ # -r requirements.in
+ # pygobject
+pycdio==2.1.1
+ # via -r requirements.in
+pyftdi==0.55.4
+ # via adafruit-blinka
+pygobject==3.48.2
+ # via -r requirements.in
+pylast==5.2.0
+ # via -r requirements.in
+pyserial==3.5
+ # via pyftdi
+pytest==8.1.1
+ # via -r requirements.in
+python-vlc==3.0.20123
+ # via -r requirements.in
+pyusb==1.2.1
+ # via pyftdi
+rpi-gpio==0.7.1
+ # via adafruit-blinka
+rpi-ws281x==5.0.0
+ # via adafruit-blinka
+sniffio==1.3.1
+ # via
+ # anyio
+ # httpx
+sysv-ipc==1.1.0
+ # via adafruit-blinka
+typing-extensions==4.11.0
+ # via adafruit-circuitpython-typing
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools
From 9211a2636f44c9c3a6229442f4bcf45c049a04e7 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sat, 20 Apr 2024 12:06:40 +0200
Subject: [PATCH 09/48] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 29f0367..71feb85 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
## Dependencies
⚠ I'm sure that this list is not full and not in correct order.
- - Pip
+ - Pip (requirements.txt)
- pycdio (❗ I couldn't install it on windows idk why, on linux on rpi it installed flawlessy)
- setuptools
From f7fc1412224d88540fdcf33d3ca0591de8ad4a7c Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sat, 20 Apr 2024 12:16:24 +0200
Subject: [PATCH 10/48] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 71feb85..433610a 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,10 @@
# 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?
+## What im planning to add?
-maybe usb playback
-maybe another display
-maybe webui as an alternative to buttons
From 15ba53c44bce1874f8cc28c7859cca065a4f579b Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Tue, 14 May 2024 07:54:34 +0200
Subject: [PATCH 11/48] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 433610a..73dafec 100644
--- a/README.md
+++ b/README.md
@@ -28,6 +28,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- pylast
- pycairo
- PyGObject
+ - timeout_decorator
- Apt
From 5ca9fbabcc3fda3af4067456d1d34dda6c10fd13 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Tue, 14 May 2024 07:58:00 +0200
Subject: [PATCH 12/48] Update README.md
---
README.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 73dafec..71b9d7e 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,10 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
## What im planning to add?
-maybe usb playback
--maybe another display
+-maybe another display
-maybe webui as an alternative to buttons
-...
+-change 5 pushbuttons to 5 way navigational button
+
## Dependencies
⚠ I'm sure that this list is not full and not in correct order.
From f5222c8b7c1da49c2b7626c8fd958b9fd2548daa Mon Sep 17 00:00:00 2001
From: trybula
Date: Wed, 12 Jun 2024 00:04:14 +0200
Subject: [PATCH 13/48] Make some cleanups with files
---
more archival versions/README.md | 2 -
...Menu(1 1 update to circutpythonlibrary).py | 61 -----
.../SimpleCDPlayerMenu(1 1).py | 48 ----
...Menu(1 2 update to circutpythonlibrary).py | 65 -----
more archival versions/SimpleCDPlayerMenu.py | 48 ----
.../SimpleCDPlayerv(1 2 state).py | 208 --------------
.../SimpleCDPlayerv(1 3 multi disc).py | 216 ---------------
.../SimpleCDPlayerv(1 4 1 better stopend).py | 215 ---------------
.../SimpleCDPlayerv(1 4 low usage).py | 216 ---------------
.../SimpleCDPlayerv1 (1 5 circuit python).py | 229 ----------------
.../SimpleCDPlayerv1(1 1).py | 196 --------------
more archival versions/SimpleCDPlayerv1.py | 153 -----------
more archival versions/aio(1 0).py | 239 ----------------
.../aio(1 1 light debugging).py | 243 -----------------
.../lcdandbuttons (1 3 full).py | 210 ---------------
more archival versions/lcdandbuttons.py | 202 --------------
more archival versions/multiproccess1.py | 117 --------
.../multiprocess ( 1 0 keyboard working).py | 126 ---------
more archival versions/vlcbuttons(1).py | 153 -----------
more archival versions/vlcbuttons(ordewr).py | 153 -----------
more archival versions/vlckeyboard(1 2).py | 147 ----------
.../vlckeyboard(1 3 adnotacje).py | 136 ----------
.../vlckeyboard(1 3 mb cdtxt unknwn).py | 146 ----------
more archival versions/vlckeyboard.py | 132 ---------
more archival versions/withlcd.py | 195 --------------
releases/V1.2Multiprocessing.py | 210 ---------------
releases/aio.1.1.py | 243 -----------------
releases/v1.3_Scrolling.py | 223 ---------------
releases/v1.4.1_scrobblehotfix.py | 254 ------------------
releases/v1.4.2_hotfix2(2).py | 240 -----------------
releases/v1.4.3_hotfix3.py | 248 -----------------
releases/v1.4_scrobble.py | 239 ----------------
32 files changed, 5513 deletions(-)
delete mode 100644 more archival versions/README.md
delete mode 100644 more archival versions/SimpleCDPlayerMenu(1 1 update to circutpythonlibrary).py
delete mode 100644 more archival versions/SimpleCDPlayerMenu(1 1).py
delete mode 100644 more archival versions/SimpleCDPlayerMenu(1 2 update to circutpythonlibrary).py
delete mode 100644 more archival versions/SimpleCDPlayerMenu.py
delete mode 100644 more archival versions/SimpleCDPlayerv(1 2 state).py
delete mode 100644 more archival versions/SimpleCDPlayerv(1 3 multi disc).py
delete mode 100644 more archival versions/SimpleCDPlayerv(1 4 1 better stopend).py
delete mode 100644 more archival versions/SimpleCDPlayerv(1 4 low usage).py
delete mode 100644 more archival versions/SimpleCDPlayerv1 (1 5 circuit python).py
delete mode 100644 more archival versions/SimpleCDPlayerv1(1 1).py
delete mode 100644 more archival versions/SimpleCDPlayerv1.py
delete mode 100644 more archival versions/aio(1 0).py
delete mode 100644 more archival versions/aio(1 1 light debugging).py
delete mode 100644 more archival versions/lcdandbuttons (1 3 full).py
delete mode 100644 more archival versions/lcdandbuttons.py
delete mode 100644 more archival versions/multiproccess1.py
delete mode 100644 more archival versions/multiprocess ( 1 0 keyboard working).py
delete mode 100644 more archival versions/vlcbuttons(1).py
delete mode 100644 more archival versions/vlcbuttons(ordewr).py
delete mode 100644 more archival versions/vlckeyboard(1 2).py
delete mode 100644 more archival versions/vlckeyboard(1 3 adnotacje).py
delete mode 100644 more archival versions/vlckeyboard(1 3 mb cdtxt unknwn).py
delete mode 100644 more archival versions/vlckeyboard.py
delete mode 100644 more archival versions/withlcd.py
delete mode 100644 releases/V1.2Multiprocessing.py
delete mode 100644 releases/aio.1.1.py
delete mode 100644 releases/v1.3_Scrolling.py
delete mode 100644 releases/v1.4.1_scrobblehotfix.py
delete mode 100644 releases/v1.4.2_hotfix2(2).py
delete mode 100644 releases/v1.4.3_hotfix3.py
delete mode 100644 releases/v1.4_scrobble.py
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.3_hotfix3.py b/releases/v1.4.3_hotfix3.py
deleted file mode 100644
index f27b8b5..0000000
--- a/releases/v1.4.3_hotfix3.py
+++ /dev/null
@@ -1,248 +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
- if(artists[0] =="Various Artists"):
- 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 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):
- 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)
-
From 680bd6ab2fc8cc14a218a33d248ba5da280a3ef3 Mon Sep 17 00:00:00 2001
From: trybula
Date: Wed, 12 Jun 2024 00:07:04 +0200
Subject: [PATCH 14/48] Info about what happened (kinda)
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 71b9d7e..5f5e287 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,5 @@
+# ⚠️RESPOSITORY IN WORK⚠️
+
# 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. I highly recommend using it inside a venv!
From 1602c32ac28d59978a3ed9a15b6495d05fc53c1b Mon Sep 17 00:00:00 2001
From: trybula
Date: Wed, 12 Jun 2024 23:19:23 +0200
Subject: [PATCH 15/48] From now i will just edit those files rather than
release new version
---
boot.py | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++++
config.ini | 20 +++
2 files changed, 383 insertions(+)
create mode 100644 boot.py
create mode 100644 config.ini
diff --git a/boot.py b/boot.py
new file mode 100644
index 0000000..9a96939
--- /dev/null
+++ b/boot.py
@@ -0,0 +1,363 @@
+# 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
+import pylast
+from pydbus import SystemBus
+import timeout_decorator
+import configparser
+
+
+#------------PARSING CONFIG-------------
+config = configparser.ConfigParser()
+config.read('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
+
+GPIO.setmode(GPIO.BCM) #przyciski
+#BUTTONS = [6, 5, 24, 23, 22, 14] #buttons are connected to ground
+BUTTONS = {"Up":config.getint('Buttons', 'Up'), "Right":config.getint('Buttons', 'Right'), "Left":config.getint('Buttons', 'Left'), "Middle": config.getint('Buttons', 'Middle'), "Down":config.getint('Buttons', 'Down')}
+for button in BUTTONS:
+ GPIO.setup(BUTTONS[button], GPIO.IN, pull_up_down=GPIO.PUD_UP)
+
+
+
+command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev
+textb = 15
+page = 0
+MAX_PAGE = 1
+
+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())
+ conn.send([index+1, i_tracks, track_list[index], artists[index], album, MsToTime(player.get_time(), player.get_length()), player.get_state()])
+ match dump:
+ case 0:
+ pass
+ #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()
+ #last_scrobble=""
+ 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=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'
+ 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')
+
+
+
+GPIO.add_event_detect(BUTTONS["Right"], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) #forward
+GPIO.add_event_detect(BUTTONS["Left"], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) #previous
+GPIO.add_event_detect(BUTTONS["Down"], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) #stop
+GPIO.add_event_detect(BUTTONS["Up"], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) #pause
+#GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) #play
+GPIO.add_event_detect(BUTTONS["Middle"], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) #off
+
+parent_conn, child_conn = Pipe()
+cdplayer = Process(target=PlayCd, args=(child_conn,))
+
+
+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):
+ 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(command)
+ 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)
+ time.sleep(1)
+
diff --git a/config.ini b/config.ini
new file mode 100644
index 0000000..4194752
--- /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 = 22
+Down = 23
+Right = 5
+Left = 24
+Middle = 6
+
+[Lcd]
+Columns = 16
+Rows = 2
+
+[MusicBrainz]
+Mail = example@mail.com
From 69b8f13ca7ae15e814265d77f7c7797650de9c06 Mon Sep 17 00:00:00 2001
From: trybula
Date: Wed, 12 Jun 2024 23:34:29 +0200
Subject: [PATCH 16/48] updated (using pipreqs)
---
requirements.txt | 114 ++++-------------------------------------------
1 file changed, 8 insertions(+), 106 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index a01098e..394a7b5 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,110 +1,12 @@
-#
-# This file is autogenerated by pip-compile with Python 3.11
-# by the following command:
-#
-# pip-compile requirements.in
-#
---extra-index-url https://www.piwheels.org/simple
-
-adafruit-blinka==8.39.1
- # via
- # adafruit-circuitpython-74hc595
- # adafruit-circuitpython-busdevice
- # adafruit-circuitpython-charlcd
- # adafruit-circuitpython-connectionmanager
- # adafruit-circuitpython-mcp230xx
- # adafruit-circuitpython-requests
- # adafruit-circuitpython-typing
-adafruit-circuitpython-74hc595==1.4.4
- # via adafruit-circuitpython-charlcd
-adafruit-circuitpython-busdevice==5.2.6
- # via
- # adafruit-circuitpython-74hc595
- # adafruit-circuitpython-charlcd
- # adafruit-circuitpython-mcp230xx
- # adafruit-circuitpython-typing
-adafruit-circuitpython-charlcd==3.4.10
- # via -r requirements.in
-adafruit-circuitpython-connectionmanager==1.0.1
- # via adafruit-circuitpython-requests
-adafruit-circuitpython-mcp230xx==2.5.13
- # via adafruit-circuitpython-charlcd
-adafruit-circuitpython-requests==3.2.5
- # via adafruit-circuitpython-typing
-adafruit-circuitpython-typing==1.10.3
- # via
- # adafruit-blinka
- # adafruit-circuitpython-74hc595
- # adafruit-circuitpython-busdevice
- # adafruit-circuitpython-charlcd
-adafruit-platformdetect==3.62.0
- # via adafruit-blinka
-adafruit-pureio==1.1.11
- # via adafruit-blinka
-anyio==4.3.0
- # via httpx
+Adafruit_Blinka==8.39.1
+adafruit_circuitpython_charlcd==3.4.10
board==1.0
- # via -r requirements.in
-certifi==2024.2.2
- # via
- # httpcore
- # httpx
discid==1.2.0
- # via -r requirements.in
-gpep517==15
- # via -r requirements.in
-h11==0.14.0
- # via httpcore
-httpcore==1.0.5
- # via httpx
-httpx==0.27.0
- # via pylast
-idna==3.7
- # via
- # anyio
- # httpx
-iniconfig==2.0.0
- # via pytest
-installer==0.7.0
- # via gpep517
musicbrainzngs==0.7.1
- # via -r requirements.in
-packaging==24.0
- # via pytest
-pluggy==1.4.0
- # via pytest
-pycairo==1.26.0
- # via
- # -r requirements.in
- # pygobject
pycdio==2.1.1
- # via -r requirements.in
-pyftdi==0.55.4
- # via adafruit-blinka
-pygobject==3.48.2
- # via -r requirements.in
-pylast==5.2.0
- # via -r requirements.in
-pyserial==3.5
- # via pyftdi
-pytest==8.1.1
- # via -r requirements.in
-python-vlc==3.0.20123
- # via -r requirements.in
-pyusb==1.2.1
- # via pyftdi
-rpi-gpio==0.7.1
- # via adafruit-blinka
-rpi-ws281x==5.0.0
- # via adafruit-blinka
-sniffio==1.3.1
- # via
- # anyio
- # httpx
-sysv-ipc==1.1.0
- # via adafruit-blinka
-typing-extensions==4.11.0
- # via adafruit-circuitpython-typing
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
+pydbus==0.6.0
+pylast==5.3.0
+python_vlc==3.0.20123
+RPi.GPIO==0.7.1
+timeout_decorator==0.5.0
+configparser==7.0.0
\ No newline at end of file
From 4cc8fafefdabf6211f7a5f5295003fb5867ed199 Mon Sep 17 00:00:00 2001
From: trybula
Date: Wed, 12 Jun 2024 23:37:09 +0200
Subject: [PATCH 17/48] cleaner
---
README.md | 19 ++-----------------
1 file changed, 2 insertions(+), 17 deletions(-)
diff --git a/README.md b/README.md
index 5f5e287..c391bcc 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-# ⚠️RESPOSITORY IN WORK⚠️
-
# 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. I highly recommend using it inside a venv!
@@ -16,22 +14,9 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
## Dependencies
⚠ I'm sure that this list is not full and not in correct order.
- - Pip (requirements.txt)
+ - Pip
- - pycdio (❗ I couldn't install it on windows idk why, on linux on rpi it installed flawlessy)
- - setuptools
- - pytest
- - gpep517
- - python-vlc
- - musicbrainzngs
- - discid
- - board
- - adafruit-circuitpython-charlcd
- - digitalio
- - pylast
- - pycairo
- - PyGObject
- - timeout_decorator
+ - requirements.txt
- Apt
From 1e499a3cbb0396b26b261ce5302b2e8b69ae92cf Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Wed, 12 Jun 2024 23:38:38 +0200
Subject: [PATCH 18/48] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index c391bcc..e46d38b 100644
--- a/README.md
+++ b/README.md
@@ -12,13 +12,12 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
## Dependencies
-⚠ I'm sure that this list is not full and not in correct order.
- Pip
- - Apt
+ - Apt
- libiso9660-dev
- libcdio-dev
@@ -31,6 +30,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- libcairo2-dev
- libxt-dev
- libgirepository1.0-dev
+ - (there may be something still missing on this list...)
- Useful links
From 2d4bce829e6b6a5453639a61170b00ecf5c7b78c Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 13 Jun 2024 10:58:33 +0200
Subject: [PATCH 19/48] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index e46d38b..6fba4f2 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
-maybe usb playback
-maybe another display
-maybe webui as an alternative to buttons
--change 5 pushbuttons to 5 way navigational button
+-change 5 pushbuttons to 5 way navigational button✅
## Dependencies
From d83efa120a96a5a2b44bd7182f74c60f75ebc35d Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 13 Jun 2024 10:59:20 +0200
Subject: [PATCH 20/48] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 6fba4f2..7aa02db 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- 1602 LCD setup
Airplay setup
PulseAudio quality settings
- - Epaper display tutorial (EPD comming soon)
+ Epaper display tutorial (EPD comming soon)
- Bluetooth
- Bluetooth metadata readout
From 8b856c5fe601410278945ae377510302dce8da08 Mon Sep 17 00:00:00 2001
From: trybula
Date: Fri, 14 Jun 2024 17:12:29 +0200
Subject: [PATCH 21/48] Fix configparser when running from different directory
than the file is
---
boot.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/boot.py b/boot.py
index 9a96939..8f1ebca 100644
--- a/boot.py
+++ b/boot.py
@@ -22,7 +22,8 @@
#------------PARSING CONFIG-------------
config = configparser.ConfigParser()
-config.read('config.ini')
+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
From cdeba67733f5ce01b3b1542008b9a6b26c46e654 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Sun, 14 Jul 2024 00:59:09 +0200
Subject: [PATCH 22/48] Update README.md
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 7aa02db..66e7300 100644
--- a/README.md
+++ b/README.md
@@ -27,7 +27,9 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- libdiscid0-dev
- python3-pip (I assume that python is already installed by default)
- vlc
+ - python3.11-dev
- libcairo2-dev
+ - python3.11-venv
- libxt-dev
- libgirepository1.0-dev
- (there may be something still missing on this list...)
From f708b22d943bbb0a79b3c558c46f5ba1d732e760 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 22 Jul 2024 11:13:29 +0200
Subject: [PATCH 23/48] Update requirements.txt
Changed rpi-gpio library to rpi-lgpio because of breaking kernel changes
---
requirements.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/requirements.txt b/requirements.txt
index 394a7b5..2142d68 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,6 +7,6 @@ pycdio==2.1.1
pydbus==0.6.0
pylast==5.3.0
python_vlc==3.0.20123
-RPi.GPIO==0.7.1
+rpi-lgpio==0.6
timeout_decorator==0.5.0
-configparser==7.0.0
\ No newline at end of file
+configparser==7.0.0
From 16270af7acf9be8a69aa9ee3001419443eb58d62 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 22 Jul 2024 16:45:59 +0200
Subject: [PATCH 24/48] Update boot.py
Buttons working instantly for CD, "loading..." screen for cd, previous button returning to 0:0 if you are further in song, faster menu refresh time. Next thing planned is writing a function to update only changed parts of display
---
boot.py | 65 ++++++++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 50 insertions(+), 15 deletions(-)
diff --git a/boot.py b/boot.py
index 8f1ebca..e8d2895 100644
--- a/boot.py
+++ b/boot.py
@@ -201,10 +201,9 @@ def PlayCd(conn):
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], artists[index], album, MsToTime(player.get_time(), player.get_length()), player.get_state()])
match dump:
case 0:
- pass
+ 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:
@@ -219,8 +218,10 @@ def PlayCd(conn):
listplayer.next()
#last_scrobble=""
case 5:
- listplayer.previous()
- #last_scrobble=""
+ 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:
@@ -274,19 +275,51 @@ class DeviceNotFoundError(Exception):
def __init__(self):
super().__init__('No music bluetooth device was found')
+def next(event):
+ global run, command
+ match page:
+ case 0:
+ if(not run):
+ command = 4
+ else:
+ parent_conn.send(4)
+ case 1:
+
+ command = 4
+def back(event):
+ global run, command
+ match page:
+ case 0:
+ if(not run):
+ command = 5
+ else:
+ parent_conn.send(5)
+ case 1:
+
+ command = 5
+def stop(event):
+ global run, command
+ match page:
+ case 0:
+ parent_conn.send(3)
+ case 1:
+ command = 3
+def pause(event):
+ global run, command
+ match page:
+ case 0:
+ parent_conn.send(2)
+ case 1:
+ command = 2
-
-GPIO.add_event_detect(BUTTONS["Right"], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000) #forward
-GPIO.add_event_detect(BUTTONS["Left"], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000) #previous
-GPIO.add_event_detect(BUTTONS["Down"], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000) #stop
-GPIO.add_event_detect(BUTTONS["Up"], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000) #pause
+GPIO.add_event_detect(BUTTONS["Right"], GPIO.FALLING, callback=next, bouncetime=100) #forward
+GPIO.add_event_detect(BUTTONS["Left"], GPIO.FALLING, callback=back, bouncetime=100) #previous
+GPIO.add_event_detect(BUTTONS["Down"], GPIO.FALLING, callback=stop, bouncetime=100) #stop
+GPIO.add_event_detect(BUTTONS["Up"], GPIO.FALLING, callback=pause, bouncetime=100) #pause
#GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) #play
-GPIO.add_event_detect(BUTTONS["Middle"], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000) #off
+GPIO.add_event_detect(BUTTONS["Middle"], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=100) #off
parent_conn, child_conn = Pipe()
-cdplayer = Process(target=PlayCd, args=(child_conn,))
-
-
lcd.clear()
while True:
@@ -309,6 +342,8 @@ def __init__(self):
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)
@@ -318,7 +353,7 @@ def __init__(self):
cdplayer.join()
run = False
elif cdplayer.is_alive():
- parent_conn.send(command)
+ parent_conn.send(0)#you must send to recive
time.sleep(0.1)
dump=parent_conn.recv()
if(dump[6] == vlc.State.Ended):
@@ -360,5 +395,5 @@ def __init__(self):
run=False
command = 0
time.sleep(1)
- time.sleep(1)
+ time.sleep(0.5)
From 096ecf1e75470e35d036466487114731d0504490 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 22 Jul 2024 16:49:43 +0200
Subject: [PATCH 25/48] Update README.md
change roadmap
---
README.md | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index 66e7300..818d995 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,10 @@ A simple and very lightweight cd player written in python (using vlc) made for r
## 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 im planning to add?
--maybe usb playback
--maybe another display
--maybe webui as an alternative to buttons
--change 5 pushbuttons to 5 way navigational button✅
+## Plan for nearest future
+ - change pushbutton library to gpiozero and add scrolling through the song by holding button, and power off
+ - add webui
+ - make display refresh only if something changed
## Dependencies
From 4158b5861705bf731c04e25194382e9c4c8a912b Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 18:59:38 +0200
Subject: [PATCH 26/48] Update requirements.txt
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index 2142d68..a29941b 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,3 +10,4 @@ python_vlc==3.0.20123
rpi-lgpio==0.6
timeout_decorator==0.5.0
configparser==7.0.0
+unidecode==1.3.8
From 365449ff5742babd477f9d63b4f85756d19d7821 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 19:38:32 +0200
Subject: [PATCH 27/48] Update boot.py
1) changed button library to gpiozero
2) added shutdown option (hold middle button)
3)fixed non ascii symbols on display (by replacing them with their nearest ascii equalivent)
---
boot.py | 56 +++++++++++++++++++++++++++++++++++---------------------
1 file changed, 35 insertions(+), 21 deletions(-)
diff --git a/boot.py b/boot.py
index e8d2895..ef183e9 100644
--- a/boot.py
+++ b/boot.py
@@ -1,4 +1,3 @@
-# A runatboot file
import vlc #play music
import time #control time
import discid #read discid
@@ -8,16 +7,19 @@
from multiprocessing import Process, Pipe
import threading #scheduling
from math import floor#round down
-import signal#last 4 is for LCD
+import signal
import board
from digitalio import DigitalInOut
from adafruit_character_lcd.character_lcd import Character_LCD_Mono
-import RPi.GPIO as GPIO#buttons
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-------------
@@ -47,18 +49,18 @@
lcd.cursor = False
lcd.blink = False
-GPIO.setmode(GPIO.BCM) #przyciski
-#BUTTONS = [6, 5, 24, 23, 22, 14] #buttons are connected to ground
-BUTTONS = {"Up":config.getint('Buttons', 'Up'), "Right":config.getint('Buttons', 'Right'), "Left":config.getint('Buttons', 'Left'), "Middle": config.getint('Buttons', 'Middle'), "Down":config.getint('Buttons', 'Down')}
-for button in BUTTONS:
- GPIO.setup(BUTTONS[button], GPIO.IN, pull_up_down=GPIO.PUD_UP)
-
+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
playchar = [
0b01000,
@@ -244,9 +246,9 @@ def ShowCd(dump):
textb+=1
else:
TrimMessage=dump[2]
- lcd.message=TrimMessage #title
+ lcd.message=unidecode(TrimMessage) #title
lcd.cursor_position(0,1)
- lcd.message=dump[5] # time
+ lcd.message=unidecode(dump[5]) # time
lcd.cursor_position(15,1)
match dump[6]:
case vlc.State.Playing:
@@ -275,7 +277,7 @@ class DeviceNotFoundError(Exception):
def __init__(self):
super().__init__('No music bluetooth device was found')
-def next(event):
+def next():
global run, command
match page:
case 0:
@@ -286,7 +288,7 @@ def next(event):
case 1:
command = 4
-def back(event):
+def back():
global run, command
match page:
case 0:
@@ -297,27 +299,39 @@ def back(event):
case 1:
command = 5
-def stop(event):
+def stop():
global run, command
match page:
case 0:
parent_conn.send(3)
case 1:
command = 3
-def pause(event):
+def pause():
global run, command
match page:
case 0:
parent_conn.send(2)
case 1:
command = 2
+def middle():
+ global command, start
+ start = time.time()
+ command = -1
+
+def shutdown():
+ global start
+ end = time.time()
+ if(end-start>2):
+ lcd.clear()
+ lcd.message="Goodbye"
+ check_call(['sudo', 'poweroff'])
-GPIO.add_event_detect(BUTTONS["Right"], GPIO.FALLING, callback=next, bouncetime=100) #forward
-GPIO.add_event_detect(BUTTONS["Left"], GPIO.FALLING, callback=back, bouncetime=100) #previous
-GPIO.add_event_detect(BUTTONS["Down"], GPIO.FALLING, callback=stop, bouncetime=100) #stop
-GPIO.add_event_detect(BUTTONS["Up"], GPIO.FALLING, callback=pause, bouncetime=100) #pause
-#GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000) #play
-GPIO.add_event_detect(BUTTONS["Middle"], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=100) #off
+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()
From 3a3b4f25c0423d9073d278adf35f7b077372f8ae Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 19:39:23 +0200
Subject: [PATCH 28/48] Update config.ini
Now you can use other names than GPIO (see gpiozero compatible naming systems)
---
config.ini | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/config.ini b/config.ini
index 4194752..f6a99cf 100644
--- a/config.ini
+++ b/config.ini
@@ -6,11 +6,11 @@ Username = URNM
Password = PASS
[Buttons]
-Up = 22
-Down = 23
-Right = 5
-Left = 24
-Middle = 6
+Up = GPIO22
+Down = GPIO23
+Right = GPIO5
+Left = GPIO24
+Middle = GPIO6
[Lcd]
Columns = 16
From 762947586935329fd0d873bcf78058d27f3d4fa2 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 19:39:57 +0200
Subject: [PATCH 29/48] Update README.md
---
README.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/README.md b/README.md
index 818d995..b5d2a64 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,6 @@ A simple and very lightweight cd player written in python (using vlc) made for r
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.
## Plan for nearest future
- - change pushbutton library to gpiozero and add scrolling through the song by holding button, and power off
- add webui
- make display refresh only if something changed
From 8ed002f33ae8c18e72bf121ba69be153935179e7 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 19:42:39 +0200
Subject: [PATCH 30/48] Update requirements.txt
---
requirements.txt | 1 -
1 file changed, 1 deletion(-)
diff --git a/requirements.txt b/requirements.txt
index a29941b..9eb8a93 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,7 +7,6 @@ pycdio==2.1.1
pydbus==0.6.0
pylast==5.3.0
python_vlc==3.0.20123
-rpi-lgpio==0.6
timeout_decorator==0.5.0
configparser==7.0.0
unidecode==1.3.8
From 94931feef6a265016a40d656421f0a0b6f4b271f Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 5 Sep 2024 19:43:16 +0200
Subject: [PATCH 31/48] Update requirements.txt
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index 9eb8a93..0a8ec7d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,3 +10,4 @@ python_vlc==3.0.20123
timeout_decorator==0.5.0
configparser==7.0.0
unidecode==1.3.8
+gpiozero==2.0.1
From ca6ac5f8540fe058719b54cb53af4275e99735d2 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 12 Sep 2024 19:56:28 +0200
Subject: [PATCH 32/48] Update boot.py
Prevent middle button from playing cd when trying to power off
---
boot.py | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/boot.py b/boot.py
index ef183e9..070f618 100644
--- a/boot.py
+++ b/boot.py
@@ -314,17 +314,18 @@ def pause():
case 1:
command = 2
def middle():
- global command, start
+ global start
start = time.time()
- command = -1
def shutdown():
- global start
+ 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
From c77be1a2787ba538b59b0dd1b123bc641582ce65 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 12 Sep 2024 19:57:13 +0200
Subject: [PATCH 33/48] WIP webui
---
wip_webui/index.html | 67 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
create mode 100644 wip_webui/index.html
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:
...
+
+
+
+
+
+
From ed13c7fc70d2ef3ccc58ecfa387a0a615d26e014 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 12 Sep 2024 19:57:31 +0200
Subject: [PATCH 34/48] Add files via upload
---
wip_webui/boot_async.py | 484 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 484 insertions(+)
create mode 100644 wip_webui/boot_async.py
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())
From 22a03551ad3a6ca145307fc509014ea0fde7fa70 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Thu, 12 Sep 2024 19:59:27 +0200
Subject: [PATCH 35/48] Create README.md
---
wip_webui/README.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 wip_webui/README.md
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
From 65e5eb6b8d96129d4955566a745574ac7657c171 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 17:00:39 +0200
Subject: [PATCH 36/48] Update README.md
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index b5d2a64..842e04a 100644
--- a/README.md
+++ b/README.md
@@ -17,20 +17,20 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- Apt
- - libiso9660-dev
+ libiso9660-dev
- libcdio-dev
- - libcdio-utils
+ libcdio-utils
- swig
- cython
- libdiscid0-dev
- - python3-pip (I assume that python is already installed by default)
+ - python3-pip
- vlc
+ - gcc
- python3.11-dev
- libcairo2-dev
- python3.11-venv
- libxt-dev
- libgirepository1.0-dev
- - (there may be something still missing on this list...)
- Useful links
From 1595a07996278e27c4c85800ff4ce3205a06edac Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 17:05:30 +0200
Subject: [PATCH 37/48] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 842e04a..ad9b3a4 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,7 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- cython
- libdiscid0-dev
- python3-pip
+ - py3-gpiozero
- vlc
- gcc
- python3.11-dev
From 8d7149b2332f12640afdff6bc42a49bad416542d Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 17:05:51 +0200
Subject: [PATCH 38/48] Update requirements.txt
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index 0a8ec7d..94f07a7 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -10,4 +10,5 @@ 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
From 1dc98f26c07a799d37af31818eda6f268c832c5c Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 17:08:05 +0200
Subject: [PATCH 39/48] Update requirements.txt
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index 94f07a7..d81c669 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -12,3 +12,4 @@ configparser==7.0.0
unidecode==1.3.8
RPi.GPIO==0.7.1
gpiozero==2.0.1
+PyGObject==3.50.0
From c4af3c5ecd02143a860ccd826bb807bf2b56f824 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 17:30:41 +0200
Subject: [PATCH 40/48] Update requirements.txt
---
requirements.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/requirements.txt b/requirements.txt
index d81c669..3004b2d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -13,3 +13,4 @@ unidecode==1.3.8
RPi.GPIO==0.7.1
gpiozero==2.0.1
PyGObject==3.50.0
+lgpio==0.2.2.0
From 9b6866e4028bda49ff7227f3eec781f6bd209be0 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:13:17 +0200
Subject: [PATCH 41/48] Create lgpio_compile.sh
---
lgpio_compile.sh | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 lgpio_compile.sh
diff --git a/lgpio_compile.sh b/lgpio_compile.sh
new file mode 100644
index 0000000..9bcb24a
--- /dev/null
+++ b/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
From 8f288ab96e30a9ae7acad1183316a346235def61 Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:14:12 +0200
Subject: [PATCH 42/48] Create lgpio_install.sh
---
install_scripts/lgpio_install.sh | 7 +++++++
1 file changed, 7 insertions(+)
create mode 100644 install_scripts/lgpio_install.sh
diff --git a/install_scripts/lgpio_install.sh b/install_scripts/lgpio_install.sh
new file mode 100644
index 0000000..9bcb24a
--- /dev/null
+++ b/install_scripts/lgpio_install.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
From 9717639e07f77405f8a73dfa502f362d97639ffc Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:14:38 +0200
Subject: [PATCH 43/48] Delete lgpio_compile.sh
---
lgpio_compile.sh | 7 -------
1 file changed, 7 deletions(-)
delete mode 100644 lgpio_compile.sh
diff --git a/lgpio_compile.sh b/lgpio_compile.sh
deleted file mode 100644
index 9bcb24a..0000000
--- a/lgpio_compile.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-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
From 1137603df21353b86d4173d7d65f1e2d6fade67d Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:15:03 +0200
Subject: [PATCH 44/48] Rename lgpio_install.sh to lgpio_compile.sh
---
install_scripts/{lgpio_install.sh => lgpio_compile.sh} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename install_scripts/{lgpio_install.sh => lgpio_compile.sh} (100%)
diff --git a/install_scripts/lgpio_install.sh b/install_scripts/lgpio_compile.sh
similarity index 100%
rename from install_scripts/lgpio_install.sh
rename to install_scripts/lgpio_compile.sh
From 98aec1ae393748cf95041d469a857b56ff81150e Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:17:06 +0200
Subject: [PATCH 45/48] Update README.md
---
README.md | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/README.md b/README.md
index ad9b3a4..7fd7439 100644
--- a/README.md
+++ b/README.md
@@ -44,3 +44,8 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
- Bluetooth metadata readout
+
+## 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.
+Apart from that, everything works as it should.
From 34b09e3a96edddc738439f925b27b8fcfadfcc2d Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:18:15 +0200
Subject: [PATCH 46/48] Rename requirements.txt to
install_scripts/pip_requirements.txt
---
requirements.txt => install_scripts/pip_requirements.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename requirements.txt => install_scripts/pip_requirements.txt (100%)
diff --git a/requirements.txt b/install_scripts/pip_requirements.txt
similarity index 100%
rename from requirements.txt
rename to install_scripts/pip_requirements.txt
From 74bc33a968c744bab91f6adaa04f2503467a552f Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Mon, 23 Sep 2024 22:43:00 +0200
Subject: [PATCH 47/48] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 7fd7439..3f2246c 100644
--- a/README.md
+++ b/README.md
@@ -47,5 +47,5 @@ Some time ago i made an amplifier using tpa3116 (i will put the shematic someday
## 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.
+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.
From 556e96226e452c304762e642ffa22ba7cf85392f Mon Sep 17 00:00:00 2001
From: Trybulion <81358999+trybula@users.noreply.github.com>
Date: Fri, 8 Nov 2024 23:57:09 +0100
Subject: [PATCH 48/48] Internet radio
Add internet radio support (still need to move radio stations to the config file). Also added bounce time to right button, because mine started wearing off (also need to place in the config)
---
boot.py | 113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 110 insertions(+), 3 deletions(-)
diff --git a/boot.py b/boot.py
index 070f618..9acd60d 100644
--- a/boot.py
+++ b/boot.py
@@ -1,3 +1,4 @@
+# A runatboot file
import vlc #play music
import time #control time
import discid #read discid
@@ -50,7 +51,7 @@
lcd.blink = False
Button_up = Button(config.get('Buttons', 'Up'))
-Button_right = Button(config.get('Buttons', 'Right'))
+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'))
@@ -59,7 +60,7 @@
command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev
textb = 15
page = 0
-MAX_PAGE = 1
+MAX_PAGE = 2
start = 0
playchar = [
@@ -236,6 +237,70 @@ def PlayCd(conn):
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()
@@ -285,6 +350,11 @@ def next():
command = 4
else:
parent_conn.send(4)
+ case 2:
+ if(not run):
+ command = 4
+ else:
+ parent_conn.send(4)
case 1:
command = 4
@@ -296,6 +366,11 @@ def back():
command = 5
else:
parent_conn.send(5)
+ case 2:
+ if(not run):
+ command = 5
+ else:
+ parent_conn.send(5)
case 1:
command = 5
@@ -304,6 +379,8 @@ def stop():
match page:
case 0:
parent_conn.send(3)
+ case 2:
+ parent_conn.send(3)
case 1:
command = 3
def pause():
@@ -311,6 +388,8 @@ def pause():
match page:
case 0:
parent_conn.send(2)
+ case 2:
+ parent_conn.send(2)
case 1:
command = 2
def middle():
@@ -410,5 +489,33 @@ def shutdown():
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)
-