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/spotify | |
parent | fcbfe460701316ded25e29356ed1fda42386e5c0 (diff) | |
parent | ce18cd27488d90fbd0aae7319a36a89e9fa85aa7 (diff) |
Merge pull request #10 from PacketParker/dev
Update
Diffstat (limited to 'code/utils/source_helpers/spotify')
-rw-r--r-- | code/utils/source_helpers/spotify/album.py | 68 | ||||
-rw-r--r-- | code/utils/source_helpers/spotify/artist.py | 77 | ||||
-rw-r--r-- | code/utils/source_helpers/spotify/playlist.py | 68 | ||||
-rw-r--r-- | code/utils/source_helpers/spotify/song.py | 63 |
4 files changed, 276 insertions, 0 deletions
diff --git a/code/utils/source_helpers/spotify/album.py b/code/utils/source_helpers/spotify/album.py new file mode 100644 index 0000000..0ebc7d5 --- /dev/null +++ b/code/utils/source_helpers/spotify/album.py @@ -0,0 +1,68 @@ +import datetime +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 album info from the Spotify API + """ + album_id = query.split("/album/")[1] + + try: + # Get the album info + response = requests.get( + f"https://api.spotify.com/v1/albums/{album_id}", + headers=headers, + ) + + if response.status_code == 404: + embed = create_embed( + title="Album Not Found", + description=( + "The album 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 Spotify API. Likely need to" + " restart the bot." + ) + return None, None + + response.raise_for_status() + # Unpack the album info + album = response.json() + name = album["name"] + artist = album["artists"][0]["name"] + num_tracks = len(album["tracks"]["items"]) + artwork_url = album["images"][0]["url"] + except IndexError: + LOG.error("Failed unpacking Spotify album info") + return None, None + except (JSONDecodeError, requests.HTTPError): + LOG.error("Failed making request to Spotify API") + return None, None + + embed = create_embed( + title="Album Queued", + description=( + f"**{name}** by **{artist}**\n" + f"` {num_tracks} ` tracks\n\n" + f"Queued by: {user.mention}" + ), + thumbnail=artwork_url, + ) + + return album, embed diff --git a/code/utils/source_helpers/spotify/artist.py b/code/utils/source_helpers/spotify/artist.py new file mode 100644 index 0000000..995e208 --- /dev/null +++ b/code/utils/source_helpers/spotify/artist.py @@ -0,0 +1,77 @@ +import datetime +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 artists top tracks from the Spotify API + """ + artist_id = query.split("/artist/")[1] + + try: + # Get the artists songs + response = requests.get( + f"https://api.spotify.com/v1/artists/{artist_id}/top-tracks", + headers=headers, + ) + + if response.status_code == 404: + embed = create_embed( + title="Artist Not Found", + description=( + "Either the provided link is malformed, the artist does" + " not exist, or the artist does not have any songs." + ), + ) + return None, embed + + if response.status_code == 401: + LOG.error( + "Could not authorize with Spotify API. Likely need to" + " restart the bot." + ) + return None, None + + response.raise_for_status() + # Unpack the artists songs + artist = response.json() + name = artist["tracks"][0]["artists"][0]["name"] + num_tracks = len(artist["tracks"]) + + # Get the artist info (for the thumbnail) + response = requests.get( + f"https://api.spotify.com/v1/artists/{artist_id}", + headers=headers, + ) + + response.raise_for_status() + try: + artwork_url = response.json()["images"][0]["url"] + except IndexError: + artwork_url = None + + except IndexError: + LOG.error("Failed unpacking Spotify artist info") + return None, None + except (JSONDecodeError, requests.HTTPError): + LOG.error("Failed making request to Spotify API") + return None, None + + embed = create_embed( + title="Artist Queued", + description=( + f"Top `{num_tracks}` track by **{name}**\n\n" + f"Queued by {user.mention}" + ), + thumbnail=artwork_url, + ) + return artist, embed diff --git a/code/utils/source_helpers/spotify/playlist.py b/code/utils/source_helpers/spotify/playlist.py new file mode 100644 index 0000000..7ca9c6a --- /dev/null +++ b/code/utils/source_helpers/spotify/playlist.py @@ -0,0 +1,68 @@ +import datetime +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 Spotify API + """ + playlist_id = query.split("/playlist/")[1] + + try: + # Get the playlist info + response = requests.get( + f"https://api.spotify.com/v1/playlists/{playlist_id}", + 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 Spotify API. Likely need to" + " restart the bot." + ) + return None, None + + response.raise_for_status() + # Unpack the playlist info + playlist = response.json() + name = playlist["name"] + owner = playlist["owner"]["display_name"] + num_tracks = len(playlist["tracks"]["items"]) + artwork_url = playlist["images"][0]["url"] + except IndexError: + LOG.error("Failed unpacking Spotify playlist info") + return None, None + except (JSONDecodeError, requests.HTTPError): + LOG.error("Failed making request to Spotify API") + return None, None + + embed = create_embed( + title="Playlist Queued", + description=( + f"**{name}** from **{owner}**\n" + f"` {num_tracks} ` tracks\n\n" + f"Queued by {user.mention}" + ), + thumbnail=artwork_url, + ) + + return playlist, embed diff --git a/code/utils/source_helpers/spotify/song.py b/code/utils/source_helpers/spotify/song.py new file mode 100644 index 0000000..b0c7379 --- /dev/null +++ b/code/utils/source_helpers/spotify/song.py @@ -0,0 +1,63 @@ +import datetime +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 song info from the Spotify API + """ + song_id = query.split("/track/")[1] + + try: + # Get the song info + response = requests.get( + f"https://api.spotify.com/v1/tracks/{song_id}", + headers=headers, + ) + + if response.status_code == 404: + embed = create_embed( + title="Song Not Found", + description=( + "The song 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 Spotify API. Likely need to" + " restart the bot." + ) + return None, None + + response.raise_for_status() + # Unpack the song info + song = response.json() + name = song["name"] + artist = song["artists"][0]["name"] + artwork_url = song["album"]["images"][0]["url"] + except IndexError: + LOG.error("Failed unpacking Spotify song info") + return None, None + except (JSONDecodeError, requests.HTTPError): + LOG.error("Failed making request to Spotify API") + return None, None + + embed = create_embed( + title="Song Queued", + description=f"**{name}** by **{artist}**\n\nQueued by {user.mention}", + thumbnail=artwork_url, + ) + + return song, embed |