From 38f23f859f0ea7273deda6d413be72ec87445af9 Mon Sep 17 00:00:00 2001 From: AdyStudios Date: Mon, 13 Jan 2025 20:08:26 +0100 Subject: [PATCH 1/3] New feature: playlist-numbering-only --- spotdl/console/download.py | 1 + spotdl/console/meta.py | 1 + spotdl/console/save.py | 1 + spotdl/console/sync.py | 2 ++ spotdl/console/url.py | 1 + spotdl/types/options.py | 2 ++ spotdl/utils/arguments.py | 9 +++++++++ spotdl/utils/config.py | 1 + spotdl/utils/metadata.py | 6 +----- spotdl/utils/search.py | 8 ++++++++ 10 files changed, 27 insertions(+), 5 deletions(-) diff --git a/spotdl/console/download.py b/spotdl/console/download.py index 9ed240310..bbf09db2a 100644 --- a/spotdl/console/download.py +++ b/spotdl/console/download.py @@ -26,6 +26,7 @@ def download( query, use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numbering_only=downloader.settings["playlist_numbering_only"], albums_to_ignore=downloader.settings["ignore_albums"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings["playlist_retain_track_cover"], diff --git a/spotdl/console/meta.py b/spotdl/console/meta.py index 3a73560dd..bd2a577f1 100644 --- a/spotdl/console/meta.py +++ b/spotdl/console/meta.py @@ -175,6 +175,7 @@ async def pool_worker(file_path: Path) -> None: threads=downloader.settings["threads"], use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numbering_only=downloader.settings["playlist_numbering_only"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings[ "playlist_retain_track_cover" diff --git a/spotdl/console/save.py b/spotdl/console/save.py index 54fcb64c9..4daf291cd 100644 --- a/spotdl/console/save.py +++ b/spotdl/console/save.py @@ -46,6 +46,7 @@ def save( threads=downloader.settings["threads"], use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numbering_only=downloader.settings["playlist_numbering_only"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings["playlist_retain_track_cover"], ) diff --git a/spotdl/console/sync.py b/spotdl/console/sync.py index ce340ae53..04f0df12e 100644 --- a/spotdl/console/sync.py +++ b/spotdl/console/sync.py @@ -55,6 +55,7 @@ def sync( threads=downloader.settings["threads"], use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numberung_only=downloader.settings["playlist_numbering_only"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings[ "playlist_retain_track_cover" @@ -114,6 +115,7 @@ def sync( threads=downloader.settings["threads"], use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numberung_only=downloader.settings["playlist_numbering_only"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings[ "playlist_retain_track_cover" diff --git a/spotdl/console/url.py b/spotdl/console/url.py index a5f30bf8d..7a4232576 100644 --- a/spotdl/console/url.py +++ b/spotdl/console/url.py @@ -32,6 +32,7 @@ def url( threads=downloader.settings["threads"], use_ytm_data=downloader.settings["ytm_data"], playlist_numbering=downloader.settings["playlist_numbering"], + playlist_numberung_only=downloader.settings["playlist_numbering_only"], album_type=downloader.settings["album_type"], playlist_retain_track_cover=downloader.settings["playlist_retain_track_cover"], ) diff --git a/spotdl/types/options.py b/spotdl/types/options.py index 991195046..fd9242e65 100644 --- a/spotdl/types/options.py +++ b/spotdl/types/options.py @@ -45,6 +45,7 @@ class DownloaderOptions(TypedDict): lyrics_providers: List[str] genius_token: str playlist_numbering: bool + playlist_numbering_only: bool playlist_retain_track_cover: bool scan_for_songs: bool m3u: Optional[str] @@ -143,6 +144,7 @@ class DownloaderOptionalOptions(TypedDict, total=False): lyrics_providers: List[str] genius_token: str playlist_numbering: bool + playlist_numbering_only: bool playlist_retain_track_cover: bool scan_for_songs: bool m3u: Optional[str] diff --git a/spotdl/utils/arguments.py b/spotdl/utils/arguments.py index 6fe1262bb..ccc4877e4 100644 --- a/spotdl/utils/arguments.py +++ b/spotdl/utils/arguments.py @@ -456,6 +456,15 @@ def parse_output_options(parser: _ArgumentGroup): and album art as the playlist's icon", ) + # Stripped down version of the playlist numbering option, only setting the song's number to the playlist's index. + parser.add_argument( + "--playlist-numbering-only", + action="store_const", + dest="playlist_numbering_only", + const=True, + help="Sets the song's number to the playlist's index in a playlist", + ) + # Option to set the track number & album of tracks, while retaining album art of each track, in # a playlist to their index in the playlist & the name of playlist respectively. parser.add_argument( diff --git a/spotdl/utils/config.py b/spotdl/utils/config.py index 7add380fc..506189e24 100644 --- a/spotdl/utils/config.py +++ b/spotdl/utils/config.py @@ -309,6 +309,7 @@ def get_parameter(cls, key): "lyrics_providers": ["genius", "azlyrics", "musixmatch"], "genius_token": "alXXDbPZtK1m2RrZ8I4k2Hn8Ahsd0Gh_o076HYvcdlBvmc0ULL1H8Z8xRlew5qaG", "playlist_numbering": False, + "playlist_numbering_only": False, "playlist_retain_track_cover": False, "scan_for_songs": False, "m3u": None, diff --git a/spotdl/utils/metadata.py b/spotdl/utils/metadata.py index 140ebdc73..9f9923ca9 100644 --- a/spotdl/utils/metadata.py +++ b/spotdl/utils/metadata.py @@ -445,11 +445,7 @@ def get_file_metadata(path: Path, id3_separator: str = "/") -> Optional[Dict[str continue if path.suffix == ".flac": - if audio_file.pictures: - song_meta["album_art"] = audio_file.pictures[0].data - else: - song_meta["album_art"] = None - + song_meta["album_art"] = audio_file.pictures[0].data continue if path.suffix in [".ogg", ".opus"]: diff --git a/spotdl/utils/search.py b/spotdl/utils/search.py index bb1362d66..4e7836f9c 100644 --- a/spotdl/utils/search.py +++ b/spotdl/utils/search.py @@ -81,6 +81,7 @@ def parse_query( threads: int = 1, use_ytm_data: bool = False, playlist_numbering: bool = False, + playlist_numbering_only: bool = False, album_type=None, playlist_retain_track_cover: bool = False, ) -> List[Song]: @@ -99,6 +100,7 @@ def parse_query( query, use_ytm_data=use_ytm_data, playlist_numbering=playlist_numbering, + playlist_numbering_only=playlist_numbering_only, album_type=album_type, playlist_retain_track_cover=playlist_retain_track_cover, ) @@ -120,6 +122,7 @@ def get_simple_songs( query: List[str], use_ytm_data: bool = False, playlist_numbering: bool = False, + playlist_numbering_only: bool = False, albums_to_ignore=None, album_type=None, playlist_retain_track_cover: bool = False, @@ -256,6 +259,7 @@ def get_simple_songs( [full_url], use_ytm_data=use_ytm_data, playlist_numbering=playlist_numbering, + playlist_numbering_only=playlist_numbering_only, album_type=album_type, playlist_retain_track_cover=playlist_retain_track_cover, ) @@ -307,6 +311,10 @@ def get_simple_songs( song_data["list_position"] = song.list_position song_data["list_length"] = song_list.length + if playlist_numbering_only: + song_data["track_number"] = song_data["list_position"] + song_data["tracks_count"] = song_data["list_length"] + if playlist_numbering: song_data["track_number"] = song_data["list_position"] song_data["tracks_count"] = song_data["list_length"] From 69cdb2ede74124aaba5626e639ecf4825020378d Mon Sep 17 00:00:00 2001 From: AdyStudios Date: Mon, 13 Jan 2025 20:10:10 +0100 Subject: [PATCH 2/3] fixed incorrect change --- spotdl/utils/metadata.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/spotdl/utils/metadata.py b/spotdl/utils/metadata.py index 9f9923ca9..140ebdc73 100644 --- a/spotdl/utils/metadata.py +++ b/spotdl/utils/metadata.py @@ -445,7 +445,11 @@ def get_file_metadata(path: Path, id3_separator: str = "/") -> Optional[Dict[str continue if path.suffix == ".flac": - song_meta["album_art"] = audio_file.pictures[0].data + if audio_file.pictures: + song_meta["album_art"] = audio_file.pictures[0].data + else: + song_meta["album_art"] = None + continue if path.suffix in [".ogg", ".opus"]: From 9b1652cc9ce48f8a3f96438da61b41b5af51a13d Mon Sep 17 00:00:00 2001 From: AdyStudios Date: Tue, 11 Feb 2025 17:39:15 +0100 Subject: [PATCH 3/3] Merge: fix for genius lyrics provider --- spotdl/providers/lyrics/genius.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/spotdl/providers/lyrics/genius.py b/spotdl/providers/lyrics/genius.py index f558eeab5..d25dd3c6a 100644 --- a/spotdl/providers/lyrics/genius.py +++ b/spotdl/providers/lyrics/genius.py @@ -65,7 +65,7 @@ def get_results(self, name: str, artists: List[str], **_) -> Dict[str, str]: results[hit["result"]["full_title"]] = hit["result"]["id"] return results - + def extract_lyrics(self, url: str, **_) -> Optional[str]: """ Extracts the lyrics from the given url. @@ -112,12 +112,15 @@ def extract_lyrics(self, url: str, **_) -> Optional[str]: lyrics_div = soup.select_one("div.lyrics") lyrics_containers = soup.select("div[class^=Lyrics__Container]") + lyrics_container = soup.find("div", {"data-lyrics-container": "true"}) # Get lyrics if lyrics_div: lyrics = lyrics_div.get_text() elif lyrics_containers: lyrics = "\n".join(con.get_text() for con in lyrics_containers) + elif lyrics_container: + lyrics = lyrics_container.get_text("\n") else: return None @@ -131,4 +134,4 @@ def extract_lyrics(self, url: str, **_) -> Optional[str]: for to_remove in ["desc", "Desc"]: lyrics.replace(to_remove, "", 1) - return lyrics + return lyrics \ No newline at end of file