polished the song and db oject
This commit is contained in:
		
							
								
								
									
										24
									
								
								src/goof.py
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								src/goof.py
									
									
									
									
									
								
							@@ -9,6 +9,9 @@ from music_kraken import (
 | 
			
		||||
 | 
			
		||||
import music_kraken.database.new_database as db
 | 
			
		||||
 | 
			
		||||
def div():
 | 
			
		||||
    print("-"*100)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cache = music_kraken.database.new_database.Database("test.db")
 | 
			
		||||
cache.reset()
 | 
			
		||||
@@ -21,6 +24,7 @@ song_input = Song(
 | 
			
		||||
    title="Vein Deep in the Solution",
 | 
			
		||||
    album_name=album_input.title,
 | 
			
		||||
    length=666,
 | 
			
		||||
    tracksort=2,
 | 
			
		||||
    target=Target(file="~/Music/genre/artist/album/song.mp3", path="~/Music/genre/artist/album"),
 | 
			
		||||
    metadata={
 | 
			
		||||
        "album": "One Final Action"
 | 
			
		||||
@@ -49,18 +53,28 @@ lyrics = Lyrics(text="these are some Lyrics that don't belong to any Song", lang
 | 
			
		||||
cache.push([album_input, song_input, lyrics, additional_song])
 | 
			
		||||
 | 
			
		||||
# getting song by song ref
 | 
			
		||||
div()
 | 
			
		||||
song_output_list = cache.pull_songs(song_ref=song_ref)
 | 
			
		||||
print(len(song_output_list), song_output_list, song_output_list[0].album)
 | 
			
		||||
# song_output = song_output_list[0]
 | 
			
		||||
# print(song_output)
 | 
			
		||||
# print("album id", song_output.album_ref)
 | 
			
		||||
print(len(song_output_list), song_output_list, song_output_list[0].album, sep=" | ")
 | 
			
		||||
print("tracksort", song_output_list[0].tracksort, sep=": ")
 | 
			
		||||
 | 
			
		||||
# getting song  by album ref
 | 
			
		||||
div()
 | 
			
		||||
song_output_list = cache.pull_songs(album_ref=album_input.reference)
 | 
			
		||||
print(len(song_output_list), song_output_list)
 | 
			
		||||
for song in song_output_list:
 | 
			
		||||
    print(song, song.album)
 | 
			
		||||
 | 
			
		||||
# getting album
 | 
			
		||||
div()
 | 
			
		||||
album_output_list = cache.pull_albums(album_ref=album_input.reference)
 | 
			
		||||
album_output = album_output_list[0]
 | 
			
		||||
print(album_output)
 | 
			
		||||
print(album_output.tracklist)
 | 
			
		||||
for track in album_output.tracklist:
 | 
			
		||||
    print(track.tracksort, track)
 | 
			
		||||
 | 
			
		||||
# getting album by song
 | 
			
		||||
div()
 | 
			
		||||
album_output_list = cache.pull_albums(song_ref=song_ref)
 | 
			
		||||
print(album_output_list)
 | 
			
		||||
print("len of album ->", len(album_output_list[0]), album_output_list[0], sep=" | ")
 | 
			
		||||
 
 | 
			
		||||
@@ -22,7 +22,7 @@ logger = logging.getLogger("database")
 | 
			
		||||
# use complicated query builder
 | 
			
		||||
SONG_QUERY = """
 | 
			
		||||
SELECT 
 | 
			
		||||
Song.id AS song_id, Song.name AS title, Song.isrc AS isrc, Song.length AS length, Song.album_id,
 | 
			
		||||
Song.id AS song_id, Song.name AS title, Song.isrc AS isrc, Song.length AS length, Song.album_id, Song.tracksort,
 | 
			
		||||
Target.id AS target_id, Target.file AS file, Target.path AS path
 | 
			
		||||
FROM Song
 | 
			
		||||
LEFT JOIN Target ON Song.id=Target.song_id 
 | 
			
		||||
@@ -38,11 +38,17 @@ SELECT id, text, language, song_id
 | 
			
		||||
FROM Lyrics
 | 
			
		||||
WHERE {where};
 | 
			
		||||
"""
 | 
			
		||||
ALBUM_QUERY = """
 | 
			
		||||
ALBUM_QUERY_UNJOINED = """
 | 
			
		||||
SELECT Album.id AS album_id, title, copyright, album_status, language, year, date, country, barcode
 | 
			
		||||
FROM Album
 | 
			
		||||
WHERE {where};
 | 
			
		||||
"""
 | 
			
		||||
ALBUM_QUERY_JOINED = """
 | 
			
		||||
SELECT a.id AS album_id, a.title, a.copyright, a.album_status, a.language, a.year, a.date, a.country, a.barcode
 | 
			
		||||
FROM Song
 | 
			
		||||
INNER JOIN Album a ON Song.album_id=a.id
 | 
			
		||||
WHERE {where};
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Database:
 | 
			
		||||
@@ -147,9 +153,10 @@ class Database:
 | 
			
		||||
            song.title,
 | 
			
		||||
            song.isrc,
 | 
			
		||||
            song.length,
 | 
			
		||||
            song.get_album_id()
 | 
			
		||||
            song.get_album_id(),
 | 
			
		||||
            song.tracksort
 | 
			
		||||
        )
 | 
			
		||||
        query = f"INSERT OR REPLACE INTO {table} (id, name, isrc, length, album_id) VALUES (?, ?, ?, ?, ?);"
 | 
			
		||||
        query = f"INSERT OR REPLACE INTO {table} (id, name, isrc, length, album_id, tracksort) VALUES (?, ?, ?, ?, ?, ?);"
 | 
			
		||||
 | 
			
		||||
        self.cursor.execute(query, values)
 | 
			
		||||
        self.connection.commit()
 | 
			
		||||
@@ -268,7 +275,9 @@ class Database:
 | 
			
		||||
            url=source_row['url']
 | 
			
		||||
        ) for source_row in source_rows]
 | 
			
		||||
 | 
			
		||||
    def get_song_from_row(self, song_result, exclude_relations: set = set()) -> Song:
 | 
			
		||||
    def get_song_from_row(self, song_result, exclude_relations: set = None) -> Song:
 | 
			
		||||
        if exclude_relations is None:
 | 
			
		||||
            exclude_relations = set()
 | 
			
		||||
        new_exclude_relations: set = set(exclude_relations)
 | 
			
		||||
        new_exclude_relations.add(Song)
 | 
			
		||||
 | 
			
		||||
@@ -279,6 +288,7 @@ class Database:
 | 
			
		||||
            title=song_result['title'],
 | 
			
		||||
            isrc=song_result['isrc'],
 | 
			
		||||
            length=song_result['length'],
 | 
			
		||||
            tracksort=song_result['tracksort'],
 | 
			
		||||
            target=Target(
 | 
			
		||||
                id_=song_result['target_id'],
 | 
			
		||||
                file=song_result['file'],
 | 
			
		||||
@@ -290,21 +300,24 @@ class Database:
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        if Album not in exclude_relations and song_result['album_id'] is not None:
 | 
			
		||||
            album_obj = self.pull_albums(album_ref=Reference(song_result['album_id']), exclude_relations=new_exclude_relations)
 | 
			
		||||
            album_obj = self.pull_albums(album_ref=Reference(song_result['album_id']),
 | 
			
		||||
                                         exclude_relations=new_exclude_relations)
 | 
			
		||||
            if len(album_obj) > 0:
 | 
			
		||||
                song_obj.album = album_obj[0]
 | 
			
		||||
 | 
			
		||||
        return song_obj
 | 
			
		||||
 | 
			
		||||
    def pull_songs(self, song_ref: Reference = None, album_ref: Reference = None, exclude_relations: set = set()) -> List[Song]:
 | 
			
		||||
    def pull_songs(self, song_ref: Reference = None, album_ref: Reference = None, exclude_relations: set = set()) -> \
 | 
			
		||||
            List[Song]:
 | 
			
		||||
        """
 | 
			
		||||
        This function is used to get one song (including its children like Sources etc)
 | 
			
		||||
        from one song id (a reference object)
 | 
			
		||||
        :param exclude_relations:
 | 
			
		||||
        By default all relations are pulled by this funktion. If the class object of for
 | 
			
		||||
        example the Artists is in the set it won't get fetched.
 | 
			
		||||
        This is done to prevent an infinite recursion.
 | 
			
		||||
        :param song_ref:
 | 
			
		||||
        :param album_ref:
 | 
			
		||||
        :param exclude_independent_relations:
 | 
			
		||||
        This excludes all relations from being fetched like for example the Album of the Song.
 | 
			
		||||
        This is necessary when adding the Song as subclass as e.g. an Album (as tracklist or whatever).
 | 
			
		||||
        :return requested_song:
 | 
			
		||||
        """
 | 
			
		||||
 | 
			
		||||
@@ -324,9 +337,10 @@ class Database:
 | 
			
		||||
            exclude_relations=exclude_relations
 | 
			
		||||
        ) for song_result in song_rows]
 | 
			
		||||
 | 
			
		||||
    def get_album_from_row(self, album_result, exclude_relations: set = set()) -> Album:
 | 
			
		||||
    def get_album_from_row(self, album_result, exclude_relations=None) -> Album:
 | 
			
		||||
        if exclude_relations is None:
 | 
			
		||||
            exclude_relations = set()
 | 
			
		||||
        new_exclude_relations: set = exclude_relations.copy()
 | 
			
		||||
        
 | 
			
		||||
        new_exclude_relations.add(Album)
 | 
			
		||||
 | 
			
		||||
        album_id = album_result['album_id']
 | 
			
		||||
@@ -343,10 +357,7 @@ class Database:
 | 
			
		||||
            barcode=album_result['barcode']
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        print(exclude_relations)
 | 
			
		||||
 | 
			
		||||
        if Song not in exclude_relations:
 | 
			
		||||
            print("yay")
 | 
			
		||||
            # getting the tracklist
 | 
			
		||||
            tracklist: List[Song] = self.pull_songs(
 | 
			
		||||
                album_ref=Reference(id_=album_id),
 | 
			
		||||
@@ -356,18 +367,30 @@ class Database:
 | 
			
		||||
 | 
			
		||||
        return album_obj
 | 
			
		||||
 | 
			
		||||
    def pull_albums(self, album_ref: Reference = None, exclude_relations: set = set()) -> List[Album]:
 | 
			
		||||
    def pull_albums(self, album_ref: Reference = None, song_ref: Reference = None, exclude_relations: set = None) -> List[Album]:
 | 
			
		||||
        """
 | 
			
		||||
        This function is used to get matching albums/releses 
 | 
			
		||||
        from one song id (a reference object)
 | 
			
		||||
        :param exclude_relations:
 | 
			
		||||
        By default all relations are pulled by this funktion. If the class object of for
 | 
			
		||||
        example the Artists is in the set it won't get fetched.
 | 
			
		||||
        This is done to prevent an infinite recursion.
 | 
			
		||||
        :param album_ref:
 | 
			
		||||
        :return requested_album_list:
 | 
			
		||||
        """
 | 
			
		||||
        if exclude_relations is None:
 | 
			
		||||
            exclude_relations = set()
 | 
			
		||||
 | 
			
		||||
        query = ALBUM_QUERY_UNJOINED
 | 
			
		||||
        where = "1=1"
 | 
			
		||||
        if album_ref is not None:
 | 
			
		||||
            query = ALBUM_QUERY_UNJOINED
 | 
			
		||||
            where = f"Album.id=\"{album_ref.id}\""
 | 
			
		||||
        elif song_ref is not None:
 | 
			
		||||
            query = ALBUM_QUERY_JOINED
 | 
			
		||||
            where = f"Song.id=\"{song_ref.id}\""
 | 
			
		||||
 | 
			
		||||
        query = ALBUM_QUERY.format(where=where)
 | 
			
		||||
        query = query.format(where=where)
 | 
			
		||||
        self.cursor.execute(query)
 | 
			
		||||
 | 
			
		||||
        album_rows = self.cursor.fetchall()
 | 
			
		||||
 
 | 
			
		||||
@@ -145,6 +145,7 @@ class Song(DatabaseObject):
 | 
			
		||||
            artist_names: List[str] = [],
 | 
			
		||||
            isrc: str = None,
 | 
			
		||||
            length: int = None,
 | 
			
		||||
            tracksort: int = None,
 | 
			
		||||
            sources: List[Source] = None,
 | 
			
		||||
            target: Target = None,
 | 
			
		||||
            lyrics: List[Lyrics] = None,
 | 
			
		||||
@@ -167,6 +168,7 @@ class Song(DatabaseObject):
 | 
			
		||||
        self.isrc: str | None = isrc
 | 
			
		||||
        self.length_: int | None = length
 | 
			
		||||
        self.artist_names = artist_names
 | 
			
		||||
        self.tracksort: int | None = tracksort
 | 
			
		||||
 | 
			
		||||
        self.metadata = Metadata(data=metadata)
 | 
			
		||||
 | 
			
		||||
@@ -190,7 +192,7 @@ class Song(DatabaseObject):
 | 
			
		||||
        self.album_ref = album_ref
 | 
			
		||||
        self.artist_refs = artist_refs
 | 
			
		||||
 | 
			
		||||
        self.album: Album = None
 | 
			
		||||
        self._album: Album | None = None
 | 
			
		||||
 | 
			
		||||
    def __eq__(self, other):
 | 
			
		||||
        if type(other) != type(self):
 | 
			
		||||
@@ -227,11 +229,20 @@ class Song(DatabaseObject):
 | 
			
		||||
            return None
 | 
			
		||||
        return self.album_ref.id
 | 
			
		||||
 | 
			
		||||
    length = property(fget=get_length, fset=set_length)
 | 
			
		||||
    def set_album(self, album):
 | 
			
		||||
        if self.album_ref.id is not None:
 | 
			
		||||
            if self.album_ref.id != album.id:
 | 
			
		||||
                logger.warning(f"song already refers to different album, overriding reference.")
 | 
			
		||||
 | 
			
		||||
        self.album_ref = Reference(album.id)
 | 
			
		||||
        self._album = album
 | 
			
		||||
 | 
			
		||||
    album = property(fget=lambda self: self._album, fset=set_album)
 | 
			
		||||
    length: int = property(fget=get_length, fset=set_length)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
All objects dependend on Album
 | 
			
		||||
All objects dependent on Album
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -273,11 +284,22 @@ class Album(DatabaseObject):
 | 
			
		||||
 | 
			
		||||
        self.tracklist: List[Song] = []
 | 
			
		||||
 | 
			
		||||
    def __str__(self) -> str:
 | 
			
		||||
        return f"Album: \"{self.title}\""
 | 
			
		||||
 | 
			
		||||
    def __len__(self) -> int:
 | 
			
		||||
        return len(self.tracklist)
 | 
			
		||||
 | 
			
		||||
    def set_tracklist(self, tracklist: List[Song]):
 | 
			
		||||
        self.tracklist = tracklist
 | 
			
		||||
 | 
			
		||||
        for i, track in enumerate(self.tracklist):
 | 
			
		||||
            track.tracksort = i+1
 | 
			
		||||
 | 
			
		||||
    def add_song(self, song: Song):
 | 
			
		||||
        for existing_song in self.tracklist:
 | 
			
		||||
            if existing_song == song:
 | 
			
		||||
                return
 | 
			
		||||
 | 
			
		||||
        song.tracksort = len(self.tracklist)
 | 
			
		||||
        self.tracklist.append(song)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ CREATE TABLE Song
 | 
			
		||||
    name        TEXT,
 | 
			
		||||
    isrc        TEXT,
 | 
			
		||||
    length      INT,    -- length is in milliseconds (could be wrong)
 | 
			
		||||
    tracksort   INT,
 | 
			
		||||
    album_id    BIGINT,
 | 
			
		||||
    FOREIGN KEY(album_id) REFERENCES Album(id)
 | 
			
		||||
);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								src/test.db
									
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/test.db
									
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
		Reference in New Issue
	
	Block a user