? .DS_Store ? patch.patch ? filefield_meta/.DS_Store ? filefield_meta/includes/.DS_Store Index: filefield_meta/filefield_meta.info =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_meta/filefield_meta.info,v retrieving revision 1.6 diff -u -p -r1.6 filefield_meta.info --- filefield_meta/filefield_meta.info 1 Apr 2009 08:57:49 -0000 1.6 +++ filefield_meta/filefield_meta.info 5 Jul 2009 12:04:57 -0000 @@ -6,3 +6,10 @@ dependencies[] = getid3 package = CCK core = 6.x php = 5.0 + +; Information added by drupal.org packaging script on 2009-06-07 +version = "6.x-3.x-dev" +core = "6.x" +project = "filefield" +datestamp = "1244333315" + Index: filefield_meta/filefield_meta.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_meta/filefield_meta.install,v retrieving revision 1.8 diff -u -p -r1.8 filefield_meta.install --- filefield_meta/filefield_meta.install 22 May 2009 21:14:52 -0000 1.8 +++ filefield_meta/filefield_meta.install 5 Jul 2009 12:05:05 -0000 @@ -87,7 +87,42 @@ function filefield_meta_schema() { ), 'primary key' => array('fid'), ); - + $schema['filefield_meta_audio'] = array( + 'description' => t('Extended data about audio files.'), + 'fields' => array( + 'fid' => array( + 'description' => 'The file id.', + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'default' => 0, + ), + 'tag' => array( + 'type' => 'varchar', + 'length' => 45, + 'not null' => TRUE, + 'default' => '', + ), + 'value' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + 'clean' => array( + 'type' => 'varchar', + 'length' => 255, + 'not null' => TRUE, + 'default' => '', + ), + ), + //'primary key' => array('vid', 'tag', 'value'), + 'primary key' => array('fid', 'tag', 'value'), + 'indexes' => array( + 'filefield_meta_audio' => array('clean'), + ), + ); + return $schema; } @@ -129,4 +164,4 @@ function filefield_meta_update_1() { 'default' => '', )); return $ret; -} \ No newline at end of file +} Index: filefield_meta/filefield_meta.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_meta/filefield_meta.module,v retrieving revision 1.14 diff -u -p -r1.14 filefield_meta.module --- filefield_meta/filefield_meta.module 20 Apr 2009 22:29:24 -0000 1.14 +++ filefield_meta/filefield_meta.module 5 Jul 2009 12:05:08 -0000 @@ -30,6 +30,11 @@ function filefield_meta_cron() { while ($file = db_fetch_object($result)) { db_query('DELETE FROM {filefield_meta} WHERE fid = %d', $file->fid); } + $result = db_query('SELECT fm.fid FROM {filefield_meta_audio} fm LEFT JOIN {files} f ON fm.fid=f.fid WHERE f.fid IS NULL'); + while ($file = db_fetch_object($result)) { + db_query('DELETE FROM {filefield_meta_audio} WHERE fid = %d', $file->fid); + } + } /** @@ -50,6 +55,17 @@ function filefield_meta_file_insert(&$fi filefield_meta($file); $record = array_merge(array('fid' => $file->fid), $file->data); drupal_write_record('filefield_meta', $record); + // Remove any existing metadata. + db_query("DELETE FROM {filefield_meta_audio} WHERE fid=%d", $file->fid); + + // Save the new tags. + //$allowed_tags = filefield_meta_get_tags_allowed(); + foreach ($file->data['tags'] as $tag => $value) { + //if (in_array($tag, $allowed_tags) && $value) { + $metadata = array('fid' => $file->fid, 'tag' => $tag, 'value' => $value, 'clean' => filefield_meta_clean_tag($value)); + drupal_write_record('filefield_meta_audio', $metadata); + //} + } } } @@ -68,6 +84,7 @@ function filefield_meta_file_update(&$fi */ function filefield_meta_file_delete($file) { db_query('DELETE FROM {filefield_meta} WHERE fid = %d', $file->fid); + db_query('DELETE FROM {filefield_meta_audio} WHERE fid = %d', $file->fid); } /** @@ -103,8 +120,32 @@ function filefield_meta(&$file) { $file->data['audio_bitrate'] = isset($info['audio']['bitrate']) ? $info['audio']['bitrate'] : NULL; //e.g. 64000 $file->data['audio_bitrate_mode'] = isset($info['audio']['bitrate_mode']) ? $info['audio']['bitrate_mode'] : NULL; //e.g. cbr } + + // Read the id3v1 and then id3v2 + foreach (array('id3v1', 'id3v2') as $format ) { + if (isset($info['tags'][$format])) { + foreach ( (array) $info['tags'][$format] as $key => $value ) { + $ret['tags'][$key] = trim(array_pop($value)) ; + } + } + } + + $file->data['tags'] = $ret['tags'] ; + // warnings + if (!empty($info['warning']) && variable_get('audio_getid3_show_warnings', FALSE)) { + $warning = t('While reading the ID3 tags, the following warnings were encountered:'); + $warning .= ''; + drupal_set_message($warning, 'error'); + } + // report errors and then exit + if (isset($info['error'])) { + $error = t("The following errors where encountered while reading the file's ID3 tags: "); + $error .= ''; + form_set_error('', $error); + } }; + /** * Convert the float duration into a pretty string. * @@ -134,3 +175,83 @@ function theme_filefield_meta_samplerate function theme_filefield_meta_bitrate($bitrate) { return sprintf("%d Kbps", $bitrate/1000); } +/** + * Get an array of the allowed tags. + * + * @return + * Array of allowed tags. + */ +//function filefield_meta_get_tags_allowed() { +// return array_keys(filefield_meta_get_tag_settings()); +//} +// +///** +// * Get an array of the tags and their settings. +// * +// * @return +// * Array of allowed tags. +// */ +//function filefield_meta_get_tag_settings() { +// $defaults = array( +// 'artist' => array('autocomplete' => 1, 'required' => 1, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 1, 'weight' => -2), +// 'title' => array('autocomplete' => 1, 'required' => 1, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 1, 'weight' => -2), +// 'album' => array('autocomplete' => 1, 'required' => 0, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 1, 'weight' => -1), +// 'track' => array('autocomplete' => 0, 'required' => 0, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 0, 'weight' => -1), +// 'genre' => array('autocomplete' => 1, 'required' => 0, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 1, 'weight' => 0), +// 'year' => array('autocomplete' => 0, 'required' => 0, 'hidden' => 0, +// 'writetofile' => 1, 'browsable' => 1, 'weight' => 1), +// ); +// return variable_get('audio_tag_settings', $defaults); +//} + +function filefield_meta_get_tag() { + $defaults = array( + 'artist' => 1, + 'title' => 1, + 'album' => 1, + 'track' => 1, + 'genre' => 1, + 'year' => 1, + ); + return $defaults ; +} + +/** + * Take a tag and force it to be a-z 0-9 _ - + * + * @param $string + * ID3 tag value + * @return + * cleaned up tag value for URL or database + */ +function filefield_meta_clean_tag($string) { + + if (module_exists('transliteration')) { + $transliterated = transliteration_get($string); + return $transliterated ; + } + else + { + // If we've got characters besides 0-9 A-Z a-z hyphen and underscore, replace + // them. + if (preg_match('/[^-\w]/', $string)) { + // Remove accents... + $string = strtr($string, '������������������������������������������������������������', 'SZszYAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy'); + // ...convert to equivalent chars... + $string = strtr($string, array('�' => 'TH', '�' => 'th', '�' => 'DH', '�' => 'dh', '�' => 'ss', '�' => 'OE', '�' => 'oe', '�' => 'AE', '�' => 'ae', '�' => 'u')); + // ... and remove anything else that's not alphanumeric and replace it with an underscore. + $string = preg_replace('/[^-\w]+/', '_', $string); + } + // Remove leading and trailing underscores. + $string = trim($string, '_'); + // Finally, make it to lower case. + return strtolower($string); + } +} + + Index: filefield_meta/includes/filefield_meta.views.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/filefield/filefield_meta/includes/filefield_meta.views.inc,v retrieving revision 1.1 diff -u -p -r1.1 filefield_meta.views.inc --- filefield_meta/includes/filefield_meta.views.inc 11 Mar 2009 06:02:24 -0000 1.1 +++ filefield_meta/includes/filefield_meta.views.inc 5 Jul 2009 12:05:09 -0000 @@ -162,6 +162,43 @@ function filefield_meta_views_data() { ), ); + + // Audio metadata id3 tags + // + + foreach (filefield_meta_get_tag() as $tag) { + $data['filefield_meta_audio_'. $tag]['table']['group'] = t('File id3 tags'); + + // For other base tables, explain how we join + $data['filefield_meta_audio_'. $tag]['table']['join'] = array( + 'files' => array( + 'left_field' => 'fid', + 'table' => 'filefield_meta_audio', + 'field' => 'fid', + 'extra' => array(array('field' => 'tag', 'value' => $tag, 'operator' => '=')) + ), + ); + + $data['filefield_meta_audio_'. $tag]['value'] = array( + 'title' => t('@tag', array('@tag' => drupal_ucfirst($tag))), + 'help' => t('The value of the @tag metadata field.', array('@tag' => $tag)), + 'field' => array( + 'handler' => 'views_handler_field_xss', + 'click sortable' => TRUE, + ), + 'sort' => array( + 'handler' => 'views_handler_sort', + ), + 'filter' => array( + 'handler' => 'views_handler_filter_string', + ), + 'argument' => array( + 'handler' => 'views_handler_argument_string', + ), + ); + } + + return $data; }