feat: implemented dynamic stuff OMG AAA

This commit is contained in:
Hazel 2023-12-20 11:02:38 +01:00
parent 794732acee
commit 15841ee079
5 changed files with 49 additions and 27 deletions

View File

@ -52,7 +52,8 @@ only_smile = Artist(
main_album_list=[
Album(
title="Few words...",
source_list=[Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/few-words")],
source_list=[
Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/few-words")],
song_list=[
Song(title="Everything will be fine"),
Song(title="Only Smile"),
@ -68,7 +69,8 @@ only_smile = Artist(
),
Album(
title="Your best friend",
source_list=[Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/your-best-friend")]
source_list=[
Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/your-best-friend")]
)
]
),
@ -78,7 +80,8 @@ only_smile = Artist(
main_album_list=[
Album(
title="Few words...",
source_list=[Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/few-words")],
source_list=[
Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/few-words")],
song_list=[
Song(title="Everything will be fine"),
Song(title="Only Smile"),
@ -94,7 +97,8 @@ only_smile = Artist(
),
Album(
title="Your best friend",
source_list=[Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/your-best-friend")]
source_list=[
Source(SourcePages.BANDCAMP, "https://onlysmile.bandcamp.com/album/your-best-friend")]
)
]
)
@ -107,9 +111,9 @@ only_smile = Artist(
]
)
objects_by_id = {}
def add_to_objects_dump(db_obj: DatabaseObject):
objects_by_id[db_obj.id] = db_obj
@ -122,15 +126,10 @@ def add_to_objects_dump(db_obj: DatabaseObject):
add_to_objects_dump(only_smile)
for _id, _object in objects_by_id.items():
try:
print(_id, _object.title, sep=": ")
except AttributeError:
try:
print(_id, _object.name, sep=": ")
except AttributeError:
print(_id, _object, sep=": ")
print(_id, _object, sep=": ")
print(only_smile)
"""
c = Collection([Song(title="hi"), Song(title="hi2"), Song(title="hi3")])
c1 = Collection([Song(title="he"), Song(title="hi5")])
@ -180,4 +179,4 @@ print("b: ", b)
print(c.data)
print(c._data)
"""
"""

View File

@ -8,6 +8,8 @@ T = TypeVar('T', bound=OuterProxy)
class Collection(Generic[T]):
__is_collection__ = True
_data: List[T]
_indexed_values: Dict[str, set]
@ -54,7 +56,6 @@ class Collection(Generic[T]):
self._indexed_values[name].add(value)
self._indexed_to_objects[value].append(__object)
print(from_map)
if not from_map:
for attribute, new_object in self.contain_given_in_attribute.items():
__object.__getattribute__(attribute).contain_collection_inside(new_object)
@ -181,14 +182,11 @@ class Collection(Generic[T]):
self._data.append(__object)
def append(self, __object: Optional[T], already_is_parent: bool = False, from_map: bool = False):
if __object is None:
return
if __object.id in self._contains_ids:
if __object is None or __object.id in self._contains_ids:
return
exists_in_collection = self._contained_in_sub(__object)
if len(exists_in_collection) and self is exists_in_collection[0]:
if len(exists_in_collection) > 0 and self is exists_in_collection[0]:
# assuming that the object already is contained in the correct collections
if not already_is_parent:
self.merge_into_self(__object, from_map=from_map)
@ -259,5 +257,5 @@ class Collection(Generic[T]):
return self.__len__() == 0
def __iter__(self) -> Iterator[T]:
for element in self._data:
for element in self.data:
yield element

View File

@ -1,7 +1,8 @@
from __future__ import annotations
import random
from collections import defaultdict
from functools import lru_cache
from typing import Optional, Dict, Tuple, List, Type, Generic, Any, TypeVar
from .metadata import Metadata
@ -87,12 +88,11 @@ class OuterProxy:
if isinstance(data_list, list) and name.endswith("_list"):
collection_name = name.replace("_list", "_collection")
if collection_name not in self.__dict__:
continue
collection = self.__getattribute__(collection_name)
collection = self._inner.__getattribute__(collection_name)
collection.extend(data_list)
self._inner.__setattr__(collection_name, collection)
def __init_collections__(self):
pass
@ -106,6 +106,9 @@ class OuterProxy:
:return:
"""
if __name.startswith("__"):
return super().__getattribute__(__name)
_inner: InnerData = super().__getattribute__("_inner")
try:
return _inner.__getattribute__(__name)
@ -174,3 +177,18 @@ class OuterProxy:
"""
return []
@property
@lru_cache()
def all_collections(self):
r = []
for key in self._default_factories:
val = self._inner.__getattribute__(key)
if hasattr(val, "__is_collection__"):
r.append(val)
return r
def __repr__(self):
return f"{type(self).__name__}({', '.join(key + ': ' + str(val) for key, val in self.indexing_values)})"

View File

@ -148,6 +148,7 @@ class Song(Base):
return main_artists
return f"{main_artists} feat. {feature_artists}"
"""
def __str__(self) -> str:
artist_credit_str = ""
artist_credits = self.get_artist_credits()
@ -155,6 +156,7 @@ class Song(Base):
artist_credit_str = f" by {artist_credits}"
return f"\"{self.title}\"{artist_credit_str}"
"""
def __repr__(self) -> str:
return f"Song(\"{self.title}\")"
@ -519,6 +521,7 @@ class Artist(Base):
return metadata
"""
def __str__(self, include_notes: bool = False):
string = self.name or ""
if include_notes:
@ -526,6 +529,7 @@ class Artist(Base):
if plaintext_notes is not None:
string += "\n" + plaintext_notes
return string
"""
def __repr__(self):
return f"Artist(\"{self.name}\")"

View File

@ -33,11 +33,14 @@ class Source(OuterProxy):
"audio_url": str,
}
def __init__(self, page_enum: SourcePages, referer_page: SourcePages = None, **kwargs) -> None:
def __init__(self, page_enum: SourcePages, url: str, referer_page: SourcePages = None, audio_url: str = None, **kwargs) -> None:
if referer_page is None:
referer_page = page_enum
super().__init__(page_enum=page_enum, referer_page=referer_page, **kwargs)
if audio_url is None:
audio_url = url
super().__init__(page_enum=page_enum, url=url, referer_page=referer_page, audio_url=audio_url, **kwargs)
@classmethod
def match_url(cls, url: str, referer_page: SourcePages) -> Optional["Source"]: