尽管API元数据另有说明,但YouTube嵌入功能会“限制在某些网站上播放”错误

时间:2012-11-15 22:38:11

标签: youtube youtube-api

我正在尝试让我的客户端应用程序过滤掉不允许嵌入的视频。我的理解是,没有办法限制feed(即格式= 5不足)来执行此操作,并且我必须自己检查条目的属性,<yt:accessControl>标记和{{1} }和<app:control>代码。

这对我不起作用。

例如,此视频: https://www.youtube.com/watch?v=waxat-_tRH8

没有嵌入: https://www.youtube.com/embed/waxat-_tRH8

即使API返回的数据表明(据我所知)它应该能够嵌入: https://gdata.youtube.com/feeds/api/videos/waxat-_tRH8?v=2

该条目不包含任何<yt:state>代码(see prior question)<yt:noembed>无法解释此问题,因为我在美国(see prior question) (see prior question)

我在这里缺少什么?

编辑:上面的嵌入链接在我的网络浏览器中有效,但不在我的客户端应用程序的WebView中....!

7 个答案:

答案 0 :(得分:8)

某些视频应用了域级白名单或黑名单。这是由内容所有者自行决定的。

如果存在白名单或黑名单,并且无法确定嵌入网站的域(可能是因为在您的本机应用程序中没有真正的引用域),则默认行为是阻止播放。

此博客文章还有一些细节:http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html

答案 1 :(得分:7)

作为Jeff Posnick pointed out,有些视频有黑名单。如果您尝试从应用程序而非网页请求带有黑名单的视频,您将看到以下错误消息:

  

&#34;此视频包含___的内容。限制在某些网站上播放。&#34;

您的应用可能不会被列入黑名单,并且您被错误地列入黑名单。要解决此问题,您需要提供包含来源的Youtube API请求(atulkhatri pointed out)。

在Youtube视频的请求标题中,将Referer设置为您打算通过进行通话的域名(例如,您应用的域名&#39) ;相应的网站)。如果您没有域名,则可以轻松编写其他域名,这也可能有效。

  • 对于Android(Java),您可以看到示例here

  • 对于iOS,look above

  • 对于React Native,您可以使用域中origin道具origin道具Referer mentioned in the docs但不会告诉您更多信息)

  • Here is another example当浏览器阻止<!DOCTYPE html> <html> <head> <title></title> <script src="script.js"></script> </head> <body> </body> </html> 标题被发送以获得良好衡量标准时,浏览器中存在同一问题。

这个答案适用于Youtube的V3 API。

答案 2 :(得分:6)

实际上,如果您在此处嵌入视频:

http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default

像这样:

<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
<iframe width="420" height="315" src="https://www.youtube.com/embed/waxat-_tRH8" frameborder="0" allowfullscreen></iframe>
</body>
</html>

它实际上是可玩的。所以这个问题实际上回到了为什么它在网站上运行而不是iOS移动应用程序?

然后我发现了这篇文章:

http://support.metacdn.com/hc/en-us/articles/204513985-Video-Player-Embed-Restriction

它解释了由于缺少HTTP标头“Referer”字段,嵌入可能会受到限制。

因此,在设置引荐字段后,此视频将在iOS应用中播放:

let youtubeURL = NSURL(string: "https://www.youtube.com/embed/YQHsXMglC9A?autoplay=1") 
let youtubeRequest = NSMutableURLRequest(URL: youtubeURL!) 
youtubeRequest.setValue("https://www.youtube.com", forHTTPHeaderField: "Referer") 
webView.loadRequest(youtubeRequest)

Wala,它现在有效!

你快乐吗?因为我很开心:)

答案 3 :(得分:3)

您可以使用此答案。这完全符合我的情况 -

origin中添加player vars作为https://www.youtube.com

See this answer

答案 4 :(得分:0)

对于那些在Android上的webView中遇到相同问题的人。我通过添加referer头字段来修复它,类似于@RainCast在她的答案中所做的。

 Map<String, String> extraHeaders = new HashMap<>();
 extraHeaders.put("Referer", "http://youtube.com");
 String url = "https://www.youtube.com/embed/dQw4w9WgXcQ";

 webView.loadUrl(url, extraHeaders);

它适用于纯URL,但我不知道如何在webView中注入iFrame时传递这些参数。

答案 5 :(得分:0)

在初始化youtube sdk时添加播放器变量:

NSDictionary *playerVars = @{
                             @"origin" : @"http://www.youtube.com",
                             };
[self.playerView loadWithVideoId:@"videoid" playerVars:playerVars];

享受!

答案 6 :(得分:-1)

尝试这样做

<iframe width="300" height="200" src="www.youtube.com/embed/<video-id>?enablejsapi=1" frameborder="0" allowfullscreen></iframe>