fotolab 0.21.0__tar.gz → 0.22.0__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.
- {fotolab-0.21.0 → fotolab-0.22.0}/CHANGELOG.md +16 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/PKG-INFO +7 -4
- {fotolab-0.21.0 → fotolab-0.22.0}/Pipfile +1 -1
- {fotolab-0.21.0 → fotolab-0.22.0}/Pipfile.lock +214 -185
- {fotolab-0.21.0 → fotolab-0.22.0}/README.md +5 -3
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/__init__.py +1 -1
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/info.py +27 -4
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/watermark.py +2 -9
- {fotolab-0.21.0 → fotolab-0.22.0}/noxfile.py +28 -6
- {fotolab-0.21.0 → fotolab-0.22.0}/pyproject.toml +1 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/.coveragerc +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/.gitignore +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/.pre-commit-config.yaml +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/.python-version +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/CONTRIBUTING.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/LICENSE.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/Makefile +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/make.bat +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/CHANGELOG.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/CONTRIBUTING.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/LICENSE.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/README.md +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/_static/logo.jpg +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/conf.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/docs/source/index.rst +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/__main__.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/animate.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/auto.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/border.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/cli.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/contrast.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/env.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/montage.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/resize.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/rotate.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/fotolab/sharpen.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/tests/__init__.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/tests/conftest.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/tests/test_env.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/tests/test_help_flag.py +0 -0
- {fotolab-0.21.0 → fotolab-0.22.0}/tests/test_quiet_flag.py +0 -0
@@ -7,6 +7,22 @@ and this project adheres to [0-based versioning](https://0ver.org/).
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## v0.22.0 (2024-12-08)
|
11
|
+
|
12
|
+
- Add `--datetime` to `info` subcommand
|
13
|
+
- Add `--no-lowercase` to `watermark` subcommand
|
14
|
+
- Bump deps
|
15
|
+
- Support major, minor, micro release for `release` job in `nox`
|
16
|
+
- Update help message in readme
|
17
|
+
- Use `camera_data` from `info` subcommand in `watermark` subcommand
|
18
|
+
|
19
|
+
## v0.21.1 (2024-12-01)
|
20
|
+
|
21
|
+
- Add requires-python field to project
|
22
|
+
- Bump deps
|
23
|
+
- Check whether photo have metadata
|
24
|
+
- Update Pipfile to Python 3.9
|
25
|
+
|
10
26
|
## v0.21.0 (2024-11-24)
|
11
27
|
|
12
28
|
- Add `--camera` flag to `info` subcommand
|
@@ -1,9 +1,10 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: fotolab
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.22.0
|
4
4
|
Summary: A console program that manipulate images.
|
5
5
|
Keywords: photography,photo
|
6
6
|
Author-email: Kian-Meng Ang <kianmeng@cpan.org>
|
7
|
+
Requires-Python: >=3.9
|
7
8
|
Description-Content-Type: text/markdown
|
8
9
|
Classifier: Development Status :: 3 - Alpha
|
9
10
|
Classifier: Environment :: Console
|
@@ -205,7 +206,7 @@ fotolab info -h
|
|
205
206
|
<!--help-info !-->
|
206
207
|
|
207
208
|
```console
|
208
|
-
usage: fotolab info [-h] [-s] IMAGE_FILENAME
|
209
|
+
usage: fotolab info [-h] [-s] [--camera] IMAGE_FILENAME
|
209
210
|
|
210
211
|
positional arguments:
|
211
212
|
IMAGE_FILENAME set the image filename
|
@@ -213,6 +214,7 @@ positional arguments:
|
|
213
214
|
options:
|
214
215
|
-h, --help show this help message and exit
|
215
216
|
-s, --sort show image info by sorted field name
|
217
|
+
--camera show the camera maker details
|
216
218
|
```
|
217
219
|
|
218
220
|
<!--help-info !-->
|
@@ -325,7 +327,7 @@ usage: fotolab watermark [-h] [-t WATERMARK_TEXT]
|
|
325
327
|
[-p {top-left,top-right,bottom-left,bottom-right}]
|
326
328
|
[-pd PADDING] [-fs FONT_SIZE] [-fc FONT_COLOR]
|
327
329
|
[-ow OUTLINE_WIDTH] [-oc OUTLINE_COLOR] [--camera]
|
328
|
-
[-l]
|
330
|
+
[-l | --lowercase | --no-lowercase]
|
329
331
|
IMAGE_FILENAMES [IMAGE_FILENAMES ...]
|
330
332
|
|
331
333
|
positional arguments:
|
@@ -353,7 +355,8 @@ options:
|
|
353
355
|
set the outline color of the watermark text (default:
|
354
356
|
'black')
|
355
357
|
--camera use camera metadata as watermark
|
356
|
-
-l, --lowercase
|
358
|
+
-l, --lowercase, --no-lowercase
|
359
|
+
lowercase the watermark text
|
357
360
|
```
|
358
361
|
|
359
362
|
<!--help-watermark !-->
|
@@ -1,11 +1,11 @@
|
|
1
1
|
{
|
2
2
|
"_meta": {
|
3
3
|
"hash": {
|
4
|
-
"sha256": "
|
4
|
+
"sha256": "0a76818192d0f36d59673b525a42ef562d0678471a6ec325a562062019c84c4b"
|
5
5
|
},
|
6
6
|
"pipfile-spec": 6,
|
7
7
|
"requires": {
|
8
|
-
"python_version": "3.
|
8
|
+
"python_version": "3.9"
|
9
9
|
},
|
10
10
|
"sources": [
|
11
11
|
{
|
@@ -16,102 +16,101 @@
|
|
16
16
|
]
|
17
17
|
},
|
18
18
|
"default": {
|
19
|
+
"fotolab": {
|
20
|
+
"file": ".",
|
21
|
+
"markers": "python_version >= '3.9'"
|
22
|
+
},
|
19
23
|
"pillow": {
|
20
24
|
"hashes": [
|
21
|
-
"sha256:
|
22
|
-
"sha256:
|
23
|
-
"sha256:
|
24
|
-
"sha256:
|
25
|
-
"sha256:
|
26
|
-
"sha256:
|
27
|
-
"sha256:
|
28
|
-
"sha256:
|
29
|
-
"sha256:
|
30
|
-
"sha256:
|
31
|
-
"sha256:
|
32
|
-
"sha256:
|
33
|
-
"sha256:
|
34
|
-
"sha256:
|
35
|
-
"sha256:
|
36
|
-
"sha256:
|
37
|
-
"sha256:
|
38
|
-
"sha256:
|
39
|
-
"sha256:
|
40
|
-
"sha256:
|
41
|
-
"sha256:
|
42
|
-
"sha256:
|
43
|
-
"sha256:
|
44
|
-
"sha256:
|
45
|
-
"sha256:
|
46
|
-
"sha256:
|
47
|
-
"sha256:
|
48
|
-
"sha256:
|
49
|
-
"sha256:
|
50
|
-
"sha256:
|
51
|
-
"sha256:
|
52
|
-
"sha256:
|
53
|
-
"sha256:
|
54
|
-
"sha256:
|
55
|
-
"sha256:
|
56
|
-
"sha256:
|
57
|
-
"sha256:
|
58
|
-
"sha256:
|
59
|
-
"sha256:
|
60
|
-
"sha256:
|
61
|
-
"sha256:
|
62
|
-
"sha256:
|
63
|
-
"sha256:
|
64
|
-
"sha256:
|
65
|
-
"sha256:
|
66
|
-
"sha256:
|
67
|
-
"sha256:
|
68
|
-
"sha256:
|
69
|
-
"sha256:
|
70
|
-
"sha256:
|
71
|
-
"sha256:
|
72
|
-
"sha256:
|
73
|
-
"sha256:
|
74
|
-
"sha256:
|
75
|
-
"sha256:
|
76
|
-
"sha256:
|
77
|
-
"sha256:
|
78
|
-
"sha256:
|
79
|
-
"sha256:
|
80
|
-
"sha256:
|
81
|
-
"sha256:
|
82
|
-
"sha256:
|
83
|
-
"sha256:
|
84
|
-
"sha256:
|
85
|
-
"sha256:
|
86
|
-
"sha256:
|
87
|
-
"sha256:
|
88
|
-
"sha256:
|
89
|
-
"sha256:
|
90
|
-
"sha256:
|
91
|
-
"sha256:
|
92
|
-
"sha256:
|
93
|
-
"sha256:
|
94
|
-
"sha256:
|
95
|
-
"sha256:
|
96
|
-
"sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef",
|
97
|
-
"sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22",
|
98
|
-
"sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27",
|
99
|
-
"sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e",
|
100
|
-
"sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"
|
25
|
+
"sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7",
|
26
|
+
"sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5",
|
27
|
+
"sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903",
|
28
|
+
"sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2",
|
29
|
+
"sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38",
|
30
|
+
"sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2",
|
31
|
+
"sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9",
|
32
|
+
"sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f",
|
33
|
+
"sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc",
|
34
|
+
"sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8",
|
35
|
+
"sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d",
|
36
|
+
"sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2",
|
37
|
+
"sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316",
|
38
|
+
"sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a",
|
39
|
+
"sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25",
|
40
|
+
"sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd",
|
41
|
+
"sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba",
|
42
|
+
"sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc",
|
43
|
+
"sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273",
|
44
|
+
"sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa",
|
45
|
+
"sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a",
|
46
|
+
"sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b",
|
47
|
+
"sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a",
|
48
|
+
"sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae",
|
49
|
+
"sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291",
|
50
|
+
"sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97",
|
51
|
+
"sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06",
|
52
|
+
"sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904",
|
53
|
+
"sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b",
|
54
|
+
"sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b",
|
55
|
+
"sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8",
|
56
|
+
"sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527",
|
57
|
+
"sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947",
|
58
|
+
"sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb",
|
59
|
+
"sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003",
|
60
|
+
"sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5",
|
61
|
+
"sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f",
|
62
|
+
"sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739",
|
63
|
+
"sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944",
|
64
|
+
"sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830",
|
65
|
+
"sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f",
|
66
|
+
"sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3",
|
67
|
+
"sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4",
|
68
|
+
"sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84",
|
69
|
+
"sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7",
|
70
|
+
"sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6",
|
71
|
+
"sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6",
|
72
|
+
"sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9",
|
73
|
+
"sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de",
|
74
|
+
"sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4",
|
75
|
+
"sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47",
|
76
|
+
"sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd",
|
77
|
+
"sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50",
|
78
|
+
"sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c",
|
79
|
+
"sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086",
|
80
|
+
"sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba",
|
81
|
+
"sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306",
|
82
|
+
"sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699",
|
83
|
+
"sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e",
|
84
|
+
"sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488",
|
85
|
+
"sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa",
|
86
|
+
"sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2",
|
87
|
+
"sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3",
|
88
|
+
"sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9",
|
89
|
+
"sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923",
|
90
|
+
"sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2",
|
91
|
+
"sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790",
|
92
|
+
"sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734",
|
93
|
+
"sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916",
|
94
|
+
"sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1",
|
95
|
+
"sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f",
|
96
|
+
"sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798",
|
97
|
+
"sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb",
|
98
|
+
"sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2",
|
99
|
+
"sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9"
|
101
100
|
],
|
102
101
|
"index": "pypi",
|
103
|
-
"markers": "python_version >= '3.
|
104
|
-
"version": "==
|
102
|
+
"markers": "python_version >= '3.9'",
|
103
|
+
"version": "==11.0.0"
|
105
104
|
}
|
106
105
|
},
|
107
106
|
"develop": {
|
108
107
|
"alabaster": {
|
109
108
|
"hashes": [
|
110
|
-
"sha256:
|
111
|
-
"sha256:
|
109
|
+
"sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65",
|
110
|
+
"sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"
|
112
111
|
],
|
113
|
-
"markers": "python_version >= '3.
|
114
|
-
"version": "==
|
112
|
+
"markers": "python_version >= '3.9'",
|
113
|
+
"version": "==0.7.16"
|
115
114
|
},
|
116
115
|
"argcomplete": {
|
117
116
|
"hashes": [
|
@@ -277,71 +276,71 @@
|
|
277
276
|
"toml"
|
278
277
|
],
|
279
278
|
"hashes": [
|
280
|
-
"sha256:
|
281
|
-
"sha256:
|
282
|
-
"sha256:
|
283
|
-
"sha256:
|
284
|
-
"sha256:
|
285
|
-
"sha256:
|
286
|
-
"sha256:
|
287
|
-
"sha256:
|
288
|
-
"sha256:
|
289
|
-
"sha256:
|
290
|
-
"sha256:
|
291
|
-
"sha256:
|
292
|
-
"sha256:
|
293
|
-
"sha256:
|
294
|
-
"sha256:
|
295
|
-
"sha256:
|
296
|
-
"sha256:
|
297
|
-
"sha256:
|
298
|
-
"sha256:
|
299
|
-
"sha256:
|
300
|
-
"sha256:
|
301
|
-
"sha256:
|
302
|
-
"sha256:
|
303
|
-
"sha256:
|
304
|
-
"sha256:
|
305
|
-
"sha256:
|
306
|
-
"sha256:
|
307
|
-
"sha256:
|
308
|
-
"sha256:
|
309
|
-
"sha256:
|
310
|
-
"sha256:
|
311
|
-
"sha256:
|
312
|
-
"sha256:
|
313
|
-
"sha256:
|
314
|
-
"sha256:
|
315
|
-
"sha256:
|
316
|
-
"sha256:
|
317
|
-
"sha256:
|
318
|
-
"sha256:
|
319
|
-
"sha256:
|
320
|
-
"sha256:
|
321
|
-
"sha256:
|
322
|
-
"sha256:
|
323
|
-
"sha256:
|
324
|
-
"sha256:
|
325
|
-
"sha256:
|
326
|
-
"sha256:
|
327
|
-
"sha256:
|
328
|
-
"sha256:
|
329
|
-
"sha256:
|
330
|
-
"sha256:
|
331
|
-
"sha256:
|
332
|
-
"sha256:
|
333
|
-
"sha256:
|
334
|
-
"sha256:
|
335
|
-
"sha256:
|
336
|
-
"sha256:
|
337
|
-
"sha256:
|
338
|
-
"sha256:
|
339
|
-
"sha256:
|
340
|
-
"sha256:
|
341
|
-
"sha256:
|
279
|
+
"sha256:093896e530c38c8e9c996901858ac63f3d4171268db2c9c8b373a228f459bbc5",
|
280
|
+
"sha256:09b9f848b28081e7b975a3626e9081574a7b9196cde26604540582da60235fdf",
|
281
|
+
"sha256:0b0c69f4f724c64dfbfe79f5dfb503b42fe6127b8d479b2677f2b227478db2eb",
|
282
|
+
"sha256:13618bed0c38acc418896005732e565b317aa9e98d855a0e9f211a7ffc2d6638",
|
283
|
+
"sha256:13690e923a3932e4fad4c0ebfb9cb5988e03d9dcb4c5150b5fcbf58fd8bddfc4",
|
284
|
+
"sha256:177f01eeaa3aee4a5ffb0d1439c5952b53d5010f86e9d2667963e632e30082cc",
|
285
|
+
"sha256:193e3bffca48ad74b8c764fb4492dd875038a2f9925530cb094db92bb5e47bed",
|
286
|
+
"sha256:1defe91d41ce1bd44b40fabf071e6a01a5aa14de4a31b986aa9dfd1b3e3e414a",
|
287
|
+
"sha256:1f188a2402f8359cf0c4b1fe89eea40dc13b52e7b4fd4812450da9fcd210181d",
|
288
|
+
"sha256:202a2d645c5a46b84992f55b0a3affe4f0ba6b4c611abec32ee88358db4bb649",
|
289
|
+
"sha256:24eda3a24a38157eee639ca9afe45eefa8d2420d49468819ac5f88b10de84f4c",
|
290
|
+
"sha256:2e4e0f60cb4bd7396108823548e82fdab72d4d8a65e58e2c19bbbc2f1e2bfa4b",
|
291
|
+
"sha256:379c111d3558272a2cae3d8e57e6b6e6f4fe652905692d54bad5ea0ca37c5ad4",
|
292
|
+
"sha256:37cda8712145917105e07aab96388ae76e787270ec04bcb9d5cc786d7cbb8443",
|
293
|
+
"sha256:38c51297b35b3ed91670e1e4efb702b790002e3245a28c76e627478aa3c10d83",
|
294
|
+
"sha256:3985b9be361d8fb6b2d1adc9924d01dec575a1d7453a14cccd73225cb79243ee",
|
295
|
+
"sha256:3988665ee376abce49613701336544041f2117de7b7fbfe91b93d8ff8b151c8e",
|
296
|
+
"sha256:3ac47fa29d8d41059ea3df65bd3ade92f97ee4910ed638e87075b8e8ce69599e",
|
297
|
+
"sha256:3b4b4299dd0d2c67caaaf286d58aef5e75b125b95615dda4542561a5a566a1e3",
|
298
|
+
"sha256:3ea8bb1ab9558374c0ab591783808511d135a833c3ca64a18ec927f20c4030f0",
|
299
|
+
"sha256:3fe47da3e4fda5f1abb5709c156eca207eacf8007304ce3019eb001e7a7204cb",
|
300
|
+
"sha256:428ac484592f780e8cd7b6b14eb568f7c85460c92e2a37cb0c0e5186e1a0d076",
|
301
|
+
"sha256:44e6c85bbdc809383b509d732b06419fb4544dca29ebe18480379633623baafb",
|
302
|
+
"sha256:4674f0daa1823c295845b6a740d98a840d7a1c11df00d1fd62614545c1583787",
|
303
|
+
"sha256:4be32da0c3827ac9132bb488d331cb32e8d9638dd41a0557c5569d57cf22c9c1",
|
304
|
+
"sha256:4db3ed6a907b555e57cc2e6f14dc3a4c2458cdad8919e40b5357ab9b6db6c43e",
|
305
|
+
"sha256:5c52a036535d12590c32c49209e79cabaad9f9ad8aa4cbd875b68c4d67a9cbce",
|
306
|
+
"sha256:629a1ba2115dce8bf75a5cce9f2486ae483cb89c0145795603d6554bdc83e801",
|
307
|
+
"sha256:62a66ff235e4c2e37ed3b6104d8b478d767ff73838d1222132a7a026aa548764",
|
308
|
+
"sha256:63068a11171e4276f6ece913bde059e77c713b48c3a848814a6537f35afb8365",
|
309
|
+
"sha256:63c19702db10ad79151a059d2d6336fe0c470f2e18d0d4d1a57f7f9713875dcf",
|
310
|
+
"sha256:644ec81edec0f4ad17d51c838a7d01e42811054543b76d4ba2c5d6af741ce2a6",
|
311
|
+
"sha256:6535d996f6537ecb298b4e287a855f37deaf64ff007162ec0afb9ab8ba3b8b71",
|
312
|
+
"sha256:6f4548c5ead23ad13fb7a2c8ea541357474ec13c2b736feb02e19a3085fac002",
|
313
|
+
"sha256:716a78a342679cd1177bc8c2fe957e0ab91405bd43a17094324845200b2fddf4",
|
314
|
+
"sha256:74610105ebd6f33d7c10f8907afed696e79c59e3043c5f20eaa3a46fddf33b4c",
|
315
|
+
"sha256:768939f7c4353c0fac2f7c37897e10b1414b571fd85dd9fc49e6a87e37a2e0d8",
|
316
|
+
"sha256:86cffe9c6dfcfe22e28027069725c7f57f4b868a3f86e81d1c62462764dc46d4",
|
317
|
+
"sha256:8aae5aea53cbfe024919715eca696b1a3201886ce83790537d1c3668459c7146",
|
318
|
+
"sha256:8b2b8503edb06822c86d82fa64a4a5cb0760bb8f31f26e138ec743f422f37cfc",
|
319
|
+
"sha256:912e95017ff51dc3d7b6e2be158dedc889d9a5cc3382445589ce554f1a34c0ea",
|
320
|
+
"sha256:9a7b8ac36fd688c8361cbc7bf1cb5866977ece6e0b17c34aa0df58bda4fa18a4",
|
321
|
+
"sha256:9e89d5c8509fbd6c03d0dd1972925b22f50db0792ce06324ba069f10787429ad",
|
322
|
+
"sha256:ae270e79f7e169ccfe23284ff5ea2d52a6f401dc01b337efb54b3783e2ce3f28",
|
323
|
+
"sha256:b07c25d52b1c16ce5de088046cd2432b30f9ad5e224ff17c8f496d9cb7d1d451",
|
324
|
+
"sha256:b39e6011cd06822eb964d038d5dff5da5d98652b81f5ecd439277b32361a3a50",
|
325
|
+
"sha256:bd55f8fc8fa494958772a2a7302b0354ab16e0b9272b3c3d83cdb5bec5bd1779",
|
326
|
+
"sha256:c15b32a7aca8038ed7644f854bf17b663bc38e1671b5d6f43f9a2b2bd0c46f63",
|
327
|
+
"sha256:c1b4474beee02ede1eef86c25ad4600a424fe36cff01a6103cb4533c6bf0169e",
|
328
|
+
"sha256:c79c0685f142ca53256722a384540832420dff4ab15fec1863d7e5bc8691bdcc",
|
329
|
+
"sha256:c9ebfb2507751f7196995142f057d1324afdab56db1d9743aab7f50289abd022",
|
330
|
+
"sha256:d7ad66e8e50225ebf4236368cc43c37f59d5e6728f15f6e258c8639fa0dd8e6d",
|
331
|
+
"sha256:d82ab6816c3277dc962cfcdc85b1efa0e5f50fb2c449432deaf2398a2928ab94",
|
332
|
+
"sha256:d9fd2547e6decdbf985d579cf3fc78e4c1d662b9b0ff7cc7862baaab71c9cc5b",
|
333
|
+
"sha256:de38add67a0af869b0d79c525d3e4588ac1ffa92f39116dbe0ed9753f26eba7d",
|
334
|
+
"sha256:e19122296822deafce89a0c5e8685704c067ae65d45e79718c92df7b3ec3d331",
|
335
|
+
"sha256:e44961e36cb13c495806d4cac67640ac2866cb99044e210895b506c26ee63d3a",
|
336
|
+
"sha256:e4c81ed2820b9023a9a90717020315e63b17b18c274a332e3b6437d7ff70abe0",
|
337
|
+
"sha256:e683e6ecc587643f8cde8f5da6768e9d165cd31edf39ee90ed7034f9ca0eefee",
|
338
|
+
"sha256:f39e2f3530ed1626c66e7493be7a8423b023ca852aacdc91fb30162c350d2a92",
|
339
|
+
"sha256:f56f49b2553d7dd85fd86e029515a221e5c1f8cb3d9c38b470bc38bde7b8445a",
|
340
|
+
"sha256:fb9fc32399dca861584d96eccd6c980b69bbcd7c228d06fb74fe53e007aa8ef9"
|
342
341
|
],
|
343
342
|
"markers": "python_version >= '3.9'",
|
344
|
-
"version": "==7.6.
|
343
|
+
"version": "==7.6.8"
|
345
344
|
},
|
346
345
|
"distlib": {
|
347
346
|
"hashes": [
|
@@ -436,16 +435,16 @@
|
|
436
435
|
"version": "==0.21.0"
|
437
436
|
},
|
438
437
|
"fotolab": {
|
439
|
-
"
|
440
|
-
"
|
438
|
+
"file": ".",
|
439
|
+
"markers": "python_version >= '3.9'"
|
441
440
|
},
|
442
441
|
"identify": {
|
443
442
|
"hashes": [
|
444
|
-
"sha256:
|
445
|
-
"sha256:
|
443
|
+
"sha256:62f5dae9b5fef52c84cc188514e9ea4f3f636b1d8799ab5ebc475471f9e47a02",
|
444
|
+
"sha256:9edba65473324c2ea9684b1f944fe3191db3345e50b6d04571d10ed164f8d7bd"
|
446
445
|
],
|
447
|
-
"markers": "python_version >= '3.
|
448
|
-
"version": "==2.6.
|
446
|
+
"markers": "python_version >= '3.9'",
|
447
|
+
"version": "==2.6.3"
|
449
448
|
},
|
450
449
|
"idna": {
|
451
450
|
"hashes": [
|
@@ -589,12 +588,12 @@
|
|
589
588
|
},
|
590
589
|
"myst-parser": {
|
591
590
|
"hashes": [
|
592
|
-
"sha256:
|
593
|
-
"sha256:
|
591
|
+
"sha256:6457aaa33a5d474aca678b8ead9b3dc298e89c68e67012e73146ea6fd54babf1",
|
592
|
+
"sha256:88f0cb406cb363b077d176b51c476f62d60604d68a8dcdf4832e080441301a87"
|
594
593
|
],
|
595
594
|
"index": "pypi",
|
596
|
-
"markers": "python_version >= '3.
|
597
|
-
"version": "==
|
595
|
+
"markers": "python_version >= '3.8'",
|
596
|
+
"version": "==3.0.1"
|
598
597
|
},
|
599
598
|
"nodeenv": {
|
600
599
|
"hashes": [
|
@@ -615,11 +614,11 @@
|
|
615
614
|
},
|
616
615
|
"packaging": {
|
617
616
|
"hashes": [
|
618
|
-
"sha256:
|
619
|
-
"sha256:
|
617
|
+
"sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759",
|
618
|
+
"sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"
|
620
619
|
],
|
621
620
|
"markers": "python_version >= '3.8'",
|
622
|
-
"version": "==24.
|
621
|
+
"version": "==24.2"
|
623
622
|
},
|
624
623
|
"pillow": {
|
625
624
|
"hashes": [
|
@@ -762,12 +761,12 @@
|
|
762
761
|
},
|
763
762
|
"pytest": {
|
764
763
|
"hashes": [
|
765
|
-
"sha256:
|
766
|
-
"sha256:
|
764
|
+
"sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6",
|
765
|
+
"sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"
|
767
766
|
],
|
768
767
|
"index": "pypi",
|
769
768
|
"markers": "python_version >= '3.8'",
|
770
|
-
"version": "==8.3.
|
769
|
+
"version": "==8.3.4"
|
771
770
|
},
|
772
771
|
"pytest-cov": {
|
773
772
|
"hashes": [
|
@@ -879,21 +878,21 @@
|
|
879
878
|
},
|
880
879
|
"sphinx": {
|
881
880
|
"hashes": [
|
882
|
-
"sha256:
|
883
|
-
"sha256:
|
881
|
+
"sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe",
|
882
|
+
"sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239"
|
884
883
|
],
|
885
884
|
"index": "pypi",
|
886
|
-
"markers": "python_version >= '3.
|
887
|
-
"version": "==
|
885
|
+
"markers": "python_version >= '3.9'",
|
886
|
+
"version": "==7.4.7"
|
888
887
|
},
|
889
888
|
"sphinx-autodoc-typehints": {
|
890
889
|
"hashes": [
|
891
|
-
"sha256:
|
892
|
-
"sha256:
|
890
|
+
"sha256:3098e2c6d0ba99eacd013eb06861acc9b51c6e595be86ab05c08ee5506ac0c67",
|
891
|
+
"sha256:535c78ed2d6a1bad393ba9f3dfa2602cf424e2631ee207263e07874c38fde084"
|
893
892
|
],
|
894
893
|
"index": "pypi",
|
895
|
-
"markers": "python_version >= '3.
|
896
|
-
"version": "==2.
|
894
|
+
"markers": "python_version >= '3.9'",
|
895
|
+
"version": "==2.3.0"
|
897
896
|
},
|
898
897
|
"sphinx-copybutton": {
|
899
898
|
"hashes": [
|
@@ -954,12 +953,42 @@
|
|
954
953
|
},
|
955
954
|
"tomli": {
|
956
955
|
"hashes": [
|
957
|
-
"sha256:
|
958
|
-
"sha256:
|
956
|
+
"sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6",
|
957
|
+
"sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd",
|
958
|
+
"sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c",
|
959
|
+
"sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b",
|
960
|
+
"sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8",
|
961
|
+
"sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6",
|
962
|
+
"sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77",
|
963
|
+
"sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff",
|
964
|
+
"sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea",
|
965
|
+
"sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192",
|
966
|
+
"sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249",
|
967
|
+
"sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee",
|
968
|
+
"sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4",
|
969
|
+
"sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98",
|
970
|
+
"sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8",
|
971
|
+
"sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4",
|
972
|
+
"sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281",
|
973
|
+
"sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744",
|
974
|
+
"sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69",
|
975
|
+
"sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13",
|
976
|
+
"sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140",
|
977
|
+
"sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e",
|
978
|
+
"sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e",
|
979
|
+
"sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc",
|
980
|
+
"sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff",
|
981
|
+
"sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec",
|
982
|
+
"sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2",
|
983
|
+
"sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222",
|
984
|
+
"sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106",
|
985
|
+
"sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272",
|
986
|
+
"sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a",
|
987
|
+
"sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"
|
959
988
|
],
|
960
989
|
"index": "pypi",
|
961
990
|
"markers": "python_version >= '3.8'",
|
962
|
-
"version": "==2.
|
991
|
+
"version": "==2.2.1"
|
963
992
|
},
|
964
993
|
"urllib3": {
|
965
994
|
"hashes": [
|
@@ -971,19 +1000,19 @@
|
|
971
1000
|
},
|
972
1001
|
"virtualenv": {
|
973
1002
|
"hashes": [
|
974
|
-
"sha256:
|
975
|
-
"sha256:
|
1003
|
+
"sha256:23eae1b4516ecd610481eda647f3a7c09aea295055337331bb4e6892ecce47b0",
|
1004
|
+
"sha256:2c9c3262bb8e7b87ea801d715fae4495e6032450c71d2309be9550e7364049aa"
|
976
1005
|
],
|
977
1006
|
"markers": "python_version >= '3.8'",
|
978
|
-
"version": "==20.
|
1007
|
+
"version": "==20.28.0"
|
979
1008
|
},
|
980
1009
|
"zipp": {
|
981
1010
|
"hashes": [
|
982
|
-
"sha256:
|
983
|
-
"sha256:
|
1011
|
+
"sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4",
|
1012
|
+
"sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"
|
984
1013
|
],
|
985
|
-
"markers": "python_version >= '3.
|
986
|
-
"version": "==3.
|
1014
|
+
"markers": "python_version >= '3.9'",
|
1015
|
+
"version": "==3.21.0"
|
987
1016
|
}
|
988
1017
|
}
|
989
1018
|
}
|
@@ -183,7 +183,7 @@ fotolab info -h
|
|
183
183
|
<!--help-info !-->
|
184
184
|
|
185
185
|
```console
|
186
|
-
usage: fotolab info [-h] [-s] IMAGE_FILENAME
|
186
|
+
usage: fotolab info [-h] [-s] [--camera] IMAGE_FILENAME
|
187
187
|
|
188
188
|
positional arguments:
|
189
189
|
IMAGE_FILENAME set the image filename
|
@@ -191,6 +191,7 @@ positional arguments:
|
|
191
191
|
options:
|
192
192
|
-h, --help show this help message and exit
|
193
193
|
-s, --sort show image info by sorted field name
|
194
|
+
--camera show the camera maker details
|
194
195
|
```
|
195
196
|
|
196
197
|
<!--help-info !-->
|
@@ -303,7 +304,7 @@ usage: fotolab watermark [-h] [-t WATERMARK_TEXT]
|
|
303
304
|
[-p {top-left,top-right,bottom-left,bottom-right}]
|
304
305
|
[-pd PADDING] [-fs FONT_SIZE] [-fc FONT_COLOR]
|
305
306
|
[-ow OUTLINE_WIDTH] [-oc OUTLINE_COLOR] [--camera]
|
306
|
-
[-l]
|
307
|
+
[-l | --lowercase | --no-lowercase]
|
307
308
|
IMAGE_FILENAMES [IMAGE_FILENAMES ...]
|
308
309
|
|
309
310
|
positional arguments:
|
@@ -331,7 +332,8 @@ options:
|
|
331
332
|
set the outline color of the watermark text (default:
|
332
333
|
'black')
|
333
334
|
--camera use camera metadata as watermark
|
334
|
-
-l, --lowercase
|
335
|
+
-l, --lowercase, --no-lowercase
|
336
|
+
lowercase the watermark text
|
335
337
|
```
|
336
338
|
|
337
339
|
<!--help-watermark !-->
|
@@ -54,6 +54,14 @@ def build_subparser(subparsers) -> None:
|
|
54
54
|
help="show the camera maker details",
|
55
55
|
)
|
56
56
|
|
57
|
+
info_parser.add_argument(
|
58
|
+
"--datetime",
|
59
|
+
default=False,
|
60
|
+
action="store_true",
|
61
|
+
dest="datetime",
|
62
|
+
help="show the datetime",
|
63
|
+
)
|
64
|
+
|
57
65
|
|
58
66
|
def run(args: argparse.Namespace) -> None:
|
59
67
|
"""Run info subcommand.
|
@@ -67,18 +75,27 @@ def run(args: argparse.Namespace) -> None:
|
|
67
75
|
log.debug(args)
|
68
76
|
if args.camera:
|
69
77
|
print(camera_metadata(args.image_filename))
|
78
|
+
if args.datetime:
|
79
|
+
print(datetime(args.image_filename))
|
70
80
|
else:
|
71
81
|
exif_tags = extract_exif_tags(args.image_filename)
|
72
|
-
|
73
|
-
|
74
|
-
|
82
|
+
if exif_tags:
|
83
|
+
tag_name_width = max(map(len, exif_tags))
|
84
|
+
for tag_name, tag_value in exif_tags.items():
|
85
|
+
print(f"{tag_name:<{tag_name_width}}: {tag_value}")
|
86
|
+
else:
|
87
|
+
print("No metadata found!")
|
75
88
|
|
76
89
|
|
77
90
|
def extract_exif_tags(image_filename: str, sort: bool = False) -> dict:
|
78
91
|
"""Extract Exif metadata from image."""
|
79
92
|
image = Image.open(image_filename)
|
80
93
|
exif = image._getexif()
|
81
|
-
|
94
|
+
log.debug(exif)
|
95
|
+
|
96
|
+
info = {}
|
97
|
+
if exif:
|
98
|
+
info = {ExifTags.TAGS.get(tag_id): exif.get(tag_id) for tag_id in exif}
|
82
99
|
|
83
100
|
filtered_info = {
|
84
101
|
key: value for key, value in info.items() if key is not None
|
@@ -89,6 +106,12 @@ def extract_exif_tags(image_filename: str, sort: bool = False) -> dict:
|
|
89
106
|
return filtered_info
|
90
107
|
|
91
108
|
|
109
|
+
def datetime(image_filename):
|
110
|
+
"""Extract datetime metadata."""
|
111
|
+
exif_tags = extract_exif_tags(image_filename)
|
112
|
+
return exif_tags["DateTime"]
|
113
|
+
|
114
|
+
|
92
115
|
def camera_metadata(image_filename):
|
93
116
|
"""Extract camera and model metadata."""
|
94
117
|
exif_tags = extract_exif_tags(image_filename)
|
@@ -22,7 +22,7 @@ import math
|
|
22
22
|
from PIL import Image, ImageColor, ImageDraw, ImageFont
|
23
23
|
|
24
24
|
from fotolab import save_image
|
25
|
-
from fotolab.info import
|
25
|
+
from fotolab.info import camera_metadata
|
26
26
|
|
27
27
|
log = logging.getLogger(__name__)
|
28
28
|
|
@@ -139,7 +139,7 @@ def build_subparser(subparsers) -> None:
|
|
139
139
|
"-l",
|
140
140
|
"--lowercase",
|
141
141
|
default=True,
|
142
|
-
action=
|
142
|
+
action=argparse.BooleanOptionalAction,
|
143
143
|
dest="lowercase",
|
144
144
|
help="lowercase the watermark text",
|
145
145
|
)
|
@@ -200,13 +200,6 @@ def watermark_image(image_filename, args):
|
|
200
200
|
return watermarked_image
|
201
201
|
|
202
202
|
|
203
|
-
def camera_metadata(image_filename):
|
204
|
-
"""Extract camera and model metadata."""
|
205
|
-
exif_tags = extract_exif_tags(image_filename)
|
206
|
-
metadata = f'{exif_tags["Make"]} {exif_tags["Model"]}'
|
207
|
-
return metadata.strip()
|
208
|
-
|
209
|
-
|
210
203
|
def calc_font_size(image, args) -> int:
|
211
204
|
"""Calculate the font size based on the width of the image."""
|
212
205
|
width, _height = image.size
|
@@ -118,8 +118,15 @@ def readme(session: nox.Session) -> None:
|
|
118
118
|
|
119
119
|
|
120
120
|
@nox.session(python="3.13", reuse_venv=True)
|
121
|
-
def release(
|
122
|
-
"""Bump release.
|
121
|
+
def release(session: nox.Session) -> None:
|
122
|
+
"""Bump release.
|
123
|
+
|
124
|
+
To set which part of version explicitly:
|
125
|
+
|
126
|
+
nox -s release -- major
|
127
|
+
nox -s release -- minor
|
128
|
+
nox -s release -- micro (default)
|
129
|
+
"""
|
123
130
|
with open("fotolab/__init__.py", "r", encoding="utf8") as f:
|
124
131
|
tree = ast.parse(f.read())
|
125
132
|
current_version = None
|
@@ -134,11 +141,26 @@ def release(_session: nox.Session) -> None:
|
|
134
141
|
raise ValueError("Missing __version__ variable in __init__.py")
|
135
142
|
|
136
143
|
before_version = Version(current_version)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
144
|
+
|
145
|
+
(major, minor, micro) = (
|
146
|
+
before_version.major,
|
147
|
+
before_version.minor,
|
148
|
+
before_version.micro,
|
141
149
|
)
|
150
|
+
if "major" in session.posargs:
|
151
|
+
major = major + 1
|
152
|
+
minor = 0
|
153
|
+
micro = 0
|
154
|
+
|
155
|
+
if "minor" in session.posargs:
|
156
|
+
minor = minor + 1
|
157
|
+
micro = 0
|
158
|
+
|
159
|
+
if "micro" in session.posargs or session.posargs == []:
|
160
|
+
micro = micro + 1
|
161
|
+
|
162
|
+
after_version = f"{major}.{minor}.{micro}"
|
163
|
+
|
142
164
|
_search_and_replace(
|
143
165
|
"fotolab/__init__.py", str(before_version), after_version
|
144
166
|
)
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|