Встраивание 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>