added Canvas

reverse engineered Spotify Canvas API only available on iOS and Android
displays short looping video for song in place of album when available
This commit is contained in:
Brandon4466
2023-06-09 23:41:08 -07:00
parent fd19ba9c48
commit 0039308633
19 changed files with 365 additions and 1056 deletions

View File

@@ -14,6 +14,9 @@ import threading
import queue
import numpy
from sys import exit
import _canvas as SpotifyCanvas
from _tkvideoplayer import TkinterVideo
from gc import collect as gc
# SpotifyGUI - Made by Brandon Brunson
@@ -350,6 +353,31 @@ def getLyrics(artist_name, track_name):
global lrc
lrc = syncedlyrics.search("[" + track_name + "] [" + artist_name + "]")
# IT WONT DELETE
def getCanvas(track_id):
global videoplayer
videoplayer.stop()
videoplayer.grid_forget()
videoplayer.destroy()
gc()
try:
canvas_url = SpotifyCanvas.get_canvas_for_track(SpotifyCanvas.get_access_token(), track_id)
except AttributeError:
videoplayer = TkinterVideo(album_art_frame, scaled=True, background=bg_color, loop=True)
album_art_label.grid(sticky="w")
return None
else:
videoplayer = TkinterVideo(album_art_frame, scaled=True, background=bg_color, loop=True)
album_art_label.grid_forget()
videoplayer.load(canvas_url)
videoplayer.grid(sticky="w")
videoplayer.play()
videoplayer.bind("<Button-1>", lambda e:likeSong())
# def loop(e):
# videoplayer.play()
# videoplayer.bind("<<Ended>>", loop)
# def upNext():
# print(spotify.queue())
# up_next_label.config(text="Placeholder")
@@ -405,6 +433,7 @@ device_name_label = tk.Label(frame_artist_song, text="", font=("Helvetica", 12))
lyrics_label = tk.Label(lyrics_label_frame, text="", font=("Helvetica", 32), wraplength=(1280/3), justify=ttk.CENTER, background=bg_color)
album_art_label = tk.Label(album_art_frame, image=album_art_img)
# up_next_label = tk.Label(frame_artist_song, text="", font=("Helvetica", 12), wraplength=(1280/3), justify=ttk.CENTER, background=bg_color)
videoplayer = TkinterVideo(album_art_frame, scaled=True, background=bg_color, loop=True)
play_button.bind("<Button-1>", lambda e:controlPlay())
@@ -422,6 +451,8 @@ devices_list.bind("<Double-Button-1>", lambda e:kill())
# Function to update the song label with the current track's name
def update_song_label():
try:
@@ -458,6 +489,7 @@ def update_song_label():
artist_name = current_playback["item"]["artists"][0]["name"]
threading.Thread(target=getLyrics, args=(artist_name, track_name)).start()
track_id = current_playback["item"]["id"]
threading.Thread(target=getCanvas, args=(track_id,)).start()
track_duration = current_playback["item"]["duration_ms"]
device_name = current_playback["device"]["name"]
album_art_url = current_playback["item"]["album"]["images"][0]["url"]
@@ -535,11 +567,11 @@ def unloadNow_playing():
progress_bar.grid_forget()
lyrics_label.grid_forget()
album_art_label.grid_forget()
videoplayer.grid_forget()
def loadDevices_list():
pass
# devices_list.grid(row=1, column=1, pady=10)
# start_playback_on_device_button.grid(row=0, column=1, ipadx=40, ipady=40)
devices_list.grid(row=1, column=1, pady=10)
start_playback_on_device_button.grid(row=0, column=1, ipadx=40, ipady=40)
def unloadDevices_list():
devices_list.grid_forget()