From e99d757b5741f44c4fed2dfc1bcaafc6c243295f Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Sun, 25 Mar 2018 15:44:48 +0200 Subject: [PATCH] Fix #120: Better error handling during file import --- api/funkwhale_api/music/metadata.py | 8 +++- .../management/commands/import_files.py | 42 ++++++++++++------- changes/changelog.d/120.bugfix | 1 + 3 files changed, 36 insertions(+), 15 deletions(-) create mode 100644 changes/changelog.d/120.bugfix diff --git a/api/funkwhale_api/music/metadata.py b/api/funkwhale_api/music/metadata.py index 31d13d49..3748d557 100644 --- a/api/funkwhale_api/music/metadata.py +++ b/api/funkwhale_api/music/metadata.py @@ -121,7 +121,13 @@ class Metadata(object): def __init__(self, path): self._file = mutagen.File(path) - self._conf = CONF[self.get_file_type(self._file)] + if self._file is None: + raise ValueError('Cannot parse metadata from {}'.format(path)) + ft = self.get_file_type(self._file) + try: + self._conf = CONF[ft] + except KeyError: + raise ValueError('Unsupported format {}'.format(ft)) def get_file_type(self, f): return f.__class__.__name__ diff --git a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py index 2fa5e464..dbc01289 100644 --- a/api/funkwhale_api/providers/audiofile/management/commands/import_files.py +++ b/api/funkwhale_api/providers/audiofile/management/commands/import_files.py @@ -34,6 +34,13 @@ class Command(BaseCommand): default=False, help='Will launch celery tasks for each file to import instead of doing it synchronously and block the CLI', ) + parser.add_argument( + '--exit', '-x', + action='store_true', + dest='exit_on_failure', + default=False, + help='use this flag to disable error catching', + ) parser.add_argument( '--no-acoustid', action='store_true', @@ -106,20 +113,27 @@ class Command(BaseCommand): async = options['async'] import_handler = tasks.import_job_run.delay if async else tasks.import_job_run for path in matching: - job = batch.jobs.create( - source='file://' + path, - ) - name = os.path.basename(path) - with open(path, 'rb') as f: - job.audio_file.save(name, File(f)) - - job.save() try: - utils.on_commit( - import_handler, - import_job_id=job.pk, - use_acoustid=not options['no_acoustid']) + self.stdout.write(message.format(path)) + self.import_file(path, batch, import_handler, options) except Exception as e: - self.stdout.write('Error: {}'.format(e)) - + if options['exit_on_failure']: + raise + m = 'Error while importing {}: {} {}'.format( + path, e.__class__.__name__, e) + self.stderr.write(m) return batch + + def import_file(self, path, batch, import_handler, options): + job = batch.jobs.create( + source='file://' + path, + ) + name = os.path.basename(path) + with open(path, 'rb') as f: + job.audio_file.save(name, File(f)) + + job.save() + utils.on_commit( + import_handler, + import_job_id=job.pk, + use_acoustid=not options['no_acoustid']) diff --git a/changes/changelog.d/120.bugfix b/changes/changelog.d/120.bugfix new file mode 100644 index 00000000..b7d9ef06 --- /dev/null +++ b/changes/changelog.d/120.bugfix @@ -0,0 +1 @@ +Better error handling during file import (#120) -- GitLab