# meetus — convenience wrapper around ctrl/batch.sh (adhoc tool, nothing # standardized here; this just saves typing the batch flags). # # make batch IN="/mnt/win/trainings" # outputs next to sources # make batch IN="..." AUDIO_LANG=es # set audio language # make batch IN="..." OUT=output/run1 # collect outputs elsewhere # make batch IN="..." EXTRA="--skip-cache-whisper" # one-off extra flags # make dry IN="..." # list what would run # make batch IN="..." EXT="mp4 mov" # limit extensions # make batch IN="..." FLAGS="--embed-images" # replace the base flags # # Meetings flow (process only the videos doocus found, coherent with the docs): # 1. uv run make docs IN="/mnt/drive" # → docs-output/{index.json, meetings.txt} # 2. make batch IN="/mnt/drive" OUT=docs-output \ # meetus over just the meetings… # LIST=docs-output/meetings.txt \ # …only the listed relative paths # OUT_FORMAT="{name}.meetus" # …into .meetus/ sidecars # (matches doocus's index pointer, so meetings sit beside the .doocus/ docs.) # # IN is required. OUT defaults to IN (write in place); otherwise the input # folder structure is mirrored under OUT. IN ?= # Default: write outputs next to the source files (run folders land in the same # dir as each video/audio). Pass OUT=... to collect them elsewhere instead. OUT ?= $(IN) # The base combo used on every run. LANG/EXTRA below add to this without # needing to retype it; override FLAGS only to change the base itself. FLAGS ?= --embed-images --scene-detection --scene-threshold 10 --diarize --transcript-formats srt # Per-run knobs (appended after FLAGS): language, plus any one-off extra flags # (e.g. --skip-cache-whisper, --transcript-formats srt). # NB: named AUDIO_LANG, not LANG — LANG is the shell locale env var. # Defaults to English; override (e.g. AUDIO_LANG=es) for other languages. AUDIO_LANG ?= en EXTRA ?= # Optional: restrict scanned extensions / pick the python interpreter. EXT ?= PYTHON ?= export PYTHON # Optional: process only a newline list of RELATIVE paths (re-rooted at IN), # e.g. the doocus meeting export. Used to run meetus over just the meetings: # make batch IN="/mnt/drive" OUT=docs-output LIST=docs-output/meetings.txt LIST ?= # Optional: run-folder name template forwarded to process_meeting.py --out-format. # Tokens: {date} {run} {stem} {name}. Default (empty) → "{date}-{run:03d}-{stem}". # Use "{name}.meetus" so meetings land in a docs-coherent .meetus/ sidecar. OUT_FORMAT ?= # doocus (tree indexing) knobs. DOCS_OUT defaults to docs-output; the whole input # tree is replicated into index.json under it. DOC_EXTRA forwards one-off flags to # process_tree.py (e.g. --render for pdf page thumbnails, --ocr for scanned pdfs). DOCS_OUT ?= docs-output DOC_EXTRA ?= # Python interpreter for doocus (override PYTHON, else python3 — use `uv run make`). PY := $(if $(PYTHON),$(PYTHON),python3) # Merge a separate output tree into another (e.g. a meetings run done in its own # folder → docs-output). Both mirror the same source-relative structure, so this # just unions the sidecars beside the docs. Always dry-run first. # make merge-dry SRC=meetings-output # preview # make merge SRC=meetings-output # apply (DST defaults to docs-output) MERGE_SRC ?= MERGE_DST ?= docs-output # Diagrams: graphviz .dot → .svg (both committed). Requires system graphviz # (apt install graphviz). `make graphs` renders all docs/graphs/*.dot. DOT_SRC := $(wildcard docs/graphs/*.dot) SVG_OUT := $(DOT_SRC:.dot=.svg) .PHONY: batch dry docs docs-dry merge merge-dry graphs help batch: @ctrl/batch.sh -i "$(IN)" -o "$(OUT)" $(if $(EXT),-e "$(EXT)") $(if $(LIST),-l "$(LIST)") -- \ $(FLAGS) $(if $(AUDIO_LANG),--language $(AUDIO_LANG)) \ $(if $(OUT_FORMAT),--out-format "$(OUT_FORMAT)") $(EXTRA) dry: @ctrl/batch.sh -i "$(IN)" -o "$(OUT)" $(if $(EXT),-e "$(EXT)") $(if $(LIST),-l "$(LIST)") -n # Document indexing (doocus): replicate the whole IN tree into DOCS_OUT/index.json, # extracting text sidecars only for docx/pdf/pptx/xlsx. # uv run make docs IN="/mnt/win/drive" # index the tree # uv run make docs IN="..." DOC_EXTRA="--ocr" # + OCR scanned pdfs # make docs-dry IN="..." # counts only, no writes docs: @$(PY) process_tree.py "$(IN)" --output "$(DOCS_OUT)" $(DOC_EXTRA) docs-dry: @$(PY) process_tree.py "$(IN)" --output "$(DOCS_OUT)" --dry-run # index.json/meetings.txt are excluded so a merge of meeting dumps can never # clobber the canonical index that lives only in docs-output. MERGE_EXCLUDES = --exclude index.json --exclude meetings.txt merge: @test -n "$(MERGE_SRC)" || { echo "ERROR: MERGE_SRC is required" >&2; exit 1; } @rsync -a $(MERGE_EXCLUDES) "$(MERGE_SRC)/" "$(MERGE_DST)/" && echo "merged $(MERGE_SRC) → $(MERGE_DST)" merge-dry: @test -n "$(MERGE_SRC)" || { echo "ERROR: MERGE_SRC is required" >&2; exit 1; } @rsync -avn $(MERGE_EXCLUDES) "$(MERGE_SRC)/" "$(MERGE_DST)/" docs/graphs/%.svg: docs/graphs/%.dot dot -Tsvg $< -o $@ graphs: $(SVG_OUT) @echo "rendered $(words $(SVG_OUT)) svg(s) from $(words $(DOT_SRC)) dot file(s)" help: @sed -n '3,14p' Makefile