aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Videolist/Platform/Bliptv.php38
-rw-r--r--lib/Videolist/Platform/Gisstv.php50
-rw-r--r--lib/Videolist/Platform/Metacafe.php38
-rw-r--r--lib/Videolist/Platform/Vimeo.php40
-rw-r--r--lib/Videolist/Platform/Youtube.php49
-rw-r--r--lib/Videolist/PlatformInterface.php23
-rw-r--r--lib/bliptv.php29
-rw-r--r--lib/gisstv.php41
-rw-r--r--lib/metacafe.php29
-rw-r--r--lib/videolist.php65
-rw-r--r--lib/vimeo.php31
-rw-r--r--lib/youtube.php28
12 files changed, 279 insertions, 182 deletions
diff --git a/lib/Videolist/Platform/Bliptv.php b/lib/Videolist/Platform/Bliptv.php
new file mode 100644
index 000000000..aa53032f9
--- /dev/null
+++ b/lib/Videolist/Platform/Bliptv.php
@@ -0,0 +1,38 @@
+<?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(
+ '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')),
+ );
+ }
+}
diff --git a/lib/Videolist/Platform/Gisstv.php b/lib/Videolist/Platform/Gisstv.php
new file mode 100644
index 000000000..b79898449
--- /dev/null
+++ b/lib/Videolist/Platform/Gisstv.php
@@ -0,0 +1,50 @@
+<?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(
+ '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;
+ }
+}
diff --git a/lib/Videolist/Platform/Metacafe.php b/lib/Videolist/Platform/Metacafe.php
new file mode 100644
index 000000000..7da6d1647
--- /dev/null
+++ b/lib/Videolist/Platform/Metacafe.php
@@ -0,0 +1,38 @@
+<?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(
+ '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')),
+ );
+ }
+}
diff --git a/lib/Videolist/Platform/Vimeo.php b/lib/Videolist/Platform/Vimeo.php
new file mode 100644
index 000000000..a4a1f275c
--- /dev/null
+++ b/lib/Videolist/Platform/Vimeo.php
@@ -0,0 +1,40 @@
+<?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(
+ '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,
+ );
+ }
+}
diff --git a/lib/Videolist/Platform/Youtube.php b/lib/Videolist/Platform/Youtube.php
new file mode 100644
index 000000000..d5a388356
--- /dev/null
+++ b/lib/Videolist/Platform/Youtube.php
@@ -0,0 +1,49 @@
+<?php
+
+class Videolist_Platform_Youtube implements Videolist_PlatformInterface
+{
+ public function getType()
+ {
+ return "youtube";
+ }
+
+ public function parseUrl($url)
+ {
+ $parsed = parse_url($url);
+ $id = '';
+ if (! empty($parsed['host'])) {
+ if ($parsed['host'] === 'youtu.be') {
+ // short URLs
+ $id = substr($parsed['path'], 1);
+ } elseif ($parsed['host'] === 'www.youtube.com'
+ && $parsed['path'] === '/watch'
+ && ! empty($parsed['query'])) {
+ // long URLs
+ parse_str($parsed['query'], $query);
+ if (! empty($query['v'])) {
+ $id = $query['v'];
+ }
+ }
+ }
+ if ($id) {
+ return array(
+ 'video_id' => $id,
+ );
+ }
+ return false;
+ }
+
+ 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",
+ );
+ }
+}
diff --git a/lib/Videolist/PlatformInterface.php b/lib/Videolist/PlatformInterface.php
new file mode 100644
index 000000000..25ca019e9
--- /dev/null
+++ b/lib/Videolist/PlatformInterface.php
@@ -0,0 +1,23 @@
+<?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);
+}
diff --git a/lib/bliptv.php b/lib/bliptv.php
deleted file mode 100644
index f4c0f772c..000000000
--- a/lib/bliptv.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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'))),
- );
-}
diff --git a/lib/gisstv.php b/lib/gisstv.php
deleted file mode 100644
index 24e11340a..000000000
--- a/lib/gisstv.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?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;
-}
diff --git a/lib/metacafe.php b/lib/metacafe.php
deleted file mode 100644
index 34b006a32..000000000
--- a/lib/metacafe.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?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'))),
- );
-}
diff --git a/lib/videolist.php b/lib/videolist.php
index 2dfc7d8fc..b86db99cf 100644
--- a/lib/videolist.php
+++ b/lib/videolist.php
@@ -1,29 +1,46 @@
<?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");
-}
-
-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();
+/**
+ * @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;
}
-function videolist_get_data($parsed) {
- $videotype = $parsed['videotype'];
- $video_id = $parsed['video_id'];
-
- if(is_callable("videolist_get_data_$videotype")){
- return array_merge($parsed, call_user_func("videolist_get_data_$videotype", $parsed));
- } else {
- return $parsed;
- }
+/**
+ * @param string $url
+ * @return array [parsed, platform]
+ */
+function videolist_parse_url($url) {
+ $params = array(
+ '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;
}
diff --git a/lib/vimeo.php b/lib/vimeo.php
deleted file mode 100644
index 0433c5a94..000000000
--- a/lib/vimeo.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?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),
- );
-}
diff --git a/lib/youtube.php b/lib/youtube.php
deleted file mode 100644
index 6ed9344b0..000000000
--- a/lib/youtube.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?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",
- );
-}