Allow in-playist editing of title, artist and notes

Fixes #27 #23
This commit is contained in:
Keith Edmunds 2021-08-22 13:52:22 +01:00
parent d767c879c6
commit d9ccaf7caa
3 changed files with 107 additions and 1 deletions

View File

@ -598,5 +598,17 @@ class Tracks(Base):
def update_lastplayed(self):
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):
self.path = newpath

View File

@ -22,10 +22,14 @@ from log import DEBUG, ERROR
from model import (
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):
cellEditingStarted = QtCore.pyqtSignal(int, int)
cellEditingEnded = QtCore.pyqtSignal()
# Column names
COL_INDEX = 0
COL_MSS = 1
@ -93,6 +97,12 @@ class PlaylistTab(QTableWidget):
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.played_tracks = []
@ -142,6 +152,16 @@ class PlaylistTab(QTableWidget):
self._save_playlist(session)
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):
"Used to process context (right-click) menu"
@ -571,6 +591,39 @@ class PlaylistTab(QTableWidget):
cb.clear(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):
"Delete row"
@ -682,6 +735,16 @@ class PlaylistTab(QTableWidget):
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):
"""
Find next track to play.

View File

@ -349,5 +349,36 @@ def update_db(session):
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():
main()