#! /usr/bin/env bash mcc() { local list=( *.list ) if [[ ${#list[@]} -ne 1 ]]; then echo "Number of .list files in cwd must be exactly 1, exiting." return 1 fi make_cuts "$list" "$@" concat CUT -c copy "CONCAT_${list%.*}" } concat() { local prefix="$1" shift ffmpeg -f concat -safe 0 -i <(printf 'file %q\n' "$PWD"/"$prefix"*) "$@" } make_cuts() { local list="$1" local vid="${list%.*}" local ext="${vid##*.}" local vid_noext="${vid%.*}" local start_ts_hms local end_ts_hms shift while IFS=: read -r channel_name start_ts end_ts || [[ -n "$channel_name" ]]; do if [[ -z "$end_ts" ]]; then continue; fi start_ts_hms="$(_mpv_cut_to_hms "$start_ts")" end_ts_hms="$(_mpv_cut_to_hms "$end_ts")" echo "$channel_name" "$start_ts" "$end_ts" ffmpeg -nostdin -ss "$start_ts" -to "$end_ts" -i "$vid" "$@" "CUT_${channel_name}_${vid_noext}_${start_ts_hms}_${end_ts_hms}.${ext}" done < "$list" } _mpv_cut_to_hms() { local total_seconds="$1" local hours=$(( ${total_seconds%.*} / 3600 )) local minutes=$(( (${total_seconds%.*} % 3600) / 60 )) local seconds=$(( ${total_seconds%.*} % 60 )) local ms ms=$(printf "%.0f" "$(echo "($total_seconds - ${total_seconds%.*}) * 1000" | bc)") printf "%02d-%02d-%02d-%03d\n" $hours $minutes $seconds "$ms" }