From 8673015f30af8b51115a87b95208b966340a8ee5 Mon Sep 17 00:00:00 2001 From: rWatcher Date: Tue, 14 Sep 2010 14:00:07 -0400 Subject: [PATCH] Second attempt at commiting NoFFMPEG. --- modules/noffmpeg/helpers/movie.php | 137 ++++++++++++++++++++++ modules/noffmpeg/images/missing_movie.png | Bin 0 -> 8474 bytes modules/noffmpeg/module.info | 3 + 3 files changed, 140 insertions(+) create mode 100644 modules/noffmpeg/helpers/movie.php create mode 100644 modules/noffmpeg/images/missing_movie.png create mode 100644 modules/noffmpeg/module.info diff --git a/modules/noffmpeg/helpers/movie.php b/modules/noffmpeg/helpers/movie.php new file mode 100644 index 00000000..801796b8 --- /dev/null +++ b/modules/noffmpeg/helpers/movie.php @@ -0,0 +1,137 @@ +id", "", "post", array("id" => "g-edit-movie-form")); + $form->hidden("from_id")->value($movie->id); + $group = $form->group("edit_item")->label(t("Edit Movie")); + $group->input("title")->label(t("Title"))->value($movie->title) + ->error_messages("required", t("You must provide a title")) + ->error_messages("length", t("Your title is too long")); + $group->textarea("description")->label(t("Description"))->value($movie->description); + $group->input("name")->label(t("Filename"))->value($movie->name) + ->error_messages( + "conflict", t("There is already a movie, photo or album with this name")) + ->error_messages("no_slashes", t("The movie name can't contain a \"/\"")) + ->error_messages("no_trailing_period", t("The movie name can't end in \".\"")) + ->error_messages("illegal_data_file_extension", t("You cannot change the movie file extension")) + ->error_messages("required", t("You must provide a movie file name")) + ->error_messages("length", t("Your movie file name is too long")); + $group->input("slug")->label(t("Internet Address"))->value($movie->slug) + ->error_messages( + "conflict", t("There is already a movie, photo or album with this internet address")) + ->error_messages( + "not_url_safe", + t("The internet address should contain only letters, numbers, hyphens and underscores")) + ->error_messages("required", t("You must provide an internet address")) + ->error_messages("length", t("Your internet address is too long")); + + module::event("item_edit_form", $movie, $form); + + $group = $form->group("buttons")->label(""); + $group->submit("")->value(t("Modify")); + + return $form; + } + + static function extract_frame($input_file, $output_file) { + $ffmpeg = self::find_ffmpeg(); + if (empty($ffmpeg)) { + // BEGIN rWatcher Edit. + copy(MODPATH . "noffmpeg/images/missing_movie.png", $output_file); + //throw new Exception("@todo MISSING_FFMPEG"); + // END rWatcher Edit. + } + + $cmd = escapeshellcmd($ffmpeg) . " -i " . escapeshellarg($input_file) . + " -an -ss 00:00:03 -an -r 1 -vframes 1" . + " -y -f mjpeg " . escapeshellarg($output_file) . " 2>&1"; + exec($cmd); + + clearstatcache(); // use $filename parameter when PHP_version is 5.3+ + if (filesize($output_file) == 0) { + // Maybe the movie is shorter, fall back to the first frame. + $cmd = escapeshellcmd($ffmpeg) . " -i " . escapeshellarg($input_file) . + " -an -an -r 1 -vframes 1" . + " -y -f mjpeg " . escapeshellarg($output_file) . " 2>&1"; + exec($cmd); + + clearstatcache(); + if (filesize($output_file) == 0) { + throw new Exception("@todo FFMPEG_FAILED"); + } + } + } + + static function find_ffmpeg() { + if (!($ffmpeg_path = module::get_var("gallery", "ffmpeg_path")) || !file_exists($ffmpeg_path)) { + $graphics_path = module::get_var("gallery", "graphics_toolkit_path", null); + + putenv("PATH=" . getenv("PATH") . (empty($graphics_path) ? "" : ":$graphics_path") . + ":/usr/local/bin:/opt/local/bin:/opt/bin"); + if (function_exists("exec")) { + $ffmpeg_path = exec("which ffmpeg"); + } + + module::set_var("gallery", "ffmpeg_path", $ffmpeg_path); + } + return $ffmpeg_path; + } + + + /** + * Return the width, height, mime_type and extension of the given movie file. + */ + static function get_file_metadata($file_path) { + $ffmpeg = self::find_ffmpeg(); + if (empty($ffmpeg)) { + // BEGIN rWatcher Edit. + $pi = pathinfo($file_path); + $extension = isset($pi["extension"]) ? $pi["extension"] : "flv"; // No extension? Assume FLV. + $mime_type = in_array(strtolower($extension), array("mp4", "m4v")) ? + "video/mp4" : "video/x-flv"; + return array(320, 240, $mime_type, $extension); + //throw new Exception("@todo MISSING_FFMPEG"); + // END rWatcher Edit. + } + + $cmd = escapeshellcmd($ffmpeg) . " -i " . escapeshellarg($file_path) . " 2>&1"; + $result = `$cmd`; + if (preg_match("/Stream.*?Video:.*?(\d+)x(\d+)/", $result, $regs)) { + list ($width, $height) = array($regs[1], $regs[2]); + } else { + list ($width, $height) = array(0, 0); + } + + $pi = pathinfo($file_path); + $extension = isset($pi["extension"]) ? $pi["extension"] : "flv"; // No extension? Assume FLV. + $mime_type = in_array(strtolower($extension), array("mp4", "m4v")) ? + "video/mp4" : "video/x-flv"; + + return array($width, $height, $mime_type, $extension); + } + +} diff --git a/modules/noffmpeg/images/missing_movie.png b/modules/noffmpeg/images/missing_movie.png new file mode 100644 index 0000000000000000000000000000000000000000..fdc97779a64dc9d872d8c882f85f80dd54a99ae5 GIT binary patch literal 8474 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 v-=8YMvqI>T_g&d4NoiWruzDT