diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9903d45 --- /dev/null +++ b/Makefile @@ -0,0 +1,28 @@ +.PHONY: help + +help: ## *:・゚✧*:・゚✧ This help *:・゚✧*:・゚✧ + @printf "\033[36;1m %14s \033[0;32;1m %s\033[0m\n" Target Description + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | \ + awk ' \ + BEGIN {FS = ":.*?## "}; \ + { if ( $$1 != "-") { \ + printf "\033[31;1;40m[ \033[36;1;40m%14s \033[31;1;40m]\033[0;32;1m %s\033[0m\n", $$1, $$2 \ + } else { \ + printf " \033[0;33;1m=^= %-25s =^=\033[0m\n", $$2 \ + } \ + } \ + ' + +-: ## Building +################################### + +clean: ## Clean build folders + rm -r build tsmark.egg-info + +pip: ## Install with pip + pip install . + +pipx: ## Install with pipx + pipx install -f . + + diff --git a/tsmark/__init__.py b/tsmark/__init__.py index aa08269..02fd797 100644 --- a/tsmark/__init__.py +++ b/tsmark/__init__.py @@ -1,3 +1,33 @@ -from tsmark.video_annotator import main +from tsmark.video_annotator import Marker +import argparse -VERSION = "0.2" +VERSION = "0.3" + + +def get_options(): + + parser = argparse.ArgumentParser(description="Video timestamping tool") + parser.add_argument( + "--ts", + action="store", + dest="timestamps", + default=None, + required=False, + help="Comma separated list of predefined timestamps, in frame numbers, or HH:MM:SS.FF. You can use the -o output file as input via --ts $( cut -d, -f1 ts.csv | xargs printf '%%s,' )", + ) + parser.add_argument( + "-o", + action="store", + dest="output", + default=None, + required=False, + help="Save timestamps to a CSV file", + ) + parser.add_argument("--version", action="version", version=VERSION) + parser.add_argument(action="store", dest="video") + return parser.parse_args() + + +def main(): + opts = get_options() + Marker(opts) diff --git a/tsmark/__main__.py b/tsmark/__main__.py index 8e8c43c..e69de29 100644 --- a/tsmark/__main__.py +++ b/tsmark/__main__.py @@ -1,3 +0,0 @@ -from tsmark.video_annotator import main - -main() diff --git a/tsmark/video_annotator.py b/tsmark/video_annotator.py index 3c64a75..6c35a2a 100755 --- a/tsmark/video_annotator.py +++ b/tsmark/video_annotator.py @@ -2,12 +2,11 @@ import sys import os import cv2 import time -import argparse class Marker: - def __init__(self): - self.get_options() + def __init__(self, opts): + self.opts = opts if not os.path.exists(self.opts.video): raise FileNotFoundError("Video file missing!") @@ -157,7 +156,6 @@ class Marker: self.shadow_text(frame, row, (left, bottom), 0.6, 1, (255, 255, 255)) bottom += 18 - def draw_label(self, frame): if not self.nr in self.stamps: @@ -201,21 +199,6 @@ class Marker: q or esc quit """ - - def get_options(self): - - parser = argparse.ArgumentParser(description="Video timestamping tool") - parser.add_argument( - "--ts", - action="store", - dest="timestamps", - default=None, - required=False, - help="Comma separated list of predefined timestamps, in frame numbers, or HH:MM:SS.FF", - ) - parser.add_argument(action="store", dest="video") - self.opts = parser.parse_args() - def mouse_click(self, event, x, y, flags, param): in_bar = all( @@ -260,7 +243,11 @@ class Marker: def parse_timestamps(self): if self.opts.timestamps: self.stamps = sorted( - [self.parse_time(ts.strip()) for ts in self.opts.timestamps.split(",")] + [ + self.parse_time(ts.strip()) + for ts in self.opts.timestamps.split(",") + if ts.strip() != "" + ] ) self.stamps = [x for x in self.stamps if 0 <= x < self.frames] self.nr = self.stamps[0] @@ -285,6 +272,14 @@ class Marker: ) ) + def save_timestamps(self): + + if self.opts.output == None: + return + with open(self.opts.output, "wt") as fp: + for i, ts in enumerate(self.stamps): + fp.write("{},{},{}\n".format(self.format_time(ts), i + 1, ts + 1)) + def shadow_text(self, frame, text, pos, size, thicc, color): cv2.putText( @@ -344,7 +339,7 @@ class Marker: if self.show_help: self.draw_help(frame_visu) - if cv2.getWindowProperty('tsmark', cv2.WND_PROP_VISIBLE) < 1: + if cv2.getWindowProperty("tsmark", cv2.WND_PROP_VISIBLE) < 1: break cv2.imshow("tsmark", frame_visu) k = cv2.waitKey(draw_wait) @@ -426,7 +421,4 @@ class Marker: self.video_reader.release() self.print_timestamps() - - -def main(): - mark = Marker() + self.save_timestamps()