Import tracks in QThread
Allows progress messages to be sent Fixes #164
This commit is contained in:
parent
1cc1f1a185
commit
df2652e6cc
@ -1,6 +1,7 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
from log import log
|
from log import log
|
||||||
|
from os.path import basename
|
||||||
import argparse
|
import argparse
|
||||||
import stackprinter # type: ignore
|
import stackprinter # type: ignore
|
||||||
import subprocess
|
import subprocess
|
||||||
@ -20,8 +21,10 @@ from PyQt5.QtCore import (
|
|||||||
pyqtSignal,
|
pyqtSignal,
|
||||||
QDate,
|
QDate,
|
||||||
QEvent,
|
QEvent,
|
||||||
|
QObject,
|
||||||
Qt,
|
Qt,
|
||||||
QSize,
|
QSize,
|
||||||
|
QThread,
|
||||||
QTime,
|
QTime,
|
||||||
QTimer,
|
QTimer,
|
||||||
)
|
)
|
||||||
@ -209,6 +212,42 @@ class PlaylistTrack:
|
|||||||
self.start_time + timedelta(milliseconds=self.duration))
|
self.start_time + timedelta(milliseconds=self.duration))
|
||||||
|
|
||||||
|
|
||||||
|
class ImportTrack(QObject):
|
||||||
|
import_error = pyqtSignal(str)
|
||||||
|
importing = pyqtSignal(str)
|
||||||
|
finished = pyqtSignal(PlaylistTab)
|
||||||
|
|
||||||
|
def __init__(self, playlist: PlaylistTab, filenames: list) -> None:
|
||||||
|
super().__init__()
|
||||||
|
self.filenames = filenames
|
||||||
|
self.playlist = playlist
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
"""
|
||||||
|
Create track objects from passed files and add to visible playlist
|
||||||
|
"""
|
||||||
|
|
||||||
|
with Session() as session:
|
||||||
|
for fname in self.filenames:
|
||||||
|
self.importing.emit(f"Importing {basename(fname)}")
|
||||||
|
try:
|
||||||
|
track = Tracks(session, fname)
|
||||||
|
except ValueError:
|
||||||
|
self.import_error.emit(basename(fname))
|
||||||
|
continue
|
||||||
|
helpers.set_track_metadata(session, track)
|
||||||
|
helpers.normalise_track(track.path)
|
||||||
|
self.playlist.insert_track(session, track)
|
||||||
|
# We're importing potentially multiple tracks in a loop.
|
||||||
|
# If there's an error adding the track to the Tracks
|
||||||
|
# table, the session will rollback, thus losing any
|
||||||
|
# previous additions in this loop. So, commit now to
|
||||||
|
# lock in what we've just done.
|
||||||
|
session.commit()
|
||||||
|
self.playlist.save_playlist(session)
|
||||||
|
self.finished.emit(self.playlist)
|
||||||
|
|
||||||
|
|
||||||
class Window(QMainWindow, Ui_MainWindow):
|
class Window(QMainWindow, Ui_MainWindow):
|
||||||
def __init__(self, parent=None, *args, **kwargs) -> None:
|
def __init__(self, parent=None, *args, **kwargs) -> None:
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
@ -806,7 +845,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
for fname in dlg.selectedFiles():
|
for fname in dlg.selectedFiles():
|
||||||
txt = ""
|
txt = ""
|
||||||
tags = helpers.get_tags(fname)
|
tags = helpers.get_tags(fname)
|
||||||
new_tracks.append((fname, tags))
|
new_tracks.append(fname)
|
||||||
title = tags['title']
|
title = tags['title']
|
||||||
artist = tags['artist']
|
artist = tags['artist']
|
||||||
count = 0
|
count = 0
|
||||||
@ -834,26 +873,32 @@ class Window(QMainWindow, Ui_MainWindow):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Import in separate thread
|
# Import in separate thread
|
||||||
thread = threading.Thread(target=self._import_tracks,
|
self.import_thread = QThread()
|
||||||
args=(new_tracks,))
|
self.worker = ImportTrack(self.visible_playlist_tab(), new_tracks)
|
||||||
thread.start()
|
self.worker.moveToThread(self.import_thread)
|
||||||
|
self.import_thread.started.connect(self.worker.run)
|
||||||
|
self.worker.finished.connect(self.import_thread.quit)
|
||||||
|
self.worker.finished.connect(self.worker.deleteLater)
|
||||||
|
self.import_thread.finished.connect(self.import_thread.deleteLater)
|
||||||
|
self.worker.import_error.connect(
|
||||||
|
lambda msg: helpers.show_warning(
|
||||||
|
"Import error", "Error importing " + msg
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.worker.importing.connect(
|
||||||
|
lambda msg: self.statusbar.showMessage("Importing " + msg, 5000)
|
||||||
|
)
|
||||||
|
self.worker.finished.connect(self.import_complete)
|
||||||
|
self.import_thread.start()
|
||||||
|
|
||||||
def _import_tracks(self, tracks: list):
|
def import_complete(self, playlist_tab: PlaylistTab):
|
||||||
"""
|
"""
|
||||||
Create track objects from passed files and add to visible playlist
|
Called by thread when track import complete
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
self.statusbar.showMessage("Imports complete")
|
||||||
with Session() as session:
|
with Session() as session:
|
||||||
for (fname, tags) in tracks:
|
playlist_tab.update_display(session)
|
||||||
try:
|
|
||||||
track = Tracks(session, fname)
|
|
||||||
except ValueError:
|
|
||||||
# Error adding track to database
|
|
||||||
continue
|
|
||||||
helpers.set_track_metadata(session, track)
|
|
||||||
helpers.normalise_track(track.path)
|
|
||||||
self.visible_playlist_tab().insert_track(session, track)
|
|
||||||
self.visible_playlist_tab().save_playlist(session)
|
|
||||||
|
|
||||||
def insert_header(self) -> None:
|
def insert_header(self) -> None:
|
||||||
"""Show dialog box to enter header text and add to playlist"""
|
"""Show dialog box to enter header text and add to playlist"""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user