From 788103a68ed901279d53a4fee919c4e510627461 Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Mon, 13 May 2024 13:28:54 +0200 Subject: [PATCH 1/4] fix: removed invalid stuff --- development/actual_donwload.py | 4 ++-- music_kraken/audio/metadata.py | 2 -- music_kraken/objects/target.py | 7 +++++-- music_kraken/pages/abstract.py | 2 +- music_kraken/pages/youtube_music/super_youtube.py | 2 ++ music_kraken/pages/youtube_music/youtube_music.py | 7 ++++--- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/development/actual_donwload.py b/development/actual_donwload.py index 748bf1b..a8eb732 100644 --- a/development/actual_donwload.py +++ b/development/actual_donwload.py @@ -6,8 +6,8 @@ logging.getLogger().setLevel(logging.DEBUG) if __name__ == "__main__": commands = [ - "s: #a Psychonaut 4", - "d: 0", + "s: #a Crystal F", + "d: 20", ] diff --git a/music_kraken/audio/metadata.py b/music_kraken/audio/metadata.py index dbcd36a..d3f450e 100644 --- a/music_kraken/audio/metadata.py +++ b/music_kraken/audio/metadata.py @@ -112,8 +112,6 @@ def write_metadata_to_target(metadata: Metadata, target: Target, song: Song): USLT(encoding=3, lang=u'eng', desc=u'desc', text=uslt_val) ) - mutagen_file = mutagen.File(target.file_path) - id3_object.add_metadata(metadata) id3_object.save() diff --git a/music_kraken/objects/target.py b/music_kraken/objects/target.py index 2ba1cfe..2491a5a 100644 --- a/music_kraken/objects/target.py +++ b/music_kraken/objects/target.py @@ -1,7 +1,7 @@ from __future__ import annotations from pathlib import Path -from typing import List, Tuple, TextIO, Union +from typing import List, Tuple, TextIO, Union, Optional import logging import random import requests @@ -31,7 +31,10 @@ class Target(OuterProxy): } @classmethod - def temp(cls, name: str = str(random.randint(0, HIGHEST_ID))) -> P: + def temp(cls, name: str = str(random.randint(0, HIGHEST_ID)), file_extension: Optional[str] = None) -> P: + if file_extension is not None: + name = f"{name}.{file_extension}" + return cls(main_settings["temp_directory"] / name) # This is automatically generated diff --git a/music_kraken/pages/abstract.py b/music_kraken/pages/abstract.py index 8d6dba9..4d123a9 100644 --- a/music_kraken/pages/abstract.py +++ b/music_kraken/pages/abstract.py @@ -381,7 +381,7 @@ class Page: song.target_collection.append(new_target) r = DownloadResult(1) - temp_target: Target = Target.temp() + temp_target: Target = Target.temp(file_extension=main_settings["audio_format"]) found_on_disc = False target: Target diff --git a/music_kraken/pages/youtube_music/super_youtube.py b/music_kraken/pages/youtube_music/super_youtube.py index 420c46d..3ba1cee 100644 --- a/music_kraken/pages/youtube_music/super_youtube.py +++ b/music_kraken/pages/youtube_music/super_youtube.py @@ -145,6 +145,8 @@ class SuperYouTube(Page): _sponsorblock_connection: Connection = Connection() self.sponsorblock = python_sponsorblock.SponsorBlock(silent=True, session=_sponsorblock_connection.session) + super().__init__(*args, **kwargs) + def get_source_type(self, source: Source) -> Optional[Type[DatabaseObject]]: _url_type = { YouTubeUrlType.CHANNEL: Artist, diff --git a/music_kraken/pages/youtube_music/youtube_music.py b/music_kraken/pages/youtube_music/youtube_music.py index bbb8d22..eff7376 100644 --- a/music_kraken/pages/youtube_music/youtube_music.py +++ b/music_kraken/pages/youtube_music/youtube_music.py @@ -193,8 +193,7 @@ class YoutubeMusic(SuperYouTube): self.start_millis = get_current_millis() - if self.credentials.api_key == "" or DEBUG_YOUTUBE_INITIALIZING: - self._fetch_from_main_page() + self._fetch_from_main_page() SuperYouTube.__init__(self, *args, **kwargs) @@ -215,6 +214,8 @@ class YoutubeMusic(SuperYouTube): self.download_values_by_url: dict = {} self.not_download: Dict[str, DownloadError] = {} + super().__init__(*args, **kwargs) + def _fetch_from_main_page(self): """ ===API=KEY=== @@ -736,7 +737,7 @@ class YoutubeMusic(SuperYouTube): raw_headers=True, disable_cache=True, headers=media.get("headers", {}), - # chunk_size=media.get("chunk_size", main_settings["chunk_size"]), + chunk_size=main_settings["chunk_size"], method="GET", ) else: From c3350b016dd3d63ea33d4557011b8227d45b696d Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Mon, 13 May 2024 13:39:57 +0200 Subject: [PATCH 2/4] fix: timeout for yt music stream --- music_kraken/pages/youtube_music/youtube_music.py | 1 + 1 file changed, 1 insertion(+) diff --git a/music_kraken/pages/youtube_music/youtube_music.py b/music_kraken/pages/youtube_music/youtube_music.py index eff7376..0fb13a0 100644 --- a/music_kraken/pages/youtube_music/youtube_music.py +++ b/music_kraken/pages/youtube_music/youtube_music.py @@ -739,6 +739,7 @@ class YoutubeMusic(SuperYouTube): headers=media.get("headers", {}), chunk_size=main_settings["chunk_size"], method="GET", + timeout=main_settings["timeout"] * 3, ) else: result = DownloadResult(error_message=str(media.get("error") or self.not_download[source.hash_url])) From d85498869d44fed2961300dc7e437a0cca3e298f Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Mon, 13 May 2024 14:22:33 +0200 Subject: [PATCH 3/4] feat: tracksort and albumsort + some other stuff --- .vscode/settings.json | 1 + music_kraken/objects/parents.py | 27 +++++++++++++++++++++++++++ music_kraken/objects/song.py | 27 +++++++++++++++++++++++---- music_kraken/pages/abstract.py | 1 + pyproject.toml | 2 +- 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ace0f19..2108a96 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,7 @@ "encyclopaedia", "ENDC", "Gitea", + "isrc", "levenshtein", "metallum", "musify", diff --git a/music_kraken/objects/parents.py b/music_kraken/objects/parents.py index 725e2c9..3ef6ab3 100644 --- a/music_kraken/objects/parents.py +++ b/music_kraken/objects/parents.py @@ -301,6 +301,33 @@ class OuterProxy: return r + @property + def root_collections(self) -> List[Collection]: + if len(self.UPWARDS_COLLECTION_STRING_ATTRIBUTES) == 0: + return [self] + + r = [] + for collection_string_attribute in self.UPWARDS_COLLECTION_STRING_ATTRIBUTES: + r.extend(self.__getattribute__(collection_string_attribute)) + + return r + + def _compile(self, **kwargs): + pass + + def compile(self, from_root=False, **kwargs): + # compile from the root + if not from_root: + for c in self.root_collections: + c.compile(from_root=True, **kwargs) + return + + self._compile(**kwargs) + + for c_attribute in self.DOWNWARDS_COLLECTION_STRING_ATTRIBUTES: + for c in self.__getattribute__(c_attribute): + c.compile(from_root=True, **kwargs) + TITEL = "id" @property def title_string(self) -> str: diff --git a/music_kraken/objects/song.py b/music_kraken/objects/song.py index beccb2d..8b5953b 100644 --- a/music_kraken/objects/song.py +++ b/music_kraken/objects/song.py @@ -376,6 +376,25 @@ class Album(Base): r += f" with {len(self.song_collection)} songs" return r + def _compile(self): + self.analyze_implied_album_type() + self.update_tracksort() + + def analyze_implied_album_type(self): + # if the song collection has only one song, it is reasonable to assume that it is a single + if len(self.song_collection) == 1: + self.album_type = AlbumType.SINGLE + return + + # if the album already has an album type, we don't need to do anything + if self.album_type is not AlbumType.OTHER: + return + + # for information on EP's I looked at https://www.reddit.com/r/WeAreTheMusicMakers/comments/a354ql/whats_the_cutoff_length_between_ep_and_album/ + if len(self.song_collection) < 9: + self.album_type = AlbumType.EP + return + def update_tracksort(self): """ This updates the tracksort attributes, of the songs in @@ -525,6 +544,9 @@ class Artist(Base): self.label_collection.extend(object_list) return + def _compile(self): + self.update_albumsort() + def update_albumsort(self): """ This updates the albumsort attributes, of the albums in @@ -535,9 +557,6 @@ class Artist(Base): :return: """ - if len(self.main_album_collection) <= 0: - return - type_section: Dict[AlbumType, int] = defaultdict(lambda: 2, { AlbumType.OTHER: 0, # if I don't know it, I add it to the first section AlbumType.STUDIO_ALBUM: 0, @@ -580,7 +599,7 @@ class Artist(Base): album_list.extend(sections[section_index]) # replace the old collection with the new one - self.main_album_collection: Collection = Collection(data=album_list, element_type=Album) + self.main_album_collection._data = album_list INDEX_DEPENDS_ON = ("name", "source_collection", "contact_collection") @property diff --git a/music_kraken/pages/abstract.py b/music_kraken/pages/abstract.py index 4d123a9..a202b32 100644 --- a/music_kraken/pages/abstract.py +++ b/music_kraken/pages/abstract.py @@ -361,6 +361,7 @@ class Page: return download_result def _download_song(self, song: Song, naming_dict: NamingDict): + song.compile() if "genre" not in naming_dict and song.genre is not None: naming_dict["genre"] = song.genre diff --git a/pyproject.toml b/pyproject.toml index 62598b1..a569415 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,7 +69,7 @@ dependencies = [ "toml~=0.10.2", "typing_extensions~=4.7.1", - "python-sponsorblock~=0.1.dev1", + "python-sponsorblock~=0.1", "youtube_dl", ] dynamic = [ From 55024bd98713034b60811e9eae02e0fca727a732 Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Mon, 13 May 2024 17:15:15 +0200 Subject: [PATCH 4/4] fix: key error --- music_kraken/pages/youtube_music/youtube_music.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/music_kraken/pages/youtube_music/youtube_music.py b/music_kraken/pages/youtube_music/youtube_music.py index 0fb13a0..9339c9f 100644 --- a/music_kraken/pages/youtube_music/youtube_music.py +++ b/music_kraken/pages/youtube_music/youtube_music.py @@ -739,7 +739,7 @@ class YoutubeMusic(SuperYouTube): headers=media.get("headers", {}), chunk_size=main_settings["chunk_size"], method="GET", - timeout=main_settings["timeout"] * 3, + timeout=5, ) else: result = DownloadResult(error_message=str(media.get("error") or self.not_download[source.hash_url]))