auto-archiver/src/auto_archiver/enrichers/thumbnail_enricher.py

47 wiersze
1.7 KiB
Python
Czysty Zwykły widok Historia

2023-01-17 16:29:27 +00:00
import uuid
from loguru import logger
import ffmpeg, os
2023-01-21 19:01:02 +00:00
from . import Enricher
from ..core import Media
from ..core import Metadata
2023-01-17 16:29:27 +00:00
class ThumbnailEnricher(Enricher):
"""
Generates thumbnails for all the media
"""
name = "thumbnail_enricher"
def __init__(self, config: dict) -> None:
# without this STEP.__init__ is not called
super().__init__(config)
@staticmethod
def configs() -> dict:
return {}
def enrich(self, to_enrich: Metadata) -> None:
logger.debug(f"generating thumbnails")
folder = os.path.join(to_enrich.get_tmp_dir(), str(uuid.uuid4()))
os.makedirs(folder, exist_ok=True)
for i, m in enumerate(to_enrich.media[::]):
if m.is_video():
logger.debug(f"generating thumbnails for {m.filename}")
fps, duration = 0.5, m.get("duration")
if duration is not None:
duration = float(duration)
if duration < 60: fps = 10.0 / duration
elif duration < 120: fps = 20.0 / duration
else: fps = 40.0 / duration
stream = ffmpeg.input(m.filename)
stream = ffmpeg.filter(stream, 'fps', fps=fps).filter('scale', 512, -1)
stream.output(os.path.join(folder, 'out%d.jpg')).run()
thumbnails = os.listdir(folder)
thumbnails_media = []
for t, fname in enumerate(thumbnails):
if fname[-3:] == 'jpg':
thumbnails_media.append(Media(filename=os.path.join(folder, fname)).set("id", f"thumbnail_{t}"))
to_enrich.media[i].set("thumbnails", thumbnails_media)