mirror of
https://github.com/Xevion/simple-viewer.git
synced 2025-12-05 23:16:23 -06:00
specific thumbnail generation view + manual refresh thumbnail generation, progress bar with error handling and thumbnail deletion
This commit is contained in:
18
viewer/migrations/0006_file_thumbnail.py
Normal file
18
viewer/migrations/0006_file_thumbnail.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.1.2 on 2020-11-01 03:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('viewer', '0005_serveddirectory_known_subdirectories'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='file',
|
||||
name='thumbnail',
|
||||
field=models.CharField(default=None, max_length=160, null=True, verbose_name='Thumbnail Filename'),
|
||||
),
|
||||
]
|
||||
@@ -7,6 +7,8 @@ from django.db import models
|
||||
from django.urls import reverse
|
||||
from easy_thumbnails.alias import aliases
|
||||
|
||||
from viewer import helpers
|
||||
|
||||
if not aliases.get('small'):
|
||||
aliases.set('small', {'size': (150, 80), 'crop': True})
|
||||
|
||||
@@ -34,16 +36,22 @@ class ServedDirectory(models.Model):
|
||||
# TODO: Implement separate recursive file matching implementation
|
||||
# TODO: Implement RegEx filtering step
|
||||
directories = []
|
||||
for file in os.listdir(self.path):
|
||||
files = os.listdir(self.path)
|
||||
for i, file in enumerate(files):
|
||||
print(f'{i} / {len(files)}')
|
||||
file_path = os.path.join(self.path, file)
|
||||
|
||||
if os.path.isfile(file_path):
|
||||
# Check if the file has been entered before
|
||||
entry: File
|
||||
entry = self.files.filter(filename__exact=file).first()
|
||||
if entry is None:
|
||||
# create the file entry
|
||||
entry = File.create(full_path=file_path, parent=self)
|
||||
entry.save()
|
||||
else:
|
||||
if entry.thumbnail is None:
|
||||
entry.generate_thumbnail()
|
||||
else:
|
||||
# directory found, remember it
|
||||
directories.append(file_path)
|
||||
@@ -60,6 +68,7 @@ class File(models.Model):
|
||||
filename = models.CharField('Filename', max_length=160)
|
||||
mediatype = models.CharField('Mediatype', max_length=30)
|
||||
directory = models.ForeignKey(ServedDirectory, on_delete=models.CASCADE, related_name='files')
|
||||
thumbnail = models.CharField('Thumbnail Filename', max_length=160, null=True, default=None)
|
||||
|
||||
@classmethod
|
||||
def create(cls, full_path: str, parent: ServedDirectory) -> 'File':
|
||||
@@ -75,6 +84,42 @@ class File(models.Model):
|
||||
"""Retrieve the direct URL for a given file."""
|
||||
return reverse('file', args=(directory.id, self.filename))
|
||||
|
||||
def delete_thumbnail(self) -> None:
|
||||
if self.thumbnail:
|
||||
try:
|
||||
os.remove(os.path.join(self.thumbs_dir, self.thumbnail))
|
||||
self.thumbnail = None
|
||||
self.save()
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
@property
|
||||
def thumbnail_url(self):
|
||||
if self.thumbnail:
|
||||
return f'/thumbnails/{self.thumbnail}'
|
||||
return ''
|
||||
|
||||
@property
|
||||
def thumbs_dir(self):
|
||||
return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'static', 'thumbnails')
|
||||
|
||||
def generate_thumbnail(self) -> None:
|
||||
# TODO: Add django-background-task scheduling
|
||||
|
||||
self.delete_thumbnail()
|
||||
|
||||
thumb_file = f'{uuid.uuid4()}.jpeg'
|
||||
self.thumbnail = thumb_file
|
||||
|
||||
# Generate thumbnail
|
||||
try:
|
||||
helpers.generate_thumbnail(self.path, os.path.join(self.thumbs_dir, self.thumbnail))
|
||||
except Exception:
|
||||
print(f'Could not thumbnail: {self.filename}')
|
||||
self.delete_thumbnail()
|
||||
|
||||
self.save()
|
||||
|
||||
@staticmethod
|
||||
def get_mediatype(path) -> str:
|
||||
"""Simple media type categorization based on the given path."""
|
||||
|
||||
@@ -7,6 +7,8 @@ urlpatterns = [
|
||||
path('add/', views.add, name='add'),
|
||||
path('add/submit', views.submit_new, name='add_submit'),
|
||||
path('<uuid:directory_id>/', views.browse, name='browse'),
|
||||
path('<uuid:directory_id>/refresh', views.refresh, name='refresh'),
|
||||
path('<uuid:directory_id>/<str:file>/', views.file, name='file'),
|
||||
path('<uuid:directory_id>/refresh', views.refresh, name='refresh')
|
||||
path('<uuid:directory_id>/<str:file>/generate', views.generate_thumb, name='generate_thumb'),
|
||||
|
||||
]
|
||||
|
||||
@@ -4,7 +4,7 @@ from django.http import FileResponse, HttpResponseRedirect
|
||||
from django.shortcuts import render, get_object_or_404
|
||||
from django.urls import reverse
|
||||
|
||||
from viewer.models import ServedDirectory
|
||||
from viewer.models import ServedDirectory, File
|
||||
|
||||
|
||||
def index(request):
|
||||
@@ -93,3 +93,11 @@ def submit_new(request):
|
||||
'message': 'The directory you specified was not a valid directory, either it doesn\'t '
|
||||
'exist or it isn\'t a directory.'})
|
||||
return HttpResponseRedirect(reverse('browse', args=(s.id,)))
|
||||
|
||||
|
||||
def generate_thumb(request, directory_id, file: str):
|
||||
"""View for regenerating a thumbnail for a specific file."""
|
||||
directory = get_object_or_404(ServedDirectory, id=directory_id)
|
||||
file = directory.files.filter(filename=file).first()
|
||||
file.generate_thumbnail()
|
||||
return HttpResponseRedirect(reverse('browse', args=(directory.id,)))
|
||||
|
||||
Reference in New Issue
Block a user