diff options
Diffstat (limited to 'modules')
-rw-r--r-- | modules/server_add/controllers/server_add.php | 46 | ||||
-rw-r--r-- | modules/server_add/helpers/server_add_task.php | 77 | ||||
-rw-r--r-- | modules/server_add/js/server_add.js | 16 |
3 files changed, 76 insertions, 63 deletions
diff --git a/modules/server_add/controllers/server_add.php b/modules/server_add/controllers/server_add.php index dd6c5d00..8c99af24 100644 --- a/modules/server_add/controllers/server_add.php +++ b/modules/server_add/controllers/server_add.php @@ -66,19 +66,22 @@ class Server_Add_Controller extends Controller { function start($id) { access::verify_csrf(); + $paths = unserialize(module::get_var("server_add", "authorized_paths")); + $input_files = $this->input->post("path"); $files = array(); - foreach ($this->input->post("path") as $path) { - if (is_dir($path)) { - $dir = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), true); - foreach ($dir as $file) { - $extension = strtolower(substr(strrchr($file->getFilename(), '.'), 1)); - if ($file->isReadable() && - in_array($extension, array("gif", "jpeg", "jpg", "png", "flv", "mp4"))) { - $files[] = $file->getPathname(); - } + $total_count = 0; + foreach (array_keys($paths) as $valid_path) { + $path_length = strlen($valid_path); + foreach ($input_files as $key => $path) { + if ($path_valid = strpos($path, $valid_path) === 0) { + $relative_path = substr(dirname($path), $path_length); + $name = basename($path); + $files[$valid_path][] = array("path" => $relative_path, + "parent_id" => $id, "name" => basename($path), + "type" => is_dir($path) ? "album" : "file"); + $total_count++; + unset($input_files[$key]); } - } else { - $files[] = $path; } } @@ -86,13 +89,18 @@ class Server_Add_Controller extends Controller { ->callback("server_add_task::add_from_server") ->description(t("Add photos or movies from the local server")) ->name(t("Add from server")); - $task = task::create($task_def, array("item_id" => $id, "next" => 0, "paths" => $files)); + $task = task::create($task_def, array("item_id" => $id, "next_path" => 0, "files" => $files, + "counter" => 0, "position" => 0, "total" => $total_count)); batch::start(); print json_encode(array("result" => "started", "url" => url::site("server_add/add_photo/{$task->id}?csrf=" . access::csrf_token()), - "task" => $task->as_array())); + "task" => array( + "id" => $task->id, + "percent_complete" => $task->percent_complete, + "status" => $task->status, + "done" => $task->done))); } function add_photo($task_id) { @@ -111,11 +119,19 @@ class Server_Add_Controller extends Controller { break; } print json_encode(array("result" => "success", - "task" => $task->as_array())); + "task" => array( + "id" => $task->id, + "percent_complete" => $task->percent_complete, + "status" => $task->status, + "done" => $task->done))); } else { print json_encode(array("result" => "in_progress", - "task" => $task->as_array())); + "task" => array( + "id" => $task->id, + "percent_complete" => $task->percent_complete, + "status" => $task->status, + "done" => $task->done))); } } diff --git a/modules/server_add/helpers/server_add_task.php b/modules/server_add/helpers/server_add_task.php index 1475a28a..2812777d 100644 --- a/modules/server_add/helpers/server_add_task.php +++ b/modules/server_add/helpers/server_add_task.php @@ -26,60 +26,57 @@ class server_add_task_Core { static function add_from_server($task) { $context = unserialize($task->context); try { - $parent = ORM::factory("item", $context["item_id"]); + $paths = array_keys(unserialize(module::get_var("server_add", "authorized_paths"))); + $path = $paths[$context["next_path"]]; + $file = $context["files"][$path][$context["position"]]; + $parent = ORM::factory("item", $file["parent_id"]); access::required("server_add", $parent); if (!$parent->is_album()) { throw new Exception("@todo BAD_ALBUM"); } - $paths = unserialize(module::get_var("server_add", "authorized_paths")); - $path = $context["paths"][$context["next"]]; - - $path_valid = false; - $item_path = ""; - foreach (array_keys($paths) as $valid_path) { - if ($path_valid = strpos($path, $valid_path) === 0) { - $item_path = substr($path, strlen($valid_path)); - $item_path = explode("/", ltrim($item_path,"/")); - $source_path = $valid_path; - break; - } - } - if (empty($path_valid)) { - throw new Exception("@todo BAD_PATH"); - } - for ($i = 0; $i < count($item_path); $i++) { - $name = $item_path[$i]; - $source_path .= "/$name"; - if (is_link($source_path) || !is_readable($source_path)) { - kohana::show_404(); + $name = $file["name"]; + if ($file["type"] == "album") { + $album = ORM::factory("item") + ->where("name", $name) + ->where("parent_id", $parent->id) + ->find(); + if (!$album->loaded) { + $album = album::create($parent, $name, $name, null, user::active()->id); } - $pathinfo = pathinfo($source_path); - set_time_limit(30); - if (is_dir($source_path)) { - $album = ORM::factory("item") - ->where("name", $name) - ->where("parent_id", $parent->id) - ->find(); - if (!$album->loaded) { - $album = album::create($parent, $name, $name, null, user::active()->id); + /* + * Now that we have a new album. Go through the remaining files to import and change the + * parent_id of any file that has the same relative path as this album's path. + */ + $album_path = "{$file['path']}/$name"; + for ($idx = $context["position"] + 1; $idx < count($context["files"][$path]); $idx++) { + if (strpos($context["files"][$path][$idx]["path"], $album_path) === 0) { + $context["files"][$path][$idx]["parent_id"] = $album->id; } - $parent = $album; - } else if (in_array($pathinfo["extension"], array("flv", "mp4"))) { - $movie = movie::create($parent, $source_path, basename($source_path), - basename($source_path), null, user::active()->id); + } + } else { + $extension = strtolower(substr(strrchr($name, '.'), 1)); + $source_path = "$path{$file['path']}/$name"; + if (in_array($extension, array("flv", "mp4"))) { + $movie = movie::create($parent, $source_path, $name, $name, + null, user::active()->id); } else { - $photo = photo::create($parent, $source_path, basename($source_path), - basename($source_path), null, user::active()->id); + $photo = photo::create($parent, $source_path, $name, $name, + null, user::active()->id); } } + + $context["counter"]++; + if (++$context["position"] >= count($context["files"][$path])) { + $context["next_path"]++; + $context["position"] = 0; + } } catch(Exception $e) { $context["errors"][$path] = $e->getMessage(); } - $task->done = (++$context["next"]) >= count($context["paths"]); $task->context = serialize($context); $task->state = "success"; - $task->percent_complete = ($context["next"] / (float)count($context["paths"])) * 100; + $task->percent_complete = ($context["counter"] / (float)$context["total"]) * 100; + $task->done = $context["counter"] == (float)$context["total"]; } - }
\ No newline at end of file diff --git a/modules/server_add/js/server_add.js b/modules/server_add/js/server_add.js index addc3121..570f3946 100644 --- a/modules/server_add/js/server_add.js +++ b/modules/server_add/js/server_add.js @@ -40,8 +40,6 @@ function open_close_branch(icon, event) { $(parent).append(data); $(icon).addClass("ui-icon-minus"); $(icon).removeClass("ui-icon-plus"); - var checkbox = $(parent).find(":checkbox")[0]; - checkbox_click(checkbox, null); }); } else { $(icon).addClass("ui-icon-minus"); @@ -63,9 +61,15 @@ function get_url(uri, task_id) { } function checkbox_click(checkbox, event) { + var _this = this; var parents = $(checkbox).parents("li"); var parent = parents.get(0); - $(parent).find(".gCheckboxTree :checkbox").attr("checked", checkbox.checked); + if ($(parent).hasClass("gDirectory") && $(parent).find(".gCheckboxTree").length == 0) { + load_children(parent, function(data, textStatus) { + $(parent).append(data); + }); + } + $(parent).find(".gCheckboxTree :checkbox").click(); var checked = $("#gServerAdd :checkbox[checked]"); $("#gServerAdd form :submit").attr("disabled", checked.length == 0); } @@ -95,11 +99,7 @@ function do_add(submit, event) { var parms = ""; $.each(check_list, function () { var parent = $(this).parents("li")[0]; - // If its a file or a directory with no children - if ($(parent).hasClass("gFile") || - ($(parent).hasClass("gDirectory") && $(parent).find(".gCheckboxTree").length == 0)) { - parms += "&path[]=" + this.value; - } + parms += "&path[]=" + this.value; }); } paused = false; |