YouTube API. Загрузка видео на youtube с сайта

20 812 просмотров 1 комментарий 28 сентября 2012

Недавно поступило два заказа на сайты, и получилось что оба сайта должны иметь возможность загрузки и воспроизведения видео. Но у себя на хостинге его хранить был не подходящий вариант. Тогда решили заливать видео на youtube, используя YouTube API, если честно то я не знал сначала что оно есть, думал что то с curl придется делать и эмитировать сайтом работу человека. Узнав что YouTube API позволяет загружать видео, я начал читать руководство разработчика, но там примеров для чистого php или CodeIgniter (фреймворк с которым я работаю) не было, были примеры для Zend, но это не оказалось проблемой...

Т.к. для Zend уже есть готовая библиотека для работы с YouTube я решил не изобретать велосипед а использовать ее, для этого Нужно скачать Zend_Gdata - это набор классов, для работы с YouTube API, и чем-то еще. Теперь нужно прикрутить Zend Gdata к CodeIgniter как это сделать я писал в статье про подключение Zend_Gdata к CodeIgniter но с такой же легкостью ее можно прикрутить и к любому другому фреймворку или CMS или просто PHP скрипту. Далее разговор пойдет именно о работе в CodeIgniter, но суть остается неизменной для всего остального под управлением PHP.

На данный момент поддерживается два способа загрузки видео на YouTube через сайт.

  • Добавление через браузер. Позволяет загрузить видео из браузера напрямую на YouTube,
  • Прямое добавление. Позволяет добавлять видео которое уже храниться на сервере.

Мы будем рассматривать добавление через браузер.

Загрузка видео на YouTube состоит из трех основных шагов.

  • Аутентификация пользователя
  • Отправка данных о видео, и получение url на который будем отправлять видео и ключика
  • Отправка самого видео

Для работы потребуется:

  • Логин и пароль пользователя на youtube
  • Ключ разработчика и название приложения которые можно получить тут

Аутентицикация на YouTube

Есть несколько способов аутентификации AuthSub и ClientLogin для нашего случая отлично подходит ClientLogin 

И так код:

function index()                                                                                                                                            
{                                                                                                                                                           
    $this->load->library("zend");                                                                                                                           
    $this->zend->load("Zend/Loader");                                                                                                                       
    Zend_Loader::loadClass('Zend_Gdata_YouTube'); // для работы с YouTube                                                                                   
    Zend_Loader::loadClass('Zend_Gdata_ClientLogin'); // для аутентификации                                                                                 
                                                                                                                                                            
    $this->config->load('youtube'); // Логин пароль и прочее хранятся в этом конфиге                                                                        
                                                                                                                                                            
    $authenticationURL = 'https://www.google.com/accounts/ClientLogin';                                                                                     
    $httpClient =                                                                                                                                           
        Zend_Gdata_ClientLogin::getHttpClient(                                                                                                              
            $username = $this->config->item('tube_username'), //имя пользователя аккаунта                                                                   
            $password = $this->config->item('tube_password'), //пароль от аккаунта                                                                          
            $service = 'youtube',                                                                                                                           
            $client = null,                                                                                                                                 
            $source = $this->config->item('client_id'), // название приложения                                                                              
            $loginToken = null,                                                                                                                             
            $loginCaptcha = null,                                                                                                                           
            $authenticationURL);                                                                                                                            
    $developerKey = $this->config->item('tube_developer_key');                                                                                              
    $httpClient->setHeaders('X-GData-Key', "key=$developerKey"); //ключ разработчика                                                                        
    //После установки учетных данных, объект $httpClient можно использовать для аутентификации всех последующих запросов к объекту службы Zend_Gdata_YouTube
}

Тут мы загрузили нашу библиотеку для работы Zend Gdata подключили зендовский загрузчик, и с помощью его подгрузили еще библиотеки. Далее заполняем все необходимые значения. Вместо

$this->config->item('XXXXX'),

 Можно писать значения напрямую, мне просто удобнее юзать конфиги, или константы для такого.

На выходе у нас есть $httpClient который будет использоваться далее.

Отправка данных о видео

Сейчас нам нужно отправить данные о видео на youtube, и в ответе получить урл на который будем грузить видео, и token.

Продолжаем тот код что писали:

$yt = new Zend_Gdata_YouTube($httpClient);                                                                
$yt->setMajorProtocolVersion(2);//указываем что используем новую версию API                               
                                                                                                          
$myVideoEntry = new Zend_Gdata_YouTube_VideoEntry();                                                      
$myVideoEntry->setVideoTitle('Заголовок видео'); // Заголовок видео                                       
$myVideoEntry->setVideoDescription('Описание видео'); //Описание видео                                    
// Категория должна соотретствовать разрешенным категориям на youtube!                                    
$myVideoEntry->setVideoCategory('Autos');                                                                 
$myVideoEntry->SetVideoTags('cars, funny'); //Ключевые слова, через запятую                               
                                                                                                          
$tokenHandlerUrl = 'http://gdata.youtube.com/action/GetUploadToken';                                      
$tokenArray = $yt->getFormUploadToken($myVideoEntry, $tokenHandlerUrl);                                   
$data['tokenValue'] = $tokenArray['token'];//token который нужно будет отправить вместе с видео           
$data['postUrl'] = $tokenArray['url']; // урл на который отправим форму с видео                           
$data['nextUrl'] = 'http://la2ha.ru/youtube/success'; //Урл на который нужно попасть после загрузки видео 
                                                                                                          
$this->load->view('v_add_video', $data); // отправляем данные во въюху                                    

 Тут я все вроде неплохо прокомментил и все должно быть понятно, конечно в реальной жизни, эти данные должны заполняться не в коде, а в форме, но чтоб не грузить статью ненужой инфой я заполнил значения в коде.
Замечание: категория видео должна соответствовать категориям которые предусмотрены youtube вот список - смотреть в текстовом редакторе

Отправка видео

Далее создаем въюху с таким кодом:

<?
echo'<form action="' . $postUrl . '?nexturl=' . $nextUrl .
    '" method="post" enctype="multipart/form-data" id="fileupload">' .
    '<input name="file" type="file"/>' .
    '<input name="token" type="hidden" value="' . $tokenValue . '"/>' .
    '<input value="Загрузить видео" type="submit" />' .
    '</form>';
?>

Тут все проще простого, указали в action урл который нам дал youtube указали урл на который нас потом отправит и в скрытом поле вставили token.

После отправки видео нас переадресуют на $nextUrl в который будут переданы GET параметры status и id

Если status = 200 то все ОК
ID это идентификатор видео который можно встаить в плеер и смотреть видео.

1 комментарий

Вы можете детально расписать все шаги. Какая библиотека Zend Gdata требуется? В лучшем случае выложить полноценный скрипт. У Вас работает аутентификация?

Вы можете оставить комментарий