Passed
Push — master ( cb8661...b33fcc )
by Cyb3r
07:37 queued 11s
created

MetaStalk.main.start()   A

Complexity

Conditions 2

Size

Total Lines 28
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 20
nop 0
dl 0
loc 28
rs 9.4
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
"""This script get the exif data from photos
3
and creates graphs from the metadata"""
4
import argparse
5
import os
6
import logging
7
import timeit
8
from hachoir.parser import createParser
9
from hachoir.metadata import extractMetadata
10
11
12
import MetaStalk.utils as utils
13
import MetaStalk.modules as modules
14
15
16
t_start = timeit.default_timer()
17
18
19
def start():
20
    """start
21
22
    Sets up MetaStalk and parses arguments.
23
    Will raise an IOError if no path is passed.
24
    """
25
    parser = argparse.ArgumentParser(prog="MetaStalk",
26
                                     description="Tool to graph "
27
                                                 "image metadata.")
28
    parser.add_argument('files', nargs='*', default=None,
29
                        help='Path of photos to check.')
30
    parser.add_argument('-t', '--test', default=False, action="store_true",
31
                        help='Does not show the graphs at the end.')
32
# Logging function from https://stackoverflow.com/a/20663028
33
    parser.add_argument('-d', '--debug', help="Sets logging level to DEBUG.",
34
                        action="store_const", dest="loglevel",
35
                        const=logging.DEBUG, default=logging.WARNING)
36
    parser.add_argument("-v", "--verbose", help="Sets logging level to INFO",
37
                        action="store_const", dest="loglevel",
38
                        const=logging.INFO)
39
    args = parser.parse_args()
40
41
    log = utils.make_logger("MetaStalk", args.loglevel)
42
    log.info("MetaStalk starting")
43
    if not args.files:
44
        log.error("ERROR: No path was inputted.")
45
        raise IOError("No path was inputted.")
46
    run(args, log)
47
48
49
def run(args, log: logging.Logger):
50
    """run
51
52
    Process files and generates graphs
53
54
    Arguments:
55
        args {argparse.Namespace} -- The arguments from start()
56
        log {logging.Logger} -- Logger
57
    """
58
    for path in args.files:
59
        isdir = os.path.isdir(path)
60
        log.debug("Detected path as a directory")
61
62
    if isdir:
0 ignored issues
show
introduced by
The variable isdir does not seem to be defined in case the for loop on line 58 is not entered. Are you sure this can never be the case?
Loading history...
63
        photos, invalid_photos = directory_search(args.files[0], log)
64
    else:
65
        photos, invalid_photos = file_search(args.files, log)
66
67
    plots = {
68
        "STATS": modules.Stats(photos, invalid_photos),
69
        "GPS": modules.GPS_Check(photos),
70
        "Timestamp": modules.date_time(photos),
71
        "Model": modules.PieChart(photos, "Camera model"),
72
        "Manufacturer": modules.PieChart(photos, "Camera manufacturer"),
73
        "Focal": modules.PieChart(photos, "Camera focal"),
74
        "Producer": modules.PieChart(photos, "Producer")
75
    }
76
77
    utils.graph(plots, t_start, args.test)
78
79
80
def directory_search(files: list, log: logging.Logger) -> (list, list):
81
    """directory_search
82
83
    Used to append all files in a directory from args.
84
85
    Arguments:
86
        files {list} -- List of directories to parse
87
        log {logging.Logger} -- Logger
88
89
    Returns:
90
        valid, invalid -- List of photos with metadata and ones without
91
    """
92
    valid, invalid = [], []
93
    for item in os.listdir(files):
94
        item_path = os.path.join(files, item)
95
        parser = createParser(item_path)
96
        metadata = extractMetadata(parser).exportDictionary()["Metadata"]
97
        if metadata:
98
            metadata["item"] = item_path
99
            valid.append(metadata)
100
            log.debug("%s has metadata", item)
101
        else:
102
            metadata["item"] = item_path
103
            invalid.append(metadata)
104
            log.debug("%s has no metadata", item)
105
    return valid, invalid
106
107
108
def file_search(files: list, log: logging.Logger) -> (list, list):
109
    """file_search
110
111
    Used to append files if the path is not a directory.
112
113
    Arguments:
114
        files {list} -- List of files to parse
115
        log {logging.Logger} -- Logger
116
117
    Returns:
118
        valid, invalid -- List of photos with metadata and ones without
119
    """
120
    valid, invalid = [], []
121
    for _, item in enumerate(files):
122
        parser = createParser(item)
123
        metadata = extractMetadata(parser).exportDictionary()["Metadata"]
124
        if metadata:
125
            metadata["item"] = item
126
            valid.append(metadata)
127
            log.debug("%s has metadata", item)
128
        else:
129
            metadata["item"] = item
130
            invalid.append(metadata)
131
            log.debug("%s has no metadata data", item)
132
    return valid, invalid
133
134
135
start()
136