diff --git a/lnbits/extensions/jukebox/static/js/index.js b/lnbits/extensions/jukebox/static/js/index.js index 3d3c1f34..ae185201 100644 --- a/lnbits/extensions/jukebox/static/js/index.js +++ b/lnbits/extensions/jukebox/static/js/index.js @@ -332,6 +332,11 @@ new Vue({ }, callAuthorizationApi(body) { self = this + console.log(btoa( + this.jukeboxDialog.data.sp_user + + ':' + + this.jukeboxDialog.data.sp_secret + )) let xhr = new XMLHttpRequest() xhr.open('POST', 'https://accounts.spotify.com/api/token', true) xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') diff --git a/lnbits/extensions/jukebox/templates/jukebox/jukebox.html b/lnbits/extensions/jukebox/templates/jukebox/jukebox.html index fff12b4c..c373f3fe 100644 --- a/lnbits/extensions/jukebox/templates/jukebox/jukebox.html +++ b/lnbits/extensions/jukebox/templates/jukebox/jukebox.html @@ -1,24 +1,104 @@ -{% extends "print.html" %} {% block page %} {% raw %} -
-
-
{{ item.name }}
- -
{{ item.price }}
+{% extends "public.html" %} {% block page %} {% raw %} +
+
+ + +

Currently playing

+
+
+ +
+
+ {{ currentPlaylist[0].name }}
+ {{ currentPlaylist[0].artist }} +
+
+
+
+ + + +

Pick a song

+ +
+ + + + + + +
+
+
+ + +

Queued

+
+ + + + + + + {{ song.name }} ({{ song.artist }}) + + +
+
{% endraw %} {% endblock %} {% block scripts %} + + diff --git a/lnbits/extensions/jukebox/views.py b/lnbits/extensions/jukebox/views.py index c3bf621a..830480de 100644 --- a/lnbits/extensions/jukebox/views.py +++ b/lnbits/extensions/jukebox/views.py @@ -10,6 +10,9 @@ from lnbits.core.crud import get_standalone_payment from . import jukebox_ext from .crud import get_jukebox from urllib.parse import unquote +from .views_api import ( + api_get_jukebox_songs, +) @jukebox_ext.route("/") @@ -22,5 +25,15 @@ async def index(): @jukebox_ext.route("/") async def print_qr_codes(juke_id): jukebox = await get_jukebox(juke_id) + if not jukebox: + return "error" + firstPlaylist = await api_get_jukebox_songs( + juke_id, jukebox.sp_playlists.split(",")[0].split("-")[1] + ) + print(firstPlaylist) - return await render_template("jukebox/jukebox.html", jukebox=jukebox) + return await render_template( + "jukebox/jukebox.html", + playlists=jukebox.sp_playlists.split(","), + firstPlaylist=firstPlaylist, + ) diff --git a/lnbits/extensions/jukebox/views_api.py b/lnbits/extensions/jukebox/views_api.py index 2a13edb3..e1174d8a 100644 --- a/lnbits/extensions/jukebox/views_api.py +++ b/lnbits/extensions/jukebox/views_api.py @@ -109,42 +109,49 @@ async def api_delete_item(juke_id): ################JUKEBOX ENDPOINTS################## -@jukebox_ext.route("/api/v1/jukebox/jb/", methods=["GET"]) -async def api_get_jukebox_songs(sp_id): +@jukebox_ext.route("/api/v1/jukebox/jb//", methods=["GET"]) +async def api_get_jukebox_songs(sp_id, sp_playlist): jukebox = await get_jukebox(sp_id) - print(jukebox.sp_playlists.split(",")[0].split("-")[1]) + tracks = [] async with httpx.AsyncClient() as client: try: r = await client.get( - "https://api.spotify.com/v1/playlists/" - + jukebox.sp_playlists.split(",")[0].split("-")[1] - + "/tracks", + "https://api.spotify.com/v1/playlists/" + sp_playlist + "/tracks", timeout=40, headers={"Authorization": "Bearer " + jukebox.sp_access_token}, ) - if r.json()["error"]["status"] == 401: - token = await api_get_token(sp_id) - if token['error'] == 'invalid_client': - print("invalid") - return "" - else: - return await api_get_jukebox_songs(sp_id) - print(r.json()["items"]) - resp = r.json()["items"][0] - print("id: " + resp["track"]["id"]) - print("name: " + resp["track"]["name"]) - print("album: " + resp["track"]["album"]["name"]) - print("artist: " + resp["track"]["artists"][0]["name"]) - print("image: " + resp["track"]["album"]["images"][0]) + if "items" not in r.json(): + if r.json()["error"]["status"] == 401: + token = await api_get_token(sp_id) + if token == False: + print("invalid") + return False + else: + return await api_get_jukebox_songs(sp_id, sp_playlist) + for item in r.json()["items"]: + tracks.append( + { + "id": item["track"]["id"], + "name": item["track"]["name"], + "album": item["track"]["album"]["name"], + "artist": item["track"]["artists"][0]["name"], + "image": item["track"]["album"]["images"][0]["url"], + } + ) except AssertionError: something = None - return jsonify(jukebox._asdict()), HTTPStatus.CREATED + print(jsonify(tracks)) + return tracks, HTTPStatus.OK -@jukebox_ext.route("/api/v1/jukebox/jb/", methods=["GET"]) async def api_get_token(sp_id): jukebox = await get_jukebox(sp_id) - print(jukebox.sp_playlists.split(",")[0].split("-")[1]) + print( + "Authorization: Bearer " + + base64.b64encode( + str(jukebox.sp_user + ":" + jukebox.sp_secret).encode("ascii") + ).decode("ascii") + ) async with httpx.AsyncClient() as client: try: r = await client.post( @@ -156,24 +163,20 @@ async def api_get_token(sp_id): "client_id": jukebox.sp_user, }, headers={ - "Authorization": "Bearer " + "Content-Type": "application/x-www-form-urlencoded", + "Authorization": "Basic " + base64.b64encode( - (jukebox.sp_user + ":" + jukebox.sp_refresh_token).encode( - "utf-8" - ) + str(jukebox.sp_user + ":" + jukebox.sp_secret).encode("ascii") ).decode("ascii"), "Content-Type": "application/x-www-form-urlencoded", }, ) - print(r) - print(r.json()) - if r.json()['error'] == 'invalid_client': - return r.json() - #await update_jukebox( - # juke_id=sp_id, - # sp_access_token=r.json()["access_token"], - # sp_refresh_token=r.json()["refresh_token"], - #) + if "access_token" not in r.json(): + return False + else: + await update_jukebox( + juke_id=sp_id, sp_access_token=r.json()["access_token"] + ) except AssertionError: something = None - return jsonify(jukebox._asdict()), HTTPStatus.CREATED + return True