Комментарии 42
Мммм… а как вы проигрываете видео на сайте? Используете свой плеер? Для чего вытягивание ссылки на ролик понадобилось? Я так и не понял :).
Раз вытянули — значит хотите воспроизводить на своем сайте, через свой плеер, но как вы обошли crossdomain.xml?
Согласно политики безопасности флеша, для того чтобы флеш утянул какой-то файл с другого домена (отличного от местоположения самой флешки) — в корне сайта должен лежать crossdomain.xml.
www.youtube.com/crossdomain.xml смотрим исходный код и видим, что это право дано только некоторым доменам.
<?xml version=«1.0»?>
<!DOCTYPE cross-domain-policy SYSTEM «www.macromedia.com/xml/dtds/cross-domain-policy.dtd»>
<cross-domain-policy>
<allow-access-from domain="*.youtube.com" />
<allow-access-from domain="*.ytimg.com" />
</cross-domain-policy>
Т.е. если мы вставим свой плеер и засунем туда ссылку на флеш ролик с ЮТуба — то ничего не получим. Тогда зачем вытаскивать ссылку? Не проще вставить готовый код плеера ЮТуба?
Раз вытянули — значит хотите воспроизводить на своем сайте, через свой плеер, но как вы обошли crossdomain.xml?
Согласно политики безопасности флеша, для того чтобы флеш утянул какой-то файл с другого домена (отличного от местоположения самой флешки) — в корне сайта должен лежать crossdomain.xml.
www.youtube.com/crossdomain.xml смотрим исходный код и видим, что это право дано только некоторым доменам.
<?xml version=«1.0»?>
<!DOCTYPE cross-domain-policy SYSTEM «www.macromedia.com/xml/dtds/cross-domain-policy.dtd»>
<cross-domain-policy>
<allow-access-from domain="*.youtube.com" />
<allow-access-from domain="*.ytimg.com" />
</cross-domain-policy>
Т.е. если мы вставим свой плеер и засунем туда ссылку на флеш ролик с ЮТуба — то ничего не получим. Тогда зачем вытаскивать ссылку? Не проще вставить готовый код плеера ЮТуба?
Вы правы обход файла crossdomain.xml, я пока не придумал и это есть большая проблема. Но решение загадки близко, поскольку к потоку, плеер, все таки, подключается.
По поводу вставить готовый код плеера. Это сделать можно, но как быть с тем что сайт сделан на Flash целиком (причем на AS 3.0)? Но и на этот вопрос есть ответ, «Можно», но с ограничениями после вставки плеера в flash-сайт мы не сможем управлять настройками плеера. И это еще пол беды, при такой вставке youtube отдает только один поток, т.е. если делать видео галерею у себя на flash-сайте первый полученный поток остается последним, поскольку нет возможности передать в загруженный плеер команду «NetStream.close()».
По поводу вставить готовый код плеера. Это сделать можно, но как быть с тем что сайт сделан на Flash целиком (причем на AS 3.0)? Но и на этот вопрос есть ответ, «Можно», но с ограничениями после вставки плеера в flash-сайт мы не сможем управлять настройками плеера. И это еще пол беды, при такой вставке youtube отдает только один поток, т.е. если делать видео галерею у себя на flash-сайте первый полученный поток остается последним, поскольку нет возможности передать в загруженный плеер команду «NetStream.close()».
crossdomain обойти можно только через редиректы. RSS так грабиться например.
Пример схемы:
RSS новость на сайте habra.ru (лежит на habra.ru)
PHP скрипт загружает habra ленту (можно просто file('habra.ru/lenta.php') ) и потом по строкам вывести весь контент. (echo ) — скрипт лежит уже на том сайте, где лежит наша флешка.
Flash грузит наш PHP скрипт. В итоге — мы не нарушает политику Flash'а, т.к. загружаем данные со своего же хоста.
С видео, я думаю такое не получиться, слишком большой объем вывода информации.
А crossdomain больше никак не обойти. Тема изъезжана на любом флешовском портале.
Вопрос в другом — зачем вообще Ютуб?!
Не проще ли сделать аплоад видео на вашем сайте, и загружать ролики непосредственно к вам на сервер? Или там ооооочень мало места? :).
Я понимаю, если б вы делали анонс Ютуба, и хотели сделать загрузку например ТОП50 с Ютуба. Но вы же наверяка хотите какие-то определенные ролики? Поэтому я считаю лучше всего сделать аплоад на сервер свой.
Пример схемы:
RSS новость на сайте habra.ru (лежит на habra.ru)
PHP скрипт загружает habra ленту (можно просто file('habra.ru/lenta.php') ) и потом по строкам вывести весь контент. (echo ) — скрипт лежит уже на том сайте, где лежит наша флешка.
Flash грузит наш PHP скрипт. В итоге — мы не нарушает политику Flash'а, т.к. загружаем данные со своего же хоста.
С видео, я думаю такое не получиться, слишком большой объем вывода информации.
А crossdomain больше никак не обойти. Тема изъезжана на любом флешовском портале.
Вопрос в другом — зачем вообще Ютуб?!
Не проще ли сделать аплоад видео на вашем сайте, и загружать ролики непосредственно к вам на сервер? Или там ооооочень мало места? :).
Я понимаю, если б вы делали анонс Ютуба, и хотели сделать загрузку например ТОП50 с Ютуба. Но вы же наверяка хотите какие-то определенные ролики? Поэтому я считаю лучше всего сделать аплоад на сервер свой.
Чтобы подконнектиться и показать flv поток разрешения кросдоменного файла не требуется, однако, Вы правы, он может понадобиться, чтобы, например, сделать скриншот с видео.
Как быть если если выскакивает ошибка о безопасности при попытке проиграть файл?
Такая ошибка может выскакивать, если Вы запускаете swf локально и грузите удаленный flv с youtube — политика безопасности )
Цитата (http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_01.html):
Loading sound and videos
All SWF files, other than those in the local-with-filesystem sandbox, are allowed to load sound and video from network origins, using the Sound.load(), NetConnection.connect(), and NetStream.play() methods.
Цитата (http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_01.html):
Loading sound and videos
All SWF files, other than those in the local-with-filesystem sandbox, are allowed to load sound and video from network origins, using the Sound.load(), NetConnection.connect(), and NetStream.play() methods.
Такого рода ресурсы полезны, чтоб скачивать файл себе на машину, а вот если нужно проигрывать его у себя в плеере, приходится выкручиваться как умеешь ;)
Получить страницу для скачивания, а потом взять на серваке распарсить её? или я чаго-то не понимаю…
«Получить страницу для скачивания» — это не совсем то что нужно. Здесь нужно получить прямую ссылку к потоку видео я точно не знаю какой медиасервер использует youtube, но по разобранному мною плееру могу предположить что это FMS. Если использовать PHP, ASP, или просто набрать полученную, прямую ссылку в браузере то вам предложат скачать файл из потока. А вот если попытаться тоже самое сделать из под flash то тут вступает политика безопасности с crossdomain.xml
as3youtubelib?
это слишком просто :) надо же навороченнее.
На YouTube иногда меняют алгоритмы получения ссылки на видео, последняя версия as3youtubelib датирована 2006 годом.
Эта версия рабочая?
Эта версия рабочая?
а скачать и проверить? или это надо мне делать? у них большое хорошо документированное АПИ. когда нам надо было, мы вообще не пользовались as3youtubelib. просто прочитали доку.
Зло не в моде, Вы как обычно.
Я тоже не использовал эту либу когда вытаскивал видео, делал сам. Но потом YouTube прикрыли лавочку.
Я тоже не использовал эту либу когда вытаскивал видео, делал сам. Но потом YouTube прикрыли лавочку.
а я не злой. я просто не очень люблю лентяев. я не понимаю, почему я должен делать лично для Вас, то что Вы можете сделать сами, и потратите ровно столько же времени. я бы понял, если бы у Вас не было возможности, или я прям был прям как рядом. но вы откопали пост полугодичной давности, и ждёте, что я всё брошу и побегу проверять для Вас какие-то там чужие решения. это как минимум странно.
Не правильным путем идете.
Ютубовским as2 плеером можно управлять через LocalConnection!
Есть специальный api-плеер без контролов youtube.com/apiplayer и сам api: code.google.com/intl/ru/apis/youtube/flash_api_reference.html
Ютубовским as2 плеером можно управлять через LocalConnection!
Есть специальный api-плеер без контролов youtube.com/apiplayer и сам api: code.google.com/intl/ru/apis/youtube/flash_api_reference.html
Попробуйте такую схему:
1. реализуйте свой сервер например на том же php и api к нему по http — из одного метода — с помощью которого ваша флешка будет общаться с сервером
2. флешка делает один запрос своему серверу передавая — открытый урл видео www.youtube.com/watch?v=lIZVEnyHoGU
3. сервер получив этот урл, выполняет всю вышеописанную вам логику по получении видео контента — и стартует wgetом закачку в свой сторедж, причем ассинхронно — чтобы не ждать окончания закачки — на пыхе это что то типа exec('load.php &') — те отдельным процессом,
load.php:
exec('wget -O /cache/video_timelabel.flv 'http://www.youtube.com/get_video.php?video_id=lIZVEnyHoGU&t= vjVQa1PpcFNnve5gW7h8B51Da_gr8T6BHzSFMbwf6Dw%3D'')
а обратно флешке сервер будет возвращать урл на видео со своего сервера, что то типа myhost.com/cache/video_timelabel.flv
4. флешка воспроизводит видео контент со своего сервера, который может параллельно докачиваться, соответственно перемотка вряд ли будет доступна.
Останется по максиму оптимизировать 3 шаг, но там по сути один дополнительный запрос к ютубу на получения инфы ролика + старт закачки, но по сути нормальный сервак с вменяемым каналом должен обрабатывать такие запросы шустро, так пользователь не заметить тормоза.
1. реализуйте свой сервер например на том же php и api к нему по http — из одного метода — с помощью которого ваша флешка будет общаться с сервером
2. флешка делает один запрос своему серверу передавая — открытый урл видео www.youtube.com/watch?v=lIZVEnyHoGU
3. сервер получив этот урл, выполняет всю вышеописанную вам логику по получении видео контента — и стартует wgetом закачку в свой сторедж, причем ассинхронно — чтобы не ждать окончания закачки — на пыхе это что то типа exec('load.php &') — те отдельным процессом,
load.php:
exec('wget -O /cache/video_timelabel.flv 'http://www.youtube.com/get_video.php?video_id=lIZVEnyHoGU&t= vjVQa1PpcFNnve5gW7h8B51Da_gr8T6BHzSFMbwf6Dw%3D'')
а обратно флешке сервер будет возвращать урл на видео со своего сервера, что то типа myhost.com/cache/video_timelabel.flv
4. флешка воспроизводит видео контент со своего сервера, который может параллельно докачиваться, соответственно перемотка вряд ли будет доступна.
Останется по максиму оптимизировать 3 шаг, но там по сути один дополнительный запрос к ютубу на получения инфы ролика + старт закачки, но по сути нормальный сервак с вменяемым каналом должен обрабатывать такие запросы шустро, так пользователь не заметить тормоза.
Спасибо за оригинальное решение, по пробую ваш способ, может этот способ сработает…
я думаю 3ий пункт будет сильно напрегать хостера. Выделять отдельный процесс для каждого загружаемого ролика — это жестоко. А если на сайт зашло 100 юзеров и все начали смотреть ролик?
exec('wget -O /cache/video_timelabel.flv 'http://www.youtube.com/get_video.php?video_id=lIZVEnyHoGU&t= vjVQa1PpcFNnve5gW7h8B51Da_gr8T6BHzSFMbwf6Dw%3D'')
это значит что в один и тот же файл, будет грузиться заново файл. Значит нужно назначать новое имя для каждой загрузки — а это значит будет больше места занимать. Значит после загрузок нужно чистить кэш — т.к. хранить видео у них нет места. А если чистить кэш каждый раз после просмотра — тогда смысл в этом?
Схема будет выглядеть так — зашол юзер на сайт. Начал смотреть ролик. Он начал грузиться на сервер с Ютуба, потом после просмотра — удаляется. Это жесть :).
exec('wget -O /cache/video_timelabel.flv 'http://www.youtube.com/get_video.php?video_id=lIZVEnyHoGU&t= vjVQa1PpcFNnve5gW7h8B51Da_gr8T6BHzSFMbwf6Dw%3D'')
это значит что в один и тот же файл, будет грузиться заново файл. Значит нужно назначать новое имя для каждой загрузки — а это значит будет больше места занимать. Значит после загрузок нужно чистить кэш — т.к. хранить видео у них нет места. А если чистить кэш каждый раз после просмотра — тогда смысл в этом?
Схема будет выглядеть так — зашол юзер на сайт. Начал смотреть ролик. Он начал грузиться на сервер с Ютуба, потом после просмотра — удаляется. Это жесть :).
абсолютно с вами не согласен, ибо вы слишком категоричны, но в теории, а практика всегда давала под зад теории. Когда есть горящие сроки — и безнадежные проекты.
1. отдельный процесс — wget качающий бинарный файл — это не тяжелый процесс — их может быть тысячи и сервер на пингвине будет прекрасно себя чувствовать
2. один и тот же ролик не будет качаться заново если реализовать кеширование — в виде хеш таблицы — где будут храниться преобразования — входного и выходного урла.
3. чистку старых файлов можно сделать сколь угодно долгой, не обязательно сутки, хотя бы 3 суток и вероятность одновременной закачки одного файла исключена.
а вообще если вы вы за красоту решений, то в разработке на флеше вам делать нечего. Флеш платформа это сурогат, технология как только не эволюционировала, уже не понятно куда флешь развивается, хотя flex фреймворк обнадеживает, но девелопмент под флеш это перманентное изъебство даже в самых тривиальных задачах — это участь всех flex разработчиков., нужно смерится.
1. отдельный процесс — wget качающий бинарный файл — это не тяжелый процесс — их может быть тысячи и сервер на пингвине будет прекрасно себя чувствовать
2. один и тот же ролик не будет качаться заново если реализовать кеширование — в виде хеш таблицы — где будут храниться преобразования — входного и выходного урла.
3. чистку старых файлов можно сделать сколь угодно долгой, не обязательно сутки, хотя бы 3 суток и вероятность одновременной закачки одного файла исключена.
а вообще если вы вы за красоту решений, то в разработке на флеше вам делать нечего. Флеш платформа это сурогат, технология как только не эволюционировала, уже не понятно куда флешь развивается, хотя flex фреймворк обнадеживает, но девелопмент под флеш это перманентное изъебство даже в самых тривиальных задачах — это участь всех flex разработчиков., нужно смерится.
Даааа… выглядет не воодушевляюще, но идея все равно хорошая.
Только при таком способе нет возможности смотреть ролик не с начала. =(
Уважаемый вы написали херню — для ютуба существует API и существует возможность использовать это АПИ у себя во флекс приложениях. Вы не поинтересовались этим вопросам, не учли что вас читают другие люди и запостили неработающий листинг. Исправьте пожалуйста положение, запостив лиьбо нормальный код, либо уберите это.
Вот мне интересно, уважаемый shaman4d, прежде чем писать комментарий вы пробовали использовать youtube API, для тех целей которые указанны в статье? Читали ли вы статью и комментарии к ней?
Прежде чем утверждать «Вы не поинтересовались этим вопросам» нужно сначала спросить интересовался я или нет.
Еще один момент, код полностью рабочий, только работает в тестовом режиме (во Flex или Flash), когда flash player не проверяет безопасность и наличие crossdomain.xml.
И последнее. Статья писалась именно для того чтоб ее читали и высказывали свое, конструктивное, мнение. Основанное на фактах, а не наличных представлениях об истине.
P.S. Но и ваш комментарий заслуживает должного внимания при правильном его прочтении (между строк).
Прежде чем утверждать «Вы не поинтересовались этим вопросам» нужно сначала спросить интересовался я или нет.
Еще один момент, код полностью рабочий, только работает в тестовом режиме (во Flex или Flash), когда flash player не проверяет безопасность и наличие crossdomain.xml.
И последнее. Статья писалась именно для того чтоб ее читали и высказывали свое, конструктивное, мнение. Основанное на фактах, а не наличных представлениях об истине.
P.S. Но и ваш комментарий заслуживает должного внимания при правильном его прочтении (между строк).
Конечно пробовал использовать и к тому же успешно. Я прочитал вашу статью, и уже сначала, как только вы сказали, что декомпилировали и начали лезть во внутренности, я уже знал что вы идете неверным путем — любой кто сталкивался с интеграцией ютуба знает что кроссдомейн является камнем преткновения. Следовательно, то что вы написали не является работоспособным, и вы должны понимать что заявления «у меня это работает на моем домашнем /офисном компьютере, при определенных условиях» мягко говоря не являются основанием для утверждения правильности и что самое главное, полезности вашего кода в таких количествах на страницах вашего поста.
Ну что ж с моей моей стороны, остается только убить себя веником за такую плохую статью :)
Не надо веником.
Возможно вам поможет эта статья:
Возможно вам поможет эта статья:
а где линка?
Спасибо, с удовольствием прочту, только ссылки нет :(
(рано отправилось)
blog.imagzstudio.com/2008/10/15/working-with-youtube-api-in-flex/
Похоже политика ютуба поменялась, и для использования апи теперь нужен developer key.
Впрочем его легко получить зарегистрировавшись в «YouTube APIs and Tools».
Инструменты и API YouTube — читаем здесь:
code.google.com/intl/ru-RU/apis/youtube/overview.html
blog.imagzstudio.com/2008/10/15/working-with-youtube-api-in-flex/
Похоже политика ютуба поменялась, и для использования апи теперь нужен developer key.
Впрочем его легко получить зарегистрировавшись в «YouTube APIs and Tools».
Инструменты и API YouTube — читаем здесь:
code.google.com/intl/ru-RU/apis/youtube/overview.html
статья про flash на хабре, классно!
Плохое решение. ютуб постоянно меняет что-то в параметрах видео, через полгода у вас все отвалится. Используйте официальное API, если есть.
Было время, я тоже долго пытался прикрутить YouTube к AS3-сайте. Игрался тщетно с LocalConnection, всякими поделками на эту тему. Но толком заставить правильно играть AS2-плейер от Гугля не смог. Максимум, чего добился — чтобы один-единственный раз видео игралось (после даже выгрузить не удавалось). В итоге плюнул и… запустил это дело через lightbox (slimbox). Кликаю ссылку на флеш-сайте — через джаваскрипт вызываю нужный метод slimbox-а и voila — поверх as3-сайта замечательно проигрывается ролик (с анимацией при старте и т.п., как-никак, jquery)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Проигрываем видео с YouTube используя Action script 3.0