From 46a43b968acb74964209a5417854e9fc11711556 Mon Sep 17 00:00:00 2001 From: administrator <7dn1yh5j@debauchez.fr> Date: Mon, 11 Dec 2023 02:29:57 +0100 Subject: [PATCH] Rework delete method to delete all files matching filename Remove Source folder if checkbox 'remove media' is checked --- ...sk.py => 0021_add_delete_files_on_disk.py} | 4 +-- tubesync/sync/signals.py | 26 ++++++++-------- .../sync/templates/sync/source-delete.html | 4 +-- tubesync/sync/views.py | 30 ++++++++++--------- 4 files changed, 32 insertions(+), 32 deletions(-) rename tubesync/sync/migrations/{0020_add_delete_files_on_disk.py => 0021_add_delete_files_on_disk.py} (84%) diff --git a/tubesync/sync/migrations/0020_add_delete_files_on_disk.py b/tubesync/sync/migrations/0021_add_delete_files_on_disk.py similarity index 84% rename from tubesync/sync/migrations/0020_add_delete_files_on_disk.py rename to tubesync/sync/migrations/0021_add_delete_files_on_disk.py index 4d33148..5745d47 100644 --- a/tubesync/sync/migrations/0020_add_delete_files_on_disk.py +++ b/tubesync/sync/migrations/0021_add_delete_files_on_disk.py @@ -1,11 +1,11 @@ - Generated by pac +# Generated by pac from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('sync', '0019_add_delete_removed_media'), + ('sync', '0020_auto_20231024_1825'), ] operations = [ diff --git a/tubesync/sync/signals.py b/tubesync/sync/signals.py index 3d60424..b9f8835 100644 --- a/tubesync/sync/signals.py +++ b/tubesync/sync/signals.py @@ -1,4 +1,5 @@ import os +import glob from django.conf import settings from django.db.models.signals import pre_save, post_save, pre_delete, post_delete from django.dispatch import receiver @@ -74,6 +75,7 @@ def source_pre_delete(sender, instance, **kwargs): media.delete() + @receiver(post_delete, sender=Source) def source_post_delete(sender, instance, **kwargs): # Triggered after a source is deleted @@ -222,20 +224,16 @@ def media_pre_delete(sender, instance, **kwargs): if thumbnail_url: delete_task_by_media('sync.tasks.download_media_thumbnail', (str(instance.pk), thumbnail_url)) - if instance.source.delete_files_on_disk: - if instance.thumb: - log.info(f'Deleting thumbnail for: {instance} path: {instance.thumb.path}') - delete_file(instance.thumb.path) - # Delete the media file if it exists - if instance.media_file: - filepath = instance.media_file.path - log.info(f'Deleting media for: {instance} path: {filepath}') - delete_file(filepath) - # 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) + if instance.source.delete_files_on_disk and (instance.media_file or instance.thumb): + # Delete all media files if it contains filename + filepath = instance.media_file.path if instance.media_file else instance.thumb.path + barefilepath, fileext = os.path.splitext(filepath) + # Get all files that start with the bare file path + all_related_files = glob.glob(f'{barefilepath}.*') + for file in all_related_files: + log.info(f'Deleting file for: {instance} path: {file}') + delete_file(file) + @receiver(post_delete, sender=Media) diff --git a/tubesync/sync/templates/sync/source-delete.html b/tubesync/sync/templates/sync/source-delete.html index bdc9520..ff4ef3b 100644 --- a/tubesync/sync/templates/sync/source-delete.html +++ b/tubesync/sync/templates/sync/source-delete.html @@ -9,8 +9,8 @@

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 - tick the "also delete downloaded media" checkbox to also remove save - media when you delete the source. Deleting a source cannot be undone. + tick the "also delete downloaded media" checkbox to also remove directory {{ source.directory_path }} + when you delete the source. Deleting a source cannot be undone.

diff --git a/tubesync/sync/views.py b/tubesync/sync/views.py index 1eb5423..ac65d5c 100644 --- a/tubesync/sync/views.py +++ b/tubesync/sync/views.py @@ -1,7 +1,9 @@ +import glob import os import json from base64 import b64decode import pathlib +import shutil import sys from django.conf import settings from django.http import FileResponse, Http404, HttpResponseNotFound, HttpResponseRedirect @@ -435,14 +437,13 @@ class DeleteSourceView(DeleteView, FormMixin): source = self.get_object() for media in Media.objects.filter(source=source): if media.media_file: - # Delete the media file - delete_file(media.media_file.path) - # Delete thumbnail copy if it exists - delete_file(media.thumbpath) - # Delete NFO file if it exists - delete_file(media.nfopath) - # Delete JSON file if it exists - delete_file(media.jsonpath) + file_path = media.media_file.path + matching_files = glob.glob(os.path.splitext(file_path)[0] + '.*') + for file in matching_files: + delete_file(file) + directory_path = source.directory_path + if os.path.exists(directory_path): + shutil.rmtree(directory_path, True) return super().post(request, *args, **kwargs) 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),)) # If the media file exists on disk, delete it if self.object.media_file_exists: - delete_file(self.object.media_file.path) - self.object.media_file = None - # If the media has an associated thumbnail copied, also delete it - delete_file(self.object.thumbpath) - # If the media has an associated NFO file with it, also delete it - delete_file(self.object.nfopath) + # Delete all files which contains filename + filepath = self.object.media_file.path + barefilepath, fileext = os.path.splitext(filepath) + # Get all files that start with the bare file path + all_related_files = glob.glob(f'{barefilepath}.*') + for file in all_related_files: + delete_file(file) # Reset all download data self.object.metadata = None self.object.downloaded = False