From 2c977bdc1e47021ec32fc6a442c7f5c79cc91350 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Mon, 18 Feb 2019 23:39:57 +0100 Subject: [PATCH] Defer set commit --- extras/picard_plugin/__init__.py | 72 +++++++++++++++++++------------- 1 file changed, 43 insertions(+), 29 deletions(-) diff --git a/extras/picard_plugin/__init__.py b/extras/picard_plugin/__init__.py index c93410e..d884683 100644 --- a/extras/picard_plugin/__init__.py +++ b/extras/picard_plugin/__init__.py @@ -52,44 +52,57 @@ register_options_page(BlobsetsOptionsPage) class IngestFile(BaseAction): NAME = 'Ingest file to blob set' - def _ingest(self, track, file): - rootHex = tagger.config.setting[ROOT_HASH_KEY] - print("rootHex is ", rootHex) - mbid = track.metadata["musicbrainz_recordingid"] - path = file.filename - self.tagger.window.set_statusbar_message( - N_('Ingesting %(path)s...'), {'path': path}) - _, ext = os.path.splitext(path) - p = Popen(["blobset", "repl"], stdin=PIPE, stdout=PIPE) - cmd = '(hex (commit (insert (load {}) (blob (path "{}")) "{}{}")))'.format(rootHex, path, mbid, ext) + def __init__(self): + super(IngestFile, self).__init__() + register_track_action(self) + self.root_sym = 0 + self.blobset_process = Popen(["blobset", "repl"], stdin=PIPE, stdout=PIPE) + root_hex = tagger.config.setting[ROOT_HASH_KEY] + cmd = '(define root_{} (load {}))\n'.format(self.root_sym, root_hex) print(cmd) - (stdout_data, stderr_data) = p.communicate(cmd.encode(encoding='UTF-8')) - new_root = stdout_data.decode().strip().strip('"') - print(new_root) + self.blobset_process.stdin.write(cmd.encode(encoding='UTF-8')) + self.blobset_process.stdin.flush() + print(self.blobset_process.stdout.readline().decode()) + + def _ingest_tracks(self, objs): + for track in objs: + if isinstance(track, Track): + for file in track.linked_files: + mbid = track.metadata["musicbrainz_recordingid"] + path = file.filename + self.tagger.window.set_statusbar_message( + N_('Ingesting %(path)s...'), {'path': path}) + _, ext = os.path.splitext(path) + cmd = '(define root_{} (insert root_{} (blob (path "{}")) "{}{}"))\n'.format(self.root_sym+1, self.root_sym, path, mbid, ext) + print(cmd) + self.blobset_process.stdin.write(cmd.encode(encoding='UTF-8')) + self.blobset_process.stdin.flush() + self.tagger.window.set_statusbar_message(self.blobset_process.stdout.readline().decode()) + self.root_sym = self.root_sym+1 + break + cmd = '(hex (commit root_{}))\n'.format(self.root_sym) + print(cmd) + self.blobset_process.stdin.write(cmd.encode(encoding='UTF-8')) + self.blobset_process.stdin.flush() + output = self.blobset_process.stdout.readline() + new_root = output.decode().strip().strip('"') + print("new root is", new_root) tagger.config.setting[ROOT_HASH_KEY] = new_root self.tagger.window.set_statusbar_message( N_('Root hash updated to %(hash)s.'), {'hash': tagger.config.setting[ROOT_HASH_KEY]} ) - def _ingest_callback(self, track, result=None, error=None): + def _ingest_callback(self, result=None, error=None): if error: - self.tagger.window.set_statusbar_message( - N_('%(mbid)s ingestion failed.'), - {'mbid': track.metadata["musicbrainz_recordingid"]} - ) + self.tagger.window.set_statusbar_message('ingestion failed.') def callback(self, objs): - rootHex = tagger.config.setting[ROOT_HASH_KEY] - print("current hash ", rootHex) - for obj in objs: - if isinstance(obj, Track): - for file in obj.linked_files: - thread.run_task( - partial(self._ingest, obj, file), - partial(self._ingest_callback, obj), - priority=2, thread_pool=file.tagger.save_thread_pool) - break + # communicate with the REPL on the save thread + thread.run_task( + partial(self._ingest_tracks, objs), + partial(self._ingest_callback), + priority=2, thread_pool=self.tagger.save_thread_pool) class CopyIdToClipboard(BaseAction): NAME = "Copy id Clipboard..." @@ -110,6 +123,7 @@ class CopyIdToClipboard(BaseAction): clipboard = QtWidgets.QApplication.clipboard() clipboard.setText('musicbrainz/release/{}'.format(mbid)) -register_track_action(IngestFile()) +IngestFile() + register_track_action(CopyIdToClipboard()) register_album_action(CopyIdToClipboard())