WIP V3: set up track_sequence handling
This commit is contained in:
parent
c20dc0288f
commit
6f31ed7afc
@ -212,9 +212,9 @@ class AddFadeCurve(QObject):
|
|||||||
self.finished.emit()
|
self.finished.emit()
|
||||||
|
|
||||||
|
|
||||||
class PlayingTrack:
|
class TrackSequence:
|
||||||
next = PlaylistTrack()
|
next = PlaylistTrack()
|
||||||
now = PlaylistTrack()
|
now = PlaylistTrack()
|
||||||
previous = PlaylistTrack()
|
previous = PlaylistTrack()
|
||||||
|
|
||||||
playing_track = PlayingTrack()
|
track_sequence = TrackSequence()
|
||||||
|
|||||||
@ -52,7 +52,7 @@ from sqlalchemy import text
|
|||||||
import stackprinter # type: ignore
|
import stackprinter # type: ignore
|
||||||
|
|
||||||
from classes import (
|
from classes import (
|
||||||
playing_track,
|
track_sequence,
|
||||||
FadeCurve,
|
FadeCurve,
|
||||||
MusicMusterSignals,
|
MusicMusterSignals,
|
||||||
PlaylistTrack,
|
PlaylistTrack,
|
||||||
@ -387,7 +387,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
Clear next track
|
Clear next track
|
||||||
"""
|
"""
|
||||||
|
|
||||||
playing_track.next = PlaylistTrack()
|
track_sequence.next = PlaylistTrack()
|
||||||
self.update_headers()
|
self.update_headers()
|
||||||
|
|
||||||
def clear_selection(self) -> None:
|
def clear_selection(self) -> None:
|
||||||
@ -708,13 +708,13 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
# self.current_track.playlist_tab.play_ended()
|
# self.current_track.playlist_tab.play_ended()
|
||||||
|
|
||||||
# Reset fade graph
|
# Reset fade graph
|
||||||
if playing_track.now.fade_graph:
|
if track_sequence.now.fade_graph:
|
||||||
playing_track.now.fade_graph.clear()
|
track_sequence.now.fade_graph.clear()
|
||||||
|
|
||||||
# Reset PlaylistTrack objects
|
# Reset PlaylistTrack objects
|
||||||
if playing_track.now.track_id:
|
if track_sequence.now.track_id:
|
||||||
playing_track.previous = playing_track.now
|
track_sequence.previous = track_sequence.now
|
||||||
playing_track.now = PlaylistTrack()
|
track_sequence.now = PlaylistTrack()
|
||||||
|
|
||||||
# Reset clocks
|
# Reset clocks
|
||||||
self.frame_fade.setStyleSheet("")
|
self.frame_fade.setStyleSheet("")
|
||||||
@ -786,13 +786,13 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
if (
|
if (
|
||||||
playing_track.now.track_id is None
|
track_sequence.now.track_id is None
|
||||||
or playing_track.now.start_time is None
|
or track_sequence.now.start_time is None
|
||||||
):
|
):
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
track_start = playing_track.now.start_time
|
track_start = track_sequence.now.start_time
|
||||||
elapsed_seconds = (now - track_start).total_seconds()
|
elapsed_seconds = (now - track_start).total_seconds()
|
||||||
return int(elapsed_seconds * 1000)
|
return int(elapsed_seconds * 1000)
|
||||||
|
|
||||||
@ -946,7 +946,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
plr
|
plr
|
||||||
for plr in playlistrows
|
for plr in playlistrows
|
||||||
if plr.id
|
if plr.id
|
||||||
not in [playing_track.now.plr_id, playing_track.next.plr_id]
|
not in [track_sequence.now.plr_id, track_sequence.next.plr_id]
|
||||||
]
|
]
|
||||||
|
|
||||||
rows_to_delete = [
|
rows_to_delete = [
|
||||||
@ -1154,10 +1154,10 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# If there is no next track set, return.
|
# If there is no next track set, return.
|
||||||
if not playing_track.next.track_id:
|
if not track_sequence.next.track_id:
|
||||||
log.debug("musicmuster.play_next(): no next track selected")
|
log.debug("musicmuster.play_next(): no next track selected")
|
||||||
return
|
return
|
||||||
if not playing_track.next.path:
|
if not track_sequence.next.path:
|
||||||
log.debug("musicmuster.play_next(): no path for next track")
|
log.debug("musicmuster.play_next(): no path for next track")
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -1167,7 +1167,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
# Move next track to current track.
|
# Move next track to current track.
|
||||||
# stop_playing() above has called end_of_track_actions()
|
# stop_playing() above has called end_of_track_actions()
|
||||||
# which will have populated self.previous_track
|
# which will have populated self.previous_track
|
||||||
playing_track.now = playing_track.next
|
track_sequence.now = track_sequence.next
|
||||||
|
|
||||||
# Clear next track
|
# Clear next track
|
||||||
self.clear_next()
|
self.clear_next()
|
||||||
@ -1183,10 +1183,10 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
self.btnDrop3db.setChecked(False)
|
self.btnDrop3db.setChecked(False)
|
||||||
|
|
||||||
# Play (new) current track
|
# Play (new) current track
|
||||||
if not playing_track.now.path:
|
if not track_sequence.now.path:
|
||||||
return
|
return
|
||||||
playing_track.now.start()
|
track_sequence.now.start()
|
||||||
self.music.play(playing_track.now.path, position)
|
self.music.play(track_sequence.now.path, position)
|
||||||
|
|
||||||
# Ensure 100% volume
|
# Ensure 100% volume
|
||||||
# For as-yet unknown reasons. sometimes the volume gets
|
# For as-yet unknown reasons. sometimes the volume gets
|
||||||
@ -1203,8 +1203,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
sleep(0.1)
|
sleep(0.1)
|
||||||
|
|
||||||
# Show closing volume graph
|
# Show closing volume graph
|
||||||
if playing_track.now.fade_graph:
|
if track_sequence.now.fade_graph:
|
||||||
playing_track.now.fade_graph.plot()
|
track_sequence.now.fade_graph.plot()
|
||||||
|
|
||||||
# Notify model
|
# Notify model
|
||||||
self.active_model().current_track_started()
|
self.active_model().current_track_started()
|
||||||
@ -1230,7 +1230,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
track_path = self.active_tab().get_selected_row_track_path()
|
track_path = self.active_tab().get_selected_row_track_path()
|
||||||
if not track_path:
|
if not track_path:
|
||||||
# Otherwise get path to next track to play
|
# Otherwise get path to next track to play
|
||||||
track_path = playing_track.next.path
|
track_path = track_sequence.next.path
|
||||||
if not track_path:
|
if not track_path:
|
||||||
self.btnPreview.setChecked(False)
|
self.btnPreview.setChecked(False)
|
||||||
return
|
return
|
||||||
@ -1606,14 +1606,14 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
|
|
||||||
# Update volume fade curve
|
# Update volume fade curve
|
||||||
if (
|
if (
|
||||||
playing_track.now.track_id
|
track_sequence.now.track_id
|
||||||
and playing_track.now.fade_graph
|
and track_sequence.now.fade_graph
|
||||||
and playing_track.now.start_time
|
and track_sequence.now.start_time
|
||||||
):
|
):
|
||||||
play_time = (
|
play_time = (
|
||||||
datetime.now() - playing_track.now.start_time
|
datetime.now() - track_sequence.now.start_time
|
||||||
).total_seconds() * 1000
|
).total_seconds() * 1000
|
||||||
playing_track.now.fade_graph.tick(play_time)
|
track_sequence.now.fade_graph.tick(play_time)
|
||||||
|
|
||||||
def tick_500ms(self) -> None:
|
def tick_500ms(self) -> None:
|
||||||
"""
|
"""
|
||||||
@ -1645,22 +1645,22 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
# starting play.
|
# starting play.
|
||||||
if (
|
if (
|
||||||
self.music.player
|
self.music.player
|
||||||
and playing_track.now.start_time
|
and track_sequence.now.start_time
|
||||||
and (
|
and (
|
||||||
self.music.player.is_playing()
|
self.music.player.is_playing()
|
||||||
or (datetime.now() - playing_track.now.start_time)
|
or (datetime.now() - track_sequence.now.start_time)
|
||||||
< timedelta(microseconds=Config.PLAY_SETTLE)
|
< timedelta(microseconds=Config.PLAY_SETTLE)
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
playtime = self.get_playtime()
|
playtime = self.get_playtime()
|
||||||
time_to_fade = playing_track.now.fade_at - playtime
|
time_to_fade = track_sequence.now.fade_at - playtime
|
||||||
time_to_silence = playing_track.now.silence_at - playtime
|
time_to_silence = track_sequence.now.silence_at - playtime
|
||||||
|
|
||||||
# Elapsed time
|
# Elapsed time
|
||||||
self.label_elapsed_timer.setText(
|
self.label_elapsed_timer.setText(
|
||||||
helpers.ms_to_mmss(playtime)
|
helpers.ms_to_mmss(playtime)
|
||||||
+ " / "
|
+ " / "
|
||||||
+ helpers.ms_to_mmss(playing_track.now.duration)
|
+ helpers.ms_to_mmss(track_sequence.now.duration)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Time to fade
|
# Time to fade
|
||||||
@ -1703,25 +1703,25 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
Update last / current / next track headers
|
Update last / current / next track headers
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if playing_track.previous.title and playing_track.previous.artist:
|
if track_sequence.previous.title and track_sequence.previous.artist:
|
||||||
self.hdrPreviousTrack.setText(
|
self.hdrPreviousTrack.setText(
|
||||||
f"{playing_track.previous.title} - {playing_track.previous.artist}"
|
f"{track_sequence.previous.title} - {track_sequence.previous.artist}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.hdrPreviousTrack.setText("")
|
self.hdrPreviousTrack.setText("")
|
||||||
|
|
||||||
if playing_track.now.title and playing_track.now.artist:
|
if track_sequence.now.title and track_sequence.now.artist:
|
||||||
self.hdrCurrentTrack.setText(
|
self.hdrCurrentTrack.setText(
|
||||||
f"{playing_track.now.title.replace('&', '&&')} - "
|
f"{track_sequence.now.title.replace('&', '&&')} - "
|
||||||
f"{playing_track.now.artist.replace('&', '&&')}"
|
f"{track_sequence.now.artist.replace('&', '&&')}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.hdrCurrentTrack.setText("")
|
self.hdrCurrentTrack.setText("")
|
||||||
|
|
||||||
if playing_track.next.title and playing_track.next.artist:
|
if track_sequence.next.title and track_sequence.next.artist:
|
||||||
self.hdrNextTrack.setText(
|
self.hdrNextTrack.setText(
|
||||||
f"{playing_track.next.title.replace('&', '&&')} - "
|
f"{track_sequence.next.title.replace('&', '&&')} - "
|
||||||
f"{playing_track.next.artist.replace('&', '&&')}"
|
f"{track_sequence.next.artist.replace('&', '&&')}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
self.hdrNextTrack.setText("")
|
self.hdrNextTrack.setText("")
|
||||||
|
|||||||
@ -14,7 +14,7 @@ from PyQt6.QtGui import (
|
|||||||
QFont,
|
QFont,
|
||||||
)
|
)
|
||||||
|
|
||||||
from classes import playing_track, MusicMusterSignals, PlaylistTrack
|
from classes import track_sequence, MusicMusterSignals, PlaylistTrack
|
||||||
from config import Config
|
from config import Config
|
||||||
from dbconfig import scoped_session, Session
|
from dbconfig import scoped_session, Session
|
||||||
from helpers import file_is_unreadable
|
from helpers import file_is_unreadable
|
||||||
@ -191,10 +191,10 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
if file_is_unreadable(prd.path):
|
if file_is_unreadable(prd.path):
|
||||||
return QBrush(QColor(Config.COLOUR_UNREADABLE))
|
return QBrush(QColor(Config.COLOUR_UNREADABLE))
|
||||||
# Current track
|
# Current track
|
||||||
if prd.plrid == playing_track.now.plr_id:
|
if prd.plrid == track_sequence.now.plr_id:
|
||||||
return QBrush(QColor(Config.COLOUR_CURRENT_PLAYLIST))
|
return QBrush(QColor(Config.COLOUR_CURRENT_PLAYLIST))
|
||||||
# Next track
|
# Next track
|
||||||
if prd.plrid == playing_track.next.plr_id:
|
if prd.plrid == track_sequence.next.plr_id:
|
||||||
return QBrush(QColor(Config.COLOUR_NEXT_PLAYLIST))
|
return QBrush(QColor(Config.COLOUR_NEXT_PLAYLIST))
|
||||||
|
|
||||||
# Individual cell colouring
|
# Individual cell colouring
|
||||||
@ -231,28 +231,28 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Sanity check
|
# Sanity check
|
||||||
if not playing_track.now.track_id:
|
if not track_sequence.now.track_id:
|
||||||
log.error(
|
log.error(
|
||||||
"playlistmodel:current_track_started called with no current track"
|
"playlistmodel:current_track_started called with no current track"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
if playing_track.now.plr_rownum is None:
|
if track_sequence.now.plr_rownum is None:
|
||||||
log.error(
|
log.error(
|
||||||
"playlistmodel:current_track_started called with no row number "
|
"playlistmodel:current_track_started called with no row number "
|
||||||
f"({playing_track.now=})"
|
f"({track_sequence.now=})"
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
# Update display
|
# Update display
|
||||||
self.invalidate_row(playing_track.now.plr_rownum)
|
self.invalidate_row(track_sequence.now.plr_rownum)
|
||||||
|
|
||||||
# Update track times
|
# Update track times
|
||||||
# TODO
|
# TODO
|
||||||
|
|
||||||
# Update Playdates in database
|
# Update Playdates in database
|
||||||
with Session() as session:
|
with Session() as session:
|
||||||
Playdates(session, playing_track.now.track_id)
|
Playdates(session, track_sequence.now.track_id)
|
||||||
plr = session.get(PlaylistRows, playing_track.now.plr_id)
|
plr = session.get(PlaylistRows, track_sequence.now.plr_id)
|
||||||
if plr:
|
if plr:
|
||||||
plr.played = True
|
plr.played = True
|
||||||
|
|
||||||
@ -271,7 +271,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
[
|
[
|
||||||
a
|
a
|
||||||
for a in unplayed_rows
|
for a in unplayed_rows
|
||||||
if a > playing_track.now.plr_rownum
|
if a > track_sequence.now.plr_rownum
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
@ -591,7 +591,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
|
|
||||||
# Update playing_trtack
|
# Update playing_trtack
|
||||||
with Session() as session:
|
with Session() as session:
|
||||||
playing_track.next = PlaylistTrack()
|
track_sequence.next = PlaylistTrack()
|
||||||
try:
|
try:
|
||||||
plrid = self.playlist_rows[row_number].plrid
|
plrid = self.playlist_rows[row_number].plrid
|
||||||
except IndexError:
|
except IndexError:
|
||||||
@ -608,7 +608,7 @@ class PlaylistModel(QAbstractTableModel):
|
|||||||
# Check track is readable
|
# Check track is readable
|
||||||
if file_is_unreadable(plr.track.path):
|
if file_is_unreadable(plr.track.path):
|
||||||
return
|
return
|
||||||
playing_track.next.set_plr(session, plr)
|
track_sequence.next.set_plr(session, plr)
|
||||||
self.signals.next_track_changed_signal.emit()
|
self.signals.next_track_changed_signal.emit()
|
||||||
self.invalidate_row(row_number)
|
self.invalidate_row(row_number)
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user