Compare commits
No commits in common. "0fb1536055d0e0121bab0ecb0b12b6ff15a94f4e" and "75b814e26ca833fbba4c6a8a36a1aca3e4886833" have entirely different histories.
0fb1536055
...
75b814e26c
@ -4,7 +4,6 @@ import sqlalchemy
|
||||
|
||||
from config import Config
|
||||
from contextlib import contextmanager
|
||||
from log import DEBUG
|
||||
from sqlalchemy.orm import (sessionmaker, scoped_session)
|
||||
|
||||
MM_ENV = os.environ.get('MM_ENV', 'PRODUCTION')
|
||||
@ -13,7 +12,7 @@ testing = False
|
||||
if MM_ENV == 'PRODUCTION':
|
||||
dbname = os.environ.get('MM_PRODUCTION_DBNAME', 'musicmuster_prod')
|
||||
dbuser = os.environ.get('MM_PRODUCTION_DBUSER', 'musicmuster')
|
||||
dbpw = os.environ.get('MM_PRODUCTION_DBPW', 'xxxmusicmuster')
|
||||
dbpw = os.environ.get('MM_PRODUCTION_DBPW', 'musicmuster')
|
||||
dbhost = os.environ.get('MM_PRODUCTION_DBHOST', 'localhost')
|
||||
elif MM_ENV == 'TESTING':
|
||||
dbname = os.environ.get('MM_TESTING_DBNAME', 'musicmuster_testing')
|
||||
@ -46,9 +45,12 @@ def Session():
|
||||
file = frame.filename
|
||||
function = frame.function
|
||||
lineno = frame.lineno
|
||||
DEBUG(f"Session acquired, {file=}, {function=}, {lineno=}")
|
||||
print(f"Session acquired, {file=}, {function=}, {lineno=}")
|
||||
# yield scoped_session(sessionmaker(bind=engine))
|
||||
Session = scoped_session(sessionmaker(bind=engine))
|
||||
yield Session
|
||||
DEBUG(" Session released")
|
||||
print(" Session released")
|
||||
Session.commit()
|
||||
print(" Session committed")
|
||||
Session.close()
|
||||
print(" Session closed")
|
||||
|
||||
@ -518,6 +518,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
DEBUG("musicmuster.play_next(): no next track selected", True)
|
||||
return
|
||||
|
||||
self.kae()
|
||||
|
||||
with Session() as session:
|
||||
# If there's currently a track playing, fade it.
|
||||
self.stop_playing(fade=True)
|
||||
|
||||
@ -18,7 +18,6 @@ from PyQt5.QtWidgets import (
|
||||
|
||||
import helpers
|
||||
import os
|
||||
import re
|
||||
|
||||
from config import Config
|
||||
from datetime import datetime, timedelta
|
||||
@ -34,8 +33,6 @@ from models import (
|
||||
)
|
||||
from dbconfig import Session
|
||||
|
||||
start_time_re = re.compile(r"@\d\d:\d\d\:\d\d")
|
||||
|
||||
|
||||
class RowMeta:
|
||||
CLEAR = 0
|
||||
@ -272,7 +269,7 @@ class PlaylistTab(QTableWidget):
|
||||
"""
|
||||
Create note
|
||||
|
||||
If a row is selected, set note row to be row above. Otherwise,
|
||||
If a row is selected, set note row to be rows above. Otherwise,
|
||||
set note row to be end of playlist.
|
||||
"""
|
||||
|
||||
@ -682,8 +679,6 @@ class PlaylistTab(QTableWidget):
|
||||
note_text: str
|
||||
row: int
|
||||
row_time: Optional[datetime]
|
||||
section_start_row: Optional[int] = None
|
||||
section_time: int = 0
|
||||
start_time: Optional[datetime]
|
||||
start_times_row: Optional[int]
|
||||
track: Optional[Tracks]
|
||||
@ -705,22 +700,12 @@ class PlaylistTab(QTableWidget):
|
||||
|
||||
# Render notes in correct colour
|
||||
if row in notes:
|
||||
# Extract note text from database to ignore section timings
|
||||
note_text = self._get_row_notes_object(row, session).note
|
||||
# Extract note text
|
||||
note_text = self.item(row, self.COL_TITLE).text()
|
||||
# Does the note have a start time?
|
||||
row_time = self._get_note_text_time(note_text)
|
||||
if row_time:
|
||||
next_start_time = row_time
|
||||
# Does it delimit a section?
|
||||
if section_start_row is not None:
|
||||
if note_text.endswith("-"):
|
||||
self._set_timed_section(session, section_start_row,
|
||||
section_time)
|
||||
section_start_row = None
|
||||
section_time = 0
|
||||
elif note_text.endswith("+"):
|
||||
section_start_row = row
|
||||
section_time = 0
|
||||
# Set colour
|
||||
note_colour = NoteColours.get_colour(session, note_text)
|
||||
if not note_colour:
|
||||
@ -730,23 +715,16 @@ class PlaylistTab(QTableWidget):
|
||||
)
|
||||
# Notes are always bold
|
||||
self._set_row_bold(row)
|
||||
continue
|
||||
|
||||
# Render unplayable tracks in correct colour
|
||||
if row in unreadable:
|
||||
elif row in unreadable:
|
||||
self._set_row_colour(
|
||||
row, QColor(Config.COLOUR_UNREADABLE)
|
||||
)
|
||||
self._set_row_bold(row)
|
||||
continue
|
||||
|
||||
# Current row is a track row
|
||||
track = self._get_row_track_object(row, session)
|
||||
# Add track time to section time if in timed section
|
||||
if section_start_row is not None:
|
||||
section_time += track.duration
|
||||
# Render current track
|
||||
if row == current_row:
|
||||
elif row == current_row:
|
||||
# Set start time
|
||||
self._set_row_start_time(
|
||||
row, self.current_track_start_time)
|
||||
@ -758,6 +736,7 @@ class PlaylistTab(QTableWidget):
|
||||
last_played_str)
|
||||
|
||||
# Calculate next_start_time
|
||||
track = self._get_row_track_object(row, session)
|
||||
next_start_time = self._calculate_track_end_time(
|
||||
track, self.current_track_start_time)
|
||||
|
||||
@ -770,10 +749,9 @@ class PlaylistTab(QTableWidget):
|
||||
|
||||
# Make bold
|
||||
self._set_row_bold(row)
|
||||
continue
|
||||
|
||||
# Render next track
|
||||
if row == next_row:
|
||||
elif row == next_row:
|
||||
# if there's a track playing, set start time from that
|
||||
if current_row:
|
||||
start_time = self.current_track_start_time
|
||||
@ -786,6 +764,7 @@ class PlaylistTab(QTableWidget):
|
||||
self._set_row_start_time(row, start_time)
|
||||
|
||||
# Set end time
|
||||
track = self._get_row_track_object(row, session)
|
||||
next_start_time = self._calculate_track_end_time(
|
||||
track, start_time)
|
||||
self._set_row_end_time(row, next_start_time)
|
||||
@ -799,6 +778,7 @@ class PlaylistTab(QTableWidget):
|
||||
|
||||
else:
|
||||
# This is a track row other than next or current
|
||||
track = self._get_row_track_object(row, session)
|
||||
if row in played:
|
||||
# Played today, so update last played column
|
||||
last_playedtime = Playdates.last_played(
|
||||
@ -829,11 +809,6 @@ class PlaylistTab(QTableWidget):
|
||||
self._set_row_colour(
|
||||
row, QColor(Config.COLOUR_EVEN_PLAYLIST))
|
||||
|
||||
# Have we had a section start but not end?
|
||||
if section_start_row is not None:
|
||||
self._set_timed_section(
|
||||
session, section_start_row, section_time, no_end=True)
|
||||
|
||||
# ########## Internally called functions ##########
|
||||
|
||||
def _audacity(self, row: int) -> None:
|
||||
@ -899,7 +874,7 @@ class PlaylistTab(QTableWidget):
|
||||
if row in self._get_notes_rows():
|
||||
# Save change to database
|
||||
DEBUG(f"Notes.update_note: saving new note text '{new_text=}'")
|
||||
note: Notes = self._get_row_notes_object(row, session)
|
||||
note: Notes = self._get_notes_row_object(row, session)
|
||||
note.update_note(session, row, new_text)
|
||||
# Set/clear row start time accordingly
|
||||
start_time = self._get_note_text_time(new_text)
|
||||
@ -917,7 +892,7 @@ class PlaylistTab(QTableWidget):
|
||||
"start time"
|
||||
)
|
||||
else:
|
||||
track: Tracks = self._get_row_track_object(row, session)
|
||||
track: Tracks = self._get_track_row_object(row, session)
|
||||
if column == self.COL_ARTIST:
|
||||
track.update_artist(session, artist=new_text)
|
||||
elif column == self.COL_TITLE:
|
||||
@ -951,19 +926,6 @@ class PlaylistTab(QTableWidget):
|
||||
# Disable play controls so that keyboard input doesn't disturb playing
|
||||
self.musicmuster.disable_play_next_controls()
|
||||
|
||||
# If this is a note cell and it's a section start, we need to
|
||||
# remove any existing section timing so user can't edit that.
|
||||
# Section timing is only in display of item, not in note text in
|
||||
# database. Keep it simple: if this is a note, pull text from
|
||||
# database.
|
||||
|
||||
if self._is_note_row(row):
|
||||
item = self.item(row, self.COL_TITLE)
|
||||
with Session() as session:
|
||||
note_object = self._get_row_notes_object(row, session)
|
||||
if note_object:
|
||||
item.setText(note_object.note)
|
||||
|
||||
def _clear_current_track_row(self) -> None:
|
||||
"""
|
||||
Clear current row if there is one.
|
||||
@ -1104,15 +1066,14 @@ class PlaylistTab(QTableWidget):
|
||||
|
||||
@staticmethod
|
||||
def _get_note_text_time(text: str) -> Optional[datetime]:
|
||||
"""Return time specified as @hh:mm:ss in text"""
|
||||
|
||||
match = start_time_re.search(text)
|
||||
if not match:
|
||||
return None
|
||||
"""Return time specified at the end of text"""
|
||||
|
||||
try:
|
||||
return datetime.strptime(match.group(0)[1:],
|
||||
Config.NOTE_TIME_FORMAT)
|
||||
time_length = len(Config.NOTE_TIME_FORMAT)
|
||||
return datetime.strptime(
|
||||
text[(-time_length):],
|
||||
Config.NOTE_TIME_FORMAT
|
||||
)
|
||||
except ValueError:
|
||||
return None
|
||||
|
||||
@ -1270,16 +1231,6 @@ class PlaylistTab(QTableWidget):
|
||||
and pos.y() >= rect.center().y() # noqa W503
|
||||
)
|
||||
|
||||
def _is_note_row(self, row: int) -> bool:
|
||||
"""
|
||||
Return True if passed row is a note row, else False
|
||||
"""
|
||||
|
||||
if self._meta_get(row):
|
||||
if self._meta_get(row) & (1 << RowMeta.NOTE):
|
||||
return True
|
||||
return False
|
||||
|
||||
def _meta_clear_attribute(self, row: int, attribute: int) -> None:
|
||||
"""Clear given metadata for row"""
|
||||
|
||||
@ -1551,21 +1502,6 @@ class PlaylistTab(QTableWidget):
|
||||
item: QTableWidgetItem = QTableWidgetItem(time_str)
|
||||
self.setItem(row, self.COL_START_TIME, item)
|
||||
|
||||
def _set_timed_section(self, session, start_row, ms, no_end=False):
|
||||
"""Add duration to a marked section"""
|
||||
|
||||
duration = helpers.ms_to_mmss(ms)
|
||||
note_object = self._get_row_notes_object(start_row, session)
|
||||
if not note_object:
|
||||
ERROR("Can't get note_object in playlists._set_timed_section")
|
||||
note_text = note_object.note
|
||||
caveat = ""
|
||||
if no_end:
|
||||
caveat = " (to end of playlist)"
|
||||
display_text = note_text + ' [' + duration + caveat + ']'
|
||||
item = self.item(start_row, self.COL_TITLE)
|
||||
item.setText(display_text)
|
||||
|
||||
def _update_row(self, session, row: int, track: Tracks) -> None:
|
||||
"""
|
||||
Update the passed row with info from the passed track.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user