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
+
+
+
+
+
+
+
+
+
+ {{ item.name }} - ({{ item.artist }})
+
+
+
+
+
+
+
+
+
+
+
+ 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