埋め込みが許可されていない動画をクライアントアプリケーションで除外しようとしています。ここでの私の理解は、これを行うにはフィードを制限する方法がない(つまり、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では機能しません...!?
特定の動画には、ドメインレベルのホワイトリストまたはブラックリストが適用されています。これは、コンテンツ所有者の裁量で行われます。
ホワイトリストまたはブラックリストがあり、埋め込みサイトのドメインを判別できない場合(ネイティブアプリケーションの場合、実際の参照ドメインがないためなど)、デフォルトの動作は再生をブロックすることです。
このブログ投稿にはもう少し詳細があります: http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html
Jeff Posnickが指摘 のように、一部のビデオにはブラックリストがあります。ウェブページではなくアプリからブラックリスト付きの動画をリクエストしようとすると、次のエラーメッセージが表示されます。
「このビデオには___のコンテンツが含まれています。特定のサイトでの再生が制限されています。」
アプリがブラックリストに登録されておらず、誤ってブラックリストに登録されている可能性があります。これを修正するには、Youtube APIリクエストにOriginを指定する必要があります( atulkhatriが指摘したように )。
Youtubeビデオのリクエストヘッダーで、Referer
を呼び出し元のドメインに設定します、(for例:アプリの対応するウェブサイトのドメイン)。ドメインがない場合は、他のドメインを簡単に作成できますが、それでも機能する可能性があります。
Android(Java)の場合、例 ここ を参照できます。
IOSの場合 上記を参照
React Nativeの場合、コンポーネントのOrigin
プロップをドメインに使用できます(Origin
は ドキュメントに記載されています しかしそれについてはあまり説明しません)。
これは別の例です 拡張機能がReferer
ヘッダーの送信をブロックされた場合のブラウザーでの同じ問題の対策.
この回答は、YouTubeのV3 APIで機能します。
実際、ここに動画を埋め込むと:
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)
ワラ、今は動く!
幸せですか?幸せだから。 :)
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を挿入するときにこれらのパラメーターを渡す方法がわかりません。
YouTube SDKの初期化中にプレーヤー変数を追加します。
NSDictionary *playerVars = @{
@"Origin" : @"http://www.youtube.com",
};
[self.playerView loadWithVideoId:@"videoid" playerVars:playerVars];
楽しい!