From 4fce750223cb46c266a756aac4e910082f528e41 Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Fri, 19 Jan 2024 09:58:52 +0000 Subject: [PATCH] Refactor / simplify start/stop times Fixes #218 --- app/musicmuster.py | 12 +++---- app/playlistmodel.py | 84 +++++++++++++++++++++++--------------------- 2 files changed, 49 insertions(+), 47 deletions(-) diff --git a/app/musicmuster.py b/app/musicmuster.py index eb23a4d..df4b7c8 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -1124,20 +1124,20 @@ class Window(QMainWindow, Ui_MainWindow): if not track_sequence.now.path: log.error("No path for next track") return + self.music.play(track_sequence.now.path, position) - # Notify model - self.active_proxy_model().current_track_started() - - # Note that track is now playing + # Note that track is playing + track_sequence.now.start() self.playing = True # Disable play next controls self.disable_play_next_controls() + # Notify model + self.active_proxy_model().current_track_started() + # Update headers self.update_headers() - track_sequence.now.start() - self.music.play(track_sequence.now.path, position) # Ensure 100% volume # For as-yet unknown reasons. sometimes the volume gets diff --git a/app/playlistmodel.py b/app/playlistmodel.py index 12cde8c..31dcf95 100644 --- a/app/playlistmodel.py +++ b/app/playlistmodel.py @@ -68,6 +68,8 @@ class PlaylistRowData: self.played = False self.start_gap: Optional[int] = None self.title: str = "" + self.start_time: Optional[datetime] = None + self.end_time: Optional[datetime] = None self.plrid: int = plr.id self.plr_rownum: int = plr.plr_rownum @@ -93,12 +95,6 @@ class PlaylistRowData: ) -@dataclass -class StartEndTimes: - start_time: Optional[datetime] = None - end_time: Optional[datetime] = None - - class PlaylistModel(QAbstractTableModel): """ The Playlist Model @@ -127,7 +123,6 @@ class PlaylistModel(QAbstractTableModel): super().__init__(*args, **kwargs) self.playlist_rows: dict[int, PlaylistRowData] = {} - self.start_end_times: dict[int, StartEndTimes] = {} self.signals = MusicMusterSignals() self.played_tracks_hidden = False @@ -259,6 +254,7 @@ class PlaylistModel(QAbstractTableModel): """ row_number = track_sequence.now.plr_rownum + prd = self.playlist_rows[row_number] # Sanity check if not track_sequence.now.track_id: @@ -289,8 +285,8 @@ class PlaylistModel(QAbstractTableModel): log.error(f"Can't retrieve plr, {track_sequence.now.plr_id=}") # Update track times - self.start_end_times[row_number].start_time = track_sequence.now.start_time - self.start_end_times[row_number].end_time = track_sequence.now.end_time + prd.start_time = track_sequence.now.start_time + prd.end_time = track_sequence.now.end_time # Update colour and times for current row self.invalidate_row(row_number) @@ -408,17 +404,15 @@ class PlaylistModel(QAbstractTableModel): return QVariant() if column == Col.START_TIME.value: - if row in self.start_end_times: - start_time = self.start_end_times[row].start_time - if start_time: - return QVariant(start_time.strftime(Config.TRACK_TIME_FORMAT)) + start_time = prd.start_time + if start_time: + return QVariant(start_time.strftime(Config.TRACK_TIME_FORMAT)) return QVariant() if column == Col.END_TIME.value: - if row in self.start_end_times: - end_time = self.start_end_times[row].end_time - if end_time: - return QVariant(end_time.strftime(Config.TRACK_TIME_FORMAT)) + end_time = prd.end_time + if end_time: + return QVariant(end_time.strftime(Config.TRACK_TIME_FORMAT)) return QVariant() dispatch_table = { @@ -1327,15 +1321,15 @@ class PlaylistModel(QAbstractTableModel): update_rows: List[int] = [] for row_number in range(len(self.playlist_rows)): - stend = self.start_end_times[row_number] = StartEndTimes() prd = self.playlist_rows[row_number] # Reset start_time if this is the current row if row_number == track_sequence.now.plr_rownum: - stend.start_time = track_sequence.now.start_time - stend.end_time = track_sequence.now.end_time + prd.start_time = track_sequence.now.start_time + prd.end_time = track_sequence.now.end_time + update_rows.append(row_number) if not next_start_time: - next_start_time = stend.end_time + next_start_time = prd.end_time continue # Set start time for next row if we have a current track @@ -1343,9 +1337,9 @@ class PlaylistModel(QAbstractTableModel): row_number == track_sequence.next.plr_rownum and track_sequence.now.end_time ): - stend.start_time = track_sequence.now.end_time - stend.end_time = stend.start_time + timedelta(milliseconds=prd.duration) - next_start_time = stend.end_time + prd.start_time = track_sequence.now.end_time + prd.end_time = prd.start_time + timedelta(milliseconds=prd.duration) + next_start_time = prd.end_time update_rows.append(row_number) continue @@ -1362,31 +1356,39 @@ class PlaylistModel(QAbstractTableModel): < row_number < track_sequence.next.plr_rownum ): + prd.start_time = None + prd.end_time = None update_rows.append(row_number) continue - # Reset start time if timing in header or at current track + # Reset start time if timing in header if self.is_header_row(row_number): header_time = get_embedded_time(prd.note) if header_time: next_start_time = header_time - else: - # This is an unplayed track - # Don't schedule unplayable tracks - if file_is_unreadable(prd.path): - continue + continue - # Set start/end if we have a start time - if next_start_time is None: - continue - if stend.start_time != next_start_time: - stend.start_time = next_start_time - update_rows.append(row_number) - next_start_time += timedelta( - milliseconds=self.playlist_rows[row_number].duration - ) - if stend.end_time != next_start_time: - stend.end_time = next_start_time + # This is an unplayed track + # Don't schedule unplayable tracks + if file_is_unreadable(prd.path): + continue + + # Set start/end if we have a start time + if next_start_time is None: + continue + + # Update start time of this row if it's incorrect + if prd.start_time != next_start_time: + prd.start_time = next_start_time + update_rows.append(row_number) + + # Calculate next start time + next_start_time += timedelta(milliseconds=prd.duration) + + # Update end time of this row if it's incorrect + if prd.end_time != next_start_time: + prd.end_time = next_start_time + if row_number not in update_rows: update_rows.append(row_number) # Update start/stop times of rows that have changed