ImageFirm operator view
Video Builder Dashboard
Mobile-first, responsive, single-page control surface
Audit loaded from script + sample run
Audio + visual → YouTube MP4

ImageFirm Video Builder

A board-level operator dashboard for a simple but sharp Python pipeline: discover mastered audio, classify the visual asset, encode the MP4, and surface the exact places where the script is strong, fragile, or merely good enough.

3 visual paths H.264 + AAC + yuv420p Fast Start enabled 44.1kHz audio No zero-duration guard
Executive signal

The script in one screen

No filler. These are the hard numbers and decision rules the Python file actually implements.

Accepted extensions
17
6 audio, 6 image, 5 video formats accepted across the pipeline.
Loop cutoff
<120s
Any supported video under two minutes is classified as a loop and repeated over the audio.
Encode timeout
3600s
Each ffmpeg or ffprobe subprocess is allowed up to one hour before timing out.
Recommended canvas
1920×1080
Still images are scaled and black-padded to a 16:9 HD frame for safe upload.
System map

Dependency chain: tracks → mastered mix → video render

The second uploaded document matters. It shows the upstream audio artifact this dashboard treats as the handoff into the Video Builder.

1. Source tracks 22 individual Neo_Chic files feed the mix builder.
2. Mix master Normalize to -18 LUFS, apply 8s crossfades, then master to -14 LUFS.
3. Video Builder Marry the mastered audio with a still image, a loop clip, or a full video.
4. Final asset Write a YouTube-bound MP4 and surface size, duration, and upload readiness.
Noir Lounge sample handoff
1:20:53
185.2 MB master
  • Raw track total: 1:23:41. Crossfades compress the playable chain to 1:20:53.
  • One loudness bug surfaced upstream: stereotools mlev=0.015 had to be raised to 0.016 before mastering succeeded.
  • The sample run ends with the explicit next step: add a visual loop or still frame, then upload to YouTube.
Mode lab

Three render paths. Three very different risk profiles.

Tap a mode to inspect the exact logic, output profile, ideal use case, and where the script still leaves quality on the table.

Best for

Static image → MP4

Safest ingest path

Use when the visual is a still cover or artwork asset. The script loops the image, scales it into a 1920×1080 frame, pads with black, and encodes at a slightly higher visual quality target than its video paths.

Trigger Any supported image extension
Core tactic -loop 1 + scale/pad + stillimage
Visual quality CRF 18, yuv420p
Audio settings AAC 320k, 44.1kHz stereo
What it does
    Hard truths

      Command shape

      
                  
      Decision rule
      Detection If the visual file extension lands in IMAGE_FORMATS, the script chooses image mode.
      Output name Audio stems lose _YT, _SC, and _SPOTIFY, then gain _VIDEO.mp4.
      Primary use Long mixes, playlists, podcasts, branded cover uploads.
      Pipeline intelligence

      Five steps. No mystery.

      This section converts the Python control flow into an operator map so nobody has to reverse-engineer the script in their head.

      01

      Discover the inputs

      If explicit --audio and --visual flags are passed, the script uses them. Otherwise it scans output/ and visuals/.

      _YT preferred Missing visuals/ folder is auto-created
      02

      Classify the visual

      Images go straight to image mode. Videos are probed; anything under 120 seconds is treated as a loop, everything else as full video.

      ffprobe duration check 0s video can break loop math
      03

      Probe duration + resolution

      The script reads duration for audio and video assets and resolution for visual files. Errors degrade to zeros or None, not structured failures.

      Loose failure handling 1-hour subprocess timeout
      04

      Encode the MP4

      All paths write H.264 video + AAC stereo audio, use yuv420p, and stop at the shortest source so audio/video mismatch does not overrun the output.

      Fast Start 44.1kHz audio
      05

      Report the result

      On success, it prints size and duration for each output. On failure, it emits console text only; there is no JSON manifest, checksum, or machine-readable status file.

      No structured job report Human-friendly console output
      Sample production run

      Noir Lounge master: the real handoff artifact

      The uploaded mix-builder log is not decorative. It provides the exact mastered audio payload this dashboard is expected to convert into video.

      Master summary
      22 tracks
      8s crossfades
      Raw total
      1:23:41
      Final chain
      1:20:53
      Mastering target
      -14 LUFS
      Final size
      185.2 MB
      • Measurement pass succeeded on the second run with I=-22.73, TP=-3.66, and LRA=9.90 before final encoding.
      • The upstream log explicitly recommends the next step: pair the master with cover.jpg or a visual loop and render the MP4.
      YouTube tracklist timeline
      Hard-truth audit

      What is solid. What is not world-class yet.

      This is the part most dashboards hide. It is the part that actually matters.

      Strengths
      YouTube-safe fundamentals are mostly in place Strong

      MP4 container, H.264 video, AAC audio, yuv420p, and +faststart are all deliberate and correct choices for broad platform compatibility.

      Image mode is the cleanest path Strong

      The script pads stills into a 1920×1080 frame, preserves aspect ratio, and uses -tune stillimage with a tighter CRF 18.

      Operator messaging is friendly Strong

      Missing folders and missing assets are explained in plain English, which makes the script easy to run without documentation debt.

      Output naming is sane Strong

      The builder strips channel suffixes like _YT, _SC, and _SPOTIFY, then appends _VIDEO.mp4. That is clean, predictable, and automation-friendly.

      Gaps
      Audio sample rate is behind current platform guidance P0

      The script encodes audio at 44.1kHz. Current YouTube guidance recommends 48kHz. The asset will likely upload, but it is not the cleanest possible handoff.

      Loop mode can divide by zero P0

      If ffprobe fails or returns 0.0 duration for a video, loops_needed = int(audio_dur / vid_dur) + 2 can crash instead of failing gracefully.

      Video paths do not normalize frame, aspect, or canvas P1

      Only image mode explicitly scales to 1920×1080. Loop and full-video paths trust the source media, which can produce inconsistent outputs across assets.

      Autodiscovery selects the first valid visual, not the intended one P1

      The script walks visuals/ in sorted order and stops at the first valid file. That is efficient, but risky when multiple cover or clip candidates exist.

      No structured telemetry P2

      There is no JSON report, status code map, checksum, or machine-readable manifest. For one-off CLI usage that is fine. For production automation, it is not enough.

      Current script vs recommended target

      YouTube readiness is close, not perfect

      This is the shortest truthful answer: the script is broadly compatible, but one setting is below current platform guidance and a few encode details remain implicit rather than explicit.

      Container MP4
      Video codec H.264 / libx264
      Audio codec AAC stereo at 320k
      Chroma yuv420p
      Fast start moov atom front via +faststart
      Audio sample rate 44.1kHz in script
      Frame-rate control Not explicitly managed
      Interpretation
      • The encode stack is not random. It intentionally targets broad ingest compatibility.
      • The biggest immediate upgrade is small but meaningful: move audio from 44100 to 48000.
      • Second-order quality risk is inconsistency, not outright failure. Unnormalized source videos can vary wildly in shape and timing.
      • If this script graduates from one-person tool to repeatable production system, structured reporting and deterministic asset selection become mandatory.
      Surgical roadmap

      Five upgrades with the highest leverage

      Not a brainstorm. A prioritized cut list.

      1. Enforce 48kHz output

      P0

      Move -ar from 44100 to 48000 for cleaner alignment with current YouTube recommendations.

      2. Guard bad probes

      P0

      Fail fast on missing directories, invalid files, and zero-duration video assets before any division or encode attempt happens.

      3. Normalize all video paths

      P1

      Apply explicit scale, pad, FPS, and profile rules to loop and full-video modes instead of trusting source media.

      4. Emit a JSON manifest

      P1

      Write inputs, chosen mode, durations, warnings, final size, and output path to a machine-readable report after every job.

      5. Make visual choice explicit

      P2

      Use a manifest file, preferred naming convention, or UI selector so the system stops guessing when more than one visual asset exists.

      Command center

      Folder contract, example invocations, and the upgrade path

      Everything here is optimized for a phone first: readable blocks, large copy targets, and no fake controls.

      Folder contract

      visuals/
        cover.jpg      # still image, 1920x1080 recommended
        loop.mp4       # short clip, repeats over audio
        full_video.mp4 # full-length source video
      
      output/
        MIX_YT.mp3
        MIX_VIDEO.mp4
      Input rule Audio masters with _YT are preferred during autodiscovery.
      Naming rule Output strips channel suffixes, then appends _VIDEO.mp4.

      Direct run

      python3 imagefirm_video_builder.py \
        --audio output/MIX_YT.mp3 \
        --visual visuals/cover.jpg

      Autodiscover run

      python3 imagefirm_video_builder.py

      P0 upgrade

      # change current audio sample rate target
      "-ar", "48000",

      Reality check

      Fast Start is already enabled.
      The next gains come from validation,
      video normalization, and telemetry.
      Deep detail

      Everything that operators ask five minutes before upload

      Exact input format sets

      Audio: .mp3, .wav, .flac, .aiff, .m4a, .ogg

      Image: .jpg, .jpeg, .png, .bmp, .tiff, .webp

      Video: .mp4, .mov, .mkv, .avi, .webm

      Error paths surfaced by the script

      Missing ffmpeg/ffprobe: execution exits with an install hint.

      Missing visuals folder: the script creates visuals/, lists supported formats, and stops.

      No audio masters found: it tells the user to run the mix master first.

      No visuals found: it instructs the user to drop an image or video into visuals/.

      Full-video duration mismatch > 60s: it warns and relies on -shortest.

      Why this dashboard feels mobile-first

      Single-column by default, 48px-class touch targets, sticky navigation on phone, dense details only after progressive disclosure, and content blocks that stay legible without horizontal scrolling.