Question

How to check if youtube video exists on node.js app server side:

var youtubeId = "adase268_";

// pseudo code
youtubeVideoExist = function (youtubeId){
   return true; // if youtube video exists
}
Was it helpful?

Solution 4

Using youtube-feeds module. Works fast (~200ms) and no need API_KEY

youtube = require("youtube-feeds");

existsFunc = function(youtubeId, callback) {
  youtube.video(youtubeId, function(err, result) {
    var exists;
    exists = result.id === youtubeId;
    console.log("youtubeId");
    console.log(youtubeId);
    console.log("exists");
    console.log(exists);
    callback (exists);
  });
};


var notExistentYoutubeId = "y0srjasdkfjcKC4eY"
existsFunc (notExistentYoutubeId, console.log)

var existentYoutubeId = "y0srjcKC4eY"
existsFunc (existentYoutubeId, console.log)

output:

❯ node /pathToFileWithCodeAbove/FileWithCodeAbove.js
youtubeId
y0srjcKC4eY
exists
true
true
youtubeId
y0srjasdkfjcKC4eY
exists
false
false

OTHER TIPS

You don't need to use the youtube API per-se, you can look for the thumbnail image:

Valid video = 200 - OK:

http://img.youtube.com/vi/gC4j-V585Ug/0.jpg

Invalid video = 404 - Not found:

http://img.youtube.com/vi/gC4j-V58xxx/0.jpg

I thought I could make this work from the browser since you can load images from a third-party site without security problems. But testing it, it's failing to report the 404 as an error, probably because the content body is still a valid image. Since you're using node, you should be able to look at the HTTP response code directly.

I can't think of an approach that doesn't involve making a separate HTTP request to the video link to see if it exists or not unless you know beforehand of a set of video IDs that are inactive,dead, or wrong.

Here's an example of something that might work for you. I can't readily tell if you're using this as a standalone script or as part of a web server. The example below assumes the latter, assuming you call a web server on /video?123videoId and have it respond or do something depending on whether or not the video with that ID exists. It uses Node's request library, which you can install with npm install request:

var request = require('request');

// Your route here. Example on what route may look like if called on /video?id=123videoId
app.get('/video', function(req, response, callback){
    var videoId = 'adase268_'; // Could change to something like request.params['id']
    request.get('https://www.youtube.com/watch?v='+videoId, function(error, response, body){
        if(response.statusCode === 404){
            // Video doesn't exist. Do what you need to do here.
        }
        else{
            // Video exists.
            // Can handle other HTTP response codes here if you like.
        }
    });
});

// You could refactor the above to take out the 'request.get()', wrap it in a function
// that takes a callback and re-use in multiple routes, depending on your problem.

@rodrigomartell is on the right track, in that your check function will need to make an HTTP call; however, just checking the youtube.com URL won't work in most cases. You'll get back a 404 if the videoID is a malformed ID (i.e. less than 11 characters or using characters not valid in their scheme), but if it's a properly formed videoID that just happens to not correspond to a video, you'll still get back a 200. It would be better to use an API request, like this (note that it might be easier to use the request-json library instead of just the request library):

request = require('request-json');

var client = request.newClient('https://www.googleapis.com/youtube/v3/');

youtubeVideoExist = function (youtubeId){
 var apikey ='YOUR_API_KEY'; // register for a javascript API key at the Google Developer's Console ... https://console.developers.google.com/
 client.get('videos/?part=id&id='+youtubeId+'&key='+apikey, function(err, res, body) {
  if (body.items.length) {
   return true; // if youtube video exists
  }
  else {
   return false;
  }
 });
};

All you need is to look for the thumbnail image. In NodeJS it would be something like

var http = require('http');

function isValidYoutubeID(youtubeID) {
  var options = {
    method: 'HEAD',
    host: 'img.youtube.com',
    path: '/vi/' + youtubeID + '/0.jpg'
  };

  var req = http.request(options, function(res) {
    if (res.statusCode == 200){
        console.log("Valid Youtube ID");
    } else {
        console.log("Invalid Youtube ID");
    }
  });

  req.end();
}

API_KEY is not needed. It is quite fast because there is only header check for statusCode 200/404 and image is not loaded.

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