Anna Schumaker
d3bdaaa063
This table allows us to work with Artist playlists that have a name and (optional) mbid. Note that we can insert multiple artists with the same name into the database as long as they have different mbids. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
# Copyright 2022 (c) Anna Schumaker
|
|
"""A custom Gio.ListModel for working with artists."""
|
|
import sqlite3
|
|
from gi.repository import GObject
|
|
from .. import format
|
|
from . import playlist
|
|
|
|
|
|
class Artist(playlist.Playlist):
|
|
"""Our custom Artist object."""
|
|
|
|
artistid = GObject.Property(type=int)
|
|
mbid = GObject.Property(type=str)
|
|
|
|
@property
|
|
def primary_key(self) -> int:
|
|
"""Get the Artist primary key."""
|
|
return self.artistid
|
|
|
|
|
|
class Table(playlist.Table):
|
|
"""Our Artist Table."""
|
|
|
|
def do_construct(self, **kwargs) -> Artist:
|
|
"""Construct a new artist."""
|
|
return Artist(**kwargs)
|
|
|
|
def do_get_sort_key(self, artist: Artist) -> tuple[tuple, bool, str]:
|
|
"""Get a sort key for the requested Playlist."""
|
|
return (format.sort_key(artist.name),
|
|
len(artist.mbid) == 0,
|
|
artist.mbid.casefold())
|
|
|
|
def do_sql_delete(self, artist: Artist) -> bool:
|
|
"""Delete an artist."""
|
|
return self.sql("DELETE FROM artists WHERE artistid=?",
|
|
artist.artistid)
|
|
|
|
def do_sql_glob(self, glob: str) -> sqlite3.Cursor:
|
|
"""Search for artists matching the search text."""
|
|
return self.sql("""SELECT artistid FROM artists WHERE
|
|
CASEFOLD(name) GLOB ?""", glob)
|
|
|
|
def do_sql_insert(self, name: str,
|
|
mbid: str = "") -> sqlite3.Cursor | None:
|
|
"""Create a new artist."""
|
|
if cur := self.sql("INSERT INTO artists (name, mbid) VALUES (?, ?)",
|
|
name, mbid):
|
|
return self.sql("SELECT * FROM artists_view WHERE artistid=?",
|
|
cur.lastrowid)
|
|
|
|
def do_sql_select_all(self) -> sqlite3.Cursor:
|
|
"""Load artists from the database."""
|
|
return self.sql("SELECT * FROM artists_view")
|
|
|
|
def do_sql_select_one(self, name: str | None = None,
|
|
*, mbid: str = "") -> sqlite3.Cursor:
|
|
"""Look up an artist by name and mbid."""
|
|
where = "mbid=? AND CASEFOLD(name)=?" if name else "mbid=?"
|
|
args = [mbid.lower(), name.casefold()] if name else [mbid.lower()]
|
|
return self.sql(f"SELECT artistid FROM artists WHERE {where}", *args)
|
|
|
|
def do_sql_update(self, artist: Artist,
|
|
column: str, newval) -> sqlite3.Cursor:
|
|
"""Update an artist."""
|
|
return self.sql(f"UPDATE artists SET {column}=? WHERE artistid=?",
|
|
newval, artist.artistid)
|