Turn a video into a 2014 MLG montage.
MW2 quickscopes, slow-motion replays, hitmarkers, airhorns, a dubstep drop, far too many Doritos, and a “deal with it” outro.
Same clip, before and after. The previews are silent; open the after video for the full thing with sound.
| Before · 8 seconds | After · 19 seconds |
|---|---|
![]() |
![]() |
Before MP4 · After MP4 with sound · Recreate the demo
You'll need Python 3.12+, uv, and FFmpeg (ffmpeg and ffprobe on your PATH).
The images and soundbites are included in the repo.
git clone https://github.com/WillMatthews/mlg.git
cd mlg
uv run mlg clip.mp4This writes clip_MLG.mp4. By default, the loudest point in the clip becomes
the shot. Pick a moment yourself with -m (seconds):
uv run mlg clip.mp4 -m 4.2 --target 0.4,0.3--target sets where the scope aims and the shades land. Coordinates run from
0,0 at the top left to 1,1 at the bottom right; the default is 0.5,0.5.
To try the included demo:
uv run mlg demo/target_practice.mp4 -m 3.2uv run mlg clip.mp4 --previewThis renders the full montage with sound at up to 640 pixels wide and 15fps,
using a faster encoder. It writes clip_MLG_preview.mp4, so it won't replace
your full render. Smaller sources and --width values stay smaller.
Use the same options without --preview when you're happy with it.
uv run mlg clip.mp4 --intensity low --preview
uv run mlg clip.mp4 --intensity chaosnormal keeps the original look. low reduces camera shake, flashes, hitmarkers,
falling memes, and deep-frying. chaos turns them up. The sections, timing,
and audio levels stay the same, so you can compare styles on the same clip.
Everything is on by default. Skip sections with --no-weed,
--no-deal-with-it, --no-illuminati, or --no-replays:
uv run mlg clip.mp4 --no-weed --no-deal-with-itSkipped sections remove their audio and shorten the video. --no-weed also
removes the joints and falling leaves; --no-illuminati removes the eye during
the drop. You can explicitly enable them with --weed, --deal-with-it,
--illuminati, and --replays.
Use --no-drop to skip the dubstep section and its overlays and voice lines.
Choose the number of replays with --replay-count N (default: 2). Zero skips
them; --no-replays takes precedence over the count.
uv run mlg clip.mp4 --replay-count 1 --no-drop --no-weedWithout a track, mlg generates a 140 BPM wobble drop. Use --drop to supply
your own, --drop-start to choose where it kicks in, and --bpm to sync the effects:
uv run mlg clip.mp4 --drop bangarang.mp3 --drop-start 31.5 --bpm 110--drop-len sets how many seconds to use (default: 8). You can also put a track
at sounds/drop.mp3 to use it by default.
Run uv run mlg --help for output path, width, seed, and other options.
Replace files in sounds/ or assets/, keeping their names.
For example, sounds/airhorn.mp3 changes the horn and assets/doritos.png
changes the falling snacks. Sounds can also be WAV, OGG, FLAC, or M4A.
Missing sounds and sprites use generated fallbacks where available.
Snoop, the frog, and the quickscope use animation frames in assets/snoop/,
assets/frog/, and assets/quickscope/.
To fetch the source assets again, run ./fetch_assets.sh (requires curl;
yt-dlp is needed for the quickscope video). To rebuild images and animation
frames from files already in assets/raw/, run uv run python -m mlg.prep.
Soundbites from myinstants.com. Images from pngimg.com, pngkey.com, pngitem.com,
and tenor.com. The MW2 sniper reticle comes from the Call of Duty wiki; the
quickscope green screen is YouTube video xVrayfJ_oI8.
Third-party meme material used for parody. The demo's target animation is generated by demo/make_source.py.
uv run python -m unittest discover -s tests -v
uv buildCI checks Python 3.12 and 3.13, including real FFmpeg renders, failure cleanup, and an installed wheel. Built wheels include the images, sounds, and animation frames; raw downloads and demo videos are left out.

