Cookbook¶
Download segments with cURL¶
Initially, and currently, Ytpb was not focused on long stream archiving. While
the basic retry mechanism exists for failed requests (see
PlaybackSession), there is no support for resumable
downloading at this time. (Note added: See Resuming unfinished downloads.) As an
alternative, we can use the cURL program to download segments.
Base URLs¶
With the --dump-base-urls option, we can print the base URLs corresponded to
the given format specs:
$ ytpb download --dump-base-urls -af none -vf @247 none STREAM
https://BASE_URL
They can later be used to build segment URLs in your custom scripts.
Segment URLs¶
Encoding rewind range¶
Another option, --dump-segment-urls, allows encoding rewind information
(located segment sequence numbers) into URLs to access segments:
$ ytpb download --dump-segment-urls -af @140 -vf none STREAM
https://BASE_URL/sq/[START-END]
Such format of URLs with a numerical range glob is supported by cURL.
If needed, the glob part can be replaced with a sequence expansion:
$ echo "https://BASE_URL/sq/[START-END]" \ | sed -E 's/\[(.+)-(.+)\]$/{\1..\2}/' https://BASE_URL/sq/{START..END}
We can download audio segments to output files named incrementally:
$ ytpb download --dump-segment-urls ... | xargs curl -L -O
Using config file¶
Also, we can save URLs to a file for later use:
$ ytpb download --dump-segment-urls -af @140 -vf @247 STREAM \
> segment-urls.txt | cat segment-urls.txt
https://AUDIO_BASE_URL/sq/[START-END]
https://VIDEO_BASE_URL/sq/[START-END]
Such file can be edited into a cURL config file:
$ cat segment-urls-config.txt
url = AUDIO_URL
-o audio/#1.mp4
url = VIDEO_URL
-o video/#1.webm
And be used to download segments with resume support (-C -):
$ curl -L -C - -K segment-urls-config.txt
Fetch and demux segments with FFmpeg¶
Note: Requires a custom FFmpeg build (or <= 5.1.4). See issue #4 for details.
After composing an MPEG-DASH MPD file with:
$ ytpb mpd compose -i 2024-01-02T10:20:00+00/PT30S STREAM
$ ls
Stream-Title_20240102T102000+00.mpd
you can convert selected streams to an audio/video file.
First, list all available streams:
$ ffprobe MPD
...
Stream #0:0: Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720 [SAR 1:1 DAR 16:9], 30 fps, 30 tbr, 90k tbn (default)
Metadata:
id : 136
Stream #0:1: Video: vp9 (Profile 0), yuv420p(tv, bt709), 1280x720, 30.30 fps, 30 tbr, 1k tbn (default)
Metadata:
id : 247
Stream #0:2: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp
(default)
Metadata:
id : 140
Then, select the desired ones to be converted with the -map option:
$ ffmpeg -i MPD -map 0:1 -map 0:2 -c copy out.mp4
Here’s an equivalent for ffmpeg running in a container:
$ podman run --rm -it -v $PWD:/root:Z ytpb \
ffmpeg -i MPD -c copy /root/out.mp4
The -map option can be omitted and the default behavior will be applied. Use -c
copy to avoid transcoding
actual audio and video.