music can play with pygame

This commit is contained in:
0x01FE committed 2025-01-17 09:25:18 -06:00
1 parent 270ab6799b
commit a04dcc85fd
1 file changed
+67 -57
+67 -57
View File
@@ -1,17 +1,17 @@
# import urwid import urwid
# txt = urwid.Text("hello world") # txt = urwid.Text("hello world")
# fill = urwid.Filler(txt, "top") # fill = urwid.Filler(txt, "top")
# loop = urwid.MainLoop(fill) # loop = urwid.MainLoop(fill)
# loop.run() # loop.run()
import os
import subprocess
import wave
import io import io
from typing import Iterable
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
import pygame
import SubSonic import SubSonic
import pyaudio
import pydub
u = 'pseudo' u = 'pseudo'
p = 'telegram9dock-MICHEL' p = 'telegram9dock-MICHEL'
@@ -19,65 +19,75 @@ conn = SubSonic.SubpyConn(u, p, "https://music.0x01fe.net")
echidna_id = "937004317800a879f0cddd471fb82387" echidna_id = "937004317800a879f0cddd471fb82387"
pygame.mixer.init()
class SubPyPlayer:
conn: SubSonic.SubpyConn
main: urwid.Padding
def __init__(self, conn: SubSonic.SubpyConn):
self.conn = conn
self.main = urwid.Padding(self.menu('test', ['Artists', 'Albums', 'Songs', 'Playlists']), left=2, right=2)
top = urwid.Overlay(
self.main,
urwid.SolidFill("\N{MEDIUM SHADE}"),
align=urwid.CENTER,
width=(urwid.RELATIVE, 60),
valign=urwid.MIDDLE,
height=(urwid.RELATIVE, 60),
min_width=20,
min_height=9,
)
urwid.MainLoop(top, palette=[("reversed", "standout", "")]).run()
# Currently Blocking
def play_song(song_id: str): def play_song(song_id: str):
r = conn.stream(song_id) r = conn.stream(song_id)
p = pyaudio.PyAudio() # convert stream to bytes io thing
audio_data = io.BytesIO(r.content)
# ogg_data = io.BytesIO(r.content) pygame.mixer.music.load(audio_data)
# audio = pydub.AudioSegment.from_ogg(ogg_data) pygame.mixer.music.play()
# # audio.set_sample_width(2)
# print("channels", audio.channels)
# print("rate", audio.frame_rate)
stream = p.open(format=pyaudio.paInt16, while pygame.mixer.music.get_busy():
channels=2, pygame.time.Clock().tick(10)
rate=44100,
output=True)
ffmpeg_process = subprocess.Popen( def menu(self, title: str, choices_: Iterable[str]) -> urwid.ListBox:
['ffmpeg', '-i', 'pipe:0', '-f', 'wav', '-ac', '2', '-ar', '44100', '-'],
stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE body = [urwid.Text(title), urwid.Divider()]
for c in choices_:
button = urwid.Button(c)
urwid.connect_signal(button, "click", self.item_chosen, c)
body.append(urwid.AttrMap(button, None, focus_map="reversed"))
return urwid.ListBox(urwid.SimpleFocusListWalker(body))
def item_chosen(self, button: urwid.Button, choice: str) -> None:
response = urwid.Text(["You chose ", choice, "\n"])
done = urwid.Button("Ok")
urwid.connect_signal(done, "click", self.exit_program)
self.main.original_widget = urwid.Filler(
urwid.Pile(
[
response,
urwid.AttrMap(done, None, focus_map="reversed"),
]
)
) )
for chunk in r.iter_content(chunk_size=1024):
if chunk:
# print('b')
ffmpeg_process.stdin.write(chunk)
ffmpeg_process.stdin.close() def exit_program(self, button: urwid.Button) -> None:
raise urwid.ExitMainLoop()
while True: SubPyPlayer(conn)
pcm_data = ffmpeg_process.stdout.read(1024)
print('a')
if not pcm_data:
break
stream.write(pcm_data)
# for chunk in r.iter_content(chunk_size=1024):
# if chunk:
# ogg_data = io.BytesIO(chunk)
# audio = pydub.AudioSegment.from_ogg(ogg_data)
# audio = audio.set_sample_width(2)
# stream.write(audio.raw_data)
# stream.write(audio.raw_data)
stream.stop_stream()
stream.close()
p.terminate()
ffmpeg_process.wait()
play_song(echidna_id)
# with open('echidna.xml', 'wb') as file:
# file.write(conn.getSong(echidna_id).content)
# echidna = conn.getSong(echidna_id)
# print(echidna.title)
# conn.stream(echidna_id)