fix: enhance source deletion

Refactor media deletion logic to handle thumbnails and media files more effectively, ensuring proper cleanup and locking mechanisms are in place.
This commit is contained in:
tcely
2026-09-23 15:04:48 -04:00
committed by GitHub
parent 4655ec140e
commit 47af4beaf6

View File

@@ -788,6 +788,13 @@ def delete_media(media_id):
f'media:{media.uuid}',
queue=Val(TaskQueue.DB),
):
# remove thumbnail from storage
if media.thumb_file_exists:
# copy it before its gone
if media.media_file_exists:
media.copy_thumbnail()
media.thumb.delete(save=False)
# intentionally not removing downloaded file here
media.delete()
@@ -1379,36 +1386,61 @@ def delete_all_media_for_source(source_id, source_name, source_directory):
log.warning(f'Task delete_all_media_for_source(pk={source_id}) called but no '
f'source exists with ID: {source_id}')
# this task can run after a source was deleted
if source:
else:
source_lock = huey_lock_task(
f'source:{source.uuid}',
queue=Val(TaskQueue.FS),
)
if source_lock.acquired:
raise CancelExecution(_('already locked'), retry=True)
source_lock.acquired = True
mqs = Media.objects.all().defer(
'metadata',
).filter(
source=source or source_id,
)
# no delay for these tasks
delete_media.map({
str(media.pk)
for media in qs_gen(mqs)
})
with atomic(durable=True):
mqs.update(manual_skip=True, skip=True)
log.info(f'Deleting media for source: {source_name}')
mqs.delete()
# Remove the directory, if the user requested that
update_model(
source,
key = source.key + '/deleted',
name = f'[Deleting] {source.name}',
)
directory_path = Path(source_directory)
remove = (
(source and source.delete_removed_media) or
(directory_path / '.to_be_removed').is_file()
)
if source:
mqs = Media.objects.all().defer(
'metadata',
).filter(
source=source or source_id,
)
for media in qs_gen(mqs):
# remove thumbnail from storage
if media.thumb_file_exists:
# copy it before its gone
if media.media_file_exists:
media.copy_thumbnail()
media.thumb.delete(save=False)
# if requested, remove download from storage
if remove and media.media_file_exists:
media.media_file.delete(save=False)
# no delay for these tasks
delete_media(str(media.pk))
try:
with atomic(durable=True):
source.delete()
source_lock.acquired = False
mqs.update(manual_skip=True, skip=True)
log.info(f'Deleting media for source: {source_name}')
mqs.delete()
if source:
try:
source = Source.objects.get(uuid=source.uuid)
except Source.DoesNotExist:
source = False
else:
with atomic(durable=True):
source.delete()
source = False
finally:
if source is not None:
source_lock.acquired = False
# Remove the directory, if the user requested that
if remove:
log.info(f'Deleting directory for: {source_name}: {directory_path}')
rmtree(directory_path, True)