diff --git a/.env.example b/.env.example index 4d21fbf..804978a 100644 --- a/.env.example +++ b/.env.example @@ -14,9 +14,20 @@ HF_TOKEN= # Where your recordings live, laid out as /.mp4. Mounted read-write # into the container; written only by user-initiated upload / date-folder # creation (REQ-178), nothing else. -# must be absolute for the copy-path buttons (REQ-179) -VIDEO_ARCHIVE_HOST=/absolute/path/to/reTraining/data/archive -WSL_DISTRO_NAME=Ubuntu +# Relative is recommended — resolved against the directory you start from +# (./start.sh cds to the repo root), so this file needs no editing when you +# move or clone the project to another machine. Absolute paths also work. +VIDEO_ARCHIVE_HOST=./data/archive + +# Copy-path buttons (REQ-179): the Linux button always works from the path +# above; the Windows button (\\wsl.localhost\\...) needs the WSL distro +# name. Under WSL the shell already exports WSL_DISTRO_NAME and compose picks +# it up automatically — delete this line there (redundant, kept only as a +# fallback if your compose run somehow loses the variable). +# On a native Linux machine DELETE or leave this commented out: there is no +# WSL, and naming a distro would fabricate a bogus Windows path — the button +# then simply stays hidden, which is correct. +# WSL_DISTRO_NAME=Ubuntu # ---- ports ------------------------------------------------------------------ diff --git a/backend/config.py b/backend/config.py index 79bab79..ccb7057 100644 --- a/backend/config.py +++ b/backend/config.py @@ -26,16 +26,20 @@ VIDEO_ROOT = os.path.abspath(os.environ.get("VIDEO_ARCHIVE", os.path.join(DATA_D def archive_host_paths() -> dict: """Where the archive sits on the host — for the copy-path buttons (REQ-179). - ponytail: relative VIDEO_ARCHIVE_HOST (./data/archive) cannot be resolved - inside the container; set it absolute in .env or the buttons stay hidden.""" + VIDEO_ARCHIVE_HOST may stay relative (portable across machines): compose + injects the host cwd as ARCHIVE_HOST_PWD (compose always has PWD — a + Windows-side run yields a drive-letter path, handled below), bare-metal + resolves against the process cwd (start.sh cds to the repo root).""" import re host = os.environ.get("VIDEO_ARCHIVE_HOST", "") - if os.path.isabs(host): - linux = host.rstrip("/") - elif VIDEO_ROOT != "/videos": # bare-metal: VIDEO_ROOT is already the host path - linux = VIDEO_ROOT - else: + if host and not os.path.isabs(host): + base = os.environ.get("ARCHIVE_HOST_PWD") or os.getcwd() + host = os.path.abspath(os.path.join(base, host)) + if not host and VIDEO_ROOT != "/videos": + host = VIDEO_ROOT # bare-metal with no VIDEO_ARCHIVE_HOST at all + if not host: return {"linux": None, "windows": None} + linux = host.rstrip("/") if re.match(r"^[A-Za-z]:[\\/]", linux): return {"linux": None, "windows": linux.replace("/", "\\")} distro = os.environ.get("WSL_DISTRO_NAME", "") diff --git a/docker-compose.yml b/docker-compose.yml index b48b480..d93819f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,12 @@ services: VIDEO_ARCHIVE: /videos CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:5173,http://localhost:9000,http://localhost:9010} VIDEO_ARCHIVE_HOST: ${VIDEO_ARCHIVE_HOST:-./data/archive} + # Host working directory — resolves relative VIDEO_ARCHIVE_HOST for the + # copy-path buttons (REQ-179). Must be set by running compose from the + # repo root; ./start.sh does that cd for you. + ARCHIVE_HOST_PWD: ${PWD} + # Auto under WSL (shell exports it); empty on native Linux, which hides + # the Windows copy-path button — expected. WSL_DISTRO_NAME: ${WSL_DISTRO_NAME:-} volumes: - ./data:/data