Home > Mobile >  Retrieve all my subscriptions in Google Sheets
Retrieve all my subscriptions in Google Sheets

Time:08-24

I'm using YouTube Data API v3 and Google Apps Script for retrieve all my subscriptions.

The problem I'm facing is that - using the following code, the response brings duplicated channels:

do {
  const mySubsResponse = YouTube.Subscriptions.list('snippet', {
    mine: true,
    //channelId: "<MY_CHANNEL_ID>",
    maxResults: 50,
    fields: "pageInfo(totalResults),nextPageToken,items(snippet(title,resourceId(channelId)))"
  });
  if (!mySubsResponse || mySubsResponse == undefined) {
    Logger.log('No subscriptions found.');
    SpreadsheetApp.getUi().alert("No subscriptions found.");
    break;
  }

  // Loop all my subscriptions found in the response: 
  for (let j = 0; j < mySubsResponse.items.length; j  ) {
    const mySubItem = mySubsResponse.items[j];
    sheet.getRange("H"   incrSub).setValue(mySubItem.snippet.title);
    sheet.getRange("I"   incrSub).setValue(mySubItem.snippet.resourceId.channelId);
    incrSub  ;
  }
  nextPageToken = mySubsResponse.nextPageToken;
} while (nextPageToken);

I believe this is due each item in the response is actually the video uploaded by the channel I'm subscribed to - I don't think it's a problem with the page token.

In the code above, I've commented the channelId parameter and I've testted with both: mine:true and channelId:<MY_CHANNEL_ID> and, the totalResults shows me I have 479 subscriptions, but, when I'm looping the results,

For example, I'm subscribed to the channel called "Channel_1"; this channel had uploaded three videos today. The response of the code above brings me "Channel_1" three times, when it should be only 1 - because I'm subscribed to "Channel_1" once.

What I want to get is a list of all channels I'm subscribed to.

I've checked the subscriptions:list documentation, but, it's not clear how I can get my subscriptions only.

If the subscriptions:list endopint is not the correct one for this task, which endpoint enables me to bring the desired results?1


1a list of all channels I'm subscribed to.

CodePudding user response:

After checking more closely (and, I admit, after a little break I have), I finally found the problem and the solution:

The problem is: I wasn't using the nextPageToken in every loop, so, basically, I was requesting the same page without actually making any pagination.

In this section:

const mySubsResponse = YouTube.Subscriptions.list('snippet', {
  mine: true,
  //channelId: "<MY_CHANNEL_ID>",
  maxResults: 50,
  fields: "pageInfo(totalResults),nextPageToken,items(snippet(title,resourceId(channelId)))"
});

Can be seen that the pageToken: nextPageToken is not defined.

Then, the solution is:

  • Modify the code for sending the nextPageToken obtained.

This is the modified code:

// Call my subscriptions: 

/** Token pagination. */
var nextPageToken = "";

/** Row position where to start writing the results. */
var incrSub = 6;

/**
 * Get all my subscriptions.
 */
do {
  const mySubsResponse = YouTube.Subscriptions.list('snippet', {
    channelId: "<MY_CHANNEL_ID>", // also works with "mine: true".
    maxResults: 50,
    // Here, the first time the call is made, the "nextPageToken" value 
    // is empty. In every iteration (if "nextPageToken" is retrieved), 
    // the "nextPageToken" is used - in order to get the next page.
    pageToken: nextPageToken, 
    fields: "nextPageToken,items(snippet(title,resourceId(channelId)))"
  });
  if (!mySubsResponse || mySubsResponse == undefined) {
    Logger.log('No subscriptions found.');
    SpreadsheetApp.getUi().alert("No subscriptions found.");
    break;
  }

  // Write the subscriptions returned in the response: 
  for (let j = 0; j < mySubsResponse.items.length; j  ) {
    const mySubItem = mySubsResponse.items[j];
    sheet.getRange("H"   incrSub).setValue(mySubItem.snippet.title);
    sheet.getRange("I"   incrSub).setValue(mySubItem.snippet.resourceId.channelId);
    incrSub  ;
  }

  // Check the token: 
  try {
    if (mySubsResponse.nextPageToken != null || mySubsResponse.nextPageToken != undefined) {
      nextPageToken = mySubsResponse.nextPageToken;
    } else {
      nextPageToken = undefined;
      break;
    }
  } catch (ex_page) {
    // An error occurred. Check closely the code.
  }
} while (nextPageToken != undefined);

With this modified code, all of my subscriptions are returned successfully.

  • Related