Youtube API получить последнюю загрузку миниатюру - PullRequest
3 голосов
/ 28 января 2012

Я хочу вернуть миниатюру последнего загруженного видео с моего канала и показать его на моем веб-сайте.

Кто-нибудь знает, как я могу сделать минимальное соединение через API и получить только миниатюру?

Спасибо! -Т

REVISED !!

Используя Cakephp, я так и сделал (спасибо Дэйву за предложения по использованию Zend);

Контроллер:

App::import('Xml');
 $channel = 'Blanktv';
 $url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads?v=2&max-results=1&orderby=published';
 $parsed_xml =& new XML($url); 
 $parsed_xml = Set::reverse($parsed_xml);  
 //debug($parsed_xml);
 $this->set('parsed_xml',$parsed_xml);

Посмотреть;

$i=0;
foreach ($parsed_xml as $entry)
{           
    echo '<a href="/videokanalen" target="_self">                     
    <img width="220px" src="'.$entry['Entry']['Group']['Thumbnail'][1]['url'] .'"> 
    </a>';             
}

Теперь единственное, что осталось, это каким-то образом кэшировать вызов фида. Любые предложения ???

-Tom

1 Ответ

2 голосов
/ 28 января 2012

вот быстрый грязный способ сделать это, не касаясь API вообще.

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

Мое решение - PHP с использованием компонента Zend_Feed_Reader из Zend Framework, если вам нужна рука, чтобы настроить это, если вы не знакомы с ним, дайте мне знать.

По сути, вы можете скачать версию 1.11 с Zend.com здесь и затем убедиться, что файлы фреймворка доступны на вашем пути включения PHP.

Если вы уже используете Zend Framework в шаблоне MVC, вы можете сделать это в выбранном вами действии контроллера:

$channel = 'Blanktv'; //change this to your channel name
$url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads';
$feed = Zend_Feed_Reader::import($url);
$this->view->feed = $feed;

Тогда вы можете сделать это, по вашему мнению:

<h1>Latest Video</h1>
<div>
<?php 
$i=0;
foreach ($this->feed as $entry)
{           
    $urlChop = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
    $videoId = end($urlChop);                           
    echo '<h3><a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">' . $entry->getTitle() . '</a></h3>';
    echo '<p>Uploaded on: '. $entry->getDateCreated() .'</p>';

    echo '<a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">                     
    <img src="http://img.youtube.com/vi/' . $videoId .'/hqdefault.jpg"> 
    </a>';                  
    $i++;
    if($i==1) break;
}
?>
</div>

в противном случае вы можете сделать:

<?php
$channel = 'Blanktv'; //change this to your channel
$url = 'https://gdata.youtube.com/feeds/api/users/'.$channel.'/uploads';
$feed = Zend_Feed_Reader::import($url);
?>
<h1>Latest Video</h1>
<div>
<?php 
$i=0;
foreach ($feed as $entry)
{           
    $urlChop = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
    $videoId = end($urlChop);                           
    echo '<h3><a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">' . $entry->getTitle() . '</a></h3>';
    echo '<p>Uploaded on: '. $entry->getDateCreated() .'</p>';

    echo '<a href="http://www.youtube.com/watch?v=' . $videoId .'" target="_blank">                     
    <img src="http://img.youtube.com/vi/' . $videoId .'/hqdefault.jpg"> 
    </a>';                  
    $i++;
    if($i==1) break;
}
?>
</div>

В последнем методе вам, вероятно, потребуется использовать оператор php require для файлов Zend_Feed_Reader и т. Д. ...

Надеюсь, это поможет, как я сказал, дайте мне знать, если вам нужна рука.

Всего наилучшего,

Dave

ОБНОВЛЕНИЕ: В ответ на ваши комментарии о кешировании

Привет, Том, вот еще одно быстрое и грязное решение, которое не использует кеш, но может быть очень быстрым в реализации.

Причина, по которой я не пошел с компонентом кэширования, заключается в том, что я подумал, что в данных обстоятельствах будет достаточно простого решения БД. Я также подумал, что тянуть за корма, чтобы сравнить, новый он или нет, не будет самым экономичным для вас.

Вы можете автоматизировать этот процесс для автоматического запуска в указанное время, но если вы не хотите автоматизировать процесс и не возражаете, нажав ссылку для обновления видео вручную, вы можете запустить его таким образом.

Мое решение опять-таки основано на ZF, но, поскольку вы в порядке, взломав его на что-то полезное с cakephp, у вас не должно возникнуть никаких проблем, если вы сделаете то же самое здесь.

Сначала создайте новую таблицу (в предположении, что MySQL db):

CREATE TABLE  `yourdbname`.`latestvid` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT  'Unique identifier',
`videoId` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video id',
`videoTitle` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video title',
`uploadDate` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT  'Video upload date'
) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `yourdbname`.`latestvid` (`id`, `videoId`, `videoTitle`, `uploadDate`) VALUES (NULL, '--', '--', '--');

Это создаст таблицу для вашей последней видеоинформации для использования в вашем шаблоне, однако установленные по умолчанию значения не будут работать с вашим шаблоном по очевидным причинам.

Затем вы можете сделать что-то похожее на это:

public function updateAction()
{
    $this->_helper->viewRenderer->setNoRender(); // disable view
    $this->_helper->layout()->disableLayout();   // disable layout

    $user = 'Blanktv';  // insert your channel name 
    $url  = 'https://gdata.youtube.com/feeds/api/users/'.$user.'/uploads';
    $feed = Zend_Feed_Reader::import($url);  

    if(!$feed)
    {
        die("couldn't access the feed"); // Note: the Zend component will display an error if the feed is not available so this wouldn't really be necessary for ZF
    }
    else
    {
        $i=0;
        foreach ($feed as $entry)
        {           
            $urlChop    = explode ('http://gdata.youtube.com/feeds/api/videos/',$entry->getId());
            $videoId    = end($urlChop);                            
            $videoTitle = $entry->getTitle();
            $uploadDate = $entry->getDateCreated();         

            // use your preferred method to update the db record where the id = 1               

            $i++;
            if($i==1) break;
        }
    }       
}   

Может быть, пойти и дать мне знать, как вы поживаете?

Вам просто нужно настроить шаблон, чтобы получить переменные из базы данных вместо Youtube, за исключением миниатюры.

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

Вы можете настроить скрипт, чтобы скопировать миниатюру на свой собственный сервер и сохранить путь в БД или использовать стандартную миниатюру, если вы запускаете серию видеороликов, для которых требуется стандартный брендинг - в любом случае, надеюсь, это поможет.

: - D

Dave

...