diff --git a/pillar/api/encoding.py b/pillar/api/encoding.py index ae161b09..318a1403 100644 --- a/pillar/api/encoding.py +++ b/pillar/api/encoding.py @@ -1,4 +1,5 @@ import datetime +import json import logging import os @@ -33,6 +34,7 @@ def size_descriptor(width, height): 1280: '720p', 1920: '1080p', 2048: '2k', + 3840: 'UHD', 4096: '4k', } @@ -104,18 +106,13 @@ def zencoder_notifications(): file_doc['processing']['status'] = job_state if job_state == 'failed': - log.warning('Zencoder job %i for file %s failed.', zencoder_job_id, file_id) - # Log what Zencoder told us went wrong. - for output in data['outputs']: - if not any('error' in key for key in output): - continue - log.warning('Errors for output %s:', output['url']) - for key in output: - if 'error' in key: - log.info(' %s: %s', key, output[key]) + log.warning('Zencoder job %s for file %s failed: %s', zencoder_job_id, file_id, + json.dumps(data, sort_keys=True, indent=4)) file_doc['status'] = 'failed' current_app.put_internal('files', file_doc, _id=file_id) + + # This is 'okay' because we handled the Zencoder notification properly. return "You failed, but that's okay.", 200 log.info('Zencoder job %s for file %s completed with status %s.', zencoder_job_id, file_id, diff --git a/tests/test_api/test_encoding.py b/tests/test_api/test_encoding.py index 3cd18fcf..d23c3d80 100644 --- a/tests/test_api/test_encoding.py +++ b/tests/test_api/test_encoding.py @@ -36,7 +36,7 @@ class ZencoderNotificationTest(AbstractPillarTest): expected_status=401) def test_good_secret_existing_file(self): - self.ensure_file_exists(file_overrides={ + file_id, _ = self.ensure_file_exists(file_overrides={ 'processing': {'backend': 'zencoder', 'job_id': 'koro-007', 'status': 'processing'} @@ -44,7 +44,7 @@ class ZencoderNotificationTest(AbstractPillarTest): self.post('/api/encoding/zencoder/notifications', json={'job': {'id': 'koro-007', - 'state': 'done'}, + 'state': 'finished'}, 'outputs': [{ 'format': 'jpg', 'height': 1080, @@ -58,4 +58,34 @@ class ZencoderNotificationTest(AbstractPillarTest): headers={'X-Zencoder-Notification-Secret': self.secret}, expected_status=204) - # TODO: check that the file in MongoDB is actually updated properly. + db_file = self.app.db('files').find_one(file_id) + self.assertEqual('complete', db_file['status']) + self.assertEqual('finished', db_file['processing']['status']) + + def test_failed_job(self): + file_id, _ = self.ensure_file_exists(file_overrides={ + 'processing': {'backend': 'zencoder', + 'job_id': 'koro-007', + 'status': 'processing'} + }) + + self.post('/api/encoding/zencoder/notifications', + json={'job': {'id': 'koro-007', + 'state': 'failed'}, + 'outputs': [{ + 'format': 'jpg', + 'height': 1080, + 'width': 2048, + 'file_size_in_bytes': 15, + 'md5_checksum': None, + 'error': 'Lama support malfunctioning', + 'url': 'http://example.com/file.mp4', + }], + 'input': { + 'duration_in_ms': 5000, + }}, + headers={'X-Zencoder-Notification-Secret': self.secret}) + + db_file = self.app.db('files').find_one(file_id) + self.assertEqual('failed', db_file['status']) + self.assertEqual('failed', db_file['processing']['status'])