log-location 2.3 KB

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