diff options
Diffstat (limited to 'includes')
-rw-r--r-- | includes/preset.inc | 16 | ||||
-rw-r--r-- | includes/video.features.inc | 50 | ||||
-rw-r--r-- | includes/video.preset.inc | 546 |
3 files changed, 552 insertions, 60 deletions
diff --git a/includes/preset.inc b/includes/preset.inc index 195d3b9..e06b9f6 100644 --- a/includes/preset.inc +++ b/includes/preset.inc @@ -21,19 +21,27 @@ class video_preset { * @return array $form */ public function admin_settings() { - $presets = preset_get_presets('video'); + $form = array(); + $presets = video_preset_get_presets(); + if (count($presets) == 0) { + return $form['video_preset'] = array( + '#markup' => t('No Features were found. Please use the !create_link link to create + a new Feature module, or upload an existing Feature to your modules directory.', + array('!create_link' => l(t('Create Feature'), 'admin/structure/features/create'))), + ); + } $preset = array(); foreach ($presets as $id => $value) { $preset[$id] = $value['name']; - $help[] = $value['name'] . ' - ' . $value['description'] . ' ' . l(t('edit'), preset_get_preset_path('video', $value['name'])); +// $help[] = $value['name'] . ' - ' . $value['description'] . ' ' . l(t('edit'), preset_get_preset_path('video', $value['name'])); } - $form = array(); + $form['video_preset'] = array( '#type' => 'checkboxes', '#title' => t('Video transcode presets'), '#options' => $preset, '#default_value' => variable_get('video_preset', array()), - '#description' => t('!list', array('!list' => theme('item_list', array('items' => $help)))), +// '#description' => t('!list', array('!list' => theme('item_list', array('items' => $help)))), '#prefix' => '<div id="preset-checkboxes">', '#suffix' => '</div>', ); diff --git a/includes/video.features.inc b/includes/video.features.inc new file mode 100644 index 0000000..10fbc9d --- /dev/null +++ b/includes/video.features.inc @@ -0,0 +1,50 @@ +<?php + +// include the preset file +module_load_include('inc', 'video', 'includes/video.preset'); + +/** + * Implementation of hook_features_export_options(). + */ +function video_features_export_options() { + $options = array(); + foreach (video_preset_get_presets () as $preset) { + $options[$preset['name']] = $preset['name']; + } + return $options; +} + +/** + * Implementation of hook_features_export(). + */ +function video_features_export($data, &$export, $module_name = '') { + foreach ($data as $preset) { + $export['features']['video'][$preset] = $preset; + } +} + +/** + * Implementation of hook_features_export_render(). + */ +function video_features_export_render($module_name, $data) { + $items = array(); + foreach ($data as $key) { + $preset = video_get_preset($key); + unset($preset['pid']); + $items[$key] = $preset; + } + $code = " \$items = " . features_var_export($items, ' ') . ";\n"; + $code .= ' return $items;'; + return array('video_default_presets' => $code); +} + +/** + * Implementation of hook_features_revert(). + */ +function video_features_revert($module) { + if ($default_presets = features_get_default('video', $module)) { + foreach (array_keys($default_presets) as $default_preset) { + video_preset_delete($default_preset); + } + } +} diff --git a/includes/video.preset.inc b/includes/video.preset.inc index 4416de5..534e5d3 100644 --- a/includes/video.preset.inc +++ b/includes/video.preset.inc @@ -1,19 +1,6 @@ <?php -/** - * This is used to set some required settings while the preset is being created. - * - * @return <array> - The form elements that you would like to add for the settings. - * - * Special Note: It is required to structure all your settings using - * $form['preset']['settings'] as the parent form element. Otherwise, - * they will not get serialized within the "settings" column of the database. - * @TODO : we can add some required values there - */ -function video_preset_create_form() { - $form = array(); - return $form; -} +define('VIDEO_PRESET_MAX_LENGTH', 64); /** * This is used to add all the other settings that you need to declare in your preset. @@ -23,16 +10,16 @@ function video_preset_create_form() { * @param <array> - The preset object. * @return <array> - The additional form settings that you would like to add to your preset. */ -function video_preset_form($preset) { +function video_preset_default_form($form, &$form_state, $preset) { $form = array(); - $form['preset']['settings']['device_profile'] = array( + $form['settings']['device_profile'] = array( '#type' => 'fieldset', '#title' => t('Output parameter'), '#description' => t('All output settings are optional. We choose sensible defaults for web and iPhone playback.'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['device_profile']['device_profile'] = array( + $form['settings']['device_profile']['device_profile'] = array( '#type' => 'select', '#title' => t('Device profile'), '#description' => t('A profile for your target device.'), @@ -49,13 +36,13 @@ function video_preset_form($preset) { '#default_value' => (!empty($preset['settings']['device_profile'])) ? $preset['settings']['device_profile'] : 0 ); // video settings - $form['preset']['settings']['video'] = array( + $form['settings']['video'] = array( '#type' => 'fieldset', '#title' => t('Video settings'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['video']['video_codec'] = array( + $form['settings']['video']['video_codec'] = array( '#type' => 'select', '#title' => t('Video codec'), '#description' => t('The video codec used in the video file can affect the ability to play the video on certain devices. The default codec used is H.264.'), @@ -69,7 +56,7 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['video_codec'])) ? $preset['settings']['video_codec'] : 'h264' ); - $form['preset']['settings']['video']['video_quality'] = array( + $form['settings']['video']['video_quality'] = array( '#type' => 'select', '#title' => t('Video quality'), '#description' => t('A target video quality. Affects bitrate and file size.'), @@ -82,7 +69,7 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['video_quality'])) ? $preset['settings']['video_quality'] : 2 ); - $form['preset']['settings']['video']['video_speed'] = array( + $form['settings']['video']['video_speed'] = array( '#type' => 'select', '#title' => t('Video speed'), '#description' => t('Speed of encoding. Affects compression.'), @@ -95,19 +82,19 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['video_speed'])) ? $preset['settings']['video_speed'] : 2 ); - $form['preset']['settings']['video']['width'] = array( + $form['settings']['video']['width'] = array( '#type' => 'textfield', '#title' => t('Width'), '#description' => t('The maximum width of the output video (in pixels).'), '#default_value' => !empty($preset['settings']['width']) ? $preset['settings']['width'] : '' ); - $form['preset']['settings']['video']['height'] = array( + $form['settings']['video']['height'] = array( '#type' => 'textfield', '#title' => t('Height'), '#description' => t('The maximum height of the output video (in pixels).'), '#default_value' => !empty($preset['settings']['height']) ? $preset['settings']['height'] : '' ); - $form['preset']['settings']['video']['video_aspectmode'] = array( + $form['settings']['video']['video_aspectmode'] = array( '#type' => 'select', '#title' => t('Aspect mode'), '#description' => t('What to do when aspect ratio of input file does not match the target width/height aspect ratio.'), @@ -119,20 +106,20 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['video_aspectmode'])) ? $preset['settings']['video_aspectmode'] : 'preserve' ); - $form['preset']['settings']['video']['video_upscale'] = array( + $form['settings']['video']['video_upscale'] = array( '#type' => 'checkbox', '#title' => t('Upscale'), '#description' => t('If the input file is smaller than the target output, should the file be upscaled to the target size?'), '#default_value' => !empty($preset['settings']['video_upscale']) ? $preset['settings']['video_upscale'] : '' ); // audio settings - $form['preset']['settings']['audio'] = array( + $form['settings']['audio'] = array( '#type' => 'fieldset', '#title' => t('Audio settings'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['audio']['audio_codec'] = array( + $form['settings']['audio']['audio_codec'] = array( '#type' => 'select', '#title' => t('Audio codec'), '#description' => t('The audio codec to be used.'), @@ -144,7 +131,7 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['audio_codec'])) ? $preset['settings']['audio_codec'] : 'h264' ); - $form['preset']['settings']['audio']['audio_quality'] = array( + $form['settings']['audio']['audio_quality'] = array( '#type' => 'select', '#title' => t('Audio quality'), '#description' => t('A target audio quality. Affects bitrate and file size.'), @@ -158,13 +145,13 @@ function video_preset_form($preset) { '#default_value' => (!empty($preset['settings']['audio_quality'])) ? $preset['settings']['audio_quality'] : 2 ); // advanced video settings - $form['preset']['settings']['adv_video'] = array( + $form['settings']['adv_video'] = array( '#type' => 'fieldset', '#title' => t('Advanced video settings'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['adv_video']['deinterlace'] = array( + $form['settings']['adv_video']['deinterlace'] = array( '#type' => 'select', '#title' => t('Deinterlace'), '#description' => t('Note that detect mode will auto-detect and deinterlace interlaced content.'), @@ -175,68 +162,68 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['deinterlace'])) ? $preset['settings']['deinterlace'] : 'detect' ); - $form['preset']['settings']['adv_video']['max_frame_rate'] = array( + $form['settings']['adv_video']['max_frame_rate'] = array( '#type' => 'textfield', '#title' => t('Maximum frame rate'), '#description' => t('A maximum frame rate cap (in frames per second).'), '#default_value' => !empty($preset['settings']['max_frame_rate']) ? $preset['settings']['max_frame_rate'] : '' ); - $form['preset']['settings']['adv_video']['frame_rate'] = array( + $form['settings']['adv_video']['frame_rate'] = array( '#type' => 'textfield', '#title' => t('Frame rate'), '#description' => t('Force a specific output frame rate (in frames per second). For best quality, do not use this setting.'), '#default_value' => !empty($preset['settings']['frame_rate']) ? $preset['settings']['frame_rate'] : '' ); - $form['preset']['settings']['adv_video']['frame_rate'] = array( + $form['settings']['adv_video']['frame_rate'] = array( '#type' => 'textfield', '#title' => t('Frame rate'), '#description' => t('Force a specific output frame rate (in frames per second). For best quality, do not use this setting.'), '#default_value' => !empty($preset['settings']['frame_rate']) ? $preset['settings']['frame_rate'] : '' ); - $form['preset']['settings']['adv_video']['video_bitrate'] = array( + $form['settings']['adv_video']['video_bitrate'] = array( '#type' => 'textfield', '#title' => t('Video bitrate'), '#description' => t('A target bitrate in kbps. Not necessary if you select a Video Quality setting, unless you want to target a specific bitrate.'), '#default_value' => !empty($preset['settings']['video_bitrate']) ? $preset['settings']['video_bitrate'] : '' ); - $form['preset']['settings']['adv_video']['bitrate_cap'] = array( + $form['settings']['adv_video']['bitrate_cap'] = array( '#type' => 'textfield', '#title' => t('Bitrate cap'), '#description' => t('A bitrate cap in kbps, used for streaming servers.'), '#default_value' => !empty($preset['settings']['bitrate_cap']) ? $preset['settings']['bitrate_cap'] : '' ); - $form['preset']['settings']['adv_video']['buffer_size'] = array( + $form['settings']['adv_video']['buffer_size'] = array( '#type' => 'textfield', '#title' => t('Buffer size'), '#description' => t('The buffer size for the bitrate cap in kbps.'), '#default_value' => !empty($preset['settings']['buffer_size']) ? $preset['settings']['buffer_size'] : '' ); - $form['preset']['settings']['adv_video']['one_pass'] = array( + $form['settings']['adv_video']['one_pass'] = array( '#type' => 'checkbox', '#title' => t('One pass'), '#description' => t('Force one-pass encoding when targeting a specific video_bitrate. True or False.'), '#default_value' => !empty($preset['settings']['one_pass']) ? $preset['settings']['one_pass'] : '' ); - $form['preset']['settings']['adv_video']['skip_video'] = array( + $form['settings']['adv_video']['skip_video'] = array( '#type' => 'checkbox', '#title' => t('Skip video'), '#description' => t('The video track will be omitted from the output. You can still specify a video format, however, no video track will be present in the resulting file.'), '#default_value' => !empty($preset['settings']['skip_video']) ? $preset['settings']['skip_video'] : '' ); // advanced audio settings - $form['preset']['settings']['adv_audio'] = array( + $form['settings']['adv_audio'] = array( '#type' => 'fieldset', '#title' => t('Advanced audio settings'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['adv_audio']['audio_bitrate'] = array( + $form['settings']['adv_audio']['audio_bitrate'] = array( '#type' => 'textfield', '#title' => t('Audio bitrate'), '#description' => t('The overall audio bitrate specified as kilobits per second (kbps, e.g. 96 or 160). This value can\'t exceed 160 kbps per channel. 96-160 is usually a good range for stereo output.'), '#default_value' => !empty($preset['settings']['audio_bitrate']) ? $preset['settings']['audio_bitrate'] : '' ); - $form['preset']['settings']['adv_audio']['audio_channels'] = array( + $form['settings']['adv_audio']['audio_channels'] = array( '#type' => 'select', '#title' => t('Audio channels'), '#description' => t('By default we will choose the lesser of the number of audio channels in the input file or 2 (stereo).'), @@ -246,38 +233,38 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['audio_channels'])) ? $preset['settings']['audio_channels'] : 2 ); - $form['preset']['settings']['adv_audio']['audio_sample_rate'] = array( + $form['settings']['adv_audio']['audio_sample_rate'] = array( '#type' => 'textfield', '#title' => t('Audio sample rate'), '#description' => t('The sample rate of the audio in hertz. Manually setting this may cause problems, depending on the selected bitrate and number of channels.'), '#default_value' => !empty($preset['settings']['audio_sample_rate']) ? $preset['settings']['audio_sample_rate'] : '' ); - $form['preset']['settings']['adv_audio']['skip_audio'] = array( + $form['settings']['adv_audio']['skip_audio'] = array( '#type' => 'checkbox', '#title' => t('Skip audio'), '#description' => t('The audio track will be omitted from the output. You must specify a video format and no audio track will be present in the resulting file.'), '#default_value' => !empty($preset['settings']['skip_audio']) ? $preset['settings']['skip_audio'] : '' ); // video optimizations - $form['preset']['settings']['vid_optimization'] = array( + $form['settings']['vid_optimization'] = array( '#type' => 'fieldset', '#title' => t('Video Optimization'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['vid_optimization']['autolevels'] = array( + $form['settings']['vid_optimization']['autolevels'] = array( '#type' => 'checkbox', '#title' => t('Autolevels'), '#description' => t('Automatic brightness / contrast correction.'), '#default_value' => !empty($preset['settings']['autolevels']) ? $preset['settings']['autolevels'] : '' ); - $form['preset']['settings']['vid_optimization']['deblock'] = array( + $form['settings']['vid_optimization']['deblock'] = array( '#type' => 'checkbox', '#title' => t('Deblock'), '#description' => t('Apply deblocking filter. Useful for highly compressed or blocky input videos.'), '#default_value' => !empty($preset['settings']['deblock']) ? $preset['settings']['deblock'] : '' ); - $form['preset']['settings']['vid_optimization']['denoise'] = array( + $form['settings']['vid_optimization']['denoise'] = array( '#type' => 'select', '#title' => t('Denoise'), '#description' => t('Apply denoise filter. Generally results in slightly better compression, and slightly slower encoding. Beware of any value higher than "Weak" (unless you\'re encoding animation).'), @@ -291,13 +278,13 @@ function video_preset_form($preset) { '#default_value' => (!empty($preset['settings']['denoise'])) ? $preset['settings']['denoise'] : 2 ); // Segmented Streaming - $form['preset']['settings']['segmented_streaming'] = array( + $form['settings']['segmented_streaming'] = array( '#type' => 'fieldset', '#title' => t('Segmented Streaming'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['segmented_streaming']['segmented_type'] = array( + $form['settings']['segmented_streaming']['segmented_type'] = array( '#type' => 'select', '#title' => t('Type'), '#description' => t('Set to segmented for HTTP Live Streaming.'), @@ -307,33 +294,33 @@ function video_preset_form($preset) { ), '#default_value' => (!empty($preset['settings']['segmented_type'])) ? $preset['settings']['segmented_type'] : 0 ); - $form['preset']['settings']['segmented_streaming']['segmented_seconds'] = array( + $form['settings']['segmented_streaming']['segmented_seconds'] = array( '#type' => 'textfield', '#title' => t('Segment Seconds'), '#description' => t('The maximum duration of each segment in segmented outputs.'), '#default_value' => !empty($preset['settings']['segmented_seconds']) ? $preset['settings']['segmented_seconds'] : '' ); // Create clip - $form['preset']['settings']['create_clip'] = array( + $form['settings']['create_clip'] = array( '#type' => 'fieldset', '#title' => t('Create Clip'), '#collapsible' => TRUE, '#collapsed' => TRUE ); - $form['preset']['settings']['create_clip']['clip_start'] = array( + $form['settings']['create_clip']['clip_start'] = array( '#type' => 'textfield', '#title' => t('Start clip'), '#description' => t('The starting point of a subclip (in timecode or number of seconds).'), '#default_value' => !empty($preset['settings']['clip_start']) ? $preset['settings']['clip_start'] : '' ); - $form['preset']['settings']['create_clip']['clip_length'] = array( + $form['settings']['create_clip']['clip_length'] = array( '#type' => 'textfield', '#title' => t('Clip length '), '#description' => t('The length of the subclip (in timecode or number of seconds).'), '#default_value' => !empty($preset['settings']['clip_length']) ? $preset['settings']['clip_length'] : '' ); // Command line parameters - $form['preset']['settings']['command_line'] = array( + $form['settings']['command_line'] = array( '#type' => 'fieldset', '#title' => t('Command line options'), '#collapsible' => TRUE, @@ -346,11 +333,458 @@ function video_preset_form($preset) { '!width - Width of output video', '!height - Height of output video' ); - $form['preset']['settings']['command_line']['cli_code'] = array( + $form['settings']['command_line']['cli_code'] = array( '#type' => 'textarea', '#title' => t('Command line codes to run'), '#description' => t('Please add command line codes each to run separated by a new line.') . theme('item_list', array('items' => $tokes, 'title' => 'Available Tokes')), '#default_value' => !empty($preset['settings']['cli_code']) ? $preset['settings']['cli_code'] : '!cmd_path -i !videofile -s !widthx!height -r 15 -b 250 -ar 22050 -ab 48 !convertfile' ); return $form; -}
\ No newline at end of file +} + +/** + * Menu callback: video Module administration. + */ +function video_presets_overview() { + $presets = video_preset_get_presets(); + + if (count($presets) > 0) { + $header = array(t('Preset Name'), t('Description'), array('data' => t('Operations'), 'colspan' => '3')); + $rows = array(); + foreach ($presets as $pid => $preset) { + $row = array(); + $row[] = check_plain($preset['name']); + $row[] = array('data' => filter_xss_admin($preset['description']), 'class' => 'description'); + $row[] = array('data' => l(t('edit'), 'admin/structure/video/preset/' . $preset['name'])); + + if (!isset($preset['default'])) { + $row[] = array('data' => l(t('delete'), 'admin/structure/video/preset/' . $preset['name'] . '/delete')); + } + + $row[] = array('data' => l(t('export'), 'admin/structure/video/preset/' . $preset['name'] . '/export')); + $rows[] = $row; + } + return theme('table', array('header' => $header, 'rows' => $rows)); + } else { + return t('No Preset were found. Please use the !create_link link to create + a new video preset, or upload an existing Feature to your modules directory.', + array('!create_link' => l(t('Create Video Preset'), 'admin/structure/video/add'))); + } +} + +/** + * Preset form + * @param <type> $form + * @param <type> $form_state + * @param <type> $preset + * @return string + */ +function video_preset_form($form, &$form_state, $preset = false) { + $form = array(); + // basic preset details + $form['preset'] = array( + '#type' => 'fieldset', + '#title' => t('Preset information'), + '#weight' => -10, + ); + if (isset($preset['pid'])) { + $form['preset']['pid'] = array( + '#type' => 'value', + '#value' => $preset['pid'], + ); + } elseif (video_is_default_preset($preset['name'])) { + $form['preset']['default'] = array( + '#type' => 'value', + '#value' => TRUE, + ); + } + $form['preset']['name'] = array( + '#type' => 'textfield', + '#title' => t('Preset name'), + '#maxlength' => VIDEO_PRESET_MAX_LENGTH, + '#description' => t('Spaces are NOT allowed; punctuation is not allowed except for periods, hyphens, apostrophes, and underscores.'), + '#required' => TRUE, + '#weight' => -10, + '#element_validate' => array('_video_preset_name_validate'), + '#default_value' => !empty($preset['name']) ? $preset['name'] : '' + ); + + $form['preset']['description'] = array( + '#type' => 'textfield', + '#title' => t('Description'), + '#description' => t('Add a brief description to your preset name.'), + '#weight' => -9, + '#default_value' => !empty($preset['description']) ? $preset['description'] : '' + ); + + // Preset settings + $form += video_preset_default_form($form, $form_state, $preset); + + // Buttons + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Save Preset'), + '#weight' => 30, + ); + + $form['delete'] = array( + '#type' => 'submit', + '#value' => t('Delete'), + '#weight' => 40, + '#submit' => array('video_preset_delete_submit'), + ); + + // Add the form submit handler. + $form['#submit'][] = 'video_preset_submit'; + $form['#validate'][] = 'video_preset_validate'; + return $form; +} + +/** + * Validation for the preset form. + */ +function video_preset_validate($form, &$form_state) { + +} + +/** + * Flatten the settings array. + * + * @param <type> $array + * @param <type> $return + * @return <type> + */ +function video_preset_array_flatten($array, $return=array()) { + foreach ($array as $key => $value) { + if (is_array($value)) { + $return = video_preset_array_flatten($value, $return); + } else { + $return[$key] = $value; + } + } + return $return; +} + +/** + * Submit handler for the preset form. + */ +function video_preset_submit($form, &$form_state) { + $preset = array(); + if (isset($form_state['values']['pid'])) { + $preset['pid'] = $form_state['values']['pid']; + } + $preset['name'] = $form_state['values']['name']; + $preset['description'] = $form_state['values']['description']; + // unset unwanted values saved to database + unset($form_state['values']['pid'], $form_state['values']['name'], + $form_state['values']['description'], $form_state['values']['submit'], + $form_state['values']['delete'], $form_state['values']['form_build_id'], + $form_state['values']['form_token'], $form_state['values']['form_id'], + $form_state['values']['op']); + $preset['settings'] = video_preset_array_flatten($form_state['values']); + + // Save this preset. + video_preset_save($preset); + drupal_set_message(t('Preset !preset successfully saved.', array('!preset' => $preset['name']))); + $form_state['redirect'] = 'admin/structure/video'; +} + +/** + * Button sumit function: handle the 'Delete' button on the preset form. + */ +function video_preset_delete_submit($form, &$form_state) { + $preset['name'] = $form_state['values']['name']; + $form_state['redirect'] = 'admin/structure/video/preset/' . $preset['name'] . '/delete'; +} + +/** + * Menu callback; delete a single preset. + */ +function video_preset_delete_confirm($form, &$form_state, $preset) { + $form['name'] = array('#type' => 'value', '#value' => $preset['name']); + $message = t('Are you sure you want to delete the preset %name?', array('%name' => $preset['name'])); + $caption = '<p>' . t('This action cannot be undone.') . '</p>'; + return confirm_form($form, $message, 'admin/structure/video', $caption, t('Delete')); +} + +/** + * Execute preset deletion + */ +function video_preset_delete_confirm_submit($form, &$form_state) { + if ($form_state['values']['confirm']) { + video_preset_delete($form_state['values']['name']); + } + + $form_state['redirect'] = 'admin/structure/video'; +} + +/** + * Validation for the preset form. + */ +function _video_preset_name_validate($element, &$form_state) { + $error = video_validate_preset_name($form_state['values']['name']); + if ($error && !isset($form_state['values']['pid']) && !isset ($form_state['values']['default'])) { + form_set_error('name', $error); + } +} + +/** + * Import's a preset. + */ +function video_preset_import_form($form, &$form_state) { + $form['preset'] = array( + '#title' => t('Preset Code'), + '#type' => 'textarea', + '#rows' => 10, + '#description' => t('Copy the export text and paste it into this text field to import a new preset.'), + ); + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Import Preset'), + '#weight' => 30, + ); + + $form['#submit'][] = 'video_preset_import_submit'; + $form['#validate'][] = 'video_preset_import_validate'; + + return $form; +} + +/** + * Validation for the preset import form. + */ +function video_preset_import_validate($form, &$form_state) { + $preset = ''; + + // Get the preset that they declared in the text field. + ob_start(); + eval($form_state['values']['preset']); + ob_end_clean(); + + if (is_array($preset)) { + $name = isset($preset['name']) ? $preset['name'] : ''; + if ($error = video_validate_preset_name($name)) { + form_set_error('name', $error); + } + } else { + form_set_error('name', 'Invalid preset import.'); + } + + $form_state['preset'] = &$preset; +} + +/** + * Submit handler for the preset import form. + */ +function video_preset_import_submit($form, &$form_state) { + $preset = $form_state['preset']; + video_preset_save($preset); + $form_state['redirect'] = 'admin/structure/video/preset/' . $preset['name']; +} + +/** + * The preset export form. + */ +function video_preset_export_form($form, &$form_state, $preset) { + // Unset the unnecessary elements. + unset($preset['pid']); + unset($preset['default']); + + // Get the code string representation. + $code = var_export($preset, true); + + // Make sure to format the arrays like drupal. + $code = str_replace("=> \n ", '=> ', $code); + + // Add the preset variable. + $code = '$preset = ' . $code . ';'; + + $lines = substr_count($code, "\n"); + $form['export'] = array( + '#title' => t('Export Preset'), + '#type' => 'textarea', + '#value' => $code, + '#rows' => $lines, + '#description' => t('Copy the export text and paste it into another preset using the import function.'), + ); + + // Return the form. + return $form; +} + +/** + * Get's the player settings for the given player. + */ +function video_player_settings_form($preset) { + $settings_form = $preset['player'] . '_player_settings_form'; + if (function_exists($settings_form)) { + return $settings_form($preset); + } + return array(); +} + +/** + * Title callback for a preset. + */ +function video_preset_page_title($preset) { + return $preset['name']; +} + +/** + * Saves a new preset. + */ +function video_preset_save($preset) { + // If they provide the pid, then this needs to be an update. + $pid = (isset($preset['pid']) && $preset['pid']) ? array('pid') : array(); + + // Save or update a preset. + drupal_write_record('video_preset', $preset, $pid); +} + +/** + * Returns the default presets. + * + * @return <type> + */ +function video_preset_get_default_presets() { + $default_presets = module_invoke_all('video_default_presets'); + drupal_alter('video_default_presets', $default_presets); + return $default_presets; +} + +/** + * Gets a list of all presets. + */ +function video_preset_get_presets() { + $presets = array(); + $normal_presets = array(); + + // Get all the presets from the database. + $result = db_select('video_preset', 'p') + ->fields('p') + ->orderBy('p.name', 'ASC') + ->execute(); + + // Iterate through all the presets and structure them in an array. + foreach ($result as $preset) { + $preset = (array) $preset; + $preset['settings'] = $preset['settings'] ? unserialize($preset['settings']) : array(); + $presets[$preset['pid']] = $preset; + $normal_presets[$preset['name']] = $preset['pid']; + } + + // Now allow other modules to add their default presets. + foreach (video_preset_get_default_presets () as $preset) { + // adding default TRUE + $preset['default'] = TRUE; + if (!empty($preset['name']) && !isset($normal_presets[$preset['name']])) { + $presets[$preset['name']] = $preset; + } + } + + return $presets; +} + +/** + * Get's the preset. + */ +function video_get_preset($preset_name) { + // Get the preset from the database. + $preset = db_select('video_preset', 'p') + ->fields('p') + ->condition('p.name', $preset_name) + ->execute() + ->fetchAssoc(); + if ($preset) { + $preset['settings'] = $preset['settings'] ? unserialize($preset['settings']) : array(); + } else { + // Get all of the default presets. + $default_presets = video_preset_get_default_presets(); + + // Check to see if this preset exists. + if (isset($default_presets[$preset_name])) { + // Make this our preset + $preset = $default_presets[$preset_name]; + } + } + + // Return the preset. + return $preset; +} + +/** + * Deletes a preset + */ +function video_preset_delete($preset_name) { + // Delete the preset. + db_delete('video_preset') + ->condition('name', $preset_name) + ->execute(); + + // Rebuild Theme Registry + drupal_theme_rebuild(); +} + +/** + * Checks to see if another preset is already taken. + */ +function video_preset_name_exists($preset_name) { + + // Get the default presets. + $default_presets = video_preset_get_default_presets(); + + // See if there is a default preset name. + if ($default_presets && isset($default_presets[$preset_name])) { + return true; + } else { + return (bool) db_select('video_preset', 'p') + ->fields('p') + ->condition('p.name', $preset_name) + ->range(0, 1) + ->execute() + ->fetchField(); + } +} + +/** + * Verify the syntax of the given prefix name. + * + * Borrowed from the user.module. :) + */ +function video_validate_preset_name($name) { + if (!$name) { + return t('You must enter a preset.'); + } + if (video_preset_name_exists($name)) { + return t('The preset name %name is already taken.', array('%name' => $name)); + } + if (strpos($name, ' ') !== FALSE) { + return t('The preset name cannot contain a space.'); + } + if (is_numeric($name[0])) { + return t('The preset name cannot begin with a number.'); + } + if (preg_match('/[^a-z0-9_]/i', $name)) { + return t('The preset name contains an illegal character.'); + } + if (drupal_strlen($name) > VIDEO_PRESET_MAX_LENGTH) { + return t('The preset name %name is too long: it must be %max characters or less.', array('%name' => $name, '%max' => VIDEO_PRESET_MAX_LENGTH)); + } +} + +/** + * Check for default preset + * @param <type> $preset_name + * @return <type> + */ +function video_is_default_preset($preset_name) { + // Get the default presets. + $default_presets = video_preset_get_default_presets(); + + // See if there is a default preset name. + if ($default_presets && isset($default_presets[$preset_name])) + return TRUE; + else + return FALSE; +} |