Несколько дней назад я опубликовал пост про загрузку видео на YouTube посредством API системы. Сегодня хочу представить продолжение, в котором будет рассказано про редактирование уже загруженных роликов, получение их статуса и удаление.
Стоит, пожалуй, еще раз отметить, что весь код приводится на некотором диалекте PHP и с легкостью может быть трансформирован и настроен под ваши нужды. Прошлый пост вызвал большое количество откликов в личную почту, аську, и даже предложение о работе, поэтому продолжение, как я думаю, более чем уместно.
Первым пунктом я отмечу факт, о котором в комментариях говорил iexx. А именно, был, упомянут класс Zend_Gdata. Класс действительно решает все описываемые задачи, своими же постами я просто показываю, на что способен YouTube API и демонстрирую примеры рабочего кода.
Почти все запросы отправляются на обработчик gdata.youtube.com, в документации в зависимости от необходимого действия меняются методы отправки данных — это может быть PUT, POST, DELETE или GET – рекомендую на это обращать особое внимание.
Как все знают, да я об этом упоминал в прошлом посте, каждое видео, размещенное на YouTube, получает свой уникальный 11-значный код, например eTpTy2Kvj4o, сразу после загрузки видео. Знание этого кода позволяет получать необходимую информацию о видео от сервера. Любое загруженное видео, проходит процедуру кодирования на серверах видеохостинга, и время, которое понадобится для выполнения этой операции, зависит от загруженности серверов хостинга, и собственно размера видео.
До тех пор, пока видео не будет кодировано и не получит соответствующий статус, мы не сможем по понятным причинами ни редактировать его, ни получать мета-данные о размещенном видео.
Для получения мета-данных, и значения статуса видео необходимо обратиться GET`ом к странице gdata.youtube.com/feeds/api/videos/КОД_ВИДЕО, например http://gdata.youtube.com/feeds/api/videos/eTpTy2Kvj4o (посмотрите в браузере). Если сервер возвращает 404-ошибку, это может означать, что видео не существует, или оно еще не прошло кодирование. Иногда, в своем аккаунте YouTube вы можете видеть видео, но через GData интерфейс оно еще не будет доступно – так бывает. Минут через 15-20 все встанет на свои места.
Ответ сервера представлен в виде куска XML в формате Atom (смотрите приведенную выше ссылку), из него мы можем вытащить мета-данные, например, название, имя автора, размер видео, теги, категорию, получить массив тумбнейлов и так далее. То есть, получение данных о видео сводится к тривиальной задаче парсинга XML.
Процедура редактирования видео очень похожа на процедуру сохранения мета-данных о видео, перед загрузкой. Сначала формируем XML, в котором перечислены название, описание, категория и теги:
После этого методом PUT отправляем этот кусок на gdata.youtube.com /feeds/api/users/YOUTUBE_USERNAME/uploads/КОД_ВИДЕО, например таким образом:
Все, данные отправлены! Я опять же умышленно обхожу стороной вопрос обработки ошибок, оставляя это на совести программиста. Значение API_NAME, API_KEY и других – смотрите в прошлом посте.
И, наконец, удаление видео. Здесь опять же все очень просто, меняется только метод «доставки данных», на этот раз – это DELETE. Код в этом случае будет примерно такой:
Ну, вот собственно и все, о чем я хотел рассказать сегодня в частности, и о YouTube API в целом. Остальные задачи вполне решаемы и покажутся простыми при чтении документации.
Стоит, пожалуй, еще раз отметить, что весь код приводится на некотором диалекте PHP и с легкостью может быть трансформирован и настроен под ваши нужды. Прошлый пост вызвал большое количество откликов в личную почту, аську, и даже предложение о работе, поэтому продолжение, как я думаю, более чем уместно.
Первым пунктом я отмечу факт, о котором в комментариях говорил iexx. А именно, был, упомянут класс Zend_Gdata. Класс действительно решает все описываемые задачи, своими же постами я просто показываю, на что способен YouTube API и демонстрирую примеры рабочего кода.
Почти все запросы отправляются на обработчик gdata.youtube.com, в документации в зависимости от необходимого действия меняются методы отправки данных — это может быть PUT, POST, DELETE или GET – рекомендую на это обращать особое внимание.
Как все знают, да я об этом упоминал в прошлом посте, каждое видео, размещенное на YouTube, получает свой уникальный 11-значный код, например eTpTy2Kvj4o, сразу после загрузки видео. Знание этого кода позволяет получать необходимую информацию о видео от сервера. Любое загруженное видео, проходит процедуру кодирования на серверах видеохостинга, и время, которое понадобится для выполнения этой операции, зависит от загруженности серверов хостинга, и собственно размера видео.
До тех пор, пока видео не будет кодировано и не получит соответствующий статус, мы не сможем по понятным причинами ни редактировать его, ни получать мета-данные о размещенном видео.
Для получения мета-данных, и значения статуса видео необходимо обратиться GET`ом к странице gdata.youtube.com/feeds/api/videos/КОД_ВИДЕО, например http://gdata.youtube.com/feeds/api/videos/eTpTy2Kvj4o (посмотрите в браузере). Если сервер возвращает 404-ошибку, это может означать, что видео не существует, или оно еще не прошло кодирование. Иногда, в своем аккаунте YouTube вы можете видеть видео, но через GData интерфейс оно еще не будет доступно – так бывает. Минут через 15-20 все встанет на свои места.
Ответ сервера представлен в виде куска XML в формате Atom (смотрите приведенную выше ссылку), из него мы можем вытащить мета-данные, например, название, имя автора, размер видео, теги, категорию, получить массив тумбнейлов и так далее. То есть, получение данных о видео сводится к тривиальной задаче парсинга XML.
Процедура редактирования видео очень похожа на процедуру сохранения мета-данных о видео, перед загрузкой. Сначала формируем XML, в котором перечислены название, описание, категория и теги:
$data = "<?xml version='1.0'?>
<entry xmlns='http://www.w3.org/2005/Atom'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:yt='http://gdata.youtube.com/schemas/2007'>
<media:group>
<media:title type='plain'>$name</media:title>
<media:description type='plain'>".$descr."</media:description>
<media:category scheme='http://gdata.youtube.com/schemas/2007/categories.cat'>".$category."</media:category>
<media:keywords>".$tags."</media:keywords>
</media:group>
";После этого методом PUT отправляем этот кусок на gdata.youtube.com /feeds/api/users/YOUTUBE_USERNAME/uploads/КОД_ВИДЕО, например таким образом:
if ($fp = fsockopen ("gdata.youtube.com", 80, $errno, $errstr, 20))
{
$request ="PUT /feeds/api/users/YOUTUBE_USERNAME/uploads/КОД_ВИДЕО" HTTP/1.1\r\n";
$request.="Host: gdata.youtube.com\r\n";
$request.="Content-Type: application/atom+xml; charset=UTF-8\r\n";
$request.="Content-Length: ".strlen($data)."\r\n";
$request .="Authorization: GoogleLogin auth= AUTH_TOKEN \r\n";
$request.="X-GData-Client: API_NAME \r\n";
$request.="X-GData-Key: key=API_KEY\r\n";
$request.="\r\n";
$request.=$data."\r\n";
socket_set_timeout($fp, 10);
fputs($fp,$request,strlen($request));
}
Все, данные отправлены! Я опять же умышленно обхожу стороной вопрос обработки ошибок, оставляя это на совести программиста. Значение API_NAME, API_KEY и других – смотрите в прошлом посте.
И, наконец, удаление видео. Здесь опять же все очень просто, меняется только метод «доставки данных», на этот раз – это DELETE. Код в этом случае будет примерно такой:
if ($fp = fsockopen ("gdata.youtube.com", 80, $errno, $errstr, 20))
{
$request ="DELETE /feeds/api/users/YOUTUBE_USERNAME/uploads/КОД_ВИДЕО" HTTP/1.1\r\n";
$request.="Host: gdata.youtube.com\r\n";
$request.="Content-Type: application/atom+xml; charset=UTF-8\r\n";
$request .="Authorization: GoogleLogin auth=AUTH_TOKEN\r\n";
$request.="X-GData-Client: API_NAME \r\n";
$request.="X-GData-Key: key=API_KEY\r\n";
$request.="\r\n";
socket_set_timeout($fp, 10);
fputs($fp,$request,strlen($request));
fclose($fp);
}
Ну, вот собственно и все, о чем я хотел рассказать сегодня в частности, и о YouTube API в целом. Остальные задачи вполне решаемы и покажутся простыми при чтении документации.