UNPKG

@sports-alliance/sports-lib

Version:

A Library to for importing / exporting and processing GPX, TCX, FIT and JSON files from services such as Strava, Movescount, Garmin, Polar etc

113 lines (112 loc) 6.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.EventImporterGPX = void 0; const activity_1 = require("../../../../activities/activity"); const creator_1 = require("../../../../creators/creator"); const event_1 = require("../../../event"); const activity_types_1 = require("../../../../activities/activity.types"); const importer_gpx_mapper_1 = require("./importer.gpx.mapper"); const helpers_1 = require("../../../utilities/helpers"); const event_utilities_1 = require("../../../utilities/event.utilities"); const gx_parser_1 = require("./gx-parser"); const data_duration_1 = require("../../../../data/data.duration"); const data_elapsed_time_1 = require("../../../../data/data.elapsed-time"); const data_timer_time_1 = require("../../../../data/data.timer-time"); const file_type_enum_1 = require("../../file-type.enum"); const activity_parsing_options_1 = require("../../../../activities/activity-parsing-options"); const empty_event_sports_libs_error_1 = require("../../../../errors/empty-event-sports-libs.error"); const parsing_event_lib_error_1 = require("../../../../errors/parsing-event-lib.error"); const stream_selection_1 = require("../../../../streams/stream.selection"); class EventImporterGPX { static getFromString(gpx, domParser, options = activity_parsing_options_1.ActivityParsingOptions.DEFAULT, name = 'New Event') { return new Promise((resolve, reject) => { var _a; const streamSelection = (0, stream_selection_1.getStreamSelectionFromOptions)(options); // debugger const parsedGPX = new gx_parser_1.GXParser(gpx, domParser); const tracks = parsedGPX.trk || []; if (!(tracks === null || tracks === void 0 ? void 0 : tracks.length)) { if ((_a = parsedGPX.rte) === null || _a === void 0 ? void 0 : _a.length) { reject(new parsing_event_lib_error_1.ParsingEventLibError('No activities found in GPX; use importRoutesFromGPX for routes')); return; } reject(new empty_event_sports_libs_error_1.EmptyEventLibError()); return; } const activities = tracks.reduce((activities, track) => { var _a; // Get the samples let samples = []; if (track.trkseg) { samples = track.trkseg.reduce((trkptArray, trkseg) => { if (!trkseg.trkpt) { return trkptArray; } return trkptArray.concat(trkseg.trkpt); }, []); } // Filter samples having time data only for upcoming sort samples = samples.filter(sample => { return !!sample.time; }); if (!samples.length) { return activities; } // Sort samples samples.sort((sampleA, sampleB) => { return +new Date(sampleA.time[0]) - +new Date(sampleB.time[0]); }); const startDate = new Date(samples[0].time[0]); const endDate = new Date(samples[samples.length - 1].time[0]); const rawActivityType = Array.isArray(track.type) ? track.type[0] : track.type; let activityType = activity_types_1.ActivityTypesHelper.resolveActivityType(rawActivityType) || activity_types_1.ActivityTypes.unknown; if (rawActivityType && parsedGPX.creator && parsedGPX.creator.match(/StravaGPX/gi) !== null) { const stravaGpxTypeId = parseInt(rawActivityType, 10); const typeFound = activity_types_1.StravaGPXTypes.map.get(stravaGpxTypeId); if (typeFound) { activityType = typeFound; } } const activityName = ((_a = track.name) === null || _a === void 0 ? void 0 : _a[0]) || ''; const activity = new activity_1.Activity(startDate, endDate, activityType, new creator_1.Creator(parsedGPX.creator, undefined, parsedGPX.version), options, activityName); // Setup sample info which could be use when getting sample values const hasPowerMeter = samples.findIndex(sample => { var _a; return (_a = sample.extensions) === null || _a === void 0 ? void 0 : _a.find((ext) => { var _a; return (_a = ext.power) === null || _a === void 0 ? void 0 : _a.length; }); }) !== -1; const samplesInfo = { hasPowerMeter: hasPowerMeter }; // Match importer_gpx_mapper_1.GPXSampleMapper.filter(sampleMapping => (0, stream_selection_1.isStreamTypeAllowedForImport)(sampleMapping.dataType, streamSelection)).forEach(sampleMapping => { const subjectSamples = (samples.filter((sample) => (0, helpers_1.isNumberOrString)(sampleMapping.getSampleValue(sample, samplesInfo)))); if (subjectSamples.length) { activity.addStream(activity.createStream(sampleMapping.dataType)); subjectSamples.forEach(subjectSample => { activity.addDataToStream(sampleMapping.dataType, new Date(subjectSample.time[0]), sampleMapping.getSampleValue(subjectSample, samplesInfo)); }); } }); // Compute moving time, timer time and elapsed time const elapsedTime = (activity.endDate.getTime() - activity.startDate.getTime()) / 1000; const timerTime = elapsedTime; // Apply stats activity.addStat(new data_elapsed_time_1.DataElapsedTime(elapsedTime)); activity.addStat(new data_duration_1.DataDuration(timerTime)); activity.addStat(new data_timer_time_1.DataTimerTime(timerTime)); activities.push(activity); return activities; }, []); if (!activities.length) { reject(new parsing_event_lib_error_1.ParsingEventLibError('No activities found in GPX; use importRoutesFromGPX for routes')); return; } const event = new event_1.Event(name, activities[0].startDate, activities[activities.length - 1].endDate, file_type_enum_1.FileType.GPX); activities.forEach(activity => { event.addActivity(activity); }); // generate global stats event_utilities_1.EventUtilities.generateStatsForAll(event); event.getActivities().forEach(activity => { (0, stream_selection_1.pruneActivityStreamsBySelection)(activity, streamSelection); }); resolve(event); }); } } exports.EventImporterGPX = EventImporterGPX;