Training Video Organizer
A CLI tool for organizing training videos, logging lift data, and sorting video files from the XTU S6 action camera.
Features
Lift & Session Management
- Add individual lifts or bulk import sessions from JSON or CSV files
- List, update, and delete logged entries
- Filter by date, program, exercise, weight, RIR, etc.
- Open video files to compare lift performance across various factors
- Rich terminal output with tables and colors
- Automatic calculation of estimated 1RM (Bryzycki method) and total set volume for each entry
- Analyze progress across program iterations with built-in metrics comparison
Video File Organization & Playback
- Process directories containing NORM-labeled video files
- Automatically sort files by their NORM suffix in ascending order
- Open filtered videos sequentially using VLC for side-by-side comparison
- Dry-run mode to preview changes before applying them
Prerequisites
- Python 3.10+
uv(recommended for dependency management)- VLC media player (for video playback feature; optional but recommended)
Installing VLC
Linux:
sudo apt install vlc # Debian/Ubuntu
sudo dnf install vlc # Fedora/RHEL
sudo pacman -S vlc # Arch Linux
macOS: Download from VLC official site or use Homebrew:
brew install vlc
Windows: Download installer from VLC official site.
Installation
# Install dependencies
uv sync
Environment Variables
Set TVO_VIDEO_DIR to point to your video storage directory:
Linux/macOS:
export TVO_VIDEO_DIR="/videos"
Windows (PowerShell):
$env:TVO_VIDEO_DIR="C:\Videos"
This environment variable is used by the process command to locate and organize your NORM-labeled video files.
Quick Start
# Initialize the database
tvo init
# Add a single lift with video
tvo add lift --date 2026-09-30 --program "Push/Pull/Legs" \
--iteration 1 --lift squat --weight 225 --reps 8 \
--top-set -f /videos/squat_20260930.mp4
# List all lifts with calculated metrics
tvo list lifts
# Filter by program and iteration
tvo list lifts --program "Push/Pull/Legs" --iteration 1
# Analyze progress across iterations (est. 1RM comparison)
tvo analyze estimated_1rm
# Analyze total set volume progression
tvo analyze total_set_volume
# Open videos for top sets (sequentially with VLC)
tvo open --top-set -l 50
# Process NORM video files in a directory
tvo process /videos/NORM --dry-run # Preview sorting without changes
tvo process /videos/NORM # Apply sorting after confirmation
# Update a lift entry (by ID)
tvo update 42 --weight 230
# Delete an entry
tvo delete 42 --force
CSV Import Format
Bulk import training sessions from a CSV file:
tvo add session -c data/sessions.csv
Required Columns
| Column | Type | Description |
|---|---|---|
date |
string | Date in YYYY-MM-DD format |
program |
string | Program name (e.g., "Push/Pull/Legs") |
program_iteration |
integer | Iteration number of the program |
lift |
string | Exercise name (e.g., "squat", "bench press") |
weight |
integer | Weight lifted in lbs or kg |
reps |
integer | Number of repetitions |
Optional Columns
| Column | Type | Description |
|---|---|---|
bodyweight |
float | Body weight at time of lift |
top_set |
boolean | Mark as top set (true/false) |
warm_up_set |
boolean | Mark as warm-up set (true/false) |
reps_in_reserve |
integer | RIR value (e.g., 1, 2, 3) |
filename |
string | Path to video file for this lift |
Example CSV
date,program,program_iteration,lift,weight,reps,bodyweight,top_set,reps_in_reserve,filename
2026-09-30,Push/Pull/Legs,1,squat,225,8,185,true,1,/videos/squat_20260930.mp4
2026-09-30,Push/Pull/Legs,1,bench press,135,10,185,false,2,/videos/bench_20260930.mp4
Calculated Views
Each lift entry automatically calculates two metrics:
Estimated 1RM (One Rep Max)
Uses the Bryzycki formula: weight × 36 / (37 - reps)
Example: A squat with 200 lbs for 5 reps → estimated 1RM of ~225 lbs.
View in list output as "est. 1RM" column, or analyze progression across iterations:
tvo analyze estimated_1rm
Total Set Volume
Measures work done: weight × reps
Example: A bench press set with 135 lbs for 8 reps → volume of 1080 lbs.
Useful for comparing program iterations and tracking overall workload:
tvo analyze total_set_volume
Video File Processing
note: this mainly exists because prior to 2026, the xtu go cam saved files in a format that was hard to sort from a file explorer-like gui.
The process command organizes NORM-labeled video files in a directory by sorting them based on their NORM suffix. This is useful when you have multiple videos from different sessions that need to be ordered chronologically or numerically.
How It Works
- Scans the target directory for files containing "NORM"
- Extracts the numeric value from each file's NORM suffix (e.g.,
NORM0042→ 42) - Sorts files in ascending order by this numeric value
- Displays a preview of the sorted order
Usage
# Preview changes without modifying files
tvo process /videos/NORM --dry-run
# Apply changes after confirming with prompt
tvo process /videos/NORM
Example Output
Sorted order (NORM suffix):
1. 229638144_NORM0012.MP4 → NORM0012_229638144.MP4 (NORM0012)
2. 273678336_NORM0165.mp4 → NORM0165_273678336.mp4 (NORM0165)
3. file_NORM9999.MP4 → NORM9999_file.MP4 (NORM9999)
Normalize 3 file(s) in '/videos/NORM'? [y/N]: y
Notes
- Only files directly in the target directory are processed (no subdirectories)
- Files must contain "NORM" and follow the expected naming convention
- Invalid filenames are skipped with a warning message
Metadata
Release files for training-vid-organizer 0.4.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| training_vid_organizer-0.4.1.tar.gz | 19.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| training_vid_organizer-0.4.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.2 kB
Release files / training_vid_organizer-0.4.1.tar.gz
| Download URL | training_vid_organizer-0.4.1.tar.gz |
|---|---|
| Size | 19.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f24eba2c96db6b898176a5ee0b7d7aea4370f78ad990a0d7da8c20455cf02e90
|
|
BLAKE2b-256 checksum How to use checksums |
41c37c07d916ea94c9f2e3988fefc713cb0f2cdd19ad8bc13c0831651af7f612
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / training_vid_organizer-0.4.1-py3-none-any.whl
| Download URL | training_vid_organizer-0.4.1-py3-none-any.whl |
|---|---|
| Size | 22.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5d76692a649cff343f853172c331ac1e62cdb415487def47841a6f0798ed3c1b
|
|
BLAKE2b-256 checksum How to use checksums |
dcd6cb05f8a6b56596a70545d1437e86a4ece15902ec4d0350c254eb53601fe0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.1 {"installer":{"name":"uv","version":"0.13.1","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for training-vid-organizer 0.4.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.