/** * Apply media transformation to media in specified field of current loaded row. When a transformation is applied * it is applied to all versions, including the "original." A copy of the original is stashed in a "virtual" version named "_undo_" * to make it possible to recover the original media, if desired, by calling removeMediaTransformations(). * * @param string $ps_field The name of the media field * @param string $ps_op A valid media transformation op code, as defined by the media plugin handling the media being transformed. * @param array $pa_params The parameters for the op code, as defined by the media plugin handling the media being transformed. * @param array $pa_options An array of options. No options are currently implemented. * * @return bool True on success, false if an error occurred. */ public function applyMediaTransformation($ps_field, $ps_op, $pa_params, $pa_options = null) { $va_media_info = $this->getMediaInfo($ps_field); if (!is_array($va_media_info)) { return null; } if (isset($pa_options['revert']) && $pa_options['revert'] && isset($va_media_info['_undo_'])) { $vs_path = $vs_undo_path = $this->getMediaPath($ps_field, '_undo_'); $va_transformation_history = array(); } else { $vs_path = $this->getMediaPath($ps_field, 'original'); // Copy original into "undo" slot (if undo slot is empty) $vs_undo_path = !isset($va_media_info['_undo_']) ? $vs_path : $this->getMediaPath($ps_field, '_undo_'); if (!is_array($va_transformation_history = $va_media_info['TRANSFORMATION_HISTORY'])) { $va_transformation_history = array(); } } // TODO: Check if transformation valid for this media // Apply transformation to original $o_media = new Media(); $o_media->read($vs_path); $o_media->transform($ps_op, $pa_params); $va_transformation_history[$ps_op][] = $pa_params; $vs_tmp_basename = tempnam(caGetTempDirPath(), 'ca_media_rotation_tmp'); $o_media->write($vs_tmp_basename, $o_media->get('mimetype'), array()); // Regenerate derivatives $this->setMode(ACCESS_WRITE); $this->set($ps_field, $vs_tmp_basename . "." . $va_media_info['original']['EXTENSION'], $vs_undo_path ? array('undo' => $vs_undo_path, 'TRANSFORMATION_HISTORY' => $va_transformation_history) : array('TRANSFORMATION_HISTORY' => $va_transformation_history)); $this->setAsChanged($ps_field); $this->update(); return $this->numErrors() ? false : true; }
public function write($filepath, $mimetype, $pa_options = null) { if (!$this->handle) { return false; } if (!($ext = $this->info["EXPORT"][$mimetype])) { # this plugin can't write this mimetype return false; } # is mimetype valid? switch ($mimetype) { # ------------------------------------ case 'image/jpeg': $vn_preview_width = $this->properties["width"]; $vn_preview_height = $this->properties["height"]; if (caMediaPluginFFfmpegInstalled($this->ops_path_to_ffmpeg)) { if (($vn_start_secs = $this->properties["duration"] / 8) > 120) { $vn_start_secs = 120; // always take a frame from the first two minutes to ensure performance (ffmpeg gets slow if it has to seek far into a movie to extract a frame) } exec($this->ops_path_to_ffmpeg . " -ss " . $vn_start_secs . " -i " . caEscapeShellArg($this->filepath) . " -f mjpeg -t 0.001 -y " . caEscapeShellArg($filepath . "." . $ext), $va_output, $vn_return); if ($vn_return < 0 || $vn_return > 1 || !@filesize($filepath . "." . $ext)) { @unlink($filepath . "." . $ext); // don't throw error as ffmpeg cannot generate frame still from all files } else { // resize image to desired dimensions $o_media = new Media(); $o_media->read($filepath . "." . $ext); $o_media->transform('SCALE', array('width' => $vn_preview_width, 'height' => $vn_preview_height, 'mode' => 'bounding_box', 'antialiasing' => 0.5)); $o_media->write($filepath . "_tmp", 'image/jpeg', array()); if (!$o_media->numErrors()) { rename($filepath . "_tmp." . $ext, $filepath . "." . $ext); } else { @unlink($filepath . "_tmp." . $ext); } } } // if output file doesn't exist, ffmpeg failed or isn't installed // so use default icons if (!file_exists($filepath . "." . $ext)) { return __CA_MEDIA_VIDEO_DEFAULT_ICON__; } $this->properties["mimetype"] = $mimetype; $this->properties["typename"] = isset($this->typenames[$mimetype]) ? $this->typenames[$mimetype] : $mimetype; break; # ------------------------------------ # ------------------------------------ default: if ($mimetype != $this->handle["mime_type"]) { # this plugin can't write this mimetype (no conversions allowed) $this->postError(1610, _t("Can't convert '%1' to %2", $this->handle["mime_type"], $mimetype), "WLPlugQuicktimeVR->write()"); return false; } # write the file if (!copy($this->filepath, $filepath . "." . $ext)) { $this->postError(1610, _t("Couldn't write file to '%1'", $filepath), "WLPlugQuicktimeVR->write()"); return false; } break; # ------------------------------------ } return $filepath . "." . $ext; }
/** * Method invoked when the task queue needs to actually execute the task. For mediaproc this means * actually doing the processing of media! * * Return false on failure/error and sets the error property with an error description. Returns an array * with processing details on success. * * @param array $pa_parameters An unserialized parameters array for the current task (eg. unserialized data from ca_task_queue.parameters) * @return array Returns false on error, or an array with processing details on success */ public function process($pa_parameters) { $vs_table = $pa_parameters["TABLE"]; // name of table of record we're processing $vs_field = $pa_parameters["FIELD"]; // name of field in record we're processing $vs_pk = $pa_parameters["PK"]; // Field name of primary key of record we're processing $vn_id = $pa_parameters["PK_VAL"]; // Value of primary key $vs_input_mimetype = $pa_parameters["INPUT_MIMETYPE"]; // Mimetype of input file $vs_input_file = $pa_parameters["FILENAME"]; // Full path to input file // Array of media versions to process; keys are version names, // values are arrays with info about processing for that version // Currently the info array contains a single key, 'VOLUME', which indicates // the volume the version should be written to $va_versions = $pa_parameters["VERSIONS"]; $va_options = $pa_parameters["OPTIONS"]; // Array of processing options; names of options to employ are keys, settings are values // If true, then input media is *not* deleted $vb_dont_delete_original_media = (bool) $pa_parameters["DONT_DELETE_OLD_MEDIA"]; $va_report = array('errors' => array(), 'notes' => array()); $o_dm = Datamodel::load(); $o_media_volumes = new MediaVolumes(); $o_media = new Media(); $o_media_proc_settings = new MediaProcessingSettings($vs_table, $vs_field); $vs_media_type = $o_media_proc_settings->canAccept($vs_input_mimetype); $va_version_info = $o_media_proc_settings->getMediaTypeVersions($vs_media_type); if (!file_exists($vs_input_file)) { $o_eventlog = new EventLog(); $o_eventlog->log(array("CODE" => "DEBG", "SOURCE" => "TaskQueue->mediaproc->process()", "MESSAGE" => "Record {$vs_table}.field = file '{$vs_input_file}' did not exist; queued file was discarded")); $va_report['errors'][] = _t("Record %1.field = file '%2' did not exist; queued file was discarded", $vs_table, $vs_input_file); return $va_report; } if ($t_instance = $o_dm->getInstanceByTableName($vs_table, true)) { if ($t_instance->hasField($vs_field)) { if (!$t_instance->load($vn_id)) { # record no longer exists if (!$vb_dont_delete_original_media) { @unlink($vs_input_file); } $o_eventlog = new EventLog(); $o_eventlog->log(array("CODE" => "DEBG", "SOURCE" => "TaskQueue->mediaproc->process()", "MESSAGE" => "Record {$vs_table}.field = {$vn_id} did not exist; queued file was discarded")); $o_media->cleanup(); $va_report['errors'][] = _t("Record %1.field = %2 did not exist; queued file was discarded", $vs_table, $vn_id); return $va_report; } } else { # bad field name $this->error->setError(551, _t("Invalid media field '%1' in table '%2'", $vs_field, $vs_table), "mediaproc->process()"); return false; } } else { # bad table name $this->error->setError(550, _t("Invalid media field table '%1'", $vs_table), "mediaproc->process()"); return false; } $va_old_media_to_delete = array(); foreach ($va_versions as $v => $va_version_settings) { $vs_use_icon = null; if (!file_exists($vs_input_file)) { $this->error->setError(505, _t("Input media file '%1' does not exist", $vs_input_file), "mediaproc->process()"); $o_media->cleanup(); return false; } if (!is_readable($vs_input_file)) { $this->error->setError(506, _t("Denied permission to read input media file '%1'", $vs_input_file), "mediaproc->process()"); $o_media->cleanup(); return false; } if (!$o_media->read($vs_input_file)) { $this->error->setError(1600, _t("Could not process input media file '%1': %2", $vs_input_file, join('; ', $o_media->getErrors())), "mediaproc->process()"); $o_media->cleanup(); return false; } $vs_rule = isset($va_version_info[$v]['RULE']) ? $va_version_info[$v]['RULE'] : ''; $va_rules = $o_media_proc_settings->getMediaTransformationRule($vs_rule); $va_volume_info = $o_media_volumes->getVolumeInformation($va_version_settings['VOLUME']); if (sizeof($va_rules) == 0) { $vs_output_mimetype = $vs_input_mimetype; # # don't process this media, just copy the file # $vs_ext = $o_media->mimetype2extension($vs_output_mimetype); if (!$vs_ext) { $this->error->setError(1600, _t("File could not be copied for %1; can't convert mimetype %2 to extension", $vs_field, $vs_output_mimetype), "mediaproc->process()"); $o_media->cleanup(); return false; } if (($vs_dirhash = $this->_getDirectoryHash($va_volume_info["absolutePath"], $vn_id)) === false) { $this->error->setError(1600, _t("Couldn't create subdirectory for file for %1", $vs_field), "mediaproc->process()"); $o_media->cleanup(); return false; } $vs_magic = rand(0, 99999); $vs_filepath = $va_volume_info["absolutePath"] . "/" . $vs_dirhash . "/" . $vs_magic . "_" . $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v . "." . $vs_ext; if (!copy($vs_input_file, $vs_filepath)) { $this->error->setError(504, _t("File could not be copied for %1", $vs_field), "mediaproc->process()"); $o_media->cleanup(); return false; } if (is_array($va_volume_info["mirrors"]) && sizeof($va_volume_info["mirrors"]) > 0) { $entity_key = join("/", array($vs_table, $vs_field, $vn_id, $v)); $row_key = join("/", array($vs_table, $vn_id)); foreach ($va_volume_info["mirrors"] as $vs_mirror_code => $va_mirror_info) { $vs_mirror_method = $va_mirror_info["method"]; $vs_queue = $vs_mirror_method . "mirror"; $tq = new TaskQueue(); if (!$tq->cancelPendingTasksForEntity($entity_key)) { $this->error->setError(560, _t("Could not cancel pending tasks"), "mediaproc->process()"); $o_media->cleanup(); return false; } if ($tq->addTask($vs_queue, array("MIRROR" => $vs_mirror_code, "VOLUME" => $va_version_settings['VOLUME'], "FIELD" => $vs_field, "TABLE" => $vs_table, "VERSION" => $v, "FILES" => array(array("FILE_PATH" => $vs_filepath, "ABS_PATH" => $va_volume_info["absolutePath"], "HASH" => $vs_dirhash, "FILENAME" => $vs_magic . "_" . $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v . "." . $vs_ext)), "MIRROR_INFO" => $va_mirror_info, "PK" => $vs_pk, "PK_VAL" => $vn_id), array("priority" => 100, "entity_key" => $entity_key, "row_key" => $row_key))) { continue; } else { $this->error->setError(100, _t("Couldn't queue mirror using '%1' for version '%2' (handler '%3')", $vs_mirror_method, $v, $vs_queue), "mediaproc->process()"); } } } $media_desc[$v] = array("VOLUME" => $va_version_settings['VOLUME'], "MIMETYPE" => $vs_output_mimetype, "WIDTH" => $o_media->get("width"), "HEIGHT" => $o_media->get("height"), "PROPERTIES" => $o_media->getProperties(), "FILENAME" => $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v . "." . $vs_ext, "HASH" => $vs_dirhash, "MAGIC" => $vs_magic, "EXTENSION" => $vs_ext, "MD5" => md5_file($vs_filepath)); } else { $o_media->set('version', $v); while (list($operation, $pa_parameters) = each($va_rules)) { if ($operation === 'SET') { foreach ($pa_parameters as $pp => $pv) { if ($pp == 'format') { $vs_output_mimetype = $pv; } else { $o_media->set($pp, $pv); } } } else { if (!$o_media->transform($operation, $pa_parameters)) { $this->error = $o_media->errors[0]; $o_media->cleanup(); return false; } } } if (!$vs_output_mimetype) { $vs_output_mimetype = $vs_input_mimetype; } if (!($vs_ext = $o_media->mimetype2extension($vs_output_mimetype))) { $this->error->setError(1600, _t("File could not be processed for %1; can't convert mimetype %2 to extension", $vs_field, $vs_output_mimetype), "mediaproc->process()"); $o_media->cleanup(); return false; } if (($vs_dirhash = $this->_getDirectoryHash($va_volume_info["absolutePath"], $vn_id)) === false) { $this->error->setError(1600, _t("Couldn't create subdirectory for file for %1", $vs_field), "mediaproc->process()"); $o_media->cleanup(); return false; } $vs_magic = rand(0, 99999); $vs_filepath = $va_volume_info["absolutePath"] . "/" . $vs_dirhash . "/" . $vs_magic . "_" . $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v; if (!($vs_output_file = $o_media->write($vs_filepath, $vs_output_mimetype, $va_options))) { $this->error = $o_media->errors[0]; $o_media->cleanup(); return false; } else { if ($vs_output_file === __CA_MEDIA_VIDEO_DEFAULT_ICON__ || $vs_output_file === __CA_MEDIA_AUDIO_DEFAULT_ICON__ || $vs_output_file === __CA_MEDIA_DOCUMENT_DEFAULT_ICON__) { $vs_use_icon = $vs_output_file; } else { $va_output_files[] = $vs_output_file; } } if (is_array($va_volume_info["mirrors"]) && sizeof($va_volume_info["mirrors"]) > 0) { $entity_key = join("/", array($vs_table, $vs_field, $vn_id, $v)); $row_key = join("/", array($vs_table, $vn_id)); foreach ($va_volume_info["mirrors"] as $vs_mirror_code => $va_mirror_info) { $vs_mirror_method = $va_mirror_info["method"]; $vs_queue = $vs_mirror_method . "mirror"; $tq = new TaskQueue(); if (!$tq->cancelPendingTasksForEntity($entity_key)) { $this->error->setError(560, _t("Could not cancel pending tasks"), "mediaproc->process()"); $o_media->cleanup(); return false; } if ($tq->addTask($vs_queue, array("MIRROR" => $vs_mirror_code, "VOLUME" => $va_version_settings['VOLUME'], "FIELD" => $vs_field, "TABLE" => $vs_table, "VERSION" => $v, "FILES" => array(array("FILE_PATH" => $vs_filepath, "ABS_PATH" => $va_volume_info["absolutePath"], "HASH" => $vs_dirhash, "FILENAME" => $vs_magic . "_" . $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v . "." . $vs_ext)), "MIRROR_INFO" => $va_mirror_info, "PK" => $vs_pk, "PK_VAL" => $vn_id), array("priority" => 100, "entity_key" => $entity_key, "row_key" => $row_key))) { continue; } else { $this->error->setError(100, _t("Couldn't queue mirror using '%1' for version '%2' (handler '%3')", $vs_mirror_method, $v, $vs_queue), "mediaproc->process()"); } } } if ($vs_use_icon) { $media_desc[$v] = array("MIMETYPE" => $vs_output_mimetype, "USE_ICON" => $vs_use_icon, "WIDTH" => $o_media->get("width"), "HEIGHT" => $o_media->get("height")); } else { $media_desc[$v] = array("VOLUME" => $va_version_settings['VOLUME'], "MIMETYPE" => $vs_output_mimetype, "WIDTH" => $o_media->get("width"), "HEIGHT" => $o_media->get("height"), "PROPERTIES" => $o_media->getProperties(), "FILENAME" => $vs_table . "_" . $vs_field . "_" . $vn_id . "_" . $v . "." . $vs_ext, "HASH" => $vs_dirhash, "MAGIC" => $vs_magic, "EXTENSION" => $vs_ext, "MD5" => md5_file($vs_filepath . "." . $vs_ext)); } } if (!$vb_dont_delete_original_media) { $vs_old_media_path = $t_instance->getMediaPath($vs_field, $v); if ($vs_old_media_path && $vs_filepath . "." . $vs_ext != $vs_old_media_path && $vs_input_file != vs_old_media_path) { //@unlink($t_instance->getMediaPath($vs_field, $v)); $va_old_media_to_delete[] = $vs_old_media_path; } } } # # Update record # if ($t_instance->load($vn_id)) { if (method_exists($t_instance, "useBlobAsMediaField")) { // support for attributes - force field to be FT_MEDIA $t_instance->useBlobAsMediaField(true); } $md = $t_instance->get($vs_field); $va_merged_media_desc = is_array($md) ? $md : array(); foreach ($media_desc as $vs_k => $va_v) { $va_merged_media_desc[$vs_k] = $va_v; } $t_instance->setMode(ACCESS_WRITE); $t_instance->setMediaInfo($vs_field, $va_merged_media_desc); $t_instance->update(); if ($t_instance->numErrors()) { # get rid of files we just created foreach ($va_output_files as $vs_to_delete) { @unlink($vs_to_delete); } $this->error->setError(560, _t("Could not update %1.%2: %3", $vs_table, $vs_field, join(", ", $t_instance->getErrors())), "mediaproc->process()"); $o_media->cleanup(); return false; } $va_report['notes'][] = _t("Processed file %1", $vs_input_file); // Generate preview frames for media that support that (Eg. video) // and add them as "multifiles" assuming the current model supports that (ca_object_representations does) $o_config = Configuration::load(); if (((bool) $o_config->get('video_preview_generate_frames') || (bool) $o_config->get('document_preview_generate_pages')) && method_exists($t_instance, 'addFile')) { $o_media->read($vs_input_file); $va_preview_frame_list = $o_media->writePreviews(array('width' => $o_media->get("width"), 'height' => $o_media->get("height"), 'numberOfFrames' => $o_config->get('video_preview_max_number_of_frames'), 'numberOfPages' => $o_config->get('document_preview_max_number_of_pages'), 'frameInterval' => $o_config->get('video_preview_interval_between_frames'), 'pageInterval' => $o_config->get('document_preview_interval_between_pages'), 'startAtTime' => $o_config->get('video_preview_start_at'), 'endAtTime' => $o_config->get('video_preview_end_at'), 'startAtPage' => $o_config->get('document_preview_start_page'), 'outputDirectory' => __CA_APP_DIR__ . '/tmp')); $t_instance->removeAllFiles(); // get rid of any previously existing frames (they might be hanging around if we're editing an existing record) if (is_array($va_preview_frame_list)) { foreach ($va_preview_frame_list as $vn_time => $vs_frame) { $t_instance->addFile($vs_frame, $vn_time, true); // the resource path for each frame is it's time, in seconds (may be fractional) for video, or page number for documents @unlink($vs_frame); // clean up tmp preview frame file } } } if (!$vb_dont_delete_original_media) { @unlink($vs_input_file); } foreach ($va_old_media_to_delete as $vs_to_delete) { @unlink($vs_to_delete); } $o_media->cleanup(); return $va_report; } else { # record no longer exists if (!$vb_dont_delete_original_media) { @unlink($vs_input_file); } $o_eventlog = new EventLog(); $o_eventlog->log(array("CODE" => "DEBG", "SOURCE" => "TaskQueue->mediaproc->process()", "MESSAGE" => "Record {$vs_table}.field = {$vn_id} did not exist; queued file was discarded")); $o_media->cleanup(); $va_report['errors'][] = _t("Record {$vs_table}.field = {$vn_id} did not exist; queued file was discarded"); return $va_report; } }
/** * @param array $pa_options Options include: * dontUseDefaultIcons = If set to true, write will fail rather than use default icons when preview can't be generated. Default is false – to use default icons. * */ public function write($ps_filepath, $ps_mimetype, $pa_options = null) { if (!$this->handle) { return false; } $vb_dont_allow_default_icons = isset($pa_options['dontUseDefaultIcons']) && $pa_options['dontUseDefaultIcons'] ? true : false; # is mimetype valid? if (!($vs_ext = $this->info["EXPORT"][$ps_mimetype])) { $this->postError(1610, _t("Can't convert file to %1", $ps_mimetype), "WLPlugPDFWand->write()"); return false; } # write the file if ($ps_mimetype == "application/pdf") { if (!copy($this->filepath, $ps_filepath . ".pdf")) { $this->postError(1610, _t("Couldn't write file to '%1'", $ps_filepath), "WLPlugPDFWand->write()"); return false; } } else { $vb_use_default_icon = true; if (caMediaPluginGhostscriptInstalled($this->ops_ghostscript_path)) { $vn_scaling_correction = $this->get("scaling_correction"); $vs_res = "72x72"; if (ceil($this->get("resolution")) > 0) { $vn_res = $this->get("resolution"); if ($vn_scaling_correction) { $vn_res *= 2; } $vs_res = ceil($vn_res) . "x" . ceil($vn_res); } $vn_page = ceil($this->get("page")); $vn_quality = ceil($this->get("quality")); if ($vn_quality > 100) { $vn_quality = 100; } if ($vn_quality < 1) { $vn_quality = 50; } if ($vn_page < 1) { $vn_page = 1; } if ($this->get("antialiasing")) { $vs_antialiasing = "-dTextAlphaBits=4 -dGraphicsAlphaBits=4"; } else { $vs_antialiasing = ""; } $vb_processed_preview = false; switch ($ps_mimetype) { case 'image/jpeg': exec($this->ops_ghostscript_path . " -dNOPAUSE -dBATCH -sDEVICE=" . ($vn_scaling_correction ? "tiff24nc" : "jpeg") . " {$vs_antialiasing} -dJPEGQ=" . $vn_quality . " -dFirstPage=" . $vn_page . " -dLastPage=" . $vn_page . " -sOutputFile=" . caEscapeShellArg($ps_filepath . "." . $vs_ext) . " -r" . $vs_res . " " . caEscapeShellArg($this->handle["filepath"]), $va_output, $vn_return); if ($vn_return == 0) { $vb_processed_preview = true; } break; case 'image/tiff': case 'image/png': case 'image/gif': exec($this->ops_ghostscript_path . " -dNOPAUSE -dBATCH -sDEVICE=tiff24nc {$vs_antialiasing} -dFirstPage=" . $vn_page . " -dLastPage=" . $vn_page . " -sOutputFile=" . caEscapeShellArg($ps_filepath . "." . $vs_ext) . " -r" . $vs_res . " " . caEscapeShellArg($this->handle["filepath"]), $va_output, $vn_return); if ($vn_return == 0) { $vb_processed_preview = true; } break; default: //die("Unsupported output type in PDF plug-in: $ps_mimetype [this shouldn't happen]"); break; } if ($vb_processed_preview) { if ($vs_crop = $this->get("crop")) { $o_media = new Media(); list($vn_w, $vn_h) = explode("x", $vs_crop); if ($vn_w > 0 && $vn_h > 0) { $o_media->read($ps_filepath . "." . $vs_ext); if (!$o_media->numErrors()) { $o_media->transform('SCALE', array('mode' => 'fill_box', 'antialiasing' => 0.5, 'width' => $vn_w, 'height' => $vn_h)); $o_media->write($ps_filepath, $ps_mimetype, array()); if (!$o_media->numErrors()) { $this->properties["width"] = $vn_w; $this->properties["height"] = $vn_h; $vb_use_default_icon = false; } } } } else { if ($vn_scaling_correction) { $o_media = new Media(true); $o_media->read($ps_filepath . "." . $vs_ext); if (!$o_media->numErrors()) { $vn_w = $o_media->get('width') * $vn_scaling_correction; $vn_h = $o_media->get('height') * $vn_scaling_correction; if ($vn_w > $vn_h || $this->get("target_height") == 0) { $vn_r = $this->get("target_width") / $vn_w; $vn_w = $this->get("target_width"); $vn_h *= $vn_r; } else { $vn_r = $this->get("target_height") / $vn_h; $vn_h = $this->get("target_height"); $vn_w *= $vn_r; } $vn_w = ceil($vn_w); $vn_h = ceil($vn_h); $this->properties["width"] = $vn_w; $this->properties["height"] = $vn_h; $o_media->transform('SCALE', array('mode' => 'bounding_box', 'antialiasing' => 0.5, 'width' => $vn_w, 'height' => $vn_h)); $o_media->transform('UNSHARPEN_MASK', array('sigma' => 0.5, 'radius' => 1, 'threshold' => 1.0, 'amount' => 0.1)); $o_media->set('quality', $vn_quality); $o_media->write($ps_filepath, $ps_mimetype, array()); if (!$o_media->numErrors()) { $vb_use_default_icon = false; } } } else { $vb_use_default_icon = false; } } } } if ($vb_use_default_icon) { return $vb_dont_allow_default_icons ? null : __CA_MEDIA_DOCUMENT_DEFAULT_ICON__; } } $this->properties["mimetype"] = $ps_mimetype; $this->properties["filesize"] = filesize($ps_filepath . "." . $vs_ext); $this->properties["typename"] = $this->typenames[$ps_mimetype]; return $ps_filepath . "." . $vs_ext; }
/** * @param array $pa_options Options include: * dontUseDefaultIcons = If set to true, write will fail rather than use default icons when preview can't be generated. Default is false – to use default icons. * */ public function write($ps_filepath, $ps_mimetype, $pa_options = null) { if (!$this->handle) { return false; } $vb_dont_allow_default_icons = isset($pa_options['dontUseDefaultIcons']) && $pa_options['dontUseDefaultIcons'] ? true : false; # is mimetype valid? if (!($vs_ext = $this->info["EXPORT"][$ps_mimetype])) { $this->postError(1610, _t("Can't convert file to %1", $ps_mimetype), "WLPlugMediaOffice->write()"); return false; } # write the file if ($ps_mimetype == "application/msword") { if (!copy($this->filepath, $ps_filepath . ".doc")) { $this->postError(1610, _t("Couldn't write file to '%1'", $ps_filepath), "WLPlugMediaOffice->write()"); return false; } } else { if (!isset(WLPlugMediaOffice::$s_pdf_conv_cache[$this->filepath]) && $this->opb_libre_office_installed) { $vs_tmp_dir_path = caGetTempDirPath(); $va_tmp = explode("/", $this->filepath); $vs_out_file = array_pop($va_tmp); putenv("HOME={$vs_tmp_dir_path}"); // libreoffice will fail silently if you don't set this environment variable to a directory it can write to. Nice way to waste a day debugging. Yay! exec($this->ops_libreoffice_path . " --nologo --nofirststartwizard --headless -convert-to pdf " . caEscapeShellArg($this->filepath) . " -outdir " . caEscapeShellArg($vs_tmp_dir_path) . " 2>&1", $va_output, $vn_return); exec($this->ops_libreoffice_path . " --nologo --nofirststartwizard --headless -convert-to html " . caEscapeShellArg($this->filepath) . " -outdir " . caEscapeShellArg($vs_tmp_dir_path) . " 2>&1", $va_output, $vn_return); $va_out_file = explode(".", $vs_out_file); if (sizeof($va_out_file) > 1) { array_pop($va_out_file); } $this->handle['content'] = strip_tags(file_get_contents("{$vs_tmp_dir_path}/" . join(".", $va_out_file) . ".html")); $va_out_file[] = 'pdf'; WLPlugMediaOffice::$s_pdf_conv_cache[$this->filepath] = "{$vs_tmp_dir_path}/" . join(".", $va_out_file); $o_media = new Media(); if ($o_media->read(WLPlugMediaOffice::$s_pdf_conv_cache[$this->filepath])) { $this->set('width', $this->ohandle["width"] = $o_media->get('width')); $this->set('height', $this->ohandle["height"] = $o_media->get('height')); $this->set('resolution', $this->ohandle["resolution"] = $o_media->get('resolution')); } } if ($vs_media = WLPlugMediaOffice::$s_pdf_conv_cache[$this->filepath]) { switch ($ps_mimetype) { case 'application/pdf': $o_media = new Media(); $o_media->read($vs_media); $o_media->set('version', $this->get('version')); $o_media->write($ps_filepath, $ps_mimetype, array()); $vs_filepath_with_extension = $ps_filepath . ".pdf"; break; case 'image/jpeg': $o_media = new Media(); $o_media->read($vs_media); $o_media->set('version', $this->get('version')); foreach ($this->opa_transformations as $va_transform) { $o_media->transform($va_transform['op'], $va_transform['params']); } $o_media->write($ps_filepath, $ps_mimetype, array()); $this->set('width', $o_media->get('width')); $this->set('height', $o_media->get('height')); $vs_filepath_with_extension = $ps_filepath . ".jpg"; break; } } # use default media icons if (!file_exists($vs_filepath_with_extension)) { // always jpegs return $vb_dont_allow_default_icons ? null : __CA_MEDIA_DOCUMENT_DEFAULT_ICON__; } } $this->properties["mimetype"] = $ps_mimetype; $this->properties["filesize"] = filesize($ps_filepath . "." . $vs_ext); //$this->properties["typename"] = $this->typenames[$ps_mimetype]; return $ps_filepath . "." . $vs_ext; }