block_tag_youtube.php 7.97 KB
Newer Older
1
<?php
2
3

require_once($CFG->dirroot.'/tag/lib.php');
4
require_once($CFG->libdir . '/filelib.php');
5
6
7
8
9
10

define('DEFAULT_NUMBER_OF_VIDEOS', 5);

class block_tag_youtube extends block_base {

    function init() {
11
        $this->title = get_string('pluginname','block_tag_youtube');
moodler's avatar
moodler committed
12
        $this->version = 2007101509;
13
14
15
16
17
18
19
    }

    function applicable_formats() {
        return array('tag' => true);
    }

    function specialization() {
20
        $this->title = !empty($this->config->title) ? $this->config->title : get_string('pluginname', 'block_tag_youtube');
21
22
23
        // Convert numeric categories (old YouTube API) to
        // textual ones (new Google Data API)
        $this->config->category = !empty($this->config->category) ? $this->category_map_old2new($this->config->category) : '0';
24
25
26
27
28
29
    }

    function instance_allow_multiple() {
        return true;
    }

30
31
    function preferred_width() {
        return 140;
32
    }
33

34
35
36
37
38
39
    function get_content() {

        if ($this->content !== NULL) {
            return $this->content;
        }

40
        $text = '';
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
        if(!empty($this->config->playlist)){
            //videos from a playlist
            $text = $this->get_videos_by_playlist();
        }
        else{
            if(!empty($this->config->category)){
                //videos from category with tag
                $text = $this->get_videos_by_tag_and_category();
            }
            else {
                //videos with tag
                $text = $this->get_videos_by_tag();
            }
        }

        $this->content = new stdClass;
        $this->content->text = $text;
        $this->content->footer = '';

        return $this->content;
    }

    function get_videos_by_playlist(){

        $numberofvideos = DEFAULT_NUMBER_OF_VIDEOS;
        if( !empty($this->config->numberofvideos)) {
            $numberofvideos = $this->config->numberofvideos;
        }

70
71
72
73
74
        $request = 'http://gdata.youtube.com/feeds/api/playlists/' .
                   $this->config->playlist .
                   '?start-index=1&max-results=' .
                   $numberofvideos .
                   '&format=5';
75
76
77
78
79
80

        return $this->fetch_request($request);
    }

    function get_videos_by_tag(){

81
        $tagid = optional_param('id', 0, PARAM_INT);   // tag id - for backware compatibility
82
        $tag = optional_param('tag', '', PARAM_TAG); // tag
83
84

        if ($tag) {
85
            $tagobject = tag_get('name', $tag);
86
        } else if ($tagid) {
87
            $tagobject = tag_get('id', $tagid);
88
89
        }

90
        if (empty($tagobject)) {
91
            return '';
92
        }
93

94
        $querytag = urlencode($tagobject->name);
95
96

        $numberofvideos = DEFAULT_NUMBER_OF_VIDEOS;
97
        if ( !empty($this->config->numberofvideos) ) {
98
99
100
            $numberofvideos = $this->config->numberofvideos;
        }

101
102
103
104
105
        $request = 'http://gdata.youtube.com/feeds/api/videos?vq=' .
                   $querytag .
                   '&start-index=1&max-results=' .
                   $numberofvideos .
                   '&format=5';
106
107
108
109
110
111

        return $this->fetch_request($request);
    }

    function get_videos_by_tag_and_category(){

112
        $tagid = optional_param('id', 0, PARAM_INT);   // tag id - for backware compatibility
113
        $tag = optional_param('tag', '', PARAM_TAG); // tag
114
115

        if ($tag) {
116
            $tagobject = tag_get('name', $tag);
117
        } else if ($tagid) {
118
            $tagobject = tag_get('id', $tagid);
119
120
        }

121
        if (empty($tagobject)) {
122
            return '';
123
        }
124

125
        $querytag = urlencode($tagobject->name);
126
127
128
129
130
131

        $numberofvideos = DEFAULT_NUMBER_OF_VIDEOS;
        if( !empty($this->config->numberofvideos)) {
            $numberofvideos = $this->config->numberofvideos;
        }

132
        $request = 'http://gdata.youtube.com/feeds/api/videos?category=' .
133
                   $this->config->category .
134
135
136
137
138
139
                   '&vq=' .
                   $querytag .
                   '&start-index=1&max-results=' .
                   $numberofvideos .
                   '&format=5';

140

141
        return $this->fetch_request($request);
142
143
    }

144
    function fetch_request($request){
145
146
        $c = new curl(array('cache' => true, 'module_cache'=>'tag_youtube'));
        $c->setopt(array('CURLOPT_TIMEOUT' => 3, 'CURLOPT_CONNECTTIMEOUT' => 3));
147

148
        $response = $c->get($request);
149

150
151
        $xml = new SimpleXMLElement($response);
        return $this->render_video_list($xml);
152
    }
153

154
    function render_video_list(SimpleXMLElement $xml){
155
156

        $text = '';
157
        $text .= '<ul class="yt-video-entry unlist img-text">';
158

159
160
161
162
163
164
165
166
167
168
169
        foreach($xml->entry as $entry){
            $media = $entry->children('http://search.yahoo.com/mrss/');
            $playerattrs = $media->group->player->attributes();
            $url = s($playerattrs['url']);
            $thumbattrs = $media->group->thumbnail[0]->attributes();
            $thumbnail = s($thumbattrs['url']);
            $title = s($media->group->title);
            $yt = $media->children('http://gdata.youtube.com/schemas/2007');
            $secattrs = $yt->duration->attributes();
            $seconds = $secattrs['seconds'];

170
171
            $text .= '<li>';
            $text .= '<div class="clearfix">';
172
173
174
            $text .= '<a href="'. $url . '">';
            $text .= '<img alt="" class="youtube-thumb" src="'. $thumbnail .'" /></a>';
            $text .= '</div><span><a href="'. $url . '">'. $title .'</a></span>';
175
            $text .= '<div>';
176
            $text .= format_time($seconds);
177
            $text .= "</div></li>\n";
178
        }
179
        $text .= "</ul><div class=\"clearer\"></div>\n";
180
181
        return $text;
    }
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239

    function get_categories() {
        // TODO: Right now using sticky categories from
        // http://gdata.youtube.com/schemas/2007/categories.cat
        // This should be performed from time to time by the block insead
        // and cached somewhere, avoiding deprecated ones and observing regions
        return array (
            '0' => get_string('anycategory', 'block_tag_youtube'),
            'Film'  => get_string('filmsanimation', 'block_tag_youtube'),
            'Autos' => get_string('autosvehicles', 'block_tag_youtube'),
            'Music' => get_string('music', 'block_tag_youtube'),
            'Animals'=> get_string('petsanimals', 'block_tag_youtube'),
            'Sports' => get_string('sports', 'block_tag_youtube'),
            'Travel' => get_string('travel', 'block_tag_youtube'),
            'Games'  => get_string('gadgetsgames', 'block_tag_youtube'),
            'Comedy' => get_string('comedy', 'block_tag_youtube'),
            'People' => get_string('peopleblogs', 'block_tag_youtube'),
            'News'   => get_string('newspolitics', 'block_tag_youtube'),
            'Entertainment' => get_string('entertainment', 'block_tag_youtube'),
            'Education' => get_string('education', 'block_tag_youtube'),
            'Howto'  => get_string('howtodiy', 'block_tag_youtube'),
            'Tech'   => get_string('scienceandtech', 'block_tag_youtube')
        );
    }

    /**
     * Provide conversion from old numeric categories available in youtube API
     * to the new ones available in the Google API
     *
     * @param int $oldcat old category code
     * @return mixed new category code or 0 (if no match found)
     *
     * TODO: Someday this should be applied on upgrade for all the existing
     * block instances so we won't need the mapping any more. That would imply
     * to implement restore handling to perform the conversion of old blocks.
     */
    function category_map_old2new($oldcat) {
        $oldoptions = array (
            0  => '0',
            1  => 'Film',
            2  => 'Autos',
            23 => 'Comedy',
            24 => 'Entertainment',
            10 => 'Music',
            25 => 'News',
            22 => 'People',
            15 => 'Animals',
            26 => 'Howto',
            17 => 'Sports',
            19 => 'Travel',
            20 => 'Games'
        );
        if (array_key_exists($oldcat, $oldoptions)) {
            return $oldoptions[$oldcat];
        } else {
            return $oldcat;
        }
    }
240
}
241