diff --git a/src/music_kraken/database/data_models.py b/src/music_kraken/database/data_models.py index 4b8e1be..dc99bdf 100644 --- a/src/music_kraken/database/data_models.py +++ b/src/music_kraken/database/data_models.py @@ -72,9 +72,9 @@ class Song(BaseModel): class Source(BaseModel): """A class representing a source of a song in the music database.""" + ContentTypes = Union[Song, Album, Artist] - type: str = CharField() - src: str = CharField() + page: str = CharField() url: str = CharField() content_type: str = CharField() @@ -82,7 +82,7 @@ class Source(BaseModel): content: ForeignKeyField = ForeignKeyField('self', backref='content_items', null=True) @property - def content_object(self) -> Union[Song, Album, Artist, None]: + def content_object(self) -> Union[Song, Album, Artist]: """Get the content associated with the source as an object.""" if self.content_type == 'Song': return Song.get(Song.id == self.content_id) diff --git a/src/music_kraken/database/write.py b/src/music_kraken/database/write.py index 279b895..26ca397 100644 --- a/src/music_kraken/database/write.py +++ b/src/music_kraken/database/write.py @@ -1,4 +1,5 @@ -from typing import Union +from typing import Union, Set +import traceback from peewee import ( SqliteDatabase, MySQLDatabase, @@ -6,14 +7,135 @@ from peewee import ( ) from . import objects +from . import data_models # just a Type for type hintung. You can't do anything with it. Database = Union[SqliteDatabase, PostgresqlDatabase, MySQLDatabase] - class Session: """ - do the thingie with the with keyword - overload __end__ and maybe __start__ i dunfckinnow + Context manager for a database session + + Usage: + with Session(database) as session: + # Perform database operations using session object + + Args: + database: An instance of a database connection from Peewee + + Attributes: + database: An instance of a database connection from Peewee """ - pass + def __init__(self, database: Database) -> None: + """ + Initialize a database session + + Args: + database: An instance of a database connection from Peewee + """ + self.database = database + + self.added_song_ids: Set[str] = set() + self.added_album_ids: Set[str] = set() + self.added_artist_ids: Set[str] = set() + + def __enter__(self, database: Database): + """ + Enter the context of the database session + + Args: + database: An instance of a database connection from Peewee + + Returns: + self: The instance of the session object + """ + print('Entering the context') + self.__init__(database=database) + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + """ + Exit the context of the database session + + Args: + exc_type: The type of the raised exception + exc_val: The value of the raised exception + exc_tb: The traceback of the raised exception + + Returns: + bool: True if no exception was raised, False otherwise + """ + if exc_val is not None: + traceback.print_tb(exc_tb) + print(f"Exception of type {exc_type} occurred with message: {exc_val}") + + self.commit() + return exc_val is None + + def add_source(self, source: objects.Source, connected_to: data_models.Source.ContentTypes) -> data_models.Source: + db_source = data_models.Source( + page=source.page_str, + url=source.url, + content_object=connected_to + ).use(self.database) + + return db_source + + def add_song(self, song: objects.Song) -> data_models.Song: + """ + Add a song object to the session + + Args: + song: An instance of the Song object + """ + if song.dynamic: + return + if song.id in self.added_song_ids: + return + self.added_song_ids.add(song.id) + + db_song: data_models.Song = data_models.Song( + id=song.id, + name=song.title, + isrc=song.isrc, + length=song.length, + tracksort=song.tracksort, + genre=song.genre + ).use(self.database) + + for source in song.source_list: + self.add_source(source=source, connected_to=db_song) + + return db_song + + def add_album(self, album: objects.Album): + """ + Add an album object to the session + + Args: + album: An instance of the Album object + """ + if album.dynamic: + return + if album.id in self.added_album_ids: + return + self.added_album_ids.add(album.id) + + def add_artist(self, artist: objects.Artist): + """ + Add an artist object to the session + + Args: + artist: An instance of the Artist object + """ + if artist.dynamic: + return + if artist.id in self.added_artist_ids: + return + self.added_artist_ids.add(artist.id) + + def commit(self): + """ + Commit changes to the database + """ + pass \ No newline at end of file