Skip to content

Commit

Permalink
Merge 708ffac into 264dd36
Browse files Browse the repository at this point in the history
  • Loading branch information
mathiascode committed Feb 27, 2024
2 parents 264dd36 + 708ffac commit 970b8a7
Show file tree
Hide file tree
Showing 9 changed files with 316 additions and 411 deletions.
5 changes: 4 additions & 1 deletion .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
python-version: ${{ matrix.python }}

- name: Install dependencies
run: python -m pip install build .[tests]
run: python -m pip install build setuptools .[tests]

- name: Downgrade importlib-metadata
run: python -m pip install importlib-metadata==4.13.0
Expand All @@ -31,6 +31,9 @@ jobs:
- name: Flake8 linter
run: python -m flake8

- name: Pylint linter
run: python -m pylint --recursive=y --ignore-paths=build .

- name: Unit tests
run: python -m pytest --cov
env:
Expand Down
1 change: 1 addition & 0 deletions release.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/usr/bin/env python
# pylint: disable=missing-function-docstring,missing-module-docstring

import subprocess
import sys
Expand Down
48 changes: 25 additions & 23 deletions setup.cfg
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[metadata]
name = tinytag
version = attr: tinytag.__version__
version = 2.0.0
author = Tom Wallroth
author_email = tomwallroth@gmail.com
url = https://github.com/devsnd/tinytag
Expand Down Expand Up @@ -40,34 +40,36 @@ install_requires =

[options.extras_require]
tests =
flake8
pylint
pytest
pytest-cov
flake8

[options.entry_points]
console_scripts =

[flake8]
max-line-length = 100
exclude = .git,__pycache__,.eggs/,doc/,docs/,build/,dist/,archive/,src/

[coverage:run]
cover_pylib = false
omit =
*/site-packages/*
*/bin/*
*/src/*

[coverage:report]
exclude_lines =
pragma: no cover
def __repr__
except RuntimeError
except NotImplementedError
except ImportError
except FileNotFoundError
except CalledProcessError
logging.warning
logging.error
logging.critical
if __name__ == .__main__.:
[pylint]
enable =
consider-using-augmented-assign,
use-implicit-booleaness-not-comparison-to-string,
use-implicit-booleaness-not-comparison-to-zero
load-plugins =
pylint.extensions.bad_builtin,
pylint.extensions.check_elif,
pylint.extensions.code_style,
pylint.extensions.comparetozero,
pylint.extensions.comparison_placement,
pylint.extensions.consider_refactoring_into_while_condition,
pylint.extensions.emptystring,
pylint.extensions.for_any_all,
pylint.extensions.dict_init_mutate,
pylint.extensions.dunder,
pylint.extensions.eq_without_hash,
pylint.extensions.overlapping_exceptions,
pylint.extensions.private_import,
pylint.extensions.set_membership,
pylint.extensions.typing
py-version = 3.6
2 changes: 2 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#!/usr/bin/env python
# pylint: disable=missing-module-docstring

from setuptools import setup

setup()
4 changes: 1 addition & 3 deletions tinytag/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

__version__ = '1.10.1'
# pylint: disable=missing-module-docstring

import sys
from .tinytag import TinyTag, TinyTagException # noqa: F401
Expand Down
93 changes: 50 additions & 43 deletions tinytag/__main__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
# pylint: disable=missing-module-docstring,protected-access

from os.path import splitext
import json
import os
import sys

from tinytag.tinytag import TinyTag, TinyTagException


def usage():
def _usage():
print('''tinytag [options] <filename...>
-h, --help
Expand All @@ -23,74 +26,78 @@ def usage():
''')


def pop_param(name, _default):
def _pop_param(name, _default):
if name in sys.argv:
idx = sys.argv.index(name)
sys.argv.pop(idx)
return sys.argv.pop(idx)
return _default


def pop_switch(name, _default):
def _pop_switch(name, _default):
if name in sys.argv:
idx = sys.argv.index(name)
sys.argv.pop(idx)
return True
return False


try:
display_help = pop_switch('--help', False) or pop_switch('-h', False)
def _print_tag(tag, formatting, header_printed=False):
data = {'filename': tag._filename}
data.update(tag._as_dict())
if formatting == 'json':
print(json.dumps(data))
return header_printed
for field, value in data.items():
if isinstance(value, str):
data[field] = value.replace('\x00', ';') # use a more friendly separator for output
if formatting == 'csv':
print('\n'.join(f'{field},{value}' for field, value in data.items()))
elif formatting == 'tsv':
print('\n'.join(f'{field}\t{value}' for field, value in data.items()))
elif formatting == 'tabularcsv':
if not header_printed:
print(','.join(field for field, value in data.items()))
header_printed = True
print(','.join(f'"{value}"' for field, value in data.items()))
return header_printed


def _run():
display_help = _pop_switch('--help', False) or _pop_switch('-h', False)
if display_help:
usage()
sys.exit(0)
save_image_path = pop_param('--save-image', None) or pop_param('-i', None)
formatting = (pop_param('--format', None) or pop_param('-f', None)) or 'json'
skip_unsupported = pop_switch('--skip-unsupported', False) or pop_switch('-s', False)
_usage()
return 0
save_image_path = _pop_param('--save-image', None) or _pop_param('-i', None)
formatting = (_pop_param('--format', None) or _pop_param('-f', None)) or 'json'
skip_unsupported = _pop_switch('--skip-unsupported', False) or _pop_switch('-s', False)
filenames = sys.argv[1:]
except Exception as exc:
print(exc)
usage()
sys.exit(1)

header_printed = False
header_printed = False

for i, filename in enumerate(filenames):
try:
for i, filename in enumerate(filenames):
if skip_unsupported:
if os.path.isdir(filename):
continue
if not TinyTag.is_supported(filename):
continue
tag = TinyTag.get(filename, image=save_image_path is not None)
try:
tag = TinyTag.get(filename, image=save_image_path is not None)
except TinyTagException as exc:
sys.stderr.write(f'{filename}: {exc}\n')
return 1
if save_image_path:
# allow for saving the image of multiple files
actual_save_image_path = save_image_path
if len(filenames) > 1:
actual_save_image_path, ext = splitext(actual_save_image_path)
actual_save_image_path += '%05d' % i + ext
actual_save_image_path += f'{i:05d}{ext}'
image = tag.get_image()
if image:
with open(actual_save_image_path, 'wb') as fh:
fh.write(image)
data = {'filename': filename}
data.update(tag.as_dict())
if formatting == 'json':
import json
print(json.dumps(data))
continue
for k, v in data.items():
if isinstance(v, str):
data[k] = v.replace('\x00', ';') # use a more friendly separator for text output
if formatting == 'csv':
print('\n'.join('%s,%s' % (k, v) for k, v in data.items()))
elif formatting == 'tsv':
print('\n'.join('%s\t%s' % (k, v) for k, v in data.items()))
elif formatting == 'tabularcsv':
if not header_printed:
print(','.join(k for k, v in data.items()))
header_printed = True
print(','.join('"%s"' % v for k, v in data.items()))
except TinyTagException as e:
sys.stderr.write('%s: %s\n' % (filename, str(e)))
sys.exit(1)
with open(actual_save_image_path, 'wb') as file_handle:
file_handle.write(image)
header_printed = _print_tag(tag, formatting, header_printed)
return 0


if __name__ == '__main__':
sys.exit(_run())

0 comments on commit 970b8a7

Please sign in to comment.