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.
No filler. These are the hard numbers and decision rules the Python file actually implements.
The second uploaded document matters. It shows the upstream audio artifact this dashboard treats as the handoff into the Video Builder.
stereotools mlev=0.015 had to be raised to 0.016 before mastering succeeded.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
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.
| 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. |
This section converts the Python control flow into an operator map so nobody has to reverse-engineer the script in their head.
If explicit --audio and --visual flags are passed, the script uses them. Otherwise it scans output/ and visuals/.
Images go straight to image mode. Videos are probed; anything under 120 seconds is treated as a loop, everything else as full video.
The script reads duration for audio and video assets and resolution for visual files. Errors degrade to zeros or None, not structured failures.
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.
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.
The uploaded mix-builder log is not decorative. It provides the exact mastered audio payload this dashboard is expected to convert into video.
cover.jpg or a visual loop and render the MP4.This is the part most dashboards hide. It is the part that actually matters.
MP4 container, H.264 video, AAC audio, yuv420p, and +faststart are all deliberate and correct choices for broad platform compatibility.
The script pads stills into a 1920×1080 frame, preserves aspect ratio, and uses -tune stillimage with a tighter CRF 18.
Missing folders and missing assets are explained in plain English, which makes the script easy to run without documentation debt.
The builder strips channel suffixes like _YT, _SC, and _SPOTIFY, then appends _VIDEO.mp4. That is clean, predictable, and automation-friendly.
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.
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.
Only image mode explicitly scales to 1920×1080. Loop and full-video paths trust the source media, which can produce inconsistent outputs across assets.
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.
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.
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 |
44100 to 48000.Not a brainstorm. A prioritized cut list.
Move -ar from 44100 to 48000 for cleaner alignment with current YouTube recommendations.
Fail fast on missing directories, invalid files, and zero-duration video assets before any division or encode attempt happens.
Apply explicit scale, pad, FPS, and profile rules to loop and full-video modes instead of trusting source media.
Write inputs, chosen mode, durations, warnings, final size, and output path to a machine-readable report after every job.
Use a manifest file, preferred naming convention, or UI selector so the system stops guessing when more than one visual asset exists.
Everything here is optimized for a phone first: readable blocks, large copy targets, and no fake controls.
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
_YT are preferred during autodiscovery.
_VIDEO.mp4.
python3 imagefirm_video_builder.py \ --audio output/MIX_YT.mp3 \ --visual visuals/cover.jpg
python3 imagefirm_video_builder.py
# change current audio sample rate target "-ar", "48000",
Fast Start is already enabled. The next gains come from validation, video normalization, and telemetry.
Audio: .mp3, .wav, .flac, .aiff, .m4a, .ogg
Image: .jpg, .jpeg, .png, .bmp, .tiff, .webp
Video: .mp4, .mov, .mkv, .avi, .webm
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.
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.