externalvideo: Added support for various media sources
[mahara:mahara.git] / htdocs / blocktype / externalvideo / media_sources / glogster / mediasource.php
1 <?php
2
3 require_once(dirname(__FILE__) . '/../Media_base.php');
4
5 class Media_glogster implements MediaBase {
6
7     private static $base_url = 'http://www.glogster.com/';
8
9     private static $default_width  = 480;
10     private static $default_height = 650;
11     private static $default_scale  = 50;
12
13     private static $embed_sources  = array(
14         array(
15             'match' => '#.*?glogster\.com/flash/flash_loader\.swf\?ver=(\d+).*?flashvars="([^"]+)".*#',
16             'url'   => 'http://www.glogster.com/flash/flash_loader.swf?ver=$1&$2',
17         ),
18     );
19
20     private static $iframe_sources = array(
21         array(
22             'match' => '#.*?https?://(www\.)?glogster\.com/glog\.php\?glog_id=([0-9]*).*#',
23             'url'   => 'http://www.glogster.com/glog.php?glog_id=$2&scale=',
24         ),
25     );
26
27     private static $scrape_sources = array(
28         array(
29             'match' => '#https?://([^.]*)\.glogster\.com/([^/]*)/.*#',
30             'url'   => 'http://$1.glogster.com/$2/',
31         ),
32     );
33
34     public function process_url($input, $width=0, $height=0) {
35         if (empty($input)) {
36             return false;
37         }
38
39         $width  = $width  ? (int)$width  : self::$default_width;
40         $height = $height ? (int)$height : self::$default_height;
41         $scale  = (int) $width / self::$default_width * self::$default_scale;
42
43         foreach (self::$embed_sources as $source) {
44             if (preg_match($source['match'], $input)) {
45                 $output = preg_replace($source['match'], $source['url'], $input);
46                 $result = array(
47                     'videoid' => $output,
48                     'type'    => 'embed',
49                     'width'   => $width,
50                     'height'  => $height,
51                 );
52                 return $result;
53             }
54         }
55
56         foreach (self::$iframe_sources as $source) {
57             if (preg_match($source['match'], $input)) {
58                 $output = preg_replace($source['match'], $source['url'], $input);
59                 $result = array(
60                     'videoid' => $output . $scale,
61                     'type'    => 'iframe',
62                     'width'   => $width,
63                     'height'  => $height,
64                 );
65                 return $result;
66             }
67         }
68
69         foreach (self::$scrape_sources as $source) {
70             if (preg_match($source['match'], $input)) {
71                 $output = preg_replace($source['match'], $source['url'], $input);
72                 return $this->process_url(self::scrape_url($output));
73             }
74         }
75         return false;
76     }
77
78     public function validate_url($input) {
79         foreach (self::$scrape_sources as $source) {
80             if (preg_match($source['match'], $input)) {
81                 return true;
82             }
83         }
84
85         foreach (self::$embed_sources as $source) {
86             if (preg_match($source['match'], $input)) {
87                 return true;
88             }
89         }
90
91         foreach (self::$iframe_sources as $source) {
92             if (preg_match($source['match'], $input)) {
93                 return true;
94             }
95         }
96         return false;
97     }
98
99     private static function scrape_url($url) {
100         $config = array(
101             CURLOPT_URL => $url,
102         );
103
104         $data = mahara_http_request($config);
105         if (!empty($data->data)) {
106             if (preg_match('#<textarea[^>]*?id="glogiframe"[^>]*>([^<]*)</textarea>#m',$data->data, $matches)) {
107                 $iframe = html_entity_decode($matches[1], ENT_QUOTES);
108                 return $iframe;
109             }
110         }
111         return false;
112     }
113
114     public function get_base_url() {
115         return self::$base_url;
116     }
117 }