forward(REFERER);\r
}\r
\r
- $parsed_url = videolist_parseurl($input['video_url']);\r
\r
- if(!$parsed_url) {\r
+ $parsedPlatform = videolist_parse_url($input['video_url']);\r
+\r
+ if (!$parsedPlatform) {\r
register_error(elgg_echo('videolist:error:invalid_url'));\r
forward(REFERER);\r
}\r
- \r
+ list ($parsed, $platform) = $parsedPlatform;\r
+ /* @var Videolist_PlatformInterface $platform */\r
+\r
unset($input['title']);\r
unset($input['description']);\r
- $input = array_merge(videolist_get_data($parsed_url), $input);\r
+ $input = array_merge($parsed, $platform->getData($parsed), $input);\r
\r
} else {\r
unset($input['video_url']);\r
--- /dev/null
+<?php
+
+class Videolist_Platform_Bliptv implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "bliptv";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ $path = explode('/', $parsed['path']);
+
+ if ($parsed['host'] != 'blip.tv' || count($path) < 3) {
+ return false;
+ }
+
+ return array(
+ 'videotype' => 'bliptv',
+ 'video_id' => $parsed['path'],
+ );
+ }
+
+ public function getData($parsed)
+ {
+ $video_id = $parsed['video_id'];
+
+ $buffer = file_get_contents('http://blip.tv'.$video_id.'?skin=rss');
+ $xml = new SimpleXMLElement($buffer);
+
+ return array(
+ 'title' => current($xml->xpath('/rss/channel/item/title')),
+ 'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))),
+ 'thumbnail' => current($xml->xpath('/rss/channel/item/media:thumbnail/@url')),
+ 'embedurl' => current($xml->xpath('/rss/channel/item/blip:embedUrl')),
+ );
+ }
+}
--- /dev/null
+<?php
+
+class Videolist_Platform_Gisstv implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "gisstv";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ $path = explode('/', $parsed['path']);
+
+ if ($parsed['host'] != 'giss.tv' || $path[1] != 'dmmdb') {
+ return false;
+ }
+
+ if($path[2] == 'contents' && isset($path[3])) {
+ $video_id = $path[3];
+ } elseif($path[3] == 'contents' && isset($path[4])) {
+ $video_id = $path[4];
+ } else {
+ return false;
+ }
+
+ return array(
+ 'videotype' => 'gisstv',
+ 'video_id' => $video_id,
+ );
+ }
+
+ public function getData($parsed)
+ {
+ $video_id = $parsed['video_id'];
+
+ $buffer = file_get_contents('http://giss.tv/dmmdb//rss.php');
+ $xml = new SimpleXMLElement($buffer);
+
+ $data = array();
+ foreach($xml->xpath('/rss/channel/item') as $item){
+ if ($item->link === 'http://giss.tv/dmmdb//contents/'.$video_id) {
+ $data['title'] = $item->title;
+ $data['description'] = strip_tags($item->description);
+ $data['thumbnail'] = $item->thumbnail;
+ break;
+ }
+ }
+ return $data;
+ }
+}
--- /dev/null
+<?php
+
+class Videolist_Platform_Metacafe implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "metacafe";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ $path = explode('/', $parsed['path']);
+
+ if ($parsed['host'] != 'www.metacafe.com' || $path[1] != 'watch' || !(int) $path[2]) {
+ return false;
+ }
+
+ return array(
+ 'videotype' => 'metacafe',
+ 'video_id' => $path[2],
+ );
+ }
+
+ public function getData($parsed)
+ {
+ $video_id = $parsed['video_id'];
+
+ $buffer = file_get_contents("http://www.metacafe.com/api/item/$video_id");
+ $xml = new SimpleXMLElement($buffer);
+
+ return array(
+ 'title' => current($xml->xpath('/rss/channel/item/title')),
+ 'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))),
+ 'thumbnail' => current($xml->xpath('/rss/channel/item/media:thumbnail/@url')),
+ 'embedurl' => current($xml->xpath('/rss/channel/item/media:content/@url')),
+ );
+ }
+}
--- /dev/null
+<?php
+
+class Videolist_Platform_Vimeo implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "vimeo";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ $path = explode('/', $parsed['path']);
+
+ if ($parsed['host'] != 'vimeo.com' || !(int) $path[1]) {
+ return false;
+ }
+
+ return array(
+ 'videotype' => 'vimeo',
+ 'video_id' => $path[1],
+ );
+ }
+
+ public function getData($parsed)
+ {
+ $video_id = $parsed['video_id'];
+
+ $buffer = file_get_contents("http://vimeo.com/api/v2/video/$video_id.xml");
+ $xml = new SimpleXMLElement($buffer);
+
+ $videos = $xml->children();
+ $video = $videos[0];
+
+ return array(
+ 'title' => $video->title,
+ 'description' => strip_tags($video->description),
+ 'thumbnail' => $video->thumbnail_medium,
+ );
+ }
+}
--- /dev/null
+<?php
+
+class Videolist_Platform_Youtube implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "youtube";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ parse_str($parsed['query'], $query);
+
+ if ($parsed['host'] != 'www.youtube.com' || $parsed['path'] != '/watch' || !isset($query['v'])) {
+ return false;
+ }
+
+ return array(
+ 'videotype' => 'youtube',
+ 'video_id' => $query['v'],
+ );
+ }
+
+ public function getData($parsed)
+ {
+ $video_id = $parsed['video_id'];
+
+ $buffer = file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$video_id);
+ $xml = new SimpleXMLElement($buffer);
+
+ return array(
+ 'title' => $xml->title,
+ 'description' => strip_tags($xml->content),
+ 'thumbnail' => "http://img.youtube.com/vi/$video_id/default.jpg",
+ );
+ }
+}
--- /dev/null
+<?php
+
+interface Videolist_PlatformInterface {
+ /**
+ * @abstract
+ * @return string
+ */
+ public function getType();
+
+ /**
+ * @abstract
+ * @param string $url
+ * @return array
+ */
+ public function parseUrl($url);
+
+ /**
+ * @abstract
+ * @param array $parsed
+ * @return array
+ */
+ public function getData($parsed);
+}
+++ /dev/null
-<?php
-
-function videolist_parseurl_bliptv($url) {
- $parsed = parse_url($url);
- $path = explode('/', $parsed['path']);
-
- if ($parsed['host'] != 'blip.tv' || count($path) < 3) {
- return false;
- }
-
- return array(
- 'videotype' => 'bliptv',
- 'video_id' => $parsed['path'],
- );
-}
-
-function videolist_get_data_bliptv($parsed){
- $video_id = $parsed['video_id'];
-
- $buffer = file_get_contents('http://blip.tv'.$video_id.'?skin=rss');
- $xml = new SimpleXMLElement($buffer);
-
- return array(
- 'title' => sanitize_string(current($xml->xpath('/rss/channel/item/title'))),
- 'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))),
- 'thumbnail' => sanitize_string(current($xml->xpath('/rss/channel/item/media:thumbnail/@url'))),
- 'embedurl' => sanitize_string(current($xml->xpath('/rss/channel/item/blip:embedUrl'))),
- );
-}
+++ /dev/null
-<?php
-
-function videolist_parseurl_gisstv($url) {
- $parsed = parse_url($url);
- $path = explode('/', $parsed['path']);
-
- if ($parsed['host'] != 'giss.tv' || $path[1] != 'dmmdb') {
- return false;
- }
-
- if($path[2] == 'contents' && isset($path[3])) {
- $video_id = $path[3];
- } elseif($path[3] == 'contents' && isset($path[4])) {
- $video_id = $path[4];
- } else {
- return false;
- }
-
- return array(
- 'videotype' => 'gisstv',
- 'video_id' => $video_id,
- );
-}
-
-function videolist_get_data_gisstv($parsed){
- $video_id = $parsed['video_id'];
-
- $buffer = file_get_contents('http://giss.tv/dmmdb//rss.php');
- $xml = new SimpleXMLElement($buffer);
-
- $data = array();
- foreach($xml->xpath('/rss/channel/item') as $item){
- if(sanitize_string($item->link) == 'http://giss.tv/dmmdb//contents/'.$video_id) {
- $data['title'] = sanitize_string($item->title);
- $data['description'] = strip_tags($item->description);
- $data['thumbnail'] = sanitize_string($item->thumbnail);
- break;
- }
- }
- return $data;
-}
+++ /dev/null
-<?php
-
-function videolist_parseurl_metacafe($url) {
- $parsed = parse_url($url);
- $path = explode('/', $parsed['path']);
-
- if ($parsed['host'] != 'www.metacafe.com' || $path[1] != 'watch' || !(int) $path[2]) {
- return false;
- }
-
- return array(
- 'videotype' => 'metacafe',
- 'video_id' => $path[2],
- );
-}
-
-function videolist_get_data_metacafe($parsed){
- $video_id = $parsed['video_id'];
-
- $buffer = file_get_contents("http://www.metacafe.com/api/item/$video_id");
- $xml = new SimpleXMLElement($buffer);
-
- return array(
- 'title' => sanitize_string(current($xml->xpath('/rss/channel/item/title'))),
- 'description' => strip_tags(current($xml->xpath('/rss/channel/item/description'))),
- 'thumbnail' => sanitize_string(current($xml->xpath('/rss/channel/item/media:thumbnail/@url'))),
- 'embedurl' => sanitize_string(current($xml->xpath('/rss/channel/item/media:content/@url'))),
- );
-}
<?php
-define('VIDEOLIST_SUPPORTED_PLATFORMS', 'youtube, vimeo, metacafe, bliptv, gisstv');
-
-foreach(explode(', ', VIDEOLIST_SUPPORTED_PLATFORMS) as $videotype){
- include(elgg_get_plugins_path()."videolist/lib/$videotype.php");
-}
-
/**
- * @param string $url
* @return array
*/
-function videolist_parseurl($url){
- foreach(explode(', ', VIDEOLIST_SUPPORTED_PLATFORMS) as $videotype){
- if (is_callable("videolist_parseurl_$videotype")){
- if ($parsed = call_user_func("videolist_parseurl_$videotype", $url)) {
- return $parsed;
- }
- }
- }
- return array();
+function videolist_get_default_platforms() {
+ static $platforms = array();
+ if (! $platforms) {
+ require dirname(__FILE__) . '/Videolist/PlatformInterface.php';
+ $path = dirname(__FILE__) . '/Videolist/Platform';
+ foreach (scandir($path) as $filename) {
+ if (preg_match('/^(\\w+)\\.php$/', $filename, $m)) {
+ require "$path/$filename";
+ $class = 'Videolist_Platform_' . $m[1];
+ $platform = new $class();
+ if ($platform instanceof Videolist_PlatformInterface) {
+ /* @var Videolist_PlatformInterface $platform */
+ $platforms[$platform->getType()][] = $platform;
+ }
+ }
+ }
+ }
+ return $platforms;
}
/**
- * @param array $parsed
- * @return array
+ * @param string $url
+ * @return array [parsed, platform]
*/
-function videolist_get_data($parsed) {
- $videotype = $parsed['videotype'];
-
- if(is_callable("videolist_get_data_$videotype")){
- return array_merge($parsed, call_user_func("videolist_get_data_$videotype", $parsed));
- } else {
- return $parsed;
- }
+function videolist_parse_url($url) {
+ $parsed = parse_url($url);
+ $params['url'] = $url;
+ $platforms = videolist_get_default_platforms();
+ $platforms = elgg_trigger_plugin_hook('videolist:prepare', 'platforms', $params, $platforms);
+ foreach ($platforms as $list) {
+ foreach ($list as $platform) {
+ /* @var Videolist_PlatformInterface $platform */
+ $parsed = $platform->parseUrl($url);
+ if ($parsed) {
+ return array($parsed, $platform);
+ }
+ }
+ }
+ return false;
}
+++ /dev/null
-<?php
-
-function videolist_parseurl_vimeo($url) {
- $parsed = parse_url($url);
- $path = explode('/', $parsed['path']);
-
- if ($parsed['host'] != 'vimeo.com' || !(int) $path[1]) {
- return false;
- }
-
- return array(
- 'videotype' => 'vimeo',
- 'video_id' => $path[1],
- );
-}
-
-function videolist_get_data_vimeo($parsed){
- $video_id = $parsed['video_id'];
-
- $buffer = file_get_contents("http://vimeo.com/api/v2/video/$video_id.xml");
- $xml = new SimpleXMLElement($buffer);
-
- $videos = $xml->children();
- $video = $videos[0];
-
- return array(
- 'title' => sanitize_string($video->title),
- 'description' => strip_tags($video->description),
- 'thumbnail' => sanitize_string($video->thumbnail_medium),
- );
-}
+++ /dev/null
-<?php
-
-function videolist_parseurl_youtube($url) {
- $parsed = parse_url($url);
- parse_str($parsed['query'], $query);
-
- if ($parsed['host'] != 'www.youtube.com' || $parsed['path'] != '/watch' || !isset($query['v'])) {
- return false;
- }
-
- return array(
- 'videotype' => 'youtube',
- 'video_id' => $query['v'],
- );
-}
-
-function videolist_get_data_youtube($parsed){
- $video_id = $parsed['video_id'];
-
- $buffer = file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$video_id);
- $xml = new SimpleXMLElement($buffer);
-
- return array(
- 'title' => sanitize_string($xml->title),
- 'description' => strip_tags($xml->content),
- 'thumbnail' => "http://img.youtube.com/vi/$video_id/default.jpg",
- );
-}