Merge pull request #1031 from tcely/patch-10

Create a media entry after deletion
This commit is contained in:
meeb 2025-05-10 15:45:39 +10:00 committed by GitHub
commit 5db77e3b82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 76 additions and 3 deletions

View File

@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _
from background_task.signals import task_failed from background_task.signals import task_failed
from background_task.models import Task from background_task.models import Task
from common.logger import log from common.logger import log
from .models import Source, Media, MediaServer from .models import Source, Media, MediaServer, Metadata
from .tasks import (delete_task_by_source, delete_task_by_media, index_source_task, from .tasks import (delete_task_by_source, delete_task_by_media, index_source_task,
download_media_thumbnail, download_media_metadata, download_media_thumbnail, download_media_metadata,
map_task_to_instance, check_source_directory_exists, map_task_to_instance, check_source_directory_exists,
@ -317,12 +317,36 @@ def media_pre_delete(sender, instance, **kwargs):
# Remove thumbnail file for deleted media # Remove thumbnail file for deleted media
if instance.thumb: if instance.thumb:
instance.thumb.delete(save=False) instance.thumb.delete(save=False)
# Save the metadata site & thumbnail URL to the metadata column
existing_metadata = instance.loaded_metadata
metadata_str = instance.metadata or '{}'
arg_dict = instance.metadata_loads(metadata_str)
site_field = instance.get_metadata_field('extractor_key')
thumbnail_field = instance.get_metadata_field('thumbnail')
arg_dict.update({
site_field: instance.get_metadata_first_value(
'extractor_key',
'Youtube',
arg_dict=existing_metadata,
),
thumbnail_field: thumbnail_url,
})
instance.metadata = instance.metadata_dumps(arg_dict=arg_dict)
# Do not create more tasks before deleting
instance.manual_skip = True
instance.save()
@receiver(post_delete, sender=Media) @receiver(post_delete, sender=Media)
def media_post_delete(sender, instance, **kwargs): def media_post_delete(sender, instance, **kwargs):
# Remove the video file, when configured to do so # Remove the video file, when configured to do so
if instance.source.delete_files_on_disk and instance.media_file: remove_files = (
instance.source and
instance.source.delete_files_on_disk and
instance.downloaded and
instance.media_file
)
if remove_files:
video_path = Path(str(instance.media_file.path)).resolve(strict=False) video_path = Path(str(instance.media_file.path)).resolve(strict=False)
instance.media_file.delete(save=False) instance.media_file.delete(save=False)
# the other files we created have these known suffixes # the other files we created have these known suffixes
@ -377,3 +401,47 @@ def media_post_delete(sender, instance, **kwargs):
log.info(f'Deleting file for: {instance} path: {file}') log.info(f'Deleting file for: {instance} path: {file}')
delete_file(file) delete_file(file)
# Create a media entry for the indexing task to find
# Requirements:
# source, key, duration, title, published
created = False
create_for_indexing_task = (
not (
#not instance.downloaded and
instance.skip and
instance.manual_skip
)
)
if create_for_indexing_task:
skipped_media, created = Media.objects.get_or_create(
key=instance.key,
source=instance.source,
)
if created:
old_metadata = instance.loaded_metadata
site_field = instance.get_metadata_field('extractor_key')
thumbnail_url = instance.thumbnail
thumbnail_field = instance.get_metadata_field('thumbnail')
skipped_media.downloaded = False
skipped_media.duration = instance.duration
arg_dict=dict(
_media_instance_was_deleted=True,
)
arg_dict.update({
site_field: old_metadata.get(site_field),
thumbnail_field: thumbnail_url,
})
skipped_media.metadata = skipped_media.metadata_dumps(
arg_dict=arg_dict,
)
skipped_media.published = instance.published
skipped_media.title = instance.title
skipped_media.skip = True
skipped_media.manual_skip = True
skipped_media.save()
Metadata.objects.filter(
media__isnull=True,
site=old_metadata.get(site_field) or 'Youtube',
key=skipped_media.key,
).update(media=skipped_media)

View File

@ -933,6 +933,10 @@ def delete_all_media_for_source(source_id, source_name, source_directory):
for media in qs_gen(mqs): for media in qs_gen(mqs):
log.info(f'Deleting media for source: {source_name} item: {media.name}') log.info(f'Deleting media for source: {source_name} item: {media.name}')
with atomic(): with atomic():
#media.downloaded = False
media.skip = True
media.manual_skip = True
media.save()
media.delete() media.delete()
# Remove the directory, if the user requested that # Remove the directory, if the user requested that
directory_path = Path(source_directory) directory_path = Path(source_directory)

View File

@ -1836,5 +1836,6 @@ class TasksTestCase(TestCase):
cleanup_old_media() cleanup_old_media()
self.assertEqual(src1.media_source.all().count(), 3) self.assertEqual(src1.media_source.all().count(), 3)
self.assertEqual(src2.media_source.all().count(), 2) self.assertEqual(src2.media_source.all().count(), 3)
self.assertEqual(Media.objects.filter(pk=m22.pk).exists(), False) self.assertEqual(Media.objects.filter(pk=m22.pk).exists(), False)
self.assertEqual(Media.objects.filter(source=src2, key=m22.key, skip=True).exists(), True)