You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

279 lines
8.6 KiB
PHP

<?php
/**
* Zend Framework
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://framework.zend.com/license/new-bsd
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@zend.com so we can send you a copy immediately.
*
* @category Zend
* @package Zend_Gdata
* @subpackage Demos
* @copyright Copyright (c) 2005-2009 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
/**
* PHP sample code for the YouTube data API. Utilizes the Zend Framework
* Zend_Gdata component to communicate with the YouTube data API.
*
* Requires the Zend Framework Zend_Gdata component and PHP >= 5.1.4
*
* This sample is run from within a web browser. These files are required:
* index.php - the main logic, which interfaces with the YouTube API
* interface.html - the HTML to represent the web UI
* web_browser.css - the CSS to define the interface style
* web_browser.js - the JavaScript used to provide the video list AJAX interface
*
* NOTE: If using in production, some additional precautions with regards
* to filtering the input data should be used. This code is designed only
* for demonstration purposes.
*/
/**
* @see Zend_Loader
*/
require_once 'Zend/Loader.php';
/**
* @see Zend_Gdata_YouTube
*/
Zend_Loader::loadClass('Zend_Gdata_YouTube');
/**
* Finds the URL for the flash representation of the specified video
*
* @param Zend_Gdata_YouTube_VideoEntry $entry The video entry
* @return string|null The URL or null, if the URL is not found
*/
function findFlashUrl($entry)
{
foreach ($entry->mediaGroup->content as $content) {
if ($content->type === 'application/x-shockwave-flash') {
return $content->url;
}
}
return null;
}
/**
* Returns a feed of top rated videos for the specified user
*
* @param string $user The username
* @return Zend_Gdata_YouTube_VideoFeed The feed of top rated videos
*/
function getTopRatedVideosByUser($user)
{
$userVideosUrl = 'http://gdata.youtube.com/feeds/users/' .
$user . '/uploads';
$yt = new Zend_Gdata_YouTube();
$ytQuery = $yt->newVideoQuery($userVideosUrl);
// order by the rating of the videos
$ytQuery->setOrderBy('rating');
// retrieve a maximum of 5 videos
$ytQuery->setMaxResults(5);
// retrieve only embeddable videos
$ytQuery->setFormat(5);
return $yt->getVideoFeed($ytQuery);
}
/**
* Returns a feed of videos related to the specified video
*
* @param string $videoId The video
* @return Zend_Gdata_YouTube_VideoFeed The feed of related videos
*/
function getRelatedVideos($videoId)
{
$yt = new Zend_Gdata_YouTube();
$ytQuery = $yt->newVideoQuery();
// show videos related to the specified video
$ytQuery->setFeedType('related', $videoId);
// order videos by rating
$ytQuery->setOrderBy('rating');
// retrieve a maximum of 5 videos
$ytQuery->setMaxResults(5);
// retrieve only embeddable videos
$ytQuery->setFormat(5);
return $yt->getVideoFeed($ytQuery);
}
/**
* Echo img tags for the first thumbnail representing each video in the
* specified video feed. Upon clicking the thumbnails, the video should
* be presented.
*
* @param Zend_Gdata_YouTube_VideoFeed $feed The video feed
* @return void
*/
function echoThumbnails($feed)
{
foreach ($feed as $entry) {
$videoId = $entry->getVideoId();
echo '<img src="' . $entry->mediaGroup->thumbnail[0]->url . '" ';
echo 'width="80" height="72" onclick="ytvbp.presentVideo(\'' . $videoId . '\')">';
}
}
/**
* Echo the video embed code, related videos and videos owned by the same user
* as the specified videoId.
*
* @param string $videoId The video
* @return void
*/
function echoVideoPlayer($videoId)
{
$yt = new Zend_Gdata_YouTube();
$entry = $yt->getVideoEntry($videoId);
$videoTitle = $entry->mediaGroup->title;
$videoUrl = findFlashUrl($entry);
$relatedVideoFeed = getRelatedVideos($entry->getVideoId());
$topRatedFeed = getTopRatedVideosByUser($entry->author[0]->name);
print <<<END
<b>$videoTitle</b><br />
<object width="425" height="350">
<param name="movie" value="${videoUrl}&autoplay=1"></param>
<param name="wmode" value="transparent"></param>
<embed src="${videoUrl}&autoplay=1" type="application/x-shockwave-flash" wmode="transparent"
width=425" height="350"></embed>
</object>
END;
echo '<br />';
echoVideoMetadata($entry);
echo '<br /><b>Related:</b><br />';
echoThumbnails($relatedVideoFeed);
echo '<br /><b>Top rated videos by user:</b><br />';
echoThumbnails($topRatedFeed);
}
/**
* Echo video metadata
*
* @param Zend_Gdata_YouTube_VideoEntry $entry The video entry
* @return void
*/
function echoVideoMetadata($entry)
{
$title = $entry->mediaGroup->title;
$description = $entry->mediaGroup->description;
$authorUsername = $entry->author[0]->name;
$authorUrl = 'http://www.youtube.com/profile?user=' . $authorUsername;
$tags = $entry->mediaGroup->keywords;
$duration = $entry->mediaGroup->duration->seconds;
$watchPage = $entry->mediaGroup->player[0]->url;
$viewCount = $entry->statistics->viewCount;
$rating = $entry->rating->average;
$numRaters = $entry->rating->numRaters;
$flashUrl = findFlashUrl($entry);
print <<<END
<b>Title:</b> ${title}<br />
<b>Description:</b> ${description}<br />
<b>Author:</b> <a href="${authorUrl}">${authorUsername}</a><br />
<b>Tags:</b> ${tags}<br />
<b>Duration:</b> ${duration} seconds<br />
<b>View count:</b> ${viewCount}<br />
<b>Rating:</b> ${rating} (${numRaters} ratings)<br />
<b>Flash:</b> <a href="${flashUrl}">${flashUrl}</a><br />
<b>Watch page:</b> <a href="${watchPage}">${watchPage}</a> <br />
END;
}
/**
* Echo the list of videos in the specified feed.
*
* @param Zend_Gdata_YouTube_VideoFeed $feed The video feed
* @return void
*/
function echoVideoList($feed)
{
echo '<table class="videoList">';
echo '<tbody width="100%">';
foreach ($feed as $entry) {
$videoId = $entry->getVideoId();
$thumbnailUrl = $entry->mediaGroup->thumbnail[0]->url;
$videoTitle = $entry->mediaGroup->title;
$videoDescription = $entry->mediaGroup->description;
print <<<END
<tr onclick="ytvbp.presentVideo('${videoId}')">
<td width="130"><img src="${thumbnailUrl}" /></td>
<td width="100%">
<a href="#">${videoTitle}</a>
<p class="videoDescription">${videoDescription}</p>
</td>
</tr>
END;
}
echo '</table>';
}
/*
* The main controller logic of the YouTube video browser demonstration app.
*/
$queryType = isset($_POST['queryType']) ? $_POST['queryType'] : null;
if ($queryType === null) {
/* display the entire interface */
include 'interface.html';
} else if ($queryType == 'show_video') {
/* display an individual video */
if (array_key_exists('videoId', $_POST)) {
$videoId = $_POST['videoId'];
echoVideoPlayer($videoId);
} else if (array_key_exists('videoId', $_GET)) {
$videoId = $_GET['videoId'];
echoVideoPlayer($videoId);
} else {
echo 'No videoId found.';
exit;
}
} else {
/* display a list of videos */
$searchTerm = $_POST['searchTerm'];
$startIndex = $_POST['startIndex'];
$maxResults = $_POST['maxResults'];
$yt = new Zend_Gdata_YouTube();
$query = $yt->newVideoQuery();
$query->setQuery($searchTerm);
$query->setStartIndex($startIndex);
$query->setMaxResults($maxResults);
/* check for one of the standard feeds, or list from 'all' videos */
switch ($queryType) {
case 'most_viewed':
$query->setFeedType('most viewed');
$query->setTime('this_week');
$feed = $yt->getVideoFeed($query);
break;
case 'most_recent':
$query->setFeedType('most recent');
$feed = $yt->getVideoFeed($query);
break;
case 'recently_featured':
$query->setFeedType('recently featured');
$feed = $yt->getVideoFeed($query);
break;
case 'top_rated':
$query->setFeedType('top rated');
$query->setTime('this_week');
$feed = $yt->getVideoFeed($query);
break;
case 'all':
$feed = $yt->getVideoFeed($query);
break;
default:
echo 'ERROR - unknown queryType - "' . $queryType . '"';
break;
}
echoVideoList($feed);
}