diff options
author | Silvio <silvio@devlet.com.br> | 2010-10-08 15:34:02 -0300 |
---|---|---|
committer | Silvio <silvio@devlet.com.br> | 2010-10-08 15:34:02 -0300 |
commit | ebbcd617393c83364699592dfeca8c6e7c3a578a (patch) | |
tree | cb940bddbed4b1ad1cfcfb1a1e0496dfc5a5ad03 | |
parent | 6715a36dad52d37b54c63c9ccc0f9532d61e1b43 (diff) | |
download | exif-ebbcd617393c83364699592dfeca8c6e7c3a578a.tar.gz exif-ebbcd617393c83364699592dfeca8c6e7c3a578a.tar.bz2 |
CVS update
-rw-r--r-- | CVS/Entries | 15 | ||||
-rwxr-xr-x | README.txt | 65 | ||||
-rwxr-xr-x | exif.info | 7 | ||||
-rwxr-xr-x | exif.install | 89 | ||||
-rwxr-xr-x | exif.module | 569 | ||||
-rw-r--r-- | exif_location/CVS/Entries | 6 | ||||
-rw-r--r-- | exif_location/exif_location.info | 1 | ||||
-rw-r--r-- | exif_location/exif_location.install | 15 | ||||
-rw-r--r-- | exif_location/exif_location.module | 32 |
9 files changed, 370 insertions, 429 deletions
diff --git a/CVS/Entries b/CVS/Entries index c67f260..b766d55 100644 --- a/CVS/Entries +++ b/CVS/Entries @@ -1,7 +1,12 @@ D/exif_location//// -/README.txt/1.6/Thu Oct 7 21:44:03 2010// -/exif.info/1.4/Thu Oct 7 21:44:03 2010// -/exif.install/1.4/Thu Oct 7 21:44:03 2010// D/po//// -/exif.class.php/1.1.2.18/Result of merge//TDRUPAL-6--1 -/exif.module/1.9/Fri Oct 8 18:30:59 2010// +/exif.class.php/1.1.2.18/Fri Oct 8 18:31:36 2010//TDRUPAL-6--1 +/.cvsignore/1.1.2.2/Fri Mar 19 22:17:00 2010//TDRUPAL-6--1 +/CHANGES.txt/1.1.2.14/Fri Oct 8 17:44:00 2010//TDRUPAL-6--1 +/README.txt/1.6.2.3/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/exif.admin.inc/1.1.2.1/Wed Jun 9 13:14:02 2010//TDRUPAL-6--1 +/exif.css/1.1.2.1/Fri Jan 23 11:13:15 2009//TDRUPAL-6--1 +/exif.info/1.4.2.2/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/exif.install/1.4.2.6/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/exif.module/1.9.2.18/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/sample.jpg/1.1.2.1/Fri Jan 30 16:04:44 2009/-kb/TDRUPAL-6--1 @@ -1,3 +1,5 @@ +// $Id: + README file for the Exif Drupal module. @@ -19,58 +21,43 @@ The metadata tags defined in the Exif standard cover a broad spectrum including camera. * Descriptions and copyright information. -Administrators can choose what Exif tags they want to display, and control the -order of appearance. +Administrators can choose via CCK fields which Exif information are read. At this time, this module supports Exif information only with JPEG files. [1] Reference: http://en.wikipedia.org/wiki/Exchangeable_image_file_format -Requirements -************ - -This module requires the PHP Exif Library (PEL), http://sourceforge.net/projects/pel - -Your PHP must be compiled in with --enable-exif. Windows users must also have -the mbstring extension enabled. - -PEL itself requires PHP version 5. -It does NOT work under PHP 4. +Requirements and Constraints +**************************** -This module has been tested with PEL version 0.91. +CCK with at least textfields enabled. +If you use a module like imagefield. It's only possible to have one image per node!! +If there are more than one images per node, only the exif data of one image is read! -And of course, this module also requires Drupal (version 5.0). This module won't -do anything without the Image module (http://drupal.org/project/image), as Exif -data is displayed only on image nodes. +IMPORTANT: If you are using imagefield, do not call the content type "image"!!! Image +is reserved for using the Image module. If you call your content type image and you are +using imagefield, the module is not going to work. -Installation +Usage ************ -1. Extract the 'exif' module directory, including all its subdirectories, into - your Drupal modules directory. - -2. Download and extract the PEL archive into the modules/exif/pel - directory. When you're finished the directory structure should look something - like: +After installing it you can go to your CCK nodetype. It supports both the image module +aswell as the imagefield module. Let's say you have an content type "photo". Go to your +cck settings and add a new field. For the name of the field you need to follow the following +naming conventions: - drupal/ - sites/ - example.com/ - modules/ - exif/ - pel/ - README - INSTALL - Pel.php - PelJpeg.php - ... - -3. Enable the Exif module on your site's administer > site building > modules - page. A database table will automagically be created at this point. +Example: +#1 field_exif_exposuretime -> this would read the ExposureTime of the image and save it +in this field. -4. Go to administer > site configuration > exif settings, and select what Exif - tags to display. +#2 field_ifd0_datetime -> this would read the date time (2009:01:23 08:52:43) of the image. +as a field_type you can take for example a normal textfield, but also a date field would be +possible. +General rule is: [field]_[section]_[name] +Under admin/settings/exif you can see a list of all possible information. These informations +are taken from the image "sample.jpg". I may not contain all tags available. If you are looking +for some specific tags you can just replace this image with your own image.
\ No newline at end of file @@ -1,6 +1,9 @@ -; $Id: exif.info,v 1.4 2007/06/18 23:50:49 dww Exp $ +; $Id: exif.info,v 1.4.2.2 2009/02/05 20:11:54 rapsli Exp $ name = Exif description = "Display Exif metadata on image nodes." -dependencies = image +dependencies[] = content +dependencies[] = text +dependencies[] = exif_helper package = Image +core = 6.x diff --git a/exif.install b/exif.install index 75bf5d2..cc1373d 100755 --- a/exif.install +++ b/exif.install @@ -1,85 +1,26 @@ <?php -// $Id: exif.install,v 1.4 2008/04/05 23:22:05 davidlesieur Exp $ +// $Id: exif.install,v 1.4.2.6 2010/04/27 20:53:13 rapsli Exp $ +/** + * @file the install part of the module +*/ /** * Implementation of hook_install(). */ function exif_install() { - switch ($GLOBALS['db_type']) { - case 'mysql': - case 'mysqli': - db_query("CREATE TABLE {exif_tags} ( - ifd int(10) unsigned NOT NULL default '0', - tag int(10) unsigned NOT NULL default '0', - status int(10) unsigned NOT NULL default '0', - weight int(11) NOT NULL default '0', - PRIMARY KEY (ifd, tag) - ) /*!40100 DEFAULT CHARACTER SET utf8 */;" - ); - db_query("CREATE TABLE {exif} ( - fid int(10) unsigned NOT NULL default '0', - ifd int(10) unsigned NOT NULL default '0', - tag int(10) unsigned NOT NULL default '0', - value varchar(255) NOT NULL default '', - PRIMARY KEY (fid, ifd, tag) - ) /*!40100 DEFAULT CHARACTER SET utf8 */;" - ); - break; - case 'pgsql': - db_query("CREATE TABLE {exif_tags} ( - ifd integer NOT NULL default '0', - tag integer NOT NULL default '0', - status integer NOT NULL default '0', - weight integer NOT NULL default '0', - PRIMARY KEY (ifd, tag) - );" - ); - db_query("CREATE TABLE {exif} ( - fid int(10) unsigned NOT NULL default '0', - ifd int(10) unsigned NOT NULL default '0', - tag int(10) unsigned NOT NULL default '0', - value varchar(255) NOT NULL default '', - PRIMARY KEY (fid, ifd, tag) - );" - ); - break; - } + db_query("UPDATE {system} SET weight = %d WHERE name = '%s'", -10, 'exif'); } -function exif_update_1() { - // Works for postgres?? - $ret[] = update_sql('ALTER TABLE {exif} RENAME TO {exif_tags}'); - // make new table for caching and tracking exif data. - switch ($GLOBALS['db_type']) { - case 'mysql': - case 'mysqli': - $ret[] = update_sql("CREATE TABLE {exif} ( - fid int(10) unsigned NOT NULL default '0', - ifd int(10) unsigned NOT NULL default '0', - tag int(10) unsigned NOT NULL default '0', - value varchar(255) NOT NULL default '', - PRIMARY KEY (fid, ifd, tag) - ) /*!40100 DEFAULT CHARACTER SET utf8 */;" - ); - break; - case 'pgsql': - $ret[] = update_sql("CREATE TABLE {exif} ( - fid int(10) unsigned NOT NULL default '0', - ifd int(10) unsigned NOT NULL default '0', - tag int(10) unsigned NOT NULL default '0', - value varchar(255) NOT NULL default '', - PRIMARY KEY (fid, ifd, tag) - );" +function exif_requirements($phase) { + $t = get_t(); + if ($phase == 'runtime' || $phase == 'install') { + if (!function_exists('exif_read_data')) { + $requirements['exif_read_data'] = array( + 'title' => $t('Function exif_read_data not available'), + 'value' => $t('The Function exif_read_data is not available on the system.'), + 'severity' => REQUIREMENT_ERROR, ); - break; + } } - return $ret; + return $requirements; } - -/** - * Implementation of hook_uninstall(). - */ -function exif_uninstall() { - db_query('DROP TABLE {exif_tags}'); - db_query('DROP TABLE {exif}'); -}
\ No newline at end of file diff --git a/exif.module b/exif.module index 3853eb4..ecbbd6e 100755 --- a/exif.module +++ b/exif.module @@ -1,362 +1,347 @@ <?php -// $Id: exif.module,v 1.9 2008/04/05 23:22:05 davidlesieur Exp $ +// $Id: exif.module,v 1.9.2.18 2010/07/23 17:47:46 rapsli Exp $: /** - * Implementation of hook_menu(). + * @file implementing the drupal api + */ +/** + * @author: Raphael Schär - www.rapsli.ch */ -function exif_menu($may_cache) { - $items = array(); - - if ($may_cache) { - $items[] = array( - 'path' => 'admin/settings/exif', - 'title' => t('Exif'), - 'callback' => 'drupal_get_form', - 'callback arguments' => array('exif_admin_settings_form'), - 'access' => user_access('administer site configuration'), - 'description' => t('Configure what Exif tags to display.'), - ); - } +function exif_menu() { + $items['admin/settings/exif'] = array( + 'title' => 'Exif', + 'page callback' => 'exif_admin_settings', + 'access arguments' => array('administer site configuration'), + 'description' => t('Display available fields'), + 'access callback' => 'user_access', + 'file' => 'exif.admin.inc', + 'type' => MENU_NORMAL_ITEM, + ); + $items['admin/settings/exif/general'] = array( + 'title' => 'Exif', + 'page callback' => 'exif_admin_settings', + 'access arguments' => array('administer site configuration'), + 'description' => t('Display available fields'), + 'access callback' => 'user_access', + 'file' => 'exif.admin.inc', + 'type' => MENU_DEFAULT_LOCAL_TASK, + ); + $items['admin/settings/exif/config'] = array( + 'title' => 'Config', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('exif_admin_settings_form'), + 'access arguments' => array('administer site configuration'), + 'description' => t('Some Settings'), + 'access callback' => 'user_access', + 'file' => 'exif.admin.inc', + 'type' => MENU_LOCAL_TASK, + ); return $items; } /** - * Implementation of hook_nodeapi(). + * implementation of hook_nodeapi */ -function exif_nodeapi(&$node, $op, $teaser) { - if ($teaser || $node->type != 'image') { +function exif_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) { + + if ($teaser) { return; } switch ($op) { - case 'insert': + case 'update': - $fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $node->images[IMAGE_ORIGINAL])); - $file = file_create_path($node->images[IMAGE_ORIGINAL]); - $data = _exif_read_exif($file); - db_query('DELETE FROM {exif} WHERE fid = %d', $fid); - - // Cache data in db. - foreach ($data as $ifd => $tags) { - foreach ($tags as $tag => $value) { - db_query("INSERT INTO {exif} (fid, ifd, tag, value) VALUES (%d, %d, %d, '%s')", - $fid, $ifd, $tag, $value); - } + //we are only going to update if we have said so + if (!variable_get('exif_update', TRUE)) { + break; } - break; + case 'insert': + if (! _exif_check_for_exif_data($node->type)) { + return; + } + $info = content_types($node->type); + $fields = $info['fields']; + $exif = _exif_get_class(); + + //get all the fields that will be filled with exif data + $ar_exif_fields = $exif->getExifFields($fields); + + //get the path to the image + $image_path = _exif_get_image_path($fields, $node); - case 'load': - $fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $node->images[IMAGE_ORIGINAL])); - return array('exif_data' => _exif_get_exif($fid)); - case 'view': - $node->content['exif'] = array( - '#value' => theme('exif_table', $node), - '#weight' => 10, - ); + $fid = db_result(db_query("SELECT fid FROM {files} WHERE filepath = '%s'", $image_path)); + $file = file_create_path($image_path); + + $data1 = _exif_reformat($exif->readExifTags($file, $ar_exif_fields)); + $data2 = $exif->readIPTCTags($file, $ar_exif_fields); + + if (class_exists('SXMPFiles')) { + $data3 = $exif->readXMPTags($file, $ar_exif_fields); + $data = array_merge($data1, $data2, $data3); + } + else { + $data = array_merge($data1, $data2); + } + + // Loop through every exif enabled field and set its value to the + // corresponding exif value. If no exif value was found, set the field + // value to NULL, to avoid strange behaviour in other field modules + // (date). + foreach ($ar_exif_fields as $ar_exif_field) { + $exif_name = $ar_exif_field['section'] .'_'. $ar_exif_field['tag']; + $exif_value = isset($data[$exif_name]) ? $data[$exif_name] : NULL; + + $field_name = 'field_'. $exif_name; + if (! $exif_value) { + if (variable_get('exif_empty_values', TRUE)) { + $node->{$field_name}[0]['value'] = NULL; + } + continue; + } + $field = $fields[$field_name]; + + // Setup the field value array for delta = 0. + switch ($exif_name) { + case 'exif_datetimeoriginal': + case 'exif_datetimedigitized': + case 'ifd0_datetime': + $first_delta = _exif_date_handler($field, $exif_value); + break; + default: + $first_delta = array('value' => $data[$exif_name]); + break; + } + $node->{$field_name}[0] = $first_delta; + } break; } } /** - * Administration page callback. + * Date API hook. + * + * Make exif a date format in Date API. This makes it possible to alter the + * format exif dates is parsed as. */ -function exif_admin_settings_form() { - _exif_bootstrap(); - $tags = exif_load_settings(); - foreach ($tags as $tag) { - $form['tags']["{$tag->ifd}_{$tag->tag}"]['type'] = array( - '#type' => 'markup', - '#value' => PelIfd::getTypeName($tag->ifd), - ); - $form['tags']["{$tag->ifd}_{$tag->tag}"]['ifd'] = array( - '#type' => 'hidden', - '#value' => $tag->ifd, - ); - $form['tags']["{$tag->ifd}_{$tag->tag}"]['tag'] = array( - '#type' => 'hidden', - '#value' => $tag->tag, - ); - $form['tags']["{$tag->ifd}_{$tag->tag}"]['status'] = array( - '#type' => 'checkbox', - '#title' => utf8_encode(PelTag::getTitle($tag->ifd, $tag->tag)), - '#default_value' => $tag->status, - ); - $form['tags']["{$tag->ifd}_{$tag->tag}"]['weight'] = array( - '#type' => 'weight', - '#delta' => 10, - '#default_value' => $tag->weight, - ); - $form['tags']["{$tag->ifd}_{$tag->tag}"]['#tree'] = TRUE; - $form['tags']["{$tag->ifd}_{$tag->tag}"]['#weight'] = $tag->weight; - } - $form['buttons']['submit'] = array( - '#type' => 'submit', - '#value' => t('Save configuration') - ); - $form['buttons']['reset'] = array( - '#type' => 'submit', - '#value' => t('Reset to defaults') - ); - - return $form; +function exif_date_format_types() { + return array('exif' => 'EXIF'); } -function exif_admin_settings_form_submit($form_id, $values) { - $op = isset($_POST['op']) ? $_POST['op'] : ''; +/** + * Date API hook. + * + * Make the EXIF date format default for the 'exif' date type. + */ +function exif_date_formats() { + return array( + array( + 'type' => 'exif', + 'format' => 'Y:m:d H:i:s', + ), + ); +} - if ($op == t('Reset to defaults')) { - exif_reset_settings(); - drupal_set_message(t('The configuration options have been reset to their default values.')); +/** + * Helper function to handle all date values from exif header. This is + * designed for the date_api and date modules, but is compatible if these + * aren't enabled. + * + * @param array $field + * The field definition for the matcing exif date + * @param string $exif_date + * The date extracted from exif header. + * @return array + * The field value array for delta = 0 + */ +function _exif_date_handler($field, $exif_date) { + if (! module_exists('date_api')) { + // Don't bother doing anything if the webmaster doesn't ... + return array('value' => $exif_date); } - elseif ($op == t('Save configuration')) { - exif_save_settings($values); - drupal_set_message(t('The configuration options have been saved.')); + + require_once drupal_get_path('module', 'date_api') .'/date_api_elements.inc'; + $date_datetime = date_convert_from_custom($exif_date, variable_get('date_format_exif', 'Y:m:d H:i:s')); + if (! in_array($field['type'], array('date', 'datetime', 'datestamp'))) { + // Field is not a date field type, so we return a ISO-8601 representation + return array('value' => date_convert($date_datetime, DATE_DATETIME, DATE_ISO)); } + + // Exif doesn't handles timezones, so we assume the exif date is in the + // timezone configured for this date field. This means the exif date needs + // to be converted to UTC before it's stored. + $timezone = date_get_timezone($field['tz_handling']); + $date = date_make_date($date_datetime, $timezone, DATE_DATETIME, $field['granularity']); + + // Store date offset before converting to UTC as this is lost when setting + // timezone to 'UTC'. + $offset = date_offset_get($date); + date_timezone_set($date, timezone_open('UTC')); + + // Finally, convert the date object in UTC to a date according to the field + // type: DATE_ISO, DATE_DATETIME or DATE_UNIX. + $date_field = date_convert($date, DATE_OBJECT, $field['type']); + return array( + 'value' => $date_field, + 'value2' => $date_field, + 'timezone' => $timezone, + 'offset' => $offset, + 'offset2' => $offset, + ); } /** - * Fetch exif data. + * Let's check if this node type contains an image field. + * + * @param $fields fields from this content type + * @return boolean */ -function _exif_get_exif($fid) { - $data = array(); - if ($result = db_query('SELECT * FROM {exif} WHERE fid = %d', $fid)) { - while ($row = db_fetch_object($result)) { - $data[$row->ifd][$row->tag] = $row->value; +function _exif_check_for_exif_data($node_type) { + + $new_types = array(); + //fill up array with checked nodetypes + foreach (variable_get('exif_nodetypes', array()) as $type) { + if ($type != "0" ) { + $new_types[] = $type; } } - - return $data; + if (in_array($node_type, $new_types)) { + return TRUE; + } + return FALSE; } /** - * Reads exif data from a file. + * From a given node we are going to get the imagepath of the image. if it's an image node + * it's just going to be images[IMAGE_ORIGINAL]. If it's an imagefield node, we have to go + * through the fields and look if there is an imagefield and then return the path + * + * @param $fields + * @param $node + * @return unknown_type */ -function _exif_read_exif($file) { - _exif_bootstrap(); - $data = array(); - if (!file_exists($file)) { - watchdog('exif', t('Image %file not found.', array('%file' => $file)), WATCHDOG_WARNING); - return $exif; - } - if (exif_imagetype($file) != IMAGETYPE_JPEG) { - return $data; +function _exif_get_image_path($fields, &$node) { + if ($node->type == 'image') { + return $node->images[IMAGE_ORIGINAL]; } - $jpeg = new PelJpeg($file); - $exif = $jpeg->getExif(); - if (!$exif) { - return $data; - } - $tiff = $exif->getTiff(); - if (!$tiff) { - return $data; - } - $ifd0 = $tiff->getIfd(); - if (!$ifd0) { - return $data; - } - $ifds[PelIfd::IFD0] = $ifd0; - if ($exif = $ifd0->getSubIfd(PelIfd::EXIF)) { - $ifds[PelIfd::EXIF] = $exif; - } - if ($gps = $ifd0->getSubIfd(PelIfd::GPS)) { - $ifds[PelIfd::GPS] = $gps; - } - $tags = exif_get_enabled_tags(); - $data = array(); - foreach ($tags as $tag) { - $entry = $ifds[$tag->ifd]->getEntry($tag->tag); - if ($entry) { - $row = array(); - switch($tag->tag) { - case PelTag::DATE_TIME: - case PelTag::DATE_TIME_ORIGINAL: - case PelTag::DATE_TIME_DIGITIZED: - // Return a unixtimestamp. Theme will handle date formating. - $data[$tag->ifd][$tag->tag] = $entry->getValue(); - break; - - default: - $data[$tag->ifd][$tag->tag] = utf8_encode($entry->getText()); - } + + foreach ($fields as $field) { + if ($field['type'] == 'filefield') { + $tmp = $node->$field['field_name']; + return $tmp[0]['filepath']; } } - return $data; + return NULL; } + /** - * Return an array containing only the tags that were enabled. + * Helper function to reformat fields where required. + * + * Some values (lat/lon) break down into structures, not strings. */ -function exif_get_enabled_tags() { - static $tags = array(); +function _exif_reformat($data) { + $date_array = array('datetimeoriginal', 'datetime', 'datetimedigitized'); + + // Make the key lowercase as CCK field names must be + $data = array_change_key_case($data, CASE_LOWER); - if (!count($tags)) { - $result = db_query('SELECT * FROM {exif_tags} WHERE status = 1'); - while ($tag = db_fetch_object($result)) { - $tags[] = $tag; + foreach ($data as $key => &$value) { + if (is_array($value)) { + $value = array_change_key_case($value, CASE_LOWER); } - if (!count($tags)) { - // Table is empty, get some defaults - $tags = exif_get_default_settings(); - foreach ($tags as $key => $tag) { - if (!$tag->status) { - unset($tags[$key]); - } - } + + // Check for individual keys + switch ($key) { + case 'gpslatitude': + $value = _exif_DMS2D($value, $data['gpslatituderef']); + break; + + case 'gpslongitude': + $value = _exif_DMS2D($value, $data['gpslongituderef']); + break; + + case 'gps_gpslatitude': + $value = _exif_DMS2D($value, $data['gps_gpslatituderef']); + break; + + case 'gps_gpslongitude': + $value = _exif_DMS2D($value, $data['gps_gpslongituderef']); + break; + } - usort($tags, '_exif_compare_tags'); } - - return $tags; + return $data; } /** - * Return an array with all the valid tags and their settings. + * Helper function to change GPS co-ords into decimals. */ -function exif_load_settings() { - $tags = exif_get_default_settings(); +function _exif_DMS2D($value, $ref) { + $parts = split('/', $value[0]); + $dec = (float) ((float) $parts[0] / (float) $parts[1]); - $result = db_query('SELECT * FROM {exif_tags}'); - while ($tag = db_fetch_object($result)) { - $tags["{$tag->ifd}_{$tag->tag}"] = $tag; - } - usort($tags, '_exif_compare_tags'); + $parts = split('/', $value[1]); + $dec += (float) (((float) $parts[0] / (float) $parts[1]) / 60); - return $tags; -} + $parts = split('/', $value[2]); + $dec += (float) (((float) $parts[0] / (float) $parts[1]) / 3600); -function exif_save_settings($values) { - db_lock_table('exif_tags'); - foreach ($values as $tag) { - if (!is_array($tag) || !isset($tag['ifd'])) { - continue; // Save only appropriate form values - } - db_query('DELETE FROM {exif_tags} WHERE ifd = %d AND tag = %d', $tag['ifd'], $tag['tag']); - db_query('INSERT INTO {exif_tags} (ifd, tag, status, weight) VALUES (%d, %d, %d, %d)', $tag['ifd'], $tag['tag'], $tag['status'], $tag['weight']); - } - db_unlock_tables(); -} - -function exif_reset_settings() { - db_query('DELETE FROM {exif_tags}'); + if ($ref == 'S' || $ref == 'W') $dec *= -1; + return $dec; } /** - * Return an array with all the valid tags, with some useful default settings. + * Helper function to get the exif class + * @return Exif */ -function exif_get_default_settings() { - $tags = exif_get_valid_tags(); - $tags[PelIfd::EXIF .'_'. PelTag::DATE_TIME_ORIGINAL]->status = 1; - $tags[PelIfd::EXIF .'_'. PelTag::DATE_TIME_ORIGINAL]->weight = -10; - $tags[PelIfd::IFD0 .'_'. PelTag::MODEL]->status = 1; - $tags[PelIfd::IFD0 .'_'. PelTag::MODEL]->weight = -8; - $tags[PelIfd::EXIF .'_'. PelTag::FOCAL_LENGTH]->status = 1; - $tags[PelIfd::EXIF .'_'. PelTag::FOCAL_LENGTH]->weight = -6; - $tags[PelIfd::EXIF .'_'. PelTag::APERTURE_VALUE]->status = 1; - $tags[PelIfd::EXIF .'_'. PelTag::APERTURE_VALUE]->weight = -4; - $tags[PelIfd::EXIF .'_'. PelTag::EXPOSURE_TIME]->status = 1; - $tags[PelIfd::EXIF .'_'. PelTag::EXPOSURE_TIME]->weight = -2; - $tags[PelIfd::EXIF .'_'. PelTag::ISO_SPEED_RATINGS]->status = 1; - $tags[PelIfd::EXIF .'_'. PelTag::ISO_SPEED_RATINGS]->weight = 0; - return $tags; +function _exif_get_class() { + include_once drupal_get_path('module', 'exif') .'/exif.class.php'; + $exif = Exif::getInstance(); + return $exif; } /** - * Helper function to return all the valid tags (well, at least those this module cares about). - * - * For convenience, each tag has a key in the form: "ifd_tag", where ifd and tag - * are standard Exif ids. Those ids can be found in PelIfd.php and PelTag.php. + * Implementation of hook_hoken_list + * @param array $type */ -function exif_get_valid_tags() { - $valid_tags = array(); - $valid_tags = array_merge($valid_tags, _exif_get_valid_ifd_tags(PelIfd::IFD0, new PelIfd(PelIfd::IFD0))); - $valid_tags = array_merge($valid_tags, _exif_get_valid_ifd_tags(PelIfd::EXIF, new PelIfd(PelIfd::EXIF))); - $valid_tags = array_merge($valid_tags, _exif_get_valid_ifd_tags(PelIfd::GPS, new PelIfd(PelIfd::GPS))); - return $valid_tags; -} - -function _exif_get_valid_ifd_tags($ifd_id, $ifd) { - $tags = array(); - $pel_tags = $ifd->getValidTags(); - foreach ($pel_tags as $pel_tag) { - $tag = new StdClass(); - $tag->ifd = $ifd_id; - $tag->tag = $pel_tag; - $tags["{$tag->ifd}_{$tag->tag}"] = $tag; - } - return $tags; -} - -function _exif_compare_tags($a, $b) { - $status = $b->status - $a->status; - // Separate enabled from disabled. - if ($status) { - return $status; - } - // Enabled tags - if ($a->status) { - $weight = $a->weight - $b->weight; - if ($weight) { - return $weight; +function fast_gallery_token_list($type = 'node') { + if ($type == 'node') { + $exif = _exif_get_class(); + $ar_iptc = $exif->getHumanReadableIPTCkey(); + foreach ($ar_iptc as $iptc) { + $tokens['iptc']['iptc_' . $iptc] = 'IPTC Field: ' . $iptc; } - return $a->ifd - $b->ifd; - } - // Disabled tags - else { - return $a->ifd - $b->ifd; + return $tokens; } } -function theme_exif_table($node) { - _exif_bootstrap(); - // Retrieve the desired tag values from the file - $tags = exif_get_enabled_tags(); - $rows = array(); - $data = $node->exif_data; - - foreach ($tags as $tag) { - if (!empty($data[$tag->ifd][$tag->tag])) { - $row = array(); - $row[] = array('data' => check_plain(utf8_encode(PelTag::getTitle($tag->ifd, $tag->tag))), 'class' => 'exif-title'); - $val = $data[$tag->ifd][$tag->tag]; - switch($tag->tag) { - case PelTag::DATE_TIME: - case PelTag::DATE_TIME_ORIGINAL: - case PelTag::DATE_TIME_DIGITIZED: - // Use Drupal's date formatting instead of Pel's - $row[] = array('data' => format_date($val, 'medium', '', 0), 'class' => 'exif-value'); - break; - - default: - $row[] = array('data' => check_plain($val), 'class' => 'exif-value'); - } - $rows[] = $row; +/** + * implementation of hook_token_values + * @param unknown_type $type + * @param unknown_type $object + * @param unknown_type $options + */ +function fast_gallery_token_values($type, $object = NULL, $options = array()) { + if ($type == 'node') { + $node = $object; + $exif = _exif_get_class(); + $ar_iptc = $exif->getHumanReadableIPTCkey(); + + $info = content_types($node->type); + $fields = $info['fields']; + //get the path to the image + $image_path = _exif_get_image_path($fields, $node); + + //dsm("start reading"); + $iptc_values = $exif->readIPTCTags($image_path, array(), array('style' => 'fullSmall')); + //dsm($iptc_values); + + // TODO: needs to be finished + foreach ($iptc_values as $key => $iptc) { + $tokens['iptc_' . $key] = 'IPTC Field: ' . utf8_encode($iptc); } + //dsm($tokens); + return $tokens; } - - if (empty($rows)) { - return ''; - } - $header = array(array('data' => t('Image information'), 'colspan' => 2)); - return theme('table', $header, $rows, array('class' => 'exif')); -} - -function theme_exif_admin_settings_form($form) { - $header = array(t('Tag'), t('Weight'), t('Type')); - $rows = array(); - foreach (element_children($form['tags']) as $key) { - $row = array(); - $row[] = drupal_render($form['tags'][$key]['status']); - $row[] = drupal_render($form['tags'][$key]['weight']); - $row[] = drupal_render($form['tags'][$key]['type']); - $rows[] = $row; - } - $output .= theme('table', $header, $rows, array('class' => 'admin-settings-exif')); - $output .= drupal_render($form); - return $output; -} - -function _exif_bootstrap() { - include_once drupal_get_path('module', 'exif') .'/pel/PelJpeg.php'; -} - +}
\ No newline at end of file diff --git a/exif_location/CVS/Entries b/exif_location/CVS/Entries index 61c0fea..cb74d2f 100644 --- a/exif_location/CVS/Entries +++ b/exif_location/CVS/Entries @@ -1,4 +1,4 @@ -/exif_location.info/1.1/Thu Oct 7 21:44:03 2010// -/exif_location.install/1.1/Thu Oct 7 21:44:03 2010// -/exif_location.module/1.1/Thu Oct 7 21:44:03 2010// +/exif_location.info/1.1.2.2/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/exif_location.install/1.1.2.4/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 +/exif_location.module/1.1.2.4/Fri Oct 8 18:33:46 2010//TDRUPAL-6--1 D diff --git a/exif_location/exif_location.info b/exif_location/exif_location.info index 1eaa37a..3702dbb 100644 --- a/exif_location/exif_location.info +++ b/exif_location/exif_location.info @@ -1,5 +1,6 @@ name = EXIF Location description = "Sets a node location based on EXIF info in image." core = 6.x +version = "6.x-0.1" dependencies[] = exif diff --git a/exif_location/exif_location.install b/exif_location/exif_location.install index a1fb871..3ccb94f 100644 --- a/exif_location/exif_location.install +++ b/exif_location/exif_location.install @@ -1,12 +1,21 @@ <?php +// $Id: exif_location.install,v 1.1.2.4 2010/10/08 17:57:43 rapsli Exp $ + +/** + * @file This is the exif location install part + */ /* - * Hook sets weight must be less than exif module (zero by default). + * Hook sets weight must be higher than exif module (-10), but lower than location (0 by default). */ function exif_location_install() { $ret = array(); - $ret[] = db_query("UPDATE {system} SET weight = 2 WHERE name = 'exif_location'"); + $ret[] = db_query("UPDATE {system} SET weight = -2 WHERE name = 'exif_location'"); return $ret; } -?> +function exif_location_update_6001() { + $return = array(); + $return[] = update_sql("UPDATE {system} SET weight = -2 WHERE name = 'exif_location'"); + return $return; +}
\ No newline at end of file diff --git a/exif_location/exif_location.module b/exif_location/exif_location.module index f0d5093..b353184 100644 --- a/exif_location/exif_location.module +++ b/exif_location/exif_location.module @@ -1,12 +1,21 @@ <?php +// $Id: exif_location.module,v 1.1.2.4 2010/10/08 17:57:43 rapsli Exp $ -/* - * Hook nodeapi. +/** + * implementation of hook_nodeapi + * @param stdClass $node + * @param string $op + * @param string $a3 + * @param string $a4 */ - function exif_location_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { - switch($op) { - case 'presave': + switch ($op) { + case 'update': + //we are only going to update if we have said so + if (!variable_get('exif_update', TRUE)) { + break; + } + case 'insert': $lid = 0; /* Go get the location from EXIF fields */ if (is_array($node->field_gps_gpslongitude) && @@ -20,7 +29,8 @@ function exif_location_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { */ $node->locations[$lid]['longitude'] = $longitude; $node->locations[$lid]['latitude'] = $latitude; - } else { + } + else { $node->locations[$lid] = array( 'longitude' => $longitude, @@ -40,10 +50,12 @@ function exif_location_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { } } -/* - * Hook form_alter. +/** + * Implementation of hook_form_alter + * @param array $form + * @param array $form_state + * @param array $form_id */ - function exif_location_form_alter(&$form, $form_state, $form_id) { /* Comment out the return below to enable this */ return; @@ -54,5 +66,3 @@ function exif_location_form_alter(&$form, $form_state, $form_id) { $form['locations']['#access'] = FALSE; } } - -?> |