Last active
May 31, 2025 20:28
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/>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
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
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?