如果youtube视频存在,请检查服务器端

时间:2014-05-14 04:12:42

标签: node.js youtube-api

如何检查node.js应用服务器端是否存在youtube视频:

var youtubeId = "adase268_";

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

5 个答案:

答案 0 :(得分:4)

您不需要使用youtube API本身,您可以查找缩略图:

有效视频= 200 - 确定:

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

视频无效= 404 - 未找到:

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

我认为我可以在浏览器中完成这项工作,因为您可以从第三方网站加载图像而不会出现安全问题。但是测试它,它没有将404报告为错误,可能是因为内容主体仍然是有效的图像。由于您正在使用节点,因此您应该能够直接查看HTTP响应代码。

答案 1 :(得分:3)

我想不出一种方法,不涉及向视频链接发出单独的HTTP请求以查看它是否存在,除非您事先知道一组不活动,死或错误的视频ID

这是一个可能对你有用的例子。我不能轻易判断您是将其用作独立脚本还是作为Web服务器的一部分。下面的示例假设后者,假设您在/video?123videoId上调用Web服务器并让它响应或执行某些操作,具体取决于具有该ID的视频是否存在。它使用Node的request库,您可以使用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.

答案 2 :(得分:0)

@rodrigomartell在正确的轨道上,因为你的检查功能需要进行HTTP调用;但是,在大多数情况下,只检查youtube.com网址是行不通的。如果videoID是格式错误的ID(即少于11个字符或使用其方案中无效的字符),您将获得404,但如果它是正确形成的视频ID,恰好与视频不对应,您将会仍然得到200.最好使用这样的API请求(请注意,使用request-json库而不仅仅是请求库可能更容易):

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;
  }
 });
};

答案 3 :(得分:0)

使用youtube-feeds模块。工作速度快(~200ms),不需要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)

输出:

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

答案 4 :(得分:0)

您只需要查找缩略图。在NodeJS中,它将类似于

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。它非常快,因为statusCode 200/404只有标题检查而且没有加载图像。