kinemotion 0.66.2__tar.gz → 0.66.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kinemotion might be problematic. Click here for more details.
- {kinemotion-0.66.2 → kinemotion-0.66.4}/CHANGELOG.md +12 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/PKG-INFO +1 -1
- {kinemotion-0.66.2 → kinemotion-0.66.4}/pyproject.toml +1 -1
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/api.py +192 -113
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/debug_overlay_utils.py +146 -131
- {kinemotion-0.66.2 → kinemotion-0.66.4}/uv.lock +1 -1
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/api/testing-backend-authentication-quick-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3-d-validation-status-and-pending-work.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-granular-logging-implementation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/database-setup-scripts-complete-implementation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/feature-request-system-configuration.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/i18n-implementation-plan-for-validation-messages.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/pyright-strict-mode-fix-patterns.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/supabase-documentation-validation-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/backend-debug-video-logging-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/debug-video-logging-complete-end-to-end-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/kinemotion-logs-in-cloud-logging-production-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/documentation/kinemotion-logs-in-cloud-logging-ready.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/complete-solution-i-os-structured-logging.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/debug-video-codec-fix-and-logging-enhancement.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/fixes/i-phone-video-playback-issue-vp9-codec-not-supported.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/agent-documentation-standards-update.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/backend-authentication-architecture-decision.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/backend-authentication-implementation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/i18n-documentation-cleanup-completed.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/research/performance-improvement-analysis-30s-18s.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.claude/settings.local.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.cursor/mcp.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.dockerignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.envrc +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.gitattributes +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/dependabot.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/pull_request_template.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/release.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.github/workflows/test.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.mcp.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.readthedocs.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.serena/project.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.tool-versions +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/.vercelignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/CLAUDE.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/CONTRIBUTING.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/Dockerfile +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/GEMINI.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/LICENSE +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/SECURITY.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.coveragerc +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.dockerignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/.env.example +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/Dockerfile +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/docs/tests.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/pyproject.toml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/analysis_api.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/config.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app/main.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/app.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/database.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/database.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/responses.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/models/storage.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/analysis.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/database.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/health.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/routes/platform.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/analysis_service.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/validation.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/services/video_processor.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/types.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/supabase-schema.sql +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/conftest.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_health.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/annotations/.gitkeep +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/ground_truth/.gitkeep +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/data/athletepose3d/videos/.gitkeep +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/cmj.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/core.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/dropjump.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/api/overview.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/I18N-README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/feature-request-system.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/feedback-system-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-architecture-diagram.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-cheat-sheet.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-quick-start-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/i18n-validation-messages-specification.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/supabase-database-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/testing.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/type-hints.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/quickstart.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/scripts-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/guides/supabase-setup/setup-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/index.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/quick-start.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/parameters.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/framerate.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/athletepose3d-methodology.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/docs/validation-status.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.editorconfig +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.env.example +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.gitattributes +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/index.html +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/package.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.i18n.integration.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/App.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/Auth.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorBoundary.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeatureRequestButton.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.css +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/FeedbackForm.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.css +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LanguageSwitcher.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LoadingSpinner.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/RecentUploads.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/config/links.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useLanguage.test.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useLanguage.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/config.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/en/translation.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/es/translation.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/i18n/locales/fr/translation.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/index.css +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/main.tsx +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/vercel.json +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/vite.config.ts +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/frontend/yarn.lock +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/justfile +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/local_dev.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/mkdocs.yml +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/presentation/speaker_script.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/requirements-docs.txt +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/samples/cmjs/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/PENDING.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/ap3d_validator.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/prepare_ap3d_data.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/ap3d/validate_baseline.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/debug_detection.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/README.md +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/list.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project/summary.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/project.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/supabasedb/setup-supabase-database.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/supabasedb/setup_supabase_db.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/sonar-project.properties +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/api.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/types.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/api.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/conftest.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_debug_overlay_utils.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_pose.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_quality.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_timing.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_validation.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/tests/dropjump/test_validation_integration.py +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/__init__.pyi +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/solutions/__init__.pyi +0 -0
- {kinemotion-0.66.2 → kinemotion-0.66.4}/typings/mediapipe/solutions/pose.pyi +0 -0
|
@@ -7,6 +7,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## kinemotion-v0.66.4 (2025-12-19)
|
|
11
|
+
|
|
12
|
+
### Refactor
|
|
13
|
+
|
|
14
|
+
- reduce cognitive complexity in debug_overlay_utils and cmj api
|
|
15
|
+
|
|
16
|
+
## kinemotion-v0.66.3 (2025-12-19)
|
|
17
|
+
|
|
18
|
+
### Fix
|
|
19
|
+
|
|
20
|
+
- remove duplicate 'message' parameter in _log call
|
|
21
|
+
|
|
10
22
|
## kinemotion-v0.66.2 (2025-12-19)
|
|
11
23
|
|
|
12
24
|
### Fix
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.66.
|
|
3
|
+
Version: 0.66.4
|
|
4
4
|
Summary: Video-based kinematic analysis for athletic performance
|
|
5
5
|
Project-URL: Homepage, https://github.com/feniix/kinemotion
|
|
6
6
|
Project-URL: Repository, https://github.com/feniix/kinemotion
|
|
@@ -214,6 +214,169 @@ def _create_result_metadata(
|
|
|
214
214
|
)
|
|
215
215
|
|
|
216
216
|
|
|
217
|
+
def _run_pose_tracking(
|
|
218
|
+
video: VideoProcessor,
|
|
219
|
+
quality_preset: QualityPreset,
|
|
220
|
+
detection_confidence: float | None,
|
|
221
|
+
tracking_confidence: float | None,
|
|
222
|
+
pose_tracker: PoseTracker | None,
|
|
223
|
+
verbose: bool,
|
|
224
|
+
timer: Timer,
|
|
225
|
+
) -> tuple[list[NDArray[np.uint8]], list, list[int]]:
|
|
226
|
+
"""Initialize tracker and process all frames."""
|
|
227
|
+
if verbose:
|
|
228
|
+
print(
|
|
229
|
+
f"Video: {video.width}x{video.height} @ {video.fps:.2f} fps, "
|
|
230
|
+
f"{video.frame_count} frames"
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
det_conf, track_conf = determine_confidence_levels(
|
|
234
|
+
quality_preset, detection_confidence, tracking_confidence
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
if verbose:
|
|
238
|
+
print("Processing all frames with MediaPipe pose tracking...")
|
|
239
|
+
|
|
240
|
+
tracker = pose_tracker or PoseTracker(
|
|
241
|
+
min_detection_confidence=det_conf,
|
|
242
|
+
min_tracking_confidence=track_conf,
|
|
243
|
+
timer=timer,
|
|
244
|
+
)
|
|
245
|
+
should_close_tracker = pose_tracker is None
|
|
246
|
+
|
|
247
|
+
return process_all_frames(video, tracker, verbose, timer, close_tracker=should_close_tracker)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _get_tuned_parameters(
|
|
251
|
+
video: VideoProcessor,
|
|
252
|
+
landmarks_sequence: list,
|
|
253
|
+
quality_preset: QualityPreset,
|
|
254
|
+
overrides: AnalysisOverrides | None,
|
|
255
|
+
verbose: bool,
|
|
256
|
+
timer: Timer,
|
|
257
|
+
) -> AnalysisParameters:
|
|
258
|
+
"""Analyze sample and tune parameters with expert overrides."""
|
|
259
|
+
with timer.measure("parameter_auto_tuning"):
|
|
260
|
+
characteristics = analyze_video_sample(landmarks_sequence, video.fps, video.frame_count)
|
|
261
|
+
params = auto_tune_parameters(characteristics, quality_preset)
|
|
262
|
+
params = apply_expert_overrides(
|
|
263
|
+
params,
|
|
264
|
+
overrides.smoothing_window if overrides else None,
|
|
265
|
+
overrides.velocity_threshold if overrides else None,
|
|
266
|
+
overrides.min_contact_frames if overrides else None,
|
|
267
|
+
overrides.visibility_threshold if overrides else None,
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
if verbose:
|
|
271
|
+
print_verbose_parameters(video, characteristics, quality_preset, params)
|
|
272
|
+
|
|
273
|
+
return params
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _run_kinematic_analysis(
|
|
277
|
+
video: VideoProcessor,
|
|
278
|
+
smoothed_landmarks: list,
|
|
279
|
+
params: AnalysisParameters,
|
|
280
|
+
verbose: bool,
|
|
281
|
+
timer: Timer,
|
|
282
|
+
) -> tuple[CMJMetrics, NDArray[np.float64], NDArray[np.float64]]:
|
|
283
|
+
"""Extract positions, detect phases, and calculate metrics."""
|
|
284
|
+
if verbose:
|
|
285
|
+
print("Extracting vertical positions (Hip and Foot)...")
|
|
286
|
+
with timer.measure("vertical_position_extraction"):
|
|
287
|
+
vertical_positions, visibilities = extract_vertical_positions(
|
|
288
|
+
smoothed_landmarks, target="hip"
|
|
289
|
+
)
|
|
290
|
+
foot_positions, _ = extract_vertical_positions(smoothed_landmarks, target="foot")
|
|
291
|
+
|
|
292
|
+
if verbose:
|
|
293
|
+
print("Detecting CMJ phases...")
|
|
294
|
+
with timer.measure("phase_detection"):
|
|
295
|
+
phases = detect_cmj_phases(
|
|
296
|
+
vertical_positions,
|
|
297
|
+
video.fps,
|
|
298
|
+
window_length=params.smoothing_window,
|
|
299
|
+
polyorder=params.polyorder,
|
|
300
|
+
landing_positions=foot_positions,
|
|
301
|
+
timer=timer,
|
|
302
|
+
)
|
|
303
|
+
|
|
304
|
+
if phases is None:
|
|
305
|
+
raise ValueError("Could not detect CMJ phases in video")
|
|
306
|
+
|
|
307
|
+
standing_end, lowest_point, takeoff_frame, landing_frame = phases
|
|
308
|
+
|
|
309
|
+
if verbose:
|
|
310
|
+
print("Calculating metrics...")
|
|
311
|
+
with timer.measure("metrics_calculation"):
|
|
312
|
+
velocities = compute_signed_velocity(
|
|
313
|
+
vertical_positions,
|
|
314
|
+
window_length=params.smoothing_window,
|
|
315
|
+
polyorder=params.polyorder,
|
|
316
|
+
)
|
|
317
|
+
metrics = calculate_cmj_metrics(
|
|
318
|
+
vertical_positions,
|
|
319
|
+
velocities,
|
|
320
|
+
standing_end,
|
|
321
|
+
lowest_point,
|
|
322
|
+
takeoff_frame,
|
|
323
|
+
landing_frame,
|
|
324
|
+
video.fps,
|
|
325
|
+
tracking_method="hip_hybrid",
|
|
326
|
+
)
|
|
327
|
+
|
|
328
|
+
return metrics, vertical_positions, visibilities
|
|
329
|
+
|
|
330
|
+
|
|
331
|
+
def _finalize_analysis_results(
|
|
332
|
+
metrics: CMJMetrics,
|
|
333
|
+
video: VideoProcessor,
|
|
334
|
+
video_path: str,
|
|
335
|
+
vertical_positions: NDArray[np.float64],
|
|
336
|
+
visibilities: NDArray[np.float64],
|
|
337
|
+
params: AnalysisParameters,
|
|
338
|
+
quality_preset: QualityPreset,
|
|
339
|
+
start_time: float,
|
|
340
|
+
timer: Timer,
|
|
341
|
+
verbose: bool,
|
|
342
|
+
) -> None:
|
|
343
|
+
"""Assess quality, validate metrics, and attach metadata."""
|
|
344
|
+
if verbose:
|
|
345
|
+
print("Assessing tracking quality...")
|
|
346
|
+
with timer.measure("quality_assessment"):
|
|
347
|
+
_, outlier_mask = reject_outliers(
|
|
348
|
+
vertical_positions,
|
|
349
|
+
use_ransac=True,
|
|
350
|
+
use_median=True,
|
|
351
|
+
interpolate=False,
|
|
352
|
+
)
|
|
353
|
+
quality_result = assess_jump_quality(
|
|
354
|
+
visibilities=visibilities,
|
|
355
|
+
positions=vertical_positions,
|
|
356
|
+
outlier_mask=outlier_mask,
|
|
357
|
+
fps=video.fps,
|
|
358
|
+
phases_detected=True,
|
|
359
|
+
phase_count=4,
|
|
360
|
+
)
|
|
361
|
+
|
|
362
|
+
_print_quality_warnings(quality_result, verbose)
|
|
363
|
+
|
|
364
|
+
with timer.measure("metrics_validation"):
|
|
365
|
+
validator = CMJMetricsValidator()
|
|
366
|
+
validation_result = validator.validate(metrics.to_dict()) # type: ignore[arg-type]
|
|
367
|
+
metrics.validation_result = validation_result
|
|
368
|
+
|
|
369
|
+
algorithm_config = _create_algorithm_config(params)
|
|
370
|
+
video_info = _create_video_info(video_path, video)
|
|
371
|
+
processing_info = _create_processing_info(start_time, quality_preset, timer)
|
|
372
|
+
result_metadata = _create_result_metadata(
|
|
373
|
+
quality_result, video_info, processing_info, algorithm_config
|
|
374
|
+
)
|
|
375
|
+
metrics.result_metadata = result_metadata
|
|
376
|
+
|
|
377
|
+
_print_validation_results(validation_result, verbose)
|
|
378
|
+
|
|
379
|
+
|
|
217
380
|
@dataclass
|
|
218
381
|
class CMJVideoConfig:
|
|
219
382
|
"""Configuration for processing a single CMJ video."""
|
|
@@ -285,112 +448,29 @@ def process_cmj_video(
|
|
|
285
448
|
|
|
286
449
|
with timer.measure("video_initialization"):
|
|
287
450
|
with VideoProcessor(video_path, timer=timer) as video:
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if verbose:
|
|
299
|
-
print("Processing all frames with MediaPipe pose tracking...")
|
|
300
|
-
|
|
301
|
-
tracker = pose_tracker or PoseTracker(
|
|
302
|
-
min_detection_confidence=det_conf,
|
|
303
|
-
min_tracking_confidence=track_conf,
|
|
304
|
-
timer=timer,
|
|
451
|
+
# 1. Pose Tracking
|
|
452
|
+
frames, landmarks_sequence, frame_indices = _run_pose_tracking(
|
|
453
|
+
video,
|
|
454
|
+
quality_preset,
|
|
455
|
+
detection_confidence,
|
|
456
|
+
tracking_confidence,
|
|
457
|
+
pose_tracker,
|
|
458
|
+
verbose,
|
|
459
|
+
timer,
|
|
305
460
|
)
|
|
306
|
-
should_close_tracker = pose_tracker is None
|
|
307
461
|
|
|
308
|
-
|
|
309
|
-
|
|
462
|
+
# 2. Parameters & Smoothing
|
|
463
|
+
params = _get_tuned_parameters(
|
|
464
|
+
video, landmarks_sequence, quality_preset, overrides, verbose, timer
|
|
310
465
|
)
|
|
311
|
-
|
|
312
|
-
with timer.measure("parameter_auto_tuning"):
|
|
313
|
-
characteristics = analyze_video_sample(
|
|
314
|
-
landmarks_sequence, video.fps, video.frame_count
|
|
315
|
-
)
|
|
316
|
-
params = auto_tune_parameters(characteristics, quality_preset)
|
|
317
|
-
params = apply_expert_overrides(
|
|
318
|
-
params,
|
|
319
|
-
overrides.smoothing_window if overrides else None,
|
|
320
|
-
overrides.velocity_threshold if overrides else None,
|
|
321
|
-
overrides.min_contact_frames if overrides else None,
|
|
322
|
-
overrides.visibility_threshold if overrides else None,
|
|
323
|
-
)
|
|
324
|
-
|
|
325
|
-
if verbose:
|
|
326
|
-
print_verbose_parameters(video, characteristics, quality_preset, params)
|
|
327
|
-
|
|
328
466
|
smoothed_landmarks = apply_smoothing(landmarks_sequence, params, verbose, timer)
|
|
329
467
|
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
smoothed_landmarks, target="hip"
|
|
335
|
-
)
|
|
336
|
-
foot_positions, _ = extract_vertical_positions(smoothed_landmarks, target="foot")
|
|
337
|
-
|
|
338
|
-
if verbose:
|
|
339
|
-
print("Detecting CMJ phases...")
|
|
340
|
-
with timer.measure("phase_detection"):
|
|
341
|
-
phases = detect_cmj_phases(
|
|
342
|
-
vertical_positions,
|
|
343
|
-
video.fps,
|
|
344
|
-
window_length=params.smoothing_window,
|
|
345
|
-
polyorder=params.polyorder,
|
|
346
|
-
landing_positions=foot_positions,
|
|
347
|
-
timer=timer,
|
|
348
|
-
)
|
|
349
|
-
|
|
350
|
-
if phases is None:
|
|
351
|
-
raise ValueError("Could not detect CMJ phases in video")
|
|
352
|
-
|
|
353
|
-
standing_end, lowest_point, takeoff_frame, landing_frame = phases
|
|
354
|
-
|
|
355
|
-
if verbose:
|
|
356
|
-
print("Calculating metrics...")
|
|
357
|
-
with timer.measure("metrics_calculation"):
|
|
358
|
-
velocities = compute_signed_velocity(
|
|
359
|
-
vertical_positions,
|
|
360
|
-
window_length=params.smoothing_window,
|
|
361
|
-
polyorder=params.polyorder,
|
|
362
|
-
)
|
|
363
|
-
metrics = calculate_cmj_metrics(
|
|
364
|
-
vertical_positions,
|
|
365
|
-
velocities,
|
|
366
|
-
standing_end,
|
|
367
|
-
lowest_point,
|
|
368
|
-
takeoff_frame,
|
|
369
|
-
landing_frame,
|
|
370
|
-
video.fps,
|
|
371
|
-
tracking_method="hip_hybrid",
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
if verbose:
|
|
375
|
-
print("Assessing tracking quality...")
|
|
376
|
-
with timer.measure("quality_assessment"):
|
|
377
|
-
_, outlier_mask = reject_outliers(
|
|
378
|
-
vertical_positions,
|
|
379
|
-
use_ransac=True,
|
|
380
|
-
use_median=True,
|
|
381
|
-
interpolate=False,
|
|
382
|
-
)
|
|
383
|
-
quality_result = assess_jump_quality(
|
|
384
|
-
visibilities=visibilities,
|
|
385
|
-
positions=vertical_positions,
|
|
386
|
-
outlier_mask=outlier_mask,
|
|
387
|
-
fps=video.fps,
|
|
388
|
-
phases_detected=True,
|
|
389
|
-
phase_count=4,
|
|
390
|
-
)
|
|
391
|
-
|
|
392
|
-
_print_quality_warnings(quality_result, verbose)
|
|
468
|
+
# 3. Kinematic Analysis
|
|
469
|
+
metrics, vertical_positions, visibilities = _run_kinematic_analysis(
|
|
470
|
+
video, smoothed_landmarks, params, verbose, timer
|
|
471
|
+
)
|
|
393
472
|
|
|
473
|
+
# 4. Debug Video Generation (Optional)
|
|
394
474
|
if output_video:
|
|
395
475
|
_generate_debug_video(
|
|
396
476
|
output_video,
|
|
@@ -403,24 +483,23 @@ def process_cmj_video(
|
|
|
403
483
|
verbose,
|
|
404
484
|
)
|
|
405
485
|
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
486
|
+
# 5. Finalization (Quality, Metadata, Validation)
|
|
487
|
+
_finalize_analysis_results(
|
|
488
|
+
metrics,
|
|
489
|
+
video,
|
|
490
|
+
video_path,
|
|
491
|
+
vertical_positions,
|
|
492
|
+
visibilities,
|
|
493
|
+
params,
|
|
494
|
+
quality_preset,
|
|
495
|
+
start_time,
|
|
496
|
+
timer,
|
|
497
|
+
verbose,
|
|
416
498
|
)
|
|
417
|
-
metrics.result_metadata = result_metadata
|
|
418
499
|
|
|
419
500
|
if json_output:
|
|
420
501
|
_save_metrics_to_json(metrics, json_output, timer, verbose)
|
|
421
502
|
|
|
422
|
-
_print_validation_results(validation_result, verbose)
|
|
423
|
-
|
|
424
503
|
if verbose:
|
|
425
504
|
_print_timing_summary(start_time, timer, metrics)
|
|
426
505
|
|
|
@@ -6,6 +6,7 @@ import shutil
|
|
|
6
6
|
import subprocess
|
|
7
7
|
import time
|
|
8
8
|
from pathlib import Path
|
|
9
|
+
from typing import Any
|
|
9
10
|
|
|
10
11
|
import cv2
|
|
11
12
|
import numpy as np
|
|
@@ -73,53 +74,67 @@ def create_video_writer(
|
|
|
73
74
|
# ⚠️ CRITICAL: VP9 (vp09) is EXCLUDED - not supported on iOS/iPhone/iPad browsers!
|
|
74
75
|
# Adding VP9 will break debug video playback on all iOS devices.
|
|
75
76
|
codecs_to_try = ["avc1", "mp4v"]
|
|
76
|
-
|
|
77
|
-
writer = None
|
|
78
|
-
used_codec = "mp4v" # Default fallback
|
|
79
|
-
codec_attempt_log = []
|
|
77
|
+
codec_attempt_log: list[dict[str, Any]] = []
|
|
80
78
|
|
|
81
79
|
for codec in codecs_to_try:
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
writer = cv2.VideoWriter(output_path, fourcc, fps, (display_width, display_height))
|
|
85
|
-
if writer.isOpened():
|
|
86
|
-
used_codec = codec
|
|
87
|
-
codec_attempt_log.append({"codec": codec, "status": "success"})
|
|
88
|
-
_log(
|
|
89
|
-
"info",
|
|
90
|
-
"debug_video_codec_selected",
|
|
91
|
-
codec=codec,
|
|
92
|
-
width=display_width,
|
|
93
|
-
height=display_height,
|
|
94
|
-
fps=fps,
|
|
95
|
-
)
|
|
96
|
-
if codec == "mp4v":
|
|
97
|
-
msg = (
|
|
98
|
-
"Using fallback MPEG-4 codec; will re-encode with ffmpeg for "
|
|
99
|
-
"browser compatibility"
|
|
100
|
-
)
|
|
101
|
-
_log("warning", "debug_video_fallback_codec", codec="mp4v", message=msg)
|
|
102
|
-
break
|
|
103
|
-
except Exception as e:
|
|
104
|
-
codec_attempt_log.append({"codec": codec, "status": "failed", "error": str(e)})
|
|
105
|
-
_log("info", "debug_video_codec_attempt_failed", codec=codec, error=str(e))
|
|
106
|
-
continue
|
|
107
|
-
|
|
108
|
-
if writer is None or not writer.isOpened():
|
|
109
|
-
_log(
|
|
110
|
-
"error",
|
|
111
|
-
"debug_video_writer_creation_failed",
|
|
112
|
-
output_path=output_path,
|
|
113
|
-
dimensions=f"{display_width}x{display_height}",
|
|
114
|
-
fps=fps,
|
|
115
|
-
codec_attempts=codec_attempt_log,
|
|
80
|
+
writer = _try_open_video_writer(
|
|
81
|
+
output_path, codec, fps, display_width, display_height, codec_attempt_log
|
|
116
82
|
)
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
83
|
+
if writer:
|
|
84
|
+
return writer, needs_resize, codec
|
|
85
|
+
|
|
86
|
+
_log(
|
|
87
|
+
"error",
|
|
88
|
+
"debug_video_writer_creation_failed",
|
|
89
|
+
output_path=output_path,
|
|
90
|
+
dimensions=f"{display_width}x{display_height}",
|
|
91
|
+
fps=fps,
|
|
92
|
+
codec_attempts=codec_attempt_log,
|
|
93
|
+
)
|
|
94
|
+
raise ValueError(
|
|
95
|
+
f"Failed to create video writer for {output_path} with dimensions "
|
|
96
|
+
f"{display_width}x{display_height}"
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def _try_open_video_writer(
|
|
101
|
+
output_path: str,
|
|
102
|
+
codec: str,
|
|
103
|
+
fps: float,
|
|
104
|
+
width: int,
|
|
105
|
+
height: int,
|
|
106
|
+
attempt_log: list[dict[str, Any]],
|
|
107
|
+
) -> cv2.VideoWriter | None:
|
|
108
|
+
"""Attempt to open a video writer with a specific codec."""
|
|
109
|
+
try:
|
|
110
|
+
fourcc = cv2.VideoWriter_fourcc(*codec) # type: ignore[attr-defined]
|
|
111
|
+
writer = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
|
|
112
|
+
if writer.isOpened():
|
|
113
|
+
attempt_log.append({"codec": codec, "status": "success"})
|
|
114
|
+
_log(
|
|
115
|
+
"info",
|
|
116
|
+
"debug_video_codec_selected",
|
|
117
|
+
codec=codec,
|
|
118
|
+
width=width,
|
|
119
|
+
height=height,
|
|
120
|
+
fps=fps,
|
|
121
|
+
)
|
|
122
|
+
if codec == "mp4v":
|
|
123
|
+
msg = (
|
|
124
|
+
"Using fallback MPEG-4 codec; will re-encode with ffmpeg for "
|
|
125
|
+
"browser compatibility"
|
|
126
|
+
)
|
|
127
|
+
_log("warning", "debug_video_fallback_codec", codec="mp4v", warning=msg)
|
|
128
|
+
return writer
|
|
129
|
+
|
|
130
|
+
attempt_log.append(
|
|
131
|
+
{"codec": codec, "status": "failed", "error": "isOpened() returned False"}
|
|
120
132
|
)
|
|
133
|
+
except Exception as e:
|
|
134
|
+
attempt_log.append({"codec": codec, "status": "failed", "error": str(e)})
|
|
135
|
+
_log("info", "debug_video_codec_attempt_failed", codec=codec, error=str(e))
|
|
121
136
|
|
|
122
|
-
return
|
|
137
|
+
return None
|
|
123
138
|
|
|
124
139
|
|
|
125
140
|
def write_overlay_frame(
|
|
@@ -262,92 +277,17 @@ class BaseDebugOverlayRenderer:
|
|
|
262
277
|
codec=self.used_codec,
|
|
263
278
|
)
|
|
264
279
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
# Convert to H.264 with yuv420p pixel format for browser compatibility
|
|
274
|
-
# -y: Overwrite output file
|
|
275
|
-
# -vcodec libx264: Use H.264 codec
|
|
276
|
-
# -pix_fmt yuv420p: Required for wide browser support (Chrome,
|
|
277
|
-
# Safari, Firefox, iOS)
|
|
278
|
-
# -preset fast: Reasonable speed/compression tradeoff
|
|
279
|
-
# -crf 23: Standard quality
|
|
280
|
-
# -an: Remove audio (debug video has no audio)
|
|
281
|
-
cmd = [
|
|
282
|
-
"ffmpeg",
|
|
283
|
-
"-y",
|
|
284
|
-
"-i",
|
|
285
|
-
self.output_path,
|
|
286
|
-
"-vcodec",
|
|
287
|
-
"libx264",
|
|
288
|
-
"-pix_fmt",
|
|
289
|
-
"yuv420p",
|
|
290
|
-
"-preset",
|
|
291
|
-
"fast",
|
|
292
|
-
"-crf",
|
|
293
|
-
"23",
|
|
294
|
-
"-an",
|
|
295
|
-
temp_path,
|
|
296
|
-
]
|
|
297
|
-
|
|
298
|
-
_log(
|
|
299
|
-
"info",
|
|
300
|
-
"debug_video_ffmpeg_reencoding_start",
|
|
301
|
-
input_file=self.output_path,
|
|
302
|
-
output_file=temp_path,
|
|
303
|
-
output_codec="libx264",
|
|
304
|
-
pixel_format="yuv420p",
|
|
305
|
-
reason="iOS_compatibility",
|
|
306
|
-
)
|
|
307
|
-
|
|
308
|
-
# Suppress output unless error
|
|
309
|
-
reencode_start = time.time()
|
|
310
|
-
subprocess.run(
|
|
311
|
-
cmd,
|
|
312
|
-
check=True,
|
|
313
|
-
stdout=subprocess.DEVNULL,
|
|
314
|
-
stderr=subprocess.PIPE,
|
|
315
|
-
)
|
|
316
|
-
self.reencode_duration_s = time.time() - reencode_start
|
|
317
|
-
|
|
318
|
-
_log(
|
|
319
|
-
"info",
|
|
320
|
-
"debug_video_ffmpeg_reencoding_complete",
|
|
321
|
-
duration_ms=round(self.reencode_duration_s * 1000, 1),
|
|
322
|
-
)
|
|
323
|
-
|
|
324
|
-
# Overwrite original file
|
|
325
|
-
os.replace(temp_path, self.output_path)
|
|
326
|
-
_log(
|
|
327
|
-
"info",
|
|
328
|
-
"debug_video_reencoded_file_replaced",
|
|
329
|
-
output_path=self.output_path,
|
|
330
|
-
final_codec="libx264",
|
|
331
|
-
pixel_format="yuv420p",
|
|
332
|
-
)
|
|
280
|
+
if self.used_codec != "mp4v":
|
|
281
|
+
_log(
|
|
282
|
+
"info",
|
|
283
|
+
"debug_video_ready_for_playback",
|
|
284
|
+
codec=self.used_codec,
|
|
285
|
+
path=self.output_path,
|
|
286
|
+
)
|
|
287
|
+
return
|
|
333
288
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
_log(
|
|
337
|
-
"warning",
|
|
338
|
-
"debug_video_ffmpeg_reencoding_failed",
|
|
339
|
-
error=str(e),
|
|
340
|
-
stderr=stderr_msg,
|
|
341
|
-
)
|
|
342
|
-
if temp_path and os.path.exists(temp_path):
|
|
343
|
-
os.remove(temp_path)
|
|
344
|
-
_log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
|
|
345
|
-
except Exception as e:
|
|
346
|
-
_log("warning", "debug_video_post_processing_error", error=str(e))
|
|
347
|
-
if temp_path and os.path.exists(temp_path):
|
|
348
|
-
os.remove(temp_path)
|
|
349
|
-
_log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
|
|
350
|
-
elif self.used_codec == "mp4v" and not shutil.which("ffmpeg"):
|
|
289
|
+
ffmpeg_path = shutil.which("ffmpeg")
|
|
290
|
+
if not ffmpeg_path:
|
|
351
291
|
_log(
|
|
352
292
|
"warning",
|
|
353
293
|
"debug_video_ffmpeg_not_available",
|
|
@@ -355,13 +295,88 @@ class BaseDebugOverlayRenderer:
|
|
|
355
295
|
output_path=self.output_path,
|
|
356
296
|
warning="Video may not play in all browsers",
|
|
357
297
|
)
|
|
358
|
-
|
|
298
|
+
return
|
|
299
|
+
|
|
300
|
+
self._reencode_to_h264()
|
|
301
|
+
|
|
302
|
+
def _reencode_to_h264(self) -> None:
|
|
303
|
+
"""Re-encode video to H.264 for browser compatibility using ffmpeg."""
|
|
304
|
+
temp_path = str(
|
|
305
|
+
Path(self.output_path).with_suffix(".temp" + Path(self.output_path).suffix)
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
# Convert to H.264 with yuv420p pixel format for browser compatibility
|
|
309
|
+
# -y: Overwrite output file
|
|
310
|
+
# -vcodec libx264: Use H.264 codec
|
|
311
|
+
# -pix_fmt yuv420p: Required for wide browser support (Chrome, Safari, Firefox, iOS)
|
|
312
|
+
# -preset fast: Reasonable speed/compression tradeoff
|
|
313
|
+
# -crf 23: Standard quality
|
|
314
|
+
# -an: Remove audio (debug video has no audio)
|
|
315
|
+
cmd = [
|
|
316
|
+
"ffmpeg",
|
|
317
|
+
"-y",
|
|
318
|
+
"-i",
|
|
319
|
+
self.output_path,
|
|
320
|
+
"-vcodec",
|
|
321
|
+
"libx264",
|
|
322
|
+
"-pix_fmt",
|
|
323
|
+
"yuv420p",
|
|
324
|
+
"-preset",
|
|
325
|
+
"fast",
|
|
326
|
+
"-crf",
|
|
327
|
+
"23",
|
|
328
|
+
"-an",
|
|
329
|
+
temp_path,
|
|
330
|
+
]
|
|
331
|
+
|
|
332
|
+
_log(
|
|
333
|
+
"info",
|
|
334
|
+
"debug_video_ffmpeg_reencoding_start",
|
|
335
|
+
input_file=self.output_path,
|
|
336
|
+
output_file=temp_path,
|
|
337
|
+
output_codec="libx264",
|
|
338
|
+
pixel_format="yuv420p",
|
|
339
|
+
reason="iOS_compatibility",
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
try:
|
|
343
|
+
reencode_start = time.time()
|
|
344
|
+
subprocess.run(cmd, check=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
|
|
345
|
+
self.reencode_duration_s = time.time() - reencode_start
|
|
346
|
+
|
|
359
347
|
_log(
|
|
360
348
|
"info",
|
|
361
|
-
"
|
|
362
|
-
|
|
363
|
-
|
|
349
|
+
"debug_video_ffmpeg_reencoding_complete",
|
|
350
|
+
duration_ms=round(self.reencode_duration_s * 1000, 1),
|
|
351
|
+
)
|
|
352
|
+
|
|
353
|
+
os.replace(temp_path, self.output_path)
|
|
354
|
+
_log(
|
|
355
|
+
"info",
|
|
356
|
+
"debug_video_reencoded_file_replaced",
|
|
357
|
+
output_path=self.output_path,
|
|
358
|
+
final_codec="libx264",
|
|
359
|
+
pixel_format="yuv420p",
|
|
364
360
|
)
|
|
361
|
+
except (subprocess.CalledProcessError, Exception) as e:
|
|
362
|
+
self._handle_reencode_error(e, temp_path)
|
|
363
|
+
|
|
364
|
+
def _handle_reencode_error(self, e: Exception, temp_path: str) -> None:
|
|
365
|
+
"""Handle errors during ffmpeg re-encoding."""
|
|
366
|
+
if isinstance(e, subprocess.CalledProcessError):
|
|
367
|
+
stderr_msg = e.stderr.decode("utf-8", errors="ignore") if e.stderr else "N/A"
|
|
368
|
+
_log(
|
|
369
|
+
"warning",
|
|
370
|
+
"debug_video_ffmpeg_reencoding_failed",
|
|
371
|
+
error=str(e),
|
|
372
|
+
stderr=stderr_msg,
|
|
373
|
+
)
|
|
374
|
+
else:
|
|
375
|
+
_log("warning", "debug_video_post_processing_error", error=str(e))
|
|
376
|
+
|
|
377
|
+
if os.path.exists(temp_path):
|
|
378
|
+
os.remove(temp_path)
|
|
379
|
+
_log("info", "debug_video_temp_file_cleaned_up", temp_file=temp_path)
|
|
365
380
|
|
|
366
381
|
def __enter__(self) -> Self:
|
|
367
382
|
return self
|