diff options
author | Parker <contact@pkrm.dev> | 2024-12-03 06:05:14 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-03 06:05:14 +0000 |
commit | 15e33831639355546b32477a6870eb0a3ac47e24 (patch) | |
tree | a5455e0a8391747c7226a751354b7236c8c5d40b /code/utils/source_helpers/apple/playlist.py | |
parent | fcbfe460701316ded25e29356ed1fda42386e5c0 (diff) | |
parent | ce18cd27488d90fbd0aae7319a36a89e9fa85aa7 (diff) |
Merge pull request #10 from PacketParker/dev
Update
Diffstat (limited to 'code/utils/source_helpers/apple/playlist.py')
-rw-r--r-- | code/utils/source_helpers/apple/playlist.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/code/utils/source_helpers/apple/playlist.py b/code/utils/source_helpers/apple/playlist.py new file mode 100644 index 0000000..65dfbf8 --- /dev/null +++ b/code/utils/source_helpers/apple/playlist.py @@ -0,0 +1,88 @@ +import discord +import requests +from typing import Tuple, Optional +from requests.exceptions import JSONDecodeError + +from utils.config import create_embed, LOG + + +async def load( + headers: dict, + query: str, + user: discord.User, +) -> Tuple[Optional[dict], Optional[discord.Embed]]: + """ + Get the playlist info from the Apple Music API + """ + playlist_id = query.split("/playlist/")[1].split("/")[1] + try: + # Get all of the tracks in the playlist (limit at 100) + response = requests.get( + f"https://api.music.apple.com/v1/catalog/us/playlists/{playlist_id}/tracks?limit=100", + headers=headers, + ) + + if response.status_code == 404: + embed = create_embed( + title="Playlist Not Found", + description=( + "The playlist could not be found as the provided link is" + " invalid. Please try again." + ), + ) + return None, embed + + if response.status_code == 401: + LOG.error( + "Could not authorize with Apple Music API. Likely need to" + " restart the bot." + ) + return None, None + + response.raise_for_status() + playlist = response.json() + + # Get the general playlist info (name, artwork) + response = requests.get( + f"https://api.music.apple.com/v1/catalog/us/playlists/{playlist_id}", + headers=headers, + ) + + response.raise_for_status() + # Unpack the playlist info + playlist_info = response.json() + name = playlist_info["data"][0]["attributes"]["name"] + num_tracks = len(playlist["data"]) + except IndexError: + LOG.error("Failed unpacking Apple Music playlist info") + return None, None + except (JSONDecodeError, requests.HTTPError): + LOG.error("Failed making request to Apple Music API") + return None, None + + # Extract artwork URL, if available + artwork_url = ( + playlist_info["data"][0]["attributes"] + .get("artwork", {}) + .get("url", None) + ) + if artwork_url: + artwork_url = artwork_url.replace("{w}x{h}", "300x300") + + embed = create_embed( + title="Playlist Queued", + description=( + f"**{name}**\n` {num_tracks} ` tracks\n\nQueued by: {user.mention}" + ), + thumbnail=artwork_url, + ) + + # Add small alert if the playlist is the max size + if len(playlist["data"]) == 100: + embed.description += ( + "\n\n*This playlist is longer than the 100 song" + " maximum. Only the first 100 songs will be" + " queued.*" + ) + + return playlist, embed |