started metadata

This commit is contained in:
Lars Noack 2023-01-10 18:52:47 +01:00
parent 21fca274f8
commit 581a68cf46
4 changed files with 64 additions and 13 deletions

View File

@ -44,9 +44,6 @@ song_input = Song(
length=666, length=666,
tracksort=2, tracksort=2,
target=Target(file="~/Music/genre/artist/album/song.mp3", path="~/Music/genre/artist/album"), target=Target(file="~/Music/genre/artist/album/song.mp3", path="~/Music/genre/artist/album"),
metadata={
"album": "One Final Action"
},
lyrics=[ lyrics=[
Lyrics(text="these are some depressive lyrics", language="en"), Lyrics(text="these are some depressive lyrics", language="en"),
Lyrics(text="test", language="en") Lyrics(text="test", language="en")
@ -85,6 +82,7 @@ div()
song_output_list = cache.pull_songs(song_ref=song_ref) song_output_list = cache.pull_songs(song_ref=song_ref)
print(len(song_output_list), song_output_list, song_output_list[0].album, sep=" | ") print(len(song_output_list), song_output_list, song_output_list[0].album, sep=" | ")
print("tracksort", song_output_list[0].tracksort, sep=": ") print("tracksort", song_output_list[0].tracksort, sep=": ")
print("id3", str(song_output_list[0].metadata))
# getting song by album ref # getting song by album ref
div() div()

View File

@ -1,7 +1,8 @@
import os import os
from typing import List, Tuple from typing import List, Tuple, Dict
from mutagen.easyid3 import EasyID3 from mutagen.easyid3 import EasyID3
from .id3_mapping import Mapping as ID3_MAPPING
from ...utils.shared import ( from ...utils.shared import (
MUSIC_DIR, MUSIC_DIR,
DATABASE_LOGGER as logger DATABASE_LOGGER as logger
@ -38,24 +39,32 @@ class SongAttribute:
class Metadata: class Metadata:
""" """
Shall only be read or edited via the Song object. Shall only be read or edited via the Song object.
For this reason there is no reference to the song needed. call it like a dict to read/write values
""" """
def __init__(self, data: dict = {}) -> None: def __init__(self, data: dict = {}) -> None:
self.data = data # this is pretty self explanatory
# the key is a 4 letter key from the id3 standarts like TITL
self.id3_attributes: Dict[str, any] = {}
def get_all_metadata(self): def get_all_metadata(self):
return list(self.data.items()) return list(self.id3_attributes.items())
def __setitem__(self, item, value): def __setitem__(self, item, value):
if item in EasyID3.valid_keys.keys(): self.id3_attributes[item] = value
self.data[item] = value
def __getitem__(self, item): def __getitem__(self, item):
if item not in self.data: if item not in self.data:
return None return None
return self.data[item] return self.data[item]
def __str__(self) -> str:
rows = []
for key, value in self.id3_attributes.items():
rows.append(f"{key} - {str(value)}")
return "\n".join(rows)
class Source(DatabaseObject, SongAttribute): class Source(DatabaseObject, SongAttribute):
""" """
@ -149,7 +158,6 @@ class Song(DatabaseObject):
sources: List[Source] = None, sources: List[Source] = None,
target: Target = None, target: Target = None,
lyrics: List[Lyrics] = None, lyrics: List[Lyrics] = None,
metadata: dict = {},
album=None, album=None,
main_artist_list: list = [], main_artist_list: list = [],
feature_artist_list: list = [] feature_artist_list: list = []
@ -163,16 +171,18 @@ class Song(DatabaseObject):
super().__init__(id_=id_) super().__init__(id_=id_)
# attributes # attributes
# self.id_: str | None = id_ # self.id_: str | None = id_
self._title = None
self.mb_id: str | None = mb_id self.mb_id: str | None = mb_id
self.title: str | None = title
self.album_name: str | None = album_name self.album_name: str | None = album_name
self.isrc: str | None = isrc self.isrc: str | None = isrc
self.length_: int | None = length self.length_: int | None = length
self.artist_names = artist_names self.artist_names = artist_names
self.tracksort: int | None = tracksort self.tracksort: int | None = tracksort
# self.metadata = Metadata(data=metadata) self.metadata = Metadata()
self.metadata = None
self.title = title
if sources is None: if sources is None:
sources = [] sources = []
@ -218,6 +228,29 @@ class Song(DatabaseObject):
def __repr__(self) -> str: def __repr__(self) -> str:
return self.__str__() return self.__str__()
def set_simple_metadata(self, name: str, value):
"""
this method is for setting values of attributes,
that directly map to an ID3 value.
A good example is the title or the isrc.
for more complex data I will use seperate functions
the naming convention for the name I follow is, to name
the attribute the same as the defined property, but with one underscore infront:
title -> _title
"""
attribute_map = {
"_title": ID3_MAPPING.TITLE
}
# if this crashes/raises an error the function is
# called wrongly. I DO NOT CACH ERRORS DUE TO PERFORMANCE AND DEBUGGING
self.__setattr__(name, value)
self.metadata[attribute_map[name].value] = value
def get_metadata(self): def get_metadata(self):
return self.metadata.get_all_metadata() return self.metadata.get_all_metadata()
@ -242,6 +275,7 @@ class Song(DatabaseObject):
return None return None
return self.album.id return self.album.id
title: str = property(fget=lambda self: self._title, fset=lambda self, value: self.set_simple_metadata("_title", value))
album_id: str = property(fget=get_album_id) album_id: str = property(fget=get_album_id)
length: int = property(fget=get_length, fset=set_length) length: int = property(fget=get_length, fset=set_length)

19
src/try_python.py Normal file
View File

@ -0,0 +1,19 @@
class AttributeThing:
def __init__(self) -> None:
self.an_attribute = 666
def __setattr__(self, __name: str, __value: any) -> None:
print(__name, __value)
self.an_attribute = __value
def __getattribute__(self, __name: str) -> any:
print(__name)
self.an_attribute += 333
return self.an_attribute
if __name__ == "__main__":
attribute_class = AttributeThing()
attribute_class.an_attribute = 333
#print(attribute_class.an_attribute)

BIN
test.db

Binary file not shown.