array( 'arguments' => array('duration' => NULL), ), 'filefield_meta_samplerate' => array( 'arguments' => array('samplerate' => NULL), ), 'filefield_meta_bitrate' => array( 'arguments' => array('bitrate' => NULL), ), ); } /** * Implementation of hook_cron(). */ function filefield_meta_cron() { $result = db_query('SELECT fm.fid FROM {filefield_meta} 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} WHERE fid = %d', $file->fid); } } /** * Implementation of hook_views_api(). */ function filefield_meta_views_api() { return array( 'api' => 2.0, 'path' => drupal_get_path('module', 'filefield_meta') . '/includes', ); } /** * Implementation of filefield's hook_file_insert(). */ function filefield_meta_file_insert(&$file) { if (!empty($file->fid)) { filefield_meta($file); $record = array_merge(array('fid' => $file->fid), $file->data); drupal_write_record('filefield_meta', $record); } } /** * Implementation of filefield's hook_file_update(). */ function filefield_meta_file_update(&$file) { if (!empty($file->fid)) { filefield_meta_file_delete($file); filefield_meta_file_insert($file); } } /** * Implementation of filefield's hook_file_delete(). */ function filefield_meta_file_delete($file) { db_query('DELETE FROM {filefield_meta} WHERE fid = %d', $file->fid); } /** * Adds the width, height and duration to the file's data property. */ function filefield_meta(&$file) { $info = getid3_analyze($file->filepath); $file->data['width'] = $file->data['height'] = $file->data['duration'] = 0; if (isset($info['video']['resolution_x'])) { $file->data['width'] = $info['video']['resolution_x']; $file->data['height'] = $info['video']['resolution_y']; } elseif (isset($info['video']['streams'])) { foreach ($info['video']['streams'] as $stream) { $file->data['width'] = max($file->data['width'], $stream['resolution_x']); $file->data['height'] = max($file->data['height'], $stream['resolution_y']); } } if (isset($info['playtime_seconds'])) { $file->data['duration'] = $info['playtime_seconds']; } // initialize fields. $file->data['audio_format'] = $file->data['audio_channel_mode'] = $file->data['audio_bitrate_mode'] = ''; $file->data['audio_sample_rate'] = $file->data['audio_bitrate'] = 0; if (isset($info['audio'])) { $file->data['audio_format'] = $info['audio']['dataformat']; //e.g. mp3 $file->data['audio_sample_rate'] = $info['audio']['sample_rate']; //e.g. 44100 $file->data['audio_channel_mode'] = $info['audio']['channelmode']; // e.g. mono $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 } }; /** * Convert the float duration into a pretty string. * * @param $duration */ function theme_filefield_meta_duration($duration) { $seconds = round((($duration / 60) - floor($duration / 60)) * 60); $minutes = floor($duration / 60); if ($seconds >= 60) { $seconds -= 60; $minutes++; } return intval($minutes) . ':' . str_pad($seconds, 2, 0, STR_PAD_LEFT); } /** * Formats audio sample rate. */ function theme_filefield_meta_samplerate($samplerate) { return sprintf("%.1f kHz", $samplerate/1000); } /** * Formats audio bit rate. */ function theme_filefield_meta_bitrate($bitrate) { return sprintf("%d Kbps", $bitrate/1000); }