| 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 |