diff --git a/development/actual_donwload.py b/development/actual_donwload.py index ad8f1d0..be10369 100644 --- a/development/actual_donwload.py +++ b/development/actual_donwload.py @@ -1,15 +1,13 @@ +import logging + import music_kraken -import logging print("Setting logging-level to DEBUG") logging.getLogger().setLevel(logging.DEBUG) if __name__ == "__main__": commands = [ - "s: #a Crystal F", - "10", - "1", - "3", + "s: #a Ghost Bath", ] diff --git a/music_kraken/objects/artwork.py b/music_kraken/objects/artwork.py index 1423c3c..40c6115 100644 --- a/music_kraken/objects/artwork.py +++ b/music_kraken/objects/artwork.py @@ -20,7 +20,7 @@ class ArtworkVariant: url: str width: Optional[int] = None height: Optional[int] = None - image_format: Optional[str] = "" + image_format: Optional[str] = None def __hash__(self) -> int: return custom_hash(self.url) @@ -31,6 +31,13 @@ class ArtworkVariant: def __contains__(self, other: str) -> bool: return custom_hash(other) == hash(self.url) + def __merge__(self, other: ArtworkVariant) -> None: + for key, value in other.__dict__.items(): + if value is None: + continue + + if getattr(self, key) is None: + setattr(self, key, value) @dataclass class Artwork: @@ -55,10 +62,9 @@ class Artwork: variant = self.search_variant(kwargs.get("url")) if variant is None: - variant, kwargs = create_dataclass_instance(ArtworkVariant, **kwargs) + variant, kwargs = create_dataclass_instance(ArtworkVariant, kwargs) self.variants.append(variant) - variant.url = url variant.__dict__.update(kwargs) @property @@ -91,8 +97,6 @@ class ArtworkCollection: self._data = [] self.extend(data) - - def search_artwork(self, url: str) -> Optional[ArtworkVariant]: for artwork in self._data: if url in artwork: @@ -106,18 +110,19 @@ class ArtworkCollection: def _create_new_artwork(self, **kwargs) -> Tuple[Artwork, dict]: kwargs["artwork_type"] = kwargs.get("artwork_type", self.artwork_type) - return create_dataclass_instance(ArtworkVariant, dict(**kwargs)) + return create_dataclass_instance(Artwork, dict(**kwargs)) - def add_data(self, url: str, **kwargs) -> None: + def add_data(self, url: str, **kwargs) -> Artwork: kwargs["url"] = url artwork = self.search_artwork(url) if artwork is None: - artwork, kwargs = self._create_new_artwork(url=url) + artwork, kwargs = self._create_new_artwork(**kwargs) self._data.append(artwork) - artwork.add_data(url, **kwargs) + artwork.add_data(**kwargs) + return artwork def append(self, value: Union[Artwork, ArtworkVariant, dict], **kwargs): """ @@ -144,6 +149,8 @@ class ArtworkCollection: """ This will make the artworks ready for download """ + from ..connection import Connection + for artwork in self._data: for variants in artwork.variants: pass diff --git a/music_kraken/utils/__init__.py b/music_kraken/utils/__init__.py index a0be99c..95013e5 100644 --- a/music_kraken/utils/__init__.py +++ b/music_kraken/utils/__init__.py @@ -156,6 +156,7 @@ def create_dataclass_instance(t, data: dict): Tuple[Type, dict]: The created instance and a dict, containing the data, which was not used in the creation """ - data = {k: v for k, v in data.items() if hasattr(t, k)} - removed_data = {k: v for k, v in data.items() if not hasattr(t, k)} - return t(**data), removed_data + needed_data = {k: v for k, v in data.items() if k in t.__dataclass_fields__} + removed_data = {k: v for k, v in data.items() if k not in t.__dataclass_fields__} + + return t(**needed_data), removed_data diff --git a/music_kraken/utils/string_processing.py b/music_kraken/utils/string_processing.py index b53d245..d001c1e 100644 --- a/music_kraken/utils/string_processing.py +++ b/music_kraken/utils/string_processing.py @@ -1,3 +1,4 @@ +import re import string from functools import lru_cache from pathlib import Path @@ -237,5 +238,6 @@ def is_url(value: Any) -> bool: if not isinstance(value, str): return True - - return re.match(URL_PATTERN, query) is not None + + # value has to be a string + return re.match(URL_PATTERN, value) is not None