Det finns ett plugin till pyTrainer som gör att man kan publicera resultatet av sina ansträningar (nåja, en del iaf) i sin blogg. Dock var det lite si å så med vissa detaljer så det funkade inte alls. Efter lite fulhackande i Python verkar det dock funka nu (se föregående inlägg). Kanske detta är den motivation som krävs för att jag ska börja använda min Forerunner mer frekvent?
Tillägg lördagen den 20:e september
För den som försöker få ordning på wordpress-tillägget till pyTrainer kanske det kan vara värdefullt med några tips. För den som är totalt ointresserad av just pyTrainer kanske förklaringen nedan kan tjänstgöra som beskrivning i hur det kan fungera när man handskas med strulande mjukvara.
Jag kör pyTrainer 1.5.0.0.1 och efter att jag aktiverat och konfigurerat “Pytrainer wordpress extension” blev mina försök fruktlösa. Det första jag gör i såna lägen är förstås att se vad som skrivs ut i terminalen. Kanske kan eventuella felmeddelanden ge en hint om vad som går snett?
Detta är vad som spottades ut:
File "gpx.py", line 39, in __init__
File "gpx.py", line 75, in _getValues
File "/usr/lib/python2.5/xml/dom/minidom.py", line 1915, in parse
return expatbuilder.parse(file)
File "/usr/lib/python2.5/xml/dom/expatbuilder.py", line 924, in parse
result = builder.parseFile(fp)
File "/usr/lib/python2.5/xml/dom/expatbuilder.py", line 207, in parseFile
parser.Parse(buffer, 0)
xml.parsers.expat.ExpatError: unbound prefix: line 14, column 12
Detta sa mig inte mer än att vi verkar ha problem med en XML-struktur som ska parsas (tolkas). Som synes finns information om vilka klasser, metoder och radnummer som är problematiska och efter lite rotande i gpx.py i (/usr/lib/python2.5/site-packages/pytrainer/lib/) var det tydligt att xml-filen producerades av gpsbabel, sparades som /tmp/gpx.txt och försöktes tolkas av minidom.
Efter att ha spanat i xml-filen (som inte togs bort utan låg kvar i tmp-katalogen) gick det även att förstå vad minidom hade problem med. På rad 14, som det stod i stacktracen ovan, refereras till ett prefix “gpxdata” som är okänt för minidom.
Det borde gå att ändra den mall som gpsbabel använder som utformat men efter att ha rotat lite la jag ner den möjligeten och bestämde mig för en pragmatisk lösning, att helt enkelt justera filen, och lägga till namnrymden gpxdata, innan vi matar minidom med den.
Metoden _getValues, runt rad 74 i gpx.py börjar numera enligt nedan (observera radnumren längst till vänster och att de för Python så viktiga “indragen” har förvanskats ):
74 def _getValues(self):
75 if not os.path.isfile(self.filename):
76 return None
77
78 # Test if file already contains gpxdata attribute
79 found = False
80 for line in fileinput.FileInput(self.filename,inplace=1):
81 if "xmlns:gpxdata" in line:
82 found = True
83 print line.rstrip('n');
84
85 # If file don't has gpxdata attribute: add namespace
86 if not found:
87 for line in fileinput.FileInput(self.filename,inplace=1):
88 if "xmlns:xsi" in line:
89 line=line.replace('xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"','xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gpxdata="http://www.cluetrust.com/XML/GPXDATA/1/0"')
90 print line.rstrip('n');
91
92 dom = xml.dom.minidom.parse(self.filename)
93 content = dom.toxml()
Den som är van att läsa kod (och Python-kod i synnerhet) ser att vi ersätter innehållet på en viss rad i filen identifierad av “self.filename” (dvs medlemsvariabeln filename på aktuellt objekt).
Sådärja, då var minidom nöjd och kunde hacka i sig innehållet. Nästa steg var att wordpress inte accepterade att filer av filtypen gpx och kml laddades upp. Detta löstes genom att installera ett plugin i wordpress som gör att man kan lägga till fler filtyper.
Sista steget var att ersätta de spanska termerna som användes i mallen som skapade blogginläggen samt ändra så att inläggen publicerades direkt istället för att läggas upp som utkast. Jag ändrade även så att medelpuls visas istället för kalorier. Detta kan hårdkodas i /usr/share/pytrainer/extensions/wordpress/main.py
Tyvärr är webbplatsen för pyTrainer nere vilket gör det lite problematiskt att se om följande defekter är välkända och eventuellt till och med redan fixade i en nyare version. Faran med den här typen av fulhack är förstås att ändringarna löper stor risk att bli överskrivna när en ny version installeras (vilket iofs inte kommer att ske automatiskt eftersom pyTrainer inte finns i några av de repositories jag använder).