@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
JavaScript
;
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;