Встраивание 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> не объясняет это, так как я нахожусь в США (см. предыдущий вопрос) (см. предыдущий вопрос).

Что мне здесь не хватает?

EDIT: ссылка на ссылку выше работает в моем веб-браузере, но не в моем клиентском приложении WebView....!?

Ответ 1

У некоторых видеообъявлений есть белый список домена или черный список. Это делается по усмотрению владельца контента.

Если есть белый список или черный список, а домен сайта внедрения не может быть определен (возможно, из-за того, что он не является реальным ссылочным доменом в случае вашего родного приложения), тогда поведение по умолчанию блокировать воспроизведение.

В этом сообщении блога также есть более подробная информация: http://youtube-eng.blogspot.co.uk/2011/12/understanding-playback-restrictions_28.html

Ответ 2

Как Джефф Поскик указал, некоторые видео имеют черные списки. Если вы попробуете и запросите видео с черным списком из приложения, а не с веб-страницы, вы увидите это сообщение об ошибке:

"Это видео содержит контент от ___. Он ограничен воспроизведением на определенных сайтах."

Скорее всего, ваше приложение не занесено в черный список и что вы попали в черный список неправильно. Чтобы исправить это, вам нужно предоставить свой запрос API Youtube с указанием источника (как указано atulkhatri).

В заголовке запроса для видео Youtube установите Referer в домен, в котором вы намерены совершать вызов от (например, на домен вашего соответствующего веб-сайта приложения). Если у вас нет домена, вы можете легко написать какой-либо другой домен, и это тоже может работать.

  • Для Android (Java) вы можете увидеть пример здесь.

  • Для iOS, смотрите выше

  • Для React Native вы можете использовать опору origin для компонента в своем домене (origin is упомянутый в документах, но не рассказать вам об этом).

  • Вот еще один пример той же проблемы в браузере, когда расширение блокировало заголовок Referer для отправки хорошая мера.

Этот ответ работает для V3 API Youtube.

Ответ 3

Собственно, если вы вставляете свое видео здесь:

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, теперь он работает!

Вы счастливы? потому что я счастлив.:)

Ответ 4

Вы можете использовать этот ответ. Это отлично сработало в моем случае -

Добавление origin в player vars в качестве https://www.youtube.com

См. этот ответ

Ответ 5

Для тех, кто испытывает ту же проблему в webView на Android. Я исправил это, добавив поле заголовка 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-адреса, но я не знаю, как передать эти параметры при вводе iFrame в webView.

Ответ 6

Добавьте игровые ваны при инициализации youtube sdk:

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

Наслаждайтесь!

Ответ 7

попробуйте это вместо

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