Skip to content

Commit 630fa83

Browse files
authored
added releases
1 parent 58efcf4 commit 630fa83

File tree

5 files changed

+1169
-0
lines changed

5 files changed

+1169
-0
lines changed

releases/V1.2Multiprocessing.py

Lines changed: 210 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,210 @@
1+
import vlc #play music
2+
import time #control time
3+
import discid #read discid
4+
import musicbrainzngs #fetch data
5+
import sys
6+
import cdio, pycdio #cdtxt & trackcount
7+
from multiprocessing import Process, Pipe
8+
import threading #scheduling
9+
from math import floor#round down
10+
import signal#last 4 is for LCD
11+
import board
12+
from digitalio import DigitalInOut
13+
from adafruit_character_lcd.character_lcd import Character_LCD_Mono
14+
import RPi.GPIO as GPIO#buttons
15+
16+
lcd_columns = 16
17+
lcd_rows = 2
18+
19+
lcd_rs = DigitalInOut(board.D26)
20+
lcd_en = DigitalInOut(board.D25)
21+
lcd_d4 = DigitalInOut(board.D10)
22+
lcd_d5 = DigitalInOut(board.D9)
23+
lcd_d6 = DigitalInOut(board.D11)
24+
lcd_d7 = DigitalInOut(board.D0)
25+
# Initialise the LCD class
26+
lcd = Character_LCD_Mono(
27+
lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)
28+
lcd.clear()
29+
lcd.cursor = False
30+
lcd.blink = False
31+
32+
GPIO.setmode(GPIO.BCM) #przyciski
33+
BUTTONS = [5, 6, 22, 23, 24, 12]
34+
GPIO.setup(BUTTONS, GPIO.IN, pull_up_down=GPIO.PUD_UP)
35+
36+
track_list = []
37+
data = {"Autor" : "Unknown", "Album": "Unknown"}
38+
i_tracks = 0
39+
command = 0 # 0-nothing 1-play 2-pause 3-stop 4-next 5-prev
40+
41+
playchar = [
42+
0b01000,
43+
0b01100,
44+
0b01110,
45+
0b01111,
46+
0b01110,
47+
0b01100,
48+
0b01000,
49+
0b00000]
50+
pausechar = [
51+
0b00000,
52+
0b10010,
53+
0b10010,
54+
0b10010,
55+
0b10010,
56+
0b10010,
57+
0b10010,
58+
0b00000]
59+
stopchar = [
60+
0b00000,
61+
0b11111,
62+
0b11111,
63+
0b11111,
64+
0b11111,
65+
0b11111,
66+
0b00000,
67+
0b00000]
68+
lcd.create_char(0, playchar)
69+
lcd.create_char(1, pausechar)
70+
lcd.create_char(2, stopchar)
71+
72+
def search_exact_tracklist(data): #function to find exalctly wchich cd was inserted
73+
for x in range(0,len(data["disc"]["release-list"])):
74+
for y in range(0,len(data["disc"]["release-list"][x]["medium-list"])):
75+
for z in range(0,len(data["disc"]["release-list"][x]["medium-list"][y]["disc-list"])):
76+
if data["disc"]["release-list"][x]["medium-list"][y]["disc-list"][z]["id"] == data["disc"]["id"]:
77+
return x, y
78+
def fetchdata():
79+
global track_list
80+
global data
81+
global i_tracks
82+
#ogarnianie cd
83+
try:
84+
d = cdio.Device(driver_id=pycdio.DRIVER_UNKNOWN)
85+
drive_name = d.get_device()
86+
i_tracks = d.get_num_tracks()#ilosc trackow
87+
except IOError:
88+
print("Problem finding a CD-ROM")
89+
sys.exit(1) #if no drive exit
90+
91+
musicbrainzngs.set_useragent("Small_diy_cd_player", "0.1", "[email protected]")
92+
disc = discid.read()#id read
93+
try:
94+
result = musicbrainzngs.get_releases_by_discid(disc.id,includes=["artists", "recordings"]) #get data from Musicbrainz
95+
except musicbrainzngs.ResponseError:
96+
print("disc not found or bad response, using cdtxt instead") #if not available search for cdtext
97+
cdt = d.get_cdtext()
98+
i_first_track = pycdio.get_first_track_num(d.cd)
99+
for t in range(i_first_track, i_tracks + i_first_track):
100+
value = cdt.get(0, t)
101+
if value is not None:
102+
track_list.append(value)
103+
pass
104+
else: #if there isnt anything just type Unknowsn
105+
track_list.append("Unknown-%s" % t)
106+
pass
107+
pass
108+
else: #Artist and album info
109+
a, b=search_exact_tracklist(result)
110+
if result.get("disc"):
111+
data["Autor"] = result["disc"]["release-list"][a]["artist-credit-phrase"]
112+
data["Album"] = result["disc"]["release-list"][a]["title"]
113+
elif result.get("cdstub"):
114+
data["Autor"] = result["cdstub"]["artist"]
115+
data["Album"] = result["cdstub"]["title"]
116+
#print(result["disc"]["release-list"][a]["medium-list"][b]["track-list"])
117+
for i in range(0,i_tracks):
118+
track_list.append(result["disc"]["release-list"][a]["medium-list"][b]["track-list"][i]["recording"]["title"]) #uzupelnij tracklist
119+
def playcd(conn):
120+
fetchdata()
121+
122+
instance = vlc.Instance() #uruchom vlc
123+
player = instance.media_player_new()
124+
medialist = instance.media_list_new()
125+
listplayer = instance.media_list_player_new()
126+
listplayer.set_media_player(player)
127+
for i in (range(1,i_tracks+1)): #second option
128+
track = instance.media_new("cdda:///dev/cdrom", (":cdda-track=" + str(i)))
129+
medialist.add_media(track)
130+
listplayer.set_media_list(medialist)
131+
132+
listplayer.play()
133+
time.sleep(5)#wait to spin
134+
135+
while True:
136+
dump = conn.recv()
137+
index = medialist.index_of_item(listplayer.get_media_player().get_media())
138+
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))
139+
conn.send([index+1, i_tracks, track_list[index], data["Autor"], data["Album"], Timer, player.get_state()])
140+
match dump:
141+
case 0:
142+
pass
143+
case 1:
144+
listplayer.play()
145+
case 2:
146+
listplayer.pause()
147+
case 3:
148+
listplayer.stop()
149+
case 4:
150+
listplayer.next()
151+
case 5:
152+
listplayer.previous()
153+
def PlayerGlobalSync():
154+
global songnumber, track_list, data, i_tracks, command, cdplayer
155+
if command == -1:
156+
if cdplayer.is_alive():
157+
cdplayer.kill()
158+
cdplayer.join()
159+
lcd.clear()
160+
lcd.message = "Change\nmedium"
161+
else:
162+
cdplayer = Process(target=playcd, args=(child_conn,))
163+
cdplayer.start()
164+
elif cdplayer.is_alive():
165+
parent_conn.send(command)
166+
time.sleep(0.1)
167+
dump=parent_conn.recv()
168+
print(dump)
169+
170+
lcd.clear()
171+
lcd.message=dump[2]
172+
lcd.cursor_position(0,1)
173+
lcd.message=dump[5]
174+
lcd.cursor_position(15,1)
175+
match dump[6]:
176+
case vlc.State.Playing:
177+
lcd.message='\x00'
178+
case vlc.State.Paused:
179+
lcd.message='\x01'
180+
case vlc.State.Stopped:
181+
lcd.message='\x02'
182+
command=0
183+
P=threading.Timer(1, PlayerGlobalSync)
184+
P.start()
185+
186+
GPIO.add_event_detect(BUTTONS[0], GPIO.FALLING, callback=lambda event: globals().update(command = 4), bouncetime=1000)
187+
GPIO.add_event_detect(BUTTONS[1], GPIO.FALLING, callback=lambda event: globals().update(command = 5), bouncetime=1000)
188+
GPIO.add_event_detect(BUTTONS[3], GPIO.FALLING, callback=lambda event: globals().update(command = 3), bouncetime=1000)
189+
GPIO.add_event_detect(BUTTONS[2], GPIO.FALLING, callback=lambda event: globals().update(command = 2), bouncetime=1000)
190+
GPIO.add_event_detect(BUTTONS[4], GPIO.FALLING, callback=lambda event: globals().update(command = 1), bouncetime=1000)
191+
GPIO.add_event_detect(BUTTONS[5], GPIO.FALLING, callback=lambda event: globals().update(command = -1), bouncetime=1000)
192+
193+
parent_conn, child_conn = Pipe()
194+
cdplayer = Process(target=playcd, args=(child_conn,))
195+
196+
cdplayer.start()
197+
PlayerGlobalSync()
198+
199+
200+
while True:
201+
dump = input()
202+
if dump == '-1':
203+
cdplayer.kill()
204+
cdplayer.join()
205+
elif (dump == '-2') and not cdplayer.is_alive():
206+
cdplayer = Process(target=playcd, args=(child_conn,))
207+
cdplayer.start()
208+
else:
209+
command=int(dump)
210+

0 commit comments

Comments
 (0)