-
-
Save chappy84/8d23f9c3235796dec46ea0749c15d83f to your computer and use it in GitHub Desktop.
#!/usr/bin/env php | |
<?php | |
function dateInFormat($timestamp) | |
{ | |
return date('Y-m-d\TH:i:s\Z', $timestamp); | |
} | |
function latLongInFormat($reference) | |
{ | |
return round((float) $reference, 6); | |
} | |
if ($argc <= 1) { | |
die("Please provide a file\n"); | |
} | |
$filename = $argv[1]; | |
if (!preg_match('/\.stravactivity$/', $filename)) { | |
die("Please provide a stravactivity file\n"); | |
} | |
$filePath = realpath($filename); | |
if (empty($filePath)) { | |
die('Couldn\'t find file: ' . $filename . "\n"); | |
} | |
if (false === ($fh = @fopen($filePath, 'r'))) { | |
die('Couldn\'t open ' . $filePath . " , Please check the file permissions\n"); | |
} | |
date_default_timezone_set('UTC'); | |
$start = null; | |
$points = array(); | |
while (false !== ($line = fgets($fh))) { | |
if (0 === strpos($line, 'wp: ') | |
&& preg_match_all('/(?P<name>[a-z]+)\:(?P<value>[0-9.-]+)(;\s+)??/', $line, $matches) | |
) { | |
$point = []; | |
foreach ($matches['name'] as $key => $name) { | |
$point[$name] = $matches['value'][$key]; | |
} | |
if ($start === null && !empty($point['t'])) { | |
$start = $point['t']; | |
} | |
$points[] = $point; | |
} | |
} | |
if (empty($points)) { | |
die("No points found\n"); | |
} | |
echo <<<'NOWDOC' | |
<?xml version="1.0" encoding="UTF-8"?> | |
<gpx creator="GenericScript" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"> | |
<metadata> | |
<time> | |
NOWDOC; | |
echo dateInFormat($start); | |
echo <<<'NOWDOC' | |
</time> | |
</metadata> | |
<trk> | |
<name>Generated GPX</name> | |
<trkseg> | |
NOWDOC; | |
foreach ($points as $point) { | |
echo ' <trkpt lat="', latLongInFormat($point['lat']), '" lon="', latLongInFormat($point['long']), '"> | |
<ele>', round((float) $point['alt'], 1), '</ele> | |
<time>', dateInFormat($point['t']), '</time> | |
</trkpt> | |
'; | |
} | |
echo <<<'NOWDOC' | |
</trkseg> | |
</trk> | |
</gpx> | |
NOWDOC; | |
echo "\n"; |
@chappy84 I ran the "cat" command and it printed the file content, and I also ran the chmod to change the permission on the stravactivity file, but it the conversion still gives the same error message.
here's the permissions for the file -rw-rw-rw-@ 1 me staff 2984774 7 Apr 12:13 /Users/me/Desktop/test/test.stravactivity
Could it be because the stravactivity file is corrupt? Or the conversion doesn't even go into that?
@killmosquito Apologies, the issue is because the script is expecting a relative path for the .stravactivity
file, not an absolute path as you've provided. This is my documentation's fault and something I forgot about when writing my comment on the 5th Feb. The realpath
function returns an empty string when it can't find a file in the provided path, and it's combining to the directory the script is in, and /Users/me/Desktop/test/test.stravactivity
, which won't exist as a file, and thus fopen
can't open an empty path as a string, which is the error you're getting. It was a quick and dirty script and thus I knew it may have bugs, this being one. Easiest quick fix your side is to move the .stravactivity
file to the same dir as the convert_stravactivity_to_gpx
then run ./convert_stravactivity_to_gpx test.stravactivity > activity.gpx
. This that should produce a file you can upload. I've sorted the code to deal with this situation long term.
As a side, I am surprised it's letting you run it, as the execute flag isn't set for anyone, thus ./convert_stravactivity_to_gpx
should in theory return a Permission denied
message, and not get as far as reading the fopen
in the php code. You can add execution permissions with a chmod u+x convert_stravactivity_to_gpx
(this will give just the me
user permissions to execute this file as a script, which should be the user it's running the script as, provided that's who you're logged in as)
Thank you @chappy84, moving all three files in the same location worked, and I now I have a working gpx file!
I remember one of the first attempt to convert was with all three files in the same folder, but I wasn't aware of the permission requirement yet.
Ironically, as I was about to upload the gpx, the Strava team has uploaded my performance from their side, so now I can't upload my gpx as it would be a double...
But this converter is a very handy tool to have anyway and you were of great support, I'm sure it will help others!
Thanks again
Anyone coming to this, it's worth noting that the Strava App now records in Garmin's .fit format, thus once you've retrieved that from the phone, you can directly upload that to the Strava site without modification. This script is thus redundant for recent activities.
Hi @chappy84 , I used an older phone and app to record an activity (so not with .fit format). However, Strava failed to upload/sync the activity. I recovered the .stravactivity file and have been trying for ways to fix it on my Mac running Big Sur.
In my latest attempt, I've copied the file in my downloads folder and named it activity.stravactivity
Trying to convert to .gpx for upload on strava website, I then adapted what you've mentioned earlier from:
cd /path/to/download/location/
chmod u+x convert_stravactivity_to_gpx
./convert_stravactivity_to_gpx /path/to/activity.stravactivity > /path/to/activity.gpx
to the following:
cd /Users/gilliam/Downloads/
chmod u+x convert_stravactivity_to_gpx
./convert_stravactivity_to_gpx /Users/gilliam/Downloads/activity.stravactivity > /Users/gilliam/Downloads/activity.gpx
When running this in Terminal, Terminal responds with:
chmod: convert_stravactivity_to_gpx: No such file or directory
zsh: no such file or directory: ./convert_stravactivity_to_gpx
In addition, a new file appears in my downloads folder named activity.gpx, however, the file is empty with zero byte size. (Whilst the original .stravactivity is 704KB).
The response of Terminal is odd to me as when I run the following, Terminal presents the file the same way as what's shown when opening the file in TextEdit.
cat /Users/williamdebry/Downloads/activity.stravactivity
Could it be that MacOS Big Sur is no longer compatible using such instructions or something? I have no IT background whatsoever, so any additional help would be great!
@Williamdb5 it's not an issue with Big Sur thankfully.
It can't find a file in your Downloads folder called convert_stravactivity_to_gpx
, which means you've either not downloaded the above script, or not downloaded it to your Downloads
folder
try this:
cd /Users/gilliam/Downloads/
curl -O https://gist.github.com/chappy84/8d23f9c3235796dec46ea0749c15d83f/raw/00ae732180ee70d9b0d0e9b18e1324329f59ae64/convert_stravactivity_to_gpx
chmod u+x convert_stravactivity_to_gpx
./convert_stravactivity_to_gpx /Users/gilliam/Downloads/activity.stravactivity > /Users/gilliam/Downloads/activity.gpx
The URL with the curl
command is the what you get from the "Raw" link at the top of the page, and is from the last edit I made before today
That curl -O
command will download the URL to your downloads folder (as long as you run it after the cd command) in a file called convert_stravactivity_to_gpx
Hopefully that helps
@killmosquito Well you're not using docker with the command you're running, so I suspect it's either the file path being incorrect, or permissions on the file
If you can run
cat /Users/me/Desktop/test/test.stravactivity
and not get a response something along the lines of:cat: /Users/me/Desktop/test/test.stravactivity: No such file or directory
, then the file path definitely exists. At this point I'd simply recommend runningchmod +r /Users/me/Desktop/test/test.stravactivity
to add read permissions for all users on the computer to the file, then try running it again.If it's still failing after that, could you post the output of
ls -la /Users/me/Desktop/test/test.stravactivity
so I can see the permissions on the file?As the file will have been transferred from your phone, rather than downloaded from the internet, I don't suspect MacOS is blocking access to it.