diff --git a/3.0/modules/auto_date/README.md b/3.0/modules/auto_date/README.md new file mode 100644 index 00000000..135414dc --- /dev/null +++ b/3.0/modules/auto_date/README.md @@ -0,0 +1,4 @@ +auto_date +======== + +Gallery3 module to automatically add extract capture date from the file name in the absense of EXIF information diff --git a/3.0/modules/auto_date/controllers/admin_auto_date.php b/3.0/modules/auto_date/controllers/admin_auto_date.php new file mode 100644 index 00000000..be4927fb --- /dev/null +++ b/3.0/modules/auto_date/controllers/admin_auto_date.php @@ -0,0 +1,45 @@ +_get_form(); + + if (request::method() == "post") { + access::verify_csrf(); + + if ($form->validate()) { + module::set_var("auto_date", "template", $_POST['template']); + message::success(t("Settings have been saved")); + url::redirect("admin/auto_date"); + } else { + message::error(t("There was a problem with the submitted form. Please check your values and try again.")); + } + } + + print $this->_get_view(); + } + + private function _get_view($form = null) { + $v = new Admin_View("admin.html"); + $v->page_title = t("Gallery 3 :: Set Template for unknown items"); + + $v->content = new View("admin_auto_date.html"); + $v->content->form = empty($form) ? $this->_get_form() : $form; + + return $v; + } + + private function _get_form() { + $form = new Forge("admin/auto_date", "", "post", array("id" => "g-admin-auto_date-form")); + + $group = $form->group("auto_date")->label(t("Default filename convention(php's strptime() format)")); + + $group->input("template") + ->id("template") + ->label(t("Template:")) + ->value(module::get_var("auto_date", "template")); + + $form->submit("submit")->value(t("Save")); + return $form; + } +} diff --git a/3.0/modules/auto_date/helpers/auto_date.php b/3.0/modules/auto_date/helpers/auto_date.php new file mode 100644 index 00000000..816ea8c6 --- /dev/null +++ b/3.0/modules/auto_date/helpers/auto_date.php @@ -0,0 +1,34 @@ +is_album() && !$item->captured) { + $base_name = str_ireplace(array(".flv", ".jpg", ".gif"), "", $item->name); + $date_format = module::get_var("auto_date", "template"); + $time = strptime($base_name, $date_format); + if ($time) { + $item->captured = mktime($time['tm_hour'], $time['tm_min'], $time['tm_sec'], $time['tm_mon']+1, $time['tm_mday'], ($time['tm_year'] + 1900)); + $item->save(); + } + } + return; + } +} diff --git a/3.0/modules/auto_date/helpers/auto_date_event.php b/3.0/modules/auto_date/helpers/auto_date_event.php new file mode 100644 index 00000000..e2a5727b --- /dev/null +++ b/3.0/modules/auto_date/helpers/auto_date_event.php @@ -0,0 +1,34 @@ +get("settings_menu") + ->append(Menu::factory("link") + ->id("auto_date_menu") + ->label(t("Auto Date")) + ->url(url::site("admin/auto_date"))); + } + + static function item_created($item) { + auto_date::set_auto_date($item); + } + +} diff --git a/3.0/modules/auto_date/helpers/auto_date_installer.php b/3.0/modules/auto_date/helpers/auto_date_installer.php new file mode 100644 index 00000000..f6022142 --- /dev/null +++ b/3.0/modules/auto_date/helpers/auto_date_installer.php @@ -0,0 +1,37 @@ +callback("auto_date_task::set_auto_date_all") + ->name(t("Set captured date for all unset items")) + ->description(t("Attempt to guess the captured date based on the filename (NULL capture dates only)")) + ->severity(log::SUCCESS); + return $tasks; + } + + /** + * @param Task_Model the task + */ + static function set_auto_date_all($task) { + $errors = array(); + try { + $start = microtime(true); + $last_item_id= $task->get("last_item_id", null); + $current = 0; + $total = 0; + + switch ($task->get("mode", "init")) { + case "init": + $task->set("total", ORM::factory("item")->where("type", "!=", "album")->and_where("captured", "is", NULL)->count_all()); + $task->set("mode", "set_auto_date_all"); + $task->set("completed", 0); + $task->set("last_item_id", 0); + + case "set_auto_date_all": + $completed = $task->get("completed"); + $total = $task->get("total"); + $last_item_id= $task->get("last_item_id"); + $items = ORM::factory("item") + ->where("id", ">", $last_item_id) + ->and_where("type", "!=", "album") + ->and_where("captured", "is", NULL) + ->find_all(100); /* TODO: should we fetch more at a time? Less? */ + while ($current < $total && microtime(true) - $start < 1 && $item = $items->current()) { + $last_tem_id = $item->id; + $task->log("Looking at item {$item->name} (id: {$item->id})"); + auto_date::set_auto_date($item); + + $completed++; + $items->next(); + $task->percent_complete = $completed / $total * 100; + $task->set("completed", $completed); + $task->set("last_item_id", $item->id); + + + $task->status = t2("Examined %count items", "Examined %count items", $completed); + + if ($completed == $total) { + $task->done = true; + $task->state = "success"; + $task->percent_complete = 100; + } + } + } + } catch (Exception $e) { + Kohana_Log::add("error",(string)$e); + $task->done = true; + $task->state = "error"; + $task->status = $e->getMessage(); + $errors[] = (string)$e; + } + if ($errors) { + $task->log($errors); + } + } +} diff --git a/3.0/modules/auto_date/module.info b/3.0/modules/auto_date/module.info new file mode 100644 index 00000000..34e01de7 --- /dev/null +++ b/3.0/modules/auto_date/module.info @@ -0,0 +1,7 @@ +name = "Auto Date" +description = "Guess image / video capture date from the filename, if no EXIF information is available" +version = 1 +author_name ="mikeage" +author_url = "http://mikeage.net" +info_url = "http://TODO" +discuss_url = "http://TODO" diff --git a/3.0/modules/auto_date/views/admin_auto_date.html.php b/3.0/modules/auto_date/views/admin_auto_date.html.php new file mode 100644 index 00000000..60f3c54e --- /dev/null +++ b/3.0/modules/auto_date/views/admin_auto_date.html.php @@ -0,0 +1,11 @@ + + +
+

+ +

+ +
+ +
+