server_photo_s85js/api_v1/scanner/parseActivityFile.js
2026-08-11 08:45:04 +02:00

100 lines
3.5 KiB
JavaScript

// api_v1/scanner/parseActivityFile.js
const path = require('path');
// Parser specifici
const parseFit = require('./parsers/parseFit');
const parseGpx = require('./parsers/parseGpx');
const parseTcx = require('./parsers/parseTcx');
// ---------------------------------------------------------
// parseActivityFile → rileva tipo e chiama parser specifico
// ---------------------------------------------------------
async function parseActivityFile(absPath) {
const ext = path.extname(absPath).toLowerCase();
let parsed;
if (ext === '.fit') {
parsed = await parseFit(absPath);
} else if (ext === '.gpx') {
parsed = await parseGpx(absPath);
} else if (ext === '.tcx') {
parsed = await parseTcx(absPath);
} else {
throw new Error(`Formato attività non supportato: ${ext}`);
}
// ---------------------------------------------------------
// Normalizzazione campi base
// ---------------------------------------------------------
const fileName = path.basename(absPath);
const fileExtension = ext.replace('.', '');
return {
file_name: fileName,
file_extension: fileExtension,
format: parsed.format || fileExtension.toUpperCase(),
display_name: parsed.display_name || fileName,
route_name: parsed.route_name || null,
title: parsed.title || null,
description: parsed.description || null,
notes: parsed.notes || null,
sport: parsed.sport || null,
activity_type: parsed.activity_type || null,
device_manufacturer: parsed.device_manufacturer || null,
device_model: parsed.device_model || null,
source_app: parsed.source_app || null,
start_time_millis: parsed.start_time_millis ?? null,
end_time_millis: parsed.end_time_millis ?? null,
duration_millis: parsed.duration_millis ?? null,
distance_meters: parsed.distance_meters ?? null,
elevation_gain_meters: parsed.elevation_gain_meters ?? null,
elevation_loss_meters: parsed.elevation_loss_meters ?? null,
min_elevation_meters: parsed.min_elevation_meters ?? null,
max_elevation_meters: parsed.max_elevation_meters ?? null,
file_distance_meters: parsed.file_distance_meters ?? null,
file_elevation_gain_meters: parsed.file_elevation_gain_meters ?? null,
computed_distance_meters: parsed.computed_distance_meters ?? null,
computed_elevation_gain_meters: parsed.computed_elevation_gain_meters ?? null,
average_speed_mps: parsed.average_speed_mps ?? null,
max_speed_mps: parsed.max_speed_mps ?? null,
average_pace_sec_per_km: parsed.average_pace_sec_per_km ?? null,
average_heart_rate: parsed.average_heart_rate ?? null,
max_heart_rate: parsed.max_heart_rate ?? null,
average_cadence: parsed.average_cadence ?? null,
max_cadence: parsed.max_cadence ?? null,
calories: parsed.calories ?? null,
power_avg: parsed.power_avg ?? null,
power_max: parsed.power_max ?? null,
point_count: parsed.point_count ?? 0,
segment_count: parsed.segment_count ?? 0,
lap_count: parsed.lap_count ?? 0,
min_latitude: parsed.min_latitude ?? null,
max_latitude: parsed.max_latitude ?? null,
min_longitude: parsed.min_longitude ?? null,
max_longitude: parsed.max_longitude ?? null,
center_latitude: parsed.center_latitude ?? null,
center_longitude: parsed.center_longitude ?? null,
tags: parsed.tags || [],
// IMPORTANTISSIMO: preview percorso per thumb gallery
track_preview: parsed.track_preview || [],
diagnostics: parsed.diagnostics || null,
};
}
module.exports = parseActivityFile;