diff --git a/.gitignore b/.gitignore
index 0b33d80..83e6fff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,5 @@ __pycache__/
build/
dist/
logs/
+.venv/
+scripts/strava_token.txt
diff --git a/README.md b/README.md
index 2eb62d9..2c5897d 100644
--- a/README.md
+++ b/README.md
@@ -77,6 +77,7 @@ zoffline can be installed on the same machine as Zwift or another local machine.
- TZ=Europe/London
volumes:
- ./storage/:/usr/src/app/zwift-offline/storage
+ - ${ZWIFT_WORKOUTS_DIR:-~/Documents/Zwift/Workouts}:/root/Documents/Zwift/Workouts
ports:
- 80:80
- 443:443
@@ -85,6 +86,7 @@ zoffline can be installed on the same machine as Zwift or another local machine.
restart: unless-stopped
```
* In the ``volumes`` tag replace ``./storage/`` before the ``:`` with the directory path you want to use as your local zoffline data store.
+ * Set ``ZWIFT_WORKOUTS_DIR`` if your local Zwift workouts folder is not ``~/Documents/Zwift/Workouts``.
* If you are not running zoffline on the same PC that Zwift is running: create a ``server-ip.txt`` file in the ``storage`` directory containing the IP address of the PC running zoffline.
* Start zoffline with: ``docker-compose up -d``
@@ -437,4 +439,3 @@ this project and does not endorse this project.
All product and company names are trademarks of their respective holders. Use of
them does not imply any affiliation with or endorsement by them.
-
diff --git a/cdn/static/web/launcher/intervals.html b/cdn/static/web/launcher/intervals.html
index 286aaea..14414b1 100644
--- a/cdn/static/web/launcher/intervals.html
+++ b/cdn/static/web/launcher/intervals.html
@@ -8,6 +8,7 @@
@@ -31,6 +32,36 @@
+ {% if sync_status %}
+
+ -
+
Active provider: {{ active_provider or 'not selected' }}
+
+ -
+ {% if sync_status.metadata %}
+
Synced workout: {{ sync_status.metadata.name or sync_status.metadata.filename }}
+ {{ sync_status.metadata.filename }}
+ {% if sync_status.metadata.start_date_local %}
+ {{ sync_status.metadata.start_date_local }}
+ {% endif %}
+ {% else %}
+ No synced Intervals workout is cached right now.
+ Use "Sync today's workout" before launching Zwift.
+ {% endif %}
+
+ -
+ {% if sync_status.local_status %}
+
Local Zwift catalog: {{ 'ready for launch' if sync_status.local_status.healthy else 'needs refresh' }}
+ File: {{ 'present' if sync_status.local_status.file_exists else 'missing' }} | Manifest: {{ 'present' if sync_status.local_status.manifest_entry_exists else 'missing' }}
+ {% if sync_status.local_status.manifest_entry %}
+ Guid {{ sync_status.local_status.manifest_entry.guid }}, checksum {{ sync_status.local_status.manifest_entry.checksum }}
+ {% endif %}
+ {% else %}
+ Local Zwift catalog: waiting for next sync
+ {% endif %}
+
+
+ {% endif %}
{% with messages = get_flashed_messages() %}
{% if messages %}
diff --git a/cdn/static/web/launcher/settings.html b/cdn/static/web/launcher/settings.html
index 91fa9ec..d7db488 100644
--- a/cdn/static/web/launcher/settings.html
+++ b/cdn/static/web/launcher/settings.html
@@ -14,6 +14,7 @@
Zwift
Strava
Intervals
+ TrainingPeaks
{% if files %}
diff --git a/cdn/static/web/launcher/trainingpeaks.html b/cdn/static/web/launcher/trainingpeaks.html
new file mode 100644
index 0000000..91d933e
--- /dev/null
+++ b/cdn/static/web/launcher/trainingpeaks.html
@@ -0,0 +1,49 @@
+{% extends "./layout.html" %}
+{% block content %}
+ TrainingPeaks
+ {% if username != "zoffline" %}
+ Logged in as {{ username }}
+ {% endif %}
+
+
+
+
+
+
+
Manual bridge mode: export TrainingPeaks workouts as .zwo files into a local folder, save that folder path here, then click "Import workouts".
+
+
+
+ {% with messages = get_flashed_messages() %}
+ {% if messages %}
+
+ {% for message in messages %}
+ -
+
{{ message }}
+
+ {% endfor %}
+
+ {% endif %}
+ {% endwith %}
+
+
+{% endblock %}
diff --git a/cdn/static/web/launcher/user_home.html b/cdn/static/web/launcher/user_home.html
index e0d60e3..7ef84a8 100644
--- a/cdn/static/web/launcher/user_home.html
+++ b/cdn/static/web/launcher/user_home.html
@@ -29,6 +29,25 @@
+ {% if workout_sync_status %}
+
+ -
+
Workout provider: {{ active_workout_provider or 'not selected' }}
+ {% if workout_sync_status.metadata %}
+ {{ workout_sync_status.metadata.name or workout_sync_status.metadata.filename }}
+ {% else %}
+ No synced workout cached yet.
+ {% endif %}
+
+ -
+ {% if workout_sync_status.local_status %}
+
Local workout catalog: {{ 'ready for launch' if workout_sync_status.local_status.healthy else 'needs refresh' }}
+ {% else %}
+ Local workout catalog: waiting for next sync
+ {% endif %}
+
+
+ {% endif %}