log-location 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #!/data/data/com.termux/files/usr/bin/python3
  2. import datetime as dt
  3. import json
  4. import os
  5. import pytz
  6. import subprocess
  7. import sys
  8. import yaml
  9. def to_iso6801_basic(dt):
  10. return dt.isoformat().replace(':', '').replace('-', '') \
  11. .replace('+0000', 'Z')
  12. def symlink(src, dst, force=False):
  13. if force and os.path.lexists(dst):
  14. os.unlink(dst)
  15. os.symlink(src=src, dst=dst)
  16. class Position:
  17. def __init__(self, timestamp, latitude, longitude, altitude):
  18. self.timestamp = timestamp
  19. self.latitude = latitude
  20. self.longitude = longitude
  21. self.altitude = altitude
  22. @classmethod
  23. def from_termux_location(cls, provider='network'):
  24. loc_json = subprocess.check_output(['termux-location', '-p', provider]) \
  25. .decode(sys.stdout.encoding)
  26. req_ts = dt.datetime.now(pytz.utc)
  27. loc_attr = yaml.load(loc_json)
  28. if not loc_attr:
  29. return None
  30. else:
  31. return cls(
  32. timestamp=req_ts -
  33. dt.timedelta(milliseconds=loc_attr['elapsedMs']),
  34. latitude=loc_attr['latitude'],
  35. longitude=loc_attr['longitude'],
  36. altitude=loc_attr['altitude'],
  37. )
  38. def save_yaml(self, target_dir_path):
  39. path = os.path.join(
  40. target_dir_path,
  41. '{}.yml'.format(to_iso6801_basic(self.timestamp)),
  42. )
  43. attr = {
  44. 'lat': self.latitude,
  45. 'lon': self.longitude,
  46. 'alt': self.altitude,
  47. }
  48. with open(path, 'w') as f:
  49. f.write(yaml.dump(attr, default_flow_style=False))
  50. return path
  51. def compute(target_dir_path):
  52. cur = Position.from_termux_location()
  53. if cur:
  54. cur_path = cur.save_yaml(target_dir_path)
  55. symlink(
  56. src=os.path.relpath(cur_path, start=target_dir_path),
  57. dst=os.path.join(target_dir_path, 'last.yml'),
  58. force=True,
  59. )
  60. def _init_argparser():
  61. import argparse
  62. argparser = argparse.ArgumentParser(description=None)
  63. argparser.add_argument(
  64. '--target-dir',
  65. metavar='PATH',
  66. dest='target_dir_path',
  67. default='.',
  68. )
  69. return argparser
  70. def main(argv):
  71. argparser = _init_argparser()
  72. try:
  73. import argcomplete
  74. argcomplete.autocomplete(argparser)
  75. except ImportError:
  76. pass
  77. args = argparser.parse_args(argv)
  78. compute(**vars(args))
  79. return 0
  80. if __name__ == "__main__":
  81. sys.exit(main(sys.argv[1:]))