From 75aa9562fba458366f7b274b966ed8fc81e4a146 Mon Sep 17 00:00:00 2001 From: Alexandre Marcireau Date: Wed, 3 May 2023 13:48:02 +1000 Subject: [PATCH] Add spectrograms --- README.md | 2 + banner.png | Bin 0 -> 97429 bytes charidotella/__init__.py | 100 +++- charidotella/setup.py | 0 charidotella/tasks/__init__.py | 2 + charidotella/tasks/spatiospectrogram.py | 107 ++++ charidotella/tasks/spectrogram.py | 40 ++ charidotella/version.py | 2 +- command_line_tools | 2 +- configuration-schema.json | 721 ++++++++++++++++-------- setup.py | 2 +- 11 files changed, 727 insertions(+), 251 deletions(-) create mode 100644 banner.png delete mode 100644 charidotella/setup.py create mode 100644 charidotella/tasks/spatiospectrogram.py create mode 100644 charidotella/tasks/spectrogram.py diff --git a/README.md b/README.md index 5073a27..ab7568c 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +![banner](banner.png) + Charidotella (https://en.wikipedia.org/wiki/Charidotella_sexpunctata) is a toolbox to organise and visualise Event Stream (.es) recordings. It supports Python 3.9, 3.10, and 3.11. diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0c7aa1fc9551508971ab4b0c3c9cc75b234ae9 GIT binary patch literal 97429 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
  • lTv4-Yef~O{5$Dno+#AV^HK~J5%+%X^ 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≷{GF$0nC9RjhZKc>CMtAcO1i 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 CQ1he! literal 0 HcmV?d00001 diff --git a/charidotella/__init__.py b/charidotella/__init__.py index 12355a9..2730859 100644 --- a/charidotella/__init__.py +++ b/charidotella/__init__.py @@ -53,6 +53,11 @@ TASKS: dict[str, tuple[str, task_run]] = { "colourtime": (tasks.colourtime.EXTENSION, tasks.colourtime.run), "event_rate": (tasks.event_rate.EXTENSION, tasks.event_rate.run), + "spatiospectrogram": ( + tasks.spatiospectrogram.EXTENSION, + tasks.spatiospectrogram.run, + ), + "spectrogram": (tasks.spectrogram.EXTENSION, tasks.spectrogram.run), "video": (tasks.video.EXTENSION, tasks.video.run), "wiggle": (tasks.wiggle.EXTENSION, tasks.wiggle.run), } @@ -90,6 +95,12 @@ def main(): action="store_true", help="Do not generate new names for the recordings", ) + init_parser.add_argument( + "--spatiospectrograms", + "-s", + action="store_true", + help="Generate spatio-spectrogram tasks", + ) run_parser = subparsers.add_parser("run", help="Process a configuration file") run_parser.add_argument( "--configuration", @@ -381,9 +392,11 @@ def run_generators(configuration: dict[str, typing.Any]): "tasks": [ "colourtime-.+", "event-rate-.+", + "spectrogram", "wiggle-.+", "video-real-time", - ], + ] + + (["spatiospectrogram"] if args.spatiospectrograms else []), } ) with open( @@ -471,9 +484,63 @@ def run_generators(configuration: dict[str, typing.Any]): ) configuration_file.write("\n\n# tasks configuration\n\n") + tasks = { + "spectrogram": { + "type": "spectrogram", + "icon": "🎻", + "tau": utilities.timestamp_to_timecode(100000), + "mode": "all", + "maximum": 10000.0, + "frequencies": 100, + "times": 1000, + "gamma": 0.5, + }, + "video-real-time": { + "type": "video", + "icon": "🎬", + "frametime": utilities.timestamp_to_timecode(20000), + "tau": utilities.timestamp_to_timecode(200000), + "style": "exponential", + "on_color": "#F4C20D", + "off_color": "#1E88E5", + "idle_color": "#191919", + "cumulative_ratio": 0.01, + "timecode": True, + "h264_crf": 15, + "ffmpeg": "ffmpeg", + "scale": 1, + }, + } toml.dump( { "tasks": { + "spatiospectrogram": { + "type": "spatiospectrogram", + "icon": "🎸", + "frametime": utilities.timestamp_to_timecode(20000), + "scale": 1, + "tau": utilities.timestamp_to_timecode(100000), + "mode": "all", + "minimum": 10.0, + "maximum": 10000.0, + "frequencies": 100, + "frequency-gamma": 0.5, + "amplitude-gamma": 0.5, + "discard": 0.001, + "timecode": True, + "h264_crf": 15, + "ffmpeg": "ffmpeg", + }, + "spectrogram": { + "type": "spectrogram", + "icon": "🎻", + "tau": utilities.timestamp_to_timecode(100000), + "mode": "all", + "maximum": 10000.0, + "frequencies": 100, + "times": 1000, + "gamma": 0.5, + }, "video-real-time": { "type": "video", "icon": "🎬", @@ -488,7 +555,22 @@ def run_generators(configuration: dict[str, typing.Any]): "h264_crf": 15, "ffmpeg": "ffmpeg", "scale": 1, - } + }, + "video-slow-motion": { + "type": "video", + "icon": "🎬", + "frametime": utilities.timestamp_to_timecode(2000), + "tau": utilities.timestamp_to_timecode(20000), + "style": "exponential", + "on_color": "#F4C20D", + "off_color": "#1E88E5", + "idle_color": "#191919", + "cumulative_ratio": 0.01, + "timecode": True, + "h264_crf": 15, + "ffmpeg": "ffmpeg", + "scale": 1, + }, }, }, configuration_file, @@ -539,8 +621,8 @@ def run_generators(configuration: dict[str, typing.Any]): "axis_color": "#000000", "main_grid_color": "#555555", "secondary_grid_color": "#DDDDDD", - "width": 1920, - "height": 1080, + "width": 1280, + "height": 720, }, }, { @@ -556,7 +638,7 @@ def run_generators(configuration: dict[str, typing.Any]): "template": { "name": "wiggle-@suffix", "type": "wiggle", - "icon": "🌀", + "icon": "👋", "forward_duration": "@raw(forward_duration)", "tau_to_frametime_ratio": 3.0, "style": "cumulative", @@ -616,9 +698,15 @@ def run_generators(configuration: dict[str, typing.Any]): "tasks": [ "colourtime-.+", "event-rate-.+", + "spectrogram", "wiggle-.+", "video-real-time", - ], + ] + + ( + ["spatiospectrogram"] + if args.spatiospectrograms + else [] + ), }, } ] diff --git a/charidotella/setup.py b/charidotella/setup.py deleted file mode 100644 index e69de29..0000000 diff --git a/charidotella/tasks/__init__.py b/charidotella/tasks/__init__.py index 20bf628..60d1930 100644 --- a/charidotella/tasks/__init__.py +++ b/charidotella/tasks/__init__.py @@ -1,4 +1,6 @@ from . import colourtime as colourtime from . import event_rate as event_rate +from . import spatiospectrogram as spatiospectrogram +from . import spectrogram as spectrogram from . import video as video from . import wiggle as wiggle diff --git a/charidotella/tasks/spatiospectrogram.py b/charidotella/tasks/spatiospectrogram.py new file mode 100644 index 0000000..1583c8f --- /dev/null +++ b/charidotella/tasks/spatiospectrogram.py @@ -0,0 +1,107 @@ +import atexit +import importlib.resources +import pathlib +import subprocess +import typing + +EXTENSION = ".mp4" + + +def run( + input: pathlib.Path, + output: pathlib.Path, + begin: int, + end: int, + parameters: dict[str, typing.Any], +): + width, height = ( + int(value) + for value in subprocess.run( + [ + str(importlib.resources.files("charidotella").joinpath("assets/size")), + str(input), + ], + check=True, + capture_output=True, + ).stdout.split(b"x") + ) + width *= parameters["scale"] + height *= parameters["scale"] + spatiospectrogram_arguments = [ + str( + importlib.resources.files("charidotella").joinpath( + "assets/spatiospectrogram" + ) + ), + f"--input={input}", + f"--begin={begin}", + f"--end={end}", + f"--frametime={parameters['frametime']}", + f"--scale={parameters['scale']}", + f"--tau={parameters['tau']}", + f"--mode={parameters['mode']}", + f"--minimum={parameters['minimum']}", + f"--maximum={parameters['maximum']}", + f"--frequencies={parameters['frequencies']}", + f"--frequency-gamma={parameters['frequency-gamma']}", + f"--amplitude-gamma={parameters['amplitude-gamma']}", + f"--discard={parameters['discard']}", + ] + if parameters["timecode"]: + spatiospectrogram_arguments.append("--add-timecode") + spatiospectrogram = subprocess.Popen( + spatiospectrogram_arguments, + stdout=subprocess.PIPE, + ) + assert spatiospectrogram.stdout is not None + ffmpeg = subprocess.Popen( + [ + parameters["ffmpeg"], + "-hide_banner", + "-loglevel", + "warning", + "-stats", + "-f", + "rawvideo", + "-s", + f"{width}x{height}", + "-framerate", + "50", + "-pix_fmt", + "rgb24", + "-i", + "-", + "-c:v", + "libx264", + "-pix_fmt", + "yuv420p", + "-crf", + str(parameters["h264_crf"]), + "-f", + "mp4", + "-y", + str(output), + ], + stdin=subprocess.PIPE, + ) + assert ffmpeg.stdin is not None + frame_size = width * height * 3 + + def cleanup(): + if es_to_frames is not None: + es_to_frames.kill() + if ffmpeg is not None: + ffmpeg.kill() + + atexit.register(cleanup) + while True: + frame = spatiospectrogram.stdout.read(frame_size) + if len(frame) != frame_size: + break + ffmpeg.stdin.write(frame) + ffmpeg.stdin.close() + spatiospectrogram.wait() + es_to_frames = None + ffmpeg.wait() + ffmpeg = None + atexit.unregister(cleanup) diff --git a/charidotella/tasks/spectrogram.py b/charidotella/tasks/spectrogram.py new file mode 100644 index 0000000..600e209 --- /dev/null +++ b/charidotella/tasks/spectrogram.py @@ -0,0 +1,40 @@ +import importlib.resources +import pathlib +import subprocess +import typing + +EXTENSION = ".png" + + +def run( + input: pathlib.Path, + output: pathlib.Path, + begin: int, + end: int, + parameters: dict[str, typing.Any], +): + arguments = [ + str(importlib.resources.files("charidotella").joinpath("assets/spectrogram")), + str(input), + str(output), + str(output.with_suffix(".json")), + f"--begin={begin}", + f"--end={end}", + f"--tau={parameters['tau']}", + f"--mode={parameters['mode']}", + f"--maximum={parameters['maximum']}", + f"--frequencies={parameters['frequencies']}", + f"--times={parameters['times']}", + f"--gamma={parameters['gamma']}", + ] + if "minimum" in parameters: + arguments.append(f"--minimum={parameters['minimum']}") + if "region-of-interest" in parameters: + arguments.append(f"--left={parameters['region-of-interest'][0]}") + arguments.append(f"--bottom={parameters['region-of-interest'][1]}") + arguments.append(f"--width={parameters['region-of-interest'][2]}") + arguments.append(f"--height={parameters['region-of-interest'][3]}") + subprocess.run( + arguments, + check=True, + ) diff --git a/charidotella/version.py b/charidotella/version.py index 91bf823..4802e90 100644 --- a/charidotella/version.py +++ b/charidotella/version.py @@ -1 +1 @@ -__version__ = "0.10" +__version__ = "1.0" diff --git a/command_line_tools b/command_line_tools index 30c06b4..cc9e13a 160000 --- a/command_line_tools +++ b/command_line_tools @@ -1 +1 @@ -Subproject commit 30c06b4da1854500788dffd680efa5e702a220cb +Subproject commit cc9e13a26d33520fbdc943ff5442c8b719176045 diff --git a/configuration-schema.json b/configuration-schema.json index b7ce65f..f1f3af4 100644 --- a/configuration-schema.json +++ b/configuration-schema.json @@ -1,37 +1,55 @@ { - "type": "object", + "additionalProperties": false, "properties": { + "attachments": { + "additionalProperties": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "target": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, "directory": { "type": "string" }, "filters": { - "type": "object", "additionalProperties": { "anyOf": [ { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["default"] - }, "icon": { "type": "string" }, "suffix": { "type": "string" + }, + "type": { + "enum": [ + "default" + ], + "type": "string" } }, - "additionalProperties": false, - "required": ["type", "icon", "suffix"] + "required": [ + "type", + "icon", + "suffix" + ], + "type": "object" }, { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["arbiter_saturation"] - }, "icon": { "type": "string" }, @@ -39,49 +57,58 @@ "type": "string" }, "threshold": { - "type": "integer", - "exclusiveMinimum": 0 + "exclusiveMinimum": 0, + "type": "integer" + }, + "type": { + "enum": [ + "arbiter_saturation" + ], + "type": "string" } }, - "additionalProperties": false, - "required": ["type", "icon", "suffix", "threshold"] + "required": [ + "type", + "icon", + "suffix", + "threshold" + ], + "type": "object" }, { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["hot_pixels"] - }, "icon": { "type": "string" }, + "ratio": { + "minimum": 0, + "type": "number" + }, "suffix": { "type": "string" }, - "ratio": { - "type": "number", - "minimum": 0.0 + "type": { + "enum": [ + "hot_pixels" + ], + "type": "string" } }, - "additionalProperties": false, - "required": ["type", "icon", "suffix", "ratio"] + "required": [ + "type", + "icon", + "suffix", + "ratio" + ], + "type": "object" }, { - "type": "object", "properties": { - "type": { - "type": "string", - "enum": ["transpose"] - }, "icon": { "type": "string" }, - "suffix": { - "type": "string" - }, "method": { - "type": "string", "enum": [ "flip_left_right", "flip_top_bottom", @@ -90,77 +117,168 @@ "rotate_270", "transpose", "transverse" - ] + ], + "type": "string" + }, + "suffix": { + "type": "string" + }, + "type": { + "enum": [ + "transpose" + ], + "type": "string" } - } + }, + "type": "object" } ] - } + }, + "type": "object" }, "filters-generators": { - "type": "array", "items": { - "type": "object", + "additionalProperties": false, "properties": { "parameters": { - "type": "object", "additionalProperties": { "type": "array" - } + }, + "type": "object" }, "template": { - "type": "object", "properties": { "name": { "type": "string" } }, - "required": ["name"] + "required": [ + "name" + ], + "type": "object" } }, - "required": ["parameters", "template"], - "additionalProperties": false - } + "required": [ + "parameters", + "template" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "items": { + "additionalProperties": false, + "properties": { + "begin": { + "type": [ + "string", + "integer" + ] + }, + "end": { + "type": [ + "string", + "integer" + ] + }, + "filters": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "name": { + "type": "string" + }, + "tasks": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "begin", + "end", + "filters" + ], + "type": "object" + }, + "type": "array" + }, + "jobs-generators": { + "items": { + "additionalProperties": false, + "properties": { + "parameters": { + "additionalProperties": { + "type": "array" + }, + "type": "object" + }, + "template": { + "type": "object" + } + }, + "required": [ + "parameters", + "template" + ], + "type": "object" + }, + "type": "array" + }, + "sources": { + "additionalProperties": { + "type": "string" + }, + "type": "object" }, "tasks": { - "type": "object", "additionalProperties": { "anyOf": [ { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["colourtime"] + "alpha": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" }, - "icon": { + "background_color": { "type": "string" }, "colormap": { "type": "string" }, - "alpha": { - "type": "number", - "exclusiveMinimum": 0.0, - "maximum": 1.0 + "cycle": { + "type": [ + "string", + "integer" + ] + }, + "icon": { + "type": "string" }, "png_compression_level": { - "type": "integer", + "maximum": 9, "minimum": 0, - "maximum": 9 - }, - "background_color": { - "type": "string" + "type": "integer" }, "scale": { - "type": "integer", - "exclusiveMinimum": 0 + "exclusiveMinimum": 0, + "type": "integer" }, - "cycle": { - "type": ["string", "integer"] + "type": { + "enum": [ + "colourtime" + ], + "type": "string" } }, - "additionalProperties": false, "required": [ "type", "icon", @@ -169,49 +287,57 @@ "png_compression_level", "background_color", "scale" - ] + ], + "type": "object" }, { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["event_rate"] + "axis_color": { + "type": "string" + }, + "height": { + "exclusiveMinimum": 0, + "type": "integer" }, "icon": { "type": "string" }, "long_tau": { - "type": ["string", "integer"] - }, - "short_tau": { - "type": ["string", "integer"] + "type": [ + "string", + "integer" + ] }, "long_tau_color": { "type": "string" }, - "short_tau_color": { + "main_grid_color": { "type": "string" }, - "axis_color": { + "secondary_grid_color": { "type": "string" }, - "main_grid_color": { + "short_tau": { + "type": [ + "string", + "integer" + ] + }, + "short_tau_color": { "type": "string" }, - "secondary_grid_color": { + "type": { + "enum": [ + "event_rate" + ], "type": "string" }, "width": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "height": { - "type": "integer", - "exclusiveMinimum": 0 + "exclusiveMinimum": 0, + "type": "integer" } }, - "additionalProperties": false, "required": [ "type", "icon", @@ -224,69 +350,77 @@ "secondary_grid_color", "width", "height" - ] + ], + "type": "object" }, { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["video"] + "cumulative_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" }, - "icon": { + "ffmpeg": { "type": "string" }, "frametime": { - "type": ["string", "integer"] + "type": [ + "string", + "integer" + ] }, - "tau": { - "type": ["string", "integer"] + "h264_crf": { + "maximum": 51, + "minimum": 0, + "type": "integer" + }, + "icon": { + "type": "string" + }, + "idle_color": { + "type": "string" + }, + "lambda_max": { + "minimum": 0, + "type": "number" + }, + "off_color": { + "type": "string" + }, + "on_color": { + "type": "string" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "integer" }, "style": { - "type": "string", "enum": [ "exponential", "linear", "window", "cumulative", "cumulative-shared" - ] - }, - "on_color": { - "type": "string" - }, - "off_color": { + ], "type": "string" }, - "idle_color": { - "type": "string" - }, - "cumulative_ratio": { - "type": "number", - "minimum": 0.0, - "maximum": 1.0 + "tau": { + "type": [ + "string", + "integer" + ] }, "timecode": { "type": "boolean" }, - "h264_crf": { - "type": "integer", - "minimum": 0, - "maximum": 51 - }, - "ffmpeg": { + "type": { + "enum": [ + "video" + ], "type": "string" - }, - "scale": { - "type": "integer", - "exclusiveMinimum": 0 - }, - "lambda_max": { - "type": "number", - "minimum": 0.0 } }, - "additionalProperties": false, "required": [ "type", "icon", @@ -301,65 +435,230 @@ "h264_crf", "scale", "ffmpeg" - ] + ], + "type": "object" }, { - "type": "object", + "additionalProperties": false, "properties": { - "type": { - "type": "string", - "enum": ["wiggle"] + "frequencies": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "gamma": { + "exclusiveMinimum": 0, + "type": "number" }, "icon": { "type": "string" }, - "forward_duration": { - "type": ["string", "integer"] + "maximum": { + "exclusiveMinimum": 0, + "type": "number" }, - "tau_to_frametime_ratio": { - "type": "number", - "exclusiveMinimum": 0.0 + "minimum": { + "exclusiveMinimum": 0, + "type": "number" }, - "style": { - "type": "string", + "mode": { "enum": [ - "exponential", - "linear", - "window", - "cumulative", - "cumulative-shared" + "on", + "off", + "all", + "abs" + ], + "type": "string" + }, + "region-of-interest": { + "items": { + "minimum": 0, + "type": "integer" + }, + "maxItems": 4, + "minItems": 4, + "type": "array" + }, + "tau": { + "type": [ + "string", + "integer" ] }, - "on_color": { + "times": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "type": { + "enum": [ + "spectrogram" + ], "type": "string" + } + }, + "required": [ + "type", + "icon", + "tau", + "mode", + "maximum", + "frequencies", + "times", + "gamma" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "amplitude-gamma": { + "exclusiveMinimum": 0, + "type": "number" }, - "off_color": { + "discard": { + "exclusiveMaximum": 1, + "minimum": 0, + "type": "number" + }, + "ffmpeg": { "type": "string" }, - "idle_color": { + "frametime": { + "type": [ + "string", + "integer" + ] + }, + "frequencies": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "frequency-gamma": { + "exclusiveMinimum": 0, + "type": "number" + }, + "h264_crf": { + "maximum": 51, + "minimum": 0, + "type": "integer" + }, + "icon": { "type": "string" }, - "cumulative_ratio": { - "type": "number", - "minimum": 0.0, - "maximum": 1.0 + "maximum": { + "exclusiveMinimum": 0, + "type": "number" + }, + "minimum": { + "exclusiveMinimum": 0, + "type": "number" + }, + "mode": { + "enum": [ + "on", + "off", + "all", + "abs" + ], + "type": "string" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "tau": { + "type": [ + "string", + "integer" + ] }, "timecode": { "type": "boolean" }, + "type": { + "enum": [ + "spatiospectrogram" + ], + "type": "string" + } + }, + "required": [ + "type", + "icon", + "frametime", + "scale", + "tau", + "mode", + "minimum", + "maximum", + "frequencies", + "frequency-gamma", + "amplitude-gamma", + "discard", + "timecode" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "cumulative_ratio": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, "ffmpeg": { "type": "string" }, - "scale": { - "type": "integer", - "exclusiveMinimum": 0 + "forward_duration": { + "type": [ + "string", + "integer" + ] + }, + "icon": { + "type": "string" + }, + "idle_color": { + "type": "string" }, "lambda_max": { - "type": "number", - "minimum": 0.0 + "minimum": 0, + "type": "number" + }, + "off_color": { + "type": "string" + }, + "on_color": { + "type": "string" + }, + "scale": { + "exclusiveMinimum": 0, + "type": "integer" + }, + "style": { + "enum": [ + "exponential", + "linear", + "window", + "cumulative", + "cumulative-shared" + ], + "type": "string" + }, + "tau_to_frametime_ratio": { + "exclusiveMinimum": 0, + "type": "number" + }, + "timecode": { + "type": "boolean" + }, + "type": { + "enum": [ + "wiggle" + ], + "type": "string" } }, - "additionalProperties": false, "required": [ "type", "icon", @@ -372,109 +671,47 @@ "cumulative_ratio", "ffmpeg", "scale" - ] + ], + "type": "object" } ] - } + }, + "type": "object" }, "tasks-generators": { - "type": "array", "items": { - "type": "object", + "additionalProperties": false, "properties": { "parameters": { - "type": "object", "additionalProperties": { "type": "array" - } + }, + "type": "object" }, "template": { - "type": "object", "properties": { "name": { "type": "string" } }, - "required": ["name"] - } - }, - "required": ["parameters", "template"], - "additionalProperties": false - } - }, - "jobs": { - "type": "array", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "begin": { - "type": ["string", "integer"] - }, - "end": { - "type": ["string", "integer"] - }, - "filters": { - "type": "array", - "items": { - "type": "string" - }, - "minItems": 1 - }, - "tasks": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["name", "begin", "end", "filters"], - "additionalProperties": false - } - }, - "jobs-generators": { - "type": "array", - "items": { - "type": "object", - "properties": { - "parameters": { - "type": "object", - "additionalProperties": { - "type": "array" - } - }, - "template": { + "required": [ + "name" + ], "type": "object" } }, - "required": ["parameters", "template"], - "additionalProperties": false - } - }, - "sources": { - "type": "object", - "additionalProperties": { "type": "string" } - }, - "attachments": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object", - "properties": { - "source": { - "type": "string" - }, - "target": { - "type": "string" - } - } - } - } + "required": [ + "parameters", + "template" + ], + "type": "object" + }, + "type": "array" } }, - "required": ["directory", "sources"], - "additionalProperties": false -} + "required": [ + "directory", + "sources" + ], + "type": "object" +} \ No newline at end of file diff --git a/setup.py b/setup.py index 8ed6aa2..3d346f3 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ with open(dirname / "README.md") as file: long_description = file.read() -executables = ["es_to_frames", "event_rate", "size"] +executables = ["es_to_frames", "event_rate", "size", "spatiospectrogram", "spectrogram"] if not "-h" in sys.argv and not "--help" in sys.argv: manifest_lines = [