#!/bin/sh
# this script using yt-dlp and xmllint to convert
# youtube video to readable plain text file
# Usage: sh yt2txt.sh video_id

lang=cs   # set prefered language
id=$1

if [ $(echo $id | wc -c) -ne 12 ]; then
    echo "invalid video id!"
    exit 1
fi

if yt-dlp --list-subs $id 2>&1 | grep -wq "(Original)"; then
dir=$HOME/yt2txt/$(date +%s)-$id
mkdir -p $dir && cd $dir
yt-dlp --ignore-config \
       --ignore-errors \
       --write-subs \
       --sub-langs all,-live_chat \
       --sub-format srv1 \
       --skip-download \
       --output "%(id)s" $id

# download auto generated/translated version
# if regular subtitles not available.
if ! ls -1 | grep -q "\.$lang"; then
# if you get HTTP Error 429 then try increase
# --sleep-subtitles to 30 seconds or more.
yt-dlp --ignore-config \
       --ignore-errors \
       --write-auto-subs \
       --sleep-subtitles 2 \
       --sub-langs .*-orig,$lang \
       --sub-format srv1 \
       --skip-download \
       --output "%(id)s-auto" $id
fi

# convert xml to readable text.
for i in *.srv1; do
    if [ -f "$i" ]; then
        xmllint --xpath '//text()' "$i" |
        sed 's/&amp;[^;]*;//g;/^$/d' |
        tr -s '\n' ' ' | fold -sw70 > $(basename "$i" srv1)txt
        rm "$i"
    fi
done

# open result or use filemanager
s=$(ls -1 $dir | grep "\.$lang" | head -n1)
if [ -f "$s" ]; then
    less $s
else
    xdg-open $dir
fi

else
    echo "video $id have no subtitles!"
fi
