forked from ianare/exif-py
-
Notifications
You must be signed in to change notification settings - Fork 0
/
EXIF.py
executable file
·132 lines (107 loc) · 3.85 KB
/
EXIF.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#
# Library to extract Exif information from digital camera image files.
# https://github.com/ianare/exif-py
#
#
# Copyright (c) 2002-2007 Gene Cash
# Copyright (c) 2007-2014 Ianaré Sévi and contributors
#
# See LICENSE.txt file for licensing information
# See CHANGES.txt file for all contributors and changes
#
"""
Runs Exif tag extraction in command line.
"""
import sys
import getopt
import logging
import timeit
from exifread.tags import DEFAULT_STOP_TAG, FIELD_TYPES
from exifread import process_file, exif_log, __version__
logger = exif_log.get_logger()
def usage(exit_status):
"""Show command line usage."""
msg = ('Usage: EXIF.py [OPTIONS] file1 [file2 ...]\n'
'Extract EXIF information from digital camera image files.\n\nOptions:\n'
'-h --help Display usage information and exit.\n'
'-v --version Display version information and exit.\n'
'-q --quick Do not process MakerNotes.\n'
'-t TAG --stop-tag TAG Stop processing when this tag is retrieved.\n'
'-s --strict Run in strict mode (stop on errors).\n'
'-d --debug Run in debug mode (display extra info).\n'
'-c --color Output in color (only works with debug on POSIX).\n'
)
print(msg)
sys.exit(exit_status)
def show_version():
"""Show the program version."""
print('Version %s on Python%s' % (__version__, sys.version_info[0]))
sys.exit(0)
def main():
"""Parse command line options/arguments and execute."""
try:
arg_names = ["help", "version", "quick", "strict", "debug", "stop-tag="]
opts, args = getopt.getopt(sys.argv[1:], "hvqsdct:v", arg_names)
except getopt.GetoptError:
usage(2)
detailed = True
stop_tag = DEFAULT_STOP_TAG
debug = False
strict = False
color = False
for option, arg in opts:
if option in ("-h", "--help"):
usage(0)
if option in ("-v", "--version"):
show_version()
if option in ("-q", "--quick"):
detailed = False
if option in ("-t", "--stop-tag"):
stop_tag = arg
if option in ("-s", "--strict"):
strict = True
if option in ("-d", "--debug"):
debug = True
if option in ("-c", "--color"):
color = True
if not args:
usage(2)
exif_log.setup_logger(debug, color)
# output info for each file
for filename in args:
file_start = timeit.default_timer()
try:
img_file = open(str(filename), 'rb')
except IOError:
logger.error("'%s' is unreadable", filename)
continue
logger.info("Opening: %s", filename)
tag_start = timeit.default_timer()
# get the tags
data = process_file(img_file, stop_tag=stop_tag, details=detailed, strict=strict, debug=debug)
tag_stop = timeit.default_timer()
if not data:
logger.warning("No EXIF information found\n")
continue
if 'JPEGThumbnail' in data:
logger.info('File has JPEG thumbnail')
del data['JPEGThumbnail']
if 'TIFFThumbnail' in data:
logger.info('File has TIFF thumbnail')
del data['TIFFThumbnail']
tag_keys = list(data.keys())
tag_keys.sort()
for i in tag_keys:
try:
logger.info('%s (%s): %s', i, FIELD_TYPES[data[i].field_type][2], data[i].printable)
except:
logger.error("%s : %s", i, str(data[i]))
file_stop = timeit.default_timer()
logger.debug("Tags processed in %s seconds", tag_stop - tag_start)
logger.debug("File processed in %s seconds", file_stop - file_start)
print("")
if __name__ == '__main__':
main()