mirror of
https://github.com/Dvorinka/swingmusic-extended.git
synced 2026-06-03 20:13:02 +00:00
165 lines
4.8 KiB
Python
165 lines
4.8 KiB
Python
import json
|
|
from typing import Iterable
|
|
|
|
from app.lib.tagger import create_artists
|
|
from app.models import Artist
|
|
from app.utils.auth import get_current_userid
|
|
from app.utils.customlist import CustomList
|
|
from .tracks import TrackStore
|
|
|
|
ARTIST_LOAD_KEY = ""
|
|
|
|
|
|
class ArtistMapEntry:
|
|
def __init__(
|
|
self, artist: Artist, albumhashes: set[str], trackhashes: set[str]
|
|
) -> None:
|
|
self.artist = artist
|
|
self.albumhashes: set[str] = albumhashes
|
|
self.trackhashes: set[str] = trackhashes
|
|
|
|
def increment_playcount(self, duration: int, timestamp: int, playcount: int = 1):
|
|
self.artist.lastplayed = timestamp
|
|
self.artist.playduration += duration
|
|
self.artist.playcount += playcount
|
|
|
|
def toggle_favorite_user(self, userid: int | None = None):
|
|
if userid is None:
|
|
userid = get_current_userid()
|
|
|
|
self.artist.toggle_favorite_user(userid)
|
|
|
|
def set_color(self, color: str):
|
|
self.artist.color = color
|
|
|
|
|
|
class ArtistStore:
|
|
artistmap: dict[str, ArtistMapEntry] = {}
|
|
|
|
@classmethod
|
|
def load_artists(cls, instance_key: str, _trackhashes: list[str] = []):
|
|
"""
|
|
Loads all artists from the database into the store.
|
|
"""
|
|
global ARTIST_LOAD_KEY
|
|
ARTIST_LOAD_KEY = instance_key
|
|
|
|
print("Loading artists... ", end="")
|
|
cls.artistmap.clear()
|
|
|
|
cls.artistmap = {
|
|
artist.artisthash: ArtistMapEntry(
|
|
artist=artist, albumhashes=albumhashes, trackhashes=trackhashes
|
|
)
|
|
for artist, trackhashes, albumhashes in create_artists(_trackhashes)
|
|
}
|
|
|
|
# for track in TrackStore.get_flat_list():
|
|
# if instance_key != ARTIST_LOAD_KEY:
|
|
# return
|
|
|
|
# for hash in track.artisthashes:
|
|
# cls.artistmap[hash].trackhashes.add(track.trackhash)
|
|
# cls.artistmap[hash].albumhashes.add(track.albumhash)
|
|
|
|
print("Done!")
|
|
# for artist in ardb.get_all_artists():
|
|
# if instance_key != ARTIST_LOAD_KEY:
|
|
# return
|
|
|
|
# cls.map_artist_color(artist)
|
|
|
|
@classmethod
|
|
def get_flat_list(cls):
|
|
"""
|
|
Returns a flat list of all artists.
|
|
"""
|
|
return [a.artist for a in cls.artistmap.values()]
|
|
|
|
# @classmethod
|
|
# def map_artist_color(cls, artist_tuple: tuple):
|
|
# """
|
|
# Maps a color to the corresponding artist.
|
|
# """
|
|
|
|
# artisthash = artist_tuple[1]
|
|
# color = json.loads(artist_tuple[2])
|
|
|
|
# for artist in cls.artists:
|
|
# if artist.artisthash == artisthash:
|
|
# artist.set_colors(color)
|
|
# break
|
|
|
|
# @classmethod
|
|
# def add_artist(cls, artist: Artist):
|
|
# """
|
|
# Adds an artist to the store.
|
|
# """
|
|
# cls.artists.append(artist)
|
|
|
|
# @classmethod
|
|
# def add_artists(cls, artists: list[Artist]):
|
|
# """
|
|
# Adds multiple artists to the store.
|
|
# """
|
|
# for artist in artists:
|
|
# if artist not in cls.artists:
|
|
# cls.artists.append(artist)
|
|
|
|
@classmethod
|
|
def get_artist_by_hash(cls, artisthash: str):
|
|
"""
|
|
Returns an artist by its hash.P
|
|
"""
|
|
entry = cls.artistmap.get(artisthash, None)
|
|
if entry is not None:
|
|
return entry.artist
|
|
|
|
@classmethod
|
|
def get_artists_by_hashes(cls, artisthashes: Iterable[str]):
|
|
"""
|
|
Returns artists by their hashes.
|
|
"""
|
|
artists = [cls.get_artist_by_hash(hash) for hash in artisthashes]
|
|
return [a for a in artists if a is not None]
|
|
|
|
# @classmethod
|
|
# def artist_exists(cls, artisthash: str) -> bool:
|
|
# """
|
|
# Checks if an artist exists.
|
|
# """
|
|
# return artisthash in "-".join([a.artisthash for a in cls.artists])
|
|
|
|
# @classmethod
|
|
# def artist_has_tracks(cls, artisthash: str) -> bool:
|
|
# """
|
|
# Checks if an artist has tracks.
|
|
# """
|
|
# artists: set[str] = set()
|
|
|
|
# for track in TrackStore.tracks:
|
|
# artists.update(track.artist_hashes)
|
|
# album_artists: list[str] = [a.artisthash for a in track.albumartists]
|
|
# artists.update(album_artists)
|
|
|
|
# master_hash = "-".join(artists)
|
|
# return artisthash in master_hash
|
|
|
|
# @classmethod
|
|
# def remove_artist_by_hash(cls, artisthash: str):
|
|
# """
|
|
# Removes an artist from the store.
|
|
# """
|
|
# cls.artists = CustomList(a for a in cls.artists if a.artisthash != artisthash)
|
|
|
|
@classmethod
|
|
def get_artist_tracks(cls, artisthash: str):
|
|
"""
|
|
Returns all tracks by the given artist hash.
|
|
"""
|
|
entry = cls.artistmap.get(artisthash)
|
|
if entry is not None:
|
|
return TrackStore.get_tracks_by_trackhashes(entry.trackhashes)
|
|
|
|
return []
|