Question

With Youtube api v2, there's easy way to get videos. Just send a query like this:

http://gdata.youtube.com/feeds/mobile/videos?max-results=5&alt=rss&orderby=published&author=OneDirectionVEVO

The Youtube api v2 also has an interactive demo page for building query: http://gdata.youtube.com/demo/index.html

With Youtube api v3, I don't know the corresponding way. Please point me the way with api v3.

Thank you!

Was it helpful?

Solution

The channels#list method will return a JSON with some information about the channel, including the playlist ID for the "uploads" playlist:

https://www.googleapis.com/youtube/v3/channels?part=contentDetails&forUsername=OneDirectionVEVO&key={YOUR_API_KEY}

With the playlist ID you can get the videos with the playlistItems#list method:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=UUbW18JZRgko_mOGm5er8Yzg&key={YOUR_API_KEY}

You can test those at the end of the documentation pages.

OTHER TIPS

This should do it. This code just gets and outputs the title but you can get any details you want

// Get Uploads Playlist
$.get(
   "https://www.googleapis.com/youtube/v3/channels",{
   part : 'contentDetails', 
   forUsername : 'USER_CHANNEL_NAME',
   key: 'YOUR_API_KEY'},
   function(data) {
      $.each( data.items, function( i, item ) {
          pid = item.contentDetails.relatedPlaylists.uploads;
          getVids(pid);
      });
  }
);

//Get Videos
function getVids(pid){
    $.get(
        "https://www.googleapis.com/youtube/v3/playlistItems",{
        part : 'snippet', 
        maxResults : 20,
        playlistId : pid,
        key: 'YOUR_API_KEY'},
        function(data) {
            var results;
            $.each( data.items, function( i, item ) {
                results = '<li>'+ item.snippet.title +'</li>';
                $('#results').append(results);
            });
        }
    );
}


<!--In your HTML -->
<ul id="results"></ul>

If quota cost is a consideration, it may be beneficial to follow this simple algorithm.

First grab the data from https://www.youtube.com/feeds/videos.xml?channel_id=... This is a simple XML feed which will give you the video ID's, but you cannot specify further 'parts' (stats, etc).

Using the video ID's from that list, do a query on the /videos API endpoint which allows for a comma-separated-list of video ID's which should only result in 1 quota cost, plus 0-2 for any additional part parameters. As @chrismacp points out, using the /search endpoint is simpler but has a quota cost of 100, which can add up quickly.

There is a resource consideration here (cpu, memory, etc) as you are making a second call, but I believe in many scenarios this can be a useful method.

Things have changed alot in V3 of the API. Here is a video that walks you through the v3 API calls needed to get a list of the videos uploaded in a given channel, with live demos using the API Explorer.

YouTube Developers Live: Getting a Channel's Uploads in v3 - https://www.youtube.com/watch?v=RjUlmco7v2M

In case it helps anyone here this is what I discovered and so far seems to be working well for me. I am authenticating the member via OAuth 2.0 prior to making this request, which will give me the authenticated members videos. As always, your personal mileage may vary :D

curl https://www.googleapis.com/youtube/v3/search -G \
-d part=snippet \
-d forMine=true \
-d type=video \
-d order=date \
-d access_token={AUTHENTICATED_ACCESS_TOKEN}

The equivalent of the request you posted is actually a search in the 3.0 api, not a playlist request. It's easier too to do it that way. You do need to excange the username for a channel ID though.

ex. GET https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=UUGhCVGZ0ZSpe5hJHWyiLwHA&key={YOUR_API_KEY}

Here is some code using the offical Google APIs Node library (https://github.com/google/google-api-nodejs-client)

const readJson = require("r-json");
const google = require('googleapis');
const Youtube = google.youtube('v3');

// DONT store your credentials in version control
const CREDENTIALS = readJson("/some/directory/credentials.json");

let user = "<youruser>";
let numberItems = 10; 

let channelConfig = {
  key: CREDENTIALS.youtube.API_KEY,
  part: "contentDetails",
  forUsername: user
};

Youtube.channels.list(channelConfig, function (error, data) {

  if (error) {
    console.log("Error fetching YouTube user video list", error);
    return;
  }

  // Get the uploads playlist Id
  let uploadsPlaylistId = data.items[0].contentDetails.relatedPlaylists.uploads;

  let playlistConfig = {
    part : 'snippet',
    maxResults : size,
    playlistId : uploadsPlaylistId,
    key: CREDENTIALS.youtube.API_KEY
  };

  // Fetch items from upload playlist
  Youtube.playlistItems.list(playlistConfig, function (error, data) {

    if (error) {
      console.log("Error fetching YouTube user video list", error);
    }

    doSomethingWithYourData(data.items);
  });
});

An alternative method may be to get the playlists for the currently oauth authenticated user via: property mine=true

where the oauth access_token is retrieved following authentification: https://developers.google.com/youtube/v3/guides/authentication

https://www.googleapis.com/youtube/v3/playlists?part=id&mine=true&access_token=ya29.0gC7xyzxyzxyz

Please don't use playlistitems.list if you want to get the videos of playlist with more then 300 videos. You can try it live in google link "https://developers.google.com/youtube/v3/docs/playlistItems/list" in "Try it" section. It returns undefined.

I have used in my project also. It returns undefined only.

In PHP: I used pageToken attribute to go to all page of playlist.I hope it can help you.

//step 1: get playlist id

 $response = file_get_contents("https://www.googleapis.com/youtube/v3/channels?key={$api_key}&forUsername={$channelName}&part=contentDetails");
 $searchResponse = json_decode($response,true);
 $data = $searchResponse['items'];
 $pid =  $data[0]['contentDetails']['relatedPlaylists']['uploads'];

//step 2: get all videos in playlist

 $nextPageToken = '';
 while(!is_null($nextPageToken)) {
     $request = "https://www.googleapis.com/youtube/v3/playlistItems?key={$api_key}&playlistId={$pid}&part=snippet&maxResults=50&pageToken=$nextPageToken";

    $response = file_get_contents($request);
    $videos = json_decode($response,true);

    //get info each video here...

   //go next page
    $nextPageToken = $videos['nextPageToken'];
}

In node.js, it can be achieved with following code.

Requires authKey and channelId as options object parameter.

cb callback is called after data is fetched.

async function fetchChannelInfo(options) {
  const channelUrl = `https://www.googleapis.com/youtube/v3/channels?part=contentDetails,statistics&id=${
    options.channelId
  }&key=${options.authKey}`;
  const channelData = await axios.get(channelUrl);

  return channelData.data.items[0];
}
function fetch(options, cb) {
  fetchChannelInfo(options).then((channelData) => {
    options.playlistId = channelData.contentDetails.relatedPlaylists.uploads;
    const paylistUrl = `https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId=${
      options.playlistId
    }&key=${options.authKey}`;

    axios
      .get(paylistUrl)
      .then((response) => {
        const payloadData = ;

        const videoList = [];
        response.data.items.forEach((video) => {
          videoList.push({
            publishedAt: video.snippet.publishedAt,
            title: video.snippet.title,
            thumbnails: thumbnails,
            videoId: video.snippet.resourceId.videoId,
          });
        });

        cb(null, videoList);
      })
      .catch((err) => {
        cb(err, null);
      });
  });
}

Note: axios is used for RESTful requests. To install

npm install axios
$.get(
    "https://www.googleapis.com/youtube/v3/channels",{
      part: 'snippet,contentDetails,statistics,brandingSettings',
      id: viewid,
      key: api},
      function(data){

        $.each(data.items, function(i, item){


          channelId = item.id;
          pvideo = item.contentDetails.relatedPlaylists.uploads;
          uploads(pvideo);
});

      });

Uploads Function can be

function uploads(pvideo){


       $.get(
        "https://www.googleapis.com/youtube/v3/playlistItems",{
          part: 'snippet',
          maxResults:12,
          playlistId:pvideo,
          key: api},
          function(data){


            $.each(data.items, function(i, item){

                 videoTitle = item.snippet.title;
             videoId = item.id;
            description = item.snippet.description;
            thumb = item.snippet.thumbnails.high.url;
            channelTitle = item.snippet.channelTitle;
            videoDate = item.snippet.publishedAt;
            Catagoryid = item.snippet.categoryId;
            cID = item.snippet.channelId;

            })
          }
        );
     }

function tplawesome(e,t){res=e;for(var n=0;n<t.length;n++){res=res.replace(/\{\{(.*?)\}\}/g,function(e,r){return t[n][r]})}return res}



$(function() {


    $(".form-control").click(function(e) {


       e.preventDefault();


       // prepare the request


       var request = gapi.client.youtube.search.list({


            part: "snippet",


            type: "video",


            q: encodeURIComponent($("#search").val()).replace(/%20/g, "+"),


            maxResults: 20,


            order: "viewCount",


            publishedAfter: "2017-01-01T00:00:00Z"


       }); 


       // execute the request


       request.execute(function(response) {


          var results = response.result;


          $("#results").html("");


          $.each(results.items, function(index, item) {


            $.get("tpl/item.html", function(data) {


                $("#results").append(tplawesome(data, [{"title":item.snippet.title, "videoid":item.id.videoId ,"descrip":item.snippet.description ,"date":item.snippet.publishedAt ,"channel":item.snippet.channelTitle ,"kind":item.id.kind ,"lan":item.id.etag}]));


            });


            


          });


          resetVideoHeight();


       });


    });


    


    $(window).on("resize", resetVideoHeight);


});



function resetVideoHeight() {


    $(".video").css("height", $("#results").width() * 9/16);


}



function init() {


    gapi.client.setApiKey("YOUR API KEY .... USE YOUR KEY");


    gapi.client.load("youtube", "v3", function() {


        // yt api is ready


    });


}

Check the Complete code here https://thecodingshow.blogspot.com/2018/12/youtube-search-api-website.html

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top