Compare commits

..

No commits in common. "c5f89dbcf47b65b6388b0cc81ba309a98aa0b36e" and "0978e93ee7c09f5ade5b77975eaf7d290112fcbb" have entirely different histories.

3 changed files with 57 additions and 93 deletions

6
.envrc
View File

@ -5,11 +5,7 @@ export MAIL_SERVER="smtp.fastmail.com"
export MAIL_USERNAME="kae@midnighthax.com" export MAIL_USERNAME="kae@midnighthax.com"
export MAIL_USE_TLS=True export MAIL_USE_TLS=True
branch=$(git branch --show-current) branch=$(git branch --show-current)
# Always treat running from /home/kae/mm as production if on_git_branch master; then
if [ $(pwd) == /home/kae/mm ]; then
export MM_ENV="PRODUCTION"
export MM_DB="mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_prod"
elif on_git_branch master; then
export MM_ENV="PRODUCTION" export MM_ENV="PRODUCTION"
export MM_DB="mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_prod" export MM_DB="mysql+mysqldb://musicmuster:musicmuster@localhost/musicmuster_prod"
else else

View File

@ -740,8 +740,13 @@ class Window(QMainWindow, Ui_MainWindow):
self.playing = False self.playing = False
# Remove currently playing track colour # Remove currently playing track colour
if self.current_track.playlist_tab: if (
self.current_track.playlist_tab.play_ended() self.current_track and
self.current_track.playlist_tab and
self.current_track.plr_id
):
self.current_track.playlist_tab.reset_plr_row_colour(
self.current_track.plr_id)
# Reset PlaylistTrack objects # Reset PlaylistTrack objects
if self.current_track.track_id: if self.current_track.track_id:
@ -1271,7 +1276,8 @@ class Window(QMainWindow, Ui_MainWindow):
self.current_track.playlist_tab != self.visible_playlist_tab() self.current_track.playlist_tab != self.visible_playlist_tab()
and self.previous_track.plr_id and self.previous_track.plr_id
): ):
self.previous_track.playlist_tab.reset_next() self.previous_track.playlist_tab.reset_plr_row_colour(
self.previous_track.plr_id)
# Update headers # Update headers
self.update_headers() self.update_headers()
@ -1519,7 +1525,7 @@ class Window(QMainWindow, Ui_MainWindow):
def this_is_the_next_playlist_row(self, session: scoped_session, def this_is_the_next_playlist_row(self, session: scoped_session,
plr: PlaylistRows, plr: PlaylistRows,
next_track_playlist_tab: PlaylistTab) -> None: playlist_tab: PlaylistTab) -> None:
""" """
This is notification from a playlist tab that it holds the next This is notification from a playlist tab that it holds the next
playlist row to be played. playlist row to be played.
@ -1528,7 +1534,7 @@ class Window(QMainWindow, Ui_MainWindow):
- Clear next track if on other tab - Clear next track if on other tab
- Reset tab colour if on other tab - Reset tab colour if on other tab
- Note next playlist tab - Note next playlist tab
- Set next next_track_playlist_tab tab colour - Set next playlist_tab tab colour
- Note next track - Note next track
- Update headers - Update headers
- Populate info tabs - Populate info tabs
@ -1538,24 +1544,24 @@ class Window(QMainWindow, Ui_MainWindow):
if plr.track_id is None: if plr.track_id is None:
return return
# If we already have a next tab lined up and it's neither # Clean up if we are replacing an existing "next track"
# the "new" next tab nor the current track tab then we need original_next_track_playlist_tab = None
# to reset the tab colour.
if ( if (
# If we already have a next tab lined up and it's neither
# the "new" next tab nor the current track tab then we need
# to reset the tab colour.
self.next_track.playlist_tab and self.next_track.playlist_tab and
self.next_track.playlist_tab != next_track_playlist_tab and self.next_track.playlist_tab != playlist_tab and
self.next_track.playlist_tab != self.current_track.playlist_tab self.next_track.playlist_tab != self.current_track.playlist_tab
): ):
original_next_track_playlist_tab = self.next_track.playlist_tab
self.set_tab_colour(self.next_track.playlist_tab, self.set_tab_colour(self.next_track.playlist_tab,
QColor(Config.COLOUR_NORMAL_TAB)) QColor(Config.COLOUR_NORMAL_TAB))
# Discard now-incorrect next_track PlaylistTrack and tell # Discard now-incorrect next_track PlaylistTrack
# playlist_tab too
self.next_track.playlist_tab.reset_next()
self.clear_next() self.clear_next()
# Populate self.next_track self.next_track.set_plr(session, plr, playlist_tab)
self.next_track.set_plr(session, plr, next_track_playlist_tab)
if self.next_track.playlist_tab: if self.next_track.playlist_tab:
if self.current_track.playlist_tab != self.next_track.playlist_tab: if self.current_track.playlist_tab != self.next_track.playlist_tab:
self.set_tab_colour(self.next_track.playlist_tab, self.set_tab_colour(self.next_track.playlist_tab,

View File

@ -339,17 +339,11 @@ class PlaylistTab(QTableWidget):
self._set_row_start_time(row, start_time) self._set_row_start_time(row, start_time)
else: else:
self._set_row_start_time(row, None) self._set_row_start_time(row, None)
self._set_row_note_colour(session, row, new_text,
section_header=not bool(track_id))
# Update note display # Update note display
# If this is a header row, also calcuate track times in case self._set_row_note(session, row, new_text)
# If this is a header row, ecalcuate track times in case
# note added a start time # note added a start time
if track_id: if not track_id:
self._set_row_note_colour(session, row, new_text,
section_header=False)
else:
self._set_row_note_colour(session, row, new_text,
section_header=True)
self._update_start_end_times() self._update_start_end_times()
else: else:
track = None track = None
@ -522,8 +516,6 @@ class PlaylistTab(QTableWidget):
row_number = self.get_new_row_number() row_number = self.get_new_row_number()
plr = PlaylistRows(session, self.playlist_id, None, row_number, note) plr = PlaylistRows(session, self.playlist_id, None, row_number, note)
self.insert_row(session, plr) self.insert_row(session, plr)
self._set_row_note_colour(session, row_number, note,
section_header=True)
self.save_playlist(session) self.save_playlist(session)
def insert_row(self, session: scoped_session, plr: PlaylistRows, def insert_row(self, session: scoped_session, plr: PlaylistRows,
@ -542,9 +534,6 @@ class PlaylistTab(QTableWidget):
self._set_row_bold(row) self._set_row_bold(row)
else: else:
_ = self._set_row_userdata(row, self.PLAYED, True) _ = self._set_row_userdata(row, self.PLAYED, True)
if plr.note is None:
plr.note = ""
self._set_row_note_colour(session, row, plr.note)
else: else:
# This is a section header so it must have note text # This is a section header so it must have note text
if plr.note is None: if plr.note is None:
@ -558,8 +547,7 @@ class PlaylistTab(QTableWidget):
self._set_item_text(row, i, None) self._set_item_text(row, i, None)
self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1) self.setSpan(row, HEADER_NOTES_COLUMN, 1, len(columns) - 1)
_ = self._set_row_note_colour(session, row, plr.note, _ = self._set_row_note(session, row, plr.note, section_header=True)
section_header=True)
# Save (or clear) track_id # Save (or clear) track_id
_ = self._set_row_track_id(row, 0) _ = self._set_row_track_id(row, 0)
@ -609,15 +597,16 @@ class PlaylistTab(QTableWidget):
# Let display update, then save playlist # Let display update, then save playlist
QTimer.singleShot(0, lambda: self.save_playlist(session)) QTimer.singleShot(0, lambda: self.save_playlist(session))
def play_ended(self) -> None: def mark_unnext(self) -> None:
""" """
Called by musicmuster when play has ended Unmark passed row as next track
""" """
row = self._get_current_track_row_number() row = self._get_next_track_row_number()
if not row: if not row:
return return
self._set_row_colour_default(row) self.musicmuster.clear_next()
self._set_row_colour(row, None)
self.clear_selection() self.clear_selection()
def play_started(self, session: scoped_session) -> None: def play_started(self, session: scoped_session) -> None:
@ -649,7 +638,8 @@ class PlaylistTab(QTableWidget):
self._set_next(session, next_row) self._set_next(session, next_row)
# Display row as current track # Display row as current track
self._set_row_colour_current(current_row) self._set_row_colour(current_row,
QColor(Config.COLOUR_CURRENT_PLAYLIST))
# Update start/stop times # Update start/stop times
self._update_start_end_times() self._update_start_end_times()
@ -709,17 +699,14 @@ class PlaylistTab(QTableWidget):
for row in sorted(row_numbers, reverse=True): for row in sorted(row_numbers, reverse=True):
self.removeRow(row) self.removeRow(row)
def reset_next(self) -> None: def reset_plr_row_colour(self, plr_id: int) -> None:
""" """Reset background of row pointed to by plr_id"""
Unmark next track
"""
row = self._get_next_track_row_number() row = self._plrid_to_row_number(plr_id)
if not row: if not row:
return return
self.musicmuster.clear_next()
self._set_row_colour_default(row) self._set_row_colour(row, None)
self.clear_selection()
def save_playlist(self, session: scoped_session) -> None: def save_playlist(self, session: scoped_session) -> None:
""" """
@ -894,8 +881,8 @@ class PlaylistTab(QTableWidget):
# Update attributes of row # Update attributes of row
self._set_row_bold(row) self._set_row_bold(row)
self._set_row_colour_default(plr.row_number) self._set_row_colour(plr.row_number, None)
_ = self._set_row_note_colour(session, row, plr.note) _ = self._set_row_note(session, row, plr.note)
self._update_row_track_info(session, row, track) self._update_row_track_info(session, row, track)
self.clear_selection() self.clear_selection()
@ -969,7 +956,7 @@ class PlaylistTab(QTableWidget):
# Unmark as next # Unmark as next
if next_row: if next_row:
self._add_context_menu("Unmark as next track", self._add_context_menu("Unmark as next track",
self.reset_next) self.mark_unnext)
# ---------------------- # ----------------------
self.menu.addSeparator() self.menu.addSeparator()
@ -1523,12 +1510,12 @@ class PlaylistTab(QTableWidget):
"""Rescan track""" """Rescan track"""
with Session() as session: with Session() as session:
row_colour = None
track = session.get(Tracks, track_id) track = session.get(Tracks, track_id)
if track: if track:
if not file_is_readable(track.path): if not file_is_readable(track.path):
self._set_row_colour_unreadable(row) row_colour = QColor(Config.COLOUR_UNREADABLE)
else: else:
self._set_row_colour_default(row)
set_track_metadata(session, track) set_track_metadata(session, track)
self._update_row_track_info(session, row, track) self._update_row_track_info(session, row, track)
else: else:
@ -1538,13 +1525,14 @@ class PlaylistTab(QTableWidget):
note_text = "" note_text = ""
else: else:
note_text += f"{track_id=} not found" note_text += f"{track_id=} not found"
self._set_row_note_colour(session, row, note_text) self._set_row_note(session, row, note_text)
log.error( log.error(
f"playlists._rescan({track_id=}): " f"playlists._rescan({track_id=}): "
"Track not found" "Track not found"
) )
self._set_row_colour_unreadable(row) row_colour = QColor(Config.COLOUR_UNREADABLE)
self._set_row_colour(row, row_colour)
self.clear_selection() self.clear_selection()
def _run_subprocess(self, args): def _run_subprocess(self, args):
@ -1737,7 +1725,7 @@ class PlaylistTab(QTableWidget):
# Clear any existing next track # Clear any existing next track
next_track_row = self._get_next_track_row_number() next_track_row = self._get_next_track_row_number()
if next_track_row: if next_track_row:
self._set_row_colour_default(next_track_row) self._set_row_colour(next_track_row, None)
# Notify musicmuster # Notify musicmuster
plr = self._get_row_plr(session, row_number) plr = self._get_row_plr(session, row_number)
@ -1747,7 +1735,7 @@ class PlaylistTab(QTableWidget):
self.musicmuster.this_is_the_next_playlist_row(session, plr, self) self.musicmuster.this_is_the_next_playlist_row(session, plr, self)
# Display row as next track # Display row as next track
self._set_row_colour_next(row_number) self._set_row_colour(row_number, QColor(Config.COLOUR_NEXT_PLAYLIST))
# Update start/stop times # Update start/stop times
self.clear_selection() self.clear_selection()
@ -1830,40 +1818,13 @@ class PlaylistTab(QTableWidget):
brush = QBrush() brush = QBrush()
for column in range(1, self.columnCount()): for column in range(1, self.columnCount()):
if column in [START_GAP, BITRATE]: # Don't change colour on start gap columns
if column == START_GAP:
continue continue
item = self.item(row, column) item = self.item(row, column)
if item: if item:
item.setBackground(brush) item.setBackground(brush)
def _set_row_colour_current(self, row: int) -> None:
"""
Set current track row colour
"""
self._set_row_colour(row, QColor(Config.COLOUR_CURRENT_PLAYLIST))
def _set_row_colour_default(self, row: int) -> None:
"""
Set default row colour
"""
self._set_row_colour(row, None)
def _set_row_colour_next(self, row: int) -> None:
"""
Set next track row colour
"""
self._set_row_colour(row, QColor(Config.COLOUR_NEXT_PLAYLIST))
def _set_row_colour_unreadable(self, row: int) -> None:
"""
Set unreadable row colour
"""
self._set_row_colour(row, QColor(Config.COLOUR_UNREADABLE))
def _set_row_duration(self, row: int, def _set_row_duration(self, row: int,
ms: Optional[int]) -> QTableWidgetItem: ms: Optional[int]) -> QTableWidgetItem:
"""Set duration of this row. Also set in row metadata""" """Set duration of this row. Also set in row metadata"""
@ -1900,10 +1861,10 @@ class PlaylistTab(QTableWidget):
self._set_row_bold(row, False) self._set_row_bold(row, False)
def _set_row_note_colour(self, session: scoped_session, row: int, def _set_row_note(self, session: scoped_session, row: int,
note_text: Optional[str], note_text: Optional[str],
section_header: bool = False) -> QTableWidgetItem: section_header: bool = False) -> QTableWidgetItem:
"""Set row note and colour""" """Set row note"""
if section_header: if section_header:
column = HEADER_NOTES_COLUMN column = HEADER_NOTES_COLUMN
@ -1916,9 +1877,10 @@ class PlaylistTab(QTableWidget):
notes_item = self._set_item_text(row, column, note_text) notes_item = self._set_item_text(row, column, note_text)
note_colour = NoteColours.get_colour(session, note_text) note_colour = NoteColours.get_colour(session, note_text)
if section_header:
if section_header and not note_colour:
note_colour = Config.COLOUR_NOTES_PLAYLIST note_colour = Config.COLOUR_NOTES_PLAYLIST
else:
note_colour = NoteColours.get_colour(session, note_text)
if note_colour: if note_colour:
notes_item.setBackground(QColor(note_colour)) notes_item.setBackground(QColor(note_colour))
@ -2073,7 +2035,7 @@ class PlaylistTab(QTableWidget):
_ = self._set_row_track_path(row, track.path) _ = self._set_row_track_path(row, track.path)
if not file_is_readable(track.path): if not file_is_readable(track.path):
self._set_row_colour_unreadable(row) self._set_row_colour(row, QColor(Config.COLOUR_UNREADABLE))
def _update_section_headers(self, session: scoped_session) -> None: def _update_section_headers(self, session: scoped_session) -> None:
""" """