web-dev-qa-db-ja.com

YouTubeの埋め込みにより、APIメタデータが他のことを示すにもかかわらず、「特定のサイトでの再生が制限されています」エラーが発生する

埋め込みが許可されていない動画をクライアントアプリケーションで除外しようとしています。ここでの私の理解は、これを行うにはフィードを制限する方法がない(つまり、format = 5では不十分)ことと、<yt:accessControl>タグと<app:control>タグと<yt:state>タグについて、自分でエントリのプロパティを確認する必要があることです。

これではうまくいきません。

たとえば、このビデオ: 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:noembed>タグが含まれていない (前の質問を参照) と私は米国にいるため、<media:restriction type='country' relationship='deny'>ME DE RS</media:restriction>はこれを説明していません (前の質問を参照)(前の質問を参照してください)

ここで何が欠けていますか?

編集:上記の埋め込みリンクは私のWebブラウザーでは機能しますが、クライアントアプリのWebViewでは機能しません...!?

11
justin k.

特定の動画には、ドメインレベルのホワイトリストまたはブラックリストが適用されています。これは、コンテンツ所有者の裁量で行われます。

ホワイトリストまたはブラックリストがあり、埋め込みサイトのドメインを判別できない場合(ネイティブアプリケーションの場合、実際の参照ドメインがないためなど)、デフォルトの動作は再生をブロックすることです。

このブログ投稿にはもう少し詳細があります: http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html

9
Jeff Posnick

Jeff Posnickが指摘 のように、一部のビデオにはブラックリストがあります。ウェブページではなくアプリからブラックリスト付きの動画をリクエストしようとすると、次のエラーメッセージが表示されます。

「このビデオには___のコンテンツが含まれています。特定のサイトでの再生が制限されています。」

アプリがブラックリストに登録されておらず、誤ってブラックリストに登録されている可能性があります。これを修正するには、Youtube APIリクエストにOriginを指定する必要があります( atulkhatriが指摘したように )。

Youtubeビデオのリクエストヘッダーで、Refererを呼び出し元のドメインに設定します、(for例:アプリの対応するウェブサイトのドメイン)。ドメインがない場合は、他のドメインを簡単に作成できますが、それでも機能する可能性があります。

  • Android(Java)の場合、例 ここ を参照できます。

  • IOSの場合 上記を参照

  • React Nativeの場合、コンポーネントのOriginプロップをドメインに使用できます(Originドキュメントに記載されています しかしそれについてはあまり説明しません)。

  • これは別の例です 拡張機能がRefererヘッダーの送信をブロックされた場合のブラウザーでの同じ問題の対策.

この回答は、YouTubeのV3 APIで機能します。

9
Jake

実際、ここに動画を埋め込むと:

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)

ワラ、今は動く!

幸せですか?幸せだから。 :)

6
RainCast

この回答を使用できます。これは私の場合完全に機能しました

player varsOriginhttps://www.youtube.comとして追加

この回答を参照

3
atulkhatri

AndroidのwebViewで同じ問題が発生する場合。 @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を挿入するときにこれらのパラメーターを渡す方法がわかりません。

1

YouTube SDKの初期化中にプレーヤー変数を追加します。

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

楽しい!

0
Logic