Compare commits

...

5 commits

Author SHA1 Message Date
LEdoian
a44fcce1c8 Exif je zběsilej standard 2025-05-19 03:18:15 +02:00
LEdoian
2cbaee10aa fixup! fixup! fixup! WIP sortítko galerií 2025-05-19 02:05:11 +02:00
LEdoian
1d157e7e68 fixup! fixup! WIP sortítko galerií 2025-05-19 02:02:50 +02:00
LEdoian
d999c46e5e fixup! WIP sortítko galerií 2025-05-19 02:01:04 +02:00
LEdoian
88695313c1 WIP sortítko galerií
potřebuji otestovat na testwebu :-)
2025-05-19 01:54:27 +02:00

View file

@ -100,3 +100,41 @@ class Galerie(models.Model):
class Meta: class Meta:
verbose_name = 'Galerie' verbose_name = 'Galerie'
verbose_name_plural = 'Galerie' verbose_name_plural = 'Galerie'
# TODO: patří to spíš sem, nebo do nějakých utils?
def setrid_galerii_podle_exifu(self):
"""Setřídí galerii podle data v EXIF tazích.
Velmi experimentální, zatím pro použití jen webařem v shellu (důvod:
EXIF se trochu blbě parsuje, není jasné, jestli se použít DateTime,
DateTimeOriginal nebo DateTimeDigitized, EXIF nemusí mít informace o
časové zóně a tenhle kód časovou zónu ignoruje, vůbec nezachovává
pořadí)."""
from PIL import Image, ExifTags, UnidentifiedImageError
from datetime import datetime
EXIF_DATETIME_FMT = "%Y:%m:%d %H:%M:%S"
self.obrazek_set.update(poradi=None)
for obrazek in self.obrazek_set.all():
try:
obr = Image.open(obrazek.obrazek_velky)
except UnidentifiedImageError as e:
raise ValueError from e
exif = obr.getexif() # Pokud tam není, tak si Pillow podle zdrojáků vyhaluzí prázdný.
ifd_exif = {}
if ExifTags.IFD.Exif in exif: ifd_exif = exif.get_ifd(ExifTags.IFD.Exif)
date_str = (False # zarovnání
or exif.get(ExifTags.Base.DateTimeOriginal, None)
or ifd_exif.get(ExifTags.Base.DateTimeOriginal, None)
or exif.get(ExifTags.Base.DateTime, None)
or ifd_exif.get(ExifTags.Base.DateTime, None)
or exif.get(ExifTags.Base.DateTimeDigitized, None)
or ifd_exif.get(ExifTags.Base.DateTimeDigitized, None)
)
if date_str is None: continue
dt = datetime.strptime(date_str, EXIF_DATETIME_FMT)
poradi = int(dt.strftime("1%d%H%M%S"))
obrazek.poradi = poradi
obrazek.save()