diff --git a/main.py b/main.py index 52261be..caf4166 100644 --- a/main.py +++ b/main.py @@ -1,17 +1,17 @@ -# import urwid +import urwid # txt = urwid.Text("hello world") # fill = urwid.Filler(txt, "top") # loop = urwid.MainLoop(fill) # loop.run() - -import subprocess -import wave +import os import io +from typing import Iterable + +os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide" +import pygame import SubSonic -import pyaudio -import pydub u = 'pseudo' p = 'telegram9dock-MICHEL' @@ -19,65 +19,75 @@ conn = SubSonic.SubpyConn(u, p, "https://music.0x01fe.net") echidna_id = "937004317800a879f0cddd471fb82387" -def play_song(song_id: str): - r = conn.stream(song_id) - - p = pyaudio.PyAudio() - - # ogg_data = io.BytesIO(r.content) - # audio = pydub.AudioSegment.from_ogg(ogg_data) - # # audio.set_sample_width(2) - # print("channels", audio.channels) - # print("rate", audio.frame_rate) - - stream = p.open(format=pyaudio.paInt16, - channels=2, - rate=44100, - output=True) - - ffmpeg_process = subprocess.Popen( - ['ffmpeg', '-i', 'pipe:0', '-f', 'wav', '-ac', '2', '-ar', '44100', '-'], - stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - - for chunk in r.iter_content(chunk_size=1024): - if chunk: - # print('b') - ffmpeg_process.stdin.write(chunk) - - ffmpeg_process.stdin.close() - - while True: - pcm_data = ffmpeg_process.stdout.read(1024) - print('a') - if not pcm_data: - break - - stream.write(pcm_data) +pygame.mixer.init() - # 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) +class SubPyPlayer: + conn: SubSonic.SubpyConn + main: urwid.Padding - # stream.write(audio.raw_data) - stream.stop_stream() - stream.close() - p.terminate() + 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() - ffmpeg_process.wait() + # Currently Blocking + def play_song(song_id: str): + r = conn.stream(song_id) + + # convert stream to bytes io thing + audio_data = io.BytesIO(r.content) + + pygame.mixer.music.load(audio_data) + pygame.mixer.music.play() + + while pygame.mixer.music.get_busy(): + pygame.time.Clock().tick(10) + + def menu(self, title: str, choices_: Iterable[str]) -> urwid.ListBox: + + 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"), + ] + ) + ) -play_song(echidna_id) + def exit_program(self, button: urwid.Button) -> None: + raise urwid.ExitMainLoop() -# with open('echidna.xml', 'wb') as file: -# file.write(conn.getSong(echidna_id).content) +SubPyPlayer(conn) -# echidna = conn.getSong(echidna_id) - -# print(echidna.title) - -# conn.stream(echidna_id) \ No newline at end of file