mapillary-downloader 0.3.1__py3-none-any.whl → 0.3.2__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.
@@ -3,6 +3,7 @@
3
3
  import argparse
4
4
  import os
5
5
  import sys
6
+ from importlib.metadata import version
6
7
  from mapillary_downloader.client import MapillaryClient
7
8
  from mapillary_downloader.downloader import MapillaryDownloader
8
9
  from mapillary_downloader.logging_config import setup_logging
@@ -15,6 +16,11 @@ def main():
15
16
  logger = setup_logging()
16
17
 
17
18
  parser = argparse.ArgumentParser(description="Download your Mapillary data before it's gone")
19
+ parser.add_argument(
20
+ "--version",
21
+ action="version",
22
+ version=f"%(prog)s {version('mapillary-downloader')}",
23
+ )
18
24
  parser.add_argument(
19
25
  "--token",
20
26
  default=os.environ.get("MAPILLARY_TOKEN"),
@@ -10,6 +10,7 @@ from mapillary_downloader.utils import format_size, format_time
10
10
  from mapillary_downloader.ia_meta import generate_ia_metadata
11
11
  from mapillary_downloader.worker import download_and_convert_image
12
12
  from mapillary_downloader.tar_sequences import tar_sequence_directories
13
+ from mapillary_downloader.logging_config import add_file_handler
13
14
 
14
15
  logger = logging.getLogger("mapillary_downloader")
15
16
 
@@ -44,6 +45,11 @@ class MapillaryDownloader:
44
45
 
45
46
  self.output_dir.mkdir(parents=True, exist_ok=True)
46
47
 
48
+ # Set up file logging for archival
49
+ log_file = self.output_dir / "download.log"
50
+ add_file_handler(log_file)
51
+ logger.info(f"Logging to: {log_file}")
52
+
47
53
  self.metadata_file = self.output_dir / "metadata.jsonl"
48
54
  self.progress_file = self.output_dir / "progress.json"
49
55
  self.downloaded = self._load_progress()
@@ -135,7 +135,7 @@ def generate_ia_metadata(collection_dir):
135
135
  write_meta_tag(
136
136
  meta_dir,
137
137
  "title",
138
- f"Mapillary images by {username} ({quality} quality)",
138
+ f"Mapillary images by {username}",
139
139
  )
140
140
 
141
141
  description = (
@@ -60,3 +60,23 @@ def setup_logging(level=logging.INFO):
60
60
  logger.addHandler(handler)
61
61
 
62
62
  return logger
63
+
64
+
65
+ def add_file_handler(log_file, level=logging.INFO):
66
+ """Add a file handler to the logger for archival.
67
+
68
+ Args:
69
+ log_file: Path to log file
70
+ level: Logging level for file handler
71
+ """
72
+ # Use plain formatter for file (no colors)
73
+ formatter = logging.Formatter(fmt="%(asctime)s [%(levelname)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S")
74
+
75
+ handler = logging.FileHandler(log_file, mode="a", encoding="utf-8")
76
+ handler.setFormatter(formatter)
77
+ handler.setLevel(level)
78
+
79
+ logger = logging.getLogger("mapillary_downloader")
80
+ logger.addHandler(handler)
81
+
82
+ return handler
@@ -1,5 +1,6 @@
1
1
  """Worker process for parallel image download and conversion."""
2
2
 
3
+ import os
3
4
  import tempfile
4
5
  from pathlib import Path
5
6
  import requests
@@ -80,6 +81,12 @@ def download_and_convert_image(image_data, output_dir, quality, convert_webp, ac
80
81
  if not webp_path:
81
82
  return (image_id, bytes_downloaded, False, "WebP conversion failed")
82
83
 
84
+ # Set file mtime to captured_at timestamp for reproducibility
85
+ if "captured_at" in image_data:
86
+ # captured_at is in milliseconds, convert to seconds
87
+ mtime = image_data["captured_at"] / 1000
88
+ os.utime(final_path, (mtime, mtime))
89
+
83
90
  return (image_id, bytes_downloaded, True, None)
84
91
 
85
92
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapillary_downloader
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: Download your Mapillary data before it's gone
5
5
  Author-email: Gareth Davidson <gaz@bitplane.net>
6
6
  Requires-Python: >=3.10
@@ -0,0 +1,16 @@
1
+ mapillary_downloader/__init__.py,sha256=KEjiBRghXDeA7E15RJeLBfQm-yNJkowZarL59QOh_1w,120
2
+ mapillary_downloader/__main__.py,sha256=Zvvib_XFhErPLY6AWviQ83iT0TiXFHWV4CDJ5vtzNYQ,3187
3
+ mapillary_downloader/client.py,sha256=O7JgshaM3QKUv0xXuBbe_uPqsTr4lgyuVUHYndvXTfA,4611
4
+ mapillary_downloader/downloader.py,sha256=JmR-0HbCBXGoRylgVzVbEdvlRey3pklZffhf2BRCw9s,8476
5
+ mapillary_downloader/exif_writer.py,sha256=Bn1u3QULfHtae86FnUGcqN450NccJwtwW9wVaSRyx9E,4615
6
+ mapillary_downloader/ia_meta.py,sha256=zUG23Vv2X8hFa_oNL_wfvFVt7yqkQkvXiZ4feoKt7S0,5596
7
+ mapillary_downloader/logging_config.py,sha256=Z-wNq34nt7aIhJWdeKc1feTY46P9-Or7HtiX7eUFjEI,2324
8
+ mapillary_downloader/tar_sequences.py,sha256=X5Vru0vp4pm_unmFjdEIZ7SBIk0gwi49NwOLPhUKeYk,3809
9
+ mapillary_downloader/utils.py,sha256=yzVgS1mwsklDAqrimaFafgTTXtRYQUbKP98Xgh9d2KA,1174
10
+ mapillary_downloader/webp_converter.py,sha256=vYLLQxDmdnqRz0nm7wXwRUd4x9mQZNah-DrncpA8sNs,1901
11
+ mapillary_downloader/worker.py,sha256=eqaBhP5NE_VoJSTZfFb4OAqGyVX65xyoVUp2vosYBM8,3722
12
+ mapillary_downloader-0.3.2.dist-info/entry_points.txt,sha256=PdYtxOXHMJrUhmiPO4G-F98VuhUI4MN9D_T4KPrVZ5w,75
13
+ mapillary_downloader-0.3.2.dist-info/licenses/LICENSE.md,sha256=7_BIuQ-veOrsF-WarH8kTkm0-xrCLvJ1PFE1C4Ebs64,146
14
+ mapillary_downloader-0.3.2.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
15
+ mapillary_downloader-0.3.2.dist-info/METADATA,sha256=ckXRXc0rHTQdPleWCAo8oRwbu-FKJwOSdkc7g5DrKug,4607
16
+ mapillary_downloader-0.3.2.dist-info/RECORD,,
@@ -1,16 +0,0 @@
1
- mapillary_downloader/__init__.py,sha256=KEjiBRghXDeA7E15RJeLBfQm-yNJkowZarL59QOh_1w,120
2
- mapillary_downloader/__main__.py,sha256=SEbILB0aQsDY52r1HNgDPX_XaH_EiJCarDwgNQRw1hM,3007
3
- mapillary_downloader/client.py,sha256=O7JgshaM3QKUv0xXuBbe_uPqsTr4lgyuVUHYndvXTfA,4611
4
- mapillary_downloader/downloader.py,sha256=tvVfrn4MHeLZT-a-ihPykGgR3yUuG3adhwzzToxA1pQ,8233
5
- mapillary_downloader/exif_writer.py,sha256=Bn1u3QULfHtae86FnUGcqN450NccJwtwW9wVaSRyx9E,4615
6
- mapillary_downloader/ia_meta.py,sha256=QX1jGCdKvUMFsr6xBZYwS78a0qd0eQI8ynJhIfLIJ5w,5616
7
- mapillary_downloader/logging_config.py,sha256=WgjXthS2Lpl0RPO5sb-Aj60W2maog1bbzJzhblMLs1c,1715
8
- mapillary_downloader/tar_sequences.py,sha256=X5Vru0vp4pm_unmFjdEIZ7SBIk0gwi49NwOLPhUKeYk,3809
9
- mapillary_downloader/utils.py,sha256=yzVgS1mwsklDAqrimaFafgTTXtRYQUbKP98Xgh9d2KA,1174
10
- mapillary_downloader/webp_converter.py,sha256=vYLLQxDmdnqRz0nm7wXwRUd4x9mQZNah-DrncpA8sNs,1901
11
- mapillary_downloader/worker.py,sha256=kH9X_KdssM01UlfglNfsdogYnNrYOhd136eQJiEhLaw,3434
12
- mapillary_downloader-0.3.1.dist-info/entry_points.txt,sha256=PdYtxOXHMJrUhmiPO4G-F98VuhUI4MN9D_T4KPrVZ5w,75
13
- mapillary_downloader-0.3.1.dist-info/licenses/LICENSE.md,sha256=7_BIuQ-veOrsF-WarH8kTkm0-xrCLvJ1PFE1C4Ebs64,146
14
- mapillary_downloader-0.3.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
15
- mapillary_downloader-0.3.1.dist-info/METADATA,sha256=pBf6R7bqD9090YYzI2x5aQ-INcJUFhCbqV4avbzqOWM,4607
16
- mapillary_downloader-0.3.1.dist-info/RECORD,,