Last active
July 24, 2024 19:14
-
-
Save JuniorJPDJ/aa26d4c61bc1e78af039e9a17bc17907 to your computer and use it in GitHub Desktop.
Youtube Search RSS generator (deployable on Google Apps Script)
This file contains 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
function getSearchRSS(query){ | |
let results = YouTube.Search.list('id, snippet', { | |
q: query, | |
maxResults: 50, | |
order: 'date' | |
}); | |
let encoded_query = encodeURIComponent(query) | |
let rss_url = ScriptApp.getService().getUrl() + "?" + encoded_query; | |
let channel = XmlService.createElement("channel") | |
.addContent(XmlService.createElement("title").addContent(XmlService.createText("Youtube Search RSS Feed: " + query))) | |
.addContent(XmlService.createElement("link").addContent(XmlService.createText("https://www.youtube.com/results?search_query=" + encoded_query))) | |
.addContent(XmlService.createElement("description").addContent(XmlService.createText("Youtube Search RSS feed for search query '" + query + "' updated on " + (new Date())))) | |
.addContent(XmlService.createElement("link", XmlService.getNamespace("atom", "http://www.w3.org/2005/Atom")).setAttribute("rel", "self").setAttribute("href", rss_url)); | |
for(let i = 0; i < results.items.length; ++i){ | |
let video = results.items[i]; | |
let yt_url = "https://www.youtube.com/watch?v=" + video.id.videoId; | |
channel.addContent(XmlService.createElement("item") | |
.addContent( | |
XmlService.createElement("title").addContent(XmlService.createText(video.snippet.title)) | |
).addContent( | |
XmlService.createElement("link").addContent(XmlService.createText(yt_url)) | |
).addContent( | |
XmlService.createElement("description").addContent(XmlService.createText(video.snippet.description)) | |
).addContent( | |
XmlService.createElement("pubDate").addContent(XmlService.createText(Utilities.formatDate(new Date(video.snippet.publishedAt), "EDT", "EEE, dd MMM yyyy HH:mm:ss Z"))) | |
).addContent( | |
XmlService.createElement("guid").addContent(XmlService.createText(yt_url)) | |
)) | |
} | |
return XmlService.getPrettyFormat().format(XmlService.createDocument( | |
XmlService.createElement("rss").setAttribute("version", "2.0").addContent(channel) | |
)); | |
} | |
function doGet(req) { | |
let query = decodeURIComponent(req.queryString); | |
return ContentService.createTextOutput(getSearchRSS(query)) | |
.setMimeType(ContentService.MimeType.RSS) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Awesome! Thank you so much. What an useful script!
Can you tell me how to incorporate a YouTube operator into the query? I would like to retrieve only videos longer than 20 minutes. I can´t get it running by adding ", long" to the query though.
EDIT:
I also tried adding the parameter videoDuration: 'long' to the results string (based on https://developers.google.com/youtube/v3/docs/search/list). However, it seems to have zero effect.