web-dev-qa-db-fra.com

L'incorporation de YouTube donne l'erreur "interdiction de lecture sur certains sites" malgré les métadonnées de l'API indiquant le contraire

J'essaie de faire en sorte que mon application client filtre les vidéos qui ne permettent pas l'intégration. D'après ce que j'ai compris, il n'y a aucun moyen de limiter le flux (c'est-à-dire que le format = 5 est insuffisant) et que je dois vérifier moi-même les propriétés de l'entrée pour les balises <yt:accessControl> et <app:control> et <yt:state>.

Cela ne fonctionne pas pour moi.

Par exemple, cette vidéo: https://www.youtube.com/watch?v=waxat-_tRH8

ne pas intégrer: https://www.youtube.com/embed/waxat-_tRH8

bien que les données retournées par l'API indiquent (autant que je sache) qu'elle devrait pouvoir intégrer: https://gdata.youtube.com/feeds/api/videos/waxat-_tRH8? v = 2

L'entrée ne contient pas d'étiquette <yt:noembed>(voir question précédente) et le <media:restriction type='country' relationship='deny'>ME DE RS</media:restriction> n'explique pas cela car je suis aux États-Unis (voir question précédente)(voir question précédente) .

Qu'est-ce que j'oublie ici?

EDIT: Le lien intégré ci-dessus fonctionne dans mon navigateur Web, mais pas dans la WebView de mon application client ....!?

11
justin k.

Certaines vidéos ont une liste blanche ou une liste noire au niveau du domaine qui leur est appliquée. Ceci est fait à la discrétion du propriétaire du contenu.

S'il existe une liste blanche ou une liste noire et que le domaine du site d'intégration ne peut pas être déterminé (peut-être en raison du fait qu'il n'existe pas de domaine de référence réel dans le cas de votre application native), le comportement par défaut consiste à bloquer la lecture.

Ce billet de blog contient également des informations un peu plus détaillées: http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html

8
Jeff Posnick

Comme Jeff Posnick a souligné , certaines vidéos ont des listes noires. Si vous essayez de demander une vidéo avec une liste noire d'une application et non d'une page Web, le message d'erreur suivant s'affichera:

"Cette vidéo contient du contenu provenant de ___. La lecture de certains sites est restreinte."

Il est probable que votre application ne figure PAS sur la liste noire et que votre liste est incorrecte. Pour résoudre ce problème, vous devez fournir à votre demande d'API Youtube une origine (comme indiqué par atulkhatri ). 

Dans l'en-tête de votre demande pour la vidéo Youtube, définissez Referer sur le domaine dans lequel vous souhaitez effectuer l'appel depuis , (par exemple, le domaine du site Web correspondant de votre application). Si vous n'avez pas de domaine, vous pouvez facilement écrire un autre domaine, et cela peut également fonctionner. 

  • Pour Android (Java), vous pouvez voir un exemple ici

  • Pour iOS, regardez ci-dessus

  • Pour React Native, vous pouvez utiliser la propriété Origin sur le composant de votre domaine (Origin est mentionné dans la documentation mais ne vous en dit pas beaucoup).

  • Voici un autre exemple du même problème dans un navigateur lorsqu'une extension a bloqué l'envoi de l'en-tête Referer pour une bonne mesure.

Cette réponse fonctionne pour l'API V3 de Youtube.

7
Jake

En fait, si vous intégrez votre vidéo ici:

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

Comme ça:

<!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>

C'est en fait jouable. Le problème revient donc à la raison pour laquelle cela fonctionne sur le site Web mais pas sur l'application mobile iOS?

Puis j'ai découvert ce post:

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

Il explique que l'intégration pourrait être restreinte en raison de l'absence du champ "référent" de l'en-tête HTTP.

Ainsi, après avoir défini le champ de référence, cette vidéo sera lue dans l'application 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, ça marche maintenant!

Es-tu heureux? Parce que je suis heureux. :)

6
RainCast

Vous pouvez utiliser cette réponse. Cela a parfaitement fonctionné dans mon cas-

Ajout de Origin dans player vars en tant que https://www.youtube.com

Voir cette réponse

3
atulkhatri

Pour ceux qui rencontrent le même problème dans webView sur Android. J'ai corrigé cela en ajoutant le champ d'en-tête du référent, comme ce que @RainCast a fait dans sa réponse. 

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

 webView.loadUrl(url, extraHeaders);

Cela fonctionne pour une URL pure, mais je ne sais pas comment passer ces paramètres lors de l'injection d'iFrame dans la webView.

0

Ajouter des lecteurs lors de l’initialisation de YouTube sdk:

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

Prendre plaisir!

0
Logic