diff --git a/lnbits/extensions/jukebox/static/js/index.js b/lnbits/extensions/jukebox/static/js/index.js index ae50af92..3d3c1f34 100644 --- a/lnbits/extensions/jukebox/static/js/index.js +++ b/lnbits/extensions/jukebox/static/js/index.js @@ -227,6 +227,7 @@ new Vue({ self.jukeboxDialog.data.sp_playlists = self.jukeboxDialog.data.sp_playlists.join() self.updateDB() self.jukeboxDialog.show = false + self.getJukeboxes() }, updateDB(){ self = this @@ -234,14 +235,16 @@ new Vue({ LNbits.api .request( 'PUT', - '/jukebox/api/v1/jukebox/' + self.jukeboxDialog.data.sp_id, + '/jukebox/api/v1/jukebox/' + this.jukeboxDialog.data.sp_id, self.g.user.wallets[0].adminkey, self.jukeboxDialog.data ) .then(function (response) { console.log(response.data) - self.getJukeboxes() - //self.JukeboxLinks.push(mapJukebox(response.data)) + if(this.jukeboxDialog.data.devices){ + self.getJukeboxes() + } + self.JukeboxLinks.push(mapJukebox(response.data)) }) }, playlistApi(method, url, body) { diff --git a/lnbits/extensions/jukebox/views_api.py b/lnbits/extensions/jukebox/views_api.py index df93883d..2a13edb3 100644 --- a/lnbits/extensions/jukebox/views_api.py +++ b/lnbits/extensions/jukebox/views_api.py @@ -1,6 +1,8 @@ from quart import g, jsonify, request from http import HTTPStatus from lnurl.exceptions import InvalidUrl as LnurlInvalidUrl # type: ignore +from base64 import urlsafe_b64encode +import base64 from lnbits.decorators import api_check_wallet_key, api_validate_post_request import httpx @@ -104,13 +106,74 @@ async def api_delete_item(juke_id): return "", HTTPStatus.NO_CONTENT - ################JUKEBOX ENDPOINTS################## @jukebox_ext.route("/api/v1/jukebox/jb/", methods=["GET"]) async def api_get_jukebox_songs(sp_id): jukebox = await get_jukebox(sp_id) - print(jukebox.playlists.split(",")[0].split("-")[1]) + print(jukebox.sp_playlists.split(",")[0].split("-")[1]) + 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", + 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]) + except AssertionError: + something = None + return jsonify(jukebox._asdict()), HTTPStatus.CREATED - return jsonify(jukebox._asdict()), HTTPStatus.CREATED \ No newline at end of file + +@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]) + async with httpx.AsyncClient() as client: + try: + r = await client.post( + "https://accounts.spotify.com/api/token", + timeout=40, + params={ + "grant_type": "refresh_token", + "refresh_token": jukebox.sp_refresh_token, + "client_id": jukebox.sp_user, + }, + headers={ + "Authorization": "Bearer " + + base64.b64encode( + (jukebox.sp_user + ":" + jukebox.sp_refresh_token).encode( + "utf-8" + ) + ).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"], + #) + except AssertionError: + something = None + return jsonify(jukebox._asdict()), HTTPStatus.CREATED