diff --git a/app/model.py b/app/model.py index 9aece7e..8f129a9 100644 --- a/app/model.py +++ b/app/model.py @@ -189,7 +189,7 @@ class Playlists(Base): @staticmethod def get_all_closed_playlists(session): - "Returns a list of all playlists not currently open" + "Returns a list of all playlists not currently open" return ( session.query(Playlists) @@ -221,6 +221,15 @@ class Playlists(Base): def get_notes(self): return [a.note for a in self.notes] + @staticmethod + def get_playlist(session, playlist_id): + return ( + session.query(Playlists) + .filter( + Playlists.id == playlist_id # noqa E712 + ) + ).one() + def get_tracks(self): return [a.tracks for a in self.tracks] @@ -244,6 +253,7 @@ class Playlists(Base): return p + class PlaylistTracks(Base): __tablename__ = 'playlisttracks' @@ -424,13 +434,6 @@ class Tracks(Base): return [a[0] for a in session.query(Tracks.path).all()] - # Not used as of 1 June 2021 - # @classmethod - # def get_all_tracks(cls): - # "Return a list of all tracks" - - # return session.query(cls).all() - @staticmethod def get_path(session, id): try: diff --git a/app/musicmuster.py b/app/musicmuster.py index fbd6c25..589ab4a 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -217,7 +217,7 @@ class Window(QMainWindow, Ui_MainWindow): # Get output filename pathspec = QFileDialog.getSaveFileName( self, 'Save Playlist', - directory=f"{self.visible_playlist().db.name}.m3u", + directory=f"{self.visible_playlist().name}.m3u", filter="M3U files (*.m3u);;All files (*.*)" ) if not pathspec: @@ -227,19 +227,23 @@ class Window(QMainWindow, Ui_MainWindow): if not path.endswith(".m3u"): path += ".m3u" - with open(path, "w") as f: - # Required directive on first line - f.write("#EXTM3U\n") - for track in self.visible_playlist().db.get_tracks(): - f.write( - "#EXTINF:" - f"{int(track.duration / 1000)}," - f"{track.title} - " - f"{track.artist}" - "\n" - f"{track.path}" - "\n" - ) + + # Get playlist db object + with Session() as session: + p = Playlists.get_playlist(session, self.visible_playlist().id) + with open(path, "w") as f: + # Required directive on first line + f.write("#EXTM3U\n") + for track in p.get_tracks(): + f.write( + "#EXTINF:" + f"{int(track.duration / 1000)}," + f"{track.title} - " + f"{track.artist}" + "\n" + f"{track.path}" + "\n" + ) def fade(self): "Fade currently playing track" diff --git a/app/playlists.py b/app/playlists.py index 57d864e..305e02a 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -279,13 +279,13 @@ class Playlist(QTableWidget): "Clear current track" self._meta_clear_current() - self._repaint(save_playlist=False) + self._repaint() def clear_next(self): "Clear next track" self._meta_clear_next() - self._repaint(save_playlist=False) + self._repaint() def get_next_track_id(self): "Return next track id" @@ -325,7 +325,7 @@ class Playlist(QTableWidget): for row in sorted(rows, reverse=True): self.removeRow(row) - self._repaint(save_playlist=False) + self._repaint() def get_selected_title(self): "Return title of selected row or None" @@ -352,13 +352,13 @@ class Playlist(QTableWidget): scroll_to = self.item(current_row, self.COL_INDEX) self.scrollToItem(scroll_to, QAbstractItemView.PositionAtCenter) next_track_id = self._mark_next_track() - self._repaint(save_playlist=False) + self._repaint() return next_track_id def play_stopped(self): self._meta_clear_current() self.current_track_start_time = None - self._repaint(save_playlist=False) + self._repaint() def populate(self, session): # add tracks and notes in row order. @@ -368,6 +368,7 @@ class Playlist(QTableWidget): # First, save our id for the future self.id = self.db.id + self.name = self.db.name data = [] @@ -392,7 +393,7 @@ class Playlist(QTableWidget): def repaint(self): # Called when we change tabs - self._repaint(save_playlist=False) + self._repaint() def select_next_track(self): """ @@ -520,7 +521,7 @@ class Playlist(QTableWidget): if row in self._meta_get_notes(): Notes.delete_note(session, id) else: - PlaylistTracks.remove_track(session, self.db.id, row) + PlaylistTracks.remove_track(session, self.id, row) self.removeRow(row) self._save_playlist(session) @@ -707,7 +708,7 @@ class Playlist(QTableWidget): else: title = "" DEBUG( - f"playlist[{self.db.id}:{self.db.name}]._meta_set(row={row}, " + f"playlist[{self.id}:{self.name}]._meta_set(row={row}, " f"title={title}, metadata={metadata})" ) if row is None: @@ -729,14 +730,14 @@ class Playlist(QTableWidget): track_id = self._get_row_id(row) if track_id: self._meta_set_next(self.currentRow()) - self._repaint(save_playlist=False) + self._repaint() self.master_process.set_next_track(track_id) def _repaint(self, clear_selection=True): "Set row colours, fonts, etc" DEBUG( - f"playlist[{self.db.id}:{self.db.name}]." + f"playlist[{self.id}:{self.name}]." f"_repaint(clear_selection={clear_selection}" ) @@ -883,13 +884,13 @@ class Playlist(QTableWidget): # Tracks # Remove all tracks for us in datbase - PlaylistTracks.remove_all_tracks(session, self.db.id) + PlaylistTracks.remove_all_tracks(session, self.id) # Iterate on-screen playlist and add tracks back in for row in range(self.rowCount()): if row in notes_rows: continue PlaylistTracks.add_track( - session, self.db.id, self._get_row_id(row), row) + session, self.id, self._get_row_id(row), row) def _set_column_widths(self):