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")