More 'detached session' fixes

This commit is contained in:
Keith Edmunds 2021-06-04 16:29:16 +01:00
parent 4bae0b8548
commit 0cf649bb01
3 changed files with 42 additions and 34 deletions

View File

@ -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:

View File

@ -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,10 +227,14 @@ class Window(QMainWindow, Ui_MainWindow):
if not path.endswith(".m3u"):
path += ".m3u"
# 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 self.visible_playlist().db.get_tracks():
for track in p.get_tracks():
f.write(
"#EXTINF:"
f"{int(track.duration / 1000)},"

View File

@ -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):