Lyric optimizations

This commit is contained in:
Ritiek Malhotra
2020-04-13 03:19:14 +05:30
parent 9a088ee26d
commit 164f342262
3 changed files with 36 additions and 4 deletions

View File

@@ -7,6 +7,7 @@ from spotdl.encode.encoders import EncoderAvconv
from spotdl.lyrics.providers import LyricWikia from spotdl.lyrics.providers import LyricWikia
from spotdl.lyrics.providers import Genius from spotdl.lyrics.providers import Genius
from spotdl.lyrics.exceptions import LyricsNotFoundError
from spotdl.track import Track from spotdl.track import Track
@@ -15,12 +16,28 @@ import spotdl.util
import os import os
import urllib.request import urllib.request
# XXX: The code here may be a bit ugly due to overly gross techniques
# applied to squeeze out possible bits of performance.
def search_metadata(track, lyrics=True, search_format="{artist} - {track-name}"):
def search_lyrics(query):
provider = Genius()
try:
lyrics = provider.from_query(query)
except LyricsNotFoundError:
lyrics = None
return lyrics
def search_metadata(track, search_format="{artist} - {track-name} lyrics"):
youtube = ProviderYouTube() youtube = ProviderYouTube()
if spotdl.util.is_spotify(track): if spotdl.util.is_spotify(track):
spotify = ProviderSpotify() spotify = ProviderSpotify()
spotify_metadata = spotify.from_url(track) spotify_metadata = spotify.from_url(track)
lyric_query = spotdl.util.format_string(
"{artist} - {track-name}",
spotify_metadata,
)
search_query = spotdl.util.format_string(search_format, spotify_metadata) search_query = spotdl.util.format_string(search_format, spotify_metadata)
youtube_metadata = youtube.from_query(search_query) youtube_metadata = youtube.from_query(search_query)
metadata = spotdl.util.merge( metadata = spotdl.util.merge(
@@ -29,9 +46,20 @@ def search_metadata(track, lyrics=True, search_format="{artist} - {track-name}")
) )
elif spotdl.util.is_youtube(track): elif spotdl.util.is_youtube(track):
metadata = youtube.from_url(track) metadata = youtube.from_url(track)
lyric_query = spotdl.util.format_string(
"{artist} - {track-name}",
metadata,
)
else: else:
metadata = youtube.from_query(track) metadata = youtube.from_query(track)
lyric_query = track
metadata["lyrics"] = spotdl.util.ThreadWithReturnValue(
target=search_lyrics,
args=(lyric_query,)
)
metadata["lyrics"].start()
return metadata return metadata
@@ -47,6 +75,8 @@ def download_track(track, arguments):
def download_track_from_metadata(metadata, arguments): def download_track_from_metadata(metadata, arguments):
# TODO: Add `-m` flag
track = Track(metadata, cache_albumart=(not arguments.no_metadata)) track = Track(metadata, cache_albumart=(not arguments.no_metadata))
print(metadata["name"]) print(metadata["name"])
@@ -96,6 +126,7 @@ def download_track_from_metadata(metadata, arguments):
) )
if not arguments.no_metadata: if not arguments.no_metadata:
track.metadata["lyrics"] = track.metadata["lyrics"].join()
try: try:
track.apply_metadata(filename, encoding=output_extension) track.apply_metadata(filename, encoding=output_extension)
except TypeError: except TypeError:
@@ -134,7 +165,7 @@ def download_tracks_from_file(path, arguments):
"current_track": None, "current_track": None,
"next_track": spotdl.util.ThreadWithReturnValue( "next_track": spotdl.util.ThreadWithReturnValue(
target=search_metadata, target=search_metadata,
args=(next_track, True, arguments.search_format) args=(next_track, arguments.search_format)
) )
} }
metadata["next_track"].start() metadata["next_track"].start()
@@ -148,7 +179,7 @@ def download_tracks_from_file(path, arguments):
next_track = tracks.pop(0) next_track = tracks.pop(0)
metadata["next_track"] = spotdl.util.ThreadWithReturnValue( metadata["next_track"] = spotdl.util.ThreadWithReturnValue(
target=search_metadata, target=search_metadata,
args=(next_track, True, arguments.search_format) args=(next_track, arguments.search_format)
) )
metadata["next_track"].start() metadata["next_track"].start()

View File

@@ -76,7 +76,7 @@ class Genius(LyricBase):
""" """
Returns the best matching track's URL from a given query. Returns the best matching track's URL from a given query.
""" """
encoded_query = query.replace(" ", "+") encoded_query = urllib.request.quote(query.replace(" ", "+"))
search_url = self.base_search_url + encoded_query search_url = self.base_search_url + encoded_query
metadata = self._fetch_search_page(search_url) metadata = self._fetch_search_page(search_url)
lyric_url = metadata["response"]["sections"][0]["hits"][0]["result"]["path"] lyric_url = metadata["response"]["sections"][0]["hits"][0]["result"]["path"]

View File

@@ -92,6 +92,7 @@ def format_string(string, metadata, output_extension=""):
"{track-number}" : metadata["track_number"], "{track-number}" : metadata["track_number"],
"{total-tracks}" : metadata["total_tracks"], "{total-tracks}" : metadata["total_tracks"],
"{isrc}" : metadata["external_ids"]["isrc"], "{isrc}" : metadata["external_ids"]["isrc"],
# TODO: Call `str.zfill` fill on track-id
"{track-id}" : metadata.get("id", ""), "{track-id}" : metadata.get("id", ""),
"{output-ext}" : output_extension, "{output-ext}" : output_extension,
} }