Mercurial > defr > drupal > scald > scald_dailymotion
comparison scald_dailymotion.module @ 0:ad3d1dbbb66e
Scald Dailymotion: First stab at a DailyMotion provider not based on node
author | Franck Deroche <franck@defr.org> |
---|---|
date | Fri, 16 Jul 2010 17:24:41 +0200 |
parents | |
children | e851124eabe3 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:ad3d1dbbb66e |
---|---|
1 <?php | |
2 define('DAILYMOTION_RSS', 'http://www.dailymotion.com/rss/'); | |
3 define('NS_MEDIA', 'http://search.yahoo.com/mrss'); | |
4 define('NS_DM', 'http://www.dailymotion.com/dmrss'); | |
5 | |
6 /** | |
7 * Implements hook_scald_providers. | |
8 * Tell Scald that we'll be providing some video atoms. | |
9 */ | |
10 function scald_dailymotion_scald_provider() { | |
11 return array( | |
12 'atoms' => array( | |
13 'video' => array('A video hosted on DailyMotion') | |
14 ) | |
15 ); | |
16 } | |
17 | |
18 /** | |
19 * Implements hook_scald_fetch. | |
20 */ | |
21 function scald_dailymotion_scald_fetch(&$atom) { | |
22 $atom->thumbnail_source = file_directory_path() . '/dailymotion/'. $atom->base_id .'.jpg'; | |
23 $atom->file_source = $atom->thumbnail_source; | |
24 } | |
25 | |
26 /** | |
27 * Implements hook_scald_prerender. | |
28 */ | |
29 function scald_dailymotion_scald_prerender(&$atom, $context, $options, $type) { | |
30 if ($type == 'atom') { | |
31 if ($context != 'sdl_library_item') { | |
32 $atom->rendered->player = theme('scald_dailymotion_player', $atom->base_id, $atom->thumbnail_source); | |
33 } | |
34 } | |
35 } | |
36 | |
37 /** | |
38 * Implements hook_theme. | |
39 */ | |
40 function scald_dailymotion_theme() { | |
41 return array( | |
42 'scald_dailymotion_player' => array( | |
43 'arguments' => array('video' => NULL, 'thumbnail' => NULL), | |
44 'template' => 'scald_dailymotion_player' | |
45 ) | |
46 ); | |
47 } | |
48 | |
49 /** | |
50 * Creates an atom based on a DailyMotion video id. | |
51 * @param $video_id | |
52 * Unique identifier of the video on dailymotion | |
53 * @return integer | |
54 * Unique identifier of the new atom | |
55 */ | |
56 function scald_dailymotion_register($video_id) { | |
57 global $user; | |
58 // Fetch the needed informations from DailyMotion | |
59 $infos = scald_dailymotion_video($video_id); | |
60 // Download a copy of the video thumbnail. This makes it possible | |
61 // to do interesting things when used with ImageCache for example. | |
62 $thumb = drupal_http_request($infos->thumbnail['src']); | |
63 $dir = file_directory_path() . '/dailymotion'; | |
64 if ($thumb->code == 200 && file_check_directory($dir)) { | |
65 $dest = $dir . '/' . $infos->id . '.jpg'; | |
66 $file = file_save_data($thumb->data, $dest); | |
67 if ($file) { | |
68 file_set_status($file, FILE_STATUS_PERMANENT); | |
69 } | |
70 } | |
71 // Create an atom | |
72 $atom = new stdClass; | |
73 $atom->type = 'video'; | |
74 $atom->provider = 'scald_dailymotion'; | |
75 $atom->base_id = $infos->id; | |
76 $atom->publisher = $user->uid; | |
77 $atom->title = $infos->title; | |
78 $aid = scald_author_get_id(array('name' => $infos->author)); | |
79 $atom->authors = array($aid); | |
80 // And save it | |
81 $atom_sid = scald_register_atom((array)$atom); | |
82 // Finally, return this id | |
83 return $atom_sid; | |
84 } | |
85 | |
86 /** | |
87 * Analyze a DailyMotion RSS feed, reformating the informations about its | |
88 * items in an easy to manipulate objects containing the informations we're | |
89 * interested in. | |
90 * @param $type | |
91 * DailyMotion RSS feed type. Examples include 'user', 'video', 'tag'... | |
92 * @param $id | |
93 * The identifier, related to the type mentionned above. If you're requestion | |
94 * a user feed, then, its the username... | |
95 * @return array | |
96 * Each array value is an object containing the following members: | |
97 * - id: the DailyMotion video id | |
98 * - author: the DailyMotion username of the user who uploaded the video | |
99 * - title: the video title | |
100 * - thumbnail: an associative array, containing the source ('src'), width | |
101 * and height of the video's thumbnail | |
102 * - pubDate: the publication date of the video | |
103 */ | |
104 function scald_dailymotion_feed($type, $id) { | |
105 $url = DAILYMOTION_RSS . $type .'/'. $id; | |
106 $xml = drupal_http_request($url); | |
107 $items = array(); | |
108 if ($xml->code != 404 && !empty($xml->data)) { | |
109 $dom = DOMDocument::loadXML($xml->data); | |
110 if ($dom) { | |
111 foreach($dom->getElementsByTagName('item') as $item) { | |
112 $info = new stdClass(); | |
113 // Fetch from the feed | |
114 // ... the video id | |
115 $info->id = $item->getElementsByTagNameNS(NS_DM, 'id')->item(0)->nodeValue; | |
116 // ... its title | |
117 $title = $item->getElementsByTagName('title')->item(0); | |
118 $info->title = $title->nodeValue; | |
119 // ... and usefull informations about its thumbnails | |
120 $thumb = $item->getElementsByTagNameNS(NS_MEDIA, 'thumbnail')->item(0); | |
121 $info->thumbnail = array( | |
122 'src' => $thumb->getAttribute('url'), | |
123 'width' => $thumb->getAttribute('width'), | |
124 'height' => $thumb->getAttribute('height') | |
125 ); | |
126 // ... also get the author | |
127 $info->author = $item->getElementsByTagNameNS(NS_DM, 'author')->item(0)->nodeValue; | |
128 // ... and the publication date | |
129 $info->pubDate = date('c', strtotime($item->getElementsByTagName('pubDate')->item(0)->nodeValue)); | |
130 $items[] = $infos; | |
131 } | |
132 } | |
133 } | |
134 return $items; | |
135 } | |
136 | |
137 /** | |
138 * Get information on a specific video. | |
139 * @param $id | |
140 * The video id | |
141 * @return object | |
142 * An object containing the video informations. For information on | |
143 * the object format, see @scald_dailymotion_feed. | |
144 */ | |
145 function scald_dailymotion_video($id) { | |
146 $items = scald_dailymotion_feed('video', $id); | |
147 return $items[0]; | |
148 } |