def already_exists(self, raw_song): """ Check if the input song already exists in the given folder. """ log.debug( "Cleaning any temp files and checking " 'if "{}" already exists'.format(self.filename) ) sys.stdout.flush() songs = os.listdir(self.filepath) self._remove_temp_files(songs) for song in songs: # check if a song with the same name is already present in the given folder if self._match_filenames(song): if internals.is_spotify(raw_song) and not self._has_metadata(song): return False log.warning('"{}" already exists'.format(song)) sys.stdout.flush() if const.args.overwrite == "prompt": return self._prompt_song(song) elif const.args.overwrite == "force": return self._force_overwrite_song(song) elif const.args.overwrite == "skip": return self._skip_song(song) return False
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") sys.stdout.flush() 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)) sys.stdout.flush() 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") sys.stdout.flush() try: meta_tags["lyrics"] = lyricwikia.get_lyrics( meta_tags["artists"][0]["name"], meta_tags["name"] ) except lyricwikia.LyricsNotFound: meta_tags["lyrics"] = None # 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"] log.debug(pprint.pformat(meta_tags)) sys.stdout.flush() return meta_tags
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']) except lyricwikia.LyricsNotFound: meta_tags['lyrics'] = None # Some sugar meta_tags['year'], *_ = meta_tags['release_date'].split('-') meta_tags['duration'] = meta_tags['duration_ms'] / 1000.0 # Remove unwanted parameters del meta_tags['duration_ms'] del meta_tags['available_markets'] del meta_tags['album']['available_markets'] log.debug(pprint.pformat(meta_tags)) return meta_tags
def match_video_and_metadata(track): """ Get and match track data from YouTube and Spotify. """ meta_tags = None def fallback_metadata(meta_tags): fallback_metadata_info = "Track not found on Spotify, falling back on YouTube metadata" skip_fallback_metadata_warning = "Fallback condition not met, shall not embed metadata" if meta_tags is None: if const.args.no_fallback_metadata: log.warning(skip_fallback_metadata_warning) sys.stdout.flush() else: log.info(fallback_metadata_info) sys.stdout.flush() meta_tags = generate_metadata(content) return meta_tags if internals.is_youtube(track): log.debug("Input song is a YouTube URL") sys.stdout.flush() 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 = fallback_metadata(meta_tags) elif internals.is_spotify(track): log.debug("Input song is a Spotify URL") sys.stdout.flush() # Let it generate metadata, YouTube doesn't know Spotify slang meta_tags = spotify_tools.generate_metadata(track) content = go_pafy(track, meta_tags) if const.args.no_metadata: meta_tags = None else: log.debug("Input song is plain text based") sys.stdout.flush() if const.args.no_metadata: content = go_pafy(track, meta_tags=None) else: meta_tags = spotify_tools.generate_metadata(track) content = go_pafy(track, meta_tags=meta_tags) meta_tags = fallback_metadata(meta_tags) return content, meta_tags
def check_exists(music_file, raw_song, meta_tags): """ Check if the input song already exists in the given folder. """ log.debug( "Cleaning any temp files and checking " 'if "{}" already exists'.format(music_file) ) songs = os.listdir(const.args.folder) for song in songs: if song.endswith(".temp"): os.remove(os.path.join(const.args.folder, song)) continue # check if a song with the same name is already present in the given folder if os.path.splitext(song)[0] == music_file: log.debug('Found an already existing song: "{}"'.format(song)) if internals.is_spotify(raw_song): # check if the already downloaded song has correct metadata # if not, remove it and download again without prompt already_tagged = metadata.compare( os.path.join(const.args.folder, song), meta_tags ) log.debug( "Checking if it is already tagged correctly? {}", already_tagged ) if not already_tagged: os.remove(os.path.join(const.args.folder, song)) return False log.warning('"{}" already exists'.format(song)) if const.args.overwrite == "prompt": log.info( '"{}" has already been downloaded. ' "Re-download? (y/N): ".format(song) ) prompt = input("> ") if prompt.lower() == "y": os.remove(os.path.join(const.args.folder, song)) return False else: return True elif const.args.overwrite == "force": os.remove(os.path.join(const.args.folder, song)) log.info('Overwriting "{}"'.format(song)) return False elif const.args.overwrite == "skip": log.info('Skipping "{}"'.format(song)) return True return False
def match_video_and_metadata(track, force_pafy=True): """ Get and match track data from YouTube and Spotify. """ meta_tags = None if internals.is_youtube(track): log.debug("Input song is a YouTube URL") 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) else: # Let it generate metadata, youtube doesn't know spotify slang if not const.args.no_metadata or internals.is_spotify(track): meta_tags = spotify_tools.generate_metadata(track) if force_pafy: content = go_pafy(track, meta_tags) else: content = None return content, meta_tags