mapillary-tools 0.14.4__py3-none-any.whl → 0.14.6__py3-none-any.whl

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 (78) hide show
  1. mapillary_tools/__init__.py +6 -1
  2. mapillary_tools/api_v4.py +5 -0
  3. mapillary_tools/authenticate.py +5 -1
  4. mapillary_tools/blackvue_parser.py +138 -20
  5. mapillary_tools/camm/camm_builder.py +5 -1
  6. mapillary_tools/camm/camm_parser.py +5 -0
  7. mapillary_tools/commands/__init__.py +5 -0
  8. mapillary_tools/commands/__main__.py +5 -0
  9. mapillary_tools/commands/authenticate.py +5 -0
  10. mapillary_tools/commands/process.py +12 -0
  11. mapillary_tools/commands/process_and_upload.py +5 -1
  12. mapillary_tools/commands/sample_video.py +5 -0
  13. mapillary_tools/commands/upload.py +5 -0
  14. mapillary_tools/commands/video_process.py +5 -0
  15. mapillary_tools/commands/video_process_and_upload.py +5 -1
  16. mapillary_tools/commands/zip.py +5 -0
  17. mapillary_tools/config.py +5 -0
  18. mapillary_tools/constants.py +13 -1
  19. mapillary_tools/exceptions.py +9 -0
  20. mapillary_tools/exif_read.py +89 -0
  21. mapillary_tools/exif_write.py +75 -26
  22. mapillary_tools/exiftool_read.py +89 -0
  23. mapillary_tools/exiftool_read_video.py +56 -0
  24. mapillary_tools/exiftool_runner.py +5 -0
  25. mapillary_tools/ffmpeg.py +5 -0
  26. mapillary_tools/geo.py +91 -31
  27. mapillary_tools/geotag/__init__.py +4 -0
  28. mapillary_tools/geotag/base.py +5 -0
  29. mapillary_tools/geotag/factory.py +5 -0
  30. mapillary_tools/geotag/geotag_images_from_exif.py +5 -0
  31. mapillary_tools/geotag/geotag_images_from_exiftool.py +5 -0
  32. mapillary_tools/geotag/geotag_images_from_gpx.py +5 -0
  33. mapillary_tools/geotag/geotag_images_from_gpx_file.py +5 -0
  34. mapillary_tools/geotag/geotag_images_from_nmea_file.py +5 -0
  35. mapillary_tools/geotag/geotag_images_from_video.py +6 -0
  36. mapillary_tools/geotag/geotag_videos_from_exiftool.py +5 -0
  37. mapillary_tools/geotag/geotag_videos_from_gpx.py +5 -0
  38. mapillary_tools/geotag/geotag_videos_from_video.py +5 -0
  39. mapillary_tools/geotag/image_extractors/base.py +5 -0
  40. mapillary_tools/geotag/image_extractors/exif.py +6 -0
  41. mapillary_tools/geotag/image_extractors/exiftool.py +5 -0
  42. mapillary_tools/geotag/options.py +5 -0
  43. mapillary_tools/geotag/utils.py +5 -0
  44. mapillary_tools/geotag/video_extractors/base.py +5 -0
  45. mapillary_tools/geotag/video_extractors/exiftool.py +7 -0
  46. mapillary_tools/geotag/video_extractors/gpx.py +5 -0
  47. mapillary_tools/geotag/video_extractors/native.py +5 -0
  48. mapillary_tools/gpmf/gpmf_gps_filter.py +5 -0
  49. mapillary_tools/gpmf/gpmf_parser.py +5 -0
  50. mapillary_tools/gpmf/gps_filter.py +5 -0
  51. mapillary_tools/history.py +5 -0
  52. mapillary_tools/http.py +5 -1
  53. mapillary_tools/ipc.py +5 -0
  54. mapillary_tools/mp4/__init__.py +4 -0
  55. mapillary_tools/mp4/construct_mp4_parser.py +5 -0
  56. mapillary_tools/mp4/io_utils.py +5 -0
  57. mapillary_tools/mp4/mp4_sample_parser.py +20 -1
  58. mapillary_tools/mp4/simple_mp4_builder.py +5 -0
  59. mapillary_tools/mp4/simple_mp4_parser.py +5 -0
  60. mapillary_tools/process_geotag_properties.py +5 -0
  61. mapillary_tools/process_sequence_properties.py +213 -31
  62. mapillary_tools/sample_video.py +13 -1
  63. mapillary_tools/serializer/description.py +13 -0
  64. mapillary_tools/serializer/gpx.py +5 -1
  65. mapillary_tools/store.py +5 -0
  66. mapillary_tools/telemetry.py +108 -0
  67. mapillary_tools/types.py +6 -0
  68. mapillary_tools/upload.py +5 -0
  69. mapillary_tools/upload_api_v4.py +5 -0
  70. mapillary_tools/uploader.py +9 -0
  71. mapillary_tools/utils.py +17 -1
  72. {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.6.dist-info}/METADATA +8 -1
  73. mapillary_tools-0.14.6.dist-info/RECORD +77 -0
  74. {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.6.dist-info}/WHEEL +1 -1
  75. mapillary_tools-0.14.4.dist-info/RECORD +0 -77
  76. {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.6.dist-info}/entry_points.txt +0 -0
  77. {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.6.dist-info}/licenses/LICENSE +0 -0
  78. {mapillary_tools-0.14.4.dist-info → mapillary_tools-0.14.6.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import dataclasses
@@ -84,6 +89,7 @@ class VideoDescription(_SharedDescription, total=False):
84
89
  MAPGPSTrack: Required[list[T.Sequence[float | int | None]]]
85
90
  MAPDeviceMake: str
86
91
  MAPDeviceModel: str
92
+ MAPCameraUUID: str
87
93
 
88
94
 
89
95
  class _ErrorObject(TypedDict, total=False):
@@ -201,6 +207,10 @@ VideoDescriptionSchema = {
201
207
  "type": "string",
202
208
  "description": "Device model, e.g. HERO10 Black, DR900S-1CH, Insta360 Titan",
203
209
  },
210
+ "MAPCameraUUID": {
211
+ "type": "string",
212
+ "description": "Camera unique identifier, typically derived from camera serial number",
213
+ },
204
214
  },
205
215
  "required": [
206
216
  "MAPGPSTrack",
@@ -397,6 +407,8 @@ class DescriptionJSONSerializer(BaseSerializer):
397
407
  desc["MAPDeviceMake"] = metadata.make
398
408
  if metadata.model:
399
409
  desc["MAPDeviceModel"] = metadata.model
410
+ if metadata.camera_uuid:
411
+ desc["MAPCameraUUID"] = metadata.camera_uuid
400
412
  return desc
401
413
 
402
414
  @classmethod
@@ -490,6 +502,7 @@ class DescriptionJSONSerializer(BaseSerializer):
490
502
  points=[PointEncoder.decode(entry) for entry in desc["MAPGPSTrack"]],
491
503
  make=desc.get("MAPDeviceMake"),
492
504
  model=desc.get("MAPDeviceModel"),
505
+ camera_uuid=desc.get("MAPCameraUUID"),
493
506
  )
494
507
 
495
508
 
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  import datetime
2
7
  import json
3
8
  import sys
@@ -12,7 +17,6 @@ import gpxpy
12
17
  import gpxpy.gpx
13
18
 
14
19
  from .. import geo, types
15
-
16
20
  from ..telemetry import CAMMGPSPoint, GPSPoint
17
21
  from ..types import (
18
22
  BaseSerializer,
mapillary_tools/store.py CHANGED
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  """
2
7
  This module provides a persistent key-value store based on SQLite.
3
8
 
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import dataclasses
@@ -32,6 +37,57 @@ class GPSPoint(TimestampedMeasurement, Point):
32
37
  precision: float | None
33
38
  ground_speed: float | None
34
39
 
40
+ def get_gps_epoch_time(self) -> float | None:
41
+ """Return the GPS epoch time if valid, otherwise None."""
42
+ if self.epoch_time is not None and self.epoch_time > 0:
43
+ return self.epoch_time
44
+ return None
45
+
46
+ def interpolate_with(self, other: Point, t: float) -> Point:
47
+ """Create a new interpolated GPSPoint using this and other point at time t."""
48
+ base = super().interpolate_with(other, t)
49
+ if not isinstance(other, GPSPoint):
50
+ return base
51
+
52
+ # Interpolate GPSPoint-specific fields
53
+ weight = self._calculate_weight_for_interpolation(other, t)
54
+ epoch_time: float | None
55
+ if (
56
+ self.epoch_time is not None
57
+ and other.epoch_time is not None
58
+ and self.epoch_time > 0
59
+ and other.epoch_time > 0
60
+ ):
61
+ epoch_time = self.epoch_time + (other.epoch_time - self.epoch_time) * weight
62
+ else:
63
+ epoch_time = None
64
+
65
+ precision: float | None
66
+ if self.precision is not None and other.precision is not None:
67
+ precision = self.precision + (other.precision - self.precision) * weight
68
+ else:
69
+ precision = None
70
+
71
+ ground_speed: float | None
72
+ if self.ground_speed is not None and other.ground_speed is not None:
73
+ ground_speed = (
74
+ self.ground_speed + (other.ground_speed - self.ground_speed) * weight
75
+ )
76
+ else:
77
+ ground_speed = None
78
+
79
+ return GPSPoint(
80
+ time=base.time,
81
+ lat=base.lat,
82
+ lon=base.lon,
83
+ alt=base.alt,
84
+ angle=base.angle,
85
+ epoch_time=epoch_time,
86
+ fix=self.fix, # Use start point's fix value
87
+ precision=precision,
88
+ ground_speed=ground_speed,
89
+ )
90
+
35
91
 
36
92
  @dataclasses.dataclass
37
93
  class CAMMGPSPoint(TimestampedMeasurement, Point):
@@ -44,6 +100,58 @@ class CAMMGPSPoint(TimestampedMeasurement, Point):
44
100
  velocity_up: float
45
101
  speed_accuracy: float
46
102
 
103
+ def get_gps_epoch_time(self) -> float | None:
104
+ """Return the GPS epoch time if valid, otherwise None."""
105
+ if self.time_gps_epoch > 0:
106
+ return self.time_gps_epoch
107
+ return None
108
+
109
+ def interpolate_with(self, other: Point, t: float) -> Point:
110
+ """Create a new interpolated CAMMGPSPoint using this and other point at time t."""
111
+ base = super().interpolate_with(other, t)
112
+ if not isinstance(other, CAMMGPSPoint):
113
+ return base
114
+
115
+ # Interpolate all CAMM-specific fields
116
+ weight = self._calculate_weight_for_interpolation(other, t)
117
+ time_gps_epoch = (
118
+ self.time_gps_epoch + (other.time_gps_epoch - self.time_gps_epoch) * weight
119
+ )
120
+ horizontal_accuracy = (
121
+ self.horizontal_accuracy
122
+ + (other.horizontal_accuracy - self.horizontal_accuracy) * weight
123
+ )
124
+ vertical_accuracy = (
125
+ self.vertical_accuracy
126
+ + (other.vertical_accuracy - self.vertical_accuracy) * weight
127
+ )
128
+ velocity_east = (
129
+ self.velocity_east + (other.velocity_east - self.velocity_east) * weight
130
+ )
131
+ velocity_north = (
132
+ self.velocity_north + (other.velocity_north - self.velocity_north) * weight
133
+ )
134
+ velocity_up = self.velocity_up + (other.velocity_up - self.velocity_up) * weight
135
+ speed_accuracy = (
136
+ self.speed_accuracy + (other.speed_accuracy - self.speed_accuracy) * weight
137
+ )
138
+
139
+ return CAMMGPSPoint(
140
+ time=base.time,
141
+ lat=base.lat,
142
+ lon=base.lon,
143
+ alt=base.alt,
144
+ angle=base.angle,
145
+ time_gps_epoch=time_gps_epoch,
146
+ gps_fix_type=self.gps_fix_type, # Use start point's fix type
147
+ horizontal_accuracy=horizontal_accuracy,
148
+ vertical_accuracy=vertical_accuracy,
149
+ velocity_east=velocity_east,
150
+ velocity_north=velocity_north,
151
+ velocity_up=velocity_up,
152
+ speed_accuracy=speed_accuracy,
153
+ )
154
+
47
155
 
48
156
  @dataclasses.dataclass(order=True)
49
157
  class GyroscopeData(TimestampedMeasurement):
mapillary_tools/types.py CHANGED
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import abc
@@ -72,6 +77,7 @@ class VideoMetadata:
72
77
  make: str | None = None
73
78
  model: str | None = None
74
79
  filesize: int | None = None
80
+ camera_uuid: str | None = None
75
81
 
76
82
  def update_md5sum(self) -> None:
77
83
  if self.md5sum is None:
mapillary_tools/upload.py CHANGED
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import json
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import io
@@ -1,3 +1,8 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import concurrent.futures
@@ -797,6 +802,10 @@ class CachedImageUploader:
797
802
  raise ExifError(
798
803
  f"Failed to dump EXIF bytes: {ex}", metadata.filename
799
804
  ) from ex
805
+ except ValueError as ex:
806
+ raise ExifError(
807
+ f"Failed to dump EXIF bytes: {ex}", metadata.filename
808
+ ) from ex
800
809
 
801
810
  # Thread-safe
802
811
  def _get_cached_file_handle(self, key: str) -> str | None:
mapillary_tools/utils.py CHANGED
@@ -1,7 +1,11 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the BSD license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
1
6
  from __future__ import annotations
2
7
 
3
8
  import concurrent.futures
4
-
5
9
  import hashlib
6
10
  import logging
7
11
  import os
@@ -31,6 +35,7 @@ def is_image_file(path: Path) -> bool:
31
35
  ".tiff",
32
36
  ".pgm",
33
37
  ".pnm",
38
+ ".36p",
34
39
  )
35
40
 
36
41
 
@@ -54,6 +59,17 @@ def is_video_file(path: Path) -> bool:
54
59
  )
55
60
 
56
61
 
62
+ def sanitize_serial(s: str | None) -> str | None:
63
+ """
64
+ Sanitize a serial number by removing all non-alphanumeric characters.
65
+ Returns None if the input is None or if the result is empty after cleaning.
66
+ """
67
+ if s is None:
68
+ return None
69
+ cleaned = "".join(c for c in s if c.isalnum())
70
+ return cleaned if cleaned else None
71
+
72
+
57
73
  def iterate_files(
58
74
  root: Path, recursive: bool = False, follow_hidden_dirs: bool = False
59
75
  ) -> T.Generator[Path, None, None]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapillary_tools
3
- Version: 0.14.4
3
+ Version: 0.14.6
4
4
  Summary: Mapillary Image/Video Import Pipeline
5
5
  Author-email: Mapillary <support@mapillary.com>
6
6
  License: BSD
@@ -34,6 +34,13 @@ Requires-Dist: tqdm<5.0,>=4.0
34
34
  Requires-Dist: typing-extensions>=4.12.2
35
35
  Dynamic: license-file
36
36
 
37
+ <!--
38
+ Copyright (c) Meta Platforms, Inc. and affiliates.
39
+
40
+ This source code is licensed under the BSD license found in the
41
+ LICENSE file in the root directory of this source tree.
42
+ -->
43
+
37
44
  <p align="center">
38
45
  <a href="https://github.com/mapillary/mapillary_tools/">
39
46
  <img src="https://raw.githubusercontent.com/mapillary/mapillary_tools/main/docs/images/logo.png">
@@ -0,0 +1,77 @@
1
+ mapillary_tools/__init__.py,sha256=T25Q4iuSoSjqHWYvfcGjMLNihNfE6lJGVDna0AFibZ4,199
2
+ mapillary_tools/api_v4.py,sha256=YpDyzQDp4iLovYqZ0xjErDZskeO90sLdsu6pbD646Qo,5044
3
+ mapillary_tools/authenticate.py,sha256=QFG1-Co_mbd16A2I9XKLE38n3Ut7Axgs0oqwlcvShVs,11921
4
+ mapillary_tools/blackvue_parser.py,sha256=eKMCTULG-0AUWCuNVxouP0w1hxLqTdhrugLROt1AkUI,11002
5
+ mapillary_tools/config.py,sha256=TsCNYTgYFX-5NozUirx-0Yc1sUhVbnbksDMYKRfAUdg,3601
6
+ mapillary_tools/constants.py,sha256=RRps4Va519MvHYzWEgG6Cj9I5M1EsGrkGOF35nbUW-4,6783
7
+ mapillary_tools/exceptions.py,sha256=yKwkLyNaIAbtdj0HhuwTTRZyw6tNL83ON0AKYno3YxE,2729
8
+ mapillary_tools/exif_read.py,sha256=hfbjZn8erXW299gLn5Vzg767zYbRynDCLnGFeVde3PA,34902
9
+ mapillary_tools/exif_write.py,sha256=_KLvO09RqDoLeJXldesjQ_9lBpsiKsQy3Sxj7hVFr6E,10668
10
+ mapillary_tools/exiftool_read.py,sha256=gt7Z3sJTcRK19ocdrDVzIPc2plDg0vQ1N3VcbCrhtfw,19431
11
+ mapillary_tools/exiftool_read_video.py,sha256=uzdlBtT-aGoKsTulF99BdShQKIBOFPXK6iKVjvCNPhY,18180
12
+ mapillary_tools/exiftool_runner.py,sha256=UUP-GxmFFp8Hx7NccvjUT59EdfGM-guV8jl6O4Zimik,1838
13
+ mapillary_tools/ffmpeg.py,sha256=YUfeu64fZTB82ft0ppAnQLgo0gS5faLvx38Rj8D6yks,23088
14
+ mapillary_tools/geo.py,sha256=JsD0ohunIji7aAPsJWKY_z-eohhjRpZNoJBl02RWM_k,13228
15
+ mapillary_tools/history.py,sha256=dPDu-PjVf9FpGAZgK1-vpqpSx6BVuVI2e3kh8Xh1LI4,6467
16
+ mapillary_tools/http.py,sha256=5BrGimzF3tS_aV7bBxeeQDBsr7qWiIJ_Jh6VkgTsm-8,6590
17
+ mapillary_tools/ipc.py,sha256=My5y9AHrddtiK909vBX7HmTPy3l95a7yanpjx4MxPp8,1269
18
+ mapillary_tools/process_geotag_properties.py,sha256=6SwZhR8_4mNSrRM7GE7fnFPiRWVoURrdX4_NBRsGxAI,14385
19
+ mapillary_tools/process_sequence_properties.py,sha256=77o3VWTUPjp_jUw2WtBMCgfv6Ncu2dcdaXLCrv3_RGU,31136
20
+ mapillary_tools/sample_video.py,sha256=GLgV-rrzpi8YLEPpYj0tWu6ggsXrMbmFQd_TGRRGAZQ,14453
21
+ mapillary_tools/store.py,sha256=fqeALcDhax_ZXJkDdKRDjTk2ZznlVk1Lx6ycWx-KmW0,4257
22
+ mapillary_tools/telemetry.py,sha256=ceMqMqTLcOBXb88eoQ94ApEeVQvk9iwvEzGSESj90oQ,5632
23
+ mapillary_tools/types.py,sha256=3MQADphbMu8nsQJxXmMyMAf0XUeDDjbFTR0y-Rg3JEk,6124
24
+ mapillary_tools/upload.py,sha256=gC80pgiTiTlk7FQzbbmn05JVc4i7_PJ608y9fw5WWig,24227
25
+ mapillary_tools/upload_api_v4.py,sha256=dNbKqgmSareVtuGYS3q7-dMaHx7ykExB4y05du92p78,7524
26
+ mapillary_tools/uploader.py,sha256=3jOHKkFwHTM7syrMOvTxI2Ukq30KOe-x0nHePmXt6mg,46970
27
+ mapillary_tools/utils.py,sha256=NEEb3IEDK3LNMHF7DYTULYxTR_zGsxPgPI4r_ewrrgU,8654
28
+ mapillary_tools/camm/camm_builder.py,sha256=7bfkiTG1AW-Q-ln44S1yDHJUhwWpWSmkWR6kfRgc1mE,9390
29
+ mapillary_tools/camm/camm_parser.py,sha256=9jWc_lqt4rtnFIW05Kz5dQftaEyyBhLRVSimuJgZtIc,18223
30
+ mapillary_tools/commands/__init__.py,sha256=OnLpb0AbvxEhHIMOflnm9tvI34DsThoSBQckix6jNN8,351
31
+ mapillary_tools/commands/__main__.py,sha256=JdYrrhpmFo8rExeXQr12wirymg7ynZgIJZY3pvolzys,5015
32
+ mapillary_tools/commands/authenticate.py,sha256=i1-BigjrzcvNG-M_uHDgfJg8pidSYIq5mpsvyl_x-7s,1524
33
+ mapillary_tools/commands/process.py,sha256=qfQ2y88hSIIGIyWwLOybx3kLw5CtBD3zP8HZ9-6i0IQ,10187
34
+ mapillary_tools/commands/process_and_upload.py,sha256=gcodOJDE2Krml-vqxztWZowW2NZTjwXVUx7ZD3UgqKw,1220
35
+ mapillary_tools/commands/sample_video.py,sha256=fMbfmelUZ_YkQZ02rLPlxDNbMKerJ5ygLj_9EhOyJh4,3433
36
+ mapillary_tools/commands/upload.py,sha256=F4uo8ta8A-w71c_p_6_h1XqJiAlxmyqFwErh5CZkcZ8,3280
37
+ mapillary_tools/commands/video_process.py,sha256=jwdxeRs86DHL0H_TmCfP1H0pwh7G4E5jxLR9pXEPtzY,1070
38
+ mapillary_tools/commands/video_process_and_upload.py,sha256=-aHA-ZccBtKir93um_v1gd73svSLzPn-uDpRh32ZGAc,1267
39
+ mapillary_tools/commands/zip.py,sha256=cPhVw5vWDYYzLqHNNX8xUHuq_D5TP7xEXDfHPGEb3ZA,1171
40
+ mapillary_tools/geotag/__init__.py,sha256=T6ERU4GCbpsXvJ8PSz2ZfS1oM4Fo_zxMlQ8qgfod7g8,179
41
+ mapillary_tools/geotag/base.py,sha256=OvwBG7ivAyjh3UL47llISj_VOSdosqL1o-BbDprEHLA,5346
42
+ mapillary_tools/geotag/factory.py,sha256=26HnskiZCK9cXyYP2Oh2WWVgC4-ltz3lY2VIYWHEQzU,10451
43
+ mapillary_tools/geotag/geotag_images_from_exif.py,sha256=VQQPyCgvGn68H6NiBPdbtF7Q0ZJ_y6jNDI89vw_GBc4,788
44
+ mapillary_tools/geotag/geotag_images_from_exiftool.py,sha256=Ics6ZioO-tEobIr8htJa4lOTkN_wKrweGgGUL6vNJgo,5887
45
+ mapillary_tools/geotag/geotag_images_from_gpx.py,sha256=44S5D3v-cyAE69gdmesQ1YfiS1pSC0lMwTJOQT650FE,6493
46
+ mapillary_tools/geotag/geotag_images_from_gpx_file.py,sha256=eu9jqv8KqGYWIuv8x-mTmkJkIc_7rmFTL4V-9isV_UY,1301
47
+ mapillary_tools/geotag/geotag_images_from_nmea_file.py,sha256=3SwQGrciZgnQN6SXLsCKuBY6kPNUP74UAz2txNHJ06o,1777
48
+ mapillary_tools/geotag/geotag_images_from_video.py,sha256=AkDvG7wF3F1ctBr7OVjlYd173isSbzhG5RFA_sPi-l0,4663
49
+ mapillary_tools/geotag/geotag_videos_from_exiftool.py,sha256=-lCXmJERMkt53HZUUZhuEKMUxJ4BzDmyOYeXM2kO214,5525
50
+ mapillary_tools/geotag/geotag_videos_from_gpx.py,sha256=KXiV4mV0gLangoFzf1crLWjeHO-_UZ4TknXKt-4x0yc,1833
51
+ mapillary_tools/geotag/geotag_videos_from_video.py,sha256=W6kC90l1uvQyOQd7B9zf8pcvfVeCTM2yXbc9ZyC2GVA,1043
52
+ mapillary_tools/geotag/options.py,sha256=7SurJ2tmJ1-O7qM2sMN8yRPMfUEcogOmDGL-cg6_xwE,5346
53
+ mapillary_tools/geotag/utils.py,sha256=7wkY-aUnU_rgu7TQxYMftZg_awkTz9-_e6gILtqNRz4,1768
54
+ mapillary_tools/geotag/image_extractors/base.py,sha256=8cTGSW3622j3U8wTm5SeQPQ9FWIEIxJRK45K-Zp7rjw,538
55
+ mapillary_tools/geotag/image_extractors/exif.py,sha256=3-7Jm7zjYLoYxalkVEXBzMPuelIp-CB8bXIz9eSgeVE,2317
56
+ mapillary_tools/geotag/image_extractors/exiftool.py,sha256=ZnCtnn02PkSz1fQ2VkCKfU9eX7xgu3iaiWbklhyJZbg,677
57
+ mapillary_tools/geotag/video_extractors/base.py,sha256=mxNeIOsgJePBxqr7tSKZujLBcbIUDWUsRTGu3WfagDA,530
58
+ mapillary_tools/geotag/video_extractors/exiftool.py,sha256=w_s7PEyBVc5cmo8pVknwQKKNg3B6ZPXscJFaCYUDKk4,2571
59
+ mapillary_tools/geotag/video_extractors/gpx.py,sha256=Qmqu__6LAA7kZ6M1CKbxExe2Utz9r4hcOQZhhRFL1jg,4003
60
+ mapillary_tools/geotag/video_extractors/native.py,sha256=o1HZzJ_HR8ZAcIWgGHUUawUnha4DWorNAeo_dFXj-tw,5966
61
+ mapillary_tools/gpmf/gpmf_gps_filter.py,sha256=Rl0klukhonY_R5sACdX4lP3p17VYrZbpgbzMa0vl9fY,2935
62
+ mapillary_tools/gpmf/gpmf_parser.py,sha256=_U9fqnoeRwTXpsmoa4NdT4g_eor0HE8k6qfwP3JZ1eg,24850
63
+ mapillary_tools/gpmf/gps_filter.py,sha256=2QgVR0X-d1oNTZa4FFwQ_qYeNyPHnT98vPeOuNToKoI,3976
64
+ mapillary_tools/mp4/__init__.py,sha256=T6ERU4GCbpsXvJ8PSz2ZfS1oM4Fo_zxMlQ8qgfod7g8,179
65
+ mapillary_tools/mp4/construct_mp4_parser.py,sha256=9EEEZbYWTrRQvSNAVwDpkDoRxluqhk7w2mQDlHA-xg4,17466
66
+ mapillary_tools/mp4/io_utils.py,sha256=KNx_6r-QZQKuOX25bAVIc9bWGPqLS2eCU6mfia7s4xY,5596
67
+ mapillary_tools/mp4/mp4_sample_parser.py,sha256=RwIumnR1pVh1sCuBZmBVwxxyWeZyrpPWK2fKMeFK8Hc,12432
68
+ mapillary_tools/mp4/simple_mp4_builder.py,sha256=GTct-yPgf92_yGZ5-quAtGqbF9Tamw07dIzDYSnpedU,12914
69
+ mapillary_tools/mp4/simple_mp4_parser.py,sha256=83bKqEL3Mza40dprVu_sFDNu82pcylHpCVcIk-K3NgQ,6495
70
+ mapillary_tools/serializer/description.py,sha256=U6mrVmFrWxVXeA_XCSnuHF83d6TQg5y_Zyn2kvFqDdE,19159
71
+ mapillary_tools/serializer/gpx.py,sha256=PE0OeM4X98MCxOtribAPO3u8pl6VOzhX5AOqGF27eQA,4562
72
+ mapillary_tools-0.14.6.dist-info/licenses/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
73
+ mapillary_tools-0.14.6.dist-info/METADATA,sha256=ooPi6cTqKIQvJ1rShPSNkvQfHnWXPaWayYWD5fE6KsQ,22382
74
+ mapillary_tools-0.14.6.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
75
+ mapillary_tools-0.14.6.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
76
+ mapillary_tools-0.14.6.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
77
+ mapillary_tools-0.14.6.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,77 +0,0 @@
1
- mapillary_tools/__init__.py,sha256=SlLq3LO5ZN4Ap8_XR8x6nXyckJ4qcIktiWVQg34oqMY,19
2
- mapillary_tools/api_v4.py,sha256=bckAU_atUs0pSuqySeY4W0Rs011a21ClJHo_mbbcXXw,4864
3
- mapillary_tools/authenticate.py,sha256=mmaOwjQ444DcX4lRw2ms3naBg5Y_xwIJAIWeVdsQfqM,11742
4
- mapillary_tools/blackvue_parser.py,sha256=ea2JtU9MWU6yB0bQlF970_Of0bJVofSTRq1P30WKW-0,5623
5
- mapillary_tools/config.py,sha256=LDxQoL2StjLGPefCN0y67nhIDN3xSE6Qn8G-tWC-oGA,3421
6
- mapillary_tools/constants.py,sha256=fk5HBczTBGyDOKQy-grzlf0SafiGwggdF8Ota13Rk0k,6235
7
- mapillary_tools/exceptions.py,sha256=uxTgBEfXgGxT0XNGRIAZ5mjtdqsCYfP6gnaXAK_ewBM,2483
8
- mapillary_tools/exif_read.py,sha256=nAbZDYAIBx3g4n6QIGKXX3s-A3SkfuvZQBInDrXMlKk,32220
9
- mapillary_tools/exif_write.py,sha256=I9GSs8KRd28QyKPVNHuxesSVbBvahHqKBS3nw9HoLsg,8830
10
- mapillary_tools/exiftool_read.py,sha256=5uatYE9mgbg2d9NAnPfX22nSRBjXhJ9ayMqNMd4QwGM,15779
11
- mapillary_tools/exiftool_read_video.py,sha256=23O_bjUOVq6j7i3xMz6fY-XIEsjinsCejK_0nrbFyOM,16084
12
- mapillary_tools/exiftool_runner.py,sha256=g4gSyqeh3D6EnMJ-c3s-RnO2EP_jD354Qkaz0Y-4D04,1658
13
- mapillary_tools/ffmpeg.py,sha256=akpvvsjAR-Iiv-hOrUoJvPM9vUU3JqMQ5HJL1_NgwB8,22908
14
- mapillary_tools/geo.py,sha256=mWaESfDf_zHmyvnt5aVFro4FGrjiULNsuZ6HfGUWvSA,11009
15
- mapillary_tools/history.py,sha256=MoJVp2D-JUPoORDvNhGt-2dgBstPLZ4nyPToIuqIAg4,6287
16
- mapillary_tools/http.py,sha256=-df_oGyImO2AOmPnXcKMcztlL4LOZLArE6ki81NMGUA,6411
17
- mapillary_tools/ipc.py,sha256=DwWQb9hNshx0bg0Fo5NjY0mXjs-FkbR6tIQmjMgMtmg,1089
18
- mapillary_tools/process_geotag_properties.py,sha256=3EaVvjfKB-O38OjopBcxeEdP6qI5IPIxqmO6isjcXKM,14205
19
- mapillary_tools/process_sequence_properties.py,sha256=n4VjQHrgVjksIr3WoBviRhrQIBBDHGXMClolfyz6tu4,24057
20
- mapillary_tools/sample_video.py,sha256=pKSj1Vc8e5p1XGjykBuKY9XieTOskc-9L3F4L407jDM,13935
21
- mapillary_tools/store.py,sha256=dA1D0afDvhVm0MYEI1yA5FfqjQM5etYK4pcfMc4nKAU,4077
22
- mapillary_tools/telemetry.py,sha256=lL6qQbtOZft4DZZrCNK3njlwHT_30zLyYS_YRN5pgHY,1568
23
- mapillary_tools/types.py,sha256=pIU2wcxiOUWT5Pd05pgNzY9EVEDlwoldtlF2IIYYvE0,5909
24
- mapillary_tools/upload.py,sha256=XejAgmVW4Y33MiQ2g-shvHZA_zXTekEsOUHUHNx2AE4,24047
25
- mapillary_tools/upload_api_v4.py,sha256=VgOf7RhfUuzmlSBUp5CpekKIJ0xQrC0r-r0Ds9-wU4I,7344
26
- mapillary_tools/uploader.py,sha256=T2BNlncuFibg5RJ7c2qweUXDAg6-zYc-rdgbV_JEKDU,46636
27
- mapillary_tools/utils.py,sha256=HjTZ01GQv_UNGySaTZ_Mc1Gn_Y0x3knQf7Vh17whDFw,8108
28
- mapillary_tools/camm/camm_builder.py,sha256=ub6Z9ijep8zAo1NOlU51Gxk95kQ2vfN58YgVCLmNMRk,9211
29
- mapillary_tools/camm/camm_parser.py,sha256=aNHP65hNXYQBWBTfhaj_S5XYzmAHhjwcAfGhbm83__o,18043
30
- mapillary_tools/commands/__init__.py,sha256=41CFrPLGlG3566uhxssEF3TGAtSpADFPPcDMHbViU0E,171
31
- mapillary_tools/commands/__main__.py,sha256=W4jMlCA1jekytKA9MMn3mhKie2jgRhc00ylOY2lCxiw,4835
32
- mapillary_tools/commands/authenticate.py,sha256=yqtpHMYzkyBrrchj6MARxB0ywUTfqCEOPkMbkyaO9Ks,1344
33
- mapillary_tools/commands/process.py,sha256=Japc6_P0B_8HzoM8_82P3_YAiyBBaQZXS9TZF46pbMM,9771
34
- mapillary_tools/commands/process_and_upload.py,sha256=-RB_86a5xKfQ7Ye79dh6yyJQpZg2xnJZAWOJsUNbUtQ,1041
35
- mapillary_tools/commands/sample_video.py,sha256=jtnrZrsqqv5eYV1chNTas7RhfbeKBqbAUDUNRFjF01w,3253
36
- mapillary_tools/commands/upload.py,sha256=Z06YJ_mZKiBQ1zLojGf6I5t1X4YBcK19sHD-9C0gdXM,3100
37
- mapillary_tools/commands/video_process.py,sha256=-wQeeIwWXPmy81HQHam5A0huMLRHknkEFa_V1OwElU4,890
38
- mapillary_tools/commands/video_process_and_upload.py,sha256=hOyq9L9TuD0JcqFSOOxdCdgsBA1iJ6fu1TtDbsUr8sI,1088
39
- mapillary_tools/commands/zip.py,sha256=DVQuMLpbstwiy5o4pU_fBvM6eORuFjLeySd80AhHKU0,991
40
- mapillary_tools/geotag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- mapillary_tools/geotag/base.py,sha256=GVKorhJcTivvakcUfPzR6KMzRoIK1pxknDlLDqY2XUk,5166
42
- mapillary_tools/geotag/factory.py,sha256=6CNQRTr9HTmOA65Iz09CVlGJCGdzOeS0sx5QZO_DXPY,10271
43
- mapillary_tools/geotag/geotag_images_from_exif.py,sha256=a5fDOp4tlEoVNwrOCJBrvSPzu1LbyxL4RNrNDD0tPP0,608
44
- mapillary_tools/geotag/geotag_images_from_exiftool.py,sha256=T_IOWgvieqCpfDUdma7K3qmAilme-wdjYrD4lSOdAM4,5707
45
- mapillary_tools/geotag/geotag_images_from_gpx.py,sha256=EyhJjpP1L_DPRCX926aKeTvuxFxD-eWVCWgELp0-pzY,6313
46
- mapillary_tools/geotag/geotag_images_from_gpx_file.py,sha256=HYQkwak32YBDuRrTNiIZOmE3iImCRc22HWWb485WRS4,1121
47
- mapillary_tools/geotag/geotag_images_from_nmea_file.py,sha256=J8xj6ch9bMPRubJtsRGeb3sb9LyB0ZYy65NPEOVkUe8,1597
48
- mapillary_tools/geotag/geotag_images_from_video.py,sha256=3NV3-NfSkxT0n_n8Ajqjab24x29H2vL98DpwJqnIvT8,4411
49
- mapillary_tools/geotag/geotag_videos_from_exiftool.py,sha256=Splhtv21JvrbFPVuKycf5wen0wOJ0zqOWk8d4aSw-ys,5345
50
- mapillary_tools/geotag/geotag_videos_from_gpx.py,sha256=IoV7asxl7dojF1lftvohm1jK_LboFg_mBz25GiV_CsY,1653
51
- mapillary_tools/geotag/geotag_videos_from_video.py,sha256=T8XS4lVF2Wz4eDXNi5Vt076M5dxjxJXibVrWhqVvErs,863
52
- mapillary_tools/geotag/options.py,sha256=AgINCSBlxT9Etfu05zuzunWgcCHVWdFjWVL7oBduL4g,5166
53
- mapillary_tools/geotag/utils.py,sha256=tixXiN3uda2HuMnuXVu4xapgoSzZ86kNlJJQ66QERk0,1588
54
- mapillary_tools/geotag/image_extractors/base.py,sha256=XoNrLCbJtd-MN-snbhv6zyr6zBfJRoJkntV0ptrh6qg,358
55
- mapillary_tools/geotag/image_extractors/exif.py,sha256=cCUegbFqWxjAP4oOP1nZmwoJISWeKgjGO8h_t7nucHs,2079
56
- mapillary_tools/geotag/image_extractors/exiftool.py,sha256=zokJmf-D2rPvASRJs3dZzEu7j82igpMOr4SE6Z1nsVg,497
57
- mapillary_tools/geotag/video_extractors/base.py,sha256=KxyKxoh_mV-XBnJq3dSzNEt2rQqZAKjmS3GazsdYbnc,350
58
- mapillary_tools/geotag/video_extractors/exiftool.py,sha256=mH9arsWBaArYhNMxnrRpoEa3YrMjSpCiZaz-baJRMCo,2305
59
- mapillary_tools/geotag/video_extractors/gpx.py,sha256=1JDuGLgp3wpaAqfq3ln4DMsVt820dK5HZ3VfJnok98c,3823
60
- mapillary_tools/geotag/video_extractors/native.py,sha256=_xmTQ6nrvdwkadMmIxrhw6rvGTGwQVmrdSkYLhhV1SM,5786
61
- mapillary_tools/gpmf/gpmf_gps_filter.py,sha256=7cg8wEjC1DrujKY76FZguXsaPqTRkG9-t32OeuOJQIc,2755
62
- mapillary_tools/gpmf/gpmf_parser.py,sha256=uOVXkwJxC3Y2YfTdzUDpt7Bh0pdVqa5u0WUuv7pEJEs,24670
63
- mapillary_tools/gpmf/gps_filter.py,sha256=zhXkuvr0Dd1bxGTYBwvk6P7xasY_RLuWjHaX7CdBayc,3796
64
- mapillary_tools/mp4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
65
- mapillary_tools/mp4/construct_mp4_parser.py,sha256=jS8fOgSByqieXA6C5ZqobaI0bK17U_YAkiWEUK_8j4E,17286
66
- mapillary_tools/mp4/io_utils.py,sha256=KZaJTlgFS27Oh3pcA5MKXYFoCifqgFaEZJyU6lb1jc4,5416
67
- mapillary_tools/mp4/mp4_sample_parser.py,sha256=0ILTq8M6mXFTI3agKgljpvO9uYa7HXGUGZpdHT8a6ac,11547
68
- mapillary_tools/mp4/simple_mp4_builder.py,sha256=9TUGk1hzI6mQFN1P30jwHL3dCYz3Zz7rsm8UBvMAqMc,12734
69
- mapillary_tools/mp4/simple_mp4_parser.py,sha256=g3vvPhBoNu7anhVzC5_XQCV7IwfRWro1vJ6d6GyDkHE,6315
70
- mapillary_tools/serializer/description.py,sha256=ECnQxC-1LOgkAKE5qFi9Y2KuCeH8KPUjjNFDiwebjvo,18647
71
- mapillary_tools/serializer/gpx.py,sha256=_xx6gHjaWHrlXaUpB5GGBrbRKzbExFyIzWWAH-CvksI,4383
72
- mapillary_tools-0.14.4.dist-info/licenses/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
73
- mapillary_tools-0.14.4.dist-info/METADATA,sha256=DmtexHTWyoTovIswRtvkT638DbdPNXcfVfPcaCflu4w,22200
74
- mapillary_tools-0.14.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
- mapillary_tools-0.14.4.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
76
- mapillary_tools-0.14.4.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
77
- mapillary_tools-0.14.4.dist-info/RECORD,,