change to an album based queuing system with history and display album cover, song and album name
This commit is contained in:
140
app.py
140
app.py
@@ -1,7 +1,7 @@
|
||||
import pyray as pr
|
||||
import math
|
||||
from ctypes import c_float
|
||||
from gapless_player import GaplessPlayer, build_jellyfin_audio_url, server, client
|
||||
from gapless_player import GaplessPlayer, song_data_to_Song, server, client
|
||||
|
||||
# --- Configuration Constants ---
|
||||
INITIAL_SCREEN_WIDTH = 800
|
||||
@@ -176,34 +176,53 @@ pr.set_target_fps(TARGET_FPS)
|
||||
player = GaplessPlayer()
|
||||
|
||||
print("add queue")
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("dab6efb24bb2372794d2b4fb53a12376")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("58822c0fc47ec63ba798ba4f04ea3cf3")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("6382005f9dbae8d187d80a5cdca3e7a6")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("a5d2453e07a4998ea20e957c44f90be6")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("398d481a7b85287ad200578b5ab997b0")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("f9f32ca67be7f83139cee3c66e1e4965")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("2f651e103b1fd22ea2f202d6f3398b36")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("164b95968ab1a725fff060fa8c351cc8")["Id"], server["AccessToken"], server["UserId"]))
|
||||
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("38a6c21561f54d284a6acad89a3ea8b0")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("631aeddb0557fef65f49463abb20ad7f")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], , server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("58822c0fc47ec63ba798ba4f04ea3cf3")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("6382005f9dbae8d187d80a5cdca3e7a6")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("a5d2453e07a4998ea20e957c44f90be6")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("398d481a7b85287ad200578b5ab997b0")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("f9f32ca67be7f83139cee3c66e1e4965")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("2f651e103b1fd22ea2f202d6f3398b36")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("164b95968ab1a725fff060fa8c351cc8")["Id"], server["AccessToken"], server["UserId"]))
|
||||
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("3d611c8664c5b2072edbf46da2a76c89")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("66559c40d5904944a3f97198d0297894")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("84b75eeb5c8e862d002bae05d2671b1b")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("7ef66992426093252696e1d8666a22e4")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("f37982227942d3df031381e653ec5790")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("0e8fc5fcf119de0439f5a15a4f255c5c")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/01 Speak to Me.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("99067e877d91be1a66eb5a7ff2f4128f")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/02 Breathe (In the Air).flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("916eda422f48efd8705f29e0600a3e60")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/03 On the Run.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("5e1067d59ed98979ad12a58548b27b83")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/04 Time.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("8bcf8240d12aa5c3b14dc3b57f32fef7")["Id"], server["AccessToken"], server["UserId"]))
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/05 The Great Gig in the Sky.flac')
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/06 Money.flac')
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/07 Us and Them.flac')
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/08 Any Colour You Like.flac')
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/09 Brain Damage.flac')
|
||||
player.add_to_queue('music/pink floyd/dark side of the moon/10 Eclipse.flac')
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("38a6c21561f54d284a6acad89a3ea8b0")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("631aeddb0557fef65f49463abb20ad7f")["Id"], server["AccessToken"], server["UserId"]))
|
||||
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("3d611c8664c5b2072edbf46da2a76c89")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("66559c40d5904944a3f97198d0297894")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("84b75eeb5c8e862d002bae05d2671b1b")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("7ef66992426093252696e1d8666a22e4")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("f37982227942d3df031381e653ec5790")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("0e8fc5fcf119de0439f5a15a4f255c5c")["Id"], server["AccessToken"], server["UserId"]))
|
||||
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("dab6efb24bb2372794d2b4fb53a12376"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("58822c0fc47ec63ba798ba4f04ea3cf3"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("6382005f9dbae8d187d80a5cdca3e7a6"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("a5d2453e07a4998ea20e957c44f90be6"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("398d481a7b85287ad200578b5ab997b0"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("f9f32ca67be7f83139cee3c66e1e4965"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("2f651e103b1fd22ea2f202d6f3398b36"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("164b95968ab1a725fff060fa8c351cc8"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("38a6c21561f54d284a6acad89a3ea8b0"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("631aeddb0557fef65f49463abb20ad7f"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("3d611c8664c5b2072edbf46da2a76c89"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("66559c40d5904944a3f97198d0297894"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("84b75eeb5c8e862d002bae05d2671b1b"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("7ef66992426093252696e1d8666a22e4"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("f37982227942d3df031381e653ec5790"), server))
|
||||
player.add_to_queue(song_data_to_Song(client.jellyfin.get_item("0e8fc5fcf119de0439f5a15a4f255c5c"), server))
|
||||
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/01 Speak to Me.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("99067e877d91be1a66eb5a7ff2f4128f")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/02 Breathe (In the Air).flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("916eda422f48efd8705f29e0600a3e60")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/03 On the Run.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("5e1067d59ed98979ad12a58548b27b83")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/04 Time.flac')#(build_jellyfin_audio_url(server["address"], client.jellyfin.get_item("8bcf8240d12aa5c3b14dc3b57f32fef7")["Id"], server["AccessToken"], server["UserId"]))
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/05 The Great Gig in the Sky.flac')
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/06 Money.flac')
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/07 Us and Them.flac')
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/08 Any Colour You Like.flac')
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/09 Brain Damage.flac')
|
||||
# player.add_to_queue('music/pink floyd/dark side of the moon/10 Eclipse.flac')
|
||||
print("add queue done")
|
||||
|
||||
# Initial setup
|
||||
@@ -214,6 +233,23 @@ state["camera"] = setup_3d_environment(int(render_rect.width), int(render_rect.h
|
||||
# LOAD THE ASSETS
|
||||
state["album_texture"], state["album_model"] = load_album_assets()
|
||||
|
||||
current_path = None
|
||||
texture = None
|
||||
|
||||
def load_texture(path):
|
||||
global texture, current_path
|
||||
|
||||
if not path:
|
||||
return
|
||||
|
||||
if path == current_path:
|
||||
return
|
||||
|
||||
if texture is not None:
|
||||
pr.unload_texture(texture)
|
||||
|
||||
texture = pr.load_texture(path)
|
||||
current_path = path
|
||||
# --- Main Game Loop ---
|
||||
while not pr.window_should_close():
|
||||
# 1. Update
|
||||
@@ -226,8 +262,6 @@ while not pr.window_should_close():
|
||||
render_rect = get_3d_render_area(current_width, current_height)
|
||||
pr.unload_render_texture(state["render_texture"])
|
||||
state["render_texture"] = pr.load_render_texture(int(render_rect.width), int(render_rect.height))
|
||||
|
||||
delta_time = pr.get_frame_time()
|
||||
|
||||
if pr.is_key_pressed(pr.KeyboardKey.KEY_SPACE):
|
||||
if player.playing:
|
||||
@@ -270,15 +304,53 @@ while not pr.window_should_close():
|
||||
pr.draw_texture_pro(state["render_texture"].texture,
|
||||
source_rect, render_rect, pr.Vector2(0, 0), 0.0, pr.WHITE)
|
||||
|
||||
pr.draw_rectangle_lines_ex(render_rect, 3, pr.LIME)
|
||||
pr.draw_rectangle_lines_ex(render_rect, 3, pr.WHITE)
|
||||
|
||||
draw_progress_bar(progress_rect, player.position, player.playback_info_to_duration(player.playback_info))
|
||||
|
||||
pr.draw_text(f"Status: {'Playing' if player.playing else 'Paused'} (SPACE)",
|
||||
int(current_width * 0.05), int(current_height * 0.9), int(current_height * 0.03), pr.LIME)
|
||||
current_song = player.get_current_song()
|
||||
|
||||
load_texture(current_song and current_song.album_cover_path)
|
||||
|
||||
max_size = int(current_height * 0.075)
|
||||
pr.draw_text((current_song and f"{current_song.name} - {current_song.artist_name}") or "",
|
||||
int(current_width * 0.05+max_size*1.1), int(current_height * 0.8), int(current_height * 0.03), pr.WHITE)
|
||||
|
||||
draw_progress_bar(progress_rect, player.position, player.song_to_duration(player.get_current_song()))
|
||||
|
||||
|
||||
pr.draw_text(f"Status: {'Playing' if player.playing else 'Paused'} (SPACE)",
|
||||
int(current_width * 0.05), int(current_height * 0.9), int(current_height * 0.03), pr.WHITE)
|
||||
|
||||
|
||||
if texture is not None:
|
||||
|
||||
scale = min(
|
||||
max_size / texture.width,
|
||||
max_size / texture.height
|
||||
)
|
||||
|
||||
dest_rect = pr.Rectangle(
|
||||
int(current_width * 0.05),
|
||||
int(current_height * 0.8),
|
||||
texture.width * scale,
|
||||
texture.height * scale
|
||||
)
|
||||
|
||||
src_rect = pr.Rectangle(0, 0, texture.width, texture.height)
|
||||
|
||||
pr.draw_texture_pro(
|
||||
texture,
|
||||
src_rect,
|
||||
dest_rect,
|
||||
pr.Vector2(0, 0),
|
||||
0.0,
|
||||
pr.WHITE
|
||||
)
|
||||
pr.end_drawing()
|
||||
|
||||
# Cleanup
|
||||
if texture is not None:
|
||||
pr.unload_texture(texture)
|
||||
|
||||
# --- De-initialization ---
|
||||
pr.unload_texture(state["album_texture"]) # Unload the texture
|
||||
pr.unload_model(state["album_model"]) # Unload the model/mesh
|
||||
|
||||
Reference in New Issue
Block a user