Package: tdh-twitch-utils
Python utils for Twitchpip3 install tdh-twitch-utils[all]This module supports partial installation:PackageScriptsDependenciestdh-twitch-utilsconcatFFmpegtdh-twitch-utils[record]concat,recordFFmpeg, streamlinktdh-twitch-utils[offset]concat,offsetFFmpeg, praat-parselmouthtdh-twitch-utils[mute]concat,muteFFmpeg, tensorflow, spleetertdh-twitch-utils[all]all of the aboveall of the aboveYou can also provide a list of extras in a single command:pip3 install tdh-twitch-utils[record,offset]concatThis script uses MPEG-TS timestamps to concatenate multiple
video segments into a single file without re-encoding. It is
most useful for assembling partial stream recordings in case
of interruption or error during stream download. Overlapping
parts will be removed precisely with ffmpeg's concat demuxer.Example# download two overlapping segments (60 seconds each)
VOD="YOUR VOD ID"
streamlink -o 1.ts --hls-duration 60 "twitch.tv/videos/$VOD" best
streamlink -o 2.ts --hls-start-offset 30 --hls-duration 60 "twitch.tv/videos/$VOD" best

# concatenate two segments into one video
twitch_utils concat 1.ts 2.ts -o result.mp4

# create one segment
twitch_utils concat 1.ts 2.ts -o result.ts

# pipe concatenated MPEG-TS stream to other applications
twitch_utils concat 1.ts 2.ts -o - | ffmpeg -i - -c copy result.mp4

# preview result in mpv with seeking
twitch_utils concat 1.ts 2.ts -o - -f edl | mpv -
# or...
mpv $(twitch_utils concat 1.ts 2.ts -o - -f edl_uri)recordThis script can be used to record live streams without waiting
for them to end. It starts to record live stream immediately,
then downloads VOD and concatenates them into full stream recording.Main features:Start recording at any time - stream will be recorded from the beginning;Monitor streamlink process for errors and skipped segments - and fix them;Resume recording after restart of the script - it is possible as long as
the stream is still online and already downloaded parts are accessible;Skip ads even without paid subscription - ad segments will be ignored by
streamlink and missing original segments will be downloaded from VOD;Algorithm:Check if channel is live and VOD for current stream already exists;Get live VOD ID from Twitch API;Start downloading live stream into fileVOD.0.ts;Wait 1 minute and start downloading VOD into fileVOD.1.ts;Wait for VOD download to finish;Check the possibility of concatenation and download missing parts of the timeline;Wait for stream to finish;Restart stream recording in case of errors or skipped segments, wait 1 minute and go to step 6;Concatenate all parts viaconcatscript (see above).Example# Record live stream of channel 'blackufa' using 2 threads
twitch_utils record -j 2 blackufaoffsetThis script performs cross-correlation of two audio files to find
offset between them. First argument is cropped and used as template.
Second argument can have any duration -- it will be divided into
separate chunks to reduce memory usage (otherwise it wouldn't be
possible to use exceptionally big files). Both arguments can be
videos or audio files -- audio track will be extracted and converted.
You can even use HTTP links ifffprobeis able to correctly determine
second argument's duration.Example# Cut small segment from big video file (offset: 123 seconds)
ffmpeg -ss 123 -i YOUR_FILE.mp4 -t 60 -c copy template.mp4

# Find offset of template.mp4 within YOUR_FILE.mp4
twitch_utils offset template.mp4 YOUR_FILE.mp4
# ... returns 122.99997732426303

# Same command, but result will be rounded to nearest integer
twitch_utils offset template.mp4 YOUR_FILE.mp4 --round
# ... returns 123muteThis script attempts to separate streamer's voice from background music by usingSpleeter. Only specified time ranges are affected. Output contains the same video, but without music in these parts.The main purpose of this script is to remove automated Content-ID claims from the video on YouTube without muting the whole section.The result is similar to "Mute song only (beta)" in YouTube Studio, but this script is much faster and can handle multiple time ranges at once.Note: Prebuilt binaries of Tensorflow require CPUs with AVX support.Example# Remove music from 5:00 to 8:00 and from 1:00:00 to 1:05:00
twitch_utils mute input.mp4 5:00~8:00 1:00:00~1:05:00 -o output.mp4ThanksTwitchRecoverfor finding a way to download unlisted/broken VODs