geopic-tag-reader 1.8.0__tar.gz → 1.8.2__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 (78) hide show
  1. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/CHANGELOG.md +30 -1
  2. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/PKG-INFO +2 -2
  3. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/__init__.py +1 -1
  4. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/camera.py +7 -1
  5. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/cameras.csv +12 -0
  6. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/reader.py +42 -7
  7. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/sequence.py +1 -1
  8. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/be/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  9. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/be/LC_MESSAGES/geopic_tag_reader.po +216 -0
  10. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/de/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  11. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/de/LC_MESSAGES/geopic_tag_reader.po +31 -30
  12. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/en/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  13. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/en/LC_MESSAGES/geopic_tag_reader.po +34 -24
  14. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/geopic_tag_reader.pot +31 -21
  15. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/nl/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  16. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/nl/LC_MESSAGES/geopic_tag_reader.po +3 -3
  17. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/pt/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  18. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/pt/LC_MESSAGES/geopic_tag_reader.po +222 -0
  19. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/pt_BR/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  20. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/pt_BR/LC_MESSAGES/geopic_tag_reader.po +223 -0
  21. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/tr/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  22. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/tr/LC_MESSAGES/geopic_tag_reader.po +216 -0
  23. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/uk/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  24. geopic_tag_reader-1.8.2/geopic_tag_reader/translations/uk/LC_MESSAGES/geopic_tag_reader.po +220 -0
  25. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/pyproject.toml +1 -1
  26. geopic_tag_reader-1.8.0/geopic_tag_reader/translations/de/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  27. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/.gitignore +0 -0
  28. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/.gitlab-ci.yml +0 -0
  29. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/.pre-commit-config.yaml +0 -0
  30. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/CODE_OF_CONDUCT.md +0 -0
  31. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/LICENSE +0 -0
  32. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/Makefile +0 -0
  33. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/README.md +0 -0
  34. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/develop.md +0 -0
  35. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/images/quality_score.png +0 -0
  36. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/images/quality_score_viewer.png +0 -0
  37. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/index.md +0 -0
  38. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/install.md +0 -0
  39. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/quality_score.md +0 -0
  40. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/tech/api_reference.md +0 -0
  41. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/docs/tech/cli.md +0 -0
  42. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/i18n.py +0 -0
  43. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/main.py +0 -0
  44. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/model.py +0 -0
  45. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/py.typed +0 -0
  46. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ar/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  47. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ar/LC_MESSAGES/geopic_tag_reader.po +0 -0
  48. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/br/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  49. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/br/LC_MESSAGES/geopic_tag_reader.po +0 -0
  50. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/da/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  51. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/da/LC_MESSAGES/geopic_tag_reader.po +0 -0
  52. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/eo/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  53. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/eo/LC_MESSAGES/geopic_tag_reader.po +0 -0
  54. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/es/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  55. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/es/LC_MESSAGES/geopic_tag_reader.po +0 -0
  56. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/fi/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  57. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/fi/LC_MESSAGES/geopic_tag_reader.po +0 -0
  58. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/fr/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  59. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/fr/LC_MESSAGES/geopic_tag_reader.po +0 -0
  60. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/hu/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  61. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/hu/LC_MESSAGES/geopic_tag_reader.po +0 -0
  62. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/it/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  63. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/it/LC_MESSAGES/geopic_tag_reader.po +0 -0
  64. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ja/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  65. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ja/LC_MESSAGES/geopic_tag_reader.po +0 -0
  66. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ko/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  67. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ko/LC_MESSAGES/geopic_tag_reader.po +0 -0
  68. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/pl/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  69. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/pl/LC_MESSAGES/geopic_tag_reader.po +0 -0
  70. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/sv/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  71. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/sv/LC_MESSAGES/geopic_tag_reader.po +0 -0
  72. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ti/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  73. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/ti/LC_MESSAGES/geopic_tag_reader.po +0 -0
  74. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/zh_Hant/LC_MESSAGES/geopic_tag_reader.mo +0 -0
  75. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/translations/zh_Hant/LC_MESSAGES/geopic_tag_reader.po +0 -0
  76. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/geopic_tag_reader/writer.py +0 -0
  77. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/mkdocs.yml +0 -0
  78. {geopic_tag_reader-1.8.0 → geopic_tag_reader-1.8.2}/pytest.ini +0 -0
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [1.8.2] - 2026-02-03
11
+
12
+ ### Added
13
+
14
+ - Better support of Trimble and Akaso cameras.
15
+
16
+ ### Changed
17
+
18
+ - 360° images detection now relies on pure width/height ratio if other checks don't pass, to better handle new or unknown devices
19
+
20
+ ### Fixed
21
+
22
+ - Avoid unexpected exception when an input image is corrupted and prevents pyexiv2 `read_*()` function to work.
23
+ - Support `ISO-8859-1` metadata decoding if `UTF-8` decoding fails.
24
+
25
+ ## [1.8.1] - 2026-01-24
26
+
27
+ ### Added
28
+
29
+ - Default GPS precision for DJI devices is estimated to 4 meters.
30
+
31
+ ### Fixed
32
+
33
+ - Pictures with partial crop metadata which corresponds to a full 360° picture (crop width = full width & crop height = full height) are now accepted.
34
+ - Bad assertion, making `0` an invalid value for `MergeParams.maxDistance` parameter.
35
+
10
36
  ## [1.8.0] - 2025-05-25
11
37
 
12
38
  ### Changed
@@ -104,6 +130,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
104
130
  - Reader offers a `yaw` value (360° sphere correction), distinct from `heading` (GPS direction). EXIF tags are read a bit differently to reflect this : `yaw` comes from `Xmp.Camera.Yaw & Xmp.GPano.PoseHeadingDegrees`, `heading` from `Exif.GPSInfo.GPSImgDirection & MAPCompassHeading`.
105
131
 
106
132
  ### Removed
133
+
107
134
  - Previously used values `Exif.GPSInfo.GPS(Pitch|Roll)` and `Xmp.GPano.InitialView(Pitch|Roll)Degrees` are dropped, first one for not being standard, second one for not being correct to use for pitch/roll (prefer `Xmp.GPano.Pose(Pitch|Roll)Degrees`).
108
135
 
109
136
  ## [1.1.5] - 2024-07-10
@@ -298,7 +325,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
298
325
 
299
326
  - EXIF tag reading methods extracted from [Panoramax/GeoVisio API](https://gitlab.com/panoramax/server/api)
300
327
 
301
- [Unreleased]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.8.0...main
328
+ [Unreleased]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.8.2...main
329
+ [1.8.2]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.8.1...1.8.2
330
+ [1.8.1]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.8.0...1.8.1
302
331
  [1.8.0]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.7.0...1.8.0
303
332
  [1.7.0]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.6.0...1.7.0
304
333
  [1.6.0]: https://gitlab.com/panoramax/server/geo-picture-tag-reader/-/compare/1.5.0...1.6.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geopic-tag-reader
3
- Version: 1.8.0
3
+ Version: 1.8.2
4
4
  Summary: GeoPicTagReader
5
5
  Author-email: Adrien PAVIE <panieravide@riseup.net>
6
6
  Requires-Python: >=3.9
@@ -9,7 +9,7 @@ Classifier: License :: OSI Approved :: MIT License
9
9
  License-File: LICENSE
10
10
  Requires-Dist: typer ~= 0.15
11
11
  Requires-Dist: xmltodict ~= 0.14
12
- Requires-Dist: pyexiv2 == 2.15.3
12
+ Requires-Dist: pyexiv2 == 2.15.5
13
13
  Requires-Dist: timezonefinder == 6.5.9
14
14
  Requires-Dist: pytz ~= 2025.2
15
15
  Requires-Dist: types-pytz ~= 2025.2.0
@@ -2,4 +2,4 @@
2
2
  GeoPicTagReader
3
3
  """
4
4
 
5
- __version__ = "1.8.0"
5
+ __version__ = "1.8.2"
@@ -20,7 +20,9 @@ GPS_ACCURACY_MAKE = {
20
20
  "tectectec": 4,
21
21
  "arashi vision": 4,
22
22
  "qoocam": 4,
23
+ "dji": 4,
23
24
  # Smartphone GPS
25
+ "akaso": 5,
24
26
  "samsung": 5,
25
27
  "xiaomi": 5,
26
28
  "huawei": 5,
@@ -140,9 +142,13 @@ def is_360(make: Optional[str] = None, model: Optional[str] = None, width: Optio
140
142
  # Check make and model are defined
141
143
  camera = find_camera(make, model)
142
144
  if not camera:
145
+ # If unknown model, we can guess based on dimensions
146
+ if width is not None and height is not None and width == 2 * height:
147
+ return True
148
+
143
149
  return False
144
150
 
145
- # Check width and height are equirectangular
151
+ # Check width and height are equirectangular (to distinguish cameras doing both 360° or classic)
146
152
  if not ((width is None or height is None) or width == 2 * height):
147
153
  return False
148
154
 
@@ -70,6 +70,7 @@
70
70
  "AgfaPhoto";"sensor 505-X";"5.75";;
71
71
  "AgfaPhoto";"sensor 530s";"5.75";;
72
72
  "AgfaPhoto";"sensor 830s";"5.75";;
73
+ "AKASO";"360";;"1";
73
74
  "Apple";"iPad 3";"4.54";;
74
75
  "Apple";"iPhone 3,1";"4.74";;
75
76
  "Apple";"iPhone 4";"4.74";;
@@ -1094,7 +1095,14 @@
1094
1095
  "Fujifilm";"X-M1";"23.6";;
1095
1096
  "Fujifilm";"X-Pro1";"23.6";;
1096
1097
  "Fujifilm";"X-S1";"8.8";;
1098
+ "Fujifilm";"X-S10";"23.5";;
1099
+ "Fujifilm";"X-S20";"23.5";;
1097
1100
  "Fujifilm";"X-T1";"23.6";;
1101
+ "Fujifilm";"X-T2";"23.5";;
1102
+ "Fujifilm";"X-T3";"23.5";;
1103
+ "Fujifilm";"X-T30";"23.5";;
1104
+ "Fujifilm";"X-T4";"23.5";;
1105
+ "Fujifilm";"X-T5";"23.5";;
1098
1106
  "Fujifilm";"X10";"8.8";;
1099
1107
  "Fujifilm";"X100S";"23.6";;
1100
1108
  "Fujifilm";"X100T";"23.6";;
@@ -2298,6 +2306,7 @@
2298
2306
  "oneplu";"A000";"4.8";;
2299
2307
  "OnePlus";"A3003";"6.4";;
2300
2308
  "OnePlus";"A5000";"5.22";;
2309
+ "OnePlus";"EB2103";"6.51";;
2301
2310
  "Panasonic";"Lumix DMC-LZ20";"6.08";;
2302
2311
  "Panasonic";"D-snap SV-AS10";"4.5";;
2303
2312
  "Panasonic";"D-snap SV-AS3";"4.5";;
@@ -3708,6 +3717,9 @@
3708
3717
  "Toshiba";"PDR T10";"5.33";;
3709
3718
  "Toshiba";"PDR T20";"5.33";;
3710
3719
  "Toshiba";"PDR T30";"5.33";;
3720
+ "Trimble";"mx50";;"1";
3721
+ "Trimble";"mx60";;"1";
3722
+ "Trimble";"mx90";;"1";
3711
3723
  "Viofo";"A119 Mini 2";"5.2";;
3712
3724
  "Vivitar";"V8025";"7.11";;
3713
3725
  "Vivitar";"ViviCam 5105s";"5.75";;
@@ -11,6 +11,7 @@ import timezonefinder # type: ignore
11
11
  import pytz
12
12
  from geopic_tag_reader.i18n import init as i18n_init
13
13
  import math
14
+ import logging
14
15
 
15
16
  # This is a fix for invalid MakerNotes leading to picture not read at all
16
17
  # https://github.com/LeoHsiao1/pyexiv2/issues/58
@@ -18,6 +19,8 @@ pyexiv2.set_log_level(4)
18
19
 
19
20
  tz_finder = timezonefinder.TimezoneFinder()
20
21
 
22
+ METADATA_ENCODINGS = ["UTF-8", "ISO-8859-1"]
23
+
21
24
 
22
25
  @dataclass
23
26
  class CropValues:
@@ -179,17 +182,33 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
179
182
  GeoPicTags: Extracted metadata from picture
180
183
  """
181
184
 
185
+ _ = i18n_init(lang_code)
182
186
  data = {}
187
+ warnings = []
188
+
183
189
  with pyexiv2.ImageData(picture) as img:
184
- data.update(img.read_exif())
185
- data.update(img.read_iptc())
186
- data.update(img.read_xmp())
187
190
  width = img.get_pixel_width()
188
191
  height = img.get_pixel_height()
189
192
 
190
- imgComment = img.read_comment()
191
- if imgComment is not None and len(imgComment.strip()) > 0:
192
- data["Exif.Photo.UserComment"] = imgComment
193
+ # Read raw tags, with fallback encoding if necessary
194
+ for read_fct in [img.read_exif, img.read_iptc, img.read_xmp]:
195
+ for encoding in METADATA_ENCODINGS:
196
+ try:
197
+ data.update(read_fct(encoding))
198
+ break
199
+ except Exception as e:
200
+ logging.debug(e)
201
+ warnings.append(_("Can't run {f} using {e} encoding").format(f=read_fct.__name__, e=encoding))
202
+
203
+ # Specific case for read_comment
204
+ for encoding in METADATA_ENCODINGS:
205
+ try:
206
+ imgComment = img.read_comment(encoding=encoding)
207
+ if imgComment is not None and len(imgComment.strip()) > 0:
208
+ data["Exif.Photo.UserComment"] = imgComment
209
+ except Exception as e:
210
+ logging.debug(e)
211
+ warnings.append(_("Can't read comment tag using {e} encoding").format(e=encoding))
193
212
 
194
213
  # Read Mapillary tags
195
214
  if "Exif.Image.ImageDescription" in data:
@@ -201,7 +220,12 @@ def readPictureMetadata(picture: bytes, lang_code: str = "en") -> GeoPicTags:
201
220
  except:
202
221
  pass
203
222
 
204
- return getPictureMetadata(data, width, height, lang_code)
223
+ picmeta = getPictureMetadata(data, width, height, lang_code)
224
+
225
+ if len(warnings) > 0:
226
+ picmeta.tagreader_warnings.extend(warnings)
227
+
228
+ return picmeta
205
229
 
206
230
 
207
231
  def getPictureMetadata(data: dict, width: int, height: int, lang_code: str = "en") -> GeoPicTags:
@@ -385,6 +409,17 @@ def getPictureMetadata(data: dict, width: int, height: int, lang_code: str = "en
385
409
  if fw > w or fh > h:
386
410
  crop = CropValues(fw, fh, w, h, l, t)
387
411
 
412
+ # Skip images where crop width/height equals full width/length
413
+ elif (
414
+ isExifTagUsable(data, "Xmp.GPano.CroppedAreaImageWidthPixels", int)
415
+ and isExifTagUsable(data, "Xmp.GPano.CroppedAreaImageHeightPixels", int)
416
+ and isExifTagUsable(data, "Xmp.GPano.FullPanoWidthPixels", int)
417
+ and isExifTagUsable(data, "Xmp.GPano.FullPanoHeightPixels", int)
418
+ and int(data["Xmp.GPano.FullPanoHeightPixels"]) == int(data["Xmp.GPano.CroppedAreaImageHeightPixels"])
419
+ and int(data["Xmp.GPano.FullPanoWidthPixels"]) == int(data["Xmp.GPano.CroppedAreaImageWidthPixels"])
420
+ ):
421
+ pass
422
+
388
423
  elif (
389
424
  isExifTagUsable(data, "Xmp.GPano.CroppedAreaImageWidthPixels", int)
390
425
  or isExifTagUsable(data, "Xmp.GPano.CroppedAreaImageHeightPixels", int)
@@ -260,7 +260,7 @@ def find_duplicates(pictures: List[Picture], params: Optional[MergeParams] = Non
260
260
 
261
261
  if params is None or not params.is_merge_needed() or not pictures:
262
262
  return (pictures, [])
263
- assert params.maxDistance
263
+ assert params.maxDistance is not None
264
264
 
265
265
  nonDups: List[Picture] = []
266
266
  duplicates = []
@@ -0,0 +1,216 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2025-08-25 15:35+0200\n"
11
+ "PO-Revision-Date: 2025-11-04 18:45+0000\n"
12
+ "Last-Translator: Jordjio Minchane <bigopenmac@gmail.com>\n"
13
+ "Language-Team: Belarusian <http://weblate.panoramax.xyz/projects/panoramax/"
14
+ "tag-reader/be/>\n"
15
+ "Language: be\n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=UTF-8\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+ "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
20
+ "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
21
+ "X-Generator: Weblate 5.4.3\n"
22
+
23
+ #: geopic_tag_reader/main.py:26
24
+ msgid "Latitude:"
25
+ msgstr "Шырата:"
26
+
27
+ #: geopic_tag_reader/main.py:27
28
+ msgid "Longitude:"
29
+ msgstr "Даўгата:"
30
+
31
+ #: geopic_tag_reader/main.py:28
32
+ msgid "GPS accuracy:"
33
+ msgstr "Дакладнасць GPS:"
34
+
35
+ #: geopic_tag_reader/main.py:28 geopic_tag_reader/main.py:31
36
+ #: geopic_tag_reader/main.py:32
37
+ msgid "not set"
38
+ msgstr "не зададзена"
39
+
40
+ #: geopic_tag_reader/main.py:29
41
+ msgid "Timestamp:"
42
+ msgstr "Метка часу:"
43
+
44
+ #: geopic_tag_reader/main.py:31
45
+ msgid "(GPS)"
46
+ msgstr "(GPS)"
47
+
48
+ #: geopic_tag_reader/main.py:32
49
+ msgid "(Camera)"
50
+ msgstr "(Фотакамера)"
51
+
52
+ #: geopic_tag_reader/main.py:33
53
+ msgid "Heading:"
54
+ msgstr "Напрамак:"
55
+
56
+ #: geopic_tag_reader/main.py:34
57
+ msgid "Type:"
58
+ msgstr "Тып:"
59
+
60
+ #: geopic_tag_reader/main.py:35
61
+ msgid "Make:"
62
+ msgstr "Вытворца:"
63
+
64
+ #: geopic_tag_reader/main.py:36
65
+ msgid "Model:"
66
+ msgstr "Мадэль:"
67
+
68
+ #: geopic_tag_reader/main.py:37
69
+ msgid "Focal length:"
70
+ msgstr "Факусная адлегласць:"
71
+
72
+ #: geopic_tag_reader/main.py:38
73
+ msgid "Field of view:"
74
+ msgstr "Поле зроку:"
75
+
76
+ #: geopic_tag_reader/main.py:39
77
+ msgid "Sensor width:"
78
+ msgstr "Шырыня сэнсара:"
79
+
80
+ #: geopic_tag_reader/main.py:40
81
+ msgid "Crop parameters:"
82
+ msgstr "Параметры абрэзкі:"
83
+
84
+ #: geopic_tag_reader/main.py:41
85
+ msgid "Pitch:"
86
+ msgstr "Нахіл:"
87
+
88
+ #: geopic_tag_reader/main.py:42
89
+ msgid "Roll:"
90
+ msgstr "Крэн:"
91
+
92
+ #: geopic_tag_reader/main.py:43
93
+ msgid "Yaw:"
94
+ msgstr "Адхіленне:"
95
+
96
+ #: geopic_tag_reader/main.py:46
97
+ msgid "Warnings raised by reader:"
98
+ msgstr "Папярэджанні чытальніка:"
99
+
100
+ #: geopic_tag_reader/reader.py:246
101
+ msgid "Read latitude is out of WGS84 bounds (should be in [-90, 90])"
102
+ msgstr "Шырата па-за межамі WGS84 (павінна быць у дыяпазоне [-90, 90])"
103
+
104
+ #: geopic_tag_reader/reader.py:248
105
+ msgid "Read longitude is out of WGS84 bounds (should be in [-180, 180])"
106
+ msgstr "Даўгата па-за межамі WGS84 (павінна быць у дыяпазоне [-180, 180])"
107
+
108
+ #: geopic_tag_reader/reader.py:276
109
+ #, python-brace-format
110
+ msgid "Skipping Mapillary date/time as it was not recognized: {v}"
111
+ msgstr "Прапускаем дату/час Mapillary, бо яны не распазнаны: {v}"
112
+
113
+ #: geopic_tag_reader/reader.py:306
114
+ msgid "No heading value was found, this reduces usability of picture"
115
+ msgstr "Значэнне напрамку не знойдзена, гэта пагаршае выкарыстальнасць выявы"
116
+
117
+ #: geopic_tag_reader/reader.py:349
118
+ msgid ""
119
+ "No make and model value found, no assumption on focal length or GPS "
120
+ "precision can be made"
121
+ msgstr ""
122
+ "Не знойдзены вытворца і мадэль, немагчыма зрабіць здагадкі пра факусную "
123
+ "адлегласць або дакладнасць GPS"
124
+
125
+ #: geopic_tag_reader/reader.py:418
126
+ msgid ""
127
+ "No focal length value was found, this prevents calculating field of view"
128
+ msgstr ""
129
+ "Значэнне факуснай адлегласці не знойдзена, гэта перашкаджае разліку поля "
130
+ "зроку"
131
+
132
+ #: geopic_tag_reader/reader.py:470
133
+ msgid "No GPS accuracy value found, this prevents computing a quality score"
134
+ msgstr ""
135
+ "Значэнне дакладнасці GPS не знойдзена, гэта перашкаджае разліку адзнакі "
136
+ "якасці"
137
+
138
+ #: geopic_tag_reader/reader.py:472
139
+ msgid ""
140
+ "No GPS horizontal positioning error value found, GPS accuracy can only be "
141
+ "estimated"
142
+ msgstr ""
143
+ "Значэнне памылкі гарызантальнага пазіцыянавання GPS не знойдзена, "
144
+ "дакладнасць GPS можна толькі ацаніць"
145
+
146
+ #: geopic_tag_reader/reader.py:479
147
+ msgid "No GPS coordinates or broken coordinates in picture EXIF tags"
148
+ msgstr "Адсутнічаюць GPS-каардынаты або яны пашкоджаныя ў EXIF тэгах выявы"
149
+
150
+ #: geopic_tag_reader/reader.py:485
151
+ msgid "No valid date in picture EXIF tags"
152
+ msgstr "У EXIF тэгах выявы адсутнічае сапраўдная дата"
153
+
154
+ #: geopic_tag_reader/reader.py:490
155
+ msgid "The picture is missing mandatory metadata:"
156
+ msgstr "Выяве не хапае абавязковых метаданых:"
157
+
158
+ #: geopic_tag_reader/reader.py:604 geopic_tag_reader/reader.py:633
159
+ msgid "GPSLatitudeRef not found, assuming GPSLatitudeRef is North"
160
+ msgstr "GPSLatitudeRef не знойдзены, мяркуем што GPSLatitudeRef - Поўнач"
161
+
162
+ #: geopic_tag_reader/reader.py:612
163
+ msgid "Broken GPS coordinates in picture EXIF tags"
164
+ msgstr "Пашкоджаныя GPS каардынаты ў EXIF тэгах выявы"
165
+
166
+ #: geopic_tag_reader/reader.py:615 geopic_tag_reader/reader.py:639
167
+ msgid "GPSLongitudeRef not found, assuming GPSLongitudeRef is East"
168
+ msgstr "GPSLongitudeRef не знойдзены, мяркуем што GPSLongitudeRef - Усход"
169
+
170
+ #: geopic_tag_reader/reader.py:700
171
+ msgid "Precise timezone information not found, fallback to UTC"
172
+ msgstr "Дакладная інфармацыя пра часавы пояс не знойдзена, пераходзім на UTC"
173
+
174
+ #: geopic_tag_reader/reader.py:705
175
+ msgid ""
176
+ "Precise timezone information not found (and no GPS coordinates to help), "
177
+ "fallback to UTC"
178
+ msgstr ""
179
+ "Дакладная інфармацыя пра часавы пояс не знойдзена (і няма GPS-каардынат для "
180
+ "дапамогі), пераходзім на UTC"
181
+
182
+ #: geopic_tag_reader/reader.py:709
183
+ #, python-brace-format
184
+ msgid ""
185
+ "Skipping original date/time (from {datefield}) as it was not recognized: {v}"
186
+ msgstr ""
187
+ "Прапускаем арыгінальную дату/час (з {datefield}), бо яны не распазнаны: {v}"
188
+
189
+ #: geopic_tag_reader/reader.py:741
190
+ #, python-brace-format
191
+ msgid ""
192
+ "GPSTimeStamp and GPSDateTime don't contain supported time format (in {group} "
193
+ "group)"
194
+ msgstr ""
195
+ "GPSTimeStamp і GPSDateTime не ўтрымліваюць падтрыманы фармат часу (у групе "
196
+ "{group})"
197
+
198
+ #: geopic_tag_reader/reader.py:772
199
+ #, python-brace-format
200
+ msgid "Skipping GPS date/time ({group} group) as it was not recognized: {v}"
201
+ msgstr "Прапускаем GPS дату/час (група {group}), бо яны не распазнаны: {v}"
202
+
203
+ #: geopic_tag_reader/reader.py:798
204
+ #, python-brace-format
205
+ msgid ""
206
+ "Microseconds read from decimal seconds value ({microsecondsFromSeconds}) is "
207
+ "not matching value from EXIF field ({microseconds}). Max value will be kept."
208
+ msgstr ""
209
+ "Мікрасекунды, прачытаныя з дзесятковага значэння секунд "
210
+ "({microsecondsFromSeconds}), не супадаюць са значэннем з поля EXIF "
211
+ "({microseconds}). Будзе захавана максімальнае значэнне."
212
+
213
+ #: geopic_tag_reader/writer.py:132
214
+ #, python-brace-format
215
+ msgid "Unsupported key in additional tags ({k})"
216
+ msgstr "Непадтрыманы ключ у дадатковых тэгах ({k})"
@@ -8,9 +8,9 @@ msgstr ""
8
8
  "Project-Id-Version: PACKAGE VERSION\n"
9
9
  "Report-Msgid-Bugs-To: \n"
10
10
  "POT-Creation-Date: 2024-07-10 13:05+0200\n"
11
- "PO-Revision-Date: 2025-07-31 16:22+0000\n"
12
- "Last-Translator: osmmapper222 <osmmapper222@users.noreply.weblate.panoramax."
13
- "xyz>\n"
11
+ "PO-Revision-Date: 2025-10-17 17:31+0000\n"
12
+ "Last-Translator: \"F. Bausch\" <fbausch@users.noreply.weblate.panoramax.xyz>"
13
+ "\n"
14
14
  "Language-Team: German <http://weblate.panoramax.xyz/projects/panoramax/"
15
15
  "tag-reader/de/>\n"
16
16
  "Language: de\n"
@@ -30,7 +30,7 @@ msgstr "Längengrad:"
30
30
 
31
31
  #: geopic_tag_reader/main.py:28
32
32
  msgid "Timestamp:"
33
- msgstr "Zeitpunkt:"
33
+ msgstr "Zeitstempel:"
34
34
 
35
35
  #: geopic_tag_reader/main.py:29
36
36
  msgid "Heading:"
@@ -66,25 +66,25 @@ msgstr "Rollwinkel:"
66
66
 
67
67
  #: geopic_tag_reader/main.py:39
68
68
  msgid "Warnings raised by reader:"
69
- msgstr "Warnungen vom Leser erhoben:"
69
+ msgstr "Vom Leser gemeldete Warnungen:"
70
70
 
71
71
  #: geopic_tag_reader/reader.py:183
72
72
  msgid "Read latitude is out of WGS84 bounds (should be in [-90, 90])"
73
73
  msgstr ""
74
- "Ausgelesener Breitengrad liegt außerhalb der WGS84-Grenzen (sollte in "
75
- "[-90,90] liegen)"
74
+ "Ausgelesener Breitengrad liegt außerhalb der WGS84-Grenzen (muss in [-90,90] "
75
+ "liegen)"
76
76
 
77
77
  #: geopic_tag_reader/reader.py:185
78
78
  msgid "Read longitude is out of WGS84 bounds (should be in [-180, 180])"
79
79
  msgstr ""
80
- "Ausgelesener Längengrad liegt außerhalb der WGS84-Grenzen (sollte in "
81
- "[-180,180] liegen)"
80
+ "Ausgelesener Längengrad liegt außerhalb der WGS84-Grenzen (muss in [-180,180]"
81
+ " liegen)"
82
82
 
83
83
  #: geopic_tag_reader/reader.py:227
84
84
  #, python-brace-format
85
85
  msgid "Skipping Mapillary date/time as it was not recognized: {v}"
86
86
  msgstr ""
87
- "Mapillary Datum/Uhrzeit wurde übersprungen weil sie nicht erkannt wurden: {v}"
87
+ "Überspringe Datum/Uhrzeit von Mapillary, weil sie nicht erkannt wurden: {v}"
88
88
 
89
89
  #: geopic_tag_reader/reader.py:240
90
90
  msgid "Contradicting heading values found, GPSImgDirection value is used"
@@ -93,23 +93,23 @@ msgstr ""
93
93
 
94
94
  #: geopic_tag_reader/reader.py:351
95
95
  msgid "No GPS coordinates or broken coordinates in picture EXIF tags"
96
- msgstr "Keine oder invalide GPS-Koordinaten in den EXIF-Daten des Fotos"
96
+ msgstr "Keine oder ungültige GPS-Koordinaten in den EXIF-Daten des Fotos"
97
97
 
98
98
  #: geopic_tag_reader/reader.py:357
99
99
  msgid "No valid date in picture EXIF tags"
100
- msgstr "Kein valides Datum in den EXIF-Daten des Fotos"
100
+ msgstr "Kein gültiges Datum in den EXIF-Daten des Fotos"
101
101
 
102
102
  #: geopic_tag_reader/reader.py:362
103
103
  msgid "The picture is missing mandatory metadata:"
104
- msgstr "Dem Foto fehlen obligatorische Metadaten:"
104
+ msgstr "Dem Foto fehlen erforderliche Metadaten:"
105
105
 
106
106
  #: geopic_tag_reader/reader.py:449 geopic_tag_reader/reader.py:478
107
107
  msgid "GPSLatitudeRef not found, assuming GPSLatitudeRef is North"
108
- msgstr "GPSLatitudeRef nicht gefunden, nutze Norden als GPSLatitudeRef"
108
+ msgstr "GPSLatitudeRef nicht gefunden. Nutze Norden als GPSLatitudeRef"
109
109
 
110
110
  #: geopic_tag_reader/reader.py:457
111
111
  msgid "Broken GPS coordinates in picture EXIF tags"
112
- msgstr "Invalide GPS-Koordinaten in den EXIF-Daten des Fotos"
112
+ msgstr "Ungültige GPS-Koordinaten in den EXIF-Daten des Fotos"
113
113
 
114
114
  #: geopic_tag_reader/reader.py:460 geopic_tag_reader/reader.py:484
115
115
  msgid "GPSLongitudeRef not found, assuming GPSLongitudeRef is East"
@@ -117,22 +117,22 @@ msgstr "GPSLongitudeRef nicht gefunden, nutze Osten als GPSLongitudeRef"
117
117
 
118
118
  #: geopic_tag_reader/reader.py:537
119
119
  msgid "Precise timezone information not found, fallback to UTC"
120
- msgstr "Genaue Zeitzonen-Information nicht gefunden, falle auf UTC zurück"
120
+ msgstr "Genaue Zeitzonen-Information nicht gefunden, Rückgriff auf UTC"
121
121
 
122
122
  #: geopic_tag_reader/reader.py:542
123
123
  msgid ""
124
124
  "Precise timezone information not found (and no GPS coordinates to help), "
125
125
  "fallback to UTC"
126
126
  msgstr ""
127
- "Genaue Zeitzonen-Information nicht gefunden (und keine GPS-Koordinaten um zu "
128
- "helfen), falle auf UTC zurück"
127
+ "Genaue Zeitzonen-Information nicht gefunden (und keine GPS-Koordinaten zum "
128
+ "Erkennen einer möglichen Zeitzone vorhanden). Rückgriff auf UTC"
129
129
 
130
130
  #: geopic_tag_reader/reader.py:546
131
131
  #, python-brace-format
132
132
  msgid ""
133
133
  "Skipping original date/time (from {datefield}) as it was not recognized: {v}"
134
134
  msgstr ""
135
- "Überspringe originales Datum/Zeit (aus {datefield}) weil es nicht erkannt "
135
+ "Überspringe originales Datum/Zeit (aus {datefield}), weil es nicht erkannt "
136
136
  "wurde: {v}"
137
137
 
138
138
  #: geopic_tag_reader/reader.py:580
@@ -142,13 +142,13 @@ msgid ""
142
142
  "group)"
143
143
  msgstr ""
144
144
  "GPSTimeStamp und GPSDateTime enthalten kein unterstütztes Zeitformat (in "
145
- "{group} Gruppe)"
145
+ "Gruppe {group})"
146
146
 
147
147
  #: geopic_tag_reader/reader.py:611
148
148
  #, python-brace-format
149
149
  msgid "Skipping GPS date/time ({group} group) as it was not recognized: {v}"
150
150
  msgstr ""
151
- "Überspringe GPS Datum/Zeit ({group} Gruppe) da es nicht erkannt wurde: {v}"
151
+ "Überspringe GPS Datum/Zeit (Gruppe {group}), da es nicht erkannt wurde: {v}"
152
152
 
153
153
  #: geopic_tag_reader/reader.py:637
154
154
  #, python-brace-format
@@ -156,8 +156,8 @@ msgid ""
156
156
  "Microseconds read from decimal seconds value ({microsecondsFromSeconds}) is "
157
157
  "not matching value from EXIF field ({microseconds}). Max value will be kept."
158
158
  msgstr ""
159
- "Die Mikrosekunden die aus den Dezimalwerten der Sekunden gelesen wurden "
160
- "({microsecondsFromSeconds}) stimmen nicht mit den Werten aus den EXIF-Daten "
159
+ "Die Mikrosekunden, die aus den Dezimalwerten der Sekunden gelesen wurden "
160
+ "({microsecondsFromSeconds}), stimmen nicht mit den Werten aus den EXIF-Daten "
161
161
  "({microseconds}) überein. Maximaler Wert wird beibehalten."
162
162
 
163
163
  #: geopic_tag_reader/writer.py:132
@@ -184,24 +184,25 @@ msgstr "nicht gesetzt"
184
184
  #: geopic_tag_reader/reader.py:330
185
185
  msgid ""
186
186
  "No focal length value was found, this prevents calculating field of view"
187
- msgstr "Keine Brennweite gefunden, dies verhindert den Blickwinkel zu berechnen"
187
+ msgstr ""
188
+ "Keine Brennweite gefunden. Dies verhindert die Berechnung des Blickwinkels"
188
189
 
189
190
  #: geopic_tag_reader/reader.py:388
190
191
  msgid ""
191
192
  "No GPS horizontal positioning error value found, GPS accuracy can only be "
192
193
  "estimated"
193
194
  msgstr ""
194
- "Kein horizontaler GPS-Positionierungsfehlerwert gefunden, GPS-Genauigkeit "
195
- "kann nur geschätzt werden"
195
+ "Keinen Fehlerwert für horizontale GPS-Positionierung gefunden. Die GPS-"
196
+ "Genauigkeit kann nur geschätzt werden"
196
197
 
197
198
  #: geopic_tag_reader/reader.py:278
198
199
  msgid "No heading value was found, this reduces usability of picture"
199
- msgstr "Kein Kompasskurs gefunden, dies reduziert die Nutzbarkeit des Fotos"
200
+ msgstr "Keinen Kompasskurs gefunden. Dies reduziert die Nutzbarkeit des Fotos"
200
201
 
201
202
  #: geopic_tag_reader/reader.py:386
202
203
  msgid "No GPS accuracy value found, this prevents computing a quality score"
203
204
  msgstr ""
204
- "Keine GPS-Genauigkeit gefunden, dies verhindert das Berechnen eines "
205
+ "Keine GPS-Genauigkeit gefunden. Dies verhindert das Berechnen eines "
205
206
  "Qualitätswerts"
206
207
 
207
208
  #: geopic_tag_reader/reader.py:321
@@ -209,8 +210,8 @@ msgid ""
209
210
  "No make and model value found, no assumption on focal length or GPS "
210
211
  "precision can be made"
211
212
  msgstr ""
212
- "Kein Hersteller und Modell gefunden, keine Annahmen zu Brennweite oder GPS-"
213
- "Genauigkeit können angestellt werden"
213
+ "Keinen Hersteller und Modell gefunden. Annahmen zu Brennweite oder GPS-"
214
+ "Genauigkeit können nicht getroffen werden"
214
215
 
215
216
  #: geopic_tag_reader/main.py:28
216
217
  msgid "GPS accuracy:"