# This patch file was generated by NetBeans IDE # This patch can be applied using context Tools: Apply Diff Patch action on respective folder. # It uses platform neutral UTF-8 encoding. # Above lines and this line are ignored by the patching process. Index: contributions/modules/ffmpeg_converter/ffmpeg_converter.admin.inc --- contributions/modules/ffmpeg_converter/ffmpeg_converter.admin.inc Base (1.7) +++ contributions/modules/ffmpeg_converter/ffmpeg_converter.admin.inc Locally Modified (Based On 1.7) @@ -8,410 +8,6 @@ */ /** - * Page callback: presets overview. - */ -function ffmpeg_converter_admin_presets() { - $help = t('Use this page to create and modify FFmpeg configuration presets which you can use to process media files automatically.'); - if (module_exists('filefield') && module_exists('rules')) { - $help .= ' ' . t('Your presets will appear in Rules using the "Queue file field for conversion" action, which lets you create rules that convert all media files that are uploaded to a certain file field automatically.', array('@rules', url('admin/rules/trigger'))); - } - else { - $help .= ' ' . t('If you install and enable the Rules and FileField modules, your presets will appear on rule configuration pages, which allows you to have all media files that are uploaded to a certain file field processed automatically.'); - } - $help .= ' ' . t('Other modules may also make this conversion functionality available in their own specific contexts.'); - $help = '
' . $help . '
'; - - // Load presets and present them in table form. - $presets = ffmpeg_converter_preset_load(); - $header = array(t('Description'), t('Name'), t('Source'), '', '', ''); - $rows = array(); - - foreach ($presets as $key => $preset) { - $row = array(); - $row[0] = check_plain($preset->description); - $row[1] = check_plain($preset->name); - - $row[3] = l(t('Edit'), - 'admin/settings/ffmpeg_converter/presets/edit/' . $preset->name, - array('attributes' => array('class' => 'link-edit'))); - switch ($preset->export_type) { - case 1: - // "Normal" type. - $row[2] = '' . t('Normal') . ''; - $row[4] = l(t('Delete'), - 'admin/settings/ffmpeg_converter/presets/delete/' . $preset->name, - array('attributes' => array('class' => 'link-delete'))); - break; - case 3: - // "Overridden" type. - $row[2] = '' . t('Overridden') . ''; - $row[4] = l(t('Revert'), - 'admin/settings/ffmpeg_converter/presets/delete/' . $preset->name, - array('attributes' => array('class' => 'link-delete'))); - break; - default: - $row[2] = '' . t('Default') . ''; - $row[4] = ''; - } - $row[5] = l(t('Export'), - 'admin/settings/ffmpeg_converter/presets/export/' . $preset->name, - array('attributes' => array('class' => 'link-export'))); - ksort($row); - - $rows[] = $row; - } - - $table = theme('table', $header, $rows); - - // Add links beneath the table. - $links = array( - 'link-add' => array( - 'title' => t('Add preset'), - 'href' => 'admin/settings/ffmpeg_converter/presets/add', - ), - 'link-import' => array( - 'title' => t('Import preset'), - 'href' => 'admin/settings/ffmpeg_converter/presets/import', - ), - ); - $links = theme('links', $links, array('class' => 'ffmpeg-converter-presets-links')); - - return $help . $table . $links; -} - - -/** - * Preset settings form. - * - * @param $name - * The preset's machine readable name. - */ -function ffmpeg_converter_admin_preset($form_state, $preset = NULL) { - // Check if we're supposed to edit a preset or add a new one. - if ($preset) { - drupal_set_title(t('#name settings', array('#name' => check_plain($preset->description)))); - } - else { - $preset = new stdClass; - $preset->name = ''; - $preset->description = ''; - $preset_options = ffmpeg_converter_default_options(); - $preset->ffmpeg_wrapper = $preset_options; - } - - $form = array(); - $form['intro'] = array(); - - $form['name'] = array( - '#type' => 'textfield', - '#title' => t('Preset name'), - '#description' => t('The unique, machine readable name of this preset.'), - '#default_value' => $preset->name, - '#size' => 20, - '#required' => true, - ); - $form['description'] = array( - '#type' => 'textfield', - '#title' => t('Preset description'), - '#description' => t('The human readable name or description of this preset.'), - '#default_value' => $preset->description, - '#size' => 20, - '#required' => true, - ); - - // Add FFmpeg Wrapper's configuration form. - $form += ffmpeg_wrapper_configuration_form($preset->ffmpeg_wrapper, "edit-ffmpeg-converter-presets-$preset->name-ffmpeg-wrapper-"); - $form['ffmpeg_wrapper']['#collapsible'] = true; - $form['ffmpeg_wrapper']['#tree'] = true; - - // Check this preset's export type/storage. - if (isset($preset->export_type)) { - switch ($preset->export_type) { - case 1: - // "Normal" type. - $form['intro']['#value'] = t('Status: normal
This preset is defined in the database.'); - break; - case 2: - // "Default" type. - $form['intro']['#value'] = t('Status: default
This preset is defined in code.'); - $form['name']['#disabled'] = true; - $form['name']['#value'] = $form['name']['#default_value']; - break; - case 3: - // "Overridden" type. - $form['intro']['#value'] = t('Status: overridden
This preset is defined in code and overridden in the database.'); - $form['name']['#disabled'] = true; - $form['name']['#value'] = $form['name']['#default_value']; - break; - } - } - else { - unset($form['intro']); - } - - // Save extra preset info for the submit handler. - if (!empty($preset->pid)) { - $form['pid'] = array( - '#type' => 'value', - '#value' => $preset->pid, - ); - } - if (!empty($preset->export_type)) { - $form['export_type'] = array( - '#type' => 'value', - '#value' => $preset->export_type, - ); - } - - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('Save') - ); - - return $form; - -} - - -/** - * Validate a preset form. - */ -function ffmpeg_converter_admin_preset_validate($form, &$form_state) { - // Check for illegal characters in preset names. - if (preg_match('/[^0-9a-zA-Z_\-]/', $form_state['values']['name'])) { - form_set_error('name', t('Please only use alphanumeric characters, underscores (_), and hyphens (-) for preset names.')); - } -} - -/** - * Submit handler to save a preset. - */ -function ffmpeg_converter_admin_preset_submit($form, &$form_state) { - - // Serialize ffmpeg_wrapper data. - $form_state['values']['ffmpeg_wrapper'] = serialize($form_state['values']['ffmpeg_wrapper']); - - if (empty($form_state['values']['pid'])) { - // Save new preset. - if (drupal_write_record('ffmpeg_converter_preset', $form_state['values'])) { - if (empty($form_state['values']['export_type'])) { - drupal_set_message(t('Created preset %preset.', array('%preset' => $form_state['values']['description']))); - } - else { - // This is an existing default preset that is being overriden. - drupal_set_message(t('Updated preset %preset.', array('%preset' => $form_state['values']['description']))); - } - } - else { - drupal_set_message(t('Failed to create a new preset.'), 'warning'); - } - } - else { - // Save existing preset. - if (drupal_write_record('ffmpeg_converter_preset', $form_state['values'], 'pid')) { - drupal_set_message(t('Updated preset %preset.', array('%preset' => $form_state['values']['description']))); - } - else { - drupal_set_message(t('Failed to update preset %preset.', array('%preset' => $form_state['values']['description'])), 'warning'); - } - } - - drupal_goto('admin/settings/ffmpeg_converter/presets'); -} - - -/** - * Delete preset form. - * - * @param $name - * The preset's machine readable name. - */ -function ffmpeg_converter_admin_preset_delete($form_state, $preset) { - $form = array(); - $form['pid'] = array( - '#type' => 'value', - '#value' => $preset->pid, - ); - // Save a couple of values for the submit handler. - $form['preset_description'] = array( // 'description' is used by confirm_form(). - '#type' => 'value', - '#value' => $preset->description, - ); - $form['export_type'] = array( - '#type' => 'value', - '#value' => $preset->export_type, - ); - - // Adjust the UI texts depending on export type. - switch ($preset->export_type) { - case 1: - // "Normal" type. - $message = t('Are you sure you want to delete %title?', array('%title' => $preset->description)); - $button = t('Delete'); - break; - case 3: - // "Overridden" type. - $message = t('Are you sure you want to revert %title?', array('%title' => $preset->description)); - $button = t('Revert'); - break; - default: - // There are no other export types that can be deleted. - drupal_goto('admin/settings/ffmpeg_converter'); - return array(); - } - - return confirm_form($form, - $message, - isset($_GET['destination']) ? $_GET['destination'] : 'admin/settings/ffmpeg_converter', - t('This action cannot be undone. If you are using this preset in other parts of your system, you should change those settings first.'), - $button, - t('Cancel') - ); - -} - - -/** - * Submit handler to delete a preset. - */ -function ffmpeg_converter_admin_preset_delete_submit($form, &$form_state) { - if ($form_state['values']['confirm']) { - ffmpeg_converter_preset_delete($form_state['values']['pid']); - // Adjust message depending on export type. - $message = $form_state['values']['export_type'] == 1 ? - 'Deleted preset %preset.' : - 'Reverted preset %preset.'; - drupal_set_message(t($message, array('%preset' => $form_state['values']['preset_description']))); - } - $form_state['redirect'] = 'admin/settings/ffmpeg_converter/presets'; -} - - -/** - * Page callback: export a preset. - * - * @param $preset - * A preset object. - */ -function ffmpeg_converter_admin_preset_export($form_state, $preset) { - drupal_set_title(t('Export of preset %description', array('%description' => $preset->description))); - $form = array(); - - // Get export code with Ctools. - $export = ctools_export_object('ffmpeg_converter_preset', $preset); - $export = ""; - - // Create the export code textarea. - ctools_include('export'); - $form['export'] = array( - '#type' => 'textarea', - '#title' => t('Preset code'), - '#rows' => 20, - '#default_value' => $export, - '#description' => t('Copy and paste this code into the text area on the Import page on a different site if you want to create an identical copy of this preset, You can also use it to define a default preset in your custom code (see below).'), - ); - - // Generate example code for a preset definition in a custom module . - $code = << 1); - } -} - -/** - * Implementation of hook_default_ffmpeg_converter_preset(). - */ -function mymodule_default_ffmpeg_converter_preset() { - \$export = array(); - -%s - \$export['%s'] = \$preset; - - return \$export; -} - -?> -EOD; - $code = sprintf($code, ctools_export_object('ffmpeg_converter_preset', $preset, ' '), $preset->name); - $code = highlight_string($code, true); - - // Show the example code in a fieldset. - $form['default'] = array( - '#type' => 'fieldset', - '#collapsible' => true, - '#title' => t('Example default preset implementation'), - '#description' => t('This is an example implementation of a default preset based on #preset, as defined by a custom module called mymodule. This is also similar to how presets are defined when exported by the Features module.', - array('#preset' => $preset->description, '@features_url' => 'http://drupal.org/project/features')), - ); - $form['default']['code'] = array( - '#value' => $code - ); - return $form; -} - - -/** - * Page callback: import presets. - */ -function ffmpeg_converter_admin_preset_import() { - $form = array(); - $form['import'] = array( - '#type' => 'textarea', - '#rows' => 10, - '#description' => t('Paste your exported preset code here. You can only import one preset at a time. The code should have <?php ?> tags and return a serialized preset object.'), - ); - $form['submit'] = array( - '#type' => 'submit', - '#value' => t('Import') - ); - return $form; -} - - -/** - * Validate a preset import. - */ -function ffmpeg_converter_admin_preset_import_validate($form, &$form_state) { - // Run the import code, which should return a serialized $preset object. - $preset = unserialize(drupal_eval($form_state['values']['import'])); - if (empty($preset) || !is_object($preset) || empty($preset->name)) { - form_set_error('import', t('The submitted preset code could not be interperated.')); - } - elseif (ffmpeg_converter_preset_load($preset->name)) { - form_set_error('import', t('A preset by that name already exists.')); - } - else { - // Pass the parsed object on to the submit handler. - $form_state['values']['import_parsed'] = $preset; - } -} - - -/** - * Submit handler to import a preset. - */ -function ffmpeg_converter_admin_preset_import_submit($form, &$form_state) { - $preset = (array) $form_state['values']['import_parsed']; - $preset['ffmpeg_wrapper'] = serialize($preset['ffmpeg_wrapper']); - - if (drupal_write_record('ffmpeg_converter_preset', $preset)) { - drupal_set_message(t('Imported preset %preset.', array('%preset' => $preset['description']))); - } - else { - drupal_set_message(t('Failed to import the preset.'), 'warning'); - } - - $form_state['redirect'] = 'admin/settings/ffmpeg_converter/presets'; -} - - -/** * Page callback: debug settings form. */ function ffmpeg_converter_admin_debug() { Index: contributions/modules/ffmpeg_converter/ffmpeg_converter.module --- contributions/modules/ffmpeg_converter/ffmpeg_converter.module Base (1.43) +++ contributions/modules/ffmpeg_converter/ffmpeg_converter.module Locally Modified (Based On 1.43) @@ -8,71 +8,25 @@ * This module lets you setup automatic media file conversions with FFmpeg. */ +/** + * Minimum CTools version needed. + */ +define('FFMPEG_CONVERTER_REQUIRED_CTOOLS_API', '1.7'); + /** * Implementation of hook_menu(). */ function ffmpeg_converter_menu() { $items = array(); - $items['admin/settings/ffmpeg_converter'] = array( - 'title' => 'FFmpeg Converter', - 'description' => t('Setup automatic media file conversion.'), - 'page callback' => 'ffmpeg_converter_admin_presets', - 'access arguments' => array('administer ffmpeg wrapper'), - 'file' => 'ffmpeg_converter.admin.inc', - ); - $items['admin/settings/ffmpeg_converter/presets'] = array( - 'title' => 'Presets', - 'type' => MENU_DEFAULT_LOCAL_TASK, - 'weight' => -10, - ); - $items['admin/settings/ffmpeg_converter/presets/add'] = array( - 'title' => 'Create new preset', - 'file' => 'ffmpeg_converter.admin.inc', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('ffmpeg_converter_admin_preset'), - 'access arguments' => array('administer ffmpeg wrapper'), - 'type' => MENU_CALLBACK, - ); - $items['admin/settings/ffmpeg_converter/presets/edit/%ffmpeg_converter_preset'] = array( - 'title' => 'Preset settings', - 'file' => 'ffmpeg_converter.admin.inc', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('ffmpeg_converter_admin_preset', 5), - 'access arguments' => array('administer ffmpeg wrapper'), - 'type' => MENU_CALLBACK, - ); - $items['admin/settings/ffmpeg_converter/presets/delete/%ffmpeg_converter_preset'] = array( - 'title' => 'Delete preset', - 'file' => 'ffmpeg_converter.admin.inc', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('ffmpeg_converter_admin_preset_delete', 5), - 'access arguments' => array('administer ffmpeg wrapper'), - 'type' => MENU_CALLBACK, - ); - $items['admin/settings/ffmpeg_converter/presets/export/%ffmpeg_converter_preset'] = array( - 'title' => 'Export preset', - 'file' => 'ffmpeg_converter.admin.inc', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('ffmpeg_converter_admin_preset_export', 5), - 'access arguments' => array('administer ffmpeg wrapper'), - 'type' => MENU_CALLBACK, - ); - $items['admin/settings/ffmpeg_converter/presets/import'] = array( - 'title' => 'Import preset', - 'file' => 'ffmpeg_converter.admin.inc', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('ffmpeg_converter_admin_preset_import'), - 'access arguments' => array('administer ffmpeg wrapper'), - 'type' => MENU_CALLBACK, - ); - $items['admin/settings/ffmpeg_converter/debug'] = array( + $items['admin/build/ffmpeg_converter/debug'] = array( 'title' => 'Debugging', 'type' => MENU_LOCAL_TASK, 'page callback' => 'drupal_get_form', 'page arguments' => array('ffmpeg_converter_admin_debug'), 'access arguments' => array('administer ffmpeg wrapper'), 'file' => 'ffmpeg_converter.admin.inc', + 'weight' => 9, ); return $items; @@ -102,17 +56,8 @@ $preset->ffmpeg_wrapper = empty($preset->ffmpeg_wrapper) ? array() : $preset->ffmpeg_wrapper; $preset->ffmpeg_wrapper = is_array($preset->ffmpeg_wrapper) ? $preset->ffmpeg_wrapper : unserialize($preset->ffmpeg_wrapper); // Flatten the ffmpeg_wrapper array of options. - $options = array(); - foreach ($preset->ffmpeg_wrapper as $opt_key => $option) { - if (is_array($option)) { - $options = array_merge($options, $option); + $preset->ffmpeg_wrapper = _ffmpeg_converter_array_flatten($preset->ffmpeg_wrapper); } - else { - $options[$opt_key] = $option; - } - } - $preset->ffmpeg_wrapper = $options; - } if ($name) { return isset($presets[$name]) ? $presets[$name] : FALSE; @@ -152,6 +97,21 @@ /** + * Implementation of hook_ctools_plugin_directory(). + */ +function ffmpeg_converter_ctools_plugin_directory($module, $type) { + // Safety: go away if CTools is not at an appropriate version. + if (!module_invoke('ctools', 'api_version', FFMPEG_CONVERTER_REQUIRED_CTOOLS_API)) { + return; + } + + if ($type =='export_ui') { + return 'plugins/export_ui'; + } +} + + +/** * Implementation of hook_default_ffmpeg_converter_preset(). * * Provide a couple of default presets. @@ -643,3 +603,28 @@ return ($return == 'size') ? $size : $pad; } } + +/** + * Helper function to flatten nested arrays, while maintaining keys. + * + * @param $array + * Input array. + * @param $f + * Array argument used internally for recursive calls. + * @return + * Flattened array. + */ +function _ffmpeg_converter_array_flatten($array, $f = array()){ + if (!$array || !is_array($array)) { + return ''; + } + foreach($array as $k => $v) { + if (is_array($v)) { + $f = _ffmpeg_converter_array_flatten($v, $f); + } + else { + $f[$k] = $v; + } + } + return $f; +} Index: contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_ctools_export_ui.inc --- contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_ctools_export_ui.inc No Base Revision +++ contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_ctools_export_ui.inc Locally New @@ -0,0 +1,97 @@ + 'ffmpeg_converter_preset', + 'access' => 'administer ffmpeg wrapper', + 'menu' => array( + 'menu item' => 'ffmpeg_converter', + 'menu title' => 'FFmpeg Converter', + 'menu description' => 'Administer FFmpeg Converter presets', + ), + + 'title singular' => t('preset'), + 'title plural' => t('presets'), + 'title singular proper' => t('FFmpeg Converter preset'), + 'title plural proper' => t('FFmpeg Converter presets'), + 'handler' => array( + 'class' => 'ffmpeg_converter_presets_ui', + 'parent' => 'ctools_export_ui', + ), +); + +/** + * Define the preset form. + */ +function ffmpeg_converter_ctools_export_ui_form(&$form, &$form_state) { + $preset = $form_state['item']; + + // Prepare the ffmpeg_wrapper settings array. + if (!empty($preset->ffmpeg_wrapper) && is_string($preset->ffmpeg_wrapper)) { + $preset->ffmpeg_wrapper = unserialize($preset->ffmpeg_wrapper); + } + if (empty($preset->ffmpeg_wrapper)) { + $preset = new stdClass; + $preset->name = ''; + $preset->description = ''; + $preset->ffmpeg_wrapper = ffmpeg_converter_default_options(); + } + + $form['description'] = array( + '#type' => 'textfield', + '#title' => t('Description'), + '#description' => t('The human readable name or description of this preset.'), + '#default_value' => $preset->description, + '#required' => true, + ); + + // Add FFmpeg Wrapper's configuration form. + $preset->ffmpeg_wrapper = _ffmpeg_converter_array_flatten($preset->ffmpeg_wrapper); + $form += ffmpeg_wrapper_configuration_form($preset->ffmpeg_wrapper, "edit-ffmpeg-converter-presets-$preset->name-ffmpeg-wrapper-"); + $form['ffmpeg_wrapper']['#collapsible'] = true; + $form['ffmpeg_wrapper']['#tree'] = true; + + // Check this preset's export type/storage. + if (isset($preset->export_type)) { + $form['intro'] = array('#weight' => -1); + switch ($preset->export_type) { + case 1: + // "Normal" type. + $form['intro']['#value'] = t('Status: normal
This preset is defined in the database.'); + break; + case 2: + // "Default" type. + $form['intro']['#value'] = t('Status: default
This preset is defined in code.'); + break; + case 3: + // "Overridden" type. + $form['intro']['#value'] = t('Status: overridden
This preset is defined in code and overridden in the database.'); + break; + } + } + + // Add a custom submit handler. + $form['#submit'] = empty($form['#submit']) ? array() : $form['#submit']; + $form['#submit'] = array('ffmpeg_converter_ctools_export_ui_form_submit') + $form['#submit']; + +} + +/** + * Submit handler for the preset edit form. + */ +function ffmpeg_converter_ctools_export_ui_form_submit($form, &$form_state) { + // Serialize the ffmpeg_wrapper settings array into a string. + $form_state['item']->ffmpeg_wrapper = serialize($form_state['values']['ffmpeg_wrapper']); + + // Should we really have to do this? + $form_state['item']->name = $form_state['values']['name']; + $form_state['item']->description = $form_state['values']['description']; +} Index: contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_presets_ui.class.php --- contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_presets_ui.class.php No Base Revision +++ contributions/modules/ffmpeg_converter/plugins/export_ui/ffmpeg_converter_presets_ui.class.php Locally New @@ -0,0 +1,34 @@ +Rules using the "Queue file field for conversion" action, which lets you create rules that convert all media files that are uploaded to a certain file field automatically.', array('@rules', url('admin/rules/trigger'))); + } + else { + $help .= ' ' . t('If you install and enable the Rules and FileField modules, your presets will appear on rule configuration pages, which allows you to have all media files that are uploaded to a certain file field processed automatically.'); + } + $help .= ' ' . t('Other modules may also make this conversion functionality available in their own specific contexts.'); + $help = '

' . $help . '

'; + + $form['#prefix'] .= $help; + + } + +}