settings page.", array('!settings-page' => url('admin/settings/audio_import'))), 'error');
return $form;
}
$form['#dirpath'] = $dirpath;
$form['#node_type'] = 'audio';
// convert the extensions setting into a regex for file scanning
$extensions = variable_get('audio_allowed_extensions', 'mp3 wav ogg');
$extensions = preg_split('/[\s,]+/', $extensions, -1, PREG_SPLIT_NO_EMPTY);
$filemask = '.*(\.'. implode('|\.', $extensions) .')$';
$files = file_scan_directory($dirpath, $filemask);
ksort($files);
// When the form gets too large we end up running out of memory submitting it.
// To avoid this we use a pager and rather than setting up all the variables
// ourself we just send in a fake query and then select the desired part of
// the files array.
$page_size = variable_get('audio_import_page_size', 50);
pager_query('SELECT %d', $page_size, 0, 'SELECT %d', array(count($files)));
$files = array_slice($files, $GLOBALS['pager_page_array'][0] * $page_size, $page_size);
if ($files) {
if (module_exists('taxonomy')) {
// here's a little hack to get the taxonomy controls onto our form
$form['type'] = array('#type' => 'value', '#value' => $form['#node_type']);
$form['#node'] = new stdClass();
$form['#node']->type = $form['#node_type'];
taxonomy_form_alter($form, array(), $form['#node_type'] .'_node_form');
unset($form['type']);
unset($form['#node']);
}
$form['token_help'] = array(
'#title' => t('Token list'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#description' => t('This is a list of the tokens that can be used in the title of audio nodes.'),
'help' => array('#value' => theme('token_help', 'node')),
);
// Put the image files into an array for the checkboxes and gather
// additional information like dimensions and filesizes. Make sure that
// there's no 0th element, because a checkbox with a zero value is seen as
// unchecked and won't be imported.
$index = 0;
foreach ($files as $file) {
$index++;
$filelist[$index] = substr($file->filename, strlen($dirpath) + 1);
// Spit out the import form elements.
$form['files']['import'][$index] = array(
'#type' => 'checkbox',
'#title' => substr($file->filename, strlen($dirpath) + 1),
);
$form['files']['filesize'][$index] = array(
'#type' => 'item',
'#value' => format_size(filesize($file->filename)),
);
$form['files']['title'][$index] = array(
'#type' => 'textfield',
'#size' => 20,
'#default_value' => variable_get('audio_default_title_format', '[audio-tag-title-raw] by [audio-tag-artist-raw]'), // basename($file->name),
);
$form['files']['body'][$index] = array(
'#type' => 'textfield',
'#size' => 20,
);
// If there were problems don't let them import it
$problems = audio_import_validate_file($file);
if (count($problems)) {
$form['files']['import'][$index]['#type'] = 'item';
$form['files']['errors'][$index] = array(
'#type' => 'markup',
'#value' => ''. implode(' ', $problems) .'',
);
unset($form['files']['title'][$index]);
unset($form['files']['body'][$index]);
}
}
$form['pager'] = array('#value' => theme('pager', NULL, $page_size, 0));
// Put the titles into an array.
$form['files']['import']['#tree'] = TRUE;
$form['files']['title']['#tree'] = TRUE;
$form['files']['body']['#tree'] = TRUE;
// Store a copy of the list into a form value so we can compare it to what
// they submit and not have to worry about files being added or removed
// from the filesystem.
$form['file_list'] = array(
'#type' => 'value',
'#value' => $filelist,
);
$form['buttons']['submit'] = array(
'#type' => 'submit',
'#value' => t('Import'),
);
}
else {
$form['none_found'] = array(
'#type' => 'item',
'#value' => t('No files were found.'),
);
}
return $form;
}
function theme_audio_import_form($form) {
$output = drupal_render($form['token_help']);
if (!empty($form['file_list']['#value'])) {
$type = node_get_types('type', $form['#node_type']);
$header = array(theme('table_select_header_cell'), t('Name'), t('Size'), check_plain($type->title_label), check_plain($type->body_label));
$rows = array();
foreach (element_children($form['files']['import']) as $key) {
$filename = $form['files']['import'][$key]['#title'];
unset($form['files']['import'][$key]['#title']);
$row = array(
array('data' => drupal_render($form['files']['import'][$key])),
array('data' => $filename),
array('data' => drupal_render($form['files']['filesize'][$key])),
);
if (!isset($form['files']['errors'][$key])) {
$row[] = array('data' => drupal_render($form['files']['title'][$key]));
$row[] = array('data' => drupal_render($form['files']['body'][$key]));
}
else {
$row[] = array('colspan' => 2, 'data' => drupal_render($form['files']['errors'][$key]));
}
$rows[] = $row;
}
$output .= theme('table', $header, $rows);
}
return $output . drupal_render($form);
}
function audio_import_form_submit($form, &$form_state) {
$batch = array(
'title' => t('Importing audio'),
'progress_message' => 'Importing @current of @total.',
'operations' => array(),
'finished' => '_audio_import_batch_finished',
'file' => drupal_get_path('module', 'audio_import') .'/audio_import.pages.inc',
);
foreach (array_filter($form_state['values']['import']) as $index => $true) {
$origname = $form_state['values']['file_list'][$index];
if ($filepath = file_check_location($form['#dirpath'] .'/'. $origname, $form['#dirpath'])) {
$args = array(
'node_type' => $form['#node_type'],
'title' => isset($form_state['values']['title'][$index]) ? $form_state['values']['title'][$index] : NULL,
'body' => isset($form_state['values']['body'][$index]) ? $form_state['values']['body'][$index] : NULL,
'taxonomy' => isset($form_state['values']['taxonomy']) ? $form_state['values']['taxonomy'] : array(),
'filepath' => $filepath,
'origname' => $origname,
);
$batch['operations'][] = array('_audio_import_batch_op', array($args));
}
}
batch_set($batch);
}
function _audio_import_batch_op($args, &$context) {
// Create the node object.
if ($node = audio_api_insert($args['filepath'], $args['title'], $args['body'], array(), $args['taxonomy'])) {
// Remove the original image now that the import has completed.
file_delete($args['filepath']);
$context['results']['good'][] = t('Imported %origname as @node-title @status [edit]', array(
'%origname' => $args['origname'],
'!node-link' => url('node/'. $node->nid),
'@node-title' => $node->title,
'@status' => $node->status ? '' : t('(Unpublished)'),
'!edit-link' => url('node/'. $node->nid .'/edit'),
));
}
else {
watchdog('audio_import', 'There was an error that prevented %filename from being imported.', array('%filename' => $args['filepath']), WATCHDOG_ERROR);
$context['results']['bad'][] = t('Error importing %filename.', array('%filename' => $args['filepath']));
}
$context['finished'] = 1;
}
function _audio_import_batch_finished($success, $results, $operations) {
if (!$success) {
if (count($results['bad'])) {
drupal_set_message(t('There was a problem importing files: !bad-list', array('!bad-list' => theme('item_list', $results['bad']))), 'error');
}
else {
drupal_set_message(t('There was a problem importing the files.'), 'error');
}
}
if (count($results['good'])) {
drupal_set_message(t('Successfully imported: !good-list', array('!good-list' => theme('item_list', $results['good']))));
}
watchdog('audio_import', 'Completed audio import.');
}