'listenUp_file_receive', 'description' => 'listenUp_file_receive', 'page callback' => 'AudioRecordingField_file_receive', 'type' => MENU_CALLBACK, 'access callback' => true, ); return $items; } /* * listenUp recorder applet callback. This is what happens when * 'send' is pressed in the applet */ function AudioRecordingField_file_receive(){ header("Cache-control: private"); header("Content-Type: text/plain"); $field_id = $_GET['field_id']; //TODO save duration in field $duration = strip_tags($_POST['duration']); $tmp_name = $_FILES['userfile']['tmp_name']; $upload_dir = file_directory_path(); $c = (file_check_directory($upload_dir,0))? 1:0; print("file folder writeable? $c"); // TODO: get file extension from real file type $new_name = file_create_filename(time().'.wav'); $new_path = $upload_dir.$new_name; if($_FILES['usefiles']['error']>0){ print("ERROR - error code: ".$_FILES['userfile']['error']."\n"); $fid = "NULL"; }else{ $_FILES['files'] = $_FILES['userfile']; $_FILES['files']['name'] = $new_name; foreach($_FILES['files'] as $key=>$value){ $_FILES['files'][$key] = array(0 => $value); } var_export($_FILES); if(!$file = file_save_upload(0,NULL,$upload_dir)){ print("ERROR - file_save_upload failed\n"); $fid = "NULL"; } else{ var_export($file); $fid = $file->fid; //convert uploaded wav files to mp3 - does'nt work yet /* $ffmpeg_format = 'libmp3lame'; $ffmpeg_extension = 'mp3'; $ffmpeg_frequency = '44100'; $ffmpeg_bitrate = '64k'; $ffmpeg_channels = '2'; $ffmpeg_mime = 'audio/mpeg'; $ffmpeg_path = $field['widget']['ffmpeg_path'] ? $field['widget']['ffmpeg_path'] : '/usr/bin/ffmpeg'; $ffmpeg_arguments = '-y -i ' . $file->filepath . ' ' . '-f ' . $ffmpeg_extension . ' ' . '-acodec ' . $ffmpeg_format . ' ' . '-ar ' . $ffmpeg_frequency . ' ' . '-ab ' . $ffmpeg_bitrate . ' ' . '-ac ' . $ffmpeg_channels . ' ' . $file->filepath.".mp3"; var_export($ffmpeg_arguments); // Convert the file to one with the fresh file name. $ffmpeg_results = shell_exec("ffmpeg" . " " . $ffmpeg_arguments); */ print("SUCCESS - File havs been uploaded,\n"); } } $js = "document.getElementById('$field_id').value='$fid';"; print("CALLJS $js"); } /** * Implementation of hook_theme(). */ function AudioRecordingField_theme() { return array( 'AudioRecordingField_listenUp' => array( 'arguments' => array('element' => NULL),), 'AudioRecordingField_formatter_listenup_player' => array('arguments' => array('element' => NULL)), 'AudioRecordingField_formatter_link_to_file' => array('arguments' => array('element' => NULL)), ); } /** * Declare information about a field type. * * @return * An array keyed by field type name. Each element of the array is an associative * array with these keys and values: * - "label": The human-readable label for the field type. */ function AudioRecordingField_field_info() { return array( 'AudioRecordingField' => array('label' => 'Audio recorder'), ); } /** * Implementation of hook_field_settings(). */ function AudioRecordingField_field_settings($op, $field) { switch ($op) { case 'database columns': // value is audio file fid $columns['value'] = array( 'type' => 'int', 'length' => 12, 'sortable' => FALSE, 'not null' => FALSE); return $columns; } } /** * Implementation of hook_field(). * */ function AudioRecordingField_field($op, &$node, $field, &$items, $teaser, $page) { switch ($op) { case 'presave': foreach($items as $key=>$value){ if(!empty($value['value'])){ $file = AudioRecordingField_get_file_object($value['value']); // since the applet, and the file receive scripts saved the // new recording for an anonymous user, we need to // update the real uploading user here. if(file_set_status($file,1)){ global $user; $file->uid = $user->uid; //update user columb in file table drupal_write_record('files', &$file, array('fid')); } } } break; case 'load': // load file data to field $field_name = $field['field_name']; foreach($items as $key=>$value){ $n[$field_name][$key]['value'] = $value['value']; $n[$field_name][$key]['file'] = AudioRecordingField_get_file_object($value['value']); } return $n; break; } } /** * Implementation of hook_content_is_empty(). * * * This function tells the content module whether or not to consider * the $item to be empty. This is used by the content module * to remove empty, non-required values before saving them. */ function AudioRecordingField_content_is_empty($item, $field) { if (empty($item['value'])) { return TRUE; } return FALSE; } /** * Implementation of hook_widget_info(). */ function AudioRecordingField_widget_info() { return array( 'AudioRecordingField_listenUp' => array( 'label' => t('ListenUp audio recorder'), 'field types' => array('AudioRecordingField'), ), ); } /** * Implementation of hook_widget_settings(). * * Handle the parameters for a widget. */ function AudioRecordingField_widget_settings($op, $widget) { switch ($op) { case 'form': $form = array(); $form['recorder'] = array( '#type' => 'fieldset', '#title' => t('ListenUp recorder settings'), ); $form['recorder']['recorder_width'] = array( '#type' => 'textfield', '#title' => t('recorder width'), '#default_value' => isset($widget['recorder_width']) ? $widget['recorder_width']:'', '#size' => 8, '#description' => t('ListenUp recorder applet width'), '#required' => true, ); $form['recorder']['recorder_height'] = array( '#type' => 'textfield', '#title' => t('recorder height'), '#default_value' => isset($widget['recorder_height']) ? $widget['recorder_height']:'', '#size' => 8, '#description' => t('ListenUp recorder applet width'), '#required' => true, ); $form['recorder']['recorder_params'] = array( '#type' => 'textarea', '#title' => t('recorder params'), '#default_value' => isset($widget['recorder_params']) ? $widget['recorder_params']:'', '#size' => 8, '#description' => t('
ListenUp recorder applet parameters. Add list of params'. ' in the form parameter_name|value,
'. '
full list of optional parameter can be found '.l('here','http://www.javasonics.com/listenup/docs/player_parameters.html'). ' and '.l('here','http://www.javasonics.com/listenup/docs/recorder_parameters.html').'.
'), ); $form['player'] = array( '#type' => 'fieldset', '#title' => t('ListenUp player settings'), ); $form['player']['player_width'] = array( '#type' => 'textfield', '#title' => t('player width'), '#default_value' => isset($widget['player_width']) ? $widget['player_width']:'', '#size' => 8, '#description' => t('ListenUp player applet width'), '#required' => true, ); $form['player']['player_height'] = array( '#type' => 'textfield', '#title' => t('player height'), '#default_value' => isset($widget['player_height']) ? $widget['player_height']:'', '#size' => 8, '#description' => t('ListenUp player applet width'), '#required' => true, ); $form['player']['player_params'] = array( '#type' => 'textarea', '#title' => t('player params'), '#default_value' => isset($widget['player_params']) ? $widget['player_params']:'', '#size' => 8, '#description' => t('
ListenUp player applet parameters. Add list of params'. ' in the form parameter_name|value,
'. '
full list of optional parameter can be found '.l('here','http://www.javasonics.com/listenup/docs/player_parameters.html'). '.
'), ); return $form; break; case 'validate': if(!is_numeric($widget['recorder_height']) || !is_numeric($widget['recorder_width']) || $widget['recorder_height']<=0 || $widget['recorder_width']<=0 || !is_numeric($widget['player_height']) || !is_numeric($widget['player_width']) || $widget['player_height']<=0 || $widget['player_width']<=0) form_set_error('recorder_dim',t('ListenUp applets height and widths setting must be numeric integers')); $m = array(); preg_match('/((.+\|.+)\n)*(.+\|.+)*/',$widget['recorder_params'],$m); if(strlen($m[0])!=strlen($widget['recorder_params'])) form_set_error('recorder_params',t('illegal parameters structure in !name',array('!name' => 'recorder params'))); $m = array(); preg_match('/((.+\|.+)\n)*(.+\|.+)*/',$widget['player_params'],$m); if(strlen($m[0])!=strlen($widget['player_params'])) form_set_error('player_params',t('illegal parameters structure in !name',array('!name' => 'player params'))); case 'save': $save = array('recorder_width','recorder_height','player_width','player_height','recorder_params','player_params'); return $save; } } /** * Implementation of hook_widget(). */ function AudioRecordingField_widget(&$form, &$form_state, $field, $items, $delta = 0) { $element = array( '#type' => $field['widget']['type'], '#default_value' => isset($items[$delta]) ? $items[$delta] : '', ); return $element; } /** * Implementation of FAPI hook_elements(). * * Any FAPI callbacks needed for individual widgets can be declared here, * and the element will be passed to those callbacks for processing. * * Drupal will automatically theme the element using a theme with * the same name as the hook_elements key. * */ function AudioRecordingField_elements() { return array( 'AudioRecordingField_listenUp' => array( '#input' => TRUE, '#process' => array('AudioRecordingField_listenUp_process'), ), ); } /** * Process an individual element. * * Build the form element. When creating a form using FAPI #process, * note that $element['#value'] is already set. * * The $fields array is in $form['#field_info'][$element['#field_name']]. */ function AudioRecordingField_listenUp_process($element, $edit, $form_state, $form) { $field = $form['#field_info'][$element['#field_name']]; $field_key = $element['#columns'][0]; $element['applet'] = array( '#required' => $element['#required'], '#value' => AudioRecordingField_recorder_applet_marup($element,$field['widget']) ); // this would be the hidden field the applet would insert the newly // uploaded file fid to. $element[$field_key] = array( '#type' => 'hidden', '#title' => t($field['widget']['label']), '#required' => $element['#required'], '#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : "", ); return $element; } /** * Implementation of hook_field_formatter_info(). */ function AudioRecordingField_field_formatter_info() { return array( 'listenup_player' => array( 'label' => t('ListenUp player'), 'field types' => array('AudioRecordingField'), 'multiple values' => CONTENT_HANDLE_CORE, ), 'link_to_file' => array( 'label' => t('Link to file'), 'field types' => array('AudioRecordingField'), 'multiple values' => CONTENT_HANDLE_CORE, ), ); } /* * listenUp player formatter theme */ function theme_AudioRecordingField_formatter_listenup_player($element){ $field = content_fields($element['#field_name']); return AudioRecordingField_player_applet_markup($element,$field['widget']); } /* * link to file formatter theme */ function theme_AudioRecordingField_formatter_link_to_file($element){ $file = $element['#item']['file']; $output = ""; if(!empty($file)){ $url = file_create_url($file->filename); $output = l($file->name,$url,array('attributes' => array('class' => 'AudioRecordingField_item'))); } return $output; } /* * player applet html markup */ function AudioRecordingField_player_applet_markup($element,$widget){ $value = $element['#item']['value']; $file = $element['#item']['file']; $url = file_create_url($file->filename); $width = isset($widget['player_width'])? $widget['player_width']:300; $height = isset($widget['player_height'])? $widget['player_height']:100 ; $params = $widget['player_params']; $params_str = AudioRecordingField_build_params($params); $output = ""; if(!empty($value)){ $output = ''. ' '.$params_str. ' '; } return $output; } /* * listenUp recorder applet */ function AudioRecordingField_recorder_applet_marup($element,$widget){ $field_id = $element['#id']."-value"; $url = url('listenUp_file_receive',array('query'=>array('field_id'=>$field_id))); $width = isset($widget['player_width'])?$widget['recorder_width']:300; $height = isset($widget['player_height'])? $widget['recorder_height']:100; $params = $widget['recorder_params']; $params_str = AudioRecordingField_build_params($params); $sampleURL = ""; if(!empty($element['#value']['value'])){ $file = $element['#value']['file']; $surl = file_create_url($file->filename); $sampleURL = ""; } $output = ''. $sampleURL. ' '. ' '.$params_str. ' '; return $output; } /** * FAPI theme for an individual elements. * * $element['#field_name'] contains the field name * $element['#delta] is the position of this element in the group */ function theme_AudioRecordingField_listenUp($element) { return $element['#children']; } /* * retrives a file object from the db. */ function AudioRecordingField_get_file_object($fid){ $sql = "SELECT * FROM {files} f WHERE f.fid='".$fid."'"; $res = db_query($sql); return db_fetch_object($res); } /* * parse a "name|value" string to a string of applet parameters tags */ function AudioRecordingField_build_params($params){ $params_arr = array(); $params_str = ""; if(preg_match_all('/[\w\d_]+\|[\w\d_]+/',$params,$params_arr)){ foreach($params_arr[0] as $val){ $pair = explode('|',$val); if(count($pair) ==2) $params_str.= ''; } } return $params_str; }