Skip to content

Commit

Permalink
Merge 9c97822 into 5b96600
Browse files Browse the repository at this point in the history
  • Loading branch information
mathiascode committed May 31, 2024
2 parents 5b96600 + 9c97822 commit e1075f5
Show file tree
Hide file tree
Showing 7 changed files with 401 additions and 274 deletions.
6 changes: 4 additions & 2 deletions tinytag/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
"""Audio file metadata reader"""

from .tinytag import (
ParseError, TinyTag, TagImage, TagImages, TinyTagException, UnsupportedFormatError
ParseError, TinyTag, TagExtra, TagImage, TagImages, TagImagesExtra,
TinyTagException, UnsupportedFormatError
)
__all__ = (
"ParseError", "TinyTag", "TagImage", "TagImages", "TinyTagException", "UnsupportedFormatError"
"ParseError", "TinyTag", "TagExtra", "TagImage", "TagImages", "TagImagesExtra",
"TinyTagException", "UnsupportedFormatError"
)
26 changes: 17 additions & 9 deletions tinytag/__main__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
# pylint: disable=missing-module-docstring,protected-access

from __future__ import annotations
from io import StringIO
from os.path import splitext
import csv
import json
import os
import sys
Expand Down Expand Up @@ -44,23 +46,29 @@ def _pop_switch(name: str) -> bool:


def _print_tag(tag: TinyTag, formatting: str, header_printed: bool = False) -> bool:
data = tag._as_dict()
data = tag.as_dict(flatten=True)
del data['images']
if formatting == 'json':
print(json.dumps(data))
print(json.dumps(data, ensure_ascii=False, indent=2))
return header_printed
if formatting not in {'csv', 'tsv', 'tabularcsv'}:
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!r}' for field, value in data.items()))
elif formatting == 'tsv':
print('\n'.join(f'{field}\t{value!r}' for field, value in data.items()))
elif formatting == 'tabularcsv':
csv_file = StringIO()
delimiter = '\t' if formatting == 'tsv' else ','
writer = csv.writer(csv_file, delimiter=delimiter, lineterminator='\n')
if formatting == 'tabularcsv':
if not header_printed:
print(','.join(field for field, value in data.items()))
writer.writerow(data.keys())
header_printed = True
print(','.join(f'"{value!r}"' for field, value in data.items()))
writer.writerow(data.values())
value = csv_file.getvalue().strip()
else:
writer.writerows(data.items())
value = csv_file.getvalue()
print(value)
return header_printed


Expand Down
Binary file modified tinytag/tests/samples/aiff_with_image.aiff
Binary file not shown.
Binary file modified tinytag/tests/samples/flac_multiple_fields.flac
Binary file not shown.
348 changes: 190 additions & 158 deletions tinytag/tests/test_all.py

Large diffs are not rendered by default.

15 changes: 10 additions & 5 deletions tinytag/tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,36 +76,41 @@ def test_meta_data_output_default_json() -> None:
output = run_cli(mp3_with_image)
data = json.loads(output)
assert data
assert set(data.keys()) == tinytag_attributes
assert set(data.keys()).issubset(tinytag_attributes)


def test_meta_data_output_format_json() -> None:
output = run_cli('-f json ' + mp3_with_image)
data = json.loads(output)
assert data
assert set(data.keys()) == tinytag_attributes
assert set(data.keys()).issubset(tinytag_attributes)


def test_meta_data_output_format_csv() -> None:
output = run_cli('-f csv ' + mp3_with_image)
lines = [line for line in output.split(os.linesep) if line]
assert all(',' in line for line in lines)
attributes = set(line.split(',')[0] for line in lines)
assert set(attributes) == tinytag_attributes
assert set(attributes).issubset(tinytag_attributes)


def test_meta_data_output_format_tsv() -> None:
output = run_cli('-f tsv ' + mp3_with_image)
lines = [line for line in output.split(os.linesep) if line]
assert all('\t' in line for line in lines)
attributes = set(line.split('\t')[0] for line in lines)
assert set(attributes) == tinytag_attributes
assert set(attributes).issubset(tinytag_attributes)


def test_meta_data_output_format_tabularcsv() -> None:
output = run_cli('-f tabularcsv ' + mp3_with_image)
header, _line, _rest = output.split(os.linesep)
assert set(header.split(',')) == tinytag_attributes
assert set(header.split(',')).issubset(tinytag_attributes)


def test_meta_data_output_format_invalid() -> None:
output = run_cli('-f invalid ' + mp3_with_image)
assert not output


def test_fail_on_unsupported_file() -> None:
Expand Down
Loading

0 comments on commit e1075f5

Please sign in to comment.