feat: implemented dynamic stuff OMG AAA
This commit is contained in:
		@@ -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)
 | 
			
		||||
"""
 | 
			
		||||
"""
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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)})"
 | 
			
		||||
 
 | 
			
		||||
@@ -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}\")"
 | 
			
		||||
 
 | 
			
		||||
@@ -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"]:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user