- Dart 94.8%
- C++ 1.5%
- Python 1.3%
- CMake 1.1%
- Makefile 0.4%
- Other 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
| android | ||
| assets/sql | ||
| benchmark | ||
| data | ||
| docs | ||
| integration_test | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| scripts | ||
| test | ||
| test_driver | ||
| web | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| AGENTS.md | ||
| analysis_options.yaml | ||
| dart_test.yaml | ||
| Makefile | ||
| pla-icon.png | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
pla
A new Flutter project.
Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
For help getting started with Flutter development, view the online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.
Latest Workout Report and Videos
--latest-week finds the date of the newest workout log in the .pla file and
selects the inclusive seven-day window ending on that date. It does not use the
current date, so rerunning it for the same state file is deterministic.
Generate the latest workout report:
dart --disable-dart-dev scripts/training_report.dart \
--in=path/to/latest-state.pla \
--latest-week \
> build/training_report_latest_week.txt
Rename videos from the same seven-day window, then upload them:
dart --disable-dart-dev scripts/correlate_videos_with_workouts.dart \
--pla=path/to/latest-state.pla \
--videos=path/to/video-directory \
--latest-week \
--latest-week-number=13 \
--week-major=5 \
--include-day \
--apply
python3 scripts/youtube_upload_dir.py \
--dir=path/to/video-directory \
--client-secrets=path/to/client-secret.json \
--name-prefix="Week " \
--playlist="Training videos"
--latest-week-number is optional; it supplies the Week N filename prefix
and is separate from the date-selecting --latest-week flag. The correlator is
safe to rerun: it ignores already named videos, deduplicates identical local
movies, and avoids overwriting an existing target. The uploader is idempotent
when --playlist is supplied because it skips titles already present in that
playlist. Without a playlist, YouTube uploads cannot be detected and rerunning
the uploader may create duplicates. Omit --apply or add --dry-run to the
uploader to inspect each operation first.
State Versioning
The app currently persists one canonical state shape: WorkoutState in
lib/workout_state.dart, with version = 2 and storage key
workout_state_v2.
When state changes in the future:
- Create
WorkoutStateV3(or next version) alongsideWorkoutState. - Add a dedicated migration function (
v2 -> v3) in one place. - Keep migration code only while old persisted blobs must be supported.
- Once migration window is over, bump storage key and remove old versions.