From 897897dba2f6981105bc24226a4c99e165550453 Mon Sep 17 00:00:00 2001 From: Lars Noack Date: Thu, 16 May 2024 14:29:50 +0200 Subject: [PATCH] feat: added recursive structure --- development/objects_collection.py | 2 +- music_kraken/objects/collection.py | 18 +++++++++--------- music_kraken/objects/song.py | 19 ++++++++----------- music_kraken/pages/bandcamp.py | 4 ++-- music_kraken/pages/encyclopaedia_metallum.py | 2 +- music_kraken/pages/youtube.py | 4 ++-- .../pages/youtube_music/_list_render.py | 13 +++++++++++++ .../pages/youtube_music/youtube_music.py | 2 +- tests/test_collection.py | 8 ++++---- 9 files changed, 41 insertions(+), 31 deletions(-) diff --git a/development/objects_collection.py b/development/objects_collection.py index 04e0ba6..8b4f866 100644 --- a/development/objects_collection.py +++ b/development/objects_collection.py @@ -13,7 +13,7 @@ if __name__ == "__main__": song_2 = Song( title = "song", - main_artist_list=[other_artist] + artist_list=[other_artist] ) other_artist.name = "main_artist" diff --git a/music_kraken/objects/collection.py b/music_kraken/objects/collection.py index b058630..d0cd75d 100644 --- a/music_kraken/objects/collection.py +++ b/music_kraken/objects/collection.py @@ -115,13 +115,6 @@ class Collection(Generic[T]): self._data.append(other) other._inner._is_in_collection.add(self) - # all of the existing hooks to get the defined datastructures - for collection_attribute, generator in self.extend_object_to_attribute.items(): - other.__getattribute__(collection_attribute).extend(generator, **kwargs) - - for attribute, new_object in self.append_object_to_attribute.items(): - other.__getattribute__(attribute).append(new_object, **kwargs) - for attribute, a in self.sync_on_append.items(): # syncing two collections by reference b = other.__getattribute__(attribute) @@ -141,6 +134,13 @@ class Collection(Generic[T]): a.extend(b_data, **kwargs) + # all of the existing hooks to get the defined datastructures + for collection_attribute, generator in self.extend_object_to_attribute.items(): + other.__getattribute__(collection_attribute).extend(generator, **kwargs) + + for attribute, new_object in self.append_object_to_attribute.items(): + other.__getattribute__(attribute).append(new_object, **kwargs) + def append(self, other: Optional[T], **kwargs): """ If an object, that represents the same entity exists in a relevant collection, @@ -164,13 +164,13 @@ class Collection(Generic[T]): for c in self.push_to: r = c._find_object(other) if r is not None: - # output("found push to", r, other, c, self, color=BColors.RED, sep="\t") + output("found push to", r, other, c, self, color=BColors.RED, sep="\t") return c.append(other, **kwargs) for c in self.pull_from: r = c._find_object(other) if r is not None: - # output("found pull from", r, other, c, self, color=BColors.RED, sep="\t") + output("found pull from", r, other, c, self, color=BColors.RED, sep="\t") c.remove(r, existing=r, **kwargs) existing = self._find_object(other) diff --git a/music_kraken/objects/song.py b/music_kraken/objects/song.py index bab1ae3..12749c9 100644 --- a/music_kraken/objects/song.py +++ b/music_kraken/objects/song.py @@ -129,7 +129,7 @@ class Song(Base): source_list: List[Source] = None, target_list: List[Target] = None, lyrics_list: List[Lyrics] = None, - main_artist_list: List[Artist] = None, + artist_list: List[Artist] = None, feature_artist_list: List[Artist] = None, album_list: List[Album] = None, tracksort: int = 0, @@ -145,6 +145,9 @@ class Song(Base): TITEL = "title" def __init_collections__(self) -> None: + self.feature_artist_collection.push_to = [self.artist_collection] + self.artist_collection.pull_from = [self.feature_artist_collection] + self.album_collection.sync_on_append = { "artist_collection": self.artist_collection, } @@ -156,14 +159,10 @@ class Song(Base): "album_collection": self.album_collection } - self.album_collection.append_object_to_attribute = { "artist_collection": self } - self.feature_artist_collection.push_to = [self.artist_collection] - self.artist_collection.pull_from = [self.feature_artist_collection] - def _add_other_db_objects(self, object_type: Type[OuterProxy], object_list: List[OuterProxy]): if object_type is Song: return @@ -239,11 +238,6 @@ class Song(Base): return f"{self.tracksort}/{len(self.album_collection[0].song_collection) or 1}" -""" -All objects dependent on Album -""" - - class Album(Base): title: str unified_title: str @@ -311,6 +305,9 @@ class Album(Base): UPWARDS_COLLECTION_STRING_ATTRIBUTES = ("label_collection", "artist_collection") def __init_collections__(self): + self.feature_artist_collection.push_to = [self.artist_collection] + self.artist_collection.pull_from = [self.feature_artist_collection] + self.song_collection.append_object_to_attribute = { "album_collection": self } @@ -515,7 +512,7 @@ class Artist(Base): source_list: List[Source] = None, contact_list: List[Contact] = None, feature_song_list: List[Song] = None, - main_album_list: List[Album] = None, + album_list: List[Album] = None, label_list: List[Label] = None, **kwargs ) -> None: diff --git a/music_kraken/pages/bandcamp.py b/music_kraken/pages/bandcamp.py index 2c15bcb..1caf803 100644 --- a/music_kraken/pages/bandcamp.py +++ b/music_kraken/pages/bandcamp.py @@ -117,7 +117,7 @@ class Bandcamp(Page): return Song( title=clean_song_title(name, artist_name=data["band_name"]), source_list=source_list, - main_artist_list=[ + artist_list=[ Artist( name=data["band_name"], source_list=[ @@ -370,7 +370,7 @@ class Bandcamp(Page): date=ID3Timestamp.strptime(data["datePublished"], "%d %b %Y %H:%M:%S %Z"), source_list=[Source(self.SOURCE_TYPE, album_data["@id"])] )], - main_artist_list=[Artist( + artist_list=[Artist( name=artist_data["name"].strip(), source_list=[Source(self.SOURCE_TYPE, _parse_artist_url(artist_data["@id"]))] )], diff --git a/music_kraken/pages/encyclopaedia_metallum.py b/music_kraken/pages/encyclopaedia_metallum.py index 0cf313c..52d9ea3 100644 --- a/music_kraken/pages/encyclopaedia_metallum.py +++ b/music_kraken/pages/encyclopaedia_metallum.py @@ -52,7 +52,7 @@ def _song_from_json(artist_html=None, album_html=None, release_type=None, title= return Song( title=title, - main_artist_list=[ + artist_list=[ _artist_from_json(artist_html=artist_html) ], album_list=[ diff --git a/music_kraken/pages/youtube.py b/music_kraken/pages/youtube.py index 5f65631..8f21c73 100644 --- a/music_kraken/pages/youtube.py +++ b/music_kraken/pages/youtube.py @@ -143,7 +143,7 @@ class YouTube(SuperYouTube): self.SOURCE_TYPE, get_invidious_url(path="/watch", query=f"v={data['videoId']}") )], notes=FormattedText(html=data["descriptionHtml"] + f"\n

{license_str}" ), - main_artist_list=artist_list + artist_list=artist_list ), int(data["published"]) def fetch_song(self, source: Source, stop_at_level: int = 1) -> Song: @@ -284,7 +284,7 @@ class YouTube(SuperYouTube): self.LOGGER.warning(f"didn't found any playlists with piped, falling back to invidious. (it is unusual)") album_list, artist_name = self.fetch_invidious_album_list(parsed.id) - return Artist(name=artist_name, main_album_list=album_list, source_list=[source]) + return Artist(name=artist_name, album_list=album_list, source_list=[source]) def download_song_to_target(self, source: Source, target: Target, desc: str = None) -> DownloadResult: """ diff --git a/music_kraken/pages/youtube_music/_list_render.py b/music_kraken/pages/youtube_music/_list_render.py index 2158385..7dcc8cf 100644 --- a/music_kraken/pages/youtube_music/_list_render.py +++ b/music_kraken/pages/youtube_music/_list_render.py @@ -58,6 +58,19 @@ def music_responsive_list_item_renderer(renderer: dict) -> List[DatabaseObject]: song.album_collection.extend(album_list) return [song] + if len(album_list) == 1: + album = album_list[0] + album.artist_collection.extend(artist_list) + album.song_collection.extend(song_list) + return [album] + + """ + if len(artist_list) == 1: + artist = artist_list[0] + artist.main_album_collection.extend(album_list) + return [artist] + """ + return results diff --git a/music_kraken/pages/youtube_music/youtube_music.py b/music_kraken/pages/youtube_music/youtube_music.py index 5d9e55c..9dfc44f 100644 --- a/music_kraken/pages/youtube_music/youtube_music.py +++ b/music_kraken/pages/youtube_music/youtube_music.py @@ -639,7 +639,7 @@ class YoutubeMusic(SuperYouTube): album_list=album_list, length=int(ydl_res.get("duration", 0)) * 1000, artwork=Artwork(*ydl_res.get("thumbnails", [])), - main_artist_list=artist_list, + artist_list=artist_list, source_list=[Source( self.SOURCE_TYPE, f"https://music.youtube.com/watch?v={ydl_res.get('id')}" diff --git a/tests/test_collection.py b/tests/test_collection.py index 98e8695..37b795c 100644 --- a/tests/test_collection.py +++ b/tests/test_collection.py @@ -8,7 +8,7 @@ class TestCollection(unittest.TestCase): return Artist( name="artist", country=Country.by_alpha_2("DE"), - main_album_list=[ + album_list=[ Album( title="album", song_list=[ @@ -73,7 +73,7 @@ class TestCollection(unittest.TestCase): def test_artist_artist_relation(self): artist = Artist( name="artist", - main_album_list=[ + album_list=[ Album( title="album", song_list=[ @@ -92,7 +92,7 @@ class TestCollection(unittest.TestCase): album_1 = Album( title="album", song_list=[ - Song(title="song", main_artist_list=[Artist(name="artist")]), + Song(title="song", artist_list=[Artist(name="artist")]), ], artist_list=[ Artist(name="artist"), @@ -102,7 +102,7 @@ class TestCollection(unittest.TestCase): album_2 = Album( title="album", song_list=[ - Song(title="song", main_artist_list=[Artist(name="artist")]), + Song(title="song", artist_list=[Artist(name="artist")]), ], artist_list=[ Artist(name="artist"),