diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/video_customfields/video_customfields.module | 225 | ||||
-rw-r--r-- | plugins/video_image/video_image.module | 145 | ||||
-rw-r--r-- | plugins/video_multidownload/video_multidownload.module | 303 | ||||
-rw-r--r-- | plugins/video_optmetadata/video_optmetadata.module | 134 | ||||
-rw-r--r-- | plugins/video_params/video_params.module | 105 | ||||
-rw-r--r-- | plugins/video_upload/video_upload.module | 304 |
6 files changed, 1216 insertions, 0 deletions
diff --git a/plugins/video_customfields/video_customfields.module b/plugins/video_customfields/video_customfields.module new file mode 100644 index 0000000..f6b2e50 --- /dev/null +++ b/plugins/video_customfields/video_customfields.module @@ -0,0 +1,225 @@ +<?php +// $Id$ + +/** + * @file + * Enable addition of custom fileds on video nodes created by video module. + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + +/** + * Implementation of hook_help(). + */ +function video_customfields_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable addition of custom fileds on video nodes created by video module.'); + } +} + + +/** + * Implementation of hook_perm(). + */ +function video_customfields_perm() { + return array('insert custom fields'); +} + + +/** + * Settings Hook + * + * @return + * string of form content or error message + */ +function video_customfields_settings() { + //Must have "administer site configuration" and "administer video" privilages. + if (!user_access('administer video')) { + drupal_access_denied(); + } + + $form['customfields'] = array( + '#type' => 'fieldset', + '#weight' => -1, + '#collapsible' => TRUE, + '#collapsed' => FALSE, + '#title' => t('Custom display fields'), + '#description' => t('Creates custom fields. Fields only show up if you give them a name.') + ); + $form['customfields']['video_customfieldtitle'] = array( + '#type' => 'textfield', + '#title' => t('Custom field group title'), + '#default_value' => variable_get('video_customfieldtitle', ''), + '#description' => t('Title of the group of all custom fields.')); + $form['customfields']['video_customfield1'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 1 title'), + '#default_value' => variable_get('video_customfield1', '')); + $form['customfields']['video_customfield2'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 2 title'), + '#default_value' => variable_get('video_customfield2', '')); + $form['customfields']['video_customfield3'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 3 title'), + '#default_value' => variable_get('video_customfield3', '')); + $form['customfields']['video_customfield4'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 4 title'), + '#default_value' => variable_get('video_customfield4', '')); + $form['customfields']['video_customfield5'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 5 title'), + '#default_value' => variable_get('video_customfield5', '')); + $form['customfields']['video_customfield6'] = array( + '#type' => 'textfield', + '#title' => t('Custom field 6 title'), + '#default_value' => variable_get('video_customfield6', '')); + + + $options = array(1 => 'Yes', 0 => 'No'); + + $form['customfields']['video_customgroupcollapsed'] = array( + '#type' => 'radios', + '#title' => t('Start group initially collapsed'), + '#options' => $options, + '#default_value' => variable_get('video_customgroupcollapsed', 1), + '#description' => t('Should the custom fields group be initially collapsed when creating and editing video nodes?') + ); + return $form; +} + + + +/** + * Implementation of hook_form_alter() + * We use this to add some custom fields to the video creation form. + * Fields will be displayed only if field title is set on settings page. + */ +function video_customfileds_form_alter($form_id, &$form) { + + if($form_id == 'video_node_form' && isset($form['video']) && user_access('insert custom fields')) { + + $title1 = variable_get('video_customfield1', ''); + $title2 = variable_get('video_customfield2', ''); + $title3 = variable_get('video_customfield3', ''); + $title4 = variable_get('video_customfield4', ''); + $title5 = variable_get('video_customfield5', ''); + $title6 = variable_get('video_customfield6', ''); + //Only display the custom fields group if atleast one field has a title. + if ($title1 . $title2 . $title3 . $title4 . $title5 . $title6 != '') { + $form['customfields'] = array('#type' => 'fieldset', '#title' => variable_get('video_customfieldtitle', 'Custom Fields'), '#collapsible' => TRUE, '#collapsed' => variable_get('video_customgroupcollapsed', FALSE), '#weight' => -17); + //If the custom field title is not blank, then display it. + if ($title1 != '') { + $form['customfields']['custom_field_1'] = array( + '#type' => 'textfield', '#title' => $title1, '#maxlength' => 250, '#default_value' => $node->custom_field_1); + } + if ($title2 != '') { + $form['customfields']['custom_field_2'] = array( + '#type' => 'textfield', '#title' => $title2, '#maxlength' => 250, '#default_value' => $node->custom_field_2); + } + if ($title3 != '') { + $form['customfields']['custom_field_3'] = array( + '#type' => 'textfield', '#title' => $title3, '#maxlength' => 250, '#default_value' => $node->custom_field_3); + } + if ($title4 != '') { + $form['customfields']['custom_field_4'] = array( + '#type' => 'textfield', '#title' => $title4, '#maxlength' => 250, '#default_value' => $node->custom_field_4); + } + if ($title5 != '') { + $form['customfields']['custom_field_5'] = array( + '#type' => 'textarea', '#title' => $title5, '#rows' => 4, '#default_value' => $node->custom_field_5); + } + if ($title6 != '') { + $form['customfields']['custom_field_6'] = array( + '#type' => 'textarea', '#title' => $title6, '#rows' => 4, '#default_value' => $node->custom_field_6); + } + } + } +} + + +/** + * Implementation of hook_nodeapi() + */ +function video_customfields_nodeapi(&$node, $op, $teaser) { + if($node->type == 'video') { + switch ($op) { + case 'view': + //If the main node view is being displayed then add the extra video information. + if ($teaser == FALSE) { + + if (($node->custom_field_1 . $node->custom_field_2 . $node->custom_field_3 . $node->custom_field_4 . $node->custom_field_5 . $node->custom_field_6) != '') { //Make sure there is data to display. + //Add the HTML formatted output of the custom fields to the bottom. + $node->body .= theme('video_customfields', $node); + } + } + break; + } + } +} + + +/** + * Display custom fields on the view page. + * + * @param $node + * object with node information + * + * @return + * string of content to display + */ +function theme_video_customfields($node) { + //Adds the custom fields. + $group_title = variable_get('video_customfieldtitle', ''); //Title of the custom fields. + $title1 = variable_get('video_customfield1', ''); + $title2 = variable_get('video_customfield2', ''); + $title3 = variable_get('video_customfield3', ''); + $title4 = variable_get('video_customfield4', ''); + $title5 = variable_get('video_customfield5', ''); + $title6 = variable_get('video_customfield6', ''); + //Run the fields through the input filter set for the node, then remove paragraphs. + //Removes the <p> and </p> tags from the filter pass return. This allows each field to be on one line. + //A better system might be to remove only the first and last <p></P> tags. + $field1 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_1, $node->format, FALSE)); + $field2 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_2, $node->format, FALSE)); + $field3 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_3, $node->format, FALSE)); + $field4 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_4, $node->format, FALSE)); + $field5 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_5, $node->format, FALSE)); + $field6 = str_replace(array('<p>', '</p>'), '', check_markup($node->custom_field_6, $node->format, FALSE)); + + $output = ''; + //Make sure all the titles are not blank, if not then display them. + if (($title1 . $title2 . $title3 . $title4 . $title5 . $title6) != '') { + $output = '<div class="videofields">'; //Enclose all output in "videofields" div class. + if ($group_title != '') { + $output .= '<div class="title"><h2>' . $group_title . '</h2></div>' . "\n"; + } + if ($title1 != '' and $node->custom_field_1 != '') { + $fields[] = array('title' => $title1, 'body' => $field1); + } + if ($title2 != '' and $node->custom_field_2 != '') { + $fields[] = array('title' => $title2, 'body' => $field2); + } + if ($title3 != '' and $node->custom_field_3 != '') { + $fields[] = array('title' => $title3, 'body' => $field3); + } + if ($title4 != '' and $node->custom_field_4 != '') { + $fields[] = array('title' => $title4, 'body' => $field4); + } + if ($title5 != '' and $node->custom_field_5 != '') { + $fields[] = array('title' => $title5, 'body' => $field5); + } + if ($title6 != '' and $node->custom_field_6 != '') { + $fields[] = array('title' => $title6, 'body' => $field6); + } + $output .= theme('video_fields', $fields); //Generate all the fields HTML. + + $output .= '</div><br />'; //Close the "videofields" class div. + } + return $output; +} + + diff --git a/plugins/video_image/video_image.module b/plugins/video_image/video_image.module new file mode 100644 index 0000000..59795cf --- /dev/null +++ b/plugins/video_image/video_image.module @@ -0,0 +1,145 @@ +<?php +// $Id$ + +/** + * @file + * Enable image support for video module. + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + +/** + * Implementation of hook_help(). + */ +function video_image_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable thumbnails support for video module.'); + } +} + + +/** + * Implementation of hook_form_alter() + */ +function video_image_form_alter($form_id, &$form) { + + if($form_id == 'video_node_form' && isset($form['video'])) { + + $form['image'] = array('#type' => 'fieldset', '#title' => t('Image thumbnails'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => -17, '#description' => t('Use this form to upload an image.')); + + + if (function_exists('_image_check_settings')) { + _image_check_settings(); + $node = $form['#node']; + $form['#attributes'] = array("enctype" => "multipart/form-data"); + + if ($node->iid) { + $image = node_load($node->iid); + $form['image']['image_thumbnail'] = array('#type' => 'item', '#title' => t('Thumbnail'), '#value' => image_display($image, 'thumbnail')); + } + $value = ($node->new_image) ? '#value' : '#default_value'; + $form['image']['iid'] = array('#type' => 'hidden' , $value => $node->iid); + $form['image']['image'] = array('#type' => 'file', '#title' => t('Image')); + $form['image']['image_title'] = array('#type' => 'textfield', '#title' => t('Image title'), '#default_value' => ''); + } + } + +} + + +/** + * Implementation of hook_nodeapi() + */ +function video_image_nodeapi(&$node, $op, $teaser) { + if($node->type == 'video') { + switch ($op) { + case 'submit': + $node->serial_data['iid'] = $node->iid; + break; + case 'prepare': + $image->title = $_POST['edit']['image_title']; + $image->uid = $node->uid; + $image->name = $node->name; + $image->created = $node->created; + $image->type = 'image'; + image_prepare($image, 'image'); + if ($image->images) { + node_validate($image); + if (!form_get_errors()) { + $image = node_submit($image); + node_save($image); + $node->iid = $image->nid; + $node->new_image = TRUE; + } + } + elseif ($_POST['edit']['iid']) { + $node->iid = $_POST['edit']['iid']; + } + break; + + case 'view': + //print_r($node); + if($teaser) { + if ($node->serial_data['image_teaser'] || $node->serial_data['iid']) { //If we are dealing with a teaser. + $node->teaser = theme('video_image_teaser', $node); + } + } + else { + if ($node->serial_data['image_view'] || $node->serial_data['iid']) { + $node->body = theme('video_image_body', $node) . $node->body; + } + } + break; + } + } +} + + +/** + * Render the output for the node teaser. + * + * @param $node + * object with node information + * + * @return + * string of content to display + */ +function theme_video_image_teaser($node) { + if($node->serial_data['iid']) { + $image = node_load($node->serial_data['iid']); + $image = image_display($image, 'thumbnail', array('class' => 'video_image_teaser')); + } + else { + $image = theme('image', $node->serial_data['image_teaser'], $node->title, $node->title, array('class' => 'video_image_teaser'), FALSE); + } + $output .= l($image, "node/$node->nid", array(), NULL, NULL, FALSE, TRUE); //Create a link with an image in it. + $output .= $node->teaser . '<br class="video_image_clear" />'; + return $output; +} + + +/** + * Generates the image HTML displayed in the Node body. + * + * @param $node + * object with node information + * + * @return + * string of content to display + */ +function theme_video_image_body($node) { + if($node->serial_data['iid']) { + $image = node_load($node->serial_data['iid']); + $image = image_display($image, 'thumbnail'); + } + else { // only for backward compatibility + $image = theme('image', $node->serial_data['image_view'], $node->title, $node->title, array('class' => 'video_image_view'), FALSE); //Create image HTML + } + $output = l($image, "node/$node->nid/play", array('title' => t('play') . ' ' . $node->title), NULL, NULL, FALSE, TRUE); //Create link HTML with image in it. + + return $output; +} + +?> diff --git a/plugins/video_multidownload/video_multidownload.module b/plugins/video_multidownload/video_multidownload.module new file mode 100644 index 0000000..03027bf --- /dev/null +++ b/plugins/video_multidownload/video_multidownload.module @@ -0,0 +1,303 @@ +<?php +// $Id$ + +/** + * @file + * Enable multiple file download in video module. + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + +/** + * Implementation of hook_help(). + */ +function video_multidownload_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable multiple file download in video module.'); + } +} + + +/** + * Implementation of hook_menu(). + * + * @param $may_cache + * boolean indicating whether cacheable menu items should be returned + * + * @return + * array of menu information + */ +function video_multidownload_menu($may_cache) { + $items = array(); + if ($may_cache) { + ; // for further uses + } + else { + if (arg(0) == 'node' && is_numeric(arg(1))) { + if ($node = node_load(arg(1)) and $node->type == 'video') { + if(isset($node->disable_multidownload) && + !$node->disable_multidownload) { + $items[] = array('path' => 'node/'.arg(1).'/multidownload', + 'title' => t('download other formats'), + 'callback' => 'video_multidownload_download', + 'access' => user_access('access video'), + 'weight' => 7, + 'type' => MENU_LOCAL_TASK); + } + } + } + } + return $items; +} + + +/** + * Implementation of hook_perm(). + */ +function video_multidownload_perm() { + return array('create multi-file downloads'); +} + + +/** + * Implementation of hook_form_alter() + * We use this to add multidownload fields to the video creation form. + */ +function video_multidownload_form_alter($form_id, &$form) { + + if ($form_id == 'video_node_form' && isset($form['video']) && user_access('create multi-file downloads')) { + + $node = $form['#node']; + + $form['multi-file'] = array( + '#type' => 'fieldset', + '#title' => t('Multiple files in download tab'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => -18, + '#description' => t('These options allow you to have multiple files shown on the download page. This is useful for allowing users to download different file sizes and video formats. ') . l(t('More information.'), 'video/help', NULL, NULL, 'multi-download') + ); + $form['multi-file']['disable_multidownload'] = array( + '#type' => 'checkbox', + '#title' => t('Disable multi-file downloads'), + '#default_value' => isset($node->disable_multidownload) ? $node->disable_multidownload : 1, + '#description' => t('Disables multi-file downloads for this video only.') + ); + $form['multi-file']['download_folder'] = array( + '#type' => 'textfield', + '#title' => t('Multi-file download folder'), + '#default_value' => $node->download_folder, + '#maxlength' => 250, + '#description' => t('Enter the folder containing your videos. It must be relative from the drupal directory. If the absolute path is "C:\inetpub\drupal\videos\projectfolder\" or "/usr/htdocs/drupal/videos/projectfolder/" then enter something like "videos/projectfolder/".')); + $form['multi-file']['use_play_folder'] = array( + '#type' => 'checkbox', + '#title' => t('Show files in "play" folder'), + '#default_value' => $node->use_play_folder, + '#description' => t('Display videos in the same directory as the "play" video. If folder above is entered this will be in addition.')); + } +} + + + +function video_multidownload_download() { + if ($node = node_load(arg(1))) { + if (variable_get("video_multidownload", 0) == 0 or $node->disable_multidownload == 1) { + + } + else if (arg(3) != '') { //If we are passed an encoded URL redirect to the downloader. + _video_download_goto(arg(3), $node->vid, TRUE); + } + else { //Multiple file downloads is turned on. + $download_error = FALSE; //Initialize and clear the error flag. + $node->file_array = array(); //Initialize the final file array. + global $base_url; + $full_download_folder = getcwd() . '/' . $node->download_folder; //Get absolute path to folder. + //If the download folder is set and valid scan it for files. + if ($node->download_folder != '' and file_exists($full_download_folder)) { + $scan_download_folder = _video_multidownload_scandir($full_download_folder); //Get array of file names in the directory. + $scan_download_folder['local_dir'] = $full_download_folder; //For getting filesize. + $scan_download_folder['dir_stub'] = $node->download_folder; //To put in the URL. + $folder_array[] = $scan_download_folder; + + } + //If option is set to use "play" folder and it exists, scan it for files. + $play_dir_stub = str_replace(basename($node->vidfile), "", $node->vidfile); //Remove the filename from the play file to get directory. + $play_dir = getcwd() . '/' . $play_dir_stub; //Get the local directory path where the file is kept. + if ($node->use_play_folder == 1 and file_exists($play_dir) and $play_dir_stub != '/') { //Make sure play stub won't allow scanning base drupal directory. + $scan_play_folder = _video_scandir($play_dir); + $scan_play_folder['local_dir'] = $play_dir; //For getting filesize. + $scan_play_folder['dir_stub'] = $play_dir_stub; //To put in the URL. + $folder_array[] = $scan_play_folder; + } + + if (count($folder_array) > 0) { //Make sure we have a folder to scan. + foreach ($folder_array as $dir_scan) { //Scan through one or both folders results. + foreach ($dir_scan as $file) { //Go through each file in the directory. + if (is_file($dir_scan['local_dir'] . "/" . $file)) { //Make sure it's a valid file. + //Checks the new file with the files already in the array to eliminate dupes. + $match = false; + foreach ($node->file_array as $file_array_file) { + if ($file_array_file['file'] == $file) { //If the file is already in the array. + $match = TRUE; + } + } //If we get here with $match still set FALSE we don't have a dupe. + + $file_ext = substr($file, strrpos($file, '.') + 1); //Get the file extension. + $ext_array = explode(',', variable_get('video_download_ext', 'mov,wmv,avi')); + + if (!$match and in_array($file_ext, $ext_array)) { //Only add file if it's not already in the array and it's extension shouldn't be hidden. + $file_array_size[] = filesize($dir_scan['local_dir'] . $file); //Create an array of the file sizes for sorting. + + global $base_url; + $file_url = $base_url . '/' . $dir_scan['dir_stub'] . $file; //Generate absolute URL to video. + $file_url = str_replace(' ', '%20', $file_url); //Replace any spaces in filename. + $encoded_url = base64_encode($file_url); //Encode URL to base64 MIME value so it can be passed in URL. + $encoded_url = str_replace('/', '-', $encoded_url); //Replace "/" with "-" so it doesn't mess up the URL. + + $node->file_array[] = array( 'file' => $file + , 'type' => $file_ext + , 'size' => filesize($dir_scan['local_dir'] . $file) + , 'encoded_url' => $encoded_url + ); + } + } //Close the valid file check. + } //Close the directory scan. + } //Close scan location array. + + if (count($node->file_array) > 0) { //Make sure atleast 1 file was found. + array_multisort($file_array_size, SORT_ASC, $node->file_array); //Sort based of file size. + + } + else { //Else if no files were found in the directory. + $download_error = TRUE; + } + } + else { //Else if we have no valid folders to scan. + $download_error = TRUE; + } + + //If there was no error send the files array to the theme function for display. + if($download_error == FALSE) { + print theme('video_multidownload_download', $node); //Print to the screen from the theme_video_download function. + } + else { //Else if there is an error download the play file. + _video_download_goto($node->vidfile, $node->vid); + } + + } //Close multi-file downloads is turned on. + } +} + + +/** + * Outputs the HTML for the download page when multi-file download are turned on. + * + * @param $node + * object with node information + * + * @return + * string of content to display + */ +function theme_video_multidownload_download($node) { + $output = ''; + //Replace some common file types with full name and links. + $find = array('mov', 'wmv', 'rm', 'avi', 'zip', 'divx', 'flv'); + $replace = array('<a href="http://www.apple.com/quicktime" title="'. t('QuickTime Homepage') . '">' . t('Quicktime') . '</a>' + , '<a href="http://www.microsoft.com/windowsmedia" title="'. t('Windows Media Homepage') . '">' . t('Windows Media') . '</a>' + , '<a href="http://www.real.com" title="'. t('Real Media Homepage') . '">' . t('Real Media') . '</a>' + , '<a href="http://en.wikipedia.org/wiki/AVI" title="'. t('AVI Information at wikipedia.org') . '">' . t('AVI') . '</a>' + , '<a href="http://en.wikipedia.org/wiki/ZIP_file_format" title="'. t('ZIP Information at wikipedia.org') . '">' . t('ZIP') . '</a>' + , '<a href="http://www.divx.com" title="'. t('Divx Homepage') . '">' . t('DIVX') . '</a>' + , '<a href="http://www.macromedia.com/go/getflashplayer" title="'. t('Macromedia Flash Homepage') . '">' .t('Flash FLV') . '</a>' + ); + $output .= '<br /><div class="videodownload">'; //Enclose all HTML in "videodownload" class. + foreach($node->file_array as $file) { //Goes through the array of video files and gets them ready for display. + $file_type = str_replace($find, $replace, $file['type']); //Match and replace common file types. + $link = l($file['file'], "node/$node->nid/multidownload/" . $file['encoded_url']); //Create link to download file. + $file_array_table[] = array($link, format_size($file['size']), $file_type); //Create table row. + } + $headers = array(t('File Link'), t('File Size'), t('File Type')); + $output .= theme_table($headers, $file_array_table); //Create the table of files. + $output .= '</div>'; //Close the "videodownload" class. + + //Adds a breadcrumb back to view on the download page. This may not be needed but some better breadcrumbs are. + $breadcrumb = drupal_get_breadcrumb(); + $breadcrumb[] = l(t('View'), "node/$node->nid"); + drupal_set_breadcrumb($breadcrumb); + + drupal_set_title(t('Downloading').' '.$node->title); + return theme("page", $output); +} + + + +/** + * Scans a directory and returns an array of all the filenames in the directory. + * This function is only necessary to maintain PHP 4 support. + * + * @param $dir + * The directory. Can be an absolute path or relative from the current working directory. + * + * @return + * array of filenames. + */ +function _video_multidownload_scandir($dir) { + //Try a few different ways to open the directory. + if (is_dir($dir)) { + $dir_open = opendir($dir); + } + else if (is_dir($new_dir = getcwd() . $dir)) { + $dir_open = opendir($new_dir); + } + else if (is_dir($new_dir = getcwd() . '/' . $dir)) { + $dir_open = opendir($new_dir); + } + else { //If directory does not exist. + return FALSE; + } + if (!$dir_open) { //If opendir returned false then return false. + return FALSE; + } + //If it makes it this far $dir_open should be valid. + while (($dir_content = readdir($dir_open)) !== FALSE) { + $files[] = $dir_content; + } + return $files; +} + + +/** + * Forward user directly to the file for downloading + * + * @param $input_url + * string should be either a base64 encoded absolute URL, relative URL, or absolute URL. + * + * @param $vid + * integer node version ID of the node to have it's download counter updated. + * + * @param $base64_encoded + * boolean value determines whether the $input is base64 encoded. + * + * @return + * Nothing + */ +function _video_multidownload_download_goto($input_url, $vid, $base64_encoded) { + if (user_access('download video') && $base64_encoded) { + + $encoded_url = str_replace('-', '/', $input_url); //Replace "-" to "/" for MIME base64. + $location = base64_decode($encoded_url); + + if (variable_get('video_downloadcounter', 1)) { + db_query("UPDATE {video} SET download_counter = download_counter + 1 where vid = '%d'", $vid); //Increment download counter. + } + + header("Location: $location"); //Redirect to the video files URL. + } + else { //If the user does not have access to download videos. + drupal_set_message(t('You do not have permission to download videos.'), 'error'); + $node = node_load(array('vid' => $vid)); //Load a node with the $vid so we can get the nid. + drupal_goto("node/$node->nid"); //Use the nid we just loaded to go back to the node page. + } +} diff --git a/plugins/video_optmetadata/video_optmetadata.module b/plugins/video_optmetadata/video_optmetadata.module new file mode 100644 index 0000000..f3764d2 --- /dev/null +++ b/plugins/video_optmetadata/video_optmetadata.module @@ -0,0 +1,134 @@ +<?php +// $Id$ + +/** + * @file + * Enable addition of optional metadata on video nodes created by video module. + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + +/** + * Implementation of hook_help(). + */ +function video_optmetadata_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable addition of optional metadata on video nodes created by video module. Optional metadata are Video Bitrate, Audio Bitrate, Audio Sampling Rate and Audio Channels.'); + } +} + + +/** + * Implementation of hook_perm(). + */ +function video_optmetadata_perm() { + return array('insert optional metadata'); +} + + + +/** + * Implementation of hook_form_alter() + * We use this to add some fields to the video creation form. + * In those fields users will be able to insert some video metadatas. + */ +function video_optmetadata_form_alter($form_id, &$form) { + + if($form_id == 'video_node_form' && isset($form['video']) && user_access('insert optional metadata')) { + + // get node object + $node = $form['#node']; + // Optional Video Metadata. We display this group expanded only if displaying of optional metadata is enabled. + $form['metadata'] = array( + '#type' => 'fieldset', + '#title' => t('Optional Metadata'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, + '#weight' => -16, + '#description' => t('Insert here the metadata informations.') + ); + $form['metadata']['video_bitrate'] = array( + '#type' => 'textfield', + '#title' => t('Video Bitrate'), + '#length' => 11, + '#maxlength' => 11, + '#default_value' => $node->video_bitrate, + '#description' => t('Video bitrate in kbits/sec.') + ); + $form['metadata']['audio_bitrate'] = array( + '#type' => 'textfield', + '#title' => t('Audio Bitrate'), + '#length' => 11, + '#maxlength' => 11, + '#default_value' => $node->audio_bitrate, + '#description' => t('Audio bitrate in kbits/sec.') + ); + $form['metadata']['audio_sampling_rate'] = array( + '#type' => 'select', + '#title' => t('Audio Sampling Rate'), + '#options' => array(0 => 'none', 8000 => '8 kHz', 11025 => '11 kHz', 16000 => '16 kHz', 22050 => '22 kHz', 32000 => '32 kHz', 44100 => '44.1 kHz', 48000 => '48 kHz', 96000 => '96 kHz', 192400 => '192 kHz'), + '#default_value' => $node->audio_sampling_rate, + '#description' => t('Integer value of audio sampling rate in Hz.') + ); + $form['metadata']['audio_channels'] = array( + '#type' => 'select', + '#title' => t('Audio Channels'), + '#options' => array('' => 'none', '5.1' => t('5.1'), 'stereo' => t('Stereo'), 'mono' => t('Mono')), + '#default_value' => $node->audio_channels + ); + // Ends Video Optional Metadata + } +} + + +/** + * Implementation of hook_nodeapi() + */ +function video_optmetadata_nodeapi(&$node, $op, $teaser) { + if($node->type == 'video') { + switch ($op) { + case 'view': + //Add the HTML formatted output of the optional video metadata to the bottom. + $node->body .= theme('video_metadata', $node); + break; + } + } +} + +/** + * Display optional metadata (Video and Audio bitrate,..) on the view page. + * + * @param $node + * object with node information + * + * @return + * string of content to display + $node->video_bitrate, $node->audio_bitrate, $node->audio_sampling_rate, $node->audio_channels, + */ +function theme_video_metadata($node) { + //Make sure atleast one fields had data. + if ($node->video_bitrate != 0 or $node->audio_bitrate != 0 or $node->audio_sampling_rate != 0 or $node->audio_channels != 0) { + $output = "\n\n<div class=\"video_metadata\">\n"; + $output .= ' <div class="title"><h2>'.t('Video Metadata')."</h2></div>\n"; + if($node->video_bitrate != 0) { + $fields[] = array('title' => t('Video Bitrate') . ':', 'body' => $node->video_bitrate . ' ' . t('kbits/sec')); + } + if($node->audio_bitrate != 0) { + $fields[] = array('title' => t('Audio Bitrate') . ':', 'body' => $node->audio_bitrate . ' ' . t('kbits/sec')); + } + if($node->audio_sampling_rate != 0) { + $fields[] = array('title' => t('Audio Sampling Rate') . ':', 'body' => $node->audio_sampling_rate . ' ' . t('Hz')); + } + if($node->audio_channels != '') { + $fields[] = array('title' => t('Audio Channels') . ':', 'body' => $node->audio_channels); + } + $output .= theme('video_fields', $fields); //Generate the fields HTML. + $output .= '</div>'; //Closing div video_metadata + } + else { //If all the fields are blank then display nothing. + $output = ''; + } + return $output; +} diff --git a/plugins/video_params/video_params.module b/plugins/video_params/video_params.module new file mode 100644 index 0000000..46fa2e3 --- /dev/null +++ b/plugins/video_params/video_params.module @@ -0,0 +1,105 @@ +<?php +// $Id$ + +/** + * @file + * Enable addition of params to object generated by video module + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + + +/** + * Implementation of hook_help(). + */ +function video_params_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable addition of html params to object generated by video module. Useful if you need to use swf videos which needs params to be passed.'); + } +} + + +/** + * Implementation of hook_perm(). + */ +function video_params_perm() { + return array('insert object params'); +} + + + + +/** + * Implementation of hook_form_alter() + * We use this to add a text area to the video creation form. + * In the text area the user will be able to insert his param value association. + */ +function video_params_form_alter($form_id, &$form) { + + if($form_id == 'video_node_form' && isset($form['video']) && user_access('insert object params')) { + + // get node object + $node = $form['#node']; + + //We must convert the array data back to something that can go in the textarea. + $textarea = ''; + if(is_array($node->serial_data['object_parameters'])) { + foreach ($node->serial_data['object_parameters'] as $param => $value) { + $textarea .= $param . '=' . $value . "\n"; + } + $textarea = substr($textarea, 0, -1); //Remove the last newline "\n" from the end. + } + $form['parameters'] = array('#type' => 'fieldset', '#title' => t('HTML object parameters'), '#collapsible' => TRUE, '#collapsed' => TRUE, '#weight' => -17); + $form['parameters']['object_parameters'] = array( + '#title' => t('Embedded object parameters'), + '#type' => 'textarea', + '#rows' => 5, + '#default_value' => $textarea, + '#description' => t('Enter the values that you would like to be embedded in <param name="param_1" value="value_1" /> tags. Each parameter should be on a seperate line with an equal sign between the parameter and its assigned value. Like param=value for example.') + ); + } +} + + +/** + * Implementation of hook_nodeapi() + */ +function video_params_nodeapi(&$node, $op, $teaser) { + if($node->type == 'video') { + switch ($op) { + case 'submit': + //Process the data in the object_parameters textarea. + if ($node->object_parameters != '') { //Make sure the textarea was not empty. + $lines = explode("\r\n", $node->object_parameters); //Make an array of each line from the textarea. + foreach ($lines as $line) { //Loop through each line. + $array = explode('=', $line); //Break apart at the "=" sign. $line should be in format param=value + $node->serial_data['object_parameters'][$array[0]] = $array[1]; //Assign the "param" as the key and "value" as the value. + } + } + break; + } + } +} + + +/** + * Implementation of hook_v_get_param() - video module specific hook + */ +function video_params_v_get_params(&$node) { + + $serial_data = $node->serial_data; + + if(is_array($serial_data) && array_key_exists('object_parameters', $serial_data) && !empty($serial_data['object_parameters'])) { + return $serial_data['object_parameters']; + } + else { + return NULL; + } +} + + + + + diff --git a/plugins/video_upload/video_upload.module b/plugins/video_upload/video_upload.module new file mode 100644 index 0000000..22f8b1c --- /dev/null +++ b/plugins/video_upload/video_upload.module @@ -0,0 +1,304 @@ +<?php +// $Id$ + +/** + * @file + * Enable Video files uploading in video module + * + * @author Fabio Varesano <fvaresano at yahoo dot it> + */ + + +/** + * Implementation of hook_help(). + */ +function video_upload_help($section) { + switch ($section) { + case 'admin/modules#description': + return t('Enable video files uploading in video module.'); + } +} + + +/** + * Settings Hook + * + * @return + * string of form content or error message + */ +function video_upload_settings() { + //Must have "administer site configuration" and "administer video" privilages. + if (!user_access('administer video')) { + drupal_access_denied(); + } + + $form = array(); + $form['video_upload_override_vidfile'] = array( + '#type' => 'checkbox', + '#title' => t('override video file'), + '#description' => t('Check this if your users must only submit videos throught uploading. This disable path insertion.'), + '#default_value' => variable_get('video_upload_override_vidfile', false), + ); + $form['video_upload_uploadable_extensions'] = array( + '#type' => 'textfield', + '#title' => t('uploadable extensions'), + '#description' => t('Insert here a comma separated list of extensions you want to enable for upload.'), + '#default_value' => variable_get('video_upload_uploadable_extensions', ''), + ); + + + return $form; +} + + +/** + * Implementation of hook_perm(). + */ +function video_upload_perm() { + return array('upload video files'); +} + + +/** + * Implementation of hook_nodeapi() + */ +function video_upload_nodeapi(&$node, $op, $teaser) { + switch ($op) { + + case 'load': + $output['video_upload_file'] = _video_upload_load($node); + $output['vidfile'] = file_create_url($output['video_upload_file']->filepath); + return $output; + case 'prepare': + _video_upload_prepare($node); + break; + + case 'validate': + _video_upload_validate($node); + break; + + + case 'submit': + _video_upload_submit($node); + break; + + case 'insert': + case 'update': + _video_upload_store($node); + break; + + case 'delete': + ; + break; + + case 'delete revision': + video_upload_delete_revision($node); + break; + + + + } +} + + +/** + * Implementation of hook_form_alter() + * We use this to add a file upload field to the video creation form. + */ +function video_upload_form_alter($form_id, &$form) { + + if($form_id == 'video_node_form' && isset($form['video']) && user_access('upload video files')) { + + //get node object from form + $node = $form['#node']; + + // required for upload to work + $form['#attributes']['enctype'] = 'multipart/form-data'; + + if(variable_get('video_upload_override_vidfile', false)) { + // remove unnecessary fields + $form['video']['vidfile'] = NULL; + $form['video']['filesize'] = NULL; + $form['video'] += _video_upload_form($node); + } + else { + // vidfile field is no more required while upload is enabled. + $form['video']['vidfile']['#required'] = FALSE; + + $form['video']['vidfile']['#description'] .= '<p>' . t('If you want to upload a video simply ignore this field and select your video file at the "Upload video file" field.') . '</p>'; + $form['video']['video_upload'] = array( + '#type' => 'fieldset', + '#title' => t('Upload video'), + '#weight' => -19, + '#collapsible' => TRUE, + '#collapsed' => TRUE, + ); + + $form['video']['video_upload'] += _video_upload_form($node); + } + } +} + + +function _video_upload_load(&$node) { + if ($node->vid) { + $result = db_query('SELECT * FROM {files} f INNER JOIN {file_revisions} r ON f.fid = r.fid WHERE r.vid = %d ORDER BY f.fid DESC', $node->vid); + return db_fetch_object($result); + } +} + + +/** + * Validate video file + */ +function _video_upload_validate(&$node) { + // if we override the default video module vidfile field and we don't have a file uploaded set error + if (variable_get('video_upload_override_vidfile', false) && !isset($node->video_upload_file) && !isset($_SESSION['video_upload_file'])) { + form_set_error('video_upload_file', t('A file must be provided.')); + return; + } +} + + +function _video_upload_submit(&$node) { + ; +} + + +function _video_upload_prepare(&$node) { + // clear video file informations + if(count($_POST) == 0) { + if (!empty($_SESSION['video_upload_file'])) { + file_delete($_SESSION['video_upload_file']->filepath); + } + unset($_SESSION['video_upload_file']); + } + + + if ($file = file_check_upload('video_upload_file')) { + $temppath = file_directory_temp() . '/video/'; + file_check_directory($temppath, TRUE); + $node->video_upload_file = file_save_upload($file, $temppath .'/'. $file->filename, FILE_EXISTS_REPLACE); + $node->video_upload_file->newfile = TRUE; + + $_SESSION['video_upload_file'] = $node->video_upload_file; + } + else if (!empty($_SESSION['video_upload_file'])) { + $node->video_upload_file = $_SESSION['video_upload_file']; + } else { + $_SESSION['video_upload_file'] = $node->video_upload_file; + } +} + + +function _video_upload_store(&$node) { + if(!empty($_SESSION['video_upload_file'])) { + $file = $_SESSION['video_upload_file']; + $dest_dir = variable_get('video_upload_default_path', 'videos') .'/'; + if ($file = file_save_upload($file, $dest_dir . $file->filename)) { + $file = $_SESSION['video_upload_file']; + $file->fid = db_next_id('{files}_fid'); + db_query("INSERT INTO {files} (fid, nid, filename, filepath, filemime, filesize) VALUES (%d, %d, '%s', '%s', '%s', %d)", $file->fid, $node->nid, $file->filename, $file->filepath, $file->filemime, $file->filesize); + db_query("INSERT INTO {file_revisions} (fid, vid, list, description) VALUES (%d, %d, %d, '%s')", $file->fid, $node->vid, $file->list, $file->description); + unset($_SESSION['video_upload_file']); + } + + } +} + + +/** +* Create video upload specific form fields +*/ +function _video_upload_form($node) { + _video_upload_check_settings(); + + $form = array(); + + $form['video_upload_file'] = array( + '#type' => 'file', + '#title' => t('Upload video file'), + '#size' => 40, + '#weight' => -19, + '#description' => t('The uploaded file will be used as video file for this node.<br /><b>NOTE:</b> The max upload size is') . ' ' . format_size(_video_upload_get_max_upload_size()) . '.', + ); + + if (isset($node->video_upload_file)) { + $form['video_upload_file']['#prefix'] = theme('video_upload_file_info_form', $node); + $form['video_upload_file']['#title'] = t('Replace with'); + } + + return $form; +} + + +/** + * Display informations about already uploaded file + */ +function theme_video_upload_file_info_form(&$node) { + $output = '<p>' . t('A video file has been already uploaded.') . '</p>'; + + // create array containing uploaded file informations + $items = array( + '<b>'. t('file name') .':</b> ' . $node->video_upload_file->filename, + '<b>'. t('file path') .':</b> ' . $node->video_upload_file->filepath, + '<b>'. t('file size') .':</b> ' . format_size($node->video_upload_file->filesize), + '<b>'. t('file mime') .':</b> ' . $node->video_upload_file->filemime, + ); + + // create information list + $output .= theme_item_list($items, t('uploaded video informations:')); + + return $output; +} + + +/** + * Check PHP's post_max_size and upload_max_filesize settings and determine + * the maximum size of a file upload. + * (code from audio.module) + * @return an integer number of bytes + */ +function _video_upload_get_max_upload_size() { + $limits = array(); + foreach (array('upload_max_filesize', 'post_max_size') as $setting) { + // the post_max_size and upload_max_filesize settings could be a string + // ('2m', '1G') or an integer (2097152 or 1073741824). + $val = ini_get($setting); + if (!is_numeric($val)) { + // separate the numeric and alpha parts, then get to multiplying + $val = trim($val); + $last = strtolower($val{strlen($val)-1}); + switch($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + } + $limits[] = $val; + } + // the smallest value will be the limiting factor so retun it. + return min($limits); +} + + +/** + * Verify the video_upload module settings. + */ +function _video_upload_check_settings() { + // File paths + $video_path = file_create_path(variable_get('video_upload_default_path', 'videos')); + $temp_path = rtrim($video_path, '/') . '/temp'; + + if (!file_check_directory($video_path, FILE_CREATE_DIRECTORY, 'video_upload_default_path')) { + return false; + } + if (!file_check_directory($temp_path, FILE_CREATE_DIRECTORY, 'video_upload_default_path')) { + return false; + } + + return true; +} |