Use YouTube as fallback for track metadata if not found on Spotify

This commit is contained in:
Ritiek Malhotra
2018-12-31 19:12:54 +05:30
parent ddb4b01897
commit eb77880f9f
5 changed files with 84 additions and 5 deletions

View File

@@ -14,6 +14,12 @@ from spotdl import const
# Read more on mps-youtube/pafy#199
pafy.g.opener.addheaders.append(("Range", "bytes=0-"))
# Implement unreleased methods on Pafy object
# More info: https://github.com/mps-youtube/pafy/pull/211
if pafy.__version__ <= "0.5.4":
from spotdl import patcher
patcher.patch_pafy()
def set_api_key():
if const.args.youtube_api_key:
@@ -49,6 +55,8 @@ def match_video_and_metadata(track, force_pafy=True):
track = slugify(content.title).replace("-", " ")
if not const.args.no_metadata:
meta_tags = spotify_tools.generate_metadata(track)
if meta_tags is None: # and const.args.allow_youtube:
meta_tags = generate_metadata(content)
else:
# Let it generate metadata, youtube doesn't know spotify slang
if not const.args.no_metadata or internals.is_spotify(track):
@@ -56,11 +64,37 @@ def match_video_and_metadata(track, force_pafy=True):
if force_pafy:
content = go_pafy(track, meta_tags)
if meta_tags is None: # and const.args.allow_youtube:
meta_tags = generate_metadata(content)
else:
content = None
return content, meta_tags
def generate_metadata(content):
""" Fetch a song's metadata from YouTube. """
meta_tags = {"spotify_metadata": False,
"name": content.title,
"artists": [{"name": content.author}],
"duration": content.length,
"external_urls": {"youtube": content.watchv_url},
"album": {"images" : [{"url": content.getbestthumb()}], "name": None},
"year": content.published.split("-")[0],
"release_date": content.published.split(" ")[0],
"type": "track",
"disc_number": 1,
"track_number": 1,
"total_tracks": 1,
"publisher": None,
"external_ids": {"isrc": None},
"lyrics": None,
"copyright": None,
"genre": None,
}
return meta_tags
def get_youtube_title(content, number=None):
""" Get the YouTube video's title. """
title = content.title