emmental/db/state.py

81 lines
2.6 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
#
# Table: playlist_states
# +-----------+--------+------+---------+------+
# | plstateid | random | loop | current | sort |
# +-----------+--------+------+---------+------+
from gi.repository import GObject
from . import sql
from . import table
DefaultSort = [ "artists.sort ASC", "albums.release ASC", "albums.sort ASC",
"discs.number ASC", "tracks.number ASC", "tracks.trackid ASC" ]
class PlaylistState(GObject.GObject):
def __init__(self, row):
GObject.GObject.__init__(self)
self._plstateid = row["plstateid"]
self._random = row["random"]
self._loop = row["loop"]
self._current = row["current"]
self._sort = row["sort"]
@GObject.Property
def rowid(self): return self._plstateid
@GObject.Property(type=bool,default=False)
def random(self): return self._random
@random.setter
def random(self, newval): self._random = self.update("random", newval)
@GObject.Property(type=bool,default=False)
def loop(self): return self._loop
@loop.setter
def loop(self, newval): self._loop = self.update("loop", newval)
@GObject.Property(type=int)
def current(self): return self._current
@current.setter
def current(self, newval): self._current = self.update("current", newval)
@GObject.Property(type=GObject.TYPE_PYOBJECT)
def sort(self): return self._sort.split(",")
@sort.setter
def sort(self, newval):
if "tracks.trackid ASC" not in newval:
newval.append("tracks.trackid ASC")
self._sort = self.update("sort", ",".join(newval))
def update(self, column, newval):
sql.execute(f"UPDATE playlist_states SET {column}=? WHERE plstateid=?",
[ newval, self.rowid ])
sql.commit()
return newval
class PlaylistStateTable(table.Table):
def __init__(self):
table.Table.__init__(self, "playlist_states")
def do_create(self):
sql.execute("CREATE TABLE IF NOT EXISTS playlist_states "
"(plstateid INTEGER PRIMARY KEY, "
" random INTEGER DEFAULT 0, "
" loop INTEGER DEFAULT 0, "
" current INTEGER DEFAULT -1, "
" sort TEXT)")
def do_factory(self, row):
return PlaylistState(row)
def do_insert(self, random=False, loop=False, sort=DefaultSort):
return sql.execute("INSERT INTO playlist_states (random, loop, sort) "
"VALUES (?, ?, ?)", (random, loop, ",".join(sort)))
Table = PlaylistStateTable()