diff options
author | Sem <sembrestels@riseup.net> | 2013-11-09 16:11:25 +0100 |
---|---|---|
committer | Sem <sembrestels@riseup.net> | 2013-11-09 16:11:25 +0100 |
commit | 59448d8a9864573c05477a63a6dda404c455fdb6 (patch) | |
tree | 8222848ea99b84a33b07a3113ff63bb07ab46692 /mod/videolist/lib | |
parent | 4cf4e4d3969ab43978c95f88238547530b01422d (diff) | |
parent | 17d7adcb317d25e37d3091e94b66e3f16de54196 (diff) | |
download | elgg-59448d8a9864573c05477a63a6dda404c455fdb6.tar.gz elgg-59448d8a9864573c05477a63a6dda404c455fdb6.tar.bz2 |
Add 'mod/videolist/' from commit '17d7adcb317d25e37d3091e94b66e3f16de54196'
git-subtree-dir: mod/videolist
git-subtree-mainline: 4cf4e4d3969ab43978c95f88238547530b01422d
git-subtree-split: 17d7adcb317d25e37d3091e94b66e3f16de54196
Diffstat (limited to 'mod/videolist/lib')
-rw-r--r-- | mod/videolist/lib/Videolist/Platform/Bliptv.php | 38 | ||||
-rw-r--r-- | mod/videolist/lib/Videolist/Platform/Gisstv.php | 50 | ||||
-rw-r--r-- | mod/videolist/lib/Videolist/Platform/Metacafe.php | 38 | ||||
-rw-r--r-- | mod/videolist/lib/Videolist/Platform/Vimeo.php | 40 | ||||
-rw-r--r-- | mod/videolist/lib/Videolist/Platform/Youtube.php | 49 | ||||
-rw-r--r-- | mod/videolist/lib/Videolist/PlatformInterface.php | 23 | ||||
-rw-r--r-- | mod/videolist/lib/videolist.php | 46 |
7 files changed, 284 insertions, 0 deletions
diff --git a/mod/videolist/lib/Videolist/Platform/Bliptv.php b/mod/videolist/lib/Videolist/Platform/Bliptv.php new file mode 100644 index 000000000..62cefbd39 --- /dev/null +++ b/mod/videolist/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('https://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/mod/videolist/lib/Videolist/Platform/Gisstv.php b/mod/videolist/lib/Videolist/Platform/Gisstv.php new file mode 100644 index 000000000..b79898449 --- /dev/null +++ b/mod/videolist/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/mod/videolist/lib/Videolist/Platform/Metacafe.php b/mod/videolist/lib/Videolist/Platform/Metacafe.php new file mode 100644 index 000000000..74a346b34 --- /dev/null +++ b/mod/videolist/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("https://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/mod/videolist/lib/Videolist/Platform/Vimeo.php b/mod/videolist/lib/Videolist/Platform/Vimeo.php new file mode 100644 index 000000000..6930cdb2d --- /dev/null +++ b/mod/videolist/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("https://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/mod/videolist/lib/Videolist/Platform/Youtube.php b/mod/videolist/lib/Videolist/Platform/Youtube.php new file mode 100644 index 000000000..31a4bc950 --- /dev/null +++ b/mod/videolist/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('https://gdata.youtube.com/feeds/api/videos/'.$video_id); + $xml = new SimpleXMLElement($buffer); + + return array( + 'title' => $xml->title, + 'description' => strip_tags($xml->content), + 'thumbnail' => "https://img.youtube.com/vi/$video_id/default.jpg", + ); + } +} diff --git a/mod/videolist/lib/Videolist/PlatformInterface.php b/mod/videolist/lib/Videolist/PlatformInterface.php new file mode 100644 index 000000000..25ca019e9 --- /dev/null +++ b/mod/videolist/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/mod/videolist/lib/videolist.php b/mod/videolist/lib/videolist.php new file mode 100644 index 000000000..b86db99cf --- /dev/null +++ b/mod/videolist/lib/videolist.php @@ -0,0 +1,46 @@ +<?php + +/** + * @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 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; +} |