block_tag_youtube.php 8.03 KB
Newer Older
1
<?php
2
3
4
5
6
7

define('DEFAULT_NUMBER_OF_VIDEOS', 5);

class block_tag_youtube extends block_base {

    function init() {
8
        $this->title = get_string('pluginname','block_tag_youtube');
9
10
11
12
13
14
15
    }

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

    function specialization() {
16
        $this->title = !empty($this->config->title) ? $this->config->title : get_string('pluginname', 'block_tag_youtube');
17
18
19
        // 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';
20
21
22
23
24
25
    }

    function instance_allow_multiple() {
        return true;
    }

26
27
    function preferred_width() {
        return 140;
28
    }
29

30
    function get_content() {
31
32
33
34
35
        global $CFG;

        //note: do NOT include files at the top of this file
        require_once($CFG->dirroot.'/tag/lib.php');
        require_once($CFG->libdir . '/filelib.php');
36
37
38
39
40

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

41
        $text = '';
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
70
        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;
        }

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

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

    function get_videos_by_tag(){

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

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

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

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

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

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

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

    function get_videos_by_tag_and_category(){

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

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

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

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

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

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

141

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

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

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

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

155
    function render_video_list(SimpleXMLElement $xml){
156
157

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

160
161
162
163
164
165
166
167
168
169
170
        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'];

171
172
            $text .= '<li>';
            $text .= '<div class="clearfix">';
173
174
175
            $text .= '<a href="'. $url . '">';
            $text .= '<img alt="" class="youtube-thumb" src="'. $thumbnail .'" /></a>';
            $text .= '</div><span><a href="'. $url . '">'. $title .'</a></span>';
176
            $text .= '<div>';
177
            $text .= format_time($seconds);
178
            $text .= "</div></li>\n";
179
        }
180
        $text .= "</ul><div class=\"clearer\"></div>\n";
181
182
        return $text;
    }
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
240

    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;
        }
    }
241
}
242