commit 4c153aad29aab7f3e1f9dc6ffdffbcfb0ee5e40c
parent acc50f8b4e23c1e6370d31100d3b0e6b1fef2f53
Author: myadzel <myadzel@gmail.com>
Date: Mon, 29 Apr 2019 12:11:34 +0300
parsing tracks from sports tracker #241
Diffstat:
3 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/src/lib/leaflet.control.track-list/lib/services/index.js b/src/lib/leaflet.control.track-list/lib/services/index.js
@@ -9,6 +9,7 @@ import Tracedetrail from './tracedetrail';
import {YandexRuler} from './yandex';
import {NakarteTrack, NakarteUrl} from './nakarte';
import {MovescountMove, MovescountRoute} from './movescount';
+import {SportsTrackerActivity} from './sportstracker';
export default [
YandexRuler,
@@ -23,5 +24,6 @@ export default [
Tracedetrail,
MovescountMove,
MovescountRoute,
+ SportsTrackerActivity,
SimpleService
]
\ No newline at end of file
diff --git a/src/lib/leaflet.control.track-list/lib/services/sportstracker.js b/src/lib/leaflet.control.track-list/lib/services/sportstracker.js
@@ -0,0 +1,67 @@
+import BaseService from './baseService';
+import urlViaCorsProxy from 'lib/CORSProxy';
+import utf8 from 'utf8';
+
+class SportsTrackerBase extends BaseService {
+ isOurUrl() {
+ return this.urlRe.test(this.origUrl);
+ }
+}
+
+class SportsTrackerActivity extends SportsTrackerBase {
+ urlRe = /^https?:\/\/(www.)?sports-tracker.com\/workout\/([^/]+)\/([a-z0-9]+)/;
+
+ requestOptions() {
+ const m = this.urlRe.exec(this.origUrl);
+ const activityId = m[3];
+ return [
+ {
+ url: urlViaCorsProxy(`https://www.sports-tracker.com/apiserver/v1/workouts/${activityId}/data?samples=100000`),
+ options: {
+ responseType: 'binarystring',
+ isResponseSuccess: (xhr) => xhr.status === 200 || xhr.status === 403
+ }
+ },
+ {
+ url: urlViaCorsProxy(`https://www.sports-tracker.com/apiserver/v1/workouts/${activityId}/combined`),
+ options: {
+ responseType: 'binarystring',
+ isResponseSuccess: (xhr) => xhr.status === 200 || xhr.status === 403
+ }
+ }
+ ]
+ }
+
+ parseResponse(responses) {
+ const [dataResponse, metadataResponse] = responses;
+ if (dataResponse.status === 403) {
+ return [{error: 'Sports Tracker user disabled viewing this activity'}];
+ }
+ let data, metadata;
+ let name = `Sports Tracker activity`;
+ try {
+ data = JSON.parse(utf8.decode(dataResponse.responseBinaryText));
+ metadata = JSON.parse(utf8.decode(metadataResponse.responseBinaryText));
+ } catch (e) {
+ return [{name, error: 'UNSUPPORTED'}];
+ }
+ const track = data.payload.locations.map(location => ({
+ lat: location.la,
+ lng: location.ln
+ })
+ );
+ if (data.payload.description) {
+ name = data.payload.description;
+ } else {
+ const startTime = new Date(metadata.payload.startTime).toDateString();
+ name = `${metadata.payload.fullname} on ${startTime}`;
+ }
+
+ return [{
+ name,
+ tracks: [track]
+ }];
+ }
+}
+
+export {SportsTrackerActivity};
+\ No newline at end of file
diff --git a/src/lib/leaflet.control.track-list/track-list.js b/src/lib/leaflet.control.track-list/track-list.js
@@ -74,7 +74,7 @@ L.Control.TrackList = L.Control.extend({
<div class="leaflet-control-content">
<div class="header">
<div class="hint"
- title="gpx kml Ozi zip YandexMaps GPSies Strava GPSLib Endomondo Etomesto Movescount OSM Tracedetrail">
+ title="gpx kml Ozi zip YandexMaps GPSies Strava GPSLib Endomondo Etomesto Movescount SportsTracker OSM Tracedetrail">
gpx kml Ozi zip YandexMaps GPSies Strava
<span class="formats-hint-more">…</span>
</div>