mirror of
				https://github.com/KevinMidboe/spotify-downloader.git
				synced 2025-10-29 18:00:15 +00:00 
			
		
		
		
	Merge pull request #502 from ritiek/spotify-creds
Spotify Credentials from file
This commit is contained in:
		| @@ -34,6 +34,8 @@ default_conf = { | ||||
|         "skip": None, | ||||
|         "write-successful": None, | ||||
|         "log-level": "INFO", | ||||
|         "spotify_client_id": "4fe3fecfe5334023a1472516cc99d805", | ||||
|         "spotify_client_secret": "0f02b7c483c04257984695007a4a8d5c" | ||||
|     } | ||||
| } | ||||
|  | ||||
| @@ -147,7 +149,7 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): | ||||
|         "-nf", | ||||
|         "--no-fallback-metadata", | ||||
|         default=config["no-fallback-metadata"], | ||||
|         help="use YouTube metadata as fallback if track not found on Spotify", | ||||
|         help="do not use YouTube as fallback for metadata if track not found on Spotify", | ||||
|         action="store_true", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
| @@ -260,6 +262,18 @@ def get_arguments(raw_args=None, to_group=True, to_merge=True): | ||||
|         default=config["write-successful"], | ||||
|         help="path to file to write successful tracks to", | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "-sci", | ||||
|         "--spotify-client-id", | ||||
|         default=config["spotify_client_id"], | ||||
|         help=argparse.SUPPRESS | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "-scs", | ||||
|         "--spotify-client-secret", | ||||
|         default=config["spotify_client_secret"], | ||||
|         help=argparse.SUPPRESS | ||||
|     ) | ||||
|     parser.add_argument( | ||||
|         "-c", "--config", default=None, help="path to custom config.yml file" | ||||
|     ) | ||||
|   | ||||
| @@ -148,7 +148,8 @@ class EmbedMetadata: | ||||
|     def _embed_basic_metadata(self, audiofile, preset=TAG_PRESET): | ||||
|         meta_tags = self.meta_tags | ||||
|         audiofile[preset["artist"]] = meta_tags["artists"][0]["name"] | ||||
|         audiofile[preset["albumartist"]] = meta_tags["album"]["artists"][0]["name"] | ||||
|         if meta_tags["album"]["artists"][0]["name"]: | ||||
|             audiofile[preset["albumartist"]] = meta_tags["album"]["artists"][0]["name"] | ||||
|         if meta_tags["album"]["name"]: | ||||
|             audiofile[preset["album"]] = meta_tags["album"]["name"] | ||||
|         audiofile[preset["title"]] = meta_tags["name"] | ||||
|   | ||||
| @@ -51,6 +51,7 @@ def main(): | ||||
|  | ||||
|     internals.filter_path(const.args.folder) | ||||
|     youtube_tools.set_api_key() | ||||
|     spotify = spotify_tools.SpotifyAuthorize() | ||||
|  | ||||
|     logzero.setup_default_logger(formatter=const._formatter, level=const.args.log_level) | ||||
|  | ||||
|   | ||||
| @@ -12,237 +12,230 @@ import os | ||||
| from spotdl import const | ||||
| from spotdl import internals | ||||
|  | ||||
|  | ||||
| def generate_token(): | ||||
|     """ Generate the token. Please respect these credentials :) """ | ||||
|     credentials = oauth2.SpotifyClientCredentials( | ||||
|         client_id="4fe3fecfe5334023a1472516cc99d805", | ||||
|         client_secret="0f02b7c483c04257984695007a4a8d5c", | ||||
|     ) | ||||
|     token = credentials.get_access_token() | ||||
|     return token | ||||
| # token = generate_token() | ||||
| # spotify = spotipy.Spotify(auth=token) | ||||
|  | ||||
|  | ||||
| def refresh_token(): | ||||
|     """ Refresh expired token""" | ||||
|     global spotify | ||||
|     new_token = generate_token() | ||||
|     spotify = spotipy.Spotify(auth=new_token) | ||||
| class SpotifyAuthorize: | ||||
|     """ Class to handle all interactions with spotipy instance. """ | ||||
|     def __init__(self): | ||||
|         self.client_id = const.args.spotify_client_id | ||||
|         self.client_secret = const.args.spotify_client_secret | ||||
|         token = self.generate_token() | ||||
|         self.spotify = spotipy.Spotify(auth=token) | ||||
|  | ||||
|  | ||||
| # token is mandatory when using Spotify's API | ||||
| # https://developer.spotify.com/news-stories/2017/01/27/removing-unauthenticated-calls-to-the-web-api/ | ||||
| _token = generate_token() | ||||
| spotify = spotipy.Spotify(auth=_token) | ||||
|  | ||||
|  | ||||
| def generate_metadata(raw_song): | ||||
|     """ Fetch a song's metadata from Spotify. """ | ||||
|     if internals.is_spotify(raw_song): | ||||
|         # fetch track information directly if it is spotify link | ||||
|         log.debug("Fetching metadata for given track URL") | ||||
|         meta_tags = spotify.track(raw_song) | ||||
|     else: | ||||
|         # otherwise search on spotify and fetch information from first result | ||||
|         log.debug('Searching for "{}" on Spotify'.format(raw_song)) | ||||
|         try: | ||||
|             meta_tags = spotify.search(raw_song, limit=1)["tracks"]["items"][0] | ||||
|         except IndexError: | ||||
|             return None | ||||
|     artist = spotify.artist(meta_tags["artists"][0]["id"]) | ||||
|     album = spotify.album(meta_tags["album"]["id"]) | ||||
|  | ||||
|     try: | ||||
|         meta_tags[u"genre"] = titlecase(artist["genres"][0]) | ||||
|     except IndexError: | ||||
|         meta_tags[u"genre"] = None | ||||
|     try: | ||||
|         meta_tags[u"copyright"] = album["copyrights"][0]["text"] | ||||
|     except IndexError: | ||||
|         meta_tags[u"copyright"] = None | ||||
|     try: | ||||
|         meta_tags[u"external_ids"][u"isrc"] | ||||
|     except KeyError: | ||||
|         meta_tags[u"external_ids"][u"isrc"] = None | ||||
|  | ||||
|     meta_tags[u"release_date"] = album["release_date"] | ||||
|     meta_tags[u"publisher"] = album["label"] | ||||
|     meta_tags[u"total_tracks"] = album["tracks"]["total"] | ||||
|  | ||||
|     log.debug("Fetching lyrics") | ||||
|  | ||||
|     try: | ||||
|         meta_tags["lyrics"] = lyricwikia.get_lyrics( | ||||
|             meta_tags["artists"][0]["name"], meta_tags["name"] | ||||
|     def generate_token(self): | ||||
|         """ Generate the token. """ | ||||
|         credentials = oauth2.SpotifyClientCredentials( | ||||
|             client_id=self.client_id, | ||||
|             client_secret=self.client_secret, | ||||
|         ) | ||||
|     except lyricwikia.LyricsNotFound: | ||||
|         meta_tags["lyrics"] = None | ||||
|         token = credentials.get_access_token() | ||||
|         return token | ||||
|  | ||||
|     # Some sugar | ||||
|     meta_tags["year"], *_ = meta_tags["release_date"].split("-") | ||||
|     meta_tags["duration"] = meta_tags["duration_ms"] / 1000.0 | ||||
|     meta_tags["spotify_metadata"] = True | ||||
|     # Remove unwanted parameters | ||||
|     del meta_tags["duration_ms"] | ||||
|     del meta_tags["available_markets"] | ||||
|     del meta_tags["album"]["available_markets"] | ||||
|     def refresh_token(self): | ||||
|         """ Refresh expired token. """ | ||||
|         new_token = self.generate_token() | ||||
|         self.spotify = spotipy.Spotify(auth=new_token) | ||||
|  | ||||
|     log.debug(pprint.pformat(meta_tags)) | ||||
|     return meta_tags | ||||
|  | ||||
|  | ||||
| def get_playlists(username): | ||||
|     """ Fetch user playlists when using the -u option. """ | ||||
|     playlists = spotify.user_playlists(username) | ||||
|     links = [] | ||||
|     check = 1 | ||||
|  | ||||
|     while True: | ||||
|         for playlist in playlists["items"]: | ||||
|             # in rare cases, playlists may not be found, so playlists['next'] | ||||
|             # is None. Skip these. Also see Issue #91. | ||||
|             if playlist["name"] is not None: | ||||
|                 log.info( | ||||
|                     u"{0:>5}. {1:<30}  ({2} tracks)".format( | ||||
|                         check, playlist["name"], playlist["tracks"]["total"] | ||||
|                     ) | ||||
|                 ) | ||||
|                 playlist_url = playlist["external_urls"]["spotify"] | ||||
|                 log.debug(playlist_url) | ||||
|                 links.append(playlist_url) | ||||
|                 check += 1 | ||||
|         if playlists["next"]: | ||||
|             playlists = spotify.next(playlists) | ||||
|     def generate_metadata(self, raw_song): | ||||
|         """ Fetch a song's metadata from Spotify. """ | ||||
|         if internals.is_spotify(raw_song): | ||||
|             # fetch track information directly if it is spotify link | ||||
|             log.debug("Fetching metadata for given track URL") | ||||
|             meta_tags = self.spotify.track(raw_song) | ||||
|         else: | ||||
|             break | ||||
|             # otherwise search on spotify and fetch information from first result | ||||
|             log.debug('Searching for "{}" on Spotify'.format(raw_song)) | ||||
|             try: | ||||
|                 meta_tags = self.spotify.search(raw_song, limit=1)["tracks"]["items"][0] | ||||
|             except IndexError: | ||||
|                 return None | ||||
|         artist = self.spotify.artist(meta_tags["artists"][0]["id"]) | ||||
|         album = self.spotify.album(meta_tags["album"]["id"]) | ||||
|  | ||||
|     return links | ||||
|         try: | ||||
|             meta_tags[u"genre"] = titlecase(artist["genres"][0]) | ||||
|         except IndexError: | ||||
|             meta_tags[u"genre"] = None | ||||
|         try: | ||||
|             meta_tags[u"copyright"] = album["copyrights"][0]["text"] | ||||
|         except IndexError: | ||||
|             meta_tags[u"copyright"] = None | ||||
|         try: | ||||
|             meta_tags[u"external_ids"][u"isrc"] | ||||
|         except KeyError: | ||||
|             meta_tags[u"external_ids"][u"isrc"] = None | ||||
|  | ||||
|         meta_tags[u"release_date"] = album["release_date"] | ||||
|         meta_tags[u"publisher"] = album["label"] | ||||
|         meta_tags[u"total_tracks"] = album["tracks"]["total"] | ||||
|  | ||||
| def write_user_playlist(username, text_file=None): | ||||
|     links = get_playlists(username=username) | ||||
|     playlist = internals.input_link(links) | ||||
|     return write_playlist(playlist, text_file) | ||||
|         log.debug("Fetching lyrics") | ||||
|  | ||||
|         try: | ||||
|             meta_tags["lyrics"] = lyricwikia.get_lyrics( | ||||
|                 meta_tags["artists"][0]["name"], meta_tags["name"] | ||||
|             ) | ||||
|         except lyricwikia.LyricsNotFound: | ||||
|             meta_tags["lyrics"] = None | ||||
|  | ||||
| def fetch_playlist(playlist): | ||||
|     try: | ||||
|         playlist_id = internals.extract_spotify_id(playlist) | ||||
|     except IndexError: | ||||
|         # Wrong format, in either case | ||||
|         log.error("The provided playlist URL is not in a recognized format!") | ||||
|         sys.exit(10) | ||||
|     try: | ||||
|         results = spotify.user_playlist( | ||||
|             user=None, playlist_id=playlist_id, fields="tracks,next,name" | ||||
|         ) | ||||
|     except spotipy.client.SpotifyException: | ||||
|         log.error("Unable to find playlist") | ||||
|         log.info("Make sure the playlist is set to publicly visible and then try again") | ||||
|         sys.exit(11) | ||||
|         # Some sugar | ||||
|         meta_tags["year"], *_ = meta_tags["release_date"].split("-") | ||||
|         meta_tags["duration"] = meta_tags["duration_ms"] / 1000.0 | ||||
|         meta_tags["spotify_metadata"] = True | ||||
|         # Remove unwanted parameters | ||||
|         del meta_tags["duration_ms"] | ||||
|         del meta_tags["available_markets"] | ||||
|         del meta_tags["album"]["available_markets"] | ||||
|  | ||||
|     return results | ||||
|         log.debug(pprint.pformat(meta_tags)) | ||||
|         return meta_tags | ||||
|  | ||||
|     def write_user_playlist(self, username, text_file=None): | ||||
|         """ Write user playlists to text_file """ | ||||
|         links = self.get_playlists(username=username) | ||||
|         playlist = internals.input_link(links) | ||||
|         return self.write_playlist(playlist, text_file) | ||||
|  | ||||
| def write_playlist(playlist_url, text_file=None): | ||||
|     playlist = fetch_playlist(playlist_url) | ||||
|     tracks = playlist["tracks"] | ||||
|     if not text_file: | ||||
|         text_file = u"{0}.txt".format(slugify(playlist["name"], ok="-_()[]{}")) | ||||
|     filepath = os.path.join(const.args.folder if const.args.folder else "", text_file) | ||||
|     return write_tracks(tracks, filepath) | ||||
|     def get_playlists(self, username): | ||||
|         """ Fetch user playlists when using the -u option. """ | ||||
|         playlists = self.spotify.user_playlists(username) | ||||
|         links = [] | ||||
|         check = 1 | ||||
|  | ||||
|  | ||||
| def fetch_album(album): | ||||
|     album_id = internals.extract_spotify_id(album) | ||||
|     album = spotify.album(album_id) | ||||
|     return album | ||||
|  | ||||
|  | ||||
| def fetch_albums_from_artist(artist_url, album_type=None): | ||||
|     """ | ||||
|     This funcction returns all the albums from a give artist_url using the US | ||||
|     market | ||||
|     :param artist_url - spotify artist url | ||||
|     :param album_type - the type of album to fetch (ex: single) the default is | ||||
|                         all albums | ||||
|     :param return - the album from the artist | ||||
|     """ | ||||
|  | ||||
|     # fetching artist's albums limitting the results to the US to avoid duplicate | ||||
|     # albums from multiple markets | ||||
|     artist_id = internals.extract_spotify_id(artist_url) | ||||
|     results = spotify.artist_albums(artist_id, album_type=album_type, country="US") | ||||
|  | ||||
|     albums = results["items"] | ||||
|  | ||||
|     # indexing all pages of results | ||||
|     while results["next"]: | ||||
|         results = spotify.next(results) | ||||
|         albums.extend(results["items"]) | ||||
|  | ||||
|     return albums | ||||
|  | ||||
|  | ||||
| def write_all_albums_from_artist(artist_url, text_file=None): | ||||
|     """ | ||||
|     This function gets all albums from an artist and writes it to a file in the | ||||
|     current working directory called [ARTIST].txt, where [ARTIST] is the artist | ||||
|     of the album | ||||
|     :param artist_url - spotify artist url | ||||
|     :param text_file - file to write albums to | ||||
|     """ | ||||
|  | ||||
|     album_base_url = "https://open.spotify.com/album/" | ||||
|  | ||||
|     # fetching all default albums | ||||
|     albums = fetch_albums_from_artist(artist_url, album_type=None) | ||||
|  | ||||
|     # if no file if given, the default save file is in the current working | ||||
|     # directory with the name of the artist | ||||
|     if text_file is None: | ||||
|         text_file = albums[0]["artists"][0]["name"] + ".txt" | ||||
|  | ||||
|     for album in albums: | ||||
|         # logging album name | ||||
|         log.info("Fetching album: " + album["name"]) | ||||
|         write_album(album_base_url + album["id"], text_file=text_file) | ||||
|  | ||||
|  | ||||
| def write_album(album_url, text_file=None): | ||||
|     album = fetch_album(album_url) | ||||
|     tracks = spotify.album_tracks(album["id"]) | ||||
|     if not text_file: | ||||
|         text_file = u"{0}.txt".format(slugify(album["name"], ok="-_()[]{}")) | ||||
|     filepath = os.path.join(const.args.folder if const.args.folder else "", text_file) | ||||
|     return write_tracks(tracks, filepath) | ||||
|  | ||||
|  | ||||
| def write_tracks(tracks, text_file): | ||||
|     log.info(u"Writing {0} tracks to {1}".format(tracks["total"], text_file)) | ||||
|     track_urls = [] | ||||
|     with open(text_file, "a") as file_out: | ||||
|         while True: | ||||
|             for item in tracks["items"]: | ||||
|                 if "track" in item: | ||||
|                     track = item["track"] | ||||
|                 else: | ||||
|                     track = item | ||||
|                 try: | ||||
|                     track_url = track["external_urls"]["spotify"] | ||||
|                     log.debug(track_url) | ||||
|                     file_out.write(track_url + "\n") | ||||
|                     track_urls.append(track_url) | ||||
|                 except KeyError: | ||||
|                     log.warning( | ||||
|                         u"Skipping track {0} by {1} (local only?)".format( | ||||
|                             track["name"], track["artists"][0]["name"] | ||||
|             for playlist in playlists["items"]: | ||||
|                 # in rare cases, playlists may not be found, so playlists['next'] | ||||
|                 # is None. Skip these. Also see Issue #91. | ||||
|                 if playlist["name"] is not None: | ||||
|                     log.info( | ||||
|                         u"{0:>5}. {1:<30}  ({2} tracks)".format( | ||||
|                             check, playlist["name"], playlist["tracks"]["total"] | ||||
|                         ) | ||||
|                     ) | ||||
|             # 1 page = 50 results | ||||
|             # check if there are more pages | ||||
|             if tracks["next"]: | ||||
|                 tracks = spotify.next(tracks) | ||||
|                     playlist_url = playlist["external_urls"]["spotify"] | ||||
|                     log.debug(playlist_url) | ||||
|                     links.append(playlist_url) | ||||
|                     check += 1 | ||||
|             if playlists["next"]: | ||||
|                 playlists = self.spotify.next(playlists) | ||||
|             else: | ||||
|                 break | ||||
|     return track_urls | ||||
|  | ||||
|         return links | ||||
|  | ||||
|     def fetch_playlist(self, playlist): | ||||
|         try: | ||||
|             playlist_id = internals.extract_spotify_id(playlist) | ||||
|         except IndexError: | ||||
|             # Wrong format, in either case | ||||
|             log.error("The provided playlist URL is not in a recognized format!") | ||||
|             sys.exit(10) | ||||
|         try: | ||||
|             results = self.spotify.user_playlist( | ||||
|                 user=None, playlist_id=playlist_id, fields="tracks,next,name" | ||||
|             ) | ||||
|         except spotipy.client.SpotifyException: | ||||
|             log.error("Unable to find playlist") | ||||
|             log.info("Make sure the playlist is set to publicly visible and then try again") | ||||
|             sys.exit(11) | ||||
|  | ||||
|         return results | ||||
|  | ||||
|     def write_playlist(self, playlist_url, text_file=None): | ||||
|         playlist = self.fetch_playlist(playlist_url) | ||||
|         tracks = playlist["tracks"] | ||||
|         if not text_file: | ||||
|             text_file = u"{0}.txt".format(slugify(playlist["name"], ok="-_()[]{}")) | ||||
|         return self.write_tracks(tracks, text_file) | ||||
|  | ||||
|     def fetch_album(self, album): | ||||
|         album_id = internals.extract_spotify_id(album) | ||||
|         album = self.spotify.album(album_id) | ||||
|         return album | ||||
|  | ||||
|     def fetch_albums_from_artist(self, artist_url, album_type=None): | ||||
|         """ | ||||
|         This funcction returns all the albums from a give artist_url using the US | ||||
|         market | ||||
|         :param artist_url - spotify artist url | ||||
|         :param album_type - the type of album to fetch (ex: single) the default is | ||||
|                             all albums | ||||
|         :param return - the album from the artist | ||||
|         """ | ||||
|  | ||||
|         # fetching artist's albums limitting the results to the US to avoid duplicate | ||||
|         # albums from multiple markets | ||||
|         artist_id = internals.extract_spotify_id(artist_url) | ||||
|         results = self.spotify.artist_albums(artist_id, album_type=album_type, country="US") | ||||
|  | ||||
|         albums = results["items"] | ||||
|  | ||||
|         # indexing all pages of results | ||||
|         while results["next"]: | ||||
|             results = self.spotify.next(results) | ||||
|             albums.extend(results["items"]) | ||||
|  | ||||
|         return albums | ||||
|  | ||||
|  | ||||
|     def write_all_albums_from_artist(self, artist_url, text_file=None): | ||||
|         """ | ||||
|         This function gets all albums from an artist and writes it to a file in the | ||||
|         current working directory called [ARTIST].txt, where [ARTIST] is the artist | ||||
|         of the album | ||||
|         :param artist_url - spotify artist url | ||||
|         :param text_file - file to write albums to | ||||
|         """ | ||||
|  | ||||
|         album_base_url = "https://open.spotify.com/album/" | ||||
|  | ||||
|         # fetching all default albums | ||||
|         albums = self.fetch_albums_from_artist(artist_url, album_type=None) | ||||
|  | ||||
|         # if no file if given, the default save file is in the current working | ||||
|         # directory with the name of the artist | ||||
|         if text_file is None: | ||||
|             text_file = albums[0]["artists"][0]["name"] + ".txt" | ||||
|  | ||||
|         for album in albums: | ||||
|             # logging album name | ||||
|             log.info("Fetching album: " + album["name"]) | ||||
|             self.write_album(album_base_url + album["id"], text_file=text_file) | ||||
|  | ||||
|     def write_album(self, album_url, text_file=None): | ||||
|         album = self.fetch_album(album_url) | ||||
|         tracks = self.spotify.album_tracks(album["id"]) | ||||
|         if not text_file: | ||||
|             text_file = u"{0}.txt".format(slugify(album["name"], ok="-_()[]{}")) | ||||
|         return self.write_tracks(tracks, text_file) | ||||
|  | ||||
|     def write_tracks(self, tracks, text_file): | ||||
|         log.info(u"Writing {0} tracks to {1}".format(tracks["total"], text_file)) | ||||
|         track_urls = [] | ||||
|         with open(text_file, "a") as file_out: | ||||
|             while True: | ||||
|                 for item in tracks["items"]: | ||||
|                     if "track" in item: | ||||
|                         track = item["track"] | ||||
|                     else: | ||||
|                         track = item | ||||
|                     try: | ||||
|                         track_url = track["external_urls"]["spotify"] | ||||
|                         log.debug(track_url) | ||||
|                         file_out.write(track_url + "\n") | ||||
|                         track_urls.append(track_url) | ||||
|                     except KeyError: | ||||
|                         log.warning( | ||||
|                             u"Skipping track {0} by {1} (local only?)".format( | ||||
|                                 track["name"], track["artists"][0]["name"] | ||||
|                             ) | ||||
|                         ) | ||||
|                 # 1 page = 50 results | ||||
|                 # check if there are more pages | ||||
|                 if tracks["next"]: | ||||
|                     tracks = self.spotify.next(tracks) | ||||
|                 else: | ||||
|                     break | ||||
|         return track_urls | ||||
|   | ||||
| @@ -48,6 +48,7 @@ def go_pafy(raw_song, meta_tags=None): | ||||
| def match_video_and_metadata(track): | ||||
|     """ Get and match track data from YouTube and Spotify. """ | ||||
|     meta_tags = None | ||||
|     spotify = spotify_tools.SpotifyAuthorize() | ||||
|  | ||||
|  | ||||
|     def fallback_metadata(meta_tags): | ||||
| @@ -67,13 +68,13 @@ def match_video_and_metadata(track): | ||||
|         content = go_pafy(track, meta_tags=None) | ||||
|         track = slugify(content.title).replace("-", " ") | ||||
|         if not const.args.no_metadata: | ||||
|             meta_tags = spotify_tools.generate_metadata(track) | ||||
|             meta_tags = spotify.generate_metadata(track) | ||||
|             meta_tags = fallback_metadata(meta_tags) | ||||
|  | ||||
|     elif internals.is_spotify(track): | ||||
|         log.debug("Input song is a Spotify URL") | ||||
|         # Let it generate metadata, YouTube doesn't know Spotify slang | ||||
|         meta_tags = spotify_tools.generate_metadata(track) | ||||
|         meta_tags = spotify.generate_metadata(track) | ||||
|         content = go_pafy(track, meta_tags) | ||||
|         if const.args.no_metadata: | ||||
|             meta_tags = None | ||||
| @@ -83,7 +84,7 @@ def match_video_and_metadata(track): | ||||
|         if const.args.no_metadata: | ||||
|             content = go_pafy(track, meta_tags=None) | ||||
|         else: | ||||
|             meta_tags = spotify_tools.generate_metadata(track) | ||||
|             meta_tags = spotify.generate_metadata(track) | ||||
|             content = go_pafy(track, meta_tags=meta_tags) | ||||
|             meta_tags = fallback_metadata(meta_tags) | ||||
|  | ||||
| @@ -97,7 +98,8 @@ def generate_metadata(content): | ||||
|                  "artists": [{"name": content.author}], | ||||
|                  "duration": content.length, | ||||
|                  "external_urls": {"youtube": content.watchv_url}, | ||||
|                  "album": {"images" : [{"url": content.getbestthumb()}], "name": None}, | ||||
|                  "album": {"images" : [{"url": content.getbestthumb()}], | ||||
|                            "artists": [{"name": None}],"name": None}, | ||||
|                  "year": content.published.split("-")[0], | ||||
|                  "release_date": content.published.split(" ")[0], | ||||
|                  "type": "track", | ||||
|   | ||||
| @@ -33,7 +33,7 @@ def pytest_namespace(): | ||||
|  | ||||
| @pytest.fixture(scope="module") | ||||
| def metadata_fixture(): | ||||
|     meta_tags = spotify_tools.generate_metadata(SPOTIFY_TRACK_URL) | ||||
|     meta_tags = spotify_tools.SpotifyAuthorize().generate_metadata(SPOTIFY_TRACK_URL) | ||||
|     return meta_tags | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -6,23 +6,26 @@ import loader | ||||
|  | ||||
| loader.load_defaults() | ||||
|  | ||||
| @pytest.fixture(scope="module") | ||||
| def spotify(): | ||||
|     return spotify_tools.SpotifyAuthorize() | ||||
|  | ||||
| def test_generate_token(): | ||||
|     token = spotify_tools.generate_token() | ||||
| def test_generate_token(spotify): | ||||
|     token = spotify.generate_token() | ||||
|     assert len(token) == 83 | ||||
|  | ||||
|  | ||||
| def test_refresh_token(): | ||||
|     old_instance = spotify_tools.spotify | ||||
|     spotify_tools.refresh_token() | ||||
|     new_instance = spotify_tools.spotify | ||||
| def test_refresh_token(spotify): | ||||
|     old_instance = spotify.spotify | ||||
|     spotify.refresh_token() | ||||
|     new_instance = spotify.spotify | ||||
|     assert not old_instance == new_instance | ||||
|  | ||||
|  | ||||
| class TestGenerateMetadata: | ||||
|     @pytest.fixture(scope="module") | ||||
|     def metadata_fixture(self): | ||||
|         metadata = spotify_tools.generate_metadata("ncs - spectre") | ||||
|     def metadata_fixture(self, spotify): | ||||
|         metadata = spotify.generate_metadata("ncs - spectre") | ||||
|         return metadata | ||||
|  | ||||
|     def test_len(self, metadata_fixture): | ||||
| @@ -38,7 +41,7 @@ class TestGenerateMetadata: | ||||
|         assert metadata_fixture["duration"] == 230.634 | ||||
|  | ||||
|  | ||||
| def test_get_playlists(): | ||||
| def test_get_playlists(spotify): | ||||
|     expect_playlist_ids = [ | ||||
|         "34gWCK8gVeYDPKcctB6BQJ", | ||||
|         "04wTU2c2WNQG9XE5oSLYfj", | ||||
| @@ -50,15 +53,15 @@ def test_get_playlists(): | ||||
|         for playlist_id in expect_playlist_ids | ||||
|     ] | ||||
|  | ||||
|     playlists = spotify_tools.get_playlists("uqlakumu7wslkoen46s5bulq0") | ||||
|     playlists = spotify.get_playlists("uqlakumu7wslkoen46s5bulq0") | ||||
|     assert playlists == expect_playlists | ||||
|  | ||||
|  | ||||
| def test_write_user_playlist(tmpdir, monkeypatch): | ||||
| def test_write_user_playlist(tmpdir, spotify, monkeypatch): | ||||
|     expect_tracks = 17 | ||||
|     text_file = os.path.join(str(tmpdir), "test_us.txt") | ||||
|     monkeypatch.setattr("builtins.input", lambda x: 1) | ||||
|     spotify_tools.write_user_playlist("uqlakumu7wslkoen46s5bulq0", text_file) | ||||
|     spotify.write_user_playlist("uqlakumu7wslkoen46s5bulq0", text_file) | ||||
|     with open(text_file, "r") as f: | ||||
|         tracks = len(f.readlines()) | ||||
|     assert tracks == expect_tracks | ||||
| @@ -66,8 +69,8 @@ def test_write_user_playlist(tmpdir, monkeypatch): | ||||
|  | ||||
| class TestFetchPlaylist: | ||||
|     @pytest.fixture(scope="module") | ||||
|     def playlist_fixture(self): | ||||
|         playlist = spotify_tools.fetch_playlist( | ||||
|     def playlist_fixture(self, spotify): | ||||
|         playlist = spotify.fetch_playlist( | ||||
|             "https://open.spotify.com/playlist/0fWBMhGh38y0wsYWwmM9Kt" | ||||
|         ) | ||||
|         return playlist | ||||
| @@ -79,10 +82,10 @@ class TestFetchPlaylist: | ||||
|         assert playlist_fixture["tracks"]["total"] == 14 | ||||
|  | ||||
|  | ||||
| def test_write_playlist(tmpdir): | ||||
| def test_write_playlist(tmpdir, spotify): | ||||
|     expect_tracks = 14 | ||||
|     text_file = os.path.join(str(tmpdir), "test_pl.txt") | ||||
|     spotify_tools.write_playlist( | ||||
|     spotify.write_playlist( | ||||
|         "https://open.spotify.com/playlist/0fWBMhGh38y0wsYWwmM9Kt", text_file | ||||
|     ) | ||||
|     with open(text_file, "r") as f: | ||||
| @@ -93,8 +96,8 @@ def test_write_playlist(tmpdir): | ||||
| # XXX: Mock this test off if it fails in future | ||||
| class TestFetchAlbum: | ||||
|     @pytest.fixture(scope="module") | ||||
|     def album_fixture(self): | ||||
|         album = spotify_tools.fetch_album( | ||||
|     def album_fixture(self, spotify): | ||||
|         album = spotify.fetch_album( | ||||
|             "https://open.spotify.com/album/499J8bIsEnU7DSrosFDJJg" | ||||
|         ) | ||||
|         return album | ||||
| @@ -109,14 +112,13 @@ class TestFetchAlbum: | ||||
| # XXX: Mock this test off if it fails in future | ||||
| class TestFetchAlbumsFromArtist: | ||||
|     @pytest.fixture(scope="module") | ||||
|     def albums_from_artist_fixture(self): | ||||
|         albums = spotify_tools.fetch_albums_from_artist( | ||||
|     def albums_from_artist_fixture(self, spotify): | ||||
|         albums = spotify.fetch_albums_from_artist( | ||||
|             "https://open.spotify.com/artist/7oPftvlwr6VrsViSDV7fJY" | ||||
|         ) | ||||
|         return albums | ||||
|  | ||||
|     def test_len(self, albums_from_artist_fixture): | ||||
|         # TODO: Mock this test (failed in #493) | ||||
|         assert len(albums_from_artist_fixture) == 52 | ||||
|  | ||||
|     def test_zeroth_album_name(self, albums_from_artist_fixture): | ||||
| @@ -132,11 +134,10 @@ class TestFetchAlbumsFromArtist: | ||||
|         assert albums_from_artist_fixture[0]["total_tracks"] == 12 | ||||
|  | ||||
|  | ||||
| # TODO: Mock this test (failed in #493) | ||||
| def test_write_all_albums_from_artist(tmpdir): | ||||
| def test_write_all_albums_from_artist(tmpdir, spotify): | ||||
|     expect_tracks = 282 | ||||
|     text_file = os.path.join(str(tmpdir), "test_ab.txt") | ||||
|     spotify_tools.write_all_albums_from_artist( | ||||
|     spotify.write_all_albums_from_artist( | ||||
|         "https://open.spotify.com/artist/4dpARuHxo51G3z768sgnrY", text_file | ||||
|     ) | ||||
|     with open(text_file, "r") as f: | ||||
| @@ -144,10 +145,10 @@ def test_write_all_albums_from_artist(tmpdir): | ||||
|     assert tracks == expect_tracks | ||||
|  | ||||
|  | ||||
| def test_write_album(tmpdir): | ||||
| def test_write_album(tmpdir, spotify): | ||||
|     expect_tracks = 15 | ||||
|     text_file = os.path.join(str(tmpdir), "test_al.txt") | ||||
|     spotify_tools.write_album( | ||||
|     spotify.write_album( | ||||
|         "https://open.spotify.com/album/499J8bIsEnU7DSrosFDJJg", text_file | ||||
|     ) | ||||
|     with open(text_file, "r") as f: | ||||
|   | ||||
| @@ -40,7 +40,7 @@ class TestYouTubeAPIKeys: | ||||
|  | ||||
| @pytest.fixture(scope="module") | ||||
| def metadata_fixture(): | ||||
|     metadata = spotify_tools.generate_metadata(TRACK_SEARCH) | ||||
|     metadata = spotify_tools.SpotifyAuthorize().generate_metadata(TRACK_SEARCH) | ||||
|     return metadata | ||||
|  | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user