/**
  * trigger function.
  *
  * @access private
  *
  * @param mixed $download
  *
  * @return void
  */
 private function trigger($download)
 {
     $version = $download->get_file_version();
     $file_paths = $version->mirrors;
     // Check if we got files in this version
     if (empty($file_paths)) {
         wp_die(__('No file paths defined.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage &rarr;', 'download-monitor') . '</a>', __('Download Error', 'download-monitor'));
     }
     // Get a random file (mirror)
     $file_path = $file_paths[array_rand($file_paths)];
     // Check if we actually got a path
     if (!$file_path) {
         wp_die(__('No file paths defined.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage &rarr;', 'download-monitor') . '</a>', __('Download Error', 'download-monitor'));
     }
     // Check Access
     if (!apply_filters('dlm_can_download', true, $download, $version)) {
         // Check if we need to redirect if visitor don't have access to file
         if ($redirect = apply_filters('dlm_access_denied_redirect', false)) {
             wp_redirect($redirect);
             exit;
         } else {
             // get 'no access' page id
             $no_access_page_id = get_option('dlm_no_access_page', 0);
             // check if a no access page is set
             if ($no_access_page_id > 0) {
                 // get permalink of no access page
                 $no_access_permalink = get_permalink($no_access_page_id);
                 // check if we can find a permalink
                 if (false !== $no_access_permalink) {
                     // append download id to no access URL
                     $no_access_permalink = untrailingslashit($no_access_permalink) . '/download-id/' . $download->id . '/';
                     // redirect to no access page
                     wp_redirect($no_access_permalink);
                     exit;
                     // out
                 }
             }
             // if we get to this point, we have no proper 'no access' page. Fallback to default wp_die
             wp_die(wp_kses_post(get_option('dlm_no_access_error', '')), __('Download Error', 'download-monitor'), array('response' => 200));
         }
         exit;
     }
     // check if user downloaded this version in the past minute
     if (false == DLM_Cookie_Manager::exists($download)) {
         // DLM Logging object
         $logger = new DLM_Logging();
         // bool if we need to increment download count
         $increment_download_count = true;
         // check if unique ips option is enabled and if so, if visitor already downloaded this file version
         if ($logger->is_logging_enabled() && $logger->is_count_unique_ips_only() && true === $logger->has_ip_downloaded_version($version)) {
             $increment_download_count = false;
         }
         // check if we need to increment the download count
         if (true === $increment_download_count) {
             // Increase download count
             $version->increase_download_count();
         }
         // Trigger Download Action
         do_action('dlm_downloading', $download, $version, $file_path);
         // Set cookie to prevent double logging
         DLM_Cookie_Manager::set_cookie($download);
     }
     // Redirect to the file...
     if ($download->redirect_only() || apply_filters('dlm_do_not_force', false, $download, $version)) {
         $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version);
         // Ensure we have a valid URL, not a file path
         $file_path = str_replace(ABSPATH, site_url('/', 'http'), $file_path);
         header('Location: ' . $file_path);
         exit;
     }
     // File Manager
     $file_manager = new DLM_File_Manager();
     // Parse file path
     list($file_path, $remote_file) = $file_manager->parse_file_path($file_path);
     $this->download_headers($file_path, $download, $version);
     if (get_option('dlm_xsendfile_enabled')) {
         if (function_exists('apache_get_modules') && in_array('mod_xsendfile', apache_get_modules())) {
             $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version);
             header("X-Sendfile: {$file_path}");
             exit;
         } elseif (stristr(getenv('SERVER_SOFTWARE'), 'lighttpd')) {
             $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version);
             header("X-LIGHTTPD-send-file: {$file_path}");
             exit;
         } elseif (stristr(getenv('SERVER_SOFTWARE'), 'nginx') || stristr(getenv('SERVER_SOFTWARE'), 'cherokee')) {
             $this->log('download', 'redirected', __('Redirected to file', 'download-monitor'), $download, $version);
             $file_path = str_ireplace($_SERVER['DOCUMENT_ROOT'], '', $file_path);
             header("X-Accel-Redirect: /{$file_path}");
             exit;
         }
     }
     // multipart-download and download resuming support - http://www.phpgang.com/force-to-download-a-file-in-php_112.html
     if (isset($_SERVER['HTTP_RANGE']) && $version->filesize) {
         list($a, $range) = explode("=", $_SERVER['HTTP_RANGE'], 2);
         list($range) = explode(",", $range, 2);
         list($range, $range_end) = explode("-", $range);
         $range = intval($range);
         if (!$range_end) {
             $range_end = $version->filesize - 1;
         } else {
             $range_end = intval($range_end);
         }
         $new_length = $range_end - $range;
         header("HTTP/1.1 206 Partial Content");
         header("Content-Length: {$new_length}");
         header("Content-Range: bytes {$range}-{$range_end}/{$version->filesize}");
     } else {
         $range = false;
     }
     if ($this->readfile_chunked($file_path, $range)) {
         // Complete!
         $this->log('download', 'completed', '', $download, $version);
     } elseif ($remote_file) {
         // Redirect - we can't track if this completes or not
         $this->log('download', 'redirected', __('Redirected to remote file.', 'download-monitor'), $download, $version);
         header('Location: ' . $file_path);
     } else {
         $this->log('download', 'failed', __('File not found.', 'download-monitor'), $download, $version);
         wp_die(__('File not found.', 'download-monitor') . ' <a href="' . home_url() . '">' . __('Go to homepage &rarr;', 'download-monitor') . '</a>', __('Download Error', 'download-monitor'), array('response' => 404));
     }
     exit;
 }
    /**
     * media_browser function.
     *
     * @access public
     * @return void
     */
    public function media_browser()
    {
        // File Manager
        $file_manager = new DLM_File_Manager();
        // Files
        $files = $file_manager->list_files(ABSPATH, 1);
        echo '<!DOCTYPE html><html lang="en"><head><title>' . __('Browse for a file', 'download-monitor') . '</title>';
        wp_enqueue_style('download_monitor_admin_css', WP_DLM::get_plugin_url() . '/assets/css/admin.css', array('dashicons'));
        do_action('admin_print_styles');
        do_action('admin_print_scripts');
        do_action('admin_head');
        echo '<meta charset="utf-8" /></head><body>';
        echo '<ul class="download_monitor_file_browser">';
        foreach ($files as $found_file) {
            $file = pathinfo($found_file['path']);
            if ($found_file['type'] == 'folder') {
                echo '<li><a href="#" class="folder" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>';
            } else {
                $filename = $file['basename'];
                $extension = empty($file['extension']) ? '' : $file['extension'];
                if (substr($filename, 0, 1) == '.') {
                    continue;
                }
                // Ignore files starting with . like htaccess
                if (in_array($extension, array('', 'php', 'html', 'htm', 'tmp'))) {
                    continue;
                }
                // Ignored file types
                echo '<li><a href="#" class="file filetype-' . sanitize_title($extension) . '" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>';
            }
        }
        echo '</ul>';
        ?>
		<script type="text/javascript">
			jQuery( function () {
				jQuery( '.download_monitor_file_browser' ).on( 'click', 'a', function () {

					var $link = jQuery( this );
					var $parent = $link.closest( 'li' );

					if ( $link.is( '.file' ) ) {

						var win = window.dialogArguments || opener || parent || top;

						win.send_to_editor( $link.attr( 'data-path' ) );

					} else if ( $link.is( '.folder_open' ) ) {

						$parent.find( 'ul' ).remove();
						$link.removeClass( 'folder_open' );

					} else {

						$link.after( '<ul class="load_tree loading"></ul>' );

						var data = {
							action: 'download_monitor_list_files',
							path: jQuery( this ).attr( 'data-path' ),
							security: '<?php 
        echo wp_create_nonce("list-files");
        ?>
'
						};

						jQuery.post( '<?php 
        echo admin_url('admin-ajax.php');
        ?>
', data, function ( response ) {

							$link.addClass( 'folder_open' );

							if ( response ) {
								$parent.find( '.load_tree' ).html( response );
							} else {
								$parent.find( '.load_tree' ).html( '<li class="nofiles"><?php 
        _e('No files found', 'download-monitor');
        ?>
</li>' );
							}
							$parent.find( '.load_tree' ).removeClass( 'load_tree loading' );

						} );
					}
					return false;
				} );
			} );
		</script>
		<?php 
        echo '</body></html>';
    }
 /**
  * list_files function.
  *
  * @access public
  * @return void
  */
 public function list_files()
 {
     // Check Nonce
     check_ajax_referer('list-files', 'security');
     // Check user rights
     if (!current_user_can('manage_downloads')) {
         return false;
     }
     $path = esc_attr(stripslashes($_POST['path']));
     if ($path) {
         // The File Manager
         $file_manager = new DLM_File_Manager();
         // List all files
         $files = $file_manager->list_files($path);
         foreach ($files as $found_file) {
             // Multi-byte-safe pathinfo
             $file = $file_manager->mb_pathinfo($found_file['path']);
             if ($found_file['type'] == 'folder') {
                 echo '<li><a href="#" class="folder" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>';
             } else {
                 $filename = $file['basename'];
                 $extension = empty($file['extension']) ? '' : $file['extension'];
                 if (substr($filename, 0, 1) == '.') {
                     continue;
                 }
                 // Ignore files starting with . like htaccess
                 if (in_array($extension, array('', 'php', 'html', 'htm', 'tmp'))) {
                     continue;
                 }
                 // Ignored file types
                 echo '<li><a href="#" class="file filetype-' . sanitize_title($extension) . '" data-path="' . trailingslashit($file['dirname']) . $file['basename'] . '">' . $file['basename'] . '</a></li>';
             }
         }
     }
     die;
 }
 /**
  * get_file_hashes function.
  *
  * @access public
  *
  * @param string $file_path
  *
  * @return array
  */
 public function get_file_hashes($file_path)
 {
     // File Manager
     $file_manager = new DLM_File_Manager();
     // Get the hashes
     $hashes = $file_manager->get_file_hashes($file_path);
     update_post_meta($this->id, '_md5', $hashes['md5']);
     update_post_meta($this->id, '_sha1', $hashes['sha1']);
     update_post_meta($this->id, '_crc32', $hashes['crc32']);
     return $hashes;
 }
 /**
  * Fallback for PHP < 5.4 where JSON_UNESCAPED_UNICODE does not exist.
  *
  * @deprecated 1.6.0
  *
  * @param  array $matches
  *
  * @return string
  */
 public function json_unscaped_unicode_fallback($matches)
 {
     // Deprecated
     DLM_Debug_Logger::deprecated(__METHOD__);
     // File Manger
     $file_manager = new DLM_File_Manager();
     // Return files
     return $file_manager->json_unscaped_unicode_fallback($matches);
 }
    /**
     * media_browser function.
     *
     * @access public
     * @return void
     */
    public function media_browser()
    {
        // Enqueue scripts and styles for panel
        wp_enqueue_style('download_monitor_admin_css', WP_DLM::get_plugin_url() . '/assets/css/admin.css', array('dashicons'));
        wp_enqueue_script('common');
        wp_enqueue_style('global');
        wp_enqueue_style('wp-admin');
        wp_enqueue_style('colors');
        wp_enqueue_script('plupload-all');
        echo '<!DOCTYPE html><html lang="en"><head><title>' . __('Insert Download', 'download-monitor') . '</title><meta charset="utf-8" />';
        do_action('admin_print_styles');
        do_action('admin_print_scripts');
        do_action('admin_head');
        echo '<body id="insert-download" class="wp-core-ui">';
        ?>
		<h2 class="nav-tab-wrapper">
			<a href="#insert-shortcode"
			   class="nav-tab nav-tab-active"><?php 
        _e('Insert Shortcode', 'download-monitor');
        ?>
</a><a
				href="#quick-add" class="nav-tab"><?php 
        _e('Quick-add download', 'download-monitor');
        ?>
</a>
		</h2>
		<?php 
        // Handle quick-add form
        if (!empty($_POST['download_url']) && !empty($_POST['download_title']) && wp_verify_nonce($_POST['quick-add-nonce'], 'quick-add')) {
            $url = stripslashes($_POST['download_url']);
            $title = sanitize_text_field(stripslashes($_POST['download_title']));
            $version = sanitize_text_field(stripslashes($_POST['download_version']));
            try {
                $download = array('post_title' => $title, 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_type' => 'dlm_download');
                $download_id = wp_insert_post($download);
                if ($download_id) {
                    // Meta
                    update_post_meta($download_id, '_featured', 'no');
                    update_post_meta($download_id, '_members_only', 'no');
                    update_post_meta($download_id, '_redirect_only', 'no');
                    update_post_meta($download_id, '_download_count', 0);
                    // File
                    $file = array('post_title' => 'Download #' . $download_id . ' File Version', 'post_content' => '', 'post_status' => 'publish', 'post_author' => get_current_user_id(), 'post_parent' => $download_id, 'post_type' => 'dlm_download_version');
                    $file_id = wp_insert_post($file);
                    if (!$file_id) {
                        throw new Exception(__('Error: File was not created.', 'download-monitor'));
                    }
                    // File Manager
                    $file_manager = new DLM_File_Manager();
                    // Meta
                    update_post_meta($file_id, '_version', $version);
                    update_post_meta($file_id, '_filesize', $file_manager->get_file_size($url));
                    update_post_meta($file_id, '_files', $file_manager->json_encode_files(array($url)));
                    // Hashes
                    $hashes = $file_manager->get_file_hashes($url);
                    // Set hashes
                    update_post_meta($file_id, '_md5', $hashes['md5']);
                    update_post_meta($file_id, '_sha1', $hashes['sha1']);
                    update_post_meta($file_id, '_crc32', $hashes['crc32']);
                    // Success message
                    echo '<div class="updated"><p>' . __('Download successfully created.', 'download-monitor') . '</p></div>';
                } else {
                    throw new Exception(__('Error: Download was not created.', 'download-monitor'));
                }
            } catch (Exception $e) {
                echo '<div class="error"><p>' . $e->getMessage() . "</p></div>";
            }
        }
        // Get all downloads
        $downloads = get_posts(array('post_status' => 'publish', 'post_type' => 'dlm_download', 'orderby' => 'ID', 'posts_per_page' => -1));
        ?>
		<form id="insert-shortcode">

			<fieldset>
				<legend><?php 
        _e('Choose a download', 'download-monitor');
        ?>
:</legend>
				<?php 
        $limit = 10;
        $page = isset($_GET['paged']) ? absint($_GET['paged']) : 1;
        $dlm_query = new WP_Query(array('post_status' => 'publish', 'post_type' => 'dlm_download', 'posts_per_page' => $limit, 'offset' => ($page - 1) * $limit));
        while ($dlm_query->have_posts()) {
            $dlm_query->the_post();
            $download = new DLM_Download($dlm_query->post->ID);
            echo '<label><input name="download_id" class="radio" type="radio" value="' . absint($download->id) . '" /> #' . $download->id . ' &ndash; ' . $download->get_the_title() . ' &ndash; ' . $download->get_the_filename() . '</label>';
        }
        if ($dlm_query->max_num_pages > 1) {
            echo paginate_links(apply_filters('download_monitor_pagination_args', array('base' => str_replace(999999999, '%#%', get_pagenum_link(999999999, false)), 'format' => '', 'current' => $page, 'total' => $dlm_query->max_num_pages, 'prev_text' => '&larr;', 'next_text' => '&rarr;', 'type' => 'list', 'end_size' => 3, 'mid_size' => 3)));
        }
        ?>
			</fieldset>

			<p>
				<label for="template_name"><?php 
        _e('Template', 'download-monitor');
        ?>
:</label>
				<input type="text" id="template_name" value="" class="input"
				       placeholder="<?php 
        _e('Template Name', 'download-monitor');
        ?>
"/>
				<span class="description">
					<?php 
        _e('Leaving this blank will use the default <code>content-download.php</code> template file. If you enter, for example, <code>image</code>, the <code>content-download-image.php</code> template will be used instead.', 'download-monitor');
        ?>
				</span>
			</p>

			<p>
				<input type="button" class="button insert_download button-primary button-large"
				       value="<?php 
        _e('Insert Shortcode', 'download-monitor');
        ?>
"/>
			</p>

		</form>

		<form id="quick-add" action="" method="post">

			<!-- Uploader section -->
			<div id="plupload-upload-ui" class="hide-if-no-js">
				<div id="drag-drop-area" style="height:240px">
					<div class="drag-drop-inside">
						<p class="drag-drop-info"><?php 
        _e('Drop file here', 'download-monitor');
        ?>
</p>

						<p><?php 
        echo _x('or', 'Drop file here *or* select file', 'download-monitor');
        ?>
</p>

						<p class="drag-drop-buttons"><input id="plupload-browse-button" type="button"
						                                    value="<?php 
        esc_attr_e('Select File', 'download-monitor');
        ?>
"
						                                    class="button"/></p>
					</div>
				</div>
				<p><a href="#" class="add_manually"><?php 
        _e('Enter URL manually', 'download-monitor');
        ?>
 &rarr;</a>
				</p>
			</div>
			<div id="quick-add-details" style="display:none">
				<p>
					<label for="download_url"><?php 
        _e('Download URL', 'download-monitor');
        ?>
:</label>
					<input type="text" name="download_url" id="download_url" value="" class="download_url input"
					       placeholder="<?php 
        _e('Required URL', 'download-monitor');
        ?>
"/>
				</p>

				<p>
					<label for="download_title"><?php 
        _e('Download Title', 'download-monitor');
        ?>
:</label>
					<input type="text" name="download_title" id="download_title" value="" class="download_title input"
					       placeholder="<?php 
        _e('Required title', 'download-monitor');
        ?>
"/>
				</p>

				<p>
					<label for="download_version"><?php 
        _e('Version', 'download-monitor');
        ?>
:</label>
					<input type="text" name="download_version" id="download_version" value="" class="input"
					       placeholder="<?php 
        _e('Optional version number', 'download-monitor');
        ?>
"/>
				</p>

				<p>
					<input type="submit" class="button button-primary button-large"
					       value="<?php 
        _e('Save Download', 'download-monitor');
        ?>
"/>
					<?php 
        wp_nonce_field('quick-add', 'quick-add-nonce');
        ?>
				</p>
			</div>

		</form>

		<script type="text/javascript">
			jQuery( function () {

				jQuery( '.nav-tab-wrapper a' ).click( function () {
					jQuery( '#insert-shortcode, #quick-add' ).hide();
					jQuery( jQuery( this ).attr( 'href' ) ).show();
					jQuery( 'a.nav-tab-active' ).removeClass( 'nav-tab-active' );
					jQuery( this ).addClass( 'nav-tab-active' );
					return false;
				} );

				jQuery( '#quick-add' ).hide();

				jQuery( 'body' ).on( 'click', '.insert_download', function () {

					var win = window.dialogArguments || opener || parent || top;

					var download_id = jQuery( 'input[name="download_id"]:checked' ).val();
					var template = jQuery( '#template_name' ).val();
					var shortcode = '[download id="' + download_id + '"';

					if ( template )
						shortcode = shortcode + ' template="' + template + '"';

					shortcode = shortcode + ']';

					win.send_to_editor( shortcode );

					return false;
				} );

				jQuery( '.add_manually' ).click( function () {
					jQuery( '#plupload-upload-ui' ).slideUp();
					jQuery( '#quick-add-details' ).slideDown();
					return false;
				} );

				<?php 
        $plupload_init = array('runtimes' => 'html5,silverlight,flash,html4', 'browse_button' => 'plupload-browse-button', 'container' => 'plupload-upload-ui', 'drop_element' => 'drag-drop-area', 'file_data_name' => 'async-upload', 'multiple_queues' => false, 'max_file_size' => wp_max_upload_size() . 'b', 'url' => admin_url('admin-ajax.php'), 'flash_swf_url' => includes_url('js/plupload/plupload.flash.swf'), 'silverlight_xap_url' => includes_url('js/plupload/plupload.silverlight.xap'), 'filters' => array(array('title' => __('Allowed Files'), 'extensions' => '*')), 'multipart' => true, 'urlstream_upload' => true, 'multipart_params' => array('_ajax_nonce' => wp_create_nonce('file-upload'), 'action' => 'download_monitor_insert_panel_upload', 'type' => 'dlm_download'));
        // we should probably not apply this filter, plugins may expect wp's media uploader...
        $plupload_init = apply_filters('plupload_init', $plupload_init);
        ?>

				// create the uploader and pass the config from above
				var uploader = new plupload.Uploader( <?php 
        echo json_encode($plupload_init);
        ?>
 );

				// checks if browser supports drag and drop upload, makes some css adjustments if necessary
				uploader.bind( 'Init', function ( up ) {
					var uploaddiv = jQuery( '#plupload-upload-ui' );

					if ( up.features.dragdrop ) {
						uploaddiv.addClass( 'drag-drop' );

						jQuery( '#drag-drop-area' )
							.bind( 'dragover.wp-uploader', function () {
								uploaddiv.addClass( 'drag-over' );
							} )
							.bind( 'dragleave.wp-uploader, drop.wp-uploader', function () {
								uploaddiv.removeClass( 'drag-over' );
							} );

					} else {
						uploaddiv.removeClass( 'drag-drop' );
						jQuery( '#drag-drop-area' ).unbind( '.wp-uploader' );
					}
				} );

				uploader.init();

				// a file was added in the queue
				uploader.bind( 'FilesAdded', function ( up, files ) {
					var hundredmb = 100 * 1024 * 1024, max = parseInt( up.settings.max_file_size, 10 );

					plupload.each( files, function ( file ) {
						if ( max > hundredmb && file.size > hundredmb && up.runtime != 'html5' ) {
							// file size error?
						} else {
							jQuery( '.drag-drop-inside' ).html( '<p><?php 
        _e('Please wait...', 'download-monitor');
        ?>
</p>' );
						}
					} );

					up.refresh();
					up.start();
				} );

				// a file was uploaded
				uploader.bind( 'FileUploaded', function ( up, file, response ) {
					jQuery( '#quick-add-details' ).find( 'input.download_url' ).val( response.response );
					jQuery( '#quick-add-details' ).find( 'input.download_title' ).val( basename( response.response ) );
					jQuery( '#plupload-upload-ui' ).slideUp();
					jQuery( '#quick-add-details' ).slideDown();
				} );

				function basename( path ) {
					return path.split( '/' ).reverse()[ 0 ];
				}

			} );
		</script>
		<?php 
        echo '</body></html>';
    }
 /**
  * save function.
  *
  * @access public
  *
  * @param int $post_id
  * @param WP_Post $post
  *
  * @return void
  */
 public function save_meta_boxes($post_id, $post)
 {
     global $wpdb;
     // Update options
     $_featured = isset($_POST['_featured']) ? 'yes' : 'no';
     $_members_only = isset($_POST['_members_only']) ? 'yes' : 'no';
     $_redirect_only = isset($_POST['_redirect_only']) ? 'yes' : 'no';
     update_post_meta($post_id, '_featured', $_featured);
     update_post_meta($post_id, '_members_only', $_members_only);
     update_post_meta($post_id, '_redirect_only', $_redirect_only);
     $total_download_count = 0;
     // Process files
     if (isset($_POST['downloadable_file_id'])) {
         $downloadable_file_id = $_POST['downloadable_file_id'];
         $downloadable_file_menu_order = $_POST['downloadable_file_menu_order'];
         $downloadable_file_version = $_POST['downloadable_file_version'];
         $downloadable_file_urls = $_POST['downloadable_file_urls'];
         $downloadable_file_date = $_POST['downloadable_file_date'];
         $downloadable_file_date_hour = $_POST['downloadable_file_date_hour'];
         $downloadable_file_date_minute = $_POST['downloadable_file_date_minute'];
         $downloadable_file_download_count = $_POST['downloadable_file_download_count'];
         for ($i = 0; $i <= max(array_keys($downloadable_file_id)); $i++) {
             if (!isset($downloadable_file_id[$i])) {
                 continue;
             }
             $file_id = absint($downloadable_file_id[$i]);
             $file_menu_order = absint($downloadable_file_menu_order[$i]);
             $file_version = strtolower(sanitize_text_field($downloadable_file_version[$i]));
             $file_date_hour = absint($downloadable_file_date_hour[$i]);
             $file_date_minute = absint($downloadable_file_date_minute[$i]);
             $file_date = sanitize_text_field($downloadable_file_date[$i]);
             $file_download_count = sanitize_text_field($downloadable_file_download_count[$i]);
             $files = array_filter(array_map('trim', explode("\n", $downloadable_file_urls[$i])));
             if (!$file_id) {
                 continue;
             }
             // Generate a useful post title
             $file_post_title = 'Download #' . $post_id . ' File Version';
             // Generate date
             if (empty($file_date)) {
                 $date = current_time('timestamp');
             } else {
                 $date = strtotime($file_date . ' ' . $file_date_hour . ':' . $file_date_minute . ':00');
             }
             // Update
             $wpdb->update($wpdb->posts, array('post_status' => 'publish', 'post_title' => $file_post_title, 'menu_order' => $file_menu_order, 'post_date' => date('Y-m-d H:i:s', $date), 'post_date_gmt' => date('Y-m-d H:i:s', $date)), array('ID' => $file_id));
             // File Manager
             $file_manager = new DLM_File_Manager();
             // Update post meta
             update_post_meta($file_id, '_version', $file_version);
             update_post_meta($file_id, '_files', $file_manager->json_encode_files($files));
             $filesize = -1;
             $main_file_path = current($files);
             if ($main_file_path) {
                 $filesize = $file_manager->get_file_size($main_file_path);
                 $hashes = $file_manager->get_file_hashes($main_file_path);
                 update_post_meta($file_id, '_filesize', $filesize);
                 update_post_meta($file_id, '_md5', $hashes['md5']);
                 update_post_meta($file_id, '_sha1', $hashes['sha1']);
                 update_post_meta($file_id, '_crc32', $hashes['crc32']);
             } else {
                 update_post_meta($file_id, '_filesize', $filesize);
                 update_post_meta($file_id, '_md5', '');
                 update_post_meta($file_id, '_sha1', '');
                 update_post_meta($file_id, '_crc32', '');
             }
             if ($file_download_count !== '') {
                 update_post_meta($file_id, '_download_count', absint($file_download_count));
                 $total_download_count += absint($file_download_count);
             } else {
                 $total_download_count += absint(get_post_meta($file_id, '_download_count', true));
             }
             do_action('dlm_save_downloadable_file', $file_id, $i);
         }
     }
     // Sync download_count
     update_post_meta($post_id, '_download_count', $total_download_count);
     // Delete transients
     delete_transient('dlm_file_version_ids_' . $post_id);
     do_action('dlm_save_metabox', $post_id, $post);
 }