def track_to_tcx(track, pretty=False): ns = tcx_ns root = xml.Element(ns('TrainingCenterDatabase')) root.set(xsi_ns('schemaLocation'), ' '.join([ _TCX_NS, _TCX_NS_XSD, _ACT_EXT_NS, _ACT_EXT_NS_XSD])) xml.register_namespace('', _TCX_NS) xml.register_namespace('_ns3', _ACT_EXT_NS) activities = xml.SubElement(root, ns('Activities')) activity = xml.SubElement(activities, ns('Activity')) activity.set(ns('Sport'), 'Biking') xml.SubElement(activity, ns('Id')).text = \ format_timestamp(track.timestamp) create_laps(track, activity, ns) if pretty: indent_element_tree(root, ws=' ') out = xml.tostring(root) # ElementTree doesn't let me set prefix ns3 and a lot of software # seems to be hardcoded to use ns3 so have to use this little hack. out = out.replace('_ns3:', 'ns3:').replace('xmlns:_ns3', 'xmlns:ns3') return "<?xml version='1.0' encoding='utf-8'?>\n" + out
def create_fake_creator_element(parent, ns=tcx_ns): """Add fake creator to make strava.com trust the elevation data""" creator = xml.SubElement(parent, ns('Creator')) creator.set(xsi_ns('type'), 'Device_t') xml.SubElement(creator, ns('Name')).text = 'Garmin Edge 800' xml.SubElement(creator, ns('UnitId')).text = '9999999' xml.SubElement(creator, ns('ProductID')).text = '1169' version = xml.SubElement(creator, ns('Version')) xml.SubElement(version, ns('VersionMajor')).text = '0' xml.SubElement(version, ns('VersionMinor')).text = '0' xml.SubElement(version, ns('BuildMajor')).text = '0' xml.SubElement(version, ns('BuildMinor')).text = '0'
def create_author_element(parent, ns=tcx_ns): author = xml.SubElement(parent, ns('Author')) author.set(xsi_ns('type'), 'Application_t') xml.SubElement(author, ns('Name')).text = 'Bryton GPS Linux' build = xml.SubElement(author, ns('Build')) version = xml.SubElement(build, ns('Version')) xml.SubElement(version, ns('VersionMajor')).text = '0' xml.SubElement(version, ns('VersionMinor')).text = '1' xml.SubElement(version, ns('BuildMajor')).text = '0' xml.SubElement(version, ns('BuildMinor')).text = '0' xml.SubElement(author, ns('LangID')).text = 'en' xml.SubElement(author, ns('PartNumber')).text = '000-D123-00'
def track_to_tcx(track, pretty=False, fake_garmin_device=False, no_laps=False): ns = tcx_ns root = xml.Element(ns('TrainingCenterDatabase')) root.set(xsi_ns('schemaLocation'), ' '.join([_TCX_NS, _TCX_NS_XSD, _ACT_EXT_NS, _ACT_EXT_NS_XSD])) xml.register_namespace('', _TCX_NS) xml.register_namespace('_ns3', _ACT_EXT_NS) activities = xml.SubElement(root, ns('Activities')) activity = xml.SubElement(activities, ns('Activity')) activity.set(ns('Sport'), 'Biking') xml.SubElement(activity, ns('Id')).text = \ format_timestamp(track.timestamp) create_laps(track, no_laps, activity, ns) if fake_garmin_device: create_fake_creator_element(activity, ns) create_author_element(root, ns) if pretty: indent_element_tree(root, ws=' ') out = xml.tostring(root) # ElementTree doesn't let me set prefix ns3 and a lot of software # seems to be hardcoded to use ns3 so have to use this little hack. out = out.replace('_ns3:', 'ns3:').replace('xmlns:_ns3', 'xmlns:ns3') return "<?xml version='1.0' encoding='utf-8'?>\n" + out