@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
92 lines (91 loc) • 4.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventImporterGPX = void 0;
var activity_1 = require("../../../../activities/activity");
var creator_1 = require("../../../../creators/creator");
var event_1 = require("../../../event");
var activity_types_1 = require("../../../../activities/activity.types");
var importer_gpx_mapper_1 = require("./importer.gpx.mapper");
var helpers_1 = require("../../../utilities/helpers");
var event_utilities_1 = require("../../../utilities/event.utilities");
var gx_parser_1 = require("./gx-parser");
var EventImporterGPX = /** @class */ (function () {
function EventImporterGPX() {
}
EventImporterGPX.getFromString = function (gpx, domParser, name) {
if (name === void 0) { name = 'New Event'; }
return new Promise(function (resolve, reject) {
// debugger
var parsedGPX = new gx_parser_1.GXParser(gpx, domParser);
var track = parsedGPX.trk || parsedGPX.rte;
var activities = track.reduce(function (activities, trackOrRoute) {
var _a;
// Get the samples
var samples = [];
var isActivity = false;
if (trackOrRoute.trkseg) {
samples = trackOrRoute.trkseg.reduce(function (trkptArray, trkseg) {
if (!trkseg.trkpt) {
return trkptArray;
}
return trkptArray.concat(trkseg.trkpt);
}, []);
// Determine if it's a route. The samples will most probably be missing the time
isActivity = !!samples[0].time;
}
else if (trackOrRoute.rtept) {
samples = trackOrRoute.rtept;
}
// Sort the points if its only an activity
if (isActivity) {
samples.sort(function (sampleA, sampleB) {
return +new Date(sampleA.time[0]) - +new Date(sampleB.time[0]);
});
}
// debugger;
// Create an activity. Set the dates depending on route etc
var startDate = new Date(isActivity ? samples[0].time[0] : new Date());
// @todo for routes add a seperate parser
var endDate = isActivity
? new Date(samples[samples.length - 1].time[0])
: new Date(startDate.getTime() + samples.length * 1000);
var activityType = isActivity ? activity_types_1.ActivityTypes.unknown : activity_types_1.ActivityTypes.route;
if (trackOrRoute.type && activity_types_1.ActivityTypes[trackOrRoute.type]) {
activityType = activity_types_1.ActivityTypes[trackOrRoute.type];
}
else if (trackOrRoute.type && trackOrRoute.type[0] && parsedGPX.creator.match(/StravaGPX/gi) !== null) {
var stravaGpxTypeId = parseInt(trackOrRoute.type[0], 10);
var typeFound = activity_types_1.StravaGPXTypes.map.get(stravaGpxTypeId);
if (typeFound) {
activityType = typeFound;
}
}
var activityName = ((_a = trackOrRoute.name) === null || _a === void 0 ? void 0 : _a[0]) || '';
var activity = new activity_1.Activity(startDate, endDate, activityType, new creator_1.Creator(parsedGPX.creator, parsedGPX.version), activityName);
// Match
importer_gpx_mapper_1.GPXSampleMapper.forEach(function (sampleMapping) {
var subjectSamples = (samples.filter(function (sample) { return helpers_1.isNumberOrString(sampleMapping.getSampleValue(sample)); }));
if (subjectSamples.length) {
activity.addStream(activity.createStream(sampleMapping.dataType));
subjectSamples.forEach(function (subjectSample, index) {
activity.addDataToStream(sampleMapping.dataType, isActivity ? new Date(subjectSample.time[0]) : new Date(activity.startDate.getTime() + index * 1000), sampleMapping.getSampleValue(subjectSample));
});
}
});
// debugger;
activities.push(activity);
return activities;
}, []);
var event = new event_1.Event(name, activities[0].startDate, activities[activities.length - 1].endDate);
activities.forEach(function (activity) {
event.addActivity(activity);
});
// debugger;
// generate global stats
event_utilities_1.EventUtilities.generateStatsForAll(event);
resolve(event);
});
};
return EventImporterGPX;
}());
exports.EventImporterGPX = EventImporterGPX;