block_tag_youtube.php 7.77 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
11

define('DEFAULT_NUMBER_OF_VIDEOS', 5);

class block_tag_youtube extends block_base {

    function init() {
        $this->title = get_string('blockname','block_tag_youtube');
moodler's avatar
moodler committed
12
        $this->version = 2007101509;
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    }

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

    function specialization() {
        $this->title = !empty($this->config->title) ? $this->config->title : get_string('blockname', 'block_tag_youtube');
    }

    function instance_allow_multiple() {
        return true;
    }

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

31
32
33
34
35
36
    function get_content() {

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

37
        $text = '';
38
39
40
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
        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;
        }

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

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

    function get_videos_by_tag(){

78
        $tagid = optional_param('id', 0, PARAM_INT);   // tag id - for backware compatibility
79
        $tag = optional_param('tag', '', PARAM_TAG); // tag
80
81

        if ($tag) {
82
            $tagobject = tag_get('name', $tag);
83
        } else if ($tagid) {
84
            $tagobject = tag_get('id', $tagid);
85
86
        }

87
        if (empty($tagobject)) {
88
            return '';
89
        }
90

91
        $querytag = urlencode($tagobject->name);
92
93

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

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

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

    function get_videos_by_tag_and_category(){

109
        $tagid = optional_param('id', 0, PARAM_INT);   // tag id - for backware compatibility
110
        $tag = optional_param('tag', '', PARAM_TAG); // tag
111
112

        if ($tag) {
113
            $tagobject = tag_get('name', $tag);
114
        } else if ($tagid) {
115
            $tagobject = tag_get('id', $tagid);
116
117
        }

118
        if (empty($tagobject)) {
119
            return '';
120
        }
121

122
        $querytag = urlencode($tagobject->name);
123
124
125
126
127
128

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

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

137

138
        return $this->fetch_request($request);
139
140
    }

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

145
        $response = $c->get($request);
146

147
148
        $xml = new SimpleXMLElement($response);
        return $this->render_video_list($xml);
149
    }
150

151
    function render_video_list(SimpleXMLElement $xml){
152
153

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

156
157
158
159
160
161
162
163
164
165
166
        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'];

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

    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;
        }
    }
237
}
238