💾 Archived View for tilde.club › ~filip › tech › script › ytfeed › ytfeed captured on 2023-05-24 at 18:42:44.

View Raw

More Information

⬅️ Previous capture (2022-07-16)

-=-=-=-=-=-=-

#!/usr/bin/env bash

printhelp(){
    echo "Render YouTube channel feeds into Gemtext."
    echo "Usage:"
    echo "  $0 <CHANNEL_ID> | <CHANNEL_ID-CHANNEL_TITLE TSV FILE> [ <FLAG> ]"
    echo "  $0 -h"
    echo "<FLAG>:"
    echo "  -n  - only the newest entry"
    echo "  -l  - URLs only"
    echo "  -ln - only the newest URL"
}

xml2links(){
# Parameter: channel_id flag
    channel_id="$1"
    flag="$2"
    first_line=0
    first_title=0
    first_link=0
    while read xml_line; do
        if (( first_line == 0 )); then
            [[ "$xml_line" == "<!DOCTYPE html>" ]] && echo "Channel does not exist!" && exit
            first_line=1
        fi
        title_re='<title>(.*)</title>'
        [[ $xml_line =~ $title_re ]] && title="${BASH_REMATCH[1]}"
        link_re='^<link rel="alternate" href="(.*)"/>'
        [[ $xml_line =~ $link_re ]] && link="${BASH_REMATCH[1]}"
        if [[ "$link" != "" ]]; then
            if (( first_title == 0 )); then
                l_flag_re='^-l.*'
                [[ $flag =~ $l_flag_re ]] || echo "# $title (Channel ID: $channel_id)"
                link=""
                first_title=1
            else
                case $flag in
                    -n)
                        echo "=>$link $title"
                        break
                    ;;
                    -l)
                        echo "$link"
                        link=""
                    ;;
                    -ln)
                        echo "$link"
                        link=""
                        break
                    ;;
                    *)
                        echo "=>$link $title"
                        link=""
                    ;;
                esac
            fi
        fi
    done < <(curl "https://www.youtube.com/feeds/videos.xml?channel_id=$channel_id" 2>/dev/null)
}

flags=("" "-n" "-l" "-ln")
[[ "$1" == "-h" ]] && printhelp && exit
if [[ "${flags[@]}" =~ $2 ]]; then
    if [[ -f "$1" ]]; then
        while read line; do
            channel_id=$(echo "$line" | cut -f1)
            xml2links "$channel_id" "$2"
        done < "$1"
    else
        xml2links "$1" "$2"
    fi
else
    echo "Invalid flag! Use -h for help."
fi