externalvideo: Added support for various media sources
[mahara:mahara.git] / htdocs / blocktype / externalvideo / media_sources / wikieducator / mediasource.php
1 <?php
2
3 require_once(dirname(__FILE__) . '/../Media_base.php');
4
5 class Media_wikieducator implements MediaBase {
6
7     private static $base_url = 'http://wikieducator.org/';
8
9     private static $default_width  = '100%';
10     private static $default_height = 300;
11
12     private static $max_percent_width = 100;
13
14     private static $iframe_sources = array(
15         array(
16             'match' => '#.*?https?://(www\.)?wikieducator\.org/index\.php\?(old|cur)id=([0-9]+).*#',
17             'url'   => 'http://wikieducator.org/index.php?$2id=$3',
18         ),
19     );
20
21     private static $scrape_sources = array(
22         array(
23             'match' => '#.*?https?://(www\.)?wikieducator\.org/([a-zA-Z0-9_\-+:%]+).*#',
24             'url'   => 'http://wikieducator.org/$2',
25         ),
26     );
27
28     public function process_url($input, $width=0, $height=0) {
29         $width  = $width  ? $width  : self::$default_width;
30         $height = $height ? (int)$height : self::$default_height;
31
32         if (strpos($width, '%') && !((int)$width <= self::$max_percent_width)) {
33             $width = self::$max_percent_width . '%';
34         }
35
36         foreach (self::$iframe_sources as $source) {
37             if (preg_match($source['match'], $input)) {
38                 $output = preg_replace($source['match'], $source['url'], $input);
39                 $result = array(
40                     'videoid' => $output,
41                     'type'    => 'iframe',
42                     'width'   => $width,
43                     'height'  => $height,
44                 );
45                 return $result;
46             }
47         }
48
49         foreach (self::$scrape_sources as $source) {
50             if (preg_match($source['match'], $input)) {
51                 $output = preg_replace($source['match'], $source['url'], $input);
52                 return $this->process_url(self::scrape_url($output));
53             }
54         }
55
56         return false;
57     }
58
59     public function validate_url($input) {
60         foreach (self::$iframe_sources as $source) {
61             if (preg_match($source['match'], $input)) {
62                 return true;
63             }
64         }
65
66         foreach (self::$scrape_sources as $source) {
67             if (preg_match($source['match'], $input)) {
68                 return true;
69             }
70         }
71         return false;
72     }
73
74     public function get_base_url() {
75         return self::$base_url;
76     }
77
78     private static function scrape_url($url) {
79         $config = array(
80             CURLOPT_URL => $url,
81         );
82
83         $data = mahara_http_request($config);
84         if (!empty($data->data)) {
85             if (preg_match('#.*var *wgArticleId *= *"?([0-9]+)"?;.*#',$data->data, $matches)) {
86                 $newurl = self::$base_url . 'index.php?curid=' . $matches[1];
87                 return $newurl;
88             }
89         }
90         return false;
91     }
92 }