#!/data/data/com.termux/files/usr/bin/python3 import datetime as dt import json import os import pytz import subprocess import sys import yaml def to_iso6801_basic(dt): return dt.isoformat().replace(':', '').replace('-', '') \ .replace('+0000', 'Z') class Position: def __init__(self, timestamp, latitude, longitude, altitude): self.timestamp = timestamp self.latitude = latitude self.longitude = longitude self.altitude = altitude @classmethod def from_termux_location(cls, provider='network'): loc_json = subprocess.check_output(['termux-location', '-p', provider]) \ .decode(sys.stdout.encoding) req_ts = dt.datetime.now(pytz.utc) loc_attr = yaml.load(loc_json) if not loc_attr: return None else: print(loc_attr) return cls( timestamp=req_ts - dt.timedelta(milliseconds=loc_attr['elapsedMs']), latitude=loc_attr['latitude'], longitude=loc_attr['longitude'], altitude=loc_attr['altitude'], ) def symlink(src, dst, force=False): if force and os.path.lexists(dst): os.unlink(dst) os.symlink(src=src, dst=dst) def compute(target_dir_path): cur = Position.from_termux_location() target_name = '{}.yml'.format(to_iso6801_basic(cur.timestamp)) with open(os.path.join(target_dir_path, target_name), 'w') as f: f.write(yaml.dump( { 'lat': cur.latitude, 'lon': cur.longitude, 'alt': cur.altitude, }, default_flow_style=False, )) symlink( src=target_name, dst=os.path.join(target_dir_path, 'last.yml'), force=True, ) def _init_argparser(): import argparse argparser = argparse.ArgumentParser(description=None) argparser.add_argument( '--target-dir', metavar='PATH', dest='target_dir_path', default='.', ) return argparser def main(argv): argparser = _init_argparser() try: import argcomplete argcomplete.autocomplete(argparser) except ImportError: pass args = argparser.parse_args(argv) compute(**vars(args)) return 0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))