parent
d767c879c6
commit
d9ccaf7caa
12
app/model.py
12
app/model.py
@ -598,5 +598,17 @@ class Tracks(Base):
|
|||||||
def update_lastplayed(self):
|
def update_lastplayed(self):
|
||||||
self.lastplayed = datetime.now()
|
self.lastplayed = datetime.now()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def update_artist(session, track_id, artist):
|
||||||
|
track = session.query(Tracks).filter(Tracks.id == track_id).one()
|
||||||
|
track.artist = artist
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def update_title(session, track_id, title):
|
||||||
|
track = session.query(Tracks).filter(Tracks.id == track_id).one()
|
||||||
|
track.title = title
|
||||||
|
session.commit()
|
||||||
|
|
||||||
def update_path(self, newpath):
|
def update_path(self, newpath):
|
||||||
self.path = newpath
|
self.path = newpath
|
||||||
|
|||||||
@ -22,10 +22,14 @@ from log import DEBUG, ERROR
|
|||||||
from model import (
|
from model import (
|
||||||
Notes, Playdates, Playlists, PlaylistTracks, Session, Settings, Tracks
|
Notes, Playdates, Playlists, PlaylistTracks, Session, Settings, Tracks
|
||||||
)
|
)
|
||||||
from songdb import create_track_from_file
|
from songdb import create_track_from_file, update_meta
|
||||||
|
|
||||||
|
|
||||||
class PlaylistTab(QTableWidget):
|
class PlaylistTab(QTableWidget):
|
||||||
|
|
||||||
|
cellEditingStarted = QtCore.pyqtSignal(int, int)
|
||||||
|
cellEditingEnded = QtCore.pyqtSignal()
|
||||||
|
|
||||||
# Column names
|
# Column names
|
||||||
COL_INDEX = 0
|
COL_INDEX = 0
|
||||||
COL_MSS = 1
|
COL_MSS = 1
|
||||||
@ -93,6 +97,12 @@ class PlaylistTab(QTableWidget):
|
|||||||
|
|
||||||
self.itemSelectionChanged.connect(self._select_event)
|
self.itemSelectionChanged.connect(self._select_event)
|
||||||
|
|
||||||
|
self.editing_cell = False
|
||||||
|
self.cellChanged.connect(self._cell_changed)
|
||||||
|
self.doubleClicked.connect(self._edit_cell)
|
||||||
|
self.cellEditingStarted.connect(self._cell_edit_started)
|
||||||
|
self.cellEditingEnded.connect(self._cell_edit_ended)
|
||||||
|
|
||||||
self.current_track_start_time = None
|
self.current_track_start_time = None
|
||||||
self.played_tracks = []
|
self.played_tracks = []
|
||||||
|
|
||||||
@ -142,6 +152,16 @@ class PlaylistTab(QTableWidget):
|
|||||||
self._save_playlist(session)
|
self._save_playlist(session)
|
||||||
self._repaint()
|
self._repaint()
|
||||||
|
|
||||||
|
def edit(self, index, trigger, event):
|
||||||
|
result = super(PlaylistTab, self).edit(index, trigger, event)
|
||||||
|
if result:
|
||||||
|
self.cellEditingStarted.emit(index.row(), index.column())
|
||||||
|
return result
|
||||||
|
|
||||||
|
def closeEditor(self, editor, hint):
|
||||||
|
super(PlaylistTab, self).closeEditor(editor, hint)
|
||||||
|
self.cellEditingEnded.emit()
|
||||||
|
|
||||||
def eventFilter(self, source, event):
|
def eventFilter(self, source, event):
|
||||||
"Used to process context (right-click) menu"
|
"Used to process context (right-click) menu"
|
||||||
|
|
||||||
@ -571,6 +591,39 @@ class PlaylistTab(QTableWidget):
|
|||||||
cb.clear(mode=cb.Clipboard)
|
cb.clear(mode=cb.Clipboard)
|
||||||
cb.setText(path, mode=cb.Clipboard)
|
cb.setText(path, mode=cb.Clipboard)
|
||||||
|
|
||||||
|
def _cell_changed(self, row, column):
|
||||||
|
"Called when cell content has changed"
|
||||||
|
|
||||||
|
if not self.editing_cell:
|
||||||
|
return
|
||||||
|
|
||||||
|
new = self.item(row, column).text()
|
||||||
|
|
||||||
|
DEBUG(f"_cell_changed({row=}, {column=}, {new=}")
|
||||||
|
|
||||||
|
row_id = self._get_row_id(row)
|
||||||
|
with Session() as session:
|
||||||
|
if row in self._meta_get_notes():
|
||||||
|
Notes.update_note(session, row_id, row, new)
|
||||||
|
else:
|
||||||
|
track = Tracks.get_track(session, row_id)
|
||||||
|
if column == self.COL_ARTIST:
|
||||||
|
update_meta(session, track, artist=new)
|
||||||
|
elif column == self.COL_TITLE:
|
||||||
|
update_meta(session, track, title=new)
|
||||||
|
else:
|
||||||
|
ERROR("_cell_changed(): unrecognised column")
|
||||||
|
|
||||||
|
def _cell_edit_started(self, row, column):
|
||||||
|
DEBUG(f"_cell_edit_started({row=}, {column=})")
|
||||||
|
self.editing_cell = True
|
||||||
|
self.master_process.disable_play_next_controls()
|
||||||
|
|
||||||
|
def _cell_edit_ended(self):
|
||||||
|
DEBUG("_cell_edit_ended()")
|
||||||
|
self.editing_cell = False
|
||||||
|
self.master_process.enable_play_next_controls()
|
||||||
|
|
||||||
def _delete_row(self, row):
|
def _delete_row(self, row):
|
||||||
"Delete row"
|
"Delete row"
|
||||||
|
|
||||||
@ -682,6 +735,16 @@ class PlaylistTab(QTableWidget):
|
|||||||
and pos.y() >= rect.center().y() # noqa W503
|
and pos.y() >= rect.center().y() # noqa W503
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def _edit_cell(self, mi):
|
||||||
|
"Called when table is double-clicked"
|
||||||
|
|
||||||
|
row = mi.row()
|
||||||
|
column = mi.column()
|
||||||
|
item = self.item(row, column)
|
||||||
|
|
||||||
|
if column in [self.COL_TITLE, self.COL_ARTIST]:
|
||||||
|
self.editItem(item)
|
||||||
|
|
||||||
def _find_next_track_row(self):
|
def _find_next_track_row(self):
|
||||||
"""
|
"""
|
||||||
Find next track to play.
|
Find next track to play.
|
||||||
|
|||||||
@ -349,5 +349,36 @@ def update_db(session):
|
|||||||
Tracks.remove_path(session, path)
|
Tracks.remove_path(session, path)
|
||||||
|
|
||||||
|
|
||||||
|
def update_meta(session, track, artist=None, title=None):
|
||||||
|
"""
|
||||||
|
Updates both the tag info in the file and the database entry with passed
|
||||||
|
artist and tag details.
|
||||||
|
"""
|
||||||
|
|
||||||
|
DEBUG(f"songdb.update_meta({session=}, {track=}, {artist=}, {title=})")
|
||||||
|
|
||||||
|
if not artist and not title:
|
||||||
|
return
|
||||||
|
|
||||||
|
ftype = os.path.splitext(track.path)[1][1:]
|
||||||
|
if ftype == 'flac':
|
||||||
|
tag_handler = FLAC
|
||||||
|
elif ftype == 'mp3':
|
||||||
|
tag_handler = MP3
|
||||||
|
else:
|
||||||
|
INFO(f"File type {ftype} not implemented")
|
||||||
|
return
|
||||||
|
|
||||||
|
f = tag_handler(track.path)
|
||||||
|
with Session() as session:
|
||||||
|
if artist:
|
||||||
|
f["artist"] = artist
|
||||||
|
Tracks.update_artist(session, track.id, artist)
|
||||||
|
if title:
|
||||||
|
f["title"] = title
|
||||||
|
Tracks.update_title(session, track.id, title)
|
||||||
|
f.save()
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__' and '__file__' in globals():
|
if __name__ == '__main__' and '__file__' in globals():
|
||||||
main()
|
main()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user