diff --git a/app/sync/migrations/0012_auto_20201207_0415.py b/app/sync/migrations/0012_auto_20201207_0415.py new file mode 100644 index 00000000..5e14dcc1 --- /dev/null +++ b/app/sync/migrations/0012_auto_20201207_0415.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.4 on 2020-12-07 04:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sync', '0011_auto_20201206_0911'), + ] + + operations = [ + migrations.AddField( + model_name='source', + name='index_schedule', + field=models.IntegerField(db_index=True, default=21600, help_text='Schedule of when to index the source for new media', verbose_name='index schedule'), + ), + migrations.AlterField( + model_name='source', + name='source_acodec', + field=models.CharField(choices=[('MP4A', 'MP4A'), ('OPUS', 'OPUS')], db_index=True, default='OPUS', help_text='Source audio codec, desired audio encoding format to download', max_length=8, verbose_name='source audio codec'), + ), + ] diff --git a/app/sync/migrations/0013_auto_20201207_0439.py b/app/sync/migrations/0013_auto_20201207_0439.py new file mode 100644 index 00000000..df7b74b9 --- /dev/null +++ b/app/sync/migrations/0013_auto_20201207_0439.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.4 on 2020-12-07 04:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sync', '0012_auto_20201207_0415'), + ] + + operations = [ + migrations.AlterField( + model_name='source', + name='index_schedule', + field=models.IntegerField(choices=[(3600, 'Every hour'), (7200, 'Every 2 hours'), (10800, 'Every 3 hours'), (14400, 'Every 4 hours'), (18000, 'Every 5 hours'), (21600, 'Every 6 hours'), (43200, 'Every 12 hours'), (86400, 'Every 24 hours')], db_index=True, default=21600, help_text='Schedule of how often to index the source for new media', verbose_name='index schedule'), + ), + ] diff --git a/app/sync/models.py b/app/sync/models.py index 6b0d54c7..f29e8189 100644 --- a/app/sync/models.py +++ b/app/sync/models.py @@ -102,6 +102,16 @@ class Source(models.Model): SOURCE_TYPE_YOUTUBE_PLAYLIST: 'id', } + class IndexSchedule(models.IntegerChoices): + EVERY_HOUR = 3600, _('Every hour') + EVERY_2_HOURS = 7200, _('Every 2 hours') + EVERY_3_HOURS = 10800, _('Every 3 hours') + EVERY_4_HOURS = 14400, _('Every 4 hours') + EVERY_5_HOURS = 18000, _('Every 5 hours') + EVERY_6_HOURS = 21600, _('Every 6 hours') + EVERY_12_HOURS = 43200, _('Every 12 hours') + EVERY_24_HOURS = 86400, _('Every 24 hours') + uuid = models.UUIDField( _('uuid'), primary_key=True, @@ -151,6 +161,13 @@ class Source(models.Model): unique=True, help_text=_('Directory name to save the media into') ) + index_schedule = models.IntegerField( + _('index schedule'), + choices=IndexSchedule.choices, + db_index=True, + default=IndexSchedule.EVERY_6_HOURS, + help_text=_('Schedule of how often to index the source for new media') + ) delete_old_media = models.BooleanField( _('delete old media'), default=False, diff --git a/app/sync/signals.py b/app/sync/signals.py index 196f0504..4a802347 100644 --- a/app/sync/signals.py +++ b/app/sync/signals.py @@ -9,10 +9,10 @@ from .utils import delete_file @receiver(post_save, sender=Source) def source_post_save(sender, instance, created, **kwargs): - # Triggered when a source is saved - if created: - # If the source is newly created schedule its indexing - index_source_task(str(instance.pk), repeat=settings.INDEX_SOURCE_EVERY) + # Triggered when a source is saved, delete any source tasks that might exist + delete_index_source_task(str(instance.pk)) + # Create a new scheduled indexing task as the repeat schedule may have changed + index_source_task(str(instance.pk), repeat=instance.index_schedule) @receiver(pre_delete, sender=Source) diff --git a/app/sync/tasks.py b/app/sync/tasks.py index b4641459..7ddbfa6f 100644 --- a/app/sync/tasks.py +++ b/app/sync/tasks.py @@ -11,6 +11,7 @@ from PIL import Image from django.conf import settings from django.core.files.uploadedfile import SimpleUploadedFile from django.utils import timezone +from django.db.utils import IntegrityError from background_task import background from background_task.models import Task from common.logger import log @@ -58,8 +59,11 @@ def index_source_task(source_id): upload_date = media.upload_date if upload_date: media.published = timezone.make_aware(upload_date) - media.save() - log.info(f'Indexed media: {source} / {media}') + try: + media.save() + log.info(f'Indexed media: {source} / {media}') + except IntegrityError as e: + log.error(f'Index media failed: {source} / {media} with "{e}"') @background(schedule=0) diff --git a/app/sync/templates/sync/source.html b/app/sync/templates/sync/source.html index 2ba753da..87cd397d 100644 --- a/app/sync/templates/sync/source.html +++ b/app/sync/templates/sync/source.html @@ -30,6 +30,10 @@