Массовый импорт Strava¶
Документ описывает, как Grom импортирует тренировки из ZIP массового экспорта данных Strava.
Обзор¶
- Пользователь загружает ZIP экспорта Strava на странице Integration → Strava.
- Архив сохраняется в
{storage.temp_dir}/{nickname}/. - Сервер открывает ZIP через Go
archive/zipи читает файлы напрямую (полной распаковки нет). - Для каждой активности Grom создаёт YAML тренировки, при необходимости прикрепляет трек (
AttachTrack), фото и снаряжение. - После завершения временный каталог импорта пользователя удаляется.
Конфигурация¶
По умолчанию: tmp (относительно бинарника grom, как storage.location).
Сопоставление колонок activities.csv¶
Номера колонок с 1. Strava локализует заголовки CSV; Grom всегда использует индексы.
| Col | Strava (пример RU) | Поле Grom | Примечания |
|---|---|---|---|
| 1 | ID физической активности | external_id.id |
С external_id.name = strava; для детекта дубликатов |
| 2 | Дата тренировки | start_date |
Разбор даты с учётом локали |
| 3 | Название тренировки | name |
|
| 4 | Тип активности | sport_type |
Сопоставление с ID типов спорта Grom |
| 5 | Описание | description |
|
| 6 | Общее время | duration_total_seconds |
Секунды |
| 9 | Относительное усилие | relative_effort |
|
| 10 | Регулярный маршрут | regular_track |
Boolean |
| 12 | Снаряжение | equipment[] |
Поиск или создание |
| 13 | Название файла | track |
GPX или .fit.gz в activities/ |
| 17 | Время в движении | duration_seconds |
Секунды |
| 18 | Дистанция | distance |
Метры |
| 19 | Макс. скорость | speed_max_kmh |
В CSV — м/с; Grom умножает на 3.6 → км/ч |
| 20 | Средняя скорость | speed_avg_kmh |
В CSV — м/с; Grom умножает на 3.6 → км/ч |
| 21 | Набор высоты | elevation_gain |
Метры |
| 22 | Высота спуска | elevation_loss |
Метры |
| 23 | Высота низменности | elevation_low |
Метры |
| 24 | Высота подъема | elevation_high |
Метры |
| 25 | Макс. уклон | grade_max |
|
| 26 | Средний угол уклона | grade_avg |
|
| 29 | Макс. каденс | cadence_max |
|
| 30 | Средний каденс | cadence_avg |
|
| 31 | Макс. пульс | heart_rate_max |
|
| 32 | Средний пульс | heart_rate_avg |
|
| 33 | Макс. мощность | watts_max |
Ватты |
| 34 | Средняя мощность | watts_avg |
Ватты |
| 35 | Калории | calories |
|
| 36 | Макс. температура | temperature_max |
°C |
| 37 | Средняя температура | temperature_avg |
°C |
| 86 | Всего шагов | steps_total |
|
| 93 | Всего циклов | cycles_total |
|
| 101 | Всего подходов | sets_total |
|
| 102 | Общее количество повторений | reps_total |
|
| 103 | Медиафайл | media_files |
Фото из media/, видео игнорируются |
Все новые поля YAML пишутся после distance и до track.
Игнорируемые колонки включают col 7 (локализованная дистанция в км) — вместо неё col 18 (метры).
Обработка трека: AttachTrack vs CreateWithTrack¶
| Метод | Сценарий | Перезаписывает метрики CSV |
|---|---|---|
CreateWithTrack |
Ручная загрузка тренировки в UI | Да (start_date, duration_seconds, distance) |
AttachTrack |
Импорт Strava | Нет — значения CSV сохраняются |
AttachTrack всё равно пишет файл трека, задаёт device из FIT при наличии и генерирует map-preview.webp, если есть GPS-данные.
Снаряжение¶
- Сопоставить имя снаряжения активности (col 12) с уже существующим снаряжением пользователя.
- Если не найдено — искать в
bikes.csv(col 1 = имя) → создатьbike. - Иначе искать в
shoes.csv→ создатьshoes. - Иначе создать снаряжение
otherс данным именем.
Определение локали¶
Grom определяет локаль экспорта по названиям типов спорта и строкам дат, затем разбирает:
- Даты — английские и русские форматы Strava, включая четырёхбуквенные русские сокращения месяцев (
сент.,нояб.,февр.). - Числа — десятичный разделитель запятая или точка, разделители тысяч.
- Булевы —
true/false(в экспортах Strava не зависят от локали).
Сопоставление типов спорта¶
Локализованные названия спорта Strava сопоставляются с ID типов спорта Grom (Run, Ride, WeightTraining, …). Когда Strava экспортирует общий тип вроде Workout / Тренировка, Grom может вывести более конкретный спорт из названия активности (например Пилатес (день) → Pilates). Неизвестные типы сводятся к Workout.
Результаты импорта включают:
parse_skipped— строки изactivities.csv, которые не удалось разобрать (например неверные даты) и которые не импортированыmedia_missing— пути фото из колонки media CSV, которых не было в ZIP (массовый экспорт Strava часто опускает старые медиа; видео игнорируются и не считаются)
API¶
| Method | Path | Описание |
|---|---|---|
POST |
/api/v1/integrations/strava/import |
Загрузка ZIP (поле archive), ответ 202 |
GET |
/api/v1/integrations/strava/import/status |
Прогресс загрузки/импорта |
Повторный импорт¶
Если у пользователя уже есть тренировка с тем же external_id (name = strava и совпадающий id), активность пропускается.