73 lines
2.3 KiB
Python
73 lines
2.3 KiB
Python
import sys
|
|
import os
|
|
from sqlalchemy import create_engine
|
|
from sqlalchemy.orm import sessionmaker
|
|
import fitdecode
|
|
import io
|
|
|
|
# Add curdir to path
|
|
sys.path.append(os.getcwd())
|
|
|
|
from src.models.activity import Activity
|
|
|
|
# Using localhost:5433 as per docker-compose port mapping
|
|
DATABASE_URL = "postgresql://postgres:password@localhost:5433/fitbit_garmin_sync"
|
|
|
|
def inspect_fit_fields(garmin_id):
|
|
print(f"Connecting to DB: {DATABASE_URL}")
|
|
try:
|
|
engine = create_engine(DATABASE_URL)
|
|
Session = sessionmaker(bind=engine)
|
|
session = Session()
|
|
except Exception as e:
|
|
print(f"Failed to connect to DB: {e}")
|
|
return
|
|
|
|
try:
|
|
activity = session.query(Activity).filter(Activity.garmin_activity_id == garmin_id).first()
|
|
if not activity:
|
|
print(f"Activity {garmin_id} not found in DB.")
|
|
return
|
|
|
|
if not activity.file_content or activity.file_type != 'fit':
|
|
print("No FIT content found.")
|
|
return
|
|
|
|
print(f"Parsing FIT file for Activity {garmin_id}...")
|
|
|
|
record_fields = set()
|
|
lap_fields = set()
|
|
session_fields = set()
|
|
|
|
with io.BytesIO(activity.file_content) as f:
|
|
with fitdecode.FitReader(f) as fit:
|
|
for frame in fit:
|
|
if frame.frame_type == fitdecode.FIT_FRAME_DATA:
|
|
if frame.name == 'record':
|
|
for field in frame.fields:
|
|
record_fields.add(field.name)
|
|
elif frame.name == 'lap':
|
|
for field in frame.fields:
|
|
lap_fields.add(field.name)
|
|
elif frame.name == 'session':
|
|
for field in frame.fields:
|
|
session_fields.add(field.name)
|
|
|
|
print("\n--- Available 'record' Fields (Time Series) ---")
|
|
for field in sorted(record_fields):
|
|
print(f" - {field}")
|
|
|
|
print("\n--- Available 'lap' Fields ---")
|
|
for field in sorted(lap_fields):
|
|
print(f" - {field}")
|
|
|
|
print("\n--- Available 'session' Fields (Summary) ---")
|
|
for field in sorted(session_fields):
|
|
print(f" - {field}")
|
|
|
|
finally:
|
|
session.close()
|
|
|
|
if __name__ == "__main__":
|
|
inspect_fit_fields("21517046364")
|