added source to artist

This commit is contained in:
Hellow 2023-01-20 23:05:15 +01:00
parent d1af921157
commit cb5b1b1fcc
8 changed files with 92 additions and 48 deletions

View File

@ -7,7 +7,8 @@ from music_kraken import (
Album, Album,
Artist, Artist,
ID3Timestamp, ID3Timestamp,
source_types SourcePages,
SourceTypes
) )
from music_kraken.tagging import ( from music_kraken.tagging import (
@ -28,8 +29,12 @@ def div(msg: str = ""):
cache = music_kraken.database.new_database.Database("test.db") cache = music_kraken.database.new_database.Database("test.db")
cache.reset() cache.reset()
main_artist = Artist( main_artist = Artist(
name="I'm in a coffin" name="I'm in a coffin",
sources=[
Source(SourcePages.ENCYCLOPAEDIA_METALLUM, "https://www.metal-archives.com/bands/I%27m_in_a_Coffin/127727")
]
) )
artist_ref = main_artist.reference artist_ref = main_artist.reference
@ -65,8 +70,8 @@ song_input = Song(
Lyrics(text="test", language="en") Lyrics(text="test", language="en")
], ],
sources=[ sources=[
Source(source_types.SONG, src="youtube", url="https://youtu.be/dfnsdajlhkjhsd"), Source(SourcePages.YOUTUBE, "https://youtu.be/dfnsdajlhkjhsd"),
Source(source_types.SONG, src="musify", url="https://ln.topdf.de/Music-Kraken/") Source(SourcePages.MUSIFY, "https://ln.topdf.de/Music-Kraken/")
], ],
album=album_input, album=album_input,
main_artist_list=[main_artist], main_artist_list=[main_artist],

View File

@ -41,7 +41,8 @@ musicbrainzngs.set_useragent("metadata receiver", "0.1", "https://github.com/HeI
Song = database.Song Song = database.Song
Artist = database.Artist Artist = database.Artist
Source = database.Source Source = database.Source
source_types = database.source_types SourceTypes = database.SourceTypes
SourcePages = database.SourcePages
Target = database.Target Target = database.Target
Lyrics = database.Lyrics Lyrics = database.Lyrics
Album = database.Album Album = database.Album

View File

@ -4,7 +4,8 @@ from . import (
) )
ID3Timestamp = objects.ID3Timestamp ID3Timestamp = objects.ID3Timestamp
source_types = objects.source_types SourceTypes = objects.SourceTypes
SourcePages = objects.SourcePages
Song = objects.Song Song = objects.Song
Source = objects.Source Source = objects.Source
Target = objects.Target Target = objects.Target

View File

@ -16,10 +16,10 @@ from .objects import (
Artist, Artist,
Album, Album,
ID3Timestamp, ID3Timestamp,
source_types SourceTypes,
SourcePages
) )
logger = logging.getLogger("database") logger = logging.getLogger("database")
# Due to this not being deployed on a Server **HOPEFULLY** # Due to this not being deployed on a Server **HOPEFULLY**
@ -186,7 +186,7 @@ class Database:
# add sources # add sources
for source in song.sources: for source in song.sources:
source.add_song(song) source.add_song(song)
source.type_enum = source_types.SONG source.type_enum = SourceTypes.SONG
self.push_source(source=source) self.push_source(source=source)
# add lyrics # add lyrics
@ -223,8 +223,6 @@ class Database:
self.connection.commit() self.connection.commit()
def push_source(self, source: Source): def push_source(self, source: Source):
if source.song_ref_id is None: if source.song_ref_id is None:
logger.warning("the Source don't refer to a song") logger.warning("the Source don't refer to a song")
@ -234,7 +232,7 @@ class Database:
source.id, source.id,
source.type_str, source.type_str,
source.song_ref_id, source.song_ref_id,
source.site_str, source.page_str,
source.url source.url
) )
@ -316,6 +314,10 @@ class Database:
for album in artist.main_albums: for album in artist.main_albums:
self.push_artist_album(artist_ref=artist.reference, album_ref=album.reference) self.push_artist_album(artist_ref=artist.reference, album_ref=album.reference)
for source in artist.sources:
source.add_song(artist)
self.push_source(source)
def pull_lyrics(self, song_ref: Reference = None, lyrics_ref: Reference = None) -> List[Lyrics]: def pull_lyrics(self, song_ref: Reference = None, lyrics_ref: Reference = None) -> List[Lyrics]:
""" """
Gets a list of sources. if lyrics_ref is passed in the List will most likely only Gets a list of sources. if lyrics_ref is passed in the List will most likely only
@ -342,7 +344,7 @@ class Database:
language=lyrics_row['language'] language=lyrics_row['language']
) for lyrics_row in lyrics_rows] ) for lyrics_row in lyrics_rows]
def pull_sources(self, type_enum, song_ref: Reference = None, source_ref: Reference = None) -> List[Source]: def pull_sources(self, artist_ref: Reference = None, song_ref: Reference = None, source_ref: Reference = None) -> List[Source]:
""" """
Gets a list of sources. if source_ref is passed in the List will most likely only Gets a list of sources. if source_ref is passed in the List will most likely only
contain one Element if everything goes accordingly. contain one Element if everything goes accordingly.
@ -357,19 +359,23 @@ class Database:
if song_ref is not None: if song_ref is not None:
where = f"song_id=\"{song_ref.id}\"" where = f"song_id=\"{song_ref.id}\""
elif source_ref is not None: elif source_ref is not None:
where = f"id=\"{source_ref.id}\"" where = f"id=\"{source_ref.id}\" AND type=\"{SourceTypes.SONG.value}\""
elif artist_ref is not None:
where = f"song_id=\"{artist_ref.id}\" AND type=\"{SourceTypes.ARTIST.value}\""
query = SOURCE_QUERY.format(where=where) query = SOURCE_QUERY.format(where=where)
self.cursor.execute(query) self.cursor.execute(query)
source_rows = self.cursor.fetchall() source_rows = self.cursor.fetchall()
return [Source( return [
source_types(source_row['type']), Source(
id_=source_row['id'], page_enum=SourcePages(source_row['src']),
src=source_row['src'], type_enum=SourceTypes(source_row['type']),
url=source_row['url'] url=source_row['url'],
) for source_row in source_rows] id_=source_row['id']
) for source_row in source_rows
]
def pull_artist_song(self, song_ref: Reference = None, artist_ref: Reference = None) -> List[tuple]: def pull_artist_song(self, song_ref: Reference = None, artist_ref: Reference = None) -> List[tuple]:
table = "SongArtist" table = "SongArtist"
@ -422,7 +428,8 @@ class Database:
artist_obj = Artist( artist_obj = Artist(
id_=artist_id, id_=artist_id,
name=artist_row['artist_name'] name=artist_row['artist_name'],
sources=self.pull_sources(artist_ref=Reference(id_=artist_id))
) )
if flat: if flat:
return artist_obj return artist_obj
@ -491,7 +498,7 @@ class Database:
file=song_result['file'], file=song_result['file'],
path=song_result['path'] path=song_result['path']
), ),
sources=self.pull_sources(type_enum=source_types.SONG, song_ref=Reference(id_=song_id)), sources=self.pull_sources(song_ref=Reference(id_=song_id)),
lyrics=self.pull_lyrics(song_ref=Reference(id_=song_id)), lyrics=self.pull_lyrics(song_ref=Reference(id_=song_id)),
) )
@ -585,7 +592,7 @@ class Database:
return album_obj return album_obj
def pull_albums(self, album_ref: Reference = None, song_ref: Reference = None, exclude_relations: set = None) -> \ def pull_albums(self, album_ref: Reference = None, song_ref: Reference = None, exclude_relations: set = None) -> \
List[Album]: List[Album]:
""" """
This function is used to get matching albums/releses This function is used to get matching albums/releses
from one song id (a reference object) from one song id (a reference object)

View File

@ -7,7 +7,8 @@ from . import (
ID3_MAPPING = metadata.Mapping ID3_MAPPING = metadata.Mapping
ID3Timestamp = metadata.ID3Timestamp ID3Timestamp = metadata.ID3Timestamp
source_types = source.source_types SourceTypes = source.SourceTypes
SourcePages = source.SourcePages
Song = song.Song Song = song.Song
Artist = song.Artist Artist = song.Artist

View File

@ -18,7 +18,11 @@ from .parents import (
SongAttribute, SongAttribute,
ID3Metadata ID3Metadata
) )
from .source import Source from .source import (
Source,
SourceTypes,
SourcePages
)
""" """
All Objects dependent All Objects dependent
@ -118,9 +122,8 @@ class Song(DatabaseObject, ID3Metadata):
self.tracksort: int | None = tracksort self.tracksort: int | None = tracksort
self.genre: str = genre self.genre: str = genre
self.sources: List[Source] = [] self._sources: List[Source] = []
if sources is not None: self.sources = sources
self.sources = sources
self.album = album self.album = album
@ -192,6 +195,15 @@ class Song(DatabaseObject, ID3Metadata):
return metadata return metadata
def set_sources(self, source_list: List[Source]):
if source_list is None:
return
self._sources = source_list
for source in self._sources:
source.type_enum = SourceTypes.SONG
sources: List[Source] = property(fget=lambda self: self._sources, fset=set_sources)
metadata = property(fget=get_metadata) metadata = property(fget=get_metadata)
@ -335,9 +347,9 @@ class Artist(DatabaseObject, ID3Metadata):
self.main_albums = main_albums self.main_albums = main_albums
self.sources = [] self._sources = []
if sources is not None: self.sources = sources
self.sources = sources
def __str__(self): def __str__(self):
return self.name or "" return self.name or ""
@ -381,13 +393,28 @@ class Artist(DatabaseObject, ID3Metadata):
return flat_copy_discography return flat_copy_discography
def get_id3_dict(self) -> dict: def get_id3_dict(self) -> dict:
"""
TODO refactor
:return:
"""
id3_dict = { id3_dict = {
ID3_MAPPING.ARTIST: [self.name] ID3_MAPPING.ARTIST: [self.name]
} }
if len(self.sources) <= 0:
return id3_dict
id3_dict.update(self.sources[0].get_id3_dict()) id3_dict.update(self.sources[0].get_id3_dict())
return id3_dict return id3_dict
def set_sources(self, source_list: List[Source]):
if source_list is None:
return
self._sources = source_list
for source in self._sources:
source.type_enum = SourceTypes.ARTIST
sources: List[Source] = property(fget=lambda self: self._sources, fset=set_sources)
discography: List[Album] = property(fget=get_discography) discography: List[Album] = property(fget=get_discography)
features: Album = property(fget=get_features) features: Album = property(fget=get_features)
songs: Album = property(fget=get_songs) songs: Album = property(fget=get_songs)

View File

@ -7,15 +7,17 @@ from .parents import (
ID3Metadata ID3Metadata
) )
class source_types(Enum):
class SourceTypes(Enum):
SONG = "song" SONG = "song"
ALBUM = "album" ALBUM = "album"
ARTIST = "artist" ARTIST = "artist"
LYRICS = "lyrics" LYRICS = "lyrics"
class sources(Enum):
class SourcePages(Enum):
YOUTUBE = "youtube" YOUTUBE = "youtube"
MUSIFY = "musify" MUSIFY = "musify"
GENIUS = "genius" GENIUS = "genius"
MUSICBRAINZ = "musicbrainz" MUSICBRAINZ = "musicbrainz"
ENCYCLOPAEDIA_METALLUM = "encyclopaedia metallum" ENCYCLOPAEDIA_METALLUM = "encyclopaedia metallum"
@ -23,16 +25,15 @@ class sources(Enum):
@classmethod @classmethod
def get_homepage(cls, attribute) -> str: def get_homepage(cls, attribute) -> str:
homepage_map = { homepage_map = {
cls.YOUTUBE: "https://www.youtube.com/", cls.YOUTUBE: "https://www.youtube.com/",
cls.MUSIFY: "https://musify.club/", cls.MUSIFY: "https://musify.club/",
cls.MUSICBRAINZ:"https://musicbrainz.org/", cls.MUSICBRAINZ: "https://musicbrainz.org/",
cls.ENCYCLOPAEDIA_METALLUM: "https://www.metal-archives.com/", cls.ENCYCLOPAEDIA_METALLUM: "https://www.metal-archives.com/",
cls.GENIUS: "https://genius.com/" cls.GENIUS: "https://genius.com/"
} }
return homepage_map[attribute] return homepage_map[attribute]
class Source(DatabaseObject, SongAttribute, ID3Metadata): class Source(DatabaseObject, SongAttribute, ID3Metadata):
""" """
create somehow like that create somehow like that
@ -42,22 +43,23 @@ class Source(DatabaseObject, SongAttribute, ID3Metadata):
``` ```
""" """
def __init__(self, type_enum, id_: str = None, src: str = None, url: str = None) -> None: def __init__(self, page_enum, url: str, id_: str = None, type_enum=None) -> None:
DatabaseObject.__init__(self, id_=id_) DatabaseObject.__init__(self, id_=id_)
SongAttribute.__init__(self) SongAttribute.__init__(self)
self.type_enum = type_enum self.type_enum = type_enum
self.src = sources(src) self.page_enum = page_enum
self.url = url self.url = url
def get_id3_dict(self) -> dict: def get_id3_dict(self) -> dict:
if self.type_enum == source_types.SONG: if self.type_enum == SourceTypes.SONG:
return { return {
Mapping.FILE_WEBPAGE_URL: [self.url], Mapping.FILE_WEBPAGE_URL: [self.url],
Mapping.SOURCE_WEBPAGE_URL: [self.homepage] Mapping.SOURCE_WEBPAGE_URL: [self.homepage]
} }
if self.type_enum == source_types.ARTIST: if self.type_enum == SourceTypes.ARTIST:
return { return {
Mapping.ARTIST_WEBPAGE_URL: [self.url] Mapping.ARTIST_WEBPAGE_URL: [self.url]
} }
@ -65,8 +67,8 @@ class Source(DatabaseObject, SongAttribute, ID3Metadata):
return {} return {}
def __str__(self): def __str__(self):
return f"{self.src}: {self.url}" return f"{self.page_enum}: {self.url}"
site_str = property(fget=lambda self: self.src.value) page_str = property(fget=lambda self: self.page_enum.value)
type_str = property(fget=lambda self: self.type_enum.value) type_str = property(fget=lambda self: self.type_enum.value)
homepage = property(fget=lambda self: sources.get_homepage(self.src)) homepage = property(fget=lambda self: SourcePages.get_homepage(self.page_enum))

Binary file not shown.