function alt_from_resource($source,$target,$name='',$delete=false){ // Copy a resource as an alt file of another resource // alt is the source resource, $ref is the target resource that will get the new alternate global $view_title_field; $srcdata=get_resource_data($source); $srcext = $srcdata['file_extension']; $srcpath = get_resource_path($source,true,"",false,$srcext); if ($name == ''){ $name = sql_value("select value from resource_data where resource_type_field = '$view_title_field' and resource = '$source'",'Untitled'); } $description = ''; if (!file_exists($srcpath)){ echo "ERROR: File not found."; return false; } else { $file_size = filesize_unlimited($srcpath); $altid = add_alternative_file($target,$name,$description="",$file_name="",$file_extension="",$file_size,$alt_type=''); $newpath = get_resource_path($target,true,"",true,$srcext,-1,1,false,'',$altid); copy($srcpath,$newpath); # Preview creation for alternative files (enabled via config) global $alternative_file_previews; if ($alternative_file_previews){ create_previews($target,false,$srcext,false,false,$altid); } if ($delete){ // we are supposed to delete the original resource when we're done # Not allowed to edit this resource? They shouldn't have been able to get here. if ((!get_edit_access($source,$srcdata["archive"]))||checkperm('D')) { exit ("Permission denied."); } else { delete_resource($source); } } return true; } }
function ProcessFolder($folder, $version_dir, &$resource_array, &$resource_error) { global $lang, $syncdir, $nogo, $staticsync_max_files, $count, $done, $modtimes, $lastsync, $ffmpeg_preview_extension, $staticsync_autotheme, $staticsync_folder_structure, $staticsync_extension_mapping_default, $staticsync_extension_mapping, $staticsync_mapped_category_tree, $staticsync_title_includes_path, $staticsync_ingest, $staticsync_mapfolders, $staticsync_alternatives_suffix, $theme_category_levels, $staticsync_defaultstate, $additional_archive_states, $staticsync_extension_mapping_append_values, $image_alternatives, $exclude_resize, $post_host, $media_endpoint, $image_required_height, $sync_bucket, $aws_key, $aws_secret_key; $collection = 0; echo "Processing Folder: {$folder}" . PHP_EOL; #$alt_path = get_resource_path(59, TRUE, '', FALSE, 'png', -1, 1, FALSE, '', 4); # List all files in this folder. $dh = opendir($folder); while (($file = readdir($dh)) !== false) { if ($file == '.' || $file == '..') { continue; } $filetype = filetype($folder . "/" . $file); $fullpath = $folder . "/" . $file; $shortpath = str_replace($syncdir . "/", '', $fullpath); # Work out extension $extension = explode(".", $file); if (count($extension) > 1) { $extension = trim(strtolower($extension[count($extension) - 1])); } else { //No extension $extension = ""; } if (strpos($fullpath, $nogo)) { echo "This directory is to be ignored." . PHP_EOL; continue; } if ($staticsync_mapped_category_tree) { $path_parts = explode("/", $shortpath); array_pop($path_parts); touch_category_tree_level($path_parts); } # -----FOLDERS------------- if (($filetype == "dir" || $filetype == "link") && strpos($nogo, "[{$file}]") === false && strpos($file, $staticsync_alternatives_suffix) === false) { # Get current version direcotries. if (preg_match("/[0-9]{2}-[0-9]{2}-[0-9]{4}\$/", $file)) { if (!in_array($file, $version_dir)) { array_push($version_dir, $file); } if (preg_match('/in_progress*/', $file)) { echo "The Barcode is still being processed." . PHP_EOL; continue; } } # Recurse ProcessFolder($folder . "/" . $file, $version_dir, $resource_array, $resource_error); } $psd_files = array(); if (preg_match('/images/', $fullpath)) { $path_array = explode('/', $fullpath); $psd_array = array_splice($path_array, 0, array_search('images', $path_array)); $psd_path = implode('/', $psd_array) . '/psd/'; $psd_files = array_diff(scandir($psd_path), array('..', '.')); foreach ($psd_files as $index => $psd_file) { $psd_files[$index] = pathinfo($psd_file, PATHINFO_FILENAME); } } # -------FILES--------------- if ($filetype == "file" && substr($file, 0, 1) != "." && strtolower($file) != "thumbs.db") { /* Below Code Adapted from CMay's bug report */ global $banned_extensions; # Check to see if extension is banned, do not add if it is banned if (array_search($extension, $banned_extensions)) { continue; } /* Above Code Adapted from CMay's bug report */ $count++; if ($count > $staticsync_max_files) { return true; } $last_sync_date = sql_value("select value from sysvars where name = 'last_sync'", ""); $file_creation_date = date("Y-m-d H:i:s", filectime($fullpath)); if (isset($last_sync_date) && $last_sync_date > $file_creation_date) { echo "No new file found.." . PHP_EOL; continue; } # Already exists? if (!isset($done[$shortpath])) { echo "Processing file: {$fullpath}" . PHP_EOL; if ($collection == 0 && $staticsync_autotheme) { # Make a new collection for this folder. $e = explode("/", $shortpath); $theme = ucwords($e[0]); $themesql = "theme='" . ucwords(escape_check($e[0])) . "'"; $themecolumns = "theme"; $themevalues = "'" . ucwords(escape_check($e[0])) . "'"; if ($staticsync_folder_structure) { for ($x = 0; $x < count($e) - 1; $x++) { if ($x != 0) { $themeindex = $x + 1; if ($themeindex > $theme_category_levels) { $theme_category_levels = $themeindex; if ($x == count($e) - 2) { echo PHP_EOL . PHP_EOL . "UPDATE THEME_CATEGORY_LEVELS TO {$themeindex} IN CONFIG!!!!" . PHP_EOL . PHP_EOL; } } $th_name = ucwords(escape_check($e[$x])); $themesql .= " AND theme{$themeindex} = '{$th_name}'"; $themevalues .= ",'{$th_name}'"; $themecolumns .= ",theme{$themeindex}"; } } } $name = count($e) == 1 ? '' : $e[count($e) - 2]; echo "Collection {$name}, theme={$theme}" . PHP_EOL; $ul_username = $theme; $escaped_name = escape_check($name); $collection = sql_value("SELECT ref value FROM collection WHERE name='{$escaped_name}' AND {$themesql}", 0); if ($collection == 0) { sql_query("INSERT INTO collection (name,created,public,{$themecolumns},allow_changes)\n VALUES ('{$escaped_name}', NOW(), 1, {$themevalues}, 0)"); $collection = sql_insert_id(); } } # Work out a resource type based on the extension. $type = $staticsync_extension_mapping_default; reset($staticsync_extension_mapping); foreach ($staticsync_extension_mapping as $rt => $extensions) { if (in_array($extension, $extensions)) { $type = $rt; } } $modified_type = hook('modify_type', 'staticsync', array($type)); if (is_numeric($modified_type)) { $type = $modified_type; } # Formulate a title if ($staticsync_title_includes_path) { $title_find = array('/', '_', ".{$extension}"); $title_repl = array(' - ', ' ', ''); $title = ucfirst(str_ireplace($title_find, $title_repl, $shortpath)); } else { $title = str_ireplace(".{$extension}", '', $file); } $modified_title = hook('modify_title', 'staticsync', array($title)); if ($modified_title !== false) { $title = $modified_title; } # Import this file #$r = import_resource($shortpath, $type, $title, $staticsync_ingest); #Check for file name containing the psd. if (!empty($psd_files)) { $image_file_array = explode('/', $fullpath); $image_file = $image_file_array[count($image_file_array) - 1]; $image_psd_name = explode('_', $image_file)[0]; if (array_search($image_psd_name, $psd_files)) { #Image name is in right format. if (!validate_image_size($fullpath, $image_required_height)) { $resource_error['size'][$file] = $fullpath; } $r = import_resource($fullpath, $type, $title, $staticsync_ingest); sql_query("INSERT INTO resource_data (resource,resource_type_field,value)\n VALUES ('{$r}', (SELECT ref FROM resource_type_field WHERE name = 'logical_id'), '{$image_psd_name}')"); $original_filepath = sql_query("SELECT value FROM resource_data WHERE resource = '{$r}' AND\n resource_type_field = (SELECT ref FROM resource_type_field where name = 'original_filepath')"); if (isset($original_filepath)) { sql_query("INSERT INTO resource_data (resource,resource_type_field,value)\n VALUES ('{$r}',(SELECT ref FROM resource_type_field WHERE name = 'original_filepath'), '{$fullpath}')"); } } else { echo "Filename '{$fullpath}' is not in right format.." . PHP_EOL; $resource_error['name'][$file] = $fullpath; continue; } } elseif (word_in_string($exclude_resize, explode('/', $fullpath))) { $r = import_resource($fullpath, $type, $title, $staticsync_ingest); } if ($r !== false) { array_push($resource_array, $r); # Create current version for resource. #print_r($version_dir); if (count($version_dir) == 1) { sql_query("INSERT into resource_data (resource,resource_type_field,value)\n VALUES ('{$r}',(SELECT ref FROM resource_type_field WHERE name = 'current'), 'TRUE')"); } $sync_status = sync_to_s3($syncdir, $sync_bucket, $aws_key, $aws_secret_key); if (!$sync_status) { echo "Failed to sync"; } # Add to mapped category tree (if configured) if (isset($staticsync_mapped_category_tree)) { $basepath = ''; # Save tree position to category tree field # For each node level, expand it back to the root so the full path is stored. for ($n = 0; $n < count($path_parts); $n++) { if ($basepath != '') { $basepath .= "~"; } $basepath .= $path_parts[$n]; $path_parts[$n] = $basepath; } update_field($r, $staticsync_mapped_category_tree, "," . join(",", $path_parts)); } #This is an override to add user data to the resouces if (!isset($userref)) { $ul_username = ucfirst(strtolower($ul_username)); $current_user_ref = sql_query("Select ref from user where username = '******' "); if (!empty($current_user_ref)) { $current_user_ref = $current_user_ref[0]['ref']; sql_query("UPDATE resource SET created_by='{$current_user_ref}' where ref = {$r}"); } } # default access level. This may be overridden by metadata mapping. $accessval = 0; # StaticSync path / metadata mapping # Extract metadata from the file path as per $staticsync_mapfolders in config.php if (isset($staticsync_mapfolders)) { foreach ($staticsync_mapfolders as $mapfolder) { $match = $mapfolder["match"]; $field = $mapfolder["field"]; $level = $mapfolder["level"]; if (strpos("/" . $shortpath, $match) !== false) { # Match. Extract metadata. $path_parts = explode("/", $shortpath); if ($level < count($path_parts)) { // special cases first. if ($field == 'access') { # access level is a special case # first determine if the value matches a defined access level $value = $path_parts[$level - 1]; for ($n = 0; $n < 3; $n++) { # if we get an exact match or a match except for case if ($value == $lang["access" . $n] || strtoupper($value) == strtoupper($lang['access' . $n])) { $accessval = $n; echo "Will set access level to " . $lang['access' . $n] . " ({$n})" . PHP_EOL; } } } else { if ($field == 'archive') { # archive level is a special case # first determin if the value matches a defined archive level $value = $mapfolder["archive"]; $archive_array = array_merge(array(-2, -1, 0, 1, 2, 3), $additional_archive_states); if (in_array($value, $archive_array)) { $archiveval = $value; echo "Will set archive level to " . $lang['status' . $value] . " ({$archiveval})" . PHP_EOL; } } else { # Save the value #print_r($path_parts); $value = $path_parts[$level - 1]; if ($staticsync_extension_mapping_append_values) { $given_value = $value; // append the values if possible...not used on dropdown, date, categroy tree, datetime, or radio buttons $field_info = get_resource_type_field($field); if (in_array($field['type'], array(0, 1, 2, 4, 5, 6, 7, 8))) { $old_value = sql_value("select value value from resource_data where resource={$r} and resource_type_field={$field}", ""); $value = append_field_value($field_info, $value, $old_value); } } update_field($r, $field, trim($value)); if (strtotime(trim($value))) { add_keyword_mappings($r, trim($value), $field, false, true); } else { add_keyword_mappings($r, trim($value), $field); } if ($staticsync_extension_mapping_append_values) { $value = $given_value; } echo " - Extracted metadata from path: {$value}" . PHP_EOL; } } } } } } #Resize only original images. if (!word_in_string($exclude_resize, explode('/', $fullpath))) { echo "Creating preview.."; create_previews($r, false, $extension, false, false, -1, false, $staticsync_ingest); } # update access level sql_query("UPDATE resource SET access = '{$accessval}',archive='{$staticsync_defaultstate}' WHERE ref = '{$r}'"); # Add any alternative files $altpath = $fullpath . $staticsync_alternatives_suffix; if ($staticsync_ingest && file_exists($altpath)) { $adh = opendir($altpath); while (($altfile = readdir($adh)) !== false) { $filetype = filetype($altpath . "/" . $altfile); if ($filetype == "file" && substr($file, 0, 1) != "." && strtolower($file) != "thumbs.db") { # Create alternative file # Find extension $ext = explode(".", $altfile); $ext = $ext[count($ext) - 1]; $description = str_replace("?", strtoupper($ext), $lang["originalfileoftype"]); $file_size = filesize_unlimited($altpath . "/" . $altfile); $aref = add_alternative_file($r, $altfile, $description, $altfile, $ext, $file_size); $path = get_resource_path($r, true, '', true, $ext, -1, 1, false, '', $aref); rename($altpath . "/" . $altfile, $path); # Move alternative file } } } # Add to collection if ($staticsync_autotheme) { $test = ''; $test = sql_query("SELECT * FROM collection_resource WHERE collection='{$collection}' AND resource='{$r}'"); if (count($test) == 0) { sql_query("INSERT INTO collection_resource (collection, resource, date_added)\n VALUES ('{$collection}', '{$r}', NOW())"); } } } else { # Import failed - file still being uploaded? echo " *** Skipping file - it was not possible to move the file (still being imported/uploaded?)" . PHP_EOL; } } else { # check modified date and update previews if necessary $filemod = filemtime($fullpath); if (array_key_exists($shortpath, $modtimes) && $filemod > strtotime($modtimes[$shortpath])) { # File has been modified since we last created previews. Create again. $rd = sql_query("SELECT ref, has_image, file_modified, file_extension FROM resource\n WHERE file_path='" . escape_check($shortpath) . "'"); if (count($rd) > 0) { $rd = $rd[0]; $rref = $rd["ref"]; echo "Resource {$rref} has changed, regenerating previews: {$fullpath}" . PHP_EOL; extract_exif_comment($rref, $rd["file_extension"]); # extract text from documents (e.g. PDF, DOC). global $extracted_text_field; if (isset($extracted_text_field)) { if (isset($unoconv_path) && in_array($extension, $unoconv_extensions)) { // omit, since the unoconv process will do it during preview creation below } else { extract_text($rref, $extension); } } # Store original filename in field, if set global $filename_field; if (isset($filename_field)) { update_field($rref, $filename_field, $file); } create_previews($rref, false, $rd["file_extension"], false, false, -1, false, $staticsync_ingest); sql_query("UPDATE resource SET file_modified=NOW() WHERE ref='{$rref}'"); } } } } } }
fclose($out); } else { die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}'); } } // Check if file has been uploaded if (!$chunks || $chunk == $chunks - 1) { // Strip the temp .part suffix off rename("{$plfilepath}.part", $plfilepath); # Additional ResourceSpace upload code $plupload_upload_location = $plfilepath; if (!hook("initialuploadprocessing")) { if ($alternative != "") { # Upload an alternative file (JUpload only) # Add a new alternative file $aref = add_alternative_file($alternative, $plfilename); # Work out the extension $extension = explode(".", $plfilepath); $extension = trim(strtolower($extension[count($extension) - 1])); # Find the path for this resource. $path = get_resource_path($alternative, true, "", true, $extension, -1, 1, false, "", $aref); # Move the sent file to the alternative file location # PLUpload - file was sent chunked and reassembled - use the reassembled file location $result = rename($plfilepath, $path); if ($result === false) { exit("ERROR: File upload error. Please check the size of the file you are trying to upload."); } chmod($path, 0777); $file_size = @filesize_unlimited($path); # Save alternative file data. sql_query("update resource_alt_files set file_name='" . escape_check($plfilename) . "',file_extension='" . escape_check($extension) . "',file_size='" . $file_size . "',creation_date=now() where resource='{$alternative}' and ref='{$aref}'");
$tmp = hook("preventgeneratealt", "", array($file)); if ($tmp === true) { $generate = false; } if ($generate) { if (!hook("removepreviousalts", "", array($ffmpeg_alternatives, $file, $n))) { # Remove any existing alternative file(s) with this name. # SQL Connection may have hit a timeout sql_connect(); $existing = sql_query("select ref from resource_alt_files where resource='{$ref}' and name='" . escape_check($ffmpeg_alternatives[$n]["name"]) . "'"); for ($m = 0; $m < count($existing); $m++) { delete_alternative_file($ref, $existing[$m]["ref"]); } } # Create the alternative file. $aref = add_alternative_file($ref, $ffmpeg_alternatives[$n]["name"]); $apath = get_resource_path($ref, true, "", true, $ffmpeg_alternatives[$n]["extension"], -1, 1, false, "", $aref); # Process the video $shell_exec_cmd = $ffmpeg_fullpath . " {$ffmpeg_global_options} -y -i " . escapeshellarg($file) . " " . $ffmpeg_alternatives[$n]["params"] . " " . escapeshellarg($apath); $tmp = hook("ffmpegmodaltparams", "", array($shell_exec_cmd, $ffmpeg_fullpath, $file, $n, $aref)); if ($tmp) { $shell_exec_cmd = $tmp; } $output = run_command($shell_exec_cmd); if (isset($qtfaststart_path)) { if ($qtfaststart_path && file_exists($qtfaststart_path . "/qt-faststart") && in_array($ffmpeg_alternatives[$n]["extension"], $qtfaststart_extensions)) { $apathtmp = $apath . ".tmp"; rename($apath, $apathtmp); $output = run_command($qtfaststart_path . "/qt-faststart " . escapeshellarg($apathtmp) . " " . escapeshellarg($apath) . " 2>&1"); unlink($apathtmp); }
function ProcessFolder($folder) { #echo "<br>processing folder $folder"; global $syncdir, $nogo, $max, $count, $done, $modtimes, $lastsync, $ffmpeg_preview_extension, $staticsync_autotheme, $staticsync_extension_mapping_default, $staticsync_extension_mapping, $staticsync_mapped_category_tree, $staticsync_title_includes_path, $staticsync_ingest, $staticsync_mapfolders, $staticsync_alternatives_suffix, $staticsync_alt_suffixes, $staticsync_alt_suffix_array, $file_minimum_age, $staticsync_run_timestamp; $collection = 0; echo "Processing Folder: {$folder}\n"; # List all files in this folder. $dh = opendir($folder); echo date('Y-m-d H:i:s '); echo "Reading from {$folder}\n"; while (($file = readdir($dh)) !== false) { // because of alternative processing, some files may disappear during the run // that's ok - just ignore it and move on if (!file_exists($folder . "/" . $file)) { echo date('Y-m-d H:i:s '); echo "File {$file} missing. Moving on.\n"; continue; } $filetype = filetype($folder . "/" . $file); $fullpath = $folder . "/" . $file; $shortpath = str_replace($syncdir . "/", "", $fullpath); if ($staticsync_mapped_category_tree) { $path_parts = explode("/", $shortpath); array_pop($path_parts); touch_category_tree_level($path_parts); } # -----FOLDERS------------- if (($filetype == "dir" || $filetype == "link") && $file != "." && $file != ".." && strpos($nogo, "[" . $file . "]") === false && strpos($file, $staticsync_alternatives_suffix) === false) { # Recurse #echo "\n$file : " . filemtime($folder . "/" . $file) . " > " . $lastsync; if (true || strlen($lastsync) == "" || filemtime($folder . "/" . $file) > $lastsync - 26000) { ProcessFolder($folder . "/" . $file); } } # -------FILES--------------- if ($filetype == "file" && substr($file, 0, 1) != "." && strtolower($file) != "thumbs.db" && !ss_is_alt($file)) { // we want to make sure we don't touch files that are too new // so check this if (time() - filectime($folder . "/" . $file) < $file_minimum_age) { echo date('Y-m-d H:i:s '); echo " {$file} too new -- skipping .\n"; //echo filectime($folder . "/" . $file) . " " . time() . "\n"; continue; } # Already exists? if (!in_array($shortpath, $done)) { $count++; if ($count > $max) { return true; } echo date('Y-m-d H:i:s '); echo "Processing file: {$fullpath}\n"; if ($collection == 0 && $staticsync_autotheme) { # Make a new collection for this folder. $e = explode("/", $shortpath); $theme = ucwords($e[0]); $name = count($e) == 1 ? "" : $e[count($e) - 2]; echo date('Y-m-d H:i:s '); echo "\nCollection {$name}, theme={$theme}"; $collection = sql_value("select ref value from collection where name='" . escape_check($name) . "' and theme='" . escape_check($theme) . "'", 0); if ($collection == 0) { sql_query("insert into collection (name,created,public,theme,allow_changes) values ('" . escape_check($name) . "',now(),1,'" . escape_check($theme) . "',0)"); $collection = sql_insert_id(); } } # Work out extension $extension = explode(".", $file); $extension = trim(strtolower($extension[count($extension) - 1])); // if coming from collections or la folders, assume these are the resource types if (stristr(strtolower($fullpath), 'collection services/curatorial')) { $type = 5; } elseif (stristr(strtolower($fullpath), 'collection services/conservation')) { $type = 5; } elseif (stristr(strtolower($fullpath), 'collection services/library_archives')) { $type = 6; } else { # Work out a resource type based on the extension. $type = $staticsync_extension_mapping_default; reset($staticsync_extension_mapping); foreach ($staticsync_extension_mapping as $rt => $extensions) { if ($rt == 5 or $rt == 6) { continue; } // we already eliminated those if (in_array($extension, $extensions)) { $type = $rt; } } } # Formulate a title if ($staticsync_title_includes_path) { $title = str_ireplace("." . $extension, "", str_replace("/", " - ", $shortpath)); $title = ucfirst(str_replace("_", " ", $title)); } else { $title = str_ireplace("." . $extension, "", $file); } # Import this file $r = import_resource($shortpath, $type, $title, $staticsync_ingest); if ($r !== false) { # Add to mapped category tree (if configured) if (isset($staticsync_mapped_category_tree)) { $basepath = ""; # Save tree position to category tree field # For each node level, expand it back to the root so the full path is stored. for ($n = 0; $n < count($path_parts); $n++) { if ($basepath != "") { $basepath .= "~"; } $basepath .= $path_parts[$n]; $path_parts[$n] = $basepath; } update_field($r, $staticsync_mapped_category_tree, "," . join(",", $path_parts)); #echo "update_field($r,$staticsync_mapped_category_tree," . "," . join(",",$path_parts) . ");\n"; } # StaticSync path / metadata mapping # Extract metadata from the file path as per $staticsync_mapfolders in config.php if (isset($staticsync_mapfolders)) { foreach ($staticsync_mapfolders as $mapfolder) { $match = $mapfolder["match"]; $field = $mapfolder["field"]; $level = $mapfolder["level"]; if (strpos("/" . $shortpath, $match) !== false) { # Match. Extract metadata. $path_parts = explode("/", $shortpath); if ($level < count($path_parts)) { # Save the value print_r($path_parts); $value = $path_parts[$level - 1]; update_field($r, $field, $value); echo " - Extracted metadata from path: {$value}\n"; } } } } // add the timestamp from this run to the keywords field to help retrieve this batch later $currentkeywords = sql_value("select value from resource_data where resource = '{$r}' and resource_type_field = '1'", ""); if (strlen($currentkeywords) > 0) { $currentkeywords .= ','; } update_field($r, 1, $currentkeywords . $staticsync_run_timestamp); if (function_exists('staticsync_local_functions')) { // if local cleanup functions have been defined, run them staticsync_local_functions($r); } # Add any alternative files $altpath = $fullpath . $staticsync_alternatives_suffix; if ($staticsync_ingest && file_exists($altpath)) { $adh = opendir($altpath); while (($altfile = readdir($adh)) !== false) { $filetype = filetype($altpath . "/" . $altfile); if ($filetype == "file" && substr($file, 0, 1) != "." && strtolower($file) != "thumbs.db") { # Create alternative file global $lang; # Find extension $ext = explode(".", $altfile); $ext = $ext[count($ext) - 1]; $aref = add_alternative_file($r, $altfile, strtoupper($ext) . " " . $lang["file"], $altfile, $ext, filesize_unlimited($altpath . "/" . $altfile)); $path = get_resource_path($r, true, "", true, $ext, -1, 1, false, "", $aref); rename($altpath . "/" . $altfile, $path); # Move alternative file } } } # check for alt files that match suffix list if ($staticsync_alt_suffixes) { $ss_nametocheck = substr($file, 0, strlen($file) - strlen($extension) - 1); //review all files still in directory and see if they are alt files matching this one $althandle = opendir($folder); while (($altcandidate = readdir($althandle)) !== false) { if ($filetype == "file" && substr($file, 0, 1) != "." && strtolower($file) != "thumbs.db") { # Find extension $ext = explode(".", $altcandidate); $ext = $ext[count($ext) - 1]; $altcandidate_name = substr($altcandidate, 0, strlen($altcandidate) - strlen($ext) - 1); $altcandidate_validated = false; foreach ($staticsync_alt_suffix_array as $sssuffix) { if ($altcandidate_name == $ss_nametocheck . $sssuffix) { $altcandidate_validated = true; $thisfilesuffix = $sssuffix; break; } } if ($altcandidate_validated) { echo date('Y-m-d H:i:s '); echo " Attaching {$altcandidate} as alternative.\n"; $filetype = filetype($folder . "/" . $altcandidate); # Create alternative file global $lang; if (preg_match("/^_VERSO[0-9]*/i", $thisfilesuffix)) { $alt_title = "Verso"; } elseif (preg_match("/^_DNG[0-9]*/i", $thisfilesuffix)) { $alt_title = "DNG"; } elseif (preg_match("/^_ORIG[0-9]*/i", $thisfilesuffix)) { $alt_title = "Original Scan"; } elseif (preg_match("/^_TPV[0-9]*/i", $thisfilesuffix)) { $alt_title = "Title Page Verso"; } elseif (preg_match("/^_TP[0-9]*/i", $thisfilesuffix)) { $alt_title = "Title Page"; } elseif (preg_match("/^_COV[0-9]*/i", $thisfilesuffix)) { $alt_title = "Cover"; } elseif (preg_match("/^_SCR[0-9]*/i", $thisfilesuffix)) { $alt_title = "Inscription"; } elseif (preg_match("/^_EX[0-9]*/i", $thisfilesuffix)) { $alt_title = "Enclosure"; } else { $alt_title = $altcandidate; } $aref = add_alternative_file($r, $alt_title, strtoupper($ext) . " " . $lang["file"], $altcandidate, $ext, filesize_unlimited($folder . "/" . $altcandidate)); $path = get_resource_path($r, true, "", true, $ext, -1, 1, false, "", $aref); rename($folder . "/" . $altcandidate, $path); # Move alternative file global $alternative_file_previews; if ($alternative_file_previews) { create_previews($r, false, $ext, false, false, $aref); } } } } } # Add to collection if ($staticsync_autotheme) { sql_query("insert into collection_resource(collection,resource,date_added) values ('{$collection}','{$r}',now())"); } // fix permissions // get directory to fix global $scramble_key; $permfixfolder = "/hne/rs/filestore/"; for ($n = 0; $n < strlen($r); $n++) { $permfixfolder .= substr($r, $n, 1); if ($n == strlen($r) - 1) { $permfixfolder .= "_" . substr(md5($r . "_" . $scramble_key), 0, 15); } $permfixfolder .= "/"; } exec("/bin/chown -R wwwrun {$permfixfolder}"); exec("/bin/chgrp -R www {$permfixfolder}"); } else { # Import failed - file still being uploaded? echo date('Y-m-d H:i:s '); echo " *** Skipping file - it was not possible to move the file (still being imported/uploaded?) \n"; } } else { # check modified date and update previews if necessary $filemod = filemtime($fullpath); if (array_key_exists($shortpath, $modtimes) && $filemod > strtotime($modtimes[$shortpath])) { # File has been modified since we last created previews. Create again. $rd = sql_query("select ref,has_image,file_modified,file_extension from resource where file_path='" . escape_check($shortpath) . "'"); if (count($rd) > 0) { $rd = $rd[0]; $rref = $rd["ref"]; echo date('Y-m-d H:i:s '); echo "Resource {$rref} has changed, regenerating previews: {$fullpath}\n"; create_previews($rref, false, $rd["file_extension"]); sql_query("update resource set file_modified=now() where ref='{$rref}'"); } } } } } }
function ProcessFolder($folder) { global $lang, $syncdir, $nogo, $staticsync_max_files, $count, $done, $modtimes, $lastsync, $ffmpeg_preview_extension, $staticsync_autotheme, $staticsync_folder_structure, $staticsync_extension_mapping_default, $staticsync_extension_mapping, $staticsync_mapped_category_tree, $staticsync_title_includes_path, $staticsync_ingest, $staticsync_mapfolders, $staticsync_alternatives_suffix, $theme_category_levels, $staticsync_defaultstate; $collection = 0; echo "Processing Folder: $folder" . PHP_EOL; # List all files in this folder. $dh = opendir($folder); while (($file = readdir($dh)) !== false) { if ( $file == '.' || $file == '..') { continue; } $filetype = filetype($folder . "/" . $file); $fullpath = $folder . "/" . $file; $shortpath = str_replace($syncdir . "/", '', $fullpath); # Work out extension $extension = explode(".", $file); if(count($extension)>1) { $extension = trim(strtolower($extension[count($extension)-1])); } else { //No extension $extension=""; } if ($staticsync_mapped_category_tree) { $path_parts = explode("/", $shortpath); array_pop($path_parts); touch_category_tree_level($path_parts); } # -----FOLDERS------------- if ((($filetype == "dir") || $filetype == "link") && (strpos($nogo, "[$file]") === false) && (strpos($file, $staticsync_alternatives_suffix) === false)) { # Recurse ProcessFolder($folder . "/" . $file); } # -------FILES--------------- if (($filetype == "file") && (substr($file,0,1) != ".") && (strtolower($file) != "thumbs.db")) { /* Below Code Adapted from CMay's bug report */ global $banned_extensions; # Check to see if extension is banned, do not add if it is banned if(array_search($extension, $banned_extensions)){continue;} /* Above Code Adapted from CMay's bug report */ $count++; if ($count > $staticsync_max_files) { return(true); } # Already exists? if (!isset($done[$shortpath])) { echo "Processing file: $fullpath" . PHP_EOL; if ($collection == 0 && $staticsync_autotheme) { # Make a new collection for this folder. $e = explode("/", $shortpath); $theme = ucwords($e[0]); $themesql = "theme='" . ucwords(escape_check($e[0])) . "'"; $themecolumns = "theme"; $themevalues = "'" . ucwords(escape_check($e[0])) . "'"; if ($staticsync_folder_structure) { for ($x=0;$x<count($e)-1;$x++) { if ($x != 0) { $themeindex = $x+1; if ($themeindex >$theme_category_levels) { $theme_category_levels = $themeindex; if ($x == count($e)-2) { echo PHP_EOL . PHP_EOL . "UPDATE THEME_CATEGORY_LEVELS TO $themeindex IN CONFIG!!!!" . PHP_EOL . PHP_EOL; } } $th_name = ucwords(escape_check($e[$x])); $themesql .= " AND theme{$themeindex} = '$th_name'"; $themevalues .= ",'$th_name'"; $themecolumns .= ",theme{$themeindex}"; } } } $name = (count($e) == 1) ? '' : $e[count($e)-2]; echo "Collection $name, theme=$theme" . PHP_EOL; $escaped_name = escape_check($name); $collection = sql_value("SELECT ref value FROM collection WHERE name='$escaped_name' AND $themesql", 0); if ($collection == 0) { sql_query("INSERT INTO collection (name,created,public,$themecolumns,allow_changes) VALUES ('$escaped_name', NOW(), 1, $themevalues, 0)"); $collection = sql_insert_id(); } } # Work out a resource type based on the extension. $type = $staticsync_extension_mapping_default; reset($staticsync_extension_mapping); foreach ($staticsync_extension_mapping as $rt => $extensions) { if (in_array($extension,$extensions)) { $type = $rt; } } $modified_type = hook('modify_type', 'staticsync', array( $type )); if (is_numeric($modified_type)) { $type = $modified_type; } # Formulate a title if ($staticsync_title_includes_path) { $title_find = array('/', '_', ".$extension" ); $title_repl = array(' - ', ' ', ''); $title = ucfirst(str_ireplace($title_find, $title_repl, $shortpath)); } else { $title = str_ireplace(".$extension", '', $file); } $modified_title = hook('modify_title', 'staticsync', array( $title )); if ($modified_title !== false) { $title = $modified_title; } # Import this file $r = import_resource($shortpath, $type, $title, $staticsync_ingest); if ($r !== false) { # Add to mapped category tree (if configured) if (isset($staticsync_mapped_category_tree)) { $basepath = ''; # Save tree position to category tree field # For each node level, expand it back to the root so the full path is stored. for ($n=0;$n<count($path_parts);$n++) { if ($basepath != '') { $basepath .= "~"; } $basepath .= $path_parts[$n]; $path_parts[$n] = $basepath; } update_field($r, $staticsync_mapped_category_tree, "," . join(",", $path_parts)); } # default access level. This may be overridden by metadata mapping. $accessval = 0; # StaticSync path / metadata mapping # Extract metadata from the file path as per $staticsync_mapfolders in config.php if (isset($staticsync_mapfolders)) { foreach ($staticsync_mapfolders as $mapfolder) { $match = $mapfolder["match"]; $field = $mapfolder["field"]; $level = $mapfolder["level"]; if (strpos("/" . $shortpath, $match) !== false) { # Match. Extract metadata. $path_parts = explode("/", $shortpath); if ($level < count($path_parts)) { // special cases first. if ($field == 'access') { # access level is a special case # first determine if the value matches a defined access level $value = $path_parts[$level-1]; for ($n=0; $n<3; $n++){ # if we get an exact match or a match except for case if ($value == $lang["access" . $n] || strtoupper($value) == strtoupper($lang['access' . $n])) { $accessval = $n; echo "Will set access level to " . $lang['access' . $n] . " ($n)" . PHP_EOL; } } } else { # Save the value print_r($path_parts); $value = $path_parts[$level-1]; update_field ($r, $field, $value); echo " - Extracted metadata from path: $value" . PHP_EOL; } } } } } # update access level sql_query("UPDATE resource SET access = '$accessval',archive='$staticsync_defaultstate' WHERE ref = '$r'"); # Add any alternative files $altpath = $fullpath . $staticsync_alternatives_suffix; if ($staticsync_ingest && file_exists($altpath)) { $adh = opendir($altpath); while (($altfile = readdir($adh)) !== false) { $filetype = filetype($altpath . "/" . $altfile); if (($filetype == "file") && (substr($file,0,1) != ".") && (strtolower($file) != "thumbs.db")) { # Create alternative file # Find extension $ext = explode(".", $altfile); $ext = $ext[count($ext)-1]; $description = str_replace("?", strtoupper($ext), $lang["originalfileoftype"]); $file_size = filesize_unlimited($altpath . "/" . $altfile); $aref = add_alternative_file($r, $altfile, $description, $altfile, $ext, $file_size); $path = get_resource_path($r, true, '', true, $ext, -1, 1, false, '', $aref); rename($altpath . "/" . $altfile,$path); # Move alternative file } } } # Add to collection if ($staticsync_autotheme) { $test = ''; $test = sql_query("SELECT * FROM collection_resource WHERE collection='$collection' AND resource='$r'"); if (count($test) == 0) { sql_query("INSERT INTO collection_resource (collection, resource, date_added) VALUES ('$collection', '$r', NOW())"); } } } else { # Import failed - file still being uploaded? echo " *** Skipping file - it was not possible to move the file (still being imported/uploaded?)" . PHP_EOL; } } else { # check modified date and update previews if necessary $filemod = filemtime($fullpath); if (array_key_exists($shortpath,$modtimes) && ($filemod > strtotime($modtimes[$shortpath]))) { # File has been modified since we last created previews. Create again. $rd = sql_query("SELECT ref, has_image, file_modified, file_extension FROM resource WHERE file_path='" . escape_check($shortpath) . "'"); if (count($rd) > 0) { $rd = $rd[0]; $rref = $rd["ref"]; echo "Resource $rref has changed, regenerating previews: $fullpath" . PHP_EOL; extract_exif_comment($rref,$rd["file_extension"]); # extract text from documents (e.g. PDF, DOC). global $extracted_text_field; if (isset($extracted_text_field)) { if (isset($unoconv_path) && in_array($extension,$unoconv_extensions)){ // omit, since the unoconv process will do it during preview creation below } else { extract_text($rref,$extension); } } # Store original filename in field, if set global $filename_field; if (isset($filename_field)) { update_field($rref,$filename_field,$file); } create_previews($rref, false, $rd["file_extension"], false, false, -1, false, $staticsync_ingest); sql_query("UPDATE resource SET file_modified=NOW() WHERE ref='$rref'"); } } } } } }
*/ global $calibre_extensions; global $calibre_path; if (in_array($extension, $calibre_extensions) && isset($calibre_path) && !isset($newfile)) { $calibrecommand = $calibre_path . "/ebook-convert"; if (!file_exists($calibrecommand)) { exit("Calibre executable not found at '{$calibre_path}'"); } $path_parts = pathinfo($file); $basename_minus_extension = remove_extension($path_parts['basename']); $pdffile = $path_parts['dirname'] . "/" . $basename_minus_extension . ".pdf"; $wait = run_command("xvfb-run " . $calibrecommand . " " . escapeshellarg($file) . " " . $pdffile . " "); if (file_exists($pdffile)) { # Attach this PDF file as an alternative download. sql_query("delete from resource_alt_files where resource = '" . $ref . "' and unoconv='1'"); $alt_ref = add_alternative_file($ref, "PDF version"); $alt_path = get_resource_path($ref, true, "", false, "pdf", -1, 1, false, "", $alt_ref); copy($pdffile, $alt_path); unlink($pdffile); sql_query("update resource_alt_files set file_name='{$ref}-converted.pdf',description='generated by Open Office',file_extension='pdf',file_size='" . filesize_unlimited($alt_path) . "',unoconv='1' where resource='{$ref}' and ref='{$alt_ref}'"); # Set vars so we continue generating thumbs/previews as if this is a PDF file $extension = "pdf"; $file = $alt_path; } } /* ---------------------------------------- Try OpenDocument Format ---------------------------------------- */ if (($extension == "odt" || $extension == "ott" || $extension == "odg" || $extension == "otg" || $extension == "odp" || $extension == "otp" || $extension == "ods" || $extension == "ots" || $extension == "odf" || $extension == "otf" || $extension == "odm" || $extension == "oth") && !isset($newfile)) { run_command("unzip -p " . escapeshellarg($file) . " \"Thumbnails/thumbnail.png\" > {$target}");
function create_previews($ref, $thumbonly = false, $extension = "jpg", $previewonly = false, $previewbased = false, $alternative = -1) { global $imagemagick_path, $preview_generate_max_file_size; # Debug debug("create_previews(ref={$ref},thumbonly={$thumbonly},extension={$extension},previewonly={$previewonly},previewbased={$previewbased},alternative={$alternative})"); # File checksum (experimental) - disabled for now if (!$previewonly) { generate_file_checksum($ref, $extension); } # first reset preview tweaks to 0 sql_query("update resource set preview_tweaks = '0|1' where ref = '{$ref}'"); # pages/tools/update_previews.php?previewbased=true # use previewbased to avoid touching original files (to preserve manually-uploaded preview images # when regenerating previews (i.e. for watermarks) if ($previewbased) { $file = get_resource_path($ref, true, "lpr", false, "jpg", -1, 1, false, "", $alternative); if (!file_exists($file)) { $file = get_resource_path($ref, true, "scr", false, "jpg", -1, 1, false, "", $alternative); if (!file_exists($file)) { $file = get_resource_path($ref, true, "pre", false, "jpg", -1, 1, false, "", $alternative); } } } else { if (!$previewonly) { $file = get_resource_path($ref, true, "", false, $extension, -1, 1, false, "", $alternative); } else { # We're generating based on a new preview (scr) image. $file = get_resource_path($ref, true, "tmp", false, "jpg"); } } # Debug debug("File source is {$file}"); # Make sure the file exists if (!file_exists($file)) { return false; } # If configured, make sure the file is within the size limit for preview generation if (isset($preview_generate_max_file_size)) { $filesize = filesize_unlimited($file) / (1024 * 1024); # Get filesize in MB if ($filesize > $preview_generate_max_file_size) { return false; } } # Locate imagemagick. $convert_fullpath = get_utility_path("im-convert"); if ($convert_fullpath == false) { exit("Could not find ImageMagick 'convert' utility at location '{$imagemagick_path}'"); } # Handle alternative image file generation. global $image_alternatives; if (isset($image_alternatives) && $alternative == -1) { for ($n = 0; $n < count($image_alternatives); $n++) { $exts = explode(",", $image_alternatives[$n]["source_extensions"]); if (in_array($extension, $exts)) { # Remove any existing alternative file(s) with this name. $existing = sql_query("select ref from resource_alt_files where resource='{$ref}' and name='" . escape_check($image_alternatives[$n]["name"]) . "'"); for ($m = 0; $m < count($existing); $m++) { delete_alternative_file($ref, $existing[$m]["ref"]); } # Create the alternative file. $aref = add_alternative_file($ref, $image_alternatives[$n]["name"]); $apath = get_resource_path($ref, true, "", true, $image_alternatives[$n]["target_extension"], -1, 1, false, "", $aref); # Process the image $command = $convert_fullpath . " " . $image_alternatives[$n]["params"] . " " . escapeshellarg($file) . " " . escapeshellarg($apath); $output = run_command($command); if (file_exists($apath)) { # Update the database with the new file details. $file_size = filesize_unlimited($apath); sql_query("update resource_alt_files set file_name='" . escape_check($image_alternatives[$n]["filename"] . "." . $image_alternatives[$n]["target_extension"]) . "',file_extension='" . escape_check($image_alternatives[$n]["target_extension"]) . "',file_size='" . $file_size . "',creation_date=now() where ref='{$aref}'"); } } } } if ($extension == "jpg" || $extension == "jpeg" || $extension == "png" || $extension == "gif") { if (isset($imagemagick_path)) { create_previews_using_im($ref, $thumbonly, $extension, $previewonly, $previewbased, $alternative); } else { # ---------------------------------------- # Use the GD library to perform the resize # ---------------------------------------- # For resource $ref, (re)create the various preview sizes listed in the table preview_sizes # Only create previews where the target size IS LESS THAN OR EQUAL TO the source size. # Set thumbonly=true to (re)generate thumbnails only. $sizes = ""; if ($thumbonly) { $sizes = " where id='thm' or id='col'"; } if ($previewonly) { $sizes = " where id='thm' or id='col' or id='pre' or id='scr'"; } # fetch source image size, if we fail, exit this function (file not an image, or file not a valid jpg/png/gif). if ((list($sw, $sh) = @getimagesize($file)) === false) { return false; } $ps = sql_query("select * from preview_size {$sizes}"); for ($n = 0; $n < count($ps); $n++) { # fetch target width and height $tw = $ps[$n]["width"]; $th = $ps[$n]["height"]; $id = $ps[$n]["id"]; # Find the target path $path = get_resource_path($ref, true, $ps[$n]["id"], false, "jpg", -1, 1, false, "", $alternative); if (file_exists($path) && !$previewbased) { unlink($path); } # Also try the watermarked version. $wpath = get_resource_path($ref, true, $ps[$n]["id"], false, "jpg", -1, 1, true, "", $alternative); if (file_exists($wpath)) { unlink($wpath); } # only create previews where the target size IS LESS THAN OR EQUAL TO the source size. # or when producing a small thumbnail (to make sure we have that as a minimum) if ($sw > $tw || $sh > $th || $id == "thm" || $id == "col") { # Calculate width and height. if ($sw > $sh) { $ratio = $tw / $sw; } else { $ratio = $th / $sh; } # Portrait $tw = floor($sw * $ratio); $th = floor($sh * $ratio); # ---------------------------------------- # Use the GD library to perform the resize # ---------------------------------------- $target = imagecreatetruecolor($tw, $th); if ($extension == "png") { $source = @imagecreatefrompng($file); if ($source === false) { return false; } } elseif ($extension == "gif") { $source = @imagecreatefromgif($file); if ($source === false) { return false; } } else { $source = @imagecreatefromjpeg($file); if ($source === false) { return false; } } imagecopyresampled($target, $source, 0, 0, 0, 0, $tw, $th, $sw, $sh); imagejpeg($target, $path, 90); if ($ps[$n]["id"] == "thm") { extract_mean_colour($target, $ref); } imagedestroy($target); } elseif ($id == "pre" || $id == "thm" || $id == "col") { # If the source is smaller than the pre/thm/col, we still need these sizes; just copy the file copy($file, get_resource_path($ref, true, $id, false, $extension, -1, 1, false, "", $alternative)); if ($id == "thm") { sql_query("update resource set thumb_width='{$sw}',thumb_height='{$sh}' where ref='{$ref}'"); } } } # flag database so a thumbnail appears on the site if ($alternative == -1) { sql_query("update resource set has_image=1,preview_extension='jpg',preview_attempts=0,file_modified=now() where ref='{$ref}'"); } } } else { # If using ImageMagick, call preview_preprocessing.php which makes use of ImageMagick and other tools # to attempt to extract a preview. global $no_preview_extensions; if (isset($imagemagick_path) && !in_array(strtolower($extension), $no_preview_extensions)) { include dirname(__FILE__) . "/preview_preprocessing.php"; } } return true; }
function create_previews($ref, $thumbonly = false, $extension = "jpg", $previewonly = false, $previewbased = false, $alternative = -1, $ignoremaxsize = false, $ingested = false) { global $keep_for_hpr, $imagemagick_path, $preview_generate_max_file_size, $autorotate_no_ingest; // keep_for_hpr will be set to true if necessary in preview_preprocessing.php to indicate that an intermediate jpg can serve as the hpr. // otherwise when the file extension is a jpg it's assumed no hpr is needed. # Debug debug("create_previews(ref={$ref},thumbonly={$thumbonly},extension={$extension},previewonly={$previewonly},previewbased={$previewbased},alternative={$alternative},ingested={$ingested})"); if (!$previewonly) { // make sure the extension is the same as the original so checksums aren't done for previews $o_ext = sql_value("select file_extension value from resource where ref={$ref}", ""); if ($extension == $o_ext) { debug("create_previews - generate checksum for {$ref}"); generate_file_checksum($ref, $extension); } } # first reset preview tweaks to 0 sql_query("update resource set preview_tweaks = '0|1' where ref = '{$ref}'"); // for compatibility with transform plugin, remove any // transform previews for this resource when regenerating previews $tpdir = get_temp_dir() . "/transform_plugin"; if (is_dir($tpdir) && file_exists("{$tpdir}/pre_{$ref}.jpg")) { unlink("{$tpdir}/pre_{$ref}.jpg"); } # pages/tools/update_previews.php?previewbased=true # use previewbased to avoid touching original files (to preserve manually-uploaded preview images # when regenerating previews (i.e. for watermarks) if ($previewbased || $autorotate_no_ingest && !$ingested) { $file = get_resource_path($ref, true, "lpr", false, "jpg", -1, 1, false, "", $alternative); if (!file_exists($file)) { $file = get_resource_path($ref, true, "scr", false, "jpg", -1, 1, false, "", $alternative); if (!file_exists($file)) { $file = get_resource_path($ref, true, "pre", false, "jpg", -1, 1, false, "", $alternative); if (!file_exists($file) && $autorotate_no_ingest && !$ingested) { $file = get_resource_path($ref, true, "", false, $extension, -1, 1, false, "", $alternative); } } } } else { if (!$previewonly) { $file = get_resource_path($ref, true, "", false, $extension, -1, 1, false, "", $alternative); } else { # We're generating based on a new preview (scr) image. $file = get_resource_path($ref, true, "tmp", false, "jpg"); } } # Debug debug("File source is {$file}"); # Make sure the file exists, if not update preview_attempts so that we don't keep trying to generate a preview if (!file_exists($file)) { sql_query("update resource set preview_attempts=ifnull(preview_attempts,0) + 1 where ref='{$ref}'"); return false; } # If configured, make sure the file is within the size limit for preview generation if (isset($preview_generate_max_file_size) && !$ignoremaxsize) { $filesize = filesize_unlimited($file) / (1024 * 1024); # Get filesize in MB if ($filesize > $preview_generate_max_file_size) { return false; } } # Locate imagemagick. $convert_fullpath = get_utility_path("im-convert"); if ($convert_fullpath == false) { debug("ERROR: Could not find ImageMagick 'convert' utility at location '{$imagemagick_path}'"); return false; } # Handle alternative image file generation. global $image_alternatives; if (isset($image_alternatives) && $alternative == -1) { for ($n = 0; $n < count($image_alternatives); $n++) { $exts = explode(",", $image_alternatives[$n]["source_extensions"]); if (in_array($extension, $exts)) { # Remove any existing alternative file(s) with this name. $existing = sql_query("select ref from resource_alt_files where resource='{$ref}' and name='" . escape_check($image_alternatives[$n]["name"]) . "'"); for ($m = 0; $m < count($existing); $m++) { delete_alternative_file($ref, $existing[$m]["ref"]); } # Create the alternative file. $aref = add_alternative_file($ref, $image_alternatives[$n]["name"]); $apath = get_resource_path($ref, true, "", true, $image_alternatives[$n]["target_extension"], -1, 1, false, "", $aref); $source_profile = ''; if ($image_alternatives[$n]["icc"] === true) { $iccpath = get_resource_path($ref, true, '', false, $extension) . '.icc'; global $icc_extraction; global $ffmpeg_supported_extensions; if (!file_exists($iccpath) && $extension != "pdf" && !in_array($extension, $ffmpeg_supported_extensions)) { // extracted profile doesn't exist. Try extracting. extract_icc_profile($ref, $extension); } if (file_exists($iccpath)) { $source_profile = ' -strip -profile ' . $iccpath; } } # Process the image $version = get_imagemagick_version(); if ($version[0] > 5 || $version[0] == 5 && $version[1] > 5 || $version[0] == 5 && $version[1] == 5 && $version[2] > 7) { // Use the new imagemagick command syntax (file then parameters) $command = $convert_fullpath . ' ' . escapeshellarg($file) . ($extension == 'psd' ? '[0] +matte' : '') . $source_profile . ' ' . $image_alternatives[$n]['params'] . ' ' . escapeshellarg($apath); } else { // Use the old imagemagick command syntax (parameters then file) $command = $convert_fullpath . $source_profile . " " . $image_alternatives[$n]["params"] . " " . escapeshellarg($file) . " " . escapeshellarg($apath); } $output = run_command($command); if (file_exists($apath)) { # Update the database with the new file details. $file_size = filesize_unlimited($apath); sql_query("update resource_alt_files set file_name='" . escape_check($image_alternatives[$n]["filename"] . "." . $image_alternatives[$n]["target_extension"]) . "',file_extension='" . escape_check($image_alternatives[$n]["target_extension"]) . "',file_size='" . $file_size . "',creation_date=now() where ref='{$aref}'"); } } } } if ($extension == "jpg" || $extension == "jpeg" || $extension == "png" || $extension == "gif") { if (isset($imagemagick_path)) { create_previews_using_im($ref, $thumbonly, $extension, $previewonly, $previewbased, $alternative, $ingested); } else { # ---------------------------------------- # Use the GD library to perform the resize # ---------------------------------------- # For resource $ref, (re)create the various preview sizes listed in the table preview_sizes # Only create previews where the target size IS LESS THAN OR EQUAL TO the source size. # Set thumbonly=true to (re)generate thumbnails only. $sizes = ""; if ($thumbonly) { $sizes = " where id='thm' or id='col'"; } if ($previewonly) { $sizes = " where id='thm' or id='col' or id='pre' or id='scr'"; } # fetch source image size, if we fail, exit this function (file not an image, or file not a valid jpg/png/gif). if ((list($sw, $sh) = @getimagesize($file)) === false) { return false; } $ps = sql_query("select * from preview_size {$sizes}"); for ($n = 0; $n < count($ps); $n++) { # fetch target width and height $tw = $ps[$n]["width"]; $th = $ps[$n]["height"]; $id = $ps[$n]["id"]; # Find the target path $path = get_resource_path($ref, true, $ps[$n]["id"], false, "jpg", -1, 1, false, "", $alternative); if (file_exists($path) && !$previewbased) { unlink($path); } # Also try the watermarked version. $wpath = get_resource_path($ref, true, $ps[$n]["id"], false, "jpg", -1, 1, true, "", $alternative); if (file_exists($wpath)) { unlink($wpath); } # only create previews where the target size IS LESS THAN OR EQUAL TO the source size. # or when producing a small thumbnail (to make sure we have that as a minimum) if ($sw > $tw || $sh > $th || $id == "thm" || $id == "col") { # Calculate width and height. if ($sw > $sh) { $ratio = $tw / $sw; } else { $ratio = $th / $sh; } # Portrait $tw = floor($sw * $ratio); $th = floor($sh * $ratio); # ---------------------------------------- # Use the GD library to perform the resize # ---------------------------------------- $target = imagecreatetruecolor($tw, $th); if ($extension == "png") { $source = @imagecreatefrompng($file); if ($source === false) { return false; } } elseif ($extension == "gif") { $source = @imagecreatefromgif($file); if ($source === false) { return false; } } else { $source = @imagecreatefromjpeg($file); if ($source === false) { return false; } } imagecopyresampled($target, $source, 0, 0, 0, 0, $tw, $th, $sw, $sh); imagejpeg($target, $path, 90); if ($ps[$n]["id"] == "thm") { extract_mean_colour($target, $ref); } imagedestroy($target); } elseif ($id == "pre" || $id == "thm" || $id == "col") { # If the source is smaller than the pre/thm/col, we still need these sizes; just copy the file copy($file, get_resource_path($ref, true, $id, false, $extension, -1, 1, false, "", $alternative)); if ($id == "thm") { sql_query("update resource set thumb_width='{$sw}',thumb_height='{$sh}' where ref='{$ref}'"); } } } # flag database so a thumbnail appears on the site if ($alternative == -1) { sql_query("update resource set has_image=1,preview_extension='jpg',preview_attempts=0,file_modified=now() where ref='{$ref}'"); } } } else { # If using ImageMagick, call preview_preprocessing.php which makes use of ImageMagick and other tools # to attempt to extract a preview. global $no_preview_extensions; if (isset($imagemagick_path) && !in_array(strtolower($extension), $no_preview_extensions)) { include dirname(__FILE__) . "/preview_preprocessing.php"; } } return true; }
function ProcessFolder($folder) { #echo "<br>processing folder $folder"; global $syncdir,$nogo,$max,$count,$done,$modtimes,$lastsync, $ffmpeg_preview_extension, $staticsync_autotheme, $staticsync_folder_structure,$staticsync_extension_mapping_default, $staticsync_extension_mapping, $staticsync_mapped_category_tree,$staticsync_title_includes_path, $staticsync_ingest, $staticsync_mapfolders,$staticsync_alternatives_suffix; $collection=0; echo "Processing Folder: $folder\n"; # List all files in this folder. $dh=opendir($folder); while (($file = readdir($dh)) !== false) { $filetype=filetype($folder . "/" . $file); $fullpath=$folder . "/" . $file; $shortpath=str_replace($syncdir . "/","",$fullpath); # Work out extension $extension=explode(".",$file);$extension=trim(strtolower($extension[count($extension)-1])); if ($staticsync_mapped_category_tree) { $path_parts=explode("/",$shortpath); array_pop($path_parts); touch_category_tree_level($path_parts); } # -----FOLDERS------------- if ((($filetype=="dir") || $filetype=="link") && ($file!=".") && ($file!="..") && (strpos($nogo,"[" . $file . "]")===false) && strpos($file,$staticsync_alternatives_suffix)===false) { # Recurse #echo "\n$file : " . filemtime($folder . "/" . $file) . " > " . $lastsync; if (true || (strlen($lastsync)=="") || (filemtime($folder . "/" . $file)>($lastsync-26000))) { ProcessFolder($folder . "/" . $file); } } # -------FILES--------------- if (($filetype=="file") && (substr($file,0,1)!=".") && (strtolower($file)!="thumbs.db")) { # Already exists? if (!in_array($shortpath,$done)) { $count++;if ($count>$max) {return(true);} echo "Processing file: $fullpath\n"; if ($collection==0 && $staticsync_autotheme) { # Make a new collection for this folder. $e=explode("/",$shortpath); $theme=ucwords($e[0]); $themesql="theme='".ucwords(escape_check($e[0]))."'"; $themecolumns="theme"; $themevalues="'".ucwords(escape_check($e[0]))."'"; if ($staticsync_folder_structure){ for ($x=0;$x<count($e)-1;$x++){ if ($x==0){} else {$themeindex=$x+1; global $theme_category_levels; if ($themeindex>$theme_category_levels){ $theme_category_levels=$themeindex; if ($x==count($e)-2){echo "\n\nUPDATE THEME_CATEGORY_LEVELS TO $themeindex IN CONFIG!!!!\n\n";} } $themesql.=" and theme".$themeindex."='".ucwords(escape_check($e[$x]))."'"; $themevalues.=",'".ucwords(escape_check($e[$x]))."'"; $themecolumns.=",theme".$themeindex; } } } $name=(count($e)==1?"":$e[count($e)-2]); echo "\nCollection $name, theme=$theme"; $collection=sql_value("select ref value from collection where name='" . escape_check($name) . "' and " . $themesql ,0); if ($collection==0){ sql_query("insert into collection (name,created,public,$themecolumns,allow_changes) values ('" . escape_check($name) . "',now(),1,".$themevalues.",0)"); $collection=sql_insert_id(); } } # Work out a resource type based on the extension. $type=$staticsync_extension_mapping_default; reset ($staticsync_extension_mapping); foreach ($staticsync_extension_mapping as $rt=>$extensions) { if (in_array($extension,$extensions)) {$type=$rt;} } # Formulate a title if ($staticsync_title_includes_path) { $title=str_ireplace("." . $extension,"",str_replace("/"," - ",$shortpath)); $title=ucfirst(str_replace("_"," ",$title)); } else { $title=str_ireplace("." . $extension,"",$file); } # Import this file $r=import_resource($shortpath,$type,$title,$staticsync_ingest); if ($r!==false) { # Add to mapped category tree (if configured) if (isset($staticsync_mapped_category_tree)) { $basepath=""; # Save tree position to category tree field # For each node level, expand it back to the root so the full path is stored. for ($n=0;$n<count($path_parts);$n++) { if ($basepath!="") {$basepath.="~";} $basepath.=$path_parts[$n]; $path_parts[$n]=$basepath; } update_field ($r,$staticsync_mapped_category_tree,"," . join(",",$path_parts)); #echo "update_field($r,$staticsync_mapped_category_tree," . "," . join(",",$path_parts) . ");\n"; } // default access level. This may be overridden by metadata mapping. $accessval = 0; # StaticSync path / metadata mapping # Extract metadata from the file path as per $staticsync_mapfolders in config.php if (isset($staticsync_mapfolders)) { foreach ($staticsync_mapfolders as $mapfolder) { $match=$mapfolder["match"]; $field=$mapfolder["field"]; $level=$mapfolder["level"]; global $lang; if (strpos("/" . $shortpath,$match)!==false) { # Match. Extract metadata. $path_parts=explode("/",$shortpath); if ($level<count($path_parts)) { // special cases first. if ($field == 'access') { // access level is a special case // first determine if the value matches a defined access level $value = $path_parts[$level-1]; for ($n=0; $n<3; $n++){ // if we get an exact match or a match except for case if ($value == $lang["access" . $n] || strtoupper($value) == strtoupper($lang['access' . $n])){ $accessval = $n; echo "Will set access level to " . $lang['access' . $n] . " ($n)\n"; } } } else { # Save the value print_r($path_parts); $value=$path_parts[$level-1]; update_field ($r,$field,$value); echo " - Extracted metadata from path: $value\n"; } } } } } // update access level sql_query("update resource set access = '$accessval' where ref = '$r'"); # Add any alternative files $altpath=$fullpath . $staticsync_alternatives_suffix; if ($staticsync_ingest && file_exists($altpath)) { $adh=opendir($altpath); while (($altfile = readdir($adh)) !== false) { $filetype=filetype($altpath . "/" . $altfile); if (($filetype=="file") && (substr($file,0,1)!=".") && (strtolower($file)!="thumbs.db")) { # Create alternative file global $lang; # Find extension $ext=explode(".",$altfile);$ext=$ext[count($ext)-1]; $aref = add_alternative_file($r, $altfile, str_replace("?",strtoupper($ext),$lang["originalfileoftype"]), $altfile, $ext, filesize_unlimited($altpath . "/" . $altfile)); $path=get_resource_path($r, true, "", true, $ext, -1, 1, false, "", $aref); rename ($altpath . "/" . $altfile,$path); # Move alternative file } } } # Add to collection if ($staticsync_autotheme) { $test=""; $test=sql_query("select * from collection_resource where collection='$collection' and resource='$r'"); if (count($test)==0){ sql_query("insert into collection_resource(collection,resource,date_added) values ('$collection','$r',now())"); } } } else { # Import failed - file still being uploaded? echo " *** Skipping file - it was not possible to move the file (still being imported/uploaded?) \n"; } } else { # check modified date and update previews if necessary $filemod=filemtime($fullpath); if (array_key_exists($shortpath,$modtimes) && ($filemod>strtotime($modtimes[$shortpath]))) { # File has been modified since we last created previews. Create again. $rd=sql_query("select ref,has_image,file_modified,file_extension from resource where file_path='" . (escape_check($shortpath)) . "'"); if (count($rd)>0) { $rd=$rd[0]; $rref=$rd["ref"]; echo "Resource $rref has changed, regenerating previews: $fullpath\n"; extract_exif_comment($rref,$rd["file_extension"]); # extract text from documents (e.g. PDF, DOC). global $extracted_text_field; if (isset($extracted_text_field)) { if (isset($unoconv_path) && in_array($extension,$unoconv_extensions)){ // omit, since the unoconv process will do it during preview creation below } else { extract_text($rref,$extension); } } # Store original filename in field, if set global $filename_field; if (isset($filename_field)) { update_field($rref,$filename_field,$file); } create_previews($rref,false,$rd["file_extension"]); sql_query("update resource set file_modified=now() where ref='$rref'"); } } } } } }
if ($generate) { if (!hook("removepreviousalts", "", array($ffmpeg_alternatives, $file, $n))) { # Remove any existing alternative file(s) with this name. # SQL Connection may have hit a timeout sql_connect(); $existing = sql_query("select ref from resource_alt_files where resource='{$ref}' and name='" . escape_check($ffmpeg_alternatives[$n]["name"]) . "'"); for ($m = 0; $m < count($existing); $m++) { delete_alternative_file($ref, $existing[$m]["ref"]); } } $alt_type = ''; if (isset($ffmpeg_alternatives[$n]['alt_type'])) { $alt_type = $ffmpeg_alternatives[$n]["alt_type"]; } # Create the alternative file. $aref = add_alternative_file($ref, $ffmpeg_alternatives[$n]["name"], '', '', '', 0, $alt_type); $apath = get_resource_path($ref, true, "", true, $ffmpeg_alternatives[$n]["extension"], -1, 1, false, "", $aref); # Process the video $shell_exec_cmd = $ffmpeg_fullpath . " {$ffmpeg_global_options} -y -i " . escapeshellarg($file) . " " . $ffmpeg_alternatives[$n]["params"] . " " . escapeshellarg($apath); $tmp = hook("ffmpegmodaltparams", "", array($shell_exec_cmd, $ffmpeg_fullpath, $file, $n, $aref)); if ($tmp) { $shell_exec_cmd = $tmp; } $output = run_command($shell_exec_cmd); if (isset($qtfaststart_path)) { if ($qtfaststart_path && file_exists($qtfaststart_path . "/qt-faststart") && in_array($ffmpeg_alternatives[$n]["extension"], $qtfaststart_extensions)) { $apathtmp = $apath . ".tmp"; rename($apath, $apathtmp); $output = run_command($qtfaststart_path . "/qt-faststart " . escapeshellarg($apathtmp) . " " . escapeshellarg($apath) . " 2>&1"); unlink($apathtmp); }
function HookImagestreamUpload_pluploadInitialuploadprocessing() { #Support for uploading multi files as zip global $config_windows, $id, $targetDir, $resource_type, $imagestream_restypes, $imagestream_transitiontime, $zipcommand, $use_zip_extension, $userref, $session_hash, $filename, $filename_field, $collection_add, $archiver, $zipcommand, $ffmpeg_fullpath, $ffmpeg_preview_extension, $ffmpeg_preview_options, $ffmpeg_preview_min_height, $ffmpeg_preview_max_height, $ffmpeg_preview_min_width, $ffmpeg_preview_max_width, $lang, $collection_download_settings, $archiver_listfile_argument; $ffmpeg_fullpath = get_utility_path("ffmpeg"); debug("DEBUG: Imagestream - checking restype: " . $resource_type . $imagestream_restypes); if (in_array($resource_type, $imagestream_restypes)) { debug("DEBUG: Imagestream - uploading file"); #Check that we have an archiver configured $archiver_fullpath = get_utility_path("archiver"); if (!isset($zipcommand) && !$use_zip_extension) { if ($archiver_fullpath == false) { exit($lang["archiver-utility-not-found"]); } } echo print_r($_POST) . print_r($_GET); if (getval("lastqueued", "")) { debug("DEBUG: Imagestream - last queued file"); $ref = copy_resource(0 - $userref); # Copy from user template debug("DEBUG: Imagestream - creating resource: " . $ref); # Create the zip file $imagestreamzippath = get_resource_path($ref, true, "", true, "zip"); if ($use_zip_extension) { $zip = new ZipArchive(); $zip->open($imagestreamzippath, ZIPARCHIVE::CREATE); } $deletion_array = array(); debug("DEBUG: opening directory: " . $targetDir); $imagestream_files = opendir($targetDir); $imagestream_workingfiles = get_temp_dir() . DIRECTORY_SEPARATOR . "plupload" . DIRECTORY_SEPARATOR . $session_hash . "workingfiles"; if (!file_exists($imagestream_workingfiles)) { if ($config_windows) { @mkdir($imagestream_workingfiles); } else { @mkdir($imagestream_workingfiles, 0777, true); } } $filenumber = 00; $imagestream_filelist = array(); while ($imagestream_filelist[] = readdir($imagestream_files)) { sort($imagestream_filelist); } closedir($imagestream_files); $imageindex = 1; foreach ($imagestream_filelist as $imagestream_file) { if ($imagestream_file != '.' && $imagestream_file != '..') { $filenumber = sprintf("%03d", $filenumber); $deletion_array[] = $targetDir . DIRECTORY_SEPARATOR . $imagestream_file; if (!$use_zip_extension) { $imagestreamcmd_file = get_temp_dir(false, $id) . "/imagestreamzipcmd" . $imagestream_file . ".txt"; $fh = fopen($imagestreamcmd_file, 'w') or die("can't open file"); fwrite($fh, $targetDir . DIRECTORY_SEPARATOR . $imagestream_file . "\r\n"); fclose($fh); $deletion_array[] = $imagestreamcmd_file; } if ($use_zip_extension) { debug("DEBUG: Imagestream - adding filename: " . $imagestream_file); debug("DEBUG: using zip PHP extension, set up zip at : " . $imagestreamzippath); $zip->addFile($imagestream_file); debug(" Added files number : " . $zip->numFiles); $wait = $zip->close(); debug("DEBUG: closed zip"); } else { if ($archiver_fullpath) { debug("DEBUG: using archiver, running command: \r\n" . $archiver_fullpath . " " . $collection_download_settings[0]["arguments"] . " " . escapeshellarg($imagestreamzippath) . " " . $archiver_listfile_argument . escapeshellarg($imagestream_file)); run_command($archiver_fullpath . " " . $collection_download_settings[0]["arguments"] . " " . escapeshellarg($imagestreamzippath) . " " . $archiver_listfile_argument . escapeshellarg($imagestreamcmd_file)); } else { if (!$use_zip_extension) { if ($config_windows) { debug("DEBUG: using zip command: . {$zipcommand} " . escapeshellarg($imagestreamzippath) . " @" . escapeshellarg($imagestreamcmd_file)); exec("{$zipcommand} " . escapeshellarg($imagestreamzippath) . " @" . escapeshellarg($imagestreamcmd_file)); } else { # Pipe the command file, containing the filenames, to the executable. exec("{$zipcommand} " . escapeshellarg($imagestreamzippath) . " -@ < " . escapeshellarg($imagestreamcmd_file)); } } } } #Create a JPEG if not already in that format $imagestream_file_parts = explode('.', $imagestream_file); $imagestream_file_ext = $imagestream_file_parts[count($imagestream_file_parts) - 1]; $imagestream_file_noext = basename($imagestream_file, $imagestream_file_ext); global $imagemagick_path, $imagemagick_quality; $icc_transform_complete = false; # Camera RAW images need prefix if (preg_match('/^(dng|nef|x3f|cr2|crw|mrw|orf|raf|dcr)$/i', $imagestream_file_ext, $rawext)) { $prefix = $rawext[0] . ':'; } # Locate imagemagick. $convert_fullpath = get_utility_path("im-convert"); if ($convert_fullpath == false) { exit("Could not find ImageMagick 'convert' utility at location '{$imagemagick_path}'."); } $prefix = ''; if ($prefix == "cr2:" || $prefix == "nef:") { $flatten = ""; } else { $flatten = "-flatten"; } $command = $convert_fullpath . ' ' . escapeshellarg($targetDir . DIRECTORY_SEPARATOR . $imagestream_file) . ' +matte ' . $flatten . ' -quality ' . $imagemagick_quality; # EXPERIMENTAL CODE TO USE EXISTING ICC PROFILE IF PRESENT global $icc_extraction, $icc_preview_profile, $icc_preview_options, $ffmpeg_supported_extensions; if ($icc_extraction) { $iccpath = $targetDir . DIRECTORY_SEPARATOR . $imagestream_file . '.icc'; if (!file_exists($iccpath) && !isset($iccfound) && $extension != "pdf" && !in_array($imagestream_file_ext, $ffmpeg_supported_extensions)) { // extracted profile doesn't exist. Try extracting. if (extract_icc_profile($ref, $imagestream_file_ext)) { $iccfound = true; } else { $iccfound = false; } } } if ($icc_extraction && file_exists($iccpath) && !$icc_transform_complete) { // we have an extracted ICC profile, so use it as source $targetprofile = dirname(__FILE__) . '/../iccprofiles/' . $icc_preview_profile; $profile = " +profile \"*\" -profile {$iccpath} {$icc_preview_options} -profile {$targetprofile} +profile \"*\" "; $icc_transform_complete = true; } else { // use existing strategy for color profiles # Preserve colour profiles? (omit for smaller sizes) $profile = "+profile \"*\" -colorspace RGB"; # By default, strip the colour profiles ('+' is remove the profile, confusingly) #if ($imagemagick_preserve_profiles && $id!="thm" && $id!="col" && $id!="pre" && $id!="scr") {$profile="";} } $runcommand = $command . " +matte {$profile} " . escapeshellarg($imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $filenumber . ".jpg"); $deletion_array[] = $imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $filenumber . ".jpg"; $output = run_command($runcommand); debug("processed file" . $filenumber . ": " . $imagestream_file . "\r\n"); debug("Image index: " . $imageindex . ". file count: " . count($imagestream_filelist)); if ($filenumber == 00) { $snapshotsize = getimagesize($imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $filenumber . ".jpg"); list($width, $height) = $snapshotsize; # Frame size must be a multiple of two if ($width % 2) { $width++; } if ($height % 2) { $height++; } } if ($imageindex == count($imagestream_filelist) - 1) { $additionalfile = $filenumber + 1; $additionalfile = sprintf("%03d", $additionalfile); copy($imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $filenumber . ".jpg", $imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $additionalfile . ".jpg"); $deletion_array[] = $imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream" . $additionalfile . ".jpg"; } $filenumber++; } #end of loop for each uploadedfile $imageindex++; } #Add the resource and move this zip file, set extension # Add to collection? if ($collection_add != "") { add_resource_to_collection($ref, $collection_add); } # Log this daily_stat("Resource upload", $ref); resource_log($ref, "u", 0); #Change this!!!!!!!!!!! #$status=upload_file($ref,true,false,false)); if (!$config_windows) { @chmod($imagestreamzippath, 0777); } # Store extension in the database and update file modified time. sql_query("update resource set file_extension='zip',preview_extension='zip',file_modified=now(), has_image=0 where ref='{$ref}'"); #update_field($ref,$filename_field,$filename); update_disk_usage($ref); # create the mp4 version # Add a new alternative file $aref = add_alternative_file($ref, "MP4 version"); $imagestreamqtfile = get_resource_path($ref, true, "", false, "mp4", -1, 1, false, "", $aref); $shell_exec_cmd = $ffmpeg_fullpath . " -loglevel panic -y -r " . $imagestream_transitiontime . " -i " . $imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream%3d.jpg -r " . $imagestream_transitiontime . " -s {$width}x{$height} " . $imagestreamqtfile; echo "Running command: " . $shell_exec_cmd; if ($config_windows) { $shell_exec_cmd = $ffmpeg_fullpath . " -loglevel panic -y -r " . $imagestream_transitiontime . " -i " . $imagestream_workingfiles . DIRECTORY_SEPARATOR . "imagestream%%3d.jpg -r " . $imagestream_transitiontime . " -s {$width}x{$height} " . $imagestreamqtfile; file_put_contents(get_temp_dir() . DIRECTORY_SEPARATOR . "imagestreammp4" . $session_hash . ".bat", $shell_exec_cmd); $shell_exec_cmd = get_temp_dir() . DIRECTORY_SEPARATOR . "imagestreammp4" . $session_hash . ".bat"; $deletion_array[] = $shell_exec_cmd; } run_command($shell_exec_cmd); debug("DEBUG created slideshow MP4 video"); if (!$config_windows) { @chmod($imagestreamqtfile, 0777); } $file_size = @filesize_unlimited($imagestreamqtfile); # Save alternative file data. sql_query("update resource_alt_files set file_name='quicktime.mp4',file_extension='mp4',file_size='" . $file_size . "',creation_date=now() where resource='{$ref}' and ref='{$aref}'"); #create the FLV preview as per normal video processing if possible? if ($height < $ffmpeg_preview_min_height) { $height = $ffmpeg_preview_min_height; } if ($width < $ffmpeg_preview_min_width) { $width = $ffmpeg_preview_min_width; } if ($height > $ffmpeg_preview_max_height) { $width = ceil($width * ($ffmpeg_preview_max_height / $height)); $height = $ffmpeg_preview_max_height; } if ($width > $ffmpeg_preview_max_width) { $height = ceil($height * ($ffmpeg_preview_max_width / $width)); $width = $ffmpeg_preview_max_width; } $flvzippreviewfile = get_resource_path($ref, true, "pre", false, $ffmpeg_preview_extension); $shell_exec_cmd = $ffmpeg_fullpath . " -loglevel panic -y -i " . $imagestreamqtfile . " {$ffmpeg_preview_options} -s {$width}x{$height} " . $flvzippreviewfile; debug("Running command: " . $shell_exec_cmd); if ($config_windows) { file_put_contents(get_temp_dir() . DIRECTORY_SEPARATOR . "imagestreamflv" . $session_hash . ".bat", $shell_exec_cmd); $shell_exec_cmd = get_temp_dir() . DIRECTORY_SEPARATOR . "imagestreamflv" . $session_hash . ".bat"; $deletion_array[] = $shell_exec_cmd; } run_command($shell_exec_cmd); debug("DEBUG created slideshow FLV video"); if (!$config_windows) { @chmod($flvzippreviewfile, 0777); } #Tidy up rcRmdir($imagestream_workingfiles); rcRmdir($targetDir); foreach ($deletion_array as $tmpfile) { debug("\r\nDEBUG: Deleting: " . $tmpfile); delete_exif_tmpfile($tmpfile); } echo "SUCCESS"; #return true; exit; } else { echo "SUCCESS"; exit; } return true; } else { return false; } }
} elseif (preg_match("/^_ORIG[0-9]*/i", $thisfilesuffix)) { $alt_title = "Original Scan"; } elseif (preg_match("/^_TPV[0-9]*/i", $thisfilesuffix)) { $alt_title = "Title Page Verso"; } elseif (preg_match("/^_TP[0-9]*/i", $thisfilesuffix)) { $alt_title = "Title Page"; } elseif (preg_match("/^_COV[0-9]*/i", $thisfilesuffix)) { $alt_title = "Cover"; } elseif (preg_match("/^_SCR[0-9]*/i", $thisfilesuffix)) { $alt_title = "Inscription"; } elseif (preg_match("/^_EX[0-9]*/i", $thisfilesuffix)) { $alt_title = "Enclosure"; } else { $alt_title = $filename; } $aref = add_alternative_file($resource, $alt_title, strtoupper($ext) . " " . $lang["file"], $thefile, $ext, filesize_unlimited($thefile)); $path = get_resource_path($resource, true, "", true, $ext, -1, 1, false, "", $aref); rename($thefile, $path); # Move alternative file global $alternative_file_previews; if ($alternative_file_previews) { create_previews($resource, false, $ext, false, false, $aref); } } else { echo date('Y-m-d H:i:s '); echo "matching resource not found.\n"; } } } } function dir_tree($dir)
function recover_resource_files($id, $res, $meta, $alts) { // this is where we actually start doing the import global $res_skipped; $ext = pathinfo($res, PATHINFO_EXTENSION); if (sql_value("select count(*) value from resource where ref = '{$id}'", "0") > 0) { echo "resource {$id} already exists! Skipping!\n"; $res_skipped++; return false; } else { echo "new resource\n"; // 1: photo, 2:document, 3:video, 4: audio // going to have to guess at the type for now, since the xml file did not record it. Fixme - xml file should have this. global $ffmpeg_supported_extensions, $ffmpeg_audio_extensions, $camera_autorotation_ext, $unoconv_extensions; if (in_array($ext, $ffmpeg_supported_extensions)) { $rtype = '3'; } elseif (in_array($ext, $ffmpeg_audio_extensions)) { $rtype = '4'; } elseif (in_array($ext, $unoconv_extensions)) { $rtype = '2'; } elseif (in_array($ext, $camera_autorotation_ext)) { $rtype = '1'; } else { $rtype = 'null'; } $sql = "insert into resource (ref, title, file_extension,resource_type) values ('{$id}','RECOVERED','{$ext}','{$rtype}')"; sql_query($sql); $newpath = get_resource_path($id, true, '', true, $ext); if (!copy($res, $newpath)) { echo "ERROR copying {$res}.\n"; die; } // fixme: add alternates foreach ($alts as $altid => $altpath) { $filext = pathinfo($altpath, PATHINFO_EXTENSION); $filesize = filesize_unlimited($altpath); $newid = add_alternative_file($id, "{$altid}.{$filext}", '', '', $filext, $filesize); $newpath = get_resource_path($id, true, "", false, $filext, -1, 1, false, "", $newid); if (!copy($altpath, $newpath)) { echo "ERROR copying {$res}.\n"; die; } echo "previews: " . create_previews($id, false, $filext, false, false, $newid); echo "\n\n"; } create_previews($id, false, $ext); populate_metadata_from_dump($id, $meta); } }
break; } } # Split action if (getval("method", "") != "") { $ranges = getval("ranges", ""); $rs = explode(",", $ranges); # Original file path $file = get_resource_path($ref, true, "", true, "pdf"); foreach ($rs as $r) { # For each range $s = explode(":", $r); $from = $s[0]; $to = $s[1]; if (getval("method", "") == "alternativefile") { $aref = add_alternative_file($ref, $lang["pages"] . " " . $from . " - " . $to, "", "", "pdf"); $copy_path = get_resource_path($ref, true, "", true, "pdf", -1, 1, false, "", $aref); } else { # Create a new resource based upon the metadata/type of the current resource. $copy = copy_resource($ref); # Find out the path to the original file. $copy_path = get_resource_path($copy, true, "", true, "pdf"); } # Extract this one page to a new resource. $ghostscript_fullpath = get_utility_path("ghostscript"); $gscommand = $ghostscript_fullpath . " -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=" . escapeshellarg($copy_path) . " -dFirstPage=" . $from . " -dLastPage=" . $to . " " . escapeshellarg($file); $output = run_command($gscommand); if (getval("method", "") == "alternativefile") { # Preview creation for alternative files (enabled via config) global $alternative_file_previews; if ($alternative_file_previews) {
if ($cropper_enable_alternative_files && !$download && !$original && getval("slideshow", "") == "" && !$cropperestricted) { // we are supposed to make an alternative // note that we will now record transformation applied to alt files for future use $sql = "update resource_alt_files set file_name='{$filename}." . $lcext . "',file_extension='{$lcext}', file_size = '{$newfilesize}', description = concat(description,'" . $deschyphen . $newfilewidth . " x " . $newfileheight . " " . $lang['pixels'] . " {$mptext}') "; $sql .= ", transform_scale_w=" . ($new_width > 0 ? "'{$new_width}'" : "null") . ", transform_scale_h=" . ($new_height > 0 ? "'{$new_height}'" : "null") . ""; $sql .= ", transform_crop_w=" . ($finalwidth > 0 ? "'{$finalwidth}'" : "null") . ", transform_crop_h=" . ($finalheight > 0 ? "'{$finalheight}'" : "null") . ", transform_crop_x=" . ($finalxcoord > 0 ? "'{$finalxcoord}'" : "null") . ", transform_crop_y=" . ($finalycoord > 0 ? "'{$finalycoord}'" : "null") . ""; $sql .= ", transform_flop=" . ($flip ? "'1'" : "null") . ", transform_rotation=" . ($rotation > 0 ? "'{$rotation}'" : "null") . ""; $sql .= " where ref='{$newfile}'"; $result = sql_query($sql); resource_log($ref, 'b', '', "{$new_ext} " . strtolower($verb) . " to {$newfilewidth} x {$newfileheight}"); } elseif ($original && getval("slideshow", "") == "" && !$cropperestricted) { // we are supposed to replace the original file $origalttitle = $lang['priorversion']; $origaltdesc = $lang['replaced'] . " " . strftime("%Y-%m-%d, %H:%M"); $origfilename = sql_value("select value from resource_data left join resource_type_field on resource_data.resource_type_field = resource_type_field.ref where resource = '{$ref}' and name = 'original_filename'", $ref . "_original.{$orig_ext}"); $origalt = add_alternative_file($ref, $origalttitle, $origaltdesc); $origaltpath = get_resource_path($ref, true, "", true, $orig_ext, -1, 1, false, "", $origalt); $mporig = round($origwidth * $origheight / 1000000, 2); $filesizeorig = filesize_unlimited($originalpath); rename($originalpath, $origaltpath); $result = sql_query("update resource_alt_files set file_name='{$origfilename}',file_extension='{$orig_ext}',file_size = '{$filesizeorig}' where ref='{$origalt}'"); $neworigpath = get_resource_path($ref, true, '', false, $new_ext); rename($newpath, $neworigpath); $result = sql_query("update resource set file_extension = '{$new_ext}' where ref = '{$ref}' limit 1"); // update extension resource_log($ref, 't', '', 'original transformed'); create_previews($ref, false, $orig_ext, false, false, $origalt); create_previews($ref, false, $new_ext); # delete existing resource_dimensions sql_query("delete from resource_dimensions where resource='{$ref}'"); sql_query("insert into resource_dimensions (resource, width, height, file_size) values ('{$ref}', '{$newfilewidth}', '{$newfileheight}', '{$newfilesize}')");
if (substr($order_by,0,5)=="field"){$default_sort="ASC";} $sort=getval("sort",$default_sort); # Fetch resource data. $resource=get_resource_data($ref); # Not allowed to edit this resource? if ((!checkperm("e" . $resource["archive"])) && ($ref>0)) {exit ("Permission denied.");} hook("pageevaluation"); # Handle adding a new file if (getval("newfile","")!="") { $newfile=add_alternative_file($ref,getvalescaped("newfile","")); redirect($baseurl_short."pages/alternative_file.php?resource=$ref&ref=$newfile&search=".urlencode($search)."&offset=$offset&order_by=$order_by&sort=$sort&archive=$archive"); } # Handle deleting a file if (getval("filedelete","")!="") { delete_alternative_file($ref,getvalescaped("filedelete","")); } include "../include/header.php"; ?> <div class="BasicsBox"> <p> <a onClick="return CentralSpaceLoad(this,true);" href="<?php echo $baseurl_short?>pages/edit.php?ref=<?php echo urlencode($ref) ?>&search=<?php echo urlencode($search)?>&offset=<?php echo urlencode($offset)?>&order_by=<?php echo urlencode($order_by)?>&sort=<?php echo $sort?>&archive=<?php echo urlencode($archive)?>">< <?php echo $lang["backtoeditresource"]?></a><br / > <a onClick="return CentralSpaceLoad(this,true);" href="<?php echo $baseurl_short?>pages/view.php?ref=<?php echo urlencode($ref)?>&search=<?php echo urlencode($search)?>&offset=<?php echo urlencode($offset)?>&order_by=<?php echo urlencode($order_by)?>&sort=<?php echo $sort?>&archive=<?php echo urlencode($archive)?>">< <?php echo $lang["backtoresourceview"]?></a>