Patch Peimbert for Scripting Engine problem Bug #54657
Patch version 2012-07-18 22:55 UTC
Return to Bug #54657 |
Download this patch
Patch Revisions:
Developer: eduardopeimbert@gmail.com
/**
* 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
* @copyright Copyright (c) 2005-2012 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:
* session_details.php - a script to view log output and session variables
* operations.php - the main logic, which interfaces with the YouTube API
* index.php - the HTML to represent the web UI, contains some PHP
* video_app.css - the CSS to define the interface style
* video_app.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.
*/
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_YouTube');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_App_Exception');
/*
* The main controller logic.
*
* POST used for all authenticated requests
* otherwise use GET for retrieve and supplementary values
*/
session_start();
setLogging('on');
generateUrlInformation();
if (!isset($_POST['operation'])) {
// if a GET variable is set then process the token upgrade
if (isset($_GET['token'])) {
updateAuthSubToken($_GET['token']);
} else {
if (loggingEnabled()) {
logMessage('reached operations.php without $_POST or $_GET variables set', 'error');
header('Location: index.php');
}
}
}
$operation = $_POST['operation'];
switch ($operation) {
case 'create_upload_form':
createUploadForm($_POST['videoTitle'],
$_POST['videoDescription'],
$_POST['videoCategory'],
$_POST['videoTags']);
break;
case 'edit_meta_data':
editVideoData($_POST['newVideoTitle'],
$_POST['newVideoDescription'],
$_POST['newVideoCategory'],
$_POST['newVideoTags'],
$_POST['videoId']);
break;
case 'check_upload_status':
checkUpload($_POST['videoId']);
break;
case 'delete_video':
deleteVideo($_POST['videoId']);
break;
case 'auth_sub_request':
generateAuthSubRequestLink();
break;
case 'auth_sub_token_upgrade':
updateAuthSubToken($_GET['token']);
break;
case 'clear_session_var':
clearSessionVar($_POST['name']);
break;
case 'retrieve_playlists':
retrievePlaylists();
break;
case 'create_playlist':
createPlaylist($_POST['playlistTitle'], $_POST['playlistDescription']);
break;
case 'delete_playlist':
deletePlaylist($_POST['playlistTitle']);
break;
case 'update_playlist':
updatePlaylist($_POST['newPlaylistTitle'],
$_POST['newPlaylistDescription'],
$_POST['oldPlaylistTitle']);
break;
case (strcmp(substr($operation, 0, 7), 'search_') == 0):
// initialize search specific information
$searchType = substr($operation, 7);
searchVideos($searchType, $_POST['searchTerm'], $_POST['startIndex'],
$_POST['maxResults']);
break;
case 'show_video':
echoVideoPlayer($_POST['videoId']);
break;
default:
unsupportedOperation($_POST);
break;
}
/**
* Perform a search on youtube. Passes the result feed to echoVideoList.
*
* @param string $searchType The type of search to perform.
* If set to 'owner' then attempt to authenticate.
* @param string $searchTerm The term to search on.
* @param string $startIndex Start retrieving search results from this index.
* @param string $maxResults The number of results to retrieve.
* @return void
*/
function searchVideos($searchType, $searchTerm, $startIndex, $maxResults)
{
// create an unauthenticated service object
$youTubeService = new Zend_Gdata_YouTube();
$query = $youTubeService->newVideoQuery();
$query->setQuery($searchTerm);
$query->setStartIndex($startIndex);
$query->setMaxResults($maxResults);
switch ($searchType) {
case 'most_viewed':
$query->setFeedType('most viewed');
$query->setTime('this_week');
$feed = $youTubeService->getVideoFeed($query);
break;
case 'most_recent':
$query->setFeedType('most recent');
$query->setTime('this_week');
$feed = $youTubeService->getVideoFeed($query);
break;
case 'recently_featured':
$query->setFeedType('recently featured');
$feed = $youTubeService->getVideoFeed($query);
break;
case 'top_rated':
$query->setFeedType('top rated');
$query->setTime('this_week');
$feed = $youTubeService->getVideoFeed($query);
break;
case 'username':
$feed = $youTubeService->getUserUploads($searchTerm);
break;
case 'all':
$feed = $youTubeService->getVideoFeed($query);
break;
case 'owner':
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
try {
$feed = $youTubeService->getUserUploads('default');
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(),
'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not retrieve users video feed: '
. $e->getMessage() . '<br />';
return;
}
echoVideoList($feed, true);
return;
default:
echo 'ERROR - Unknown search type - \'' . $searchType . '\'';
return;
}
if (loggingEnabled()) {
$httpClient = $youTubeService->getHttpClient();
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
echoVideoList($feed);
}
/**
* 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;
}
/**
* Check the upload status of a video
*
* @param string $videoId The video to check.
* @return string A message about the video's status.
*/
function checkUpload($videoId)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getuserUploads('default');
$message = 'No further status information available yet.';
foreach($feed as $videoEntry) {
if ($videoEntry->getVideoId() == $videoId) {
// check if video is in draft status
try {
$control = $videoEntry->getControl();
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - not able to retrieve control element '
. $e->getMessage();
return;
}
if ($control instanceof Zend_Gdata_App_Extension_Control) {
if (($control->getDraft() != null) &&
($control->getDraft()->getText() == 'yes')) {
$state = $videoEntry->getVideoState();
if ($state instanceof Zend_Gdata_YouTube_Extension_State) {
$message = 'Upload status: ' . $state->getName() . ' '
. $state->getText();
} else {
print $message;
}
}
}
}
}
print $message;
}
/**
* Store location of the demo application into session variables.
*
* @return void
*/
function generateUrlInformation()
{
if (!isset($_SESSION['operationsUrl']) || !isset($_SESSION['homeUrl'])) {
$_SESSION['operationsUrl'] = 'http://'. $_SERVER['HTTP_HOST']
. $_SERVER['PHP_SELF'];
$path = explode('/', $_SERVER['PHP_SELF']);
$path[count($path)-1] = 'index.php';
$_SESSION['homeUrl'] = 'http://'. $_SERVER['HTTP_HOST']
. implode('/', $path);
}
}
/**
* Log a message to the session variable array.
*
* @param string $message The message to log.
* @param string $messageType The type of message to log.
* @return void
*/
function logMessage($message, $messageType)
{
if (!isset($_SESSION['log_maxLogEntries'])) {
$_SESSION['log_maxLogEntries'] = 20;
}
if (!isset($_SESSION['log_currentCounter'])) {
$_SESSION['log_currentCounter'] = 0;
}
$currentCounter = $_SESSION['log_currentCounter'];
$currentCounter++;
if ($currentCounter > $_SESSION['log_maxLogEntries']) {
$_SESSION['log_currentCounter'] = 0;
}
$logLocation = 'log_entry_'. $currentCounter . '_' . $messageType;
$_SESSION[$logLocation] = $message;
$_SESSION['log_currentCounter'] = $currentCounter;
}
/**
* Update an existing video's meta-data.
*
* @param string $newVideoTitle The new title for the video entry.
* @param string $newVideoDescription The new description for the video entry.
* @param string $newVideoCategory The new category for the video entry.
* @param string $newVideoTags The new set of tags for the video entry (whitespace separated).
* @param string $videoId The video id for the video to be edited.
* @return void
*/
function editVideoData($newVideoTitle, $newVideoDescription, $newVideoCategory, $newVideoTags, $videoId)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getVideoFeed('https://gdata.youtube.com/feeds/users/default/uploads');
$videoEntryToUpdate = null;
foreach($feed as $entry) {
if ($entry->getVideoId() == $videoId) {
$videoEntryToUpdate = $entry;
break;
}
}
if (!$videoEntryToUpdate instanceof Zend_Gdata_YouTube_VideoEntry) {
print 'ERROR - Could not find a video entry with id ' . $videoId
. '<br />' . printCacheWarning();
return;
}
try {
$putUrl = $videoEntryToUpdate->getEditLink()->getHref();
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not obtain video entry\'s edit link: '
. $e->getMessage() . '<br />';
return;
}
$videoEntryToUpdate->setVideoTitle($newVideoTitle);
$videoEntryToUpdate->setVideoDescription($newVideoDescription);
$videoEntryToUpdate->setVideoCategory($newVideoCategory);
// convert tags from space separated to comma separated
$videoTagsArray = explode(' ', trim($newVideoTags));
// strip out empty array elements
foreach($videoTagsArray as $key => $value) {
if (strlen($value) < 2) {
unset($videoTagsArray[$key]);
}
}
$videoEntryToUpdate->setVideoTags(implode(', ', $videoTagsArray));
try {
$updatedEntry = $youTubeService->updateEntry($videoEntryToUpdate, $putUrl);
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not post video meta-data: ' . $e->getMessage();
return;
}
print 'Entry updated successfully.<br /><a href="#" onclick="'
. 'ytVideoApp.presentFeed(\'search_owner\', 5, 0, \'none\'); '
. 'ytVideoApp.refreshSearchResults();" >'
. '(refresh your video listing)</a><br />'
. printCacheWarning();
}
/**
* Create upload form by sending the incoming video meta-data to youtube and
* retrieving a new entry. Prints form HTML to page.
*
* @param string $VideoTitle The title for the video entry.
* @param string $VideoDescription The description for the video entry.
* @param string $VideoCategory The category for the video entry.
* @param string $VideoTags The set of tags for the video entry (whitespace separated).
* @param string $nextUrl (optional) The URL to redirect back to after form upload has completed.
* @return void
*/
function createUploadForm($videoTitle, $videoDescription, $videoCategory, $videoTags, $nextUrl = null)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$newVideoEntry = new Zend_Gdata_YouTube_VideoEntry();
$newVideoEntry->setVideoTitle($videoTitle);
$newVideoEntry->setVideoDescription($videoDescription);
//make sure first character in category is capitalized
$videoCategory = strtoupper(substr($videoCategory, 0, 1))
. substr($videoCategory, 1);
$newVideoEntry->setVideoCategory($videoCategory);
// convert videoTags from whitespace separated into comma separated
$videoTagsArray = explode(' ', trim($videoTags));
$newVideoEntry->setVideoTags(implode(', ', $videoTagsArray));
$tokenHandlerUrl = 'https://gdata.youtube.com/action/GetUploadToken';
try {
$tokenArray = $youTubeService->getFormUploadToken($newVideoEntry, $tokenHandlerUrl);
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not retrieve token for syndicated upload. '
. $e->getMessage()
. '<br /><a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
}
$tokenValue = $tokenArray['token'];
$postUrl = $tokenArray['url'];
// place to redirect user after upload
if (!$nextUrl) {
$nextUrl = $_SESSION['homeUrl'];
}
print <<< END
<br /><form action="${postUrl}?nexturl=${nextUrl}"
method="post" enctype="multipart/form-data">
<input name="file" type="file"/>
<input name="token" type="hidden" value="${tokenValue}"/>
<input value="Upload Video File" type="submit" />
</form>
END;
}
/**
* Deletes a Video.
*
* @param string $videoId Id of the video to be deleted.
* @return void
*/
function deleteVideo($videoId)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getVideoFeed('https://gdata.youtube.com/feeds/users/default/uploads');
$videoEntryToDelete = null;
foreach($feed as $entry) {
if ($entry->getVideoId() == $videoId) {
$videoEntryToDelete = $entry;
break;
}
}
// check if videoEntryToUpdate was found
if (!$videoEntryToDelete instanceof Zend_Gdata_YouTube_VideoEntry) {
print 'ERROR - Could not find a video entry with id ' . $videoId . '<br />';
return;
}
try {
$httpResponse = $youTubeService->delete($videoEntryToDelete);
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not delete video: '. $e->getMessage();
return;
}
print 'Entry deleted succesfully.<br />' . $httpResponse->getBody()
. '<br /><a href="#" onclick="'
. 'ytVideoApp.presentFeed(\'search_owner\', 5, 0, \'none\');"'
. '">(refresh your video listing)</a><br />'
. printCacheWarning();
}
/**
* Enables logging.
*
* @param string $loggingOption 'on' to turn logging on, 'off' to turn logging off.
* @param integer|null $maxLogItems Maximum items to log, default is 10.
* @return void
*/
function setLogging($loggingOption, $maxLogItems = 10)
{
switch ($loggingOption) {
case 'on' :
$_SESSION['logging'] = 'on';
$_SESSION['log_currentCounter'] = 0;
$_SESSION['log_maxLogEntries'] = $maxLogItems;
break;
case 'off':
$_SESSION['logging'] = 'off';
break;
}
}
/**
* Check whether logging is enabled.
*
* @return boolean Return true if session variable for logging is set to 'on'.
*/
function loggingEnabled()
{
if ($_SESSION['logging'] == 'on') {
return true;
}
}
/**
* Unset a specific session variable.
*
* @param string $name Name of the session variable to delete.
* @return void
*/
function clearSessionVar($name)
{
if (isset($_SESSION[$name])) {
unset($_SESSION[$name]);
}
header('Location: session_details.php');
}
/**
* Generate an AuthSub request Link and print it to the page.
*
* @param string $nextUrl URL to redirect to after performing the authentication.
* @return void
*/
function generateAuthSubRequestLink($nextUrl = null)
{
$scope = 'https://gdata.youtube.com';
$secure = false;
$session = true;
if (!$nextUrl) {
generateUrlInformation();
$nextUrl = $_SESSION['operationsUrl'];
}
$url = Zend_Gdata_AuthSub::getAuthSubTokenUri($nextUrl, $scope, $secure, $session);
echo '<a href="' . $url
. '"><strong>Click here to authenticate with YouTube</strong></a>';
}
/**
* Upgrade the single-use token to a session token.
*
* @param string $singleUseToken A valid single use token that is upgradable to a session token.
* @return void
*/
function updateAuthSubToken($singleUseToken)
{
try {
$sessionToken = Zend_Gdata_AuthSub::getAuthSubSessionToken($singleUseToken);
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Token upgrade for ' . $singleUseToken
. ' failed : ' . $e->getMessage();
return;
}
$_SESSION['sessionToken'] = $sessionToken;
generateUrlInformation();
header('Location: ' . $_SESSION['homeUrl']);
}
/**
* Convenience method to obtain an authenticted Zend_Http_Client object.
*
* @return Zend_Http_Client An authenticated client.
*/
function getAuthSubHttpClient()
{
try {
$httpClient = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not obtain authenticated Http client object. '
. $e->getMessage();
return;
}
$httpClient->setHeaders('X-GData-Key', 'key='. $_SESSION['developerKey']);
return $httpClient;
}
/**
* 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();
$firstThumbnail = htmlspecialchars(
$entry->mediaGroup->thumbnail[0]->url);
echo '<img id="' . $videoId . '" class="thumbnail" src="'
. $firstThumbnail .'" width="130" height="97" onclick="'
. 'ytVideoApp.presentVideo(\'' . $videoId . '\', 1);" '
. 'title="click to watch: ' .
htmlspecialchars($entry->getVideoTitle()) . '" />';
}
}
/**
* Echo the list of videos in the specified feed.
*
* @param Zend_Gdata_YouTube_VideoFeed $feed The video feed.
* @param boolean|null $authenticated If true then the videoList will
* attempt to create additional forms to edit video meta-data.
* @return void
*/
function echoVideoList($feed, $authenticated = false)
{
$table = '<table id="videoResultList" class="videoList"><tbody>';
$results = 0;
foreach ($feed as $entry) {
$videoId = $entry->getVideoId();
$thumbnailUrl = 'notfound.jpg';
if (count($entry->mediaGroup->thumbnail) > 0) {
$thumbnailUrl = htmlspecialchars(
$entry->mediaGroup->thumbnail[0]->url);
}
$videoTitle = htmlspecialchars($entry->getVideoTitle());
$videoDescription = htmlspecialchars($entry->getVideoDescription());
$videoCategory = htmlspecialchars($entry->getVideoCategory());
$videoTags = $entry->getVideoTags();
$table .= '<tr id="video_' . $videoId . '">'
. '<td width="130"><img onclick="ytVideoApp.presentVideo(\''
. $videoId. '\')" src="' . $thumbnailUrl. '" /></td>'
. '<td><a href="#" onclick="ytVideoApp.presentVideo(\''
. $videoId . '\')">'. stripslashes($videoTitle) . '</a>'
. '<p class="videoDescription">'
. stripslashes($videoDescription) . '</p>'
. '<p class="videoCategory">category: ' . $videoCategory
. '</p><p class="videoTags">tagged: '
. htmlspecialchars(implode(', ', $videoTags)) . '</p>';
if ($authenticated) {
$table .= '<p class="edit">'
. '<a onclick="ytVideoApp.presentMetaDataEditForm(\''
. addslashes($videoTitle) . '\', \''
. addslashes($videoDescription) . '\', \''
. $videoCategory . '\', \''
. addslashes(implode(', ', $videoTags)) . '\', \''
. $videoId . '\');" href="#">edit video data</a> | '
. '<a href="#" onclick="ytVideoApp.confirmDeletion(\''
. $videoId
. '\');">delete this video</a></p><br clear="all">';
}
$table .= '</td></tr>';
$results++;
}
if ($results < 1) {
echo '<br />No results found<br /><br />';
} else {
echo $table .'</tbody></table><br />';
}
}
/**
* 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)
{
$youTubeService = new Zend_Gdata_YouTube();
try {
$entry = $youTubeService->getVideoEntry($videoId);
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
}
$videoTitle = htmlspecialchars($entry->getVideoTitle());
$videoUrl = htmlspecialchars(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);
}
/**
* 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)
{
$youTubeService = new Zend_Gdata_YouTube();
$ytQuery = $youTubeService->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 $youTubeService->getVideoFeed($ytQuery);
}
/**
* 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 = 'https://gdata.youtube.com/feeds/users/' .
$user . '/uploads';
$youTubeService = new Zend_Gdata_YouTube();
$ytQuery = $youTubeService->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 $youTubeService->getVideoFeed($ytQuery);
}
/**
* Echo video metadata
*
* @param Zend_Gdata_YouTube_VideoEntry $entry The video entry
* @return void
*/
function echoVideoMetadata($entry)
{
$title = htmlspecialchars($entry->getVideoTitle());
$description = htmlspecialchars($entry->getVideoDescription());
$authorUsername = htmlspecialchars($entry->author[0]->name);
$authorUrl = 'http://www.youtube.com/profile?user=' .
$authorUsername;
$tags = htmlspecialchars(implode(', ', $entry->getVideoTags()));
$duration = htmlspecialchars($entry->getVideoDuration());
$watchPage = htmlspecialchars($entry->getVideoWatchPageUrl());
$viewCount = htmlspecialchars($entry->getVideoViewCount());
$rating = 0;
if (isset($entry->rating->average)) {
$rating = $entry->rating->average;
}
$numRaters = 0;
if (isset($entry->rating->numRaters)) {
$numRaters = $entry->rating->numRaters;
}
$flashUrl = htmlspecialchars(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;
}
/**
* Print message about YouTube caching.
*
* @return string A message
*/
function printCacheWarning()
{
return '<p class="note">'
. 'Please note that the change may not be reflected in the API '
. 'immediately due to caching.<br/>'
. 'Please refer to the API documentation for more details.</p>';
}
/**
* Retrieve playlists for the currently authenticated user and print.
* @return void
*/
function retrievePlaylists()
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getPlaylistListFeed('default');
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
if (!$feed instanceof Zend_Gdata_YouTube_PlaylistListFeed) {
print 'ERROR - Could not retrieve playlists<br />'.
printCacheWarning();
return;
}
$playlistEntries = '<ul>';
$entriesFound = 0;
foreach($feed as $entry) {
$playlistTitle = $entry->getTitleValue();
$playlistDescription = $entry->getDescription()->getText();
$playlistEntries .= '<li><h3>' . $playlistTitle
. '</h3>' . $playlistDescription . ' | '
. '<a href="#" onclick="ytVideoApp.prepareUpdatePlaylistForm(\''
. $playlistTitle . '\', \'' . $playlistDescription
. '\'); ">update</a> | '
. '<a href="#" onclick="ytVideoApp.confirmPlaylistDeletion(\''
. $playlistTitle . '\');">delete</a></li>';
$entriesFound++;
}
$playlistEntries .= '</ul><br /><a href="#" '
. 'onclick="ytVideoApp.prepareCreatePlaylistForm(); '
. 'return false;">'
. 'Add new playlist</a><br />'
. '<div id="addNewPlaylist"></div>';
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
if ($entriesFound > 0) {
print $playlistEntries;
} else {
print 'No playlists found';
}
}
/**
* Create a new playlist for the currently authenticated user
*
* @param string $playlistTitle Title of the new playlist
* @param string $playlistDescription Description for the new playlist
* @return void
*/
function createPlaylist($playlistTitle, $playlistDescription)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getPlaylistListFeed('default');
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
$newPlaylist = $youTubeService->newPlaylistListEntry();
$newPlaylist->description = $youTubeService->newDescription()->setText($playlistDescription);
$newPlaylist->title = $youTubeService->newTitle()->setText($playlistDescription);
if (!$feed instanceof Zend_Gdata_YouTube_PlaylistListFeed) {
print 'ERROR - Could not retrieve playlists<br />'
. printCacheWarning();
return;
}
$playlistFeedUrl = 'https://gdata.youtube.com/feeds/users/default/playlists';
try {
$updatedEntry = $youTubeService->insertEntry($newPlaylist, $playlistFeedUrl);
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not create new playlist: ' . $e->getMessage();
return;
}
print 'Playlist added succesfully.<br /><a href="#" onclick="'
. 'ytVideoApp.retrievePlaylists();"'
. '">(refresh your playlist listing)</a><br />'
. printCacheWarning();
}
/**
* Delete a playlist
*
* @param string $playlistTitle Title of the playlist to be deleted
* @return void
*/
function deletePlaylist($playlistTitle)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getPlaylistListFeed('default');
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
$playlistEntryToDelete = null;
foreach($feed as $playlistEntry) {
if ($playlistEntry->getTitleValue() == $playlistTitle) {
$playlistEntryToDelete = $playlistEntry;
break;
}
}
if (!$playlistEntryToDelete instanceof Zend_Gdata_YouTube_PlaylistListEntry) {
print 'ERROR - Could not retrieve playlist to be deleted<br />'
. printCacheWarning();
return;
}
try {
$response = $playlistEntryToDelete->delete();
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not delete the playlist: ' . $e->getMessage();
return;
}
print 'Playlist deleted succesfully.<br />'
. '<a href="#" onclick="ytVideoApp.retrievePlaylists();">'
. '(refresh your playlist listing)</a><br />' . printCacheWarning();
}
/**
* Delete a playlist
*
* @param string $newplaylistTitle New title for the playlist to be updated
* @param string $newPlaylistDescription New description for the playlist to be updated
* @param string $oldPlaylistTitle Title of the playlist to be updated
* @return void
*/
function updatePlaylist($newPlaylistTitle, $newPlaylistDescription, $oldPlaylistTitle)
{
$httpClient = getAuthSubHttpClient();
$youTubeService = new Zend_Gdata_YouTube($httpClient);
$feed = $youTubeService->getPlaylistListFeed('default');
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
$playlistEntryToDelete = null;
foreach($feed as $playlistEntry) {
if ($playlistEntry->getTitleValue() == $oldplaylistTitle) {
$playlistEntryToDelete = $playlistEntry;
break;
}
}
if (!$playlistEntryToDelete instanceof Zend_Gdata_YouTube_PlaylistListEntry) {
print 'ERROR - Could not retrieve playlist to be updated<br />'
. printCacheWarning();
return;
}
try {
$response = $playlistEntryToDelete->delete();
if (loggingEnabled()) {
logMessage($httpClient->getLastRequest(), 'request');
logMessage($httpClient->getLastResponse()->getBody(), 'response');
}
} catch (Zend_Gdata_App_HttpException $httpException) {
print 'ERROR ' . $httpException->getMessage()
. ' HTTP details<br /><textarea cols="100" rows="20">'
. $httpException->getRawResponseBody()
. '</textarea><br />'
. '<a href="session_details.php">'
. 'click here to view details of last request</a><br />';
return;
} catch (Zend_Gdata_App_Exception $e) {
print 'ERROR - Could not delete the playlist: ' . $e->getMessage();
return;
}
print 'Playlist deleted succesfully.<br /><a href="#" onclick="' .
'ytVideoApp.retrievePlaylists();"'.
'">(refresh your playlist listing)</a><br />'.
printCacheWarning();
}
/**
* Helper function if an unsupported operation is passed into this files main loop.
*
* @param array $post (Optional) The post variables that accompanied the operation, if available.
* @return void
*/
function unsupportedOperation($_POST)
{
$message = 'ERROR An unsupported operation has been called - post variables received '
. print_r($_POST, true);
if (loggingEnabled()) {
logMessage($message, 'error');
}
print $message;
}
|