mirror of
https://github.com/KevinMidboe/spotify-downloader.git
synced 2025-10-29 18:00:15 +00:00
Search format enhancements
This commit is contained in:
@@ -31,14 +31,16 @@ All the below changes were made as a part of #690.
|
|||||||
- Display a combined *download & encode* progress bar.
|
- Display a combined *download & encode* progress bar.
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- **[Breaking]** Tracks are now downloaded in the current working directory (instead of Music directory)
|
- **[Breaking]** Tracks are now downloaded in the current working directory (instead of
|
||||||
by default.
|
user's Music directory) by default.
|
||||||
- **[Breaking]** Short for `--album` is now `-a` instead of `-b`.
|
- **[Breaking]** Short for `--album` is now `-a` instead of `-b`.
|
||||||
- **[Breaking]** Short for `--all-albums` is now `-aa` instead of `-ab`.
|
- **[Breaking]** Short for `--all-albums` is now `-aa` instead of `-ab`.
|
||||||
- Allow "&" character in filenames.
|
- Allow "&" character in filenames.
|
||||||
- **[Breaking]** Merge parameters `-ff` and `-f` to `-f` (`--output-file`).
|
- **[Breaking]** Merge parameters `-ff` and `-f` to `-f` (`--output-file`).
|
||||||
- **[Breaking]** Do not prefix formats with a dot when specifying `-i` and `-o` parameters
|
- **[Breaking]** Do not prefix formats with a dot when specifying `-i` and `-o` parameters
|
||||||
Such as `-o .mp3` is now written as `-o mp3`.
|
Such as `-o .mp3` is now written as `-o mp3`.
|
||||||
|
- **[Breaking]** Search format now uses hyphen for word break instead of underscore. Such as
|
||||||
|
`-sf "{artist} - {track_name}"` is now written as `-sf "{artist} - {track-name}"`.
|
||||||
- Partial re-write and internal API refactor.
|
- Partial re-write and internal API refactor.
|
||||||
- Enhance debug log output readability.
|
- Enhance debug log output readability.
|
||||||
- Internally adapt to latest changes made in Spotipy library.
|
- Internally adapt to latest changes made in Spotipy library.
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ def get_arguments(argv=None, base_config_file=spotdl.config.default_config_file)
|
|||||||
default=config["output_file"],
|
default=config["output_file"],
|
||||||
help="path where to write the downloaded track to, special tags "
|
help="path where to write the downloaded track to, special tags "
|
||||||
"are to be surrounded by curly braces. Possible tags: "
|
"are to be surrounded by curly braces. Possible tags: "
|
||||||
|
# TODO: Add possible tags
|
||||||
# "{}".format([spotdl.util.formats[x] for x in spotdl.util.formats]),
|
# "{}".format([spotdl.util.formats[x] for x in spotdl.util.formats]),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -167,6 +168,7 @@ def get_arguments(argv=None, base_config_file=spotdl.config.default_config_file)
|
|||||||
default=config["search_format"],
|
default=config["search_format"],
|
||||||
help="search format to search for on YouTube, special tags "
|
help="search format to search for on YouTube, special tags "
|
||||||
"are to be surrounded by curly braces. Possible tags: "
|
"are to be surrounded by curly braces. Possible tags: "
|
||||||
|
# TODO: Add possible tags
|
||||||
# "{}".format([spotdl.util.formats[x] for x in spotdl.util.formats]),
|
# "{}".format([spotdl.util.formats[x] for x in spotdl.util.formats]),
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
@@ -198,7 +200,8 @@ def get_arguments(argv=None, base_config_file=spotdl.config.default_config_file)
|
|||||||
"-ns",
|
"-ns",
|
||||||
"--no-spaces",
|
"--no-spaces",
|
||||||
default=config["no_spaces"],
|
default=config["no_spaces"],
|
||||||
help="replace spaces with underscores in file names",
|
help="replace spaces in metadata values with underscores when "
|
||||||
|
"generating filenames",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
)
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ class YouTubeSearch:
|
|||||||
def search(self, query, limit=10, retries=5):
|
def search(self, query, limit=10, retries=5):
|
||||||
""" Search and scrape YouTube to return a list of matching videos. """
|
""" Search and scrape YouTube to return a list of matching videos. """
|
||||||
search_url = self.generate_search_url(query)
|
search_url = self.generate_search_url(query)
|
||||||
logger.debug('Fetching YouTube results for "{}".'.format(search_url))
|
logger.debug('Fetching YouTube results for "{}" at "{}".'.format(query, search_url))
|
||||||
html = self._fetch_response_html(search_url)
|
html = self._fetch_response_html(search_url)
|
||||||
videos = self._fetch_search_results(html, limit=limit)
|
videos = self._fetch_search_results(html, limit=limit)
|
||||||
to_retry = retries > 0 and self._is_server_side_invalid_response(videos, html)
|
to_retry = retries > 0 and self._is_server_side_invalid_response(videos, html)
|
||||||
|
|||||||
@@ -181,10 +181,6 @@ class MetadataSearch:
|
|||||||
def _on_youtube_and_spotify_for_type_spotify(self):
|
def _on_youtube_and_spotify_for_type_spotify(self):
|
||||||
logger.debug("Extracting YouTube and Spotify metadata for input Spotify URI.")
|
logger.debug("Extracting YouTube and Spotify metadata for input Spotify URI.")
|
||||||
spotify_metadata = self._on_spotify_for_type_spotify(self.track)
|
spotify_metadata = self._on_spotify_for_type_spotify(self.track)
|
||||||
lyric_query = spotdl.metadata.format_string(
|
|
||||||
"{artist} - {track-name}",
|
|
||||||
spotify_metadata,
|
|
||||||
)
|
|
||||||
search_query = spotdl.metadata.format_string(self.yt_search_format, spotify_metadata)
|
search_query = spotdl.metadata.format_string(self.yt_search_format, spotify_metadata)
|
||||||
youtube_video = self._best_on_youtube_search_for_type_spotify(search_query)
|
youtube_video = self._best_on_youtube_search_for_type_spotify(search_query)
|
||||||
youtube_metadata = self.providers["youtube"].from_url(youtube_video["url"])
|
youtube_metadata = self.providers["youtube"].from_url(youtube_video["url"])
|
||||||
@@ -197,7 +193,7 @@ class MetadataSearch:
|
|||||||
def _on_youtube_and_spotify_for_type_youtube(self):
|
def _on_youtube_and_spotify_for_type_youtube(self):
|
||||||
logger.debug("Extracting YouTube and Spotify metadata for input YouTube URL.")
|
logger.debug("Extracting YouTube and Spotify metadata for input YouTube URL.")
|
||||||
youtube_metadata = self._on_youtube_for_type_youtube(self.track)
|
youtube_metadata = self._on_youtube_for_type_youtube(self.track)
|
||||||
search_query = spotdl.metadata.format_string(self.yt_search_format, youtube_metadata)
|
search_query = spotdl.metadata.format_string("{track-name}", youtube_metadata)
|
||||||
spotify_metadata = self._on_spotify_for_type_query(search_query)
|
spotify_metadata = self._on_spotify_for_type_query(search_query)
|
||||||
metadata = spotdl.util.merge(
|
metadata = spotdl.util.merge(
|
||||||
youtube_metadata,
|
youtube_metadata,
|
||||||
@@ -208,7 +204,6 @@ class MetadataSearch:
|
|||||||
def _on_youtube_and_spotify_for_type_query(self):
|
def _on_youtube_and_spotify_for_type_query(self):
|
||||||
logger.debug("Extracting YouTube and Spotify metadata for input track query.")
|
logger.debug("Extracting YouTube and Spotify metadata for input track query.")
|
||||||
search_query = self.track
|
search_query = self.track
|
||||||
lyric_query = search_query
|
|
||||||
# Make use of threads here to search on both YouTube & Spotify
|
# Make use of threads here to search on both YouTube & Spotify
|
||||||
# at the same time.
|
# at the same time.
|
||||||
spotify_metadata = spotdl.util.ThreadWithReturnValue(
|
spotify_metadata = spotdl.util.ThreadWithReturnValue(
|
||||||
@@ -226,10 +221,6 @@ class MetadataSearch:
|
|||||||
def _on_youtube_for_type_spotify(self):
|
def _on_youtube_for_type_spotify(self):
|
||||||
logger.debug("Extracting YouTube metadata for input Spotify URI.")
|
logger.debug("Extracting YouTube metadata for input Spotify URI.")
|
||||||
spotify_metadata = self._on_spotify_for_type_spotify(self.track)
|
spotify_metadata = self._on_spotify_for_type_spotify(self.track)
|
||||||
lyric_query = spotdl.metadata.format_string(
|
|
||||||
"{artist} - {track-name}",
|
|
||||||
spotify_metadata,
|
|
||||||
)
|
|
||||||
search_query = spotdl.metadata.format_string(self.yt_search_format, spotify_metadata)
|
search_query = spotdl.metadata.format_string(self.yt_search_format, spotify_metadata)
|
||||||
youtube_video = self._best_on_youtube_search_for_type_spotify(search_query)
|
youtube_video = self._best_on_youtube_search_for_type_spotify(search_query)
|
||||||
youtube_metadata = self.providers["youtube"].from_url(youtube_video["url"])
|
youtube_metadata = self.providers["youtube"].from_url(youtube_video["url"])
|
||||||
@@ -249,7 +240,7 @@ class MetadataSearch:
|
|||||||
def _on_spotify_for_type_youtube(self, url):
|
def _on_spotify_for_type_youtube(self, url):
|
||||||
logger.debug("Extracting Spotify metadata for input YouTube URL.")
|
logger.debug("Extracting Spotify metadata for input YouTube URL.")
|
||||||
youtube_metadata = self.providers["youtube"].from_url(url)
|
youtube_metadata = self.providers["youtube"].from_url(url)
|
||||||
search_query = spotdl.metadata.format_string(self.yt_search_format, youtube_metadata)
|
search_query = spotdl.metadata.format_string("{track-name}", youtube_metadata)
|
||||||
spotify_metadata = self.providers["spotify"].from_query(search_query)
|
spotify_metadata = self.providers["spotify"].from_query(search_query)
|
||||||
return spotify_metadata
|
return spotify_metadata
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user