parent
d767c879c6
commit
d9ccaf7caa
12
app/model.py
12
app/model.py
@ -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
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user