1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- import re
- import subprocess
- from typing import List, Tuple
- from . import util
- class Keyword:
- def __init__(self, *, keyword:str, kind: str, count: int):
- self.keyword = keyword
- self.kind = kind
- self.count = count
- class Exiv2Parser:
- @classmethod
- def get_exiv2_version(cls) -> Tuple[str, str]:
- commands = ['exiv2', '--version']
- process = subprocess.Popen(commands, stdout=subprocess.PIPE)
- output = util.to_str(process.communicate()[0])
- match = re.search(r'exiv2 ([\d.]+) (\w+)', output)
- if match is not None:
- return match.groups()
- return None
- @classmethod
- def get_values(cls, file_path: str) -> dict:
- keywords = cls.__get_keys(file_path)
- result = dict()
- for key in keywords:
- commands = ['exiv2', '-K', key.keyword, '-P', 't', 'print', file_path]
- process = subprocess.Popen(commands, stdout=subprocess.PIPE)
- output = util.to_str(process.communicate()[0]).rstrip('\n')
- # Check if the key is a list or scalar
- if key.count > 1:
- result[key.keyword] = output.split('\n') # Assume the output is like keywords, one per line
- else:
- result[key.keyword] = output # Assume the whole input is the value
- return result
- @classmethod
- def __get_keys(cls, file_path: str) -> List[Keyword]:
- found_keywords = dict()
- commands = ['exiv2', '-P', 'ky', 'print', file_path]
- process = subprocess.Popen(commands, stdout=subprocess.PIPE)
- output = util.to_str(process.communicate()[0])
- for match in re.finditer(r'([\w.]+)\W+(\w+)\W*\n?', output):
- code, kind = match.groups()
- keyword = found_keywords.get(code, Keyword(keyword=code, kind=kind, count=0))
- keyword.count += 1
- found_keywords[code] = keyword
- return list(found_keywords.values())
- if __name__ == '__main__':
- #data = Exiv2Parser.get_values('content/blog/terms2.jpeg')
- #print(data)
- version_info = Exiv2Parser.get_exiv2_version()
- print(version_info)
|