from flask import Flask, Response, jsonify, render_template from base64 import b64encode from dotenv import load_dotenv, find_dotenv load_dotenv(find_dotenv()) import requests import json import os import random SPOTIFY_CLIENT_ID = os.getenv("SPOTIFY_CLIENT_ID") SPOTIFY_SECRET_ID = os.getenv("SPOTIFY_SECRET_ID") SPOTIFY_REFRESH_TOKEN = os.getenv("SPOTIFY_REFRESH_TOKEN") # scope user-read-currently-playing/user-read-recently-played SPOTIFY_URL_REFRESH_TOKEN = "https://accounts.spotify.com/api/token" SPOTIFY_URL_NOW_PLAYING = "https://api.spotify.com/v1/me/player/currently-playing" SPOTIFY_URL_RECENTLY_PLAY = "https://api.spotify.com/v1/me/player/recently-played?limit=10" app = Flask(__name__) def getAuth(): return b64encode(f"{SPOTIFY_CLIENT_ID}:{SPOTIFY_SECRET_ID}".encode()).decode("ascii") def refreshToken(): data = { "grant_type": "refresh_token", "refresh_token": SPOTIFY_REFRESH_TOKEN, } headers = {"Authorization": "Basic {}".format(getAuth())} response = requests.post(SPOTIFY_URL_REFRESH_TOKEN, data=data, headers=headers) return response.json()["access_token"] def recentlyPlayed(): token = refreshToken() headers = {"Authorization": f"Bearer {token}"} response = requests.get(SPOTIFY_URL_RECENTLY_PLAY, headers=headers) if response.status_code == 204: return {} return response.json() def nowPlaying(): token = refreshToken() headers = {"Authorization": f"Bearer {token}"} response = requests.get(SPOTIFY_URL_NOW_PLAYING, headers=headers) if response.status_code == 204: return {} return response.json() def barGen(barCount): barCSS = "" left = 1 for i in range(1, barCount + 1): anim = random.randint(1000, 1350) barCSS += ".bar:nth-child({}) {{ left: {}px; animation-duration: {}ms; }}".format( i, left, anim ) left += 4 return barCSS def loadImageB64(url): resposne = requests.get(url) return b64encode(resposne.content).decode("ascii") def makeSVG(data): barCount = 85 contentBar = "".join(["
" for i in range(barCount)]) barCSS = barGen(barCount) if data == {}: content_bar = "" recent_plays = recentlyPlayed() size_recent_play = len(recent_plays["items"]) idx = random.randint(0, size_recent_play - 1) item = recent_plays["items"][idx]["track"] else: item = data["item"] img = loadImageB64(item["album"]["images"][1]["url"]) artistName = item["artists"][0]["name"].replace("&", "&") songName = item["name"].replace("&", "&") dataDict = { "content_bar": contentBar, "css_bar": barCSS, "artist_name": artistName, "song_name": songName, "img": img, } return render_template("spotify.html.j2", **dataDict) @app.route("/", defaults={"path": ""}) @app.route("/