mirror of
https://github.com/Xevion/simple-viewer.git
synced 2025-12-08 10:08:36 -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 django.urls import reverse
|
||||||
from easy_thumbnails.alias import aliases
|
from easy_thumbnails.alias import aliases
|
||||||
|
|
||||||
|
from viewer import helpers
|
||||||
|
|
||||||
if not aliases.get('small'):
|
if not aliases.get('small'):
|
||||||
aliases.set('small', {'size': (150, 80), 'crop': True})
|
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 separate recursive file matching implementation
|
||||||
# TODO: Implement RegEx filtering step
|
# TODO: Implement RegEx filtering step
|
||||||
directories = []
|
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)
|
file_path = os.path.join(self.path, file)
|
||||||
|
|
||||||
if os.path.isfile(file_path):
|
if os.path.isfile(file_path):
|
||||||
# Check if the file has been entered before
|
# Check if the file has been entered before
|
||||||
|
entry: File
|
||||||
entry = self.files.filter(filename__exact=file).first()
|
entry = self.files.filter(filename__exact=file).first()
|
||||||
if entry is None:
|
if entry is None:
|
||||||
# create the file entry
|
# create the file entry
|
||||||
entry = File.create(full_path=file_path, parent=self)
|
entry = File.create(full_path=file_path, parent=self)
|
||||||
entry.save()
|
entry.save()
|
||||||
|
else:
|
||||||
|
if entry.thumbnail is None:
|
||||||
|
entry.generate_thumbnail()
|
||||||
else:
|
else:
|
||||||
# directory found, remember it
|
# directory found, remember it
|
||||||
directories.append(file_path)
|
directories.append(file_path)
|
||||||
@@ -60,6 +68,7 @@ class File(models.Model):
|
|||||||
filename = models.CharField('Filename', max_length=160)
|
filename = models.CharField('Filename', max_length=160)
|
||||||
mediatype = models.CharField('Mediatype', max_length=30)
|
mediatype = models.CharField('Mediatype', max_length=30)
|
||||||
directory = models.ForeignKey(ServedDirectory, on_delete=models.CASCADE, related_name='files')
|
directory = models.ForeignKey(ServedDirectory, on_delete=models.CASCADE, related_name='files')
|
||||||
|
thumbnail = models.CharField('Thumbnail Filename', max_length=160, null=True, default=None)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def create(cls, full_path: str, parent: ServedDirectory) -> 'File':
|
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."""
|
"""Retrieve the direct URL for a given file."""
|
||||||
return reverse('file', args=(directory.id, self.filename))
|
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
|
@staticmethod
|
||||||
def get_mediatype(path) -> str:
|
def get_mediatype(path) -> str:
|
||||||
"""Simple media type categorization based on the given path."""
|
"""Simple media type categorization based on the given path."""
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ urlpatterns = [
|
|||||||
path('add/', views.add, name='add'),
|
path('add/', views.add, name='add'),
|
||||||
path('add/submit', views.submit_new, name='add_submit'),
|
path('add/submit', views.submit_new, name='add_submit'),
|
||||||
path('<uuid:directory_id>/', views.browse, name='browse'),
|
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>/<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.shortcuts import render, get_object_or_404
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from viewer.models import ServedDirectory
|
from viewer.models import ServedDirectory, File
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
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 '
|
'message': 'The directory you specified was not a valid directory, either it doesn\'t '
|
||||||
'exist or it isn\'t a directory.'})
|
'exist or it isn\'t a directory.'})
|
||||||
return HttpResponseRedirect(reverse('browse', args=(s.id,)))
|
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