from datetime import datetime from typing import List import numpy as np from spotipy import Spotify from dateutil.parser import parse import matplotlib.pyplot as plt def fetch_recent_songs(client: Spotify): cursor = client.current_user_recently_played() recently_played: List[dict] = cursor["items"] max_iterations = 30 it = 0 while it < max_iterations and cursor["cursors"] is not None: cursor = client.current_user_recently_played(before=cursor["cursors"]["before"]) recently_played.extend(cursor["items"]) return recently_played def build_heatmap(recent_songs: List[dict]) -> np.ndarray: heatmap = np.zeros((7, 20)) now = datetime.now().astimezone() for track in recent_songs: played_at = parse(track["played_at"]) weekday = datetime.weekday(played_at) week_offset = (now - played_at).days // 7 heatmap[weekday, -(week_offset +1)] +=1 return heatmap def plot(heatmap: np.ndarray): fig, ax = plt.subplots() ax.imshow(heatmap, cmap="Greens") ax.set_ylim(0, 6) ax.set_title("Recent activity") ax.set_yticklabels(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]) return fig, ax