diff --git a/app/models.py b/app/models.py index ed3f416..b3ab4c9 100644 --- a/app/models.py +++ b/app/models.py @@ -39,6 +39,8 @@ from log import DEBUG, ERROR # Create session at the global level as per # https://docs.sqlalchemy.org/en/13/orm/session_basics.html +# and make objects persistent +# https://docs.sqlalchemy.org/en/14/orm/session_state_management.html engine = sqlalchemy.create_engine( f"{Config.MYSQL_CONNECT}?charset=utf8", @@ -46,7 +48,8 @@ engine = sqlalchemy.create_engine( echo=Config.DISPLAY_SQL, pool_pre_ping=True) -Session = scoped_session(sessionmaker(bind=engine)) +sm = sessionmaker(bind=engine) +Session = scoped_session(sm) Base: DeclarativeMeta = declarative_base() Base.metadata.create_all(engine) @@ -135,7 +138,7 @@ class Notes(Base): id = Column(Integer, primary_key=True, autoincrement=True) playlist_id = Column(Integer, ForeignKey('playlists.id')) playlist = relationship("Playlists", back_populates="notes", - lazy="joined") + lazy="joined") row = Column(Integer, nullable=False) note = Column(String(256), index=False) @@ -183,7 +186,7 @@ class Playdates(Base): lastplayed = Column(DateTime, index=True, default=None) track_id = Column(Integer, ForeignKey('tracks.id')) tracks = relationship("Tracks", back_populates="playdates", - lazy="joined") + lazy="joined") def __init__(self, session, track): """Record that track was played""" @@ -452,9 +455,9 @@ class Tracks(Base): mtime = Column(Float, index=True) lastplayed = Column(DateTime, index=True, default=None) playlists = relationship("PlaylistTracks", back_populates="tracks", - lazy="joined") + lazy="joined") playdates = relationship("Playdates", back_populates="tracks", - lazy="joined") + lazy="joined") def __init__(self, session, path): self.path = path diff --git a/app/musicmuster.py b/app/musicmuster.py index 430f0f5..8d93221 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -474,6 +474,9 @@ class Window(QMainWindow, Ui_MainWindow): QColor(Config.COLOUR_CURRENT_TAB)) self.music.play(self.current_track.path) + # Tell playlist so it can update its display + self.current_track_playlist_tab.play_started() + # Tell database to record it as played Playdates(session, self.current_track) diff --git a/app/playlists.py b/app/playlists.py index 7f0eb55..c109c37 100644 --- a/app/playlists.py +++ b/app/playlists.py @@ -150,7 +150,7 @@ class PlaylistTab(QTableWidget): def dropEvent(self, event: QDropEvent): # if not event.isAccepted() and event.source() == self: if not event.source() == self: - return # We don't accept external drops + return # We don't accept external drops drop_row = self._drop_on(event) @@ -173,7 +173,7 @@ class PlaylistTab(QTableWidget): event.accept() # The above doesn't handle column spans, which we use in note # rows. Check and fix: - row = 0 # So row is defined even if there are no rows in range + row = 0 # So row is defined even if there are no rows in range for row in range(drop_row, drop_row + len(rows_to_move)): if row in self._meta_get_notes(): self.setSpan( @@ -677,7 +677,7 @@ class PlaylistTab(QTableWidget): else: # No current track to base from, but don't change # time if it's already set - start_time = self._get_row_time(row) + start_time = self._get_row_start_time(row) if not start_time: start_time = next_start_time # Now set it @@ -879,8 +879,9 @@ class PlaylistTab(QTableWidget): """Return time specified at the end of text""" try: + time_length = len(Config.NOTE_TIME_FORMAT) return datetime.strptime( - text[-len(Config.NOTE_TIME_FORMAT):], + text[(--time_length):], Config.NOTE_TIME_FORMAT ) except ValueError: @@ -904,6 +905,18 @@ class PlaylistTab(QTableWidget): obj = self.item(row, self.COL_USERDATA).data(self.CONTENT_OBJECT) return obj + def _get_row_start_time(self, row): + try: + if self.item(row, self.COL_START_TIME): + return datetime.strptime(self.item( + row, self.COL_START_TIME).text(), + Config.NOTE_TIME_FORMAT + ) + else: + return None + except ValueError: + return None + def _info_row(self, row): """Display popup with info re row""" @@ -1273,7 +1286,7 @@ class PlaylistTab(QTableWidget): if self._track_is_readable(track): self._meta_set_next(row) - self.parent.this_is_the_next_track(track) + self.parent.this_is_the_next_track(self, track) else: self._meta_set_unreadable(row) track = None