mapillary-tools 0.13.3__py3-none-any.whl → 0.14.0a1__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 (64) hide show
  1. mapillary_tools/__init__.py +1 -1
  2. mapillary_tools/api_v4.py +106 -7
  3. mapillary_tools/authenticate.py +325 -64
  4. mapillary_tools/{geotag/blackvue_parser.py → blackvue_parser.py} +74 -54
  5. mapillary_tools/camm/camm_builder.py +55 -97
  6. mapillary_tools/camm/camm_parser.py +425 -177
  7. mapillary_tools/commands/__main__.py +2 -0
  8. mapillary_tools/commands/authenticate.py +8 -1
  9. mapillary_tools/commands/process.py +27 -51
  10. mapillary_tools/commands/process_and_upload.py +18 -5
  11. mapillary_tools/commands/sample_video.py +2 -3
  12. mapillary_tools/commands/upload.py +18 -9
  13. mapillary_tools/commands/video_process_and_upload.py +19 -5
  14. mapillary_tools/config.py +28 -12
  15. mapillary_tools/constants.py +46 -4
  16. mapillary_tools/exceptions.py +34 -35
  17. mapillary_tools/exif_read.py +158 -53
  18. mapillary_tools/exiftool_read.py +19 -5
  19. mapillary_tools/exiftool_read_video.py +12 -1
  20. mapillary_tools/exiftool_runner.py +77 -0
  21. mapillary_tools/geo.py +148 -107
  22. mapillary_tools/geotag/factory.py +298 -0
  23. mapillary_tools/geotag/geotag_from_generic.py +152 -11
  24. mapillary_tools/geotag/geotag_images_from_exif.py +43 -124
  25. mapillary_tools/geotag/geotag_images_from_exiftool.py +66 -70
  26. mapillary_tools/geotag/geotag_images_from_exiftool_both_image_and_video.py +32 -48
  27. mapillary_tools/geotag/geotag_images_from_gpx.py +41 -116
  28. mapillary_tools/geotag/geotag_images_from_gpx_file.py +15 -96
  29. mapillary_tools/geotag/geotag_images_from_nmea_file.py +4 -2
  30. mapillary_tools/geotag/geotag_images_from_video.py +46 -46
  31. mapillary_tools/geotag/geotag_videos_from_exiftool_video.py +98 -92
  32. mapillary_tools/geotag/geotag_videos_from_gpx.py +140 -0
  33. mapillary_tools/geotag/geotag_videos_from_video.py +149 -181
  34. mapillary_tools/geotag/options.py +159 -0
  35. mapillary_tools/{geotag → gpmf}/gpmf_parser.py +194 -171
  36. mapillary_tools/history.py +3 -11
  37. mapillary_tools/mp4/io_utils.py +0 -1
  38. mapillary_tools/mp4/mp4_sample_parser.py +11 -3
  39. mapillary_tools/mp4/simple_mp4_parser.py +0 -10
  40. mapillary_tools/process_geotag_properties.py +151 -386
  41. mapillary_tools/process_sequence_properties.py +554 -202
  42. mapillary_tools/sample_video.py +8 -15
  43. mapillary_tools/telemetry.py +24 -12
  44. mapillary_tools/types.py +80 -22
  45. mapillary_tools/upload.py +311 -261
  46. mapillary_tools/upload_api_v4.py +55 -95
  47. mapillary_tools/uploader.py +396 -254
  48. mapillary_tools/utils.py +26 -0
  49. mapillary_tools/video_data_extraction/extract_video_data.py +17 -36
  50. mapillary_tools/video_data_extraction/extractors/blackvue_parser.py +34 -19
  51. mapillary_tools/video_data_extraction/extractors/camm_parser.py +41 -17
  52. mapillary_tools/video_data_extraction/extractors/exiftool_runtime_parser.py +4 -1
  53. mapillary_tools/video_data_extraction/extractors/exiftool_xml_parser.py +1 -2
  54. mapillary_tools/video_data_extraction/extractors/gopro_parser.py +37 -22
  55. {mapillary_tools-0.13.3.dist-info → mapillary_tools-0.14.0a1.dist-info}/METADATA +3 -2
  56. mapillary_tools-0.14.0a1.dist-info/RECORD +78 -0
  57. {mapillary_tools-0.13.3.dist-info → mapillary_tools-0.14.0a1.dist-info}/WHEEL +1 -1
  58. mapillary_tools/geotag/utils.py +0 -26
  59. mapillary_tools-0.13.3.dist-info/RECORD +0 -75
  60. /mapillary_tools/{geotag → gpmf}/gpmf_gps_filter.py +0 -0
  61. /mapillary_tools/{geotag → gpmf}/gps_filter.py +0 -0
  62. {mapillary_tools-0.13.3.dist-info → mapillary_tools-0.14.0a1.dist-info}/entry_points.txt +0 -0
  63. {mapillary_tools-0.13.3.dist-info → mapillary_tools-0.14.0a1.dist-info/licenses}/LICENSE +0 -0
  64. {mapillary_tools-0.13.3.dist-info → mapillary_tools-0.14.0a1.dist-info}/top_level.txt +0 -0
mapillary_tools/utils.py CHANGED
@@ -1,6 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import hashlib
2
4
  import os
3
5
  import typing as T
6
+ from multiprocessing import Pool
4
7
  from pathlib import Path
5
8
 
6
9
 
@@ -194,3 +197,26 @@ def find_xml_files(import_paths: T.Sequence[Path]) -> T.List[Path]:
194
197
 
195
198
  def get_file_size(path: Path) -> int:
196
199
  return os.path.getsize(path)
200
+
201
+
202
+ TMapIn = T.TypeVar("TMapIn")
203
+ TMapOut = T.TypeVar("TMapOut")
204
+
205
+
206
+ def mp_map_maybe(
207
+ func: T.Callable[[TMapIn], TMapOut],
208
+ iterable: T.Iterable[TMapIn],
209
+ num_processes: int | None = None,
210
+ ) -> T.Generator[TMapOut, None, None]:
211
+ if num_processes is None:
212
+ pool_num_processes = None
213
+ disable_multiprocessing = False
214
+ else:
215
+ pool_num_processes = max(num_processes, 1)
216
+ disable_multiprocessing = num_processes <= 0
217
+
218
+ if disable_multiprocessing:
219
+ yield from map(func, iterable)
220
+ else:
221
+ with Pool(processes=pool_num_processes) as pool:
222
+ yield from pool.imap(func, iterable)
@@ -1,20 +1,15 @@
1
+ from __future__ import annotations
2
+
1
3
  import logging
2
4
  import typing as T
3
- from multiprocessing import Pool
4
5
  from pathlib import Path
5
6
 
6
7
  import tqdm
7
8
 
8
9
  from .. import exceptions, geo, utils
9
- from ..geotag import gpmf_gps_filter, utils as video_utils
10
+ from ..gpmf import gpmf_gps_filter
10
11
  from ..telemetry import GPSPoint
11
- from ..types import (
12
- ErrorMetadata,
13
- FileType,
14
- MetadataOrError,
15
- VideoMetadata,
16
- VideoMetadataOrError,
17
- )
12
+ from ..types import ErrorMetadata, FileType, VideoMetadata, VideoMetadataOrError
18
13
  from . import video_data_parser_factory
19
14
  from .cli_options import CliOptions
20
15
  from .extractors.base_parser import BaseParser
@@ -29,30 +24,25 @@ class VideoDataExtractor:
29
24
  def __init__(self, options: CliOptions) -> None:
30
25
  self.options = options
31
26
 
32
- def process(self) -> T.List[MetadataOrError]:
27
+ def process(self) -> T.List[VideoMetadataOrError]:
33
28
  paths = self.options["paths"]
34
29
  self._check_paths(paths)
35
30
  video_files = utils.find_videos(paths)
36
31
  self._check_sources_cardinality(video_files)
37
32
 
38
- num_processes = self.options["num_processes"] or None
39
- with Pool(processes=num_processes) as pool:
40
- if num_processes == 1:
41
- iter: T.Iterator[VideoMetadataOrError] = map(
42
- self.process_file, video_files
43
- )
44
- else:
45
- iter = pool.imap(self.process_file, video_files)
46
-
47
- video_metadata_or_errors = list(
48
- tqdm.tqdm(
49
- iter,
50
- desc="Extracting GPS tracks",
51
- unit="videos",
52
- disable=LOG.getEffectiveLevel() <= logging.DEBUG,
53
- total=len(video_files),
54
- )
33
+ map_results = utils.mp_map_maybe(
34
+ self.process_file, video_files, num_processes=self.options["num_processes"]
35
+ )
36
+
37
+ video_metadata_or_errors: list[VideoMetadataOrError] = list(
38
+ tqdm.tqdm(
39
+ map_results,
40
+ desc="Extracting GPS tracks",
41
+ unit="videos",
42
+ disable=LOG.getEffectiveLevel() <= logging.DEBUG,
43
+ total=len(video_files),
55
44
  )
45
+ )
56
46
 
57
47
  return video_metadata_or_errors
58
48
 
@@ -91,13 +81,11 @@ class VideoDataExtractor:
91
81
  video_metadata = VideoMetadata(
92
82
  filename=file,
93
83
  filetype=FileType.VIDEO,
94
- md5sum=None,
95
84
  filesize=utils.get_file_size(file),
96
85
  points=points,
97
86
  make=make,
98
87
  model=model,
99
88
  )
100
- video_metadata.update_md5sum()
101
89
  return video_metadata
102
90
  else:
103
91
  return ErrorMetadata(
@@ -166,11 +154,4 @@ class VideoDataExtractor:
166
154
  if not points:
167
155
  raise exceptions.MapillaryGPSNoiseError("GPS is too noisy")
168
156
 
169
- stationary = video_utils.is_video_stationary(
170
- geo.get_max_distance_from_start([(p.lat, p.lon) for p in points])
171
- )
172
-
173
- if stationary:
174
- raise exceptions.MapillaryStationaryVideoError("Stationary video")
175
-
176
157
  return points
@@ -1,8 +1,10 @@
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+
1
5
  import typing as T
2
6
 
3
- from ... import geo
4
- from ...geotag import blackvue_parser
5
- from ...mp4 import simple_mp4_parser as sparser
7
+ from ... import blackvue_parser, geo
6
8
  from .base_parser import BaseParser
7
9
 
8
10
 
@@ -13,22 +15,35 @@ class BlackVueParser(BaseParser):
13
15
 
14
16
  pointsFound: bool = False
15
17
 
16
- def extract_points(self) -> T.Sequence[geo.Point]:
18
+ @functools.cached_property
19
+ def extract_blackvue_info(self) -> blackvue_parser.BlackVueInfo | None:
17
20
  source_path = self.geotag_source_path
18
21
  if not source_path:
19
- return []
22
+ return None
23
+
20
24
  with source_path.open("rb") as fp:
21
- try:
22
- points = blackvue_parser.extract_points(fp) or []
23
- self.pointsFound = len(points) > 0
24
- return points
25
- except sparser.ParsingError:
26
- return []
27
-
28
- def extract_make(self) -> T.Optional[str]:
29
- # If no points were found, assume this is not a BlackVue
30
- return "Blackvue" if self.pointsFound else None
31
-
32
- def extract_model(self) -> T.Optional[str]:
33
- with self.videoPath.open("rb") as fp:
34
- return blackvue_parser.extract_camera_model(fp) or None
25
+ return blackvue_parser.extract_blackvue_info(fp)
26
+
27
+ def extract_points(self) -> T.Sequence[geo.Point]:
28
+ blackvue_info = self.extract_blackvue_info
29
+
30
+ if blackvue_info is None:
31
+ return []
32
+
33
+ return blackvue_info.gps or []
34
+
35
+ def extract_make(self) -> str | None:
36
+ blackvue_info = self.extract_blackvue_info
37
+
38
+ if blackvue_info is None:
39
+ return None
40
+
41
+ return blackvue_info.make
42
+
43
+ def extract_model(self) -> str | None:
44
+ blackvue_info = self.extract_blackvue_info
45
+
46
+ if blackvue_info is None:
47
+ return None
48
+
49
+ return blackvue_info.model
@@ -1,4 +1,5 @@
1
- import functools
1
+ from __future__ import annotations
2
+
2
3
  import typing as T
3
4
 
4
5
  from ... import geo
@@ -12,27 +13,50 @@ class CammParser(BaseParser):
12
13
  must_rebase_times_to_zero = False
13
14
  parser_label = "camm"
14
15
 
15
- @functools.cached_property
16
- def _camera_info(self) -> T.Tuple[str, str]:
17
- source_path = self.geotag_source_path
18
- if not source_path:
19
- return "", ""
16
+ _extracted: bool = False
17
+ _cached_camm_info: camm_parser.CAMMInfo | None = None
20
18
 
21
- with source_path.open("rb") as fp:
22
- return camm_parser.extract_camera_make_and_model(fp)
19
+ # TODO: use @functools.cached_property
20
+ def _extract_camm_info(self) -> camm_parser.CAMMInfo | None:
21
+ if self._extracted:
22
+ return self._cached_camm_info
23
+
24
+ self._extracted = True
23
25
 
24
- def extract_points(self) -> T.Sequence[geo.Point]:
25
26
  source_path = self.geotag_source_path
26
- if not source_path:
27
- return []
27
+
28
+ if source_path is None:
29
+ # source_path not found
30
+ return None
31
+
28
32
  with source_path.open("rb") as fp:
29
33
  try:
30
- return camm_parser.extract_points(fp) or []
34
+ self._cached_camm_info = camm_parser.extract_camm_info(fp)
31
35
  except sparser.ParsingError:
32
- return []
36
+ self._cached_camm_info = None
37
+
38
+ return self._cached_camm_info
39
+
40
+ def extract_points(self) -> T.Sequence[geo.Point]:
41
+ camm_info = self._extract_camm_info()
42
+
43
+ if camm_info is None:
44
+ return []
45
+
46
+ return T.cast(T.List[geo.Point], camm_info.gps or camm_info.mini_gps)
47
+
48
+ def extract_make(self) -> str | None:
49
+ camm_info = self._extract_camm_info()
50
+
51
+ if camm_info is None:
52
+ return None
53
+
54
+ return camm_info.make
55
+
56
+ def extract_model(self) -> str | None:
57
+ camm_info = self._extract_camm_info()
33
58
 
34
- def extract_make(self) -> T.Optional[str]:
35
- return self._camera_info[0] or None
59
+ if camm_info is None:
60
+ return None
36
61
 
37
- def extract_model(self) -> T.Optional[str]:
38
- return self._camera_info[1] or None
62
+ return camm_info.model
@@ -24,7 +24,10 @@ class ExiftoolRuntimeParser(BaseParser):
24
24
  self, video_path: Path, options: CliOptions, parser_options: CliParserOptions
25
25
  ):
26
26
  super().__init__(video_path, options, parser_options)
27
- exiftool_path = shutil.which(constants.EXIFTOOL_PATH)
27
+ if constants.EXIFTOOL_PATH is None:
28
+ exiftool_path = shutil.which("exiftool")
29
+ else:
30
+ exiftool_path = shutil.which(constants.EXIFTOOL_PATH)
28
31
 
29
32
  if not exiftool_path:
30
33
  raise exceptions.MapillaryExiftoolNotFoundError(
@@ -4,9 +4,8 @@ import xml.etree.ElementTree as ET
4
4
  from pathlib import Path
5
5
 
6
6
  from ... import geo
7
- from ...exiftool_read import EXIFTOOL_NAMESPACES
7
+ from ...exiftool_read import _DESCRIPTION_TAG, EXIFTOOL_NAMESPACES
8
8
  from ...exiftool_read_video import ExifToolReadVideo
9
- from ...geotag.geotag_videos_from_exiftool_video import _DESCRIPTION_TAG
10
9
  from ..cli_options import CliOptions, CliParserOptions
11
10
  from .base_parser import BaseParser
12
11
 
@@ -1,7 +1,9 @@
1
+ from __future__ import annotations
2
+
1
3
  import typing as T
2
4
 
3
5
  from ... import geo
4
- from ...geotag import gpmf_parser
6
+ from ...gpmf import gpmf_parser
5
7
  from ...mp4 import simple_mp4_parser as sparser
6
8
  from .base_parser import BaseParser
7
9
 
@@ -11,33 +13,46 @@ class GoProParser(BaseParser):
11
13
  must_rebase_times_to_zero = False
12
14
  parser_label = "gopro"
13
15
 
14
- pointsFound: bool = False
16
+ _extracted: bool = False
17
+ _cached_gopro_info: gpmf_parser.GoProInfo | None = None
18
+
19
+ def _extract_gopro_info(self) -> gpmf_parser.GoProInfo | None:
20
+ if self._extracted:
21
+ return self._cached_gopro_info
22
+
23
+ self._extracted = True
15
24
 
16
- def extract_points(self) -> T.Sequence[geo.Point]:
17
25
  source_path = self.geotag_source_path
18
- if not source_path:
19
- return []
26
+
27
+ if source_path is None:
28
+ # source_path not found
29
+ return None
30
+
20
31
  with source_path.open("rb") as fp:
21
32
  try:
22
- points = gpmf_parser.extract_points(fp) or []
23
- self.pointsFound = len(points) > 0
24
- return points
33
+ self._cached_gopro_info = gpmf_parser.extract_gopro_info(fp)
25
34
  except sparser.ParsingError:
26
- return []
35
+ self._cached_gopro_info = None
27
36
 
28
- def extract_make(self) -> T.Optional[str]:
29
- model = self.extract_model()
30
- if model:
31
- return "GoPro"
37
+ return self._cached_gopro_info
32
38
 
33
- # make sure self.pointsFound is updated
34
- _ = self.extract_points()
35
- # If no points were found, assume this is not a GoPro
36
- return "GoPro" if self.pointsFound else None
39
+ def extract_points(self) -> T.Sequence[geo.Point]:
40
+ gopro_info = self._extract_gopro_info()
41
+ if gopro_info is None:
42
+ return []
37
43
 
38
- def extract_model(self) -> T.Optional[str]:
39
- source_path = self.geotag_source_path
40
- if not source_path:
44
+ return T.cast(T.Sequence[geo.Point], gopro_info.gps)
45
+
46
+ def extract_make(self) -> str | None:
47
+ gopro_info = self._extract_gopro_info()
48
+ if gopro_info is None:
41
49
  return None
42
- with source_path.open("rb") as fp:
43
- return gpmf_parser.extract_camera_model(fp) or None
50
+
51
+ return gopro_info.make
52
+
53
+ def extract_model(self) -> str | None:
54
+ gopro_info = self._extract_gopro_info()
55
+ if gopro_info is None:
56
+ return None
57
+
58
+ return gopro_info.model
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: mapillary_tools
3
- Version: 0.13.3
3
+ Version: 0.14.0a1
4
4
  Summary: Mapillary Image/Video Import Pipeline
5
5
  Home-page: https://github.com/mapillary/mapillary_tools
6
6
  Author: Mapillary
@@ -23,6 +23,7 @@ Dynamic: description
23
23
  Dynamic: description-content-type
24
24
  Dynamic: home-page
25
25
  Dynamic: license
26
+ Dynamic: license-file
26
27
  Dynamic: requires-dist
27
28
  Dynamic: requires-python
28
29
  Dynamic: summary
@@ -0,0 +1,78 @@
1
+ mapillary_tools/__init__.py,sha256=QLNHmol7wzyKCCv_FiGax8HmQcDUu0qcI16mFQJqGPw,21
2
+ mapillary_tools/api_v4.py,sha256=jAuhmWDSeP06dK-D2Wm-jDbDb317q3028q_LeTBf0_s,10117
3
+ mapillary_tools/authenticate.py,sha256=KG3p_7D4D7nUvrGRLGp56_ogLy7JUHzkGSpBw8V70LY,11091
4
+ mapillary_tools/blackvue_parser.py,sha256=Gmz3M1cvBmB2W3Pme6x3w2yuixDpKiTOkQe82iPXr2s,3613
5
+ mapillary_tools/config.py,sha256=-s_cfpS3sOgtAydmElRDjOh5mNFCj8DxOxoxDc1ubPE,2624
6
+ mapillary_tools/constants.py,sha256=D0_SP1Zaa7ovGkPkTwuxXLqOauU6fH-WrnyOZs-V_RM,3791
7
+ mapillary_tools/exceptions.py,sha256=I6mmz_OvnHppu9eDJvluBXU3G8b4sqAb-rP8yyPDA2g,2404
8
+ mapillary_tools/exif_read.py,sha256=CtdDOOOhaqp9icaXAfMlvZKaFO2GjHwGvsvatmCjwu8,32500
9
+ mapillary_tools/exif_write.py,sha256=3PawLnBOY8Z86TYiA_F4LxRhe5Ui6CTNhxYm9yeJNX8,8786
10
+ mapillary_tools/exiftool_read.py,sha256=qjhL_JUNwZE7EIvJkmH8PLFzUpeTmnmuqcDU3VLXh5o,16632
11
+ mapillary_tools/exiftool_read_video.py,sha256=7GoCiy-YL9sdMquoLzh2SZF4J3eIxr0K4_MXOBQYC6U,14875
12
+ mapillary_tools/exiftool_runner.py,sha256=J04V0Y70kTiGE2q2m5TKWfORd0hmYNmAsmrZxb34S3s,2316
13
+ mapillary_tools/ffmpeg.py,sha256=p1a5VxlbpLGLkzulMv51bpyD5omwK7Qg8277TGYmcZA,15780
14
+ mapillary_tools/geo.py,sha256=6t6EVtAOgHvzz6XGvxR3wCtE1NnpcE2XH-fuuAwgvKk,11136
15
+ mapillary_tools/history.py,sha256=VCrN-TXZMhGRUyL8hEGRSDsz7uliMyvFR6T5FXtXm5k,1620
16
+ mapillary_tools/ipc.py,sha256=DwWQb9hNshx0bg0Fo5NjY0mXjs-FkbR6tIQmjMgMtmg,1089
17
+ mapillary_tools/process_geotag_properties.py,sha256=H9AvrTWh-3uWyJAn0RmQY63dIVQlWPLMP5xGnblXqvk,13949
18
+ mapillary_tools/process_sequence_properties.py,sha256=dOdjZOZB8BY_foQlQqQ5NmsdlqePQL-Ca5qg5SHLZZc,23442
19
+ mapillary_tools/sample_video.py,sha256=RyUgpdpV3-nmCRo1o5rPVAWvnvNI5_o-BIaenJKvyAg,13908
20
+ mapillary_tools/telemetry.py,sha256=FQNSP2qCbLWPJsqF7aN6iS0_hueDrvRXrJOf_JBEXoI,1571
21
+ mapillary_tools/types.py,sha256=zaaW7kg_io67xUPrQoNbHe21p0YRZP85BqWiH_L2GrU,23479
22
+ mapillary_tools/upload.py,sha256=exQeEh3jpys94k-3QDT-4xoeJ_lAHbQBoy749hbPfnA,24878
23
+ mapillary_tools/upload_api_v4.py,sha256=dTEpQDnV11TyPf5hefd-FVeEfw7WEVYyZcIUJttUEp0,6417
24
+ mapillary_tools/uploader.py,sha256=xPEszuXlgcgCklGfsgL8qN1ozsFuU4rLT4jocMD2dVI,18694
25
+ mapillary_tools/utils.py,sha256=zm8ndI7wWrBWVll5HuI7G5QqKJ7fY9llM0T2l4Ywoto,6679
26
+ mapillary_tools/camm/camm_builder.py,sha256=ub6Z9ijep8zAo1NOlU51Gxk95kQ2vfN58YgVCLmNMRk,9211
27
+ mapillary_tools/camm/camm_parser.py,sha256=Rf29dHyMzaXiXMmetoR4fTS1MTtLmSylfj4QmMeDGi8,18053
28
+ mapillary_tools/commands/__init__.py,sha256=41CFrPLGlG3566uhxssEF3TGAtSpADFPPcDMHbViU0E,171
29
+ mapillary_tools/commands/__main__.py,sha256=CPSShHJJniNA8sZYmk2lG8bGtrDsixw-BAW1etwUk00,5067
30
+ mapillary_tools/commands/authenticate.py,sha256=yqtpHMYzkyBrrchj6MARxB0ywUTfqCEOPkMbkyaO9Ks,1344
31
+ mapillary_tools/commands/process.py,sha256=Japc6_P0B_8HzoM8_82P3_YAiyBBaQZXS9TZF46pbMM,9771
32
+ mapillary_tools/commands/process_and_upload.py,sha256=-RB_86a5xKfQ7Ye79dh6yyJQpZg2xnJZAWOJsUNbUtQ,1041
33
+ mapillary_tools/commands/sample_video.py,sha256=jtnrZrsqqv5eYV1chNTas7RhfbeKBqbAUDUNRFjF01w,3253
34
+ mapillary_tools/commands/upload.py,sha256=YnA1iSvNcFeV7kMs1p4TdaPBUWUFYb7X-vFhQeSz0eI,2005
35
+ mapillary_tools/commands/video_process.py,sha256=-wQeeIwWXPmy81HQHam5A0huMLRHknkEFa_V1OwElU4,890
36
+ mapillary_tools/commands/video_process_and_upload.py,sha256=hOyq9L9TuD0JcqFSOOxdCdgsBA1iJ6fu1TtDbsUr8sI,1088
37
+ mapillary_tools/commands/zip.py,sha256=DVQuMLpbstwiy5o4pU_fBvM6eORuFjLeySd80AhHKU0,991
38
+ mapillary_tools/geotag/__init__.py,sha256=ohud7lLsqO1b9ddCF0SjrNOcUcRdQzNVR43RkcVVLAc,33
39
+ mapillary_tools/geotag/factory.py,sha256=M1xTeoGGk0xLgjzUmlElhnWeuCUDiy0jSpRrElljHeI,9814
40
+ mapillary_tools/geotag/geotag_from_generic.py,sha256=mk1R8ZaYFEnTlk-AitdGROdo4Bj8TXHIgoEtQZY1BdM,4901
41
+ mapillary_tools/geotag/geotag_images_from_exif.py,sha256=UvIsHjEkGQMlEA__wSTcep0jPKxfMm46DCH_pWhs9O8,2216
42
+ mapillary_tools/geotag/geotag_images_from_exiftool.py,sha256=J0lkEQvPId0CdDX7P-8OORCTe2ZcZBCarzstA88CSc4,3566
43
+ mapillary_tools/geotag/geotag_images_from_exiftool_both_image_and_video.py,sha256=7lcvRCih3sVdYXvxZOlP05gZd7fAe0GIUlk8tT6G9gA,2593
44
+ mapillary_tools/geotag/geotag_images_from_gpx.py,sha256=Za7_o8ZTCvijtKyFRZRK4diTqSdRZI7wE3QldEWVAIo,6193
45
+ mapillary_tools/geotag/geotag_images_from_gpx_file.py,sha256=qySMYrHexE31xeJJJCqiGzE13BE6LslpeLUNBfwXzA4,1953
46
+ mapillary_tools/geotag/geotag_images_from_nmea_file.py,sha256=_WizWxlbt5eIguGJKqlKNZM-eLNDCcsDXHUitMlFrx4,1680
47
+ mapillary_tools/geotag/geotag_images_from_video.py,sha256=2FZDbrYKXFzuUALH_QunIL8mQuOPTk3BTv3Cq2TR6oI,3114
48
+ mapillary_tools/geotag/geotag_videos_from_exiftool_video.py,sha256=5AWDQuGV7U0szOCQ3BIeZW0brUl_F8ks0ymcXBTN8H8,5178
49
+ mapillary_tools/geotag/geotag_videos_from_gpx.py,sha256=Q57lgqpvPdXzyvSfnNhTi9ZtuvEwX-Zti9khCzVFteE,4724
50
+ mapillary_tools/geotag/geotag_videos_from_video.py,sha256=A2buI4iGSaceujzCjGLH7p7OzEALlWs5NOqrvBvYhGE,6060
51
+ mapillary_tools/geotag/options.py,sha256=JaRWnDMZIGsh5Wt_nhfWrBgwg-V5SuGc61gg_RehhlI,4291
52
+ mapillary_tools/gpmf/gpmf_gps_filter.py,sha256=7cg8wEjC1DrujKY76FZguXsaPqTRkG9-t32OeuOJQIc,2755
53
+ mapillary_tools/gpmf/gpmf_parser.py,sha256=aj9IT2BUDZpFXs0Jpoz5wVEss-p71GoNTWz4bk_N5jA,24732
54
+ mapillary_tools/gpmf/gps_filter.py,sha256=4CPL8glxdzPWIbfGPPgyqMLyiZFt-djce5vhiFPuZB8,3766
55
+ mapillary_tools/mp4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
56
+ mapillary_tools/mp4/construct_mp4_parser.py,sha256=31oJbg6umKJjdZ0Ni5eCudC0lXd0Y-K_EiCCj6yW9js,17199
57
+ mapillary_tools/mp4/io_utils.py,sha256=KZaJTlgFS27Oh3pcA5MKXYFoCifqgFaEZJyU6lb1jc4,5416
58
+ mapillary_tools/mp4/mp4_sample_parser.py,sha256=vqpURHJZ-DRhwccdwKYCDTrOQNN70LCWqLFEPuGZLTc,11586
59
+ mapillary_tools/mp4/simple_mp4_builder.py,sha256=7zVepmW-2SwoAeA-fvucmBW94jlcCFExDcEg8P3TOGY,12727
60
+ mapillary_tools/mp4/simple_mp4_parser.py,sha256=M5e2MuUUIfo1rUarX_VJl65LRVKjk842SmwNA-OJtYI,6326
61
+ mapillary_tools/video_data_extraction/cli_options.py,sha256=N0uHi9Uzaw1C8N-PE3yu8J3uEQP3HvSjJ9AZbIqoREg,535
62
+ mapillary_tools/video_data_extraction/extract_video_data.py,sha256=sVumfYDJ9Pf8tSxatHI3x9vs3eGjyftdJ7noYgP2b1I,5400
63
+ mapillary_tools/video_data_extraction/video_data_parser_factory.py,sha256=qaJHvLgwI5lukJncMd8ggxeSxXOiVzBSJO5GlGQYiXY,1134
64
+ mapillary_tools/video_data_extraction/extractors/base_parser.py,sha256=s7Xuwg4I5JZ27oL4ebMSdo093plAXfZ-6uDQ_h97WHY,2134
65
+ mapillary_tools/video_data_extraction/extractors/blackvue_parser.py,sha256=PE06HW8b8eTIGrDCoAlt7qkPb88T_rdnFO2ArZJlLLk,1209
66
+ mapillary_tools/video_data_extraction/extractors/camm_parser.py,sha256=8xHg-KJ_tG-ApR1MbAPsGGnx0TN2s07IHV7A-oeQ-Ic,1609
67
+ mapillary_tools/video_data_extraction/extractors/exiftool_runtime_parser.py,sha256=qDk9avFBAHfzbSQ32ifxoIZNuUXqRcHs2z1HEpR_X6E,2385
68
+ mapillary_tools/video_data_extraction/extractors/exiftool_xml_parser.py,sha256=rzMwRzF9erKTtzNCHKhAN7nAaRRIIHToZglkxHab7NE,1679
69
+ mapillary_tools/video_data_extraction/extractors/generic_video_parser.py,sha256=34O6Km5kNDoJNJtIUOwtAzzMntuqkSZJfeli7caWSkA,1693
70
+ mapillary_tools/video_data_extraction/extractors/gopro_parser.py,sha256=LDBzj_DKQkc0gYHWKt_WSuSry-fOLNJCBWpi0lUjXLs,1568
71
+ mapillary_tools/video_data_extraction/extractors/gpx_parser.py,sha256=FNrdnXl48k8I1I5fGwYsClhfFEHVsooRLRboUYECv3I,3811
72
+ mapillary_tools/video_data_extraction/extractors/nmea_parser.py,sha256=raSXavBvP-0LJCB_TwLL0mOv2uHSsB744igTsaKAaGc,658
73
+ mapillary_tools-0.14.0a1.dist-info/licenses/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
74
+ mapillary_tools-0.14.0a1.dist-info/METADATA,sha256=Txd8DvdzG4Z2DH7sunqecdOAi80TUZIY5Y5WYytBcpo,19782
75
+ mapillary_tools-0.14.0a1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
76
+ mapillary_tools-0.14.0a1.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
77
+ mapillary_tools-0.14.0a1.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
78
+ mapillary_tools-0.14.0a1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (76.0.0)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,26 +0,0 @@
1
- import datetime
2
- import typing as T
3
-
4
- import gpxpy
5
- import gpxpy.gpx
6
-
7
- from .. import geo
8
-
9
-
10
- def is_video_stationary(max_distance_from_start: float) -> bool:
11
- radius_threshold = 10
12
- return max_distance_from_start < radius_threshold
13
-
14
-
15
- def convert_points_to_gpx_segment(points: T.Sequence[geo.Point]):
16
- gpx_segment = gpxpy.gpx.GPXTrackSegment()
17
- for point in points:
18
- gpx_segment.points.append(
19
- gpxpy.gpx.GPXTrackPoint(
20
- point.lat,
21
- point.lon,
22
- elevation=point.alt,
23
- time=datetime.datetime.utcfromtimestamp(point.time),
24
- )
25
- )
26
- return gpx_segment
@@ -1,75 +0,0 @@
1
- mapillary_tools/__init__.py,sha256=tOdTWrFVTLaGb-_qr6fgRv_nOA5NidkflFCzgUk9sdQ,19
2
- mapillary_tools/api_v4.py,sha256=bbu2VuzkUysLOBcjyGD_qQqnS1zsYgYDJAqBhQEVESw,7786
3
- mapillary_tools/authenticate.py,sha256=LCFcs6LqZmXaYkTUEKgGfmqytWdh5v_L3KXB48ojOZ4,3090
4
- mapillary_tools/config.py,sha256=jCjaK4jJaTY4AV4qf_b_tcxn5LA_uPsEWlGIdm2zw6g,2103
5
- mapillary_tools/constants.py,sha256=KKQMwzpN2z7wka6lhZv-agdxNldaEQqvQXu3Kg5XuUk,2453
6
- mapillary_tools/exceptions.py,sha256=Mh1tgVEFTSMnYEzrl9x7b95fW9Z3SPVD_YMEl7r8I0I,2693
7
- mapillary_tools/exif_read.py,sha256=F60A0-T8XSBHvFKgVIrUz_ZWKQrTFWrtj3c6siB0IMg,28707
8
- mapillary_tools/exif_write.py,sha256=3PawLnBOY8Z86TYiA_F4LxRhe5Ui6CTNhxYm9yeJNX8,8786
9
- mapillary_tools/exiftool_read.py,sha256=Mg027me1IzblKb9IyGaLgU6goFqk_QiOt0Ppq-CeECg,16288
10
- mapillary_tools/exiftool_read_video.py,sha256=f3l8HiDjkrIhmslIXSsC8cNgkqCVWUFkN_0OQ5ZUd-U,14431
11
- mapillary_tools/ffmpeg.py,sha256=p1a5VxlbpLGLkzulMv51bpyD5omwK7Qg8277TGYmcZA,15780
12
- mapillary_tools/geo.py,sha256=QybCiQr0UDcH6DIDa2L6cZw4sDoTJNgR99oo6S7gCts,9746
13
- mapillary_tools/history.py,sha256=l2z3YdYRyBGEOvcqcLExTV-0LUAX3iBq2OdBzLNMHLM,1766
14
- mapillary_tools/ipc.py,sha256=DwWQb9hNshx0bg0Fo5NjY0mXjs-FkbR6tIQmjMgMtmg,1089
15
- mapillary_tools/process_geotag_properties.py,sha256=w4hhv_c4sRydCK9QCO50sT2yo2zeVlY7dSdXQ93InFc,23159
16
- mapillary_tools/process_sequence_properties.py,sha256=5oYEjz9crnLVQtCkxbwn57TkeuHFbBh_zQXQSA4ENWg,11561
17
- mapillary_tools/sample_video.py,sha256=dpdX7bUNEmcrz-3gh3Y3awnTDX66pChbTKuF8qGfeCI,14400
18
- mapillary_tools/telemetry.py,sha256=WpBGPF_GMPjM_EFqXIutFtpDFL9wj7yEzGNGnfQZUo8,1255
19
- mapillary_tools/types.py,sha256=6kww2UdKM6YzabYbc862BYzEWtxL2hhxCRFfeDiUtF0,22074
20
- mapillary_tools/upload.py,sha256=C8sWMCYOVzjXpvMsEcx6dpZ47ezKaKV61yFwZs286oo,23639
21
- mapillary_tools/upload_api_v4.py,sha256=qN6yRpi-qXycRLgIOJqixjXqkYvgt-LJX7NXbQKXZaA,7502
22
- mapillary_tools/uploader.py,sha256=DBHso4QIP5nsZFDynLjkUvytzwpEOPnOlfeDyA6rTBk,14007
23
- mapillary_tools/utils.py,sha256=VNtK1tAb3Hh8y3P5e5Y3iewREkIoLDa3C2myRYcF2lY,5970
24
- mapillary_tools/camm/camm_builder.py,sha256=TXZfhu3xGjtrLEWnB14D7aSOrHOoSJef24YSLApiIfY,10631
25
- mapillary_tools/camm/camm_parser.py,sha256=RaCWeLvS_AyHD6B6wDUu9DAsdfByVHMAPTqEqjtFibE,9734
26
- mapillary_tools/commands/__init__.py,sha256=41CFrPLGlG3566uhxssEF3TGAtSpADFPPcDMHbViU0E,171
27
- mapillary_tools/commands/__main__.py,sha256=iDehfT38k4D283BIqy8TDD4K_q42jNhkrUNzWEXuZP4,4974
28
- mapillary_tools/commands/authenticate.py,sha256=4aVvAQal_mqtm2NEMBt5aKLahi0iRdO8b7WSBf6jokA,1136
29
- mapillary_tools/commands/process.py,sha256=VxcvQpYHPw7QfT9dNwBLV1jWQ-1w4GtVNVPpmu4Sx9s,10578
30
- mapillary_tools/commands/process_and_upload.py,sha256=cbYr6g4sDxZ3A9jLr-GZdHZObJ8ZKS43jAdZgvqAkWk,655
31
- mapillary_tools/commands/sample_video.py,sha256=bTJmlDsajkC-QJ_ZO_scdD4R664zs-r_dh-x2PlOgyY,3281
32
- mapillary_tools/commands/upload.py,sha256=JIWgxupV3ppLvPi1iE7UVaE1302JGcIOvnuNt1Y7YEw,1671
33
- mapillary_tools/commands/video_process.py,sha256=-wQeeIwWXPmy81HQHam5A0huMLRHknkEFa_V1OwElU4,890
34
- mapillary_tools/commands/video_process_and_upload.py,sha256=llV0dHBS31qPZp-Fs1GCM0yYezEA_VF_tfYcp-Z8NkY,701
35
- mapillary_tools/commands/zip.py,sha256=DVQuMLpbstwiy5o4pU_fBvM6eORuFjLeySd80AhHKU0,991
36
- mapillary_tools/geotag/__init__.py,sha256=ohud7lLsqO1b9ddCF0SjrNOcUcRdQzNVR43RkcVVLAc,33
37
- mapillary_tools/geotag/blackvue_parser.py,sha256=_LTI_biiznFPvrk5dcpoDH4tP4_7khPIpW5Daumuf68,2968
38
- mapillary_tools/geotag/geotag_from_generic.py,sha256=bCYfIbkv4qIlkKttAjSGl9t4i_QAtzIiCZoth1hMVI4,480
39
- mapillary_tools/geotag/geotag_images_from_exif.py,sha256=hCgBwZABk2tbBQC3cHQBV5pvNwlAo8AkWSgCD0BU_QU,4823
40
- mapillary_tools/geotag/geotag_images_from_exiftool.py,sha256=a-c4H8VIyPdJkfUIvJho0phR0QU0zN8-lSyiCz0wc4s,3981
41
- mapillary_tools/geotag/geotag_images_from_exiftool_both_image_and_video.py,sha256=nRVAjgTJwx_eCaSBpPCgcIaZs3EYgGueYxSS9XhKv40,3350
42
- mapillary_tools/geotag/geotag_images_from_gpx.py,sha256=S9Pw6FvP5kRSpHUnKUYKXmw0CHa9V92UmrS_MJfbjS4,9053
43
- mapillary_tools/geotag/geotag_images_from_gpx_file.py,sha256=-vTbZ1HufZzJCd8VvukdTjsJRcymtfld2W5t65VSG5E,5300
44
- mapillary_tools/geotag/geotag_images_from_nmea_file.py,sha256=dDdHnJInQ_WN3ZRf-w44NSBElDLPs7XYBiimvE2iCNo,1651
45
- mapillary_tools/geotag/geotag_images_from_video.py,sha256=XsaWOFChGItl-j1UbKM4hNjUqN29pVNbMpGT_BvI-o8,3306
46
- mapillary_tools/geotag/geotag_videos_from_exiftool_video.py,sha256=fkkWou1WFt3ft024399vis9No2cxrwot7Pg5HBw7o7s,5225
47
- mapillary_tools/geotag/geotag_videos_from_video.py,sha256=mqBZKUEkqT96nOzl5LJxzzTKuKsnAkMK5lH8k3oY3YE,7330
48
- mapillary_tools/geotag/gpmf_gps_filter.py,sha256=7cg8wEjC1DrujKY76FZguXsaPqTRkG9-t32OeuOJQIc,2755
49
- mapillary_tools/geotag/gpmf_parser.py,sha256=6Q38oeSd2kHTs44Fzpg9R555EbQqdd5QcIuIZdG4z_o,23233
50
- mapillary_tools/geotag/gps_filter.py,sha256=4CPL8glxdzPWIbfGPPgyqMLyiZFt-djce5vhiFPuZB8,3766
51
- mapillary_tools/geotag/utils.py,sha256=Orl35Df4ypxj4v6Lu1Mhk9d2XZxa8yNffz1s1C0JZsQ,651
52
- mapillary_tools/mp4/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
- mapillary_tools/mp4/construct_mp4_parser.py,sha256=31oJbg6umKJjdZ0Ni5eCudC0lXd0Y-K_EiCCj6yW9js,17199
54
- mapillary_tools/mp4/io_utils.py,sha256=wc3-F1TnxZjTwB7-oea5yRmRQ_0T3Zbz8oBkW9JL8d4,5454
55
- mapillary_tools/mp4/mp4_sample_parser.py,sha256=YnTIIHGHL3ViLo_Ap0C2hk8MDWbWtvSXBLD42pRIWqY,11337
56
- mapillary_tools/mp4/simple_mp4_builder.py,sha256=7zVepmW-2SwoAeA-fvucmBW94jlcCFExDcEg8P3TOGY,12727
57
- mapillary_tools/mp4/simple_mp4_parser.py,sha256=eji6JZa497wK8CY8hQt21fjgtnd0nzuyBx7MPEKST74,6671
58
- mapillary_tools/video_data_extraction/cli_options.py,sha256=N0uHi9Uzaw1C8N-PE3yu8J3uEQP3HvSjJ9AZbIqoREg,535
59
- mapillary_tools/video_data_extraction/extract_video_data.py,sha256=_2BBdSYeYKR4BCHAZa1Jzo7OIK_va1lJDkTU2sXsPc0,6000
60
- mapillary_tools/video_data_extraction/video_data_parser_factory.py,sha256=qaJHvLgwI5lukJncMd8ggxeSxXOiVzBSJO5GlGQYiXY,1134
61
- mapillary_tools/video_data_extraction/extractors/base_parser.py,sha256=s7Xuwg4I5JZ27oL4ebMSdo093plAXfZ-6uDQ_h97WHY,2134
62
- mapillary_tools/video_data_extraction/extractors/blackvue_parser.py,sha256=jAcGyF6PML2EdJ4zle8cR12QeTRZc5qxlz8_4gcTZPU,1089
63
- mapillary_tools/video_data_extraction/extractors/camm_parser.py,sha256=YMiViocXSVlfn8_qm1jcwSJhnnEaK8v5ADHwo2YXe10,1117
64
- mapillary_tools/video_data_extraction/extractors/exiftool_runtime_parser.py,sha256=PFNCRk9pGrPIfVwLMcnzmVNMITVjNHhbrOOMwxaSstg,2270
65
- mapillary_tools/video_data_extraction/extractors/exiftool_xml_parser.py,sha256=Tt0h4TiCKocERWMlRXzlpoaA_WJ_4b20MgMLGYNl4AM,1734
66
- mapillary_tools/video_data_extraction/extractors/generic_video_parser.py,sha256=34O6Km5kNDoJNJtIUOwtAzzMntuqkSZJfeli7caWSkA,1693
67
- mapillary_tools/video_data_extraction/extractors/gopro_parser.py,sha256=IVnTyquSraTUaG9rxbJfVWc1-drdY5PaHn5urh3IBk4,1325
68
- mapillary_tools/video_data_extraction/extractors/gpx_parser.py,sha256=FNrdnXl48k8I1I5fGwYsClhfFEHVsooRLRboUYECv3I,3811
69
- mapillary_tools/video_data_extraction/extractors/nmea_parser.py,sha256=raSXavBvP-0LJCB_TwLL0mOv2uHSsB744igTsaKAaGc,658
70
- mapillary_tools-0.13.3.dist-info/LICENSE,sha256=l2D8cKfFmmJq_wcVq_JElPJrlvWQOzNWx7gMLINucxc,1292
71
- mapillary_tools-0.13.3.dist-info/METADATA,sha256=qJo2HTakj1kI0l5wl_CMb8pcRP68REFJkO1oJVPdtu4,19758
72
- mapillary_tools-0.13.3.dist-info/WHEEL,sha256=52BFRY2Up02UkjOa29eZOS2VxUrpPORXg1pkohGGUS8,91
73
- mapillary_tools-0.13.3.dist-info/entry_points.txt,sha256=A3f3LP-BO_P-U8Y29QfpT4jx6Mjk3sXjTi2Yew4bvj8,75
74
- mapillary_tools-0.13.3.dist-info/top_level.txt,sha256=FbDkMgOrt1S70ho1WSBrOwzKOSkJFDwwqFOoY5-527s,16
75
- mapillary_tools-0.13.3.dist-info/RECORD,,
File without changes
File without changes