TL;DR: https://github.com/yaroslaff/smugglerjpg. We turn photos into a slideshow video and upload it (you can make it unlisted or private so no one sees it). Then, if needed, download the video and extract the photos back.
In the image: the original (left) and after packing → uploading → downloading → extracting (right). The second image has lower resolution, so both were scaled to the same height for comparison.
Video hosting platforms let you store huge videos, but not photos. Messengers allow sending and storing photos, but they’re inconvenient for managing collections (folders, groups, etc.).
Solution: Turn your photos into a slideshow in a way that makes it easy to extract them back later — either lossless or with minimal quality loss.
SmugglerJPG — Packing a Gallery into a Single Video
We’ll use my small tool: smugglerjpg.
Installation
pipx install smugglerjpg
If you don’t have pipx: apt install pipx. On Windows it should also be possible (I haven’t tried). You’ll also need ffmpeg on Linux.
Creating the video
smugglerjpg create /tmp/testgallery/ -a ~/tmp/bgmusic/ -o out.mp4
-
-a— add background music (so you can even watch it yourself without getting too bored) -
-d— duration of each slide (default: 5 seconds)
If you want the photos in a specific order, use --sort name, --sort mtime, or -f filelist.txt.
Then just upload the video wherever you want.
Extracting Your Contraband Back
Download the video (from the studio or via yt-dlp) and extract it:
smugglerjpg extract out-ytdlp.webm -o /tmp/extracted/
You’ll get your original pictures back (with only a small quality loss — barely noticeable to my eye).
Quality Control
Original photo example:
$ mediainfo testgallery/IMG20260513193409.jpg
General
Complete name : testgallery/IMG20260513193409.jpg
Format : JPEG
File size : 10.8 MiB
Image
Format : JPEG
Width : 3 072 pixels
Height : 4 096 pixels
Color space : YUV
Chroma subsampling : 4:2:0
Bit depth : 8 bits
Compression mode : Lossy
Stream size : 10.8 MiB (100%)
ColorSpace_ICC : RGB
Our local video file:
$ mediainfo out.mp4
General
Complete name : out.mp4
Format : MPEG-4
Format profile : Base Media
Codec ID : isom (isom/iso2/avc1/mp41)
File size : 18.8 MiB
Duration : 35 s 0 ms
Overall bit rate : 4 517 kb/s
Frame rate : 30.000 FPS
Writing application : Lavf61.7.103
Video
ID : 1
Format : AVC
Format/Info : Advanced Video Codec
Format profile : Constrained Baseline@L5.1
...
File after yt-dlp from YouTube:
$ mediainfo out-ytdlp.webm
General
Complete name : out-ytdlp.webm
Format : WebM
...
Video
Format : AV1
...
Extracted image parameters:
$ mediainfo /tmp/extracted/extracted_slide_003.jpg
General
Complete name : /tmp/extracted/extracted_slide_003.jpg
Format : JPEG
File size : 967 KiB
Image
Format : JPEG
Width : 1 620 pixels
Height : 2 160 pixels
...
Notes & Tips
- On YouTube, you can keep videos as unlisted, private, or even as Draft.
- Video resolution is the same for the entire duration. Mixing portrait and landscape photos in one video will result in higher quality loss. That said, modern phones have so many megapixels that I don’t notice the difference after the process.
- This was made with an LLM, so… you know how it is.
Enjoy and keep your precious memories safe!

Top comments (0)