aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/video_customfields/video_customfields.module225
-rw-r--r--plugins/video_image/video_image.module145
-rw-r--r--plugins/video_multidownload/video_multidownload.module303
-rw-r--r--plugins/video_optmetadata/video_optmetadata.module134
-rw-r--r--plugins/video_params/video_params.module105
-rw-r--r--plugins/video_upload/video_upload.module304
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 &#60;param name="param_1" value="value_1" /&#62; 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;
+}