Skip to content

Instantly share code, notes, and snippets.

@tjluoma
Last active January 3, 2023 09:00
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tjluoma/fdbc63ceb78a2aecd3d638fd18b6ec6e to your computer and use it in GitHub Desktop.
Save tjluoma/fdbc63ceb78a2aecd3d638fd18b6ec6e to your computer and use it in GitHub Desktop.
Did you know YouTube has RSS feeds? No? Probably because YouTube makes them nearly impossible to find. But here's an easy way to get the RSS feed for any YouTube user. Inspired by <https://eggfreckles.net/notes/youtube-rss/>
#!/usr/bin/env zsh -f
# Purpose: get the RSS feed for a YouTube page
# Inspired By: https://eggfreckles.net/notes/youtube-rss/
# Gist: https://gist.github.com/tjluoma/fdbc63ceb78a2aecd3d638fd18b6ec6e
#
# From: Timothy J. Luoma
# Mail: luomat at gmail dot com
# Date: 2020-01-17; updated 2021-01-10
# 2021-01-10 YouTube currently has both 'rssUrl' and
# link rel="alternate" type="application/rss+xml" title="RSS" href="…"
# which I do not believe where there a year ago when I first wrote this
# I am looking for the latter, and if I don't find it, I fallback to the
# former. If neither are found, an error is reported to the user.
#
# 2021-01-10 (Update 2): The previous comment only applies if you are looking
# at a channel page, i.e. "https://www.youtube.com/512pixels" but NOT if you
# are looking an an individual video such as 'https://www.youtube.com/watch?v=gQgSdwkvaDg'
#
# Version 2021-01-10.2 -- This script _should_ now work on either of those kinds of pages
NAME="$0:t:r"
if [[ -e "$HOME/.path" ]]
then
source "$HOME/.path"
else
PATH="/usr/local/scripts:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin"
fi
COUNT='0'
for URL in "$@"
do
LINK_REL=$(curl -sfLS "${URL}" \
| tr '<|>|,|\r' '\n' \
| awk -F'"' '/application\/rss\+xml/{print $8}')
if [[ "$LINK_REL" == "" ]]
then
## Do Not Indent
CHANNEL_ID=$(curl -sfLS "$URL" \
| sed -e 's#<#\
<#g' \
-e 's#>#>\
#g' \
| awk -F'"' '/meta itemprop="channelId"/{print $4}')
## END - Do Not Indent
if [[ "$CHANNEL_ID" == "" ]]
then
echo "$NAME: '\$CHANNEL_ID' and '\$LINK_REL' are both empty for '${URL}'." >>/dev/stderr
((COUNT++))
continue
else
FEED="https://www.youtube.com/feeds/videos.xml?channel_id=$CHANNEL_ID"
fi
else
FEED="$LINK_REL"
fi
echo "$FEED"
# copy URL to clipboard
echo -n "$FEED" | pbcopy
done
if [[ "$COUNT" == "0" ]]
then
# echo "$NAME: No errors"
exit 0
elif [[ "$COUNT" == "1" ]]
then
echo "$NAME: One error"
else
echo "$NAME: $COUNT errors"
fi
exit $COUNT
#EOF
@DanSalib
Copy link

Hey, thanks for sharing.
I've tested with a few channels and noticed that not all the videos from youtube are available in the RSS feed.
Has anyone else also encountered this and know why that is the case?

@obsti8383
Copy link

obsti8383 commented Jan 22, 2022

If you just want to extract the URL with an Javascript Bookmarklet, just copy the following snippet in a bookmark link:

javascript:(()=>{alert(ytInitialData.metadata.channelMetadataRenderer.rssUrl);})();

Thanks @tjluoma for the hint in your comments

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment