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