1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #!/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')
- def symlink(src, dst, force=False):
- if force and os.path.lexists(dst):
- os.unlink(dst)
- os.symlink(src=src, dst=dst)
- 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:
- return cls(
- timestamp=req_ts -
- dt.timedelta(milliseconds=loc_attr['elapsedMs']),
- latitude=loc_attr['latitude'],
- longitude=loc_attr['longitude'],
- altitude=loc_attr['altitude'],
- )
- def save_yaml(self, target_dir_path):
- path = os.path.join(
- target_dir_path,
- '{}.yml'.format(to_iso6801_basic(self.timestamp)),
- )
- attr = {
- 'lat': self.latitude,
- 'lon': self.longitude,
- 'alt': self.altitude,
- }
- with open(path, 'w') as f:
- f.write(yaml.dump(attr, default_flow_style=False))
- return path
- def compute(target_dir_path):
- cur = Position.from_termux_location()
- if cur:
- cur_path = cur.save_yaml(target_dir_path)
- symlink(
- src=os.path.relpath(cur_path, start=target_dir_path),
- 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:]))
|