From 971f7155d64c42daed373b83a50b6cc4c46cdcc4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Laurent?= <francois.laurent@posteo.net>
Date: Mon, 30 May 2022 09:13:32 +0200
Subject: [PATCH] initial larvatagger.jl command

---
 Manifest.toml          |  8 +++-
 Project.toml           |  1 +
 scripts/larvatagger.jl | 88 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 96 insertions(+), 1 deletion(-)
 create mode 100755 scripts/larvatagger.jl

diff --git a/Manifest.toml b/Manifest.toml
index f2ee5f9..cfd7dc3 100644
--- a/Manifest.toml
+++ b/Manifest.toml
@@ -203,6 +203,12 @@ git-tree-sha1 = "5a4168170ede913a2cd679e53c2123cb4b889795"
 uuid = "31c24e10-a181-5473-b8eb-7969acd0382f"
 version = "0.25.53"
 
+[[deps.DocOpt]]
+deps = ["Dates", "Printf"]
+git-tree-sha1 = "866efe767d646ee8c66b15ff22520c03a1200ca7"
+uuid = "968ba79b-81e4-546f-ab3a-2eecfa62a9db"
+version = "0.4.2"
+
 [[deps.DocStringExtensions]]
 deps = ["LibGit2"]
 git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b"
@@ -858,7 +864,7 @@ version = "0.1.1"
 
 [[deps.PlanarLarvae]]
 deps = ["DelimitedFiles", "JSON3", "MAT", "Meshes", "OrderedCollections", "SHA", "StaticArrays", "StructTypes"]
-git-tree-sha1 = "34279a2e3f91bc7dff05d7d02c8710eadd76fdaf"
+git-tree-sha1 = "20a9e95162e6226283a7024ab2352f9d08822d4a"
 repo-rev = "dev"
 repo-url = "https://gitlab.pasteur.fr/nyx/planarlarvae.jl"
 uuid = "c2615984-ef14-4d40-b148-916c85b43307"
diff --git a/Project.toml b/Project.toml
index 7ba527d..c6ee36b 100644
--- a/Project.toml
+++ b/Project.toml
@@ -6,6 +6,7 @@ version = "0.3.0"
 [deps]
 Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
 Dates = "ade2ca70-3891-5945-98fb-dc099432e06a"
+DocOpt = "968ba79b-81e4-546f-ab3a-2eecfa62a9db"
 Formatting = "59287772-0a20-5a39-b81b-1366585eb4c0"
 JSON3 = "0f8b85d8-7281-11e9-16c2-39a750bddbf1"
 JSServe = "824d6782-a2ef-11e9-3a09-e5662e0c26f9"
diff --git a/scripts/larvatagger.jl b/scripts/larvatagger.jl
new file mode 100755
index 0000000..e8b4152
--- /dev/null
+++ b/scripts/larvatagger.jl
@@ -0,0 +1,88 @@
+#!/bin/bash
+#=
+PROJECT_DIR=$(dirname $(dirname $(realpath "${BASH_SOURCE[0]}")))
+if [ "$1" == "open" ]; then FLAGS="-iq "; fi
+exec julia --project="$PROJECT_DIR" --color=yes --startup-file=no $FLAGS\
+    "${BASH_SOURCE[0]}" "$@"
+=#
+
+using DocOpt
+using PlanarLarvae.Datasets, PlanarLarvae.Formats
+using LarvaTagger
+using JSServe: JSServe, Server
+
+usage = """Larva Tagger.
+
+Usage:
+  larvatagger.jl import <input-path> [<output-file>] [--id=<id>] [--framerate=<fps>]
+  larvatagger.jl open <input-path> [--backends=<path>] [--port=<number>] [--quiet]
+  larvatagger.jl open <input-path> [--viewer] [--browser]
+  larvatagger.jl train <backend-path> <data-repository> [--instance=<name>]
+  larvatagger.jl -h | --help
+
+Options:
+  -h --help          Show this screen.
+  -q --quiet         Do not show instructions.
+  --id=<id>          Run ID, e.g. `date_time`.
+  --framerate=<fps>  Camera frame rate, in frames per second.
+  --backends=<path>  Path to backend repository.
+  --port=<number>    Port number the server listens to.
+  --viewer           Disable editing capabilities.
+  --browser          Automatically open a browser tab at the served location.
+  --instance=<name>  Name of the trained model.
+
+"""
+
+function main()
+    parsed_args = docopt(usage)
+    if parsed_args["import"]
+        infile = parsed_args["<input-path>"]
+        outfile = parsed_args["<output-file>"]
+        kwargs = Dict{Symbol, Any}()
+        framerate = parsed_args["--framerate"]
+        if !isnothing(framerate)
+            kwargs[:framerate] = parse(Float64, framerate)
+        end
+        file = load(infile; kwargs...)
+        runid = parsed_args["--id"]
+        run = Run(isnothing(runid) ? file.run.id : runid, Track[];
+                  file.run.attributes[:metadata]...)
+        run.attributes[:labels] = String[]
+        Datasets.pushdependency!(run, infile)
+        if isnothing(outfile)
+            Datasets.write_json(stdout, run)
+        else
+            Datasets.to_json_file(outfile, run)
+        end
+    elseif parsed_args["open"]
+        verbose = !parsed_args["--quiet"]
+        infile = parsed_args["<input-path>"]
+        if parsed_args["--viewer"]
+            app = larvaviewer(infile)
+        else
+            kwargs = Dict{Symbol, Any}()
+            backends = parsed_args["--backends"]
+            if !isnothing(backends)
+                kwargs[:backend_directory] = backends
+            end
+            app = larvaeditor(infile; kwargs...)
+        end
+        #
+        port = parsed_args["--port"]
+        port = isnothing(port) ? 9284 : parse(Int, port)
+        server = Server(app, "0.0.0.0", port)
+        if parsed_args["--browser"]
+            JSServe.openurl("http://127.0.0.1:$(port)")
+            #display(JSServe.BrowserDisplay(), app)
+        elseif verbose
+            @info "The server is listening to http://127.0.0.1:$(port)"
+        end
+        if verbose
+            @info "Press Ctrl+D to kill the server"
+        end
+    elseif parsed_args["train"]
+        @error "not implemented yet"
+    end
+end
+
+main()
-- 
GitLab