]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/YouTube.php
private
[SourceForge/phpwiki.git] / lib / plugin / YouTube.php
1 <?php
2
3 /*
4  * Copyright 2007 Reini Urban
5  * Copyright 2008 Marc-Etienne Vargenau, Alcatel-Lucent
6  *
7  * This file is part of PhpWiki.
8  *
9  * PhpWiki is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * PhpWiki is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with PhpWiki; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  */
23
24 /**
25  * Embed YouTube videos
26  *
27  * Browse: Daily pick, Most Recent, Most Viewed, Top Rated, Most Discussed, Top Favorites, Most Linked,
28  *         Recently Featured, Most Responded, Watch on Mobile
29  * Time:   Today, This Week, This Month, All Time
30  * Category: All, Autos & Vehicles, Comedy, Entertainment, Film & Animation,
31  *         Gadgets & Games, Howto & DIY, Music, News & Politics, People & Blogs, Pets & Animals,
32  *         Sports, Travel & Places
33  * Language: All, English, Spanish, Japanese, German, Chinese, French
34  * @author: Reini Urban
35  */
36
37 class WikiPlugin_YouTube
38     extends WikiPlugin
39 {
40     function getName()
41     {
42         return _("YouTube");
43     }
44
45     function getDescription()
46     {
47         return _("Embed YouTube videos.");
48     }
49
50     function getDefaultArguments()
51     {
52         return array('v' => "",
53             'browse' => '', // see above
54             'time' => '', // only if browse
55             'category' => '', // only if browse
56             'language' => '', // only if browse
57             'index' => 0, // only if browse
58             'style' => 'inline', // or link. link links to youtube.
59             'size' => 'medium', // or large, medium or small
60             'autoplay' => 0,
61             'width' => "425",
62             'height' => "350");
63     }
64
65     function run($dbi, $argstr, &$request, $basepage)
66     {
67         $args = $this->getArgs($argstr, $request);
68         extract($args);
69         if (empty($args['v'])) {
70             if (empty($args['browse']))
71                 return $this->error(fmt("Required argument %s missing", "v"));
72             $this->_browse = array("Most Recent" => "mr",
73                 "Most Viewed" => "mp",
74                 "Top Rated" => "tr",
75                 "Most Discussed" => "md",
76                 "Top Favorites" => "mf",
77                 "Most Linked" => "mrd",
78                 "Recently Featured" => "rf",
79                 "Most Responded" => "ms",
80                 "Watch on Mobile" => "mv");
81             $this->browse = array_keys($this->_browse);
82             array_unshift($this->browse, "Daily Pick");
83             $this->_time = array("Today" => "t",
84                 "This Week" => "w",
85                 "This Month" => "m",
86                 "All Time" => "a");
87             $this->_category = array("All" => "0",
88                 "Autos & Vehicles" => "2",
89                 "Comedy" => "23",
90                 "Entertainment" => "24",
91                 "Film & Animation" => "1",
92                 "Gadgets & Games" => "20",
93                 "Howto & DIY" => "26",
94                 "Music" => "10",
95                 "News & Politics" => "25",
96                 "People & Blogs" => "22",
97                 "Pets & Animals" => "15",
98                 "Sports" => "17",
99                 "Travel & Places" => "19");
100             $this->_language = array("All" => "",
101                 "English" => "EN",
102                 "Spanish" => "ES",
103                 "Japanese" => "JA",
104                 "German" => "DE",
105                 "Chinese" => "CN",
106                 "French" => "FR");
107             if (!in_array($browse, $this->browse))
108                 return $this->error(fmt("Invalid argument %s", "browse"));
109             if ($time and !in_array($time, array_keys($this->_time)))
110                 return $this->error(fmt("Invalid argument %s", "time"));
111             if ($category and !in_array($category, $this->category))
112                 return $this->error(fmt("Invalid argument %s", "category"));
113             if ($language and !in_array($language, $this->language))
114                 return $this->error(fmt("Invalid argument %s", "language"));
115             if ($browse == "Daily Pick")
116                 $v = $this->Daily_pick();
117             else {
118                 $s = $this->_browse[$browse];
119                 $t = $time ? $this->_time[$time] : 't';
120                 $c = $category ? $this->_category[$category] : '0';
121                 $l = $language ? $this->_language[$language] : '';
122                 $url = "http://www.youtube.com/browse?s=$s&t=$t&c=$c&l=$l";
123                 $m = array('', '');
124                 if ($xml = url_get_contents($url)) {
125                     if ($index) {
126                         if (preg_match_all('/<div class="vtitle">.*?\n.*?<a href="\/watch\?v=(\w+)" onclick=/s', $xml, $m))
127                             $v = $m[1][$index];
128                     } else {
129                         if (preg_match('/<div class="vtitle">.*?\n.*?<a href="\/watch\?v=(\w+)" onclick=/s', $xml, $m))
130                             $v = $m[1];
131                     }
132                 }
133             }
134         }
135         // sanify check
136         if (strlen($v) < 10 or strlen($v) > 12)
137             return $this->error(fmt("Invalid argument %s", "v"));
138         if (strcspn($v, "-_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"))
139             return $this->error(fmt("Invalid argument %s", "v"));
140         $url = "http://www.youtube.com/v/" . $v;
141         if ($autoplay)
142             $url .= "?autoplay=1";
143         if ($size != 'medium') {
144             if ($size == 'large') {
145                 $width = 640;
146                 $height = 526;
147             } elseif ($size == 'small') {
148                 $width = 240;
149                 $height = 200;
150             }
151         }
152         unset($args['size']);
153         unset($args['style']);
154         $args['src'] = $v;
155         unset($args['v']);
156         if ($style == 'link') {
157             if ($size == 'medium') {
158                 $width = 130;
159                 $height = 97;
160             } elseif ($size == 'large') {
161                 $width = 320;
162                 $height = 240;
163             } elseif ($size == 'small') {
164                 $width = 90;
165                 $height = 60;
166             }
167             // img: http://img.youtube.com/vi/KKTDRqQtPO8/2.jpg or 0.jpg
168             $link = HTML::a(array('href' => $url),
169                 HTML::img(array('src' => "http://img.youtube.com/vi/" .
170                     $v . "/" . (($size == 'large') ? "0" : "2") . ".jpg",
171                     'width' => $width,
172                     'height' => $height,
173                     'alt' => "YouTube video $v")));
174             return $link;
175         }
176         $object = HTML::object(array('class' => 'inlineobject',
177             'width' => $width,
178             'height' => $height,
179         ));
180         $attrs = array('data' => $url,
181             'type' => 'application/x-shockwave-flash',
182             'width' => $width,
183             'height' => $height);
184         if (isBrowserSafari()) {
185             return HTML::object($attrs);
186         }
187         $object->pushContent(HTML::param(array('name' => 'movie', 'value' => $url)));
188         $object->pushContent(HTML::param(array('name' => 'wmode', 'value' => 'transparent')));
189         $object->pushContent(HTML::object($attrs));
190         return $object;
191     }
192
193     private function Daily_pick()
194     {
195         if ($xml = url_get_contents("http://www.youtube.com/categories")) {
196             if (preg_match('/<div class="heading"><b>Pick of The Day<\/b><\/div>.*?<a href="\/watch\?v=(\w+)">/s', $xml, $m))
197                 return $m[1];
198         }
199         return '';
200     }
201 }
202
203 // Local Variables:
204 // mode: php
205 // tab-width: 8
206 // c-basic-offset: 4
207 // c-hanging-comment-ender-p: nil
208 // indent-tabs-mode: nil
209 // End: