mapillary-tools 0.14.4__tar.gz → 0.14.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/PKG-INFO +1 -1
  2. mapillary_tools-0.14.5/mapillary_tools/__init__.py +1 -0
  3. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exif_write.py +61 -29
  4. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/utils.py +1 -0
  5. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/PKG-INFO +1 -1
  6. mapillary_tools-0.14.4/mapillary_tools/__init__.py +0 -1
  7. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/LICENSE +0 -0
  8. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/README.md +0 -0
  9. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/api_v4.py +0 -0
  10. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/authenticate.py +0 -0
  11. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/blackvue_parser.py +0 -0
  12. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/camm/camm_builder.py +0 -0
  13. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/camm/camm_parser.py +0 -0
  14. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/__init__.py +0 -0
  15. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/__main__.py +0 -0
  16. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/authenticate.py +0 -0
  17. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/process.py +0 -0
  18. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/process_and_upload.py +0 -0
  19. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/sample_video.py +0 -0
  20. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/upload.py +0 -0
  21. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/video_process.py +0 -0
  22. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/video_process_and_upload.py +0 -0
  23. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/commands/zip.py +0 -0
  24. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/config.py +0 -0
  25. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/constants.py +0 -0
  26. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exceptions.py +0 -0
  27. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exif_read.py +0 -0
  28. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exiftool_read.py +0 -0
  29. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exiftool_read_video.py +0 -0
  30. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/exiftool_runner.py +0 -0
  31. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/ffmpeg.py +0 -0
  32. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geo.py +0 -0
  33. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/__init__.py +0 -0
  34. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/base.py +0 -0
  35. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/factory.py +0 -0
  36. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_exif.py +0 -0
  37. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_exiftool.py +0 -0
  38. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_gpx.py +0 -0
  39. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_gpx_file.py +0 -0
  40. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_nmea_file.py +0 -0
  41. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_images_from_video.py +0 -0
  42. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_videos_from_exiftool.py +0 -0
  43. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_videos_from_gpx.py +0 -0
  44. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/geotag_videos_from_video.py +0 -0
  45. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/image_extractors/base.py +0 -0
  46. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/image_extractors/exif.py +0 -0
  47. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/image_extractors/exiftool.py +0 -0
  48. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/options.py +0 -0
  49. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/utils.py +0 -0
  50. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/video_extractors/base.py +0 -0
  51. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/video_extractors/exiftool.py +0 -0
  52. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/video_extractors/gpx.py +0 -0
  53. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/geotag/video_extractors/native.py +0 -0
  54. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/gpmf/gpmf_gps_filter.py +0 -0
  55. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/gpmf/gpmf_parser.py +0 -0
  56. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/gpmf/gps_filter.py +0 -0
  57. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/history.py +0 -0
  58. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/http.py +0 -0
  59. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/ipc.py +0 -0
  60. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/__init__.py +0 -0
  61. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/construct_mp4_parser.py +0 -0
  62. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/io_utils.py +0 -0
  63. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/mp4_sample_parser.py +0 -0
  64. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/simple_mp4_builder.py +0 -0
  65. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/mp4/simple_mp4_parser.py +0 -0
  66. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/process_geotag_properties.py +0 -0
  67. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/process_sequence_properties.py +0 -0
  68. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/sample_video.py +0 -0
  69. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/serializer/description.py +0 -0
  70. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/serializer/gpx.py +0 -0
  71. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/store.py +0 -0
  72. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/telemetry.py +0 -0
  73. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/types.py +0 -0
  74. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/upload.py +0 -0
  75. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/upload_api_v4.py +0 -0
  76. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools/uploader.py +0 -0
  77. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/SOURCES.txt +0 -0
  78. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/dependency_links.txt +0 -0
  79. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/entry_points.txt +0 -0
  80. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/requires.txt +0 -0
  81. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/mapillary_tools.egg-info/top_level.txt +0 -0
  82. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/pyproject.toml +0 -0
  83. {mapillary_tools-0.14.4 → mapillary_tools-0.14.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapillary_tools
3
- Version: 0.14.4
3
+ Version: 0.14.5
4
4
  Summary: Mapillary Image/Video Import Pipeline
5
5
  Author-email: Mapillary <support@mapillary.com>
6
6
  License: BSD
@@ -0,0 +1 @@
1
+ VERSION = "0.14.5"
@@ -6,6 +6,7 @@ import io
6
6
  import json
7
7
  import logging
8
8
  import math
9
+ from fractions import Fraction
9
10
  from pathlib import Path
10
11
 
11
12
  import piexif
@@ -29,16 +30,19 @@ class ExifEdit:
29
30
 
30
31
  @staticmethod
31
32
  def decimal_to_dms(
32
- value: float, precision: int
33
- ) -> tuple[tuple[float, int], tuple[float, int], tuple[float, int]]:
34
- """
35
- Convert decimal position to degrees, minutes, seconds in a fromat supported by EXIF
36
- """
37
- deg = math.floor(value)
38
- min = math.floor((value - deg) * 60)
39
- sec = math.floor((value - deg - min / 60) * 3600 * precision)
40
-
41
- return (deg, 1), (min, 1), (sec, precision)
33
+ value: float,
34
+ ) -> tuple[tuple[int, int], tuple[int, int], tuple[int, int]]:
35
+ """Convert decimal position to Exif degrees, minutes, and seconds rationals"""
36
+
37
+ deg: int = int(value)
38
+ min: int = int(value := (value - deg) * 60)
39
+ sec: float = (value - min) * 60
40
+
41
+ return (
42
+ (deg, 1),
43
+ (min, 1),
44
+ (Fraction.from_float(sec).limit_denominator().as_integer_ratio()),
45
+ )
42
46
 
43
47
  def add_image_description(self, data: dict) -> None:
44
48
  """Add a dict to image description."""
@@ -83,41 +87,69 @@ class ExifEdit:
83
87
  self._ef["GPS"][piexif.GPSIFD.GPSTimeStamp] = (
84
88
  (dt.hour, 1),
85
89
  (dt.minute, 1),
86
- # num / den = (dt.second * 1e6 + dt.microsecond) / 1e6
87
- (int(dt.second * 1e6 + dt.microsecond), int(1e6)),
90
+ (
91
+ Fraction.from_float(dt.second + dt.microsecond / 1e6)
92
+ .limit_denominator()
93
+ .as_integer_ratio()
94
+ ),
88
95
  )
89
-
90
- def add_lat_lon(self, lat: float, lon: float, precision: float = 1e7) -> None:
96
+ if LOG.isEnabledFor(logging.DEBUG):
97
+ LOG.debug(
98
+ 'GPSDateStamp: "%s"\tGPSTimeStamp: %s',
99
+ self._ef["GPS"][piexif.GPSIFD.GPSDateStamp],
100
+ self._ef["GPS"][piexif.GPSIFD.GPSTimeStamp],
101
+ )
102
+
103
+ def add_lat_lon(self, lat: float, lon: float) -> None:
91
104
  """Add lat, lon to gps (lat, lon in float)."""
105
+
92
106
  self._ef["GPS"][piexif.GPSIFD.GPSLatitudeRef] = "N" if lat > 0 else "S"
107
+ self._ef["GPS"][piexif.GPSIFD.GPSLatitude] = ExifEdit.decimal_to_dms(
108
+ math.fabs(lat)
109
+ )
93
110
  self._ef["GPS"][piexif.GPSIFD.GPSLongitudeRef] = "E" if lon > 0 else "W"
94
111
  self._ef["GPS"][piexif.GPSIFD.GPSLongitude] = ExifEdit.decimal_to_dms(
95
- abs(lon), int(precision)
96
- )
97
- self._ef["GPS"][piexif.GPSIFD.GPSLatitude] = ExifEdit.decimal_to_dms(
98
- abs(lat), int(precision)
112
+ math.fabs(lon)
99
113
  )
114
+ if LOG.isEnabledFor(logging.DEBUG):
115
+ LOG.debug(
116
+ "GPSLatitude: %s\tGPSLongitude: %s",
117
+ self._ef["GPS"][piexif.GPSIFD.GPSLatitude],
118
+ self._ef["GPS"][piexif.GPSIFD.GPSLongitude],
119
+ )
120
+
121
+ def add_altitude(self, altitude: float) -> None:
122
+ """Add altitude."""
100
123
 
101
- def add_altitude(self, altitude: float, precision: int = 100) -> None:
102
- """Add altitude (pre is the precision)."""
103
124
  ref = 0 if altitude > 0 else 1
104
125
  self._ef["GPS"][piexif.GPSIFD.GPSAltitude] = (
105
- int(abs(altitude) * precision),
106
- precision,
126
+ Fraction.from_float(math.fabs(altitude))
127
+ .limit_denominator()
128
+ .as_integer_ratio()
107
129
  )
108
130
  self._ef["GPS"][piexif.GPSIFD.GPSAltitudeRef] = ref
109
-
110
- def add_direction(
111
- self, direction: float, ref: str = "T", precision: int = 100
112
- ) -> None:
131
+ if LOG.isEnabledFor(logging.DEBUG):
132
+ LOG.debug(
133
+ 'GPSAltitudeRef: "%s"\tGPSAltitude: %s',
134
+ self._ef["GPS"][piexif.GPSIFD.GPSAltitudeRef],
135
+ self._ef["GPS"][piexif.GPSIFD.GPSAltitude],
136
+ )
137
+
138
+ def add_direction(self, direction: float, ref: str = "T") -> None:
113
139
  """Add image direction."""
140
+
114
141
  # normalize direction
115
- direction = direction % 360.0
142
+ direction = math.fmod(direction, 360.0)
116
143
  self._ef["GPS"][piexif.GPSIFD.GPSImgDirection] = (
117
- int(abs(direction) * precision),
118
- precision,
144
+ Fraction.from_float(direction).limit_denominator().as_integer_ratio()
119
145
  )
120
146
  self._ef["GPS"][piexif.GPSIFD.GPSImgDirectionRef] = ref
147
+ if LOG.isEnabledFor(logging.DEBUG):
148
+ LOG.debug(
149
+ 'GPSImgDirectionRef: "%s"\tGPSImgDirection: %s',
150
+ self._ef["GPS"][piexif.GPSIFD.GPSImgDirectionRef],
151
+ self._ef["GPS"][piexif.GPSIFD.GPSImgDirection],
152
+ )
121
153
 
122
154
  def add_make(self, make: str) -> None:
123
155
  if not make:
@@ -31,6 +31,7 @@ def is_image_file(path: Path) -> bool:
31
31
  ".tiff",
32
32
  ".pgm",
33
33
  ".pnm",
34
+ ".36p",
34
35
  )
35
36
 
36
37
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapillary_tools
3
- Version: 0.14.4
3
+ Version: 0.14.5
4
4
  Summary: Mapillary Image/Video Import Pipeline
5
5
  Author-email: Mapillary <support@mapillary.com>
6
6
  License: BSD
@@ -1 +0,0 @@
1
- VERSION = "0.14.4"