mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
import spotipy
|
|
import spotipy.oauth2 as oauth2
|
|
|
|
from spotdl.metadata import ProviderBase
|
|
from spotdl.metadata.exceptions import SpotifyMetadataNotFoundError
|
|
|
|
class ProviderSpotify(ProviderBase):
|
|
def __init__(self, spotify=None):
|
|
self.spotify = spotify
|
|
|
|
def set_credentials(self, client_id, client_secret):
|
|
token = self._generate_token(client_id, client_secret)
|
|
self.spotify = spotipy.Spotify(auth=token)
|
|
|
|
def from_url(self, url):
|
|
metadata = self.spotify.track(url)
|
|
return self.metadata_to_standard_form(metadata)
|
|
|
|
def from_query(self, query):
|
|
tracks = self.spotify.search(query, limit=1)["tracks"]["items"]
|
|
if tracks is None:
|
|
raise SpotifyMetadataNotFoundError(
|
|
'Could not find any tracks matching the given search query ("{}")'.format(
|
|
query,
|
|
)
|
|
)
|
|
return self.metadata_to_standard_form(tracks[0])
|
|
|
|
def _generate_token(self, client_id, client_secret):
|
|
""" Generate the token. """
|
|
credentials = oauth2.SpotifyClientCredentials(
|
|
client_id=client_id,
|
|
client_secret=client_secret,
|
|
)
|
|
token = credentials.get_access_token()
|
|
return token
|
|
|
|
def _titlecase(self, string):
|
|
return " ".join(word.capitalize() for word in string.split())
|
|
|
|
def metadata_to_standard_form(self, metadata):
|
|
artist = self.spotify.artist(metadata["artists"][0]["id"])
|
|
album = self.spotify.album(metadata["album"]["id"])
|
|
|
|
try:
|
|
metadata[u"genre"] = self._titlecase(artist["genres"][0])
|
|
except IndexError:
|
|
metadata[u"genre"] = None
|
|
try:
|
|
metadata[u"copyright"] = album["copyrights"][0]["text"]
|
|
except IndexError:
|
|
metadata[u"copyright"] = None
|
|
try:
|
|
metadata[u"external_ids"][u"isrc"]
|
|
except KeyError:
|
|
metadata[u"external_ids"][u"isrc"] = None
|
|
|
|
metadata[u"release_date"] = album["release_date"]
|
|
metadata[u"publisher"] = album["label"]
|
|
metadata[u"total_tracks"] = album["tracks"]["total"]
|
|
|
|
# Some sugar
|
|
metadata["year"], *_ = metadata["release_date"].split("-")
|
|
metadata["duration"] = metadata["duration_ms"] / 1000.0
|
|
metadata["provider"] = "spotify"
|
|
|
|
# Remove unwanted parameters
|
|
del metadata["duration_ms"]
|
|
del metadata["available_markets"]
|
|
del metadata["album"]["available_markets"]
|
|
|
|
return metadata
|