Rework delete method to delete all files matching filename

Remove Source folder if checkbox 'remove media' is checked
This commit is contained in:
administrator 2023-12-11 02:29:57 +01:00
parent 805a0eefbd
commit 46a43b968a
4 changed files with 32 additions and 32 deletions

View File

@ -1,11 +1,11 @@
Generated by pac # Generated by pac
from django.db import migrations, models from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('sync', '0019_add_delete_removed_media'), ('sync', '0020_auto_20231024_1825'),
] ]
operations = [ operations = [

View File

@ -1,4 +1,5 @@
import os import os
import glob
from django.conf import settings from django.conf import settings
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete from django.db.models.signals import pre_save, post_save, pre_delete, post_delete
from django.dispatch import receiver from django.dispatch import receiver
@ -74,6 +75,7 @@ def source_pre_delete(sender, instance, **kwargs):
media.delete() media.delete()
@receiver(post_delete, sender=Source) @receiver(post_delete, sender=Source)
def source_post_delete(sender, instance, **kwargs): def source_post_delete(sender, instance, **kwargs):
# Triggered after a source is deleted # Triggered after a source is deleted
@ -222,20 +224,16 @@ def media_pre_delete(sender, instance, **kwargs):
if thumbnail_url: if thumbnail_url:
delete_task_by_media('sync.tasks.download_media_thumbnail', delete_task_by_media('sync.tasks.download_media_thumbnail',
(str(instance.pk), thumbnail_url)) (str(instance.pk), thumbnail_url))
if instance.source.delete_files_on_disk: if instance.source.delete_files_on_disk and (instance.media_file or instance.thumb):
if instance.thumb: # Delete all media files if it contains filename
log.info(f'Deleting thumbnail for: {instance} path: {instance.thumb.path}') filepath = instance.media_file.path if instance.media_file else instance.thumb.path
delete_file(instance.thumb.path) barefilepath, fileext = os.path.splitext(filepath)
# Delete the media file if it exists # Get all files that start with the bare file path
if instance.media_file: all_related_files = glob.glob(f'{barefilepath}.*')
filepath = instance.media_file.path for file in all_related_files:
log.info(f'Deleting media for: {instance} path: {filepath}') log.info(f'Deleting file for: {instance} path: {file}')
delete_file(filepath) delete_file(file)
# Delete thumbnail copy if it exists
barefilepath, fileext = os.path.splitext(filepath)
thumbpath = f'{barefilepath}.jpg'
log.info(f'Deleting thumbnail for: {instance} path: {thumbpath}')
delete_file(thumbpath)
@receiver(post_delete, sender=Media) @receiver(post_delete, sender=Media)

View File

@ -9,8 +9,8 @@
<p> <p>
Are you sure you want to delete this source? Deleting a source is permanent. Are you sure you want to delete this source? Deleting a source is permanent.
By default, deleting a source does not delete any saved media files. You can By default, deleting a source does not delete any saved media files. You can
tick the &quot;also delete downloaded media&quot; checkbox to also remove save <strong>tick the &quot;also delete downloaded media&quot; checkbox to also remove directory {{ source.directory_path }}
media when you delete the source. Deleting a source cannot be undone. </strong>when you delete the source. Deleting a source cannot be undone.
</p> </p>
</div> </div>
</div> </div>

View File

@ -1,7 +1,9 @@
import glob
import os import os
import json import json
from base64 import b64decode from base64 import b64decode
import pathlib import pathlib
import shutil
import sys import sys
from django.conf import settings from django.conf import settings
from django.http import FileResponse, Http404, HttpResponseNotFound, HttpResponseRedirect from django.http import FileResponse, Http404, HttpResponseNotFound, HttpResponseRedirect
@ -435,14 +437,13 @@ class DeleteSourceView(DeleteView, FormMixin):
source = self.get_object() source = self.get_object()
for media in Media.objects.filter(source=source): for media in Media.objects.filter(source=source):
if media.media_file: if media.media_file:
# Delete the media file file_path = media.media_file.path
delete_file(media.media_file.path) matching_files = glob.glob(os.path.splitext(file_path)[0] + '.*')
# Delete thumbnail copy if it exists for file in matching_files:
delete_file(media.thumbpath) delete_file(file)
# Delete NFO file if it exists directory_path = source.directory_path
delete_file(media.nfopath) if os.path.exists(directory_path):
# Delete JSON file if it exists shutil.rmtree(directory_path, True)
delete_file(media.jsonpath)
return super().post(request, *args, **kwargs) return super().post(request, *args, **kwargs)
def get_success_url(self): def get_success_url(self):
@ -653,12 +654,13 @@ class MediaSkipView(FormView, SingleObjectMixin):
delete_task_by_media('sync.tasks.download_media', (str(self.object.pk),)) delete_task_by_media('sync.tasks.download_media', (str(self.object.pk),))
# If the media file exists on disk, delete it # If the media file exists on disk, delete it
if self.object.media_file_exists: if self.object.media_file_exists:
delete_file(self.object.media_file.path) # Delete all files which contains filename
self.object.media_file = None filepath = self.object.media_file.path
# If the media has an associated thumbnail copied, also delete it barefilepath, fileext = os.path.splitext(filepath)
delete_file(self.object.thumbpath) # Get all files that start with the bare file path
# If the media has an associated NFO file with it, also delete it all_related_files = glob.glob(f'{barefilepath}.*')
delete_file(self.object.nfopath) for file in all_related_files:
delete_file(file)
# Reset all download data # Reset all download data
self.object.metadata = None self.object.metadata = None
self.object.downloaded = False self.object.downloaded = False