emmental/emmental/db/artists.py
Anna Schumaker d3bdaaa063 db: Add an Artist Table
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>
2023-04-12 10:44:34 -04:00

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)