Rework delete method to delete all files matching filename
Remove Source folder if checkbox 'remove media' is checked
This commit is contained in:
parent
805a0eefbd
commit
46a43b968a
|
@ -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 = [
|
|
@ -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)
|
||||||
|
|
|
@ -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 "also delete downloaded media" checkbox to also remove save
|
<strong>tick the "also delete downloaded media" 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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue