changeset 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
files scald_dailymotion.info scald_dailymotion.module scald_dailymotion_player.tpl.php
diffstat 3 files changed, 164 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scald_dailymotion.info	Fri Jul 16 17:24:41 2010 +0200
@@ -0,0 +1,3 @@
+name = Scald Dailymotion
+core = 6.x
+version = 6.x-1.0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scald_dailymotion.module	Fri Jul 16 17:24:41 2010 +0200
@@ -0,0 +1,148 @@
+<?php
+define('DAILYMOTION_RSS', 'http://www.dailymotion.com/rss/');
+define('NS_MEDIA',              'http://search.yahoo.com/mrss');
+define('NS_DM',                 'http://www.dailymotion.com/dmrss');
+
+/**
+ * Implements hook_scald_providers.
+ * Tell Scald that we'll be providing some video atoms.
+ */
+function scald_dailymotion_scald_provider() {
+  return array(
+    'atoms' => array(
+      'video' => array('A video hosted on DailyMotion')
+    )
+  );
+}
+
+/**
+ * Implements hook_scald_fetch.
+ */
+function scald_dailymotion_scald_fetch(&$atom) {
+  $atom->thumbnail_source = file_directory_path() . '/dailymotion/'. $atom->base_id .'.jpg';
+  $atom->file_source = $atom->thumbnail_source;
+}
+
+/**
+ * Implements hook_scald_prerender.
+ */
+function scald_dailymotion_scald_prerender(&$atom, $context, $options, $type) {
+  if ($type == 'atom') {
+    if ($context != 'sdl_library_item') {
+      $atom->rendered->player = theme('scald_dailymotion_player', $atom->base_id, $atom->thumbnail_source);
+    }
+  }
+}
+
+/**
+ * Implements hook_theme.
+ */
+function scald_dailymotion_theme() {
+  return array(
+    'scald_dailymotion_player' => array(
+      'arguments' => array('video' => NULL, 'thumbnail' => NULL),
+      'template' => 'scald_dailymotion_player'
+    )
+  );
+}
+
+/**
+ * Creates an atom based on a DailyMotion video id.
+ * @param $video_id
+ *   Unique identifier of the video on dailymotion
+ * @return integer
+ *   Unique identifier of the new atom
+ */
+function scald_dailymotion_register($video_id) {
+  global $user;
+  // Fetch the needed informations from DailyMotion
+  $infos = scald_dailymotion_video($video_id);
+  // Download a copy of the video thumbnail. This makes it possible
+  // to do interesting things when used with ImageCache for example.
+  $thumb = drupal_http_request($infos->thumbnail['src']);
+  $dir = file_directory_path() . '/dailymotion';
+  if ($thumb->code == 200 && file_check_directory($dir)) {
+    $dest = $dir . '/' . $infos->id . '.jpg';
+    $file = file_save_data($thumb->data, $dest);
+    if ($file) {
+      file_set_status($file, FILE_STATUS_PERMANENT);
+    }
+  }
+  // Create an atom
+  $atom = new stdClass;
+  $atom->type      = 'video';
+  $atom->provider  = 'scald_dailymotion';
+  $atom->base_id   = $infos->id;
+  $atom->publisher = $user->uid;
+  $atom->title     = $infos->title;
+  $aid = scald_author_get_id(array('name' => $infos->author));
+  $atom->authors   = array($aid);
+  // And save it
+  $atom_sid = scald_register_atom((array)$atom);
+  // Finally, return this id
+  return $atom_sid;
+}
+
+/**
+ * Analyze a DailyMotion RSS feed, reformating the informations about its
+ * items in an easy to manipulate objects containing the informations we're
+ * interested in.
+ * @param $type
+ *   DailyMotion RSS feed type. Examples include 'user', 'video', 'tag'...
+ * @param $id
+ *   The identifier, related to the type mentionned above. If you're requestion
+ *   a user feed, then, its the username...
+ * @return array
+ *   Each array value is an object containing the following members:
+ *     - id: the DailyMotion video id
+ *     - author: the DailyMotion username of the user who uploaded the video
+ *     - title: the video title
+ *     - thumbnail: an associative array, containing the source ('src'), width
+ *       and height of the video's thumbnail
+ *     - pubDate: the publication date of the video
+ */
+function scald_dailymotion_feed($type, $id) {
+  $url = DAILYMOTION_RSS . $type .'/'. $id;
+  $xml = drupal_http_request($url);
+  $items = array();
+  if ($xml->code != 404 && !empty($xml->data)) {
+    $dom = DOMDocument::loadXML($xml->data);
+    if ($dom) {
+      foreach($dom->getElementsByTagName('item') as $item) {
+        $info = new stdClass();
+        // Fetch from the feed
+        // ... the video id
+        $info->id = $item->getElementsByTagNameNS(NS_DM, 'id')->item(0)->nodeValue;
+        // ... its title
+        $title = $item->getElementsByTagName('title')->item(0);
+        $info->title = $title->nodeValue;
+        // ... and usefull informations about its thumbnails
+        $thumb = $item->getElementsByTagNameNS(NS_MEDIA, 'thumbnail')->item(0);
+        $info->thumbnail = array(
+          'src'    => $thumb->getAttribute('url'),
+          'width'  => $thumb->getAttribute('width'),
+          'height' => $thumb->getAttribute('height')
+        );
+        // ... also get the author
+        $info->author = $item->getElementsByTagNameNS(NS_DM, 'author')->item(0)->nodeValue;
+        // ... and the publication date
+        $info->pubDate = date('c', strtotime($item->getElementsByTagName('pubDate')->item(0)->nodeValue));
+        $items[] = $infos;
+      }
+    }
+  }
+  return $items;
+}
+
+/**
+ * Get information on a specific video.
+ * @param $id
+ *   The video id
+ * @return object
+ *   An object containing the video informations. For information on
+ *   the object format, see @scald_dailymotion_feed.
+ */
+function scald_dailymotion_video($id) {
+  $items = scald_dailymotion_feed('video', $id);
+  return $items[0];
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scald_dailymotion_player.tpl.php	Fri Jul 16 17:24:41 2010 +0200
@@ -0,0 +1,13 @@
+<?php
+/**
+ */
+?>
+<object width='480' height='365' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'>
+  <param name='movie' value='http://www.dailymotion.com/swf/<?php print $video; ?>&related=0'></param>
+  <param name='allowFullScreen' value='true'></param>
+  <param name='allowScriptAccess' value='always'></param>
+  <param name='wmode' value='transparent'></param>
+  <object data='http://www.dailymotion.com/swf/<?php print $video; ?>&related=0' type='application/x-shockwave-flash' width='480' height='365' allowfullscreen='true' allowscriptaccess='always' wmode='transparent'>
+    <img src='<?php print $thumbnail; ?>' alt='' class='dnd-dropped' width='480' />
+  </object>
+</object>