martin-ueding / geo-activity-playground

Data analysis and visualization based on GPS tracked outdoor activities.
https://martin-ueding.github.io/geo-activity-playground/
MIT License
31 stars 13 forks source link

Import from Strava export crashes on broken .fit file #134

Closed p3dda closed 1 month ago

p3dda commented 1 month ago

In my Strava export, there is one obviously broken .fit file. Although the activity is shown correctly in Stravas webinterface, the file cannot be read (also not by other .fit file viewers).

During import, there is an unhandled FitHeaderError exception raised which leads to abortion of the import process:

Import from Strava export:  65%|██████▌   | 2505/3835 [00:39<00:21, 63.08it/s]
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/app/geo_activity_playground/__main__.py", line 118, in <module>
    main()
  File "/app/geo_activity_playground/__main__.py", line 93, in main
    options.func(options)
  File "/app/geo_activity_playground/__main__.py", line 67, in <lambda>
    *make_activity_repository(options.basedir, options.skip_strava),
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/geo_activity_playground/__main__.py", line 112, in make_activity_repository
    scan_for_activities(repository, tile_visit_accessor, config, skip_strava)
  File "/app/geo_activity_playground/webui/upload/controller.py", line 103, in scan_for_activities
    import_from_strava_checkout(repository)
  File "/app/geo_activity_playground/importers/strava_checkout.py", line 198, in import_from_strava_checkout
    file_activity_meta, time_series = read_activity(activity_file)
                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/geo_activity_playground/core/activity_parsers.py", line 45, in read_activity
    metadata, timeseries = read_fit_activity(path, opener)
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/geo_activity_playground/core/activity_parsers.py", line 98, in read_fit_activity
    for frame in fit:
  File "/usr/local/lib/python3.11/site-packages/fitdecode/reader.py", line 232, in __iter__
    yield from self._read_next()
  File "/usr/local/lib/python3.11/site-packages/fitdecode/reader.py", line 351, in _read_next
    self._read_header()
  File "/usr/local/lib/python3.11/site-packages/fitdecode/reader.py", line 424, in _read_header
    raise FitHeaderError(f'not a FIT file @ {self._chunk_offset}')
fitdecode.exceptions.FitHeaderError: not a FIT file @ 0