feat: frutiger aero visual overhaul — backgrounds, glass panels, cast photos, full mosaic
Some checks failed
CI / Check / Test (push) Failing after 42s

This commit is contained in:
2026-06-03 00:34:13 +02:00
parent e57ddd78ac
commit d52120d6a9
7 changed files with 42 additions and 20 deletions

View File

@@ -4,7 +4,7 @@ mod slides;
use async_trait::async_trait;
use domain::errors::DomainError;
use domain::models::wrapup::WrapUpReport;
use domain::ports::{VideoRenderConfig, WrapUpVideoRenderer};
use domain::ports::{VideoRenderAssets, VideoRenderConfig, WrapUpVideoRenderer};
#[derive(Default)]
pub struct FfmpegWrapUpRenderer;
@@ -20,35 +20,36 @@ impl WrapUpVideoRenderer for FfmpegWrapUpRenderer {
async fn render(
&self,
report: &WrapUpReport,
poster_images: Vec<(String, Vec<u8>)>,
assets: VideoRenderAssets,
config: &VideoRenderConfig,
) -> Result<Vec<u8>, DomainError> {
let (width, height) = config.resolution;
let renderer =
slides::SlideRenderer::new(config.font_path.as_deref(), config.logo_path.as_deref())?;
let renderer = slides::SlideRenderer::new(
config.font_path.as_deref(),
config.logo_path.as_deref(),
config.bg_dir.as_deref(),
)?;
// 1. Generate slide images
let mut slide_pngs = Vec::new();
slide_pngs.push(renderer.render_hero(report, width, height)?);
slide_pngs.push(renderer.render_ratings(report, width, height)?);
if !report.top_directors.is_empty() {
slide_pngs.push(renderer.render_directors(report, width, height)?);
slide_pngs.push(renderer.render_directors(report, &assets.cast_images, width, height)?);
}
if !report.top_actors.is_empty() {
slide_pngs.push(renderer.render_actors(report, width, height)?);
slide_pngs.push(renderer.render_actors(report, &assets.cast_images, width, height)?);
}
if !report.top_genres.is_empty() {
slide_pngs.push(renderer.render_genres(report, width, height)?);
}
slide_pngs.push(renderer.render_highlights(report, width, height)?);
if !poster_images.is_empty() {
slide_pngs.push(renderer.render_mosaic(&poster_images, width, height)?);
slide_pngs.push(renderer.render_highlights(report, &assets.poster_images, width, height)?);
if !assets.poster_images.is_empty() {
slide_pngs.push(renderer.render_mosaic(&assets.poster_images, width, height)?);
} else {
tracing::warn!("no poster images resolved, skipping mosaic slide");
}
// 2. Stitch into video
ffmpeg::stitch_slides(&slide_pngs, config).await
}
}