100 lines
3.5 KiB
JavaScript
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;
|