]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
switched to platform classes. see https://github.com/Elgg/videolist/issues/4
authorSteve Clay <steve@mrclay.org>
Mon, 9 Apr 2012 21:05:57 +0000 (17:05 -0400)
committerSteve Clay <steve@mrclay.org>
Mon, 9 Apr 2012 21:05:57 +0000 (17:05 -0400)
13 files changed:
actions/videolist/edit.php
lib/Videolist/Platform/Bliptv.php [new file with mode: 0644]
lib/Videolist/Platform/Gisstv.php [new file with mode: 0644]
lib/Videolist/Platform/Metacafe.php [new file with mode: 0644]
lib/Videolist/Platform/Vimeo.php [new file with mode: 0644]
lib/Videolist/Platform/Youtube.php [new file with mode: 0644]
lib/Videolist/PlatformInterface.php [new file with mode: 0644]
lib/bliptv.php [deleted file]
lib/gisstv.php [deleted file]
lib/metacafe.php [deleted file]
lib/videolist.php
lib/vimeo.php [deleted file]
lib/youtube.php [deleted file]

index be566de7ef1000a70083f999679e5635121ab258..1572d88ced3670f5394230a4fd47048b89d2871a 100644 (file)
@@ -32,16 +32,19 @@ if(!$video_guid) {
                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
diff --git a/lib/Videolist/Platform/Bliptv.php b/lib/Videolist/Platform/Bliptv.php
new file mode 100644 (file)
index 0000000..6956e06
--- /dev/null
@@ -0,0 +1,39 @@
+<?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')),
+        );
+    }
+}
diff --git a/lib/Videolist/Platform/Gisstv.php b/lib/Videolist/Platform/Gisstv.php
new file mode 100644 (file)
index 0000000..f811619
--- /dev/null
@@ -0,0 +1,51 @@
+<?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;
+    }
+}
diff --git a/lib/Videolist/Platform/Metacafe.php b/lib/Videolist/Platform/Metacafe.php
new file mode 100644 (file)
index 0000000..3cf2fb8
--- /dev/null
@@ -0,0 +1,39 @@
+<?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')),
+        );
+    }
+}
diff --git a/lib/Videolist/Platform/Vimeo.php b/lib/Videolist/Platform/Vimeo.php
new file mode 100644 (file)
index 0000000..82bd573
--- /dev/null
@@ -0,0 +1,41 @@
+<?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,
+        );
+    }
+}
diff --git a/lib/Videolist/Platform/Youtube.php b/lib/Videolist/Platform/Youtube.php
new file mode 100644 (file)
index 0000000..41c7d12
--- /dev/null
@@ -0,0 +1,38 @@
+<?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",
+        );
+    }
+}
diff --git a/lib/Videolist/PlatformInterface.php b/lib/Videolist/PlatformInterface.php
new file mode 100644 (file)
index 0000000..25ca019
--- /dev/null
@@ -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 (file)
index f4c0f77..0000000
+++ /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 (file)
index 24e1134..0000000
+++ /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 (file)
index 34b006a..0000000
+++ /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'))),
-       );
-}
index ae244184725c82ac51c182c626d8812809f95cf6..93b27b51ce334be4a13f852ac6bc70e327c1535b 100644 (file)
@@ -1,36 +1,45 @@
 <?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;
 }
diff --git a/lib/vimeo.php b/lib/vimeo.php
deleted file mode 100644 (file)
index 0433c5a..0000000
+++ /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 (file)
index 6ed9344..0000000
+++ /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",
-       );
-}