playlist: Add a Playlist model
This model builds on the TrackidModel to make it more Playlist and Track focused instead of trackid centric. Signed-off-by: Anna Schumaker <Anna@NoWheyCreamery.com>
This commit is contained in:
parent
4ce571ebf8
commit
298b58a54e
|
@ -0,0 +1,44 @@
|
|||
# Copyright 2023 (c) Anna Schumaker.
|
||||
"""A TrackidModel with extra features."""
|
||||
from gi.repository import GObject
|
||||
from . import model
|
||||
from .. import db
|
||||
|
||||
|
||||
class Playlist(model.TrackidModel):
|
||||
"""A TrackidModel with extra Playlist features."""
|
||||
|
||||
def __init__(self, sql: db.Connection,
|
||||
playlist: db.playlist.Playlist = None):
|
||||
"""Initialize the Playlist instance."""
|
||||
super().__init__(sql=sql)
|
||||
self.__playlist = None
|
||||
|
||||
if playlist is not None:
|
||||
self.playlist = playlist
|
||||
|
||||
def add_track(self, track: db.tracks.Track) -> None:
|
||||
"""Add a track to the playlist."""
|
||||
if self.__playlist is not None:
|
||||
self.__playlist.add_track(track)
|
||||
|
||||
def index(self, track: db.tracks.Track) -> int | None:
|
||||
"""Find the index of a track in the list."""
|
||||
if track is not None:
|
||||
return super().index(track.trackid)
|
||||
|
||||
def remove_track(self, track: db.tracks.Track) -> None:
|
||||
"""Remove a track from the playlist."""
|
||||
if self.__playlist is not None:
|
||||
self.__playlist.remove_track(track)
|
||||
|
||||
@GObject.Property(type=db.playlist.Playlist)
|
||||
def playlist(self) -> db.playlist.Playlist | None:
|
||||
"""Get the current db playlist."""
|
||||
return self.__playlist
|
||||
|
||||
@playlist.setter
|
||||
def playlist(self, new: db.playlist.Playlist | None) -> None:
|
||||
"""Set a new db playlist to the playlist."""
|
||||
self.__playlist = new
|
||||
self.trackid_set = None if new is None else new.tracks
|
|
@ -0,0 +1,78 @@
|
|||
# Copyright 2023 (c) Anna Schumaker.
|
||||
"""Tests our PlaylistModel."""
|
||||
import pathlib
|
||||
import tests.util
|
||||
import emmental.playlist.playlist
|
||||
|
||||
|
||||
class TestPlaylist(tests.util.TestCase):
|
||||
"""Tests the Playlist Gio.ListModel."""
|
||||
|
||||
def setUp(self):
|
||||
"""Set up common variables."""
|
||||
super().setUp()
|
||||
self.db_plist = self.sql.playlists.create("Test Playlist")
|
||||
self.playlist = emmental.playlist.playlist.Playlist(self.sql)
|
||||
|
||||
self.library = self.sql.libraries.create(pathlib.Path("/a/b"))
|
||||
self.album = self.sql.albums.create("Test Album", "Artist", "2023")
|
||||
self.medium = self.sql.media.create(self.album, "", number=1)
|
||||
self.year = self.sql.years.create(2023)
|
||||
|
||||
self.track1 = self.sql.tracks.create(self.library,
|
||||
pathlib.Path("/a/b/1.ogg"),
|
||||
self.medium, self.year, number=1)
|
||||
self.track2 = self.sql.tracks.create(self.library,
|
||||
pathlib.Path("/a/b/2.ogg"),
|
||||
self.medium, self.year, number=2)
|
||||
|
||||
def test_init(self):
|
||||
"""Test that the Playlist was set up correctly."""
|
||||
self.assertIsInstance(self.playlist,
|
||||
emmental.playlist.model.TrackidModel)
|
||||
self.assertEqual(self.playlist.sql, self.sql)
|
||||
self.assertIsNone(self.playlist._Playlist__playlist)
|
||||
|
||||
plist2 = emmental.playlist.playlist.Playlist(self.sql, self.db_plist)
|
||||
self.assertEqual(plist2.playlist, self.db_plist)
|
||||
|
||||
def test_add_track(self):
|
||||
"""Test the playlist add_track() function."""
|
||||
self.playlist.add_track(self.track1)
|
||||
|
||||
self.playlist.playlist = self.db_plist
|
||||
self.playlist.add_track(self.track1)
|
||||
self.assertListEqual(self.playlist.trackids, [self.track1.trackid])
|
||||
|
||||
def test_index(self):
|
||||
"""Test the playlist index() function."""
|
||||
self.assertIsNone(self.playlist.index(self.track1))
|
||||
|
||||
self.playlist.playlist = self.db_plist
|
||||
self.playlist.add_track(self.track1)
|
||||
|
||||
self.assertEqual(self.playlist.index(self.track1), 0)
|
||||
self.assertIsNone(self.playlist.index(self.track2))
|
||||
self.assertIsNone(self.playlist.index(None))
|
||||
|
||||
def test_remove_track(self):
|
||||
"""Test the playlist remove_track() function."""
|
||||
self.playlist.remove_track(self.track1)
|
||||
|
||||
self.db_plist.add_track(self.track1)
|
||||
self.playlist.playlist = self.db_plist
|
||||
self.playlist.remove_track(self.track1)
|
||||
self.assertListEqual(self.playlist.trackids, [])
|
||||
|
||||
def test_playlist(self):
|
||||
"""Test the playlist property."""
|
||||
self.assertIsNone(self.playlist.playlist)
|
||||
|
||||
self.playlist.playlist = self.db_plist
|
||||
self.assertEqual(self.playlist._Playlist__playlist, self.db_plist)
|
||||
self.assertEqual(self.playlist.playlist, self.db_plist)
|
||||
self.assertEqual(self.playlist.trackid_set, self.db_plist.tracks)
|
||||
|
||||
self.playlist.playlist = None
|
||||
self.assertIsNone(self.playlist.playlist)
|
||||
self.assertIsNone(self.playlist.trackid_set)
|
Loading…
Reference in New Issue