gnu-social/plugins/Irc/extlib/phergie/Phergie/Plugin/Youtube.php

169 lines
5.0 KiB
PHP

<?php
/**
* Phergie
*
* PHP version 5
*
* LICENSE
*
* This source file is subject to the new BSD license that is bundled
* with this package in the file LICENSE.
* It is also available through the world-wide-web at this URL:
* http://phergie.org/license
*
* @category Phergie
* @package Phergie_Plugin_Youtube
* @author Phergie Development Team <team@phergie.org>
* @copyright 2008-2010 Phergie Development Team (http://phergie.org)
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Youtube
*/
/**
* Provides commands used to access several services offered by Google
* including search, translation, weather, maps, and currency and general
* value unit conversion.
*
* @category Phergie
* @package Phergie_Plugin_Youtube
* @author Phergie Development Team <team@phergie.org>
* @license http://phergie.org/license New BSD License
* @link http://pear.phergie.org/package/Phergie_Plugin_Youtube
* @uses Phergie_Plugin_Command pear.phergie.org
* @uses Phergie_Plugin_Http pear.phergie.org
*/
class Phergie_Plugin_Youtube extends Phergie_Plugin_Abstract
{
/**
* Checks for dependencies.
*
* @return void
*/
public function onLoad()
{
$plugins = $this->getPluginHandler();
$plugins->getPlugin('Command');
$plugins->getPlugin('Http');
if ($url = $plugins->getPlugin('Url')) {
$url->registerRenderer($this);
}
}
/**
* Queries the YouTube video search web service, processes the first
* result, and sends a message back to the current event source.
*
* @param string $query Search term
*
* @return object YouTube result object
*/
protected function queryYoutube($query)
{
$url = 'http://gdata.youtube.com/feeds/api/videos';
$params = array(
'max-results' => '1',
'alt' => 'json',
'q' => $query
);
$http = $this->plugins->getPlugin('Http');
$response = $http->get($url, $params);
$json = $response->getContent();
$entries = $json->feed->entry;
if (!$entries) {
$this->doNotice($this->event->getNick(), 'Query returned no results');
return;
}
$entry = reset($entries);
$nick = $this->event->getNick();
$link = $entry->link[0]->href;
$title = $entry->title->{'$t'};
$author = $entry->author[0]->name->{'$t'};
$seconds = $entry->{'media$group'}->{'yt$duration'}->seconds;
$published = $entry->published->{'$t'};
$views = $entry->{'yt$statistics'}->viewCount;
$rating = $entry->{'gd$rating'}->average;
$minutes = floor($seconds / 60);
$seconds = str_pad($seconds % 60, 2, '0', STR_PAD_LEFT);
$parsed_link = parse_url($link);
parse_str($parsed_link['query'], $parsed_query);
$link = 'http://youtu.be/' . $parsed_query['v'];
$published = date('n/j/y g:i A', strtotime($published));
$views = number_format($views, 0);
$rating = round($rating, 2);
$format = $this->getConfig('youtube.format');
if (!$format) {
$format = '%nick%:'
. ' [ %link% ]'
. ' "%title%" by %author%,'
. ' Length %minutes%:%seconds%,'
. ' Published %published%,'
. ' Views %views%,'
. ' Rating %rating%';
}
$replacements = array(
'nick' => $nick,
'link' => $link,
'title' => $title,
'author' => $author,
'minutes' => $minutes,
'seconds' => $seconds,
'published' => $published,
'views' => $views,
'rating' => $rating
);
$msg = $format;
foreach ($replacements as $from => $to) {
$msg = str_replace('%' . $from . '%', $to, $msg);
}
$this->doPrivmsg($this->event->getSource(), $msg);
}
/**
* Returns the first result of a YouTube search.
*
* @param string $query Search query
*
* @return void
*/
public function onCommandYoutube($query)
{
$this->queryYoutube($query);
}
/**
* Renders YouTube URLs.
*
* @param array $parsed parse_url() output for the URL to render
*
* @return boolean TRUE if the URL was rendered successfully, FALSE
* otherwise
*/
public function renderUrl(array $parsed)
{
switch ($parsed['host']) {
case 'youtu.be':
$v = ltrim($parsed['path'], '/');
break;
case 'youtube.com':
case 'www.youtube.com':
parse_str($parsed['query'], $parsed_query);
if (!empty($parsed_query['v'])) {
$v = $parsed_query['v'];
break;
}
default:
return false;
}
$this->queryYoutube($v);
return true;
}
}