Skip to content

Instantly share code, notes, and snippets.

@hazycora
Last active October 20, 2024 16:05
Show Gist options
  • Save hazycora/bc41e673aff4c9c7846d80e145574285 to your computer and use it in GitHub Desktop.
Save hazycora/bc41e673aff4c9c7846d80e145574285 to your computer and use it in GitHub Desktop.
Export YouTube subscriptions in CSV Google Takeout format.

Go to youtube.com/feed/channels

The page should display a list of your YouTube subscriptions. Run the following JavaScript in the console. Your YouTube subscriptions will be displayed on screen for you to copy-paste.

This CSV response can be saved and imported into other apps which can load Google Takeout subscription files, such as NewPipe.

function getLast() {
  return ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents.slice(-1)[0]
}
function canContinue() { return getLast().continuationItemRenderer != null }
(async () => {
  while (canContinue()) {
    let current = getLast().continuationItemRenderer.continuationEndpoint.continuationCommand.token;
    scrollTo(0, document.getElementById('primary').scrollHeight);
    while (canContinue() && current == getLast().continuationItemRenderer.continuationEndpoint.continuationCommand.token) {
      await new Promise(r => setTimeout(r, 100));
    }
  }
  scrollTo(0, 0);
  let floatDiv = document.createElement('div');
  let preText = document.createElement('pre');
  floatDiv.setAttribute('style', `position: fixed;
  background: #0f0f0f;
  z-index: 100000;
  inset: 2rem;
  overflow: auto;
  font-size: 2rem;
  white-space: pre;
  color: white;
  padding: 1rem;`);
  let csvText = "Channel Id,Channel Url,Channel Title\n" + ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents.map(e => {
    if (!e.itemSectionRenderer) return;
    return e.itemSectionRenderer.contents[0].shelfRenderer.content.expandedShelfContentsRenderer.items
  }).flat().map(e => {
    if (e && e.channelRenderer) return `${e.channelRenderer.channelId},http://www.youtube.com/channel/${e.channelRenderer.channelId},${e.channelRenderer.title.simpleText}`;
    return '';
  }).join('\n');
  preText.innerText = csvText;
  let downloadLink = document.createElement('a');
  downloadLink.innerText = 'Download CSV';
  downloadLink.setAttribute('target', '_blank');
  downloadLink.setAttribute('style', `color: #bf3838;
  font-weight: bold;
  margin-bottom: 1rem;
  display: block;
  padding: 1rem;
  border-radius: 0.5rem;
  border: 2px solid #bf3838;
  width: fit-content;
  text-decoration: none;`);
  var t = new Blob([csvText], { type: "text/plain" });
  downloadLink.href = window.URL.createObjectURL(t)
  floatDiv.appendChild(downloadLink);
  floatDiv.appendChild(preText);
  document.body.appendChild(floatDiv);
})()

For convenience, you can make a bookmarklet. Just make a new bookmark and set the URL to the following:

javascript:(()=>{function getLast(){return ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents.slice(-1)[0]}function canContinue(){return getLast().continuationItemRenderer!=null}(async()=>{while(canContinue()){let current=getLast().continuationItemRenderer.continuationEndpoint.continuationCommand.token;scrollTo(0,document.getElementById('primary').scrollHeight);while(canContinue()&&current==getLast().continuationItemRenderer.continuationEndpoint.continuationCommand.token){await new Promise(r=>setTimeout(r,100))}}scrollTo(0,0);let floatDiv=document.createElement('div');let preText=document.createElement('pre');floatDiv.setAttribute('style',`position: fixed; background: #0f0f0f;%20z-index:%20100000;%20inset:%202rem;%20overflow:%20auto;%20font-size:%202rem;%20white-space:%20pre;%20color:%20white;%20padding:%201rem;`);let%20csvText="Channel%20Id,Channel%20Url,Channel%20Title\n"+ytInitialData.contents.twoColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents.map(e=>{if(!e.itemSectionRenderer){return}return%20e.itemSectionRenderer.contents[0].shelfRenderer.content.expandedShelfContentsRenderer.items}).flat().map(e=>{if(e&&e.channelRenderer){return%20`${e.channelRenderer.channelId%20},http://www.youtube.com/channel/${e.channelRenderer.channelId%20},${e.channelRenderer.title.simpleText%20}`}return%20''}).join('\n');preText.innerText=csvText;let%20downloadLink=document.createElement('a');downloadLink.innerText='Download%20CSV';downloadLink.setAttribute('target','_blank');downloadLink.setAttribute('style',`color:%20#bf3838;%20font-weight:%20bold;%20margin-bottom:%201rem;%20display:%20block;%20padding:%201rem;%20border-radius:%200.5rem;%20border:%202px%20solid%20#bf3838;%20width:%20fit-content;%20text-decoration:%20none;`);var%20t=new%20Blob([csvText],{type:"text/plain"});downloadLink.href=window.URL.createObjectURL(t);floatDiv.appendChild(downloadLink);floatDiv.appendChild(preText);document.body.appendChild(floatDiv)})();})();

Then, you can click on the bookmark while at youtube.com/feed/channels to see your subscriptions in CSV format.

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