feat(analyzer): rework analyze_metadata step
- Upgrade mutagen to 1.45.1 - Remove custom wave data extraction - Add .wav and ogg without extension fixtures - Move md5 sum and mime type in there own function - Cleanup comments - Let analyze_cuepoints handle cuein and cueout metadata - Remove python magic mime guessing
This commit is contained in:
parent
0106b4c6cb
commit
88dcd13fc8
5 changed files with 164 additions and 155 deletions
85
analyzer/tests/fixtures/__init__.py
vendored
85
analyzer/tests/fixtures/__init__.py
vendored
|
@ -40,6 +40,9 @@ Fixture(here / "s1-mono.m4a", 15.0, 6.0, 13.0, -4.5 ),
|
|||
Fixture(here / "s1-stereo.m4a", 15.0, 6.0, 13.0, -5.8 ),
|
||||
Fixture(here / "s1-mono.ogg", 15.0, 6.0, 13.0, -4.9 ),
|
||||
Fixture(here / "s1-stereo.ogg", 15.0, 6.0, 13.0, -5.7 ),
|
||||
Fixture(here / "s1-stereo", 15.0, 6.0, 13.0, -5.7 ),
|
||||
Fixture(here / "s1-mono.wav", 15.0, 6.0, 13.0, -2.3 ),
|
||||
Fixture(here / "s1-stereo.wav", 15.0, 6.0, 13.0, -6.0 ),
|
||||
# sample 2
|
||||
# 0s -> 1.8s: silence
|
||||
# 1.8s : noise
|
||||
|
@ -73,13 +76,14 @@ FixtureMeta = namedtuple(
|
|||
)
|
||||
|
||||
meta = {
|
||||
"cuein": 0.0,
|
||||
"sample_rate": 48000,
|
||||
"length": str(timedelta(seconds=15)),
|
||||
"length_seconds": approx(15.0, abs=0.1),
|
||||
"ftype": "audioclip",
|
||||
"hidden": False,
|
||||
# Tags
|
||||
}
|
||||
|
||||
tags = {
|
||||
"album_title": "Test Album",
|
||||
"artist_name": "Test Artist",
|
||||
"track_title": "Test Title",
|
||||
|
@ -95,6 +99,7 @@ FILES_TAGGED = [
|
|||
here / "s1-jointstereo-tagged.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -104,6 +109,7 @@ FILES_TAGGED = [
|
|||
here / "s1-mono-tagged.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(64000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -113,6 +119,7 @@ FILES_TAGGED = [
|
|||
here / "s1-stereo-tagged.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -122,6 +129,7 @@ FILES_TAGGED = [
|
|||
here / "s1-mono-tagged.flac",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(452802, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/flac",
|
||||
|
@ -131,6 +139,7 @@ FILES_TAGGED = [
|
|||
here / "s1-stereo-tagged.flac",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(938593, abs=1e3),
|
||||
"channels": 2,
|
||||
"mime": "audio/flac",
|
||||
|
@ -140,6 +149,7 @@ FILES_TAGGED = [
|
|||
here / "s1-mono-tagged.m4a",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(65000, abs=5e4),
|
||||
"channels": 2, # Weird
|
||||
"mime": "audio/mp4",
|
||||
|
@ -149,6 +159,7 @@ FILES_TAGGED = [
|
|||
here / "s1-stereo-tagged.m4a",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e5),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp4",
|
||||
|
@ -158,6 +169,7 @@ FILES_TAGGED = [
|
|||
here / "s1-mono-tagged.ogg",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(80000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/vorbis",
|
||||
|
@ -167,15 +179,43 @@ FILES_TAGGED = [
|
|||
here / "s1-stereo-tagged.ogg",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(112000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/vorbis",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-stereo-tagged",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(112000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/vorbis",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-mono-tagged.wav",
|
||||
{
|
||||
**meta,
|
||||
"bit_rate": approx(96000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/wav",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-stereo-tagged.wav",
|
||||
{
|
||||
**meta,
|
||||
"bit_rate": approx(384000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/wav",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
meta = {
|
||||
**meta,
|
||||
tags = {
|
||||
"album_title": "Ä ä Ü ü ß",
|
||||
"artist_name": "てすと",
|
||||
"track_title": "アイウエオカキクケコサシスセソタチツテ",
|
||||
|
@ -191,6 +231,7 @@ FILES_TAGGED += [
|
|||
here / "s1-jointstereo-tagged-utf8.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -200,6 +241,7 @@ FILES_TAGGED += [
|
|||
here / "s1-mono-tagged-utf8.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(64000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -209,6 +251,7 @@ FILES_TAGGED += [
|
|||
here / "s1-stereo-tagged-utf8.mp3",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp3",
|
||||
|
@ -218,6 +261,7 @@ FILES_TAGGED += [
|
|||
here / "s1-mono-tagged-utf8.flac",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(452802, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/flac",
|
||||
|
@ -227,6 +271,7 @@ FILES_TAGGED += [
|
|||
here / "s1-stereo-tagged-utf8.flac",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(938593, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/flac",
|
||||
|
@ -236,6 +281,7 @@ FILES_TAGGED += [
|
|||
here / "s1-mono-tagged-utf8.m4a",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(65000, abs=5e4),
|
||||
"channels": 2, # Weird
|
||||
"mime": "audio/mp4",
|
||||
|
@ -245,6 +291,7 @@ FILES_TAGGED += [
|
|||
here / "s1-stereo-tagged-utf8.m4a",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(128000, abs=1e5),
|
||||
"channels": 2,
|
||||
"mime": "audio/mp4",
|
||||
|
@ -254,6 +301,7 @@ FILES_TAGGED += [
|
|||
here / "s1-mono-tagged-utf8.ogg",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(80000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/vorbis",
|
||||
|
@ -263,9 +311,38 @@ FILES_TAGGED += [
|
|||
here / "s1-stereo-tagged-utf8.ogg",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(112000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/vorbis",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-stereo-tagged-utf8",
|
||||
{
|
||||
**meta,
|
||||
**tags,
|
||||
"bit_rate": approx(112000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/vorbis",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-mono-tagged-utf8.wav",
|
||||
{
|
||||
**meta,
|
||||
"bit_rate": approx(96000, abs=1e2),
|
||||
"channels": 1,
|
||||
"mime": "audio/wav",
|
||||
},
|
||||
),
|
||||
FixtureMeta(
|
||||
here / "s1-stereo-tagged-utf8.wav",
|
||||
{
|
||||
**meta,
|
||||
"bit_rate": approx(384000, abs=1e2),
|
||||
"channels": 2,
|
||||
"mime": "audio/wav",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
|
11
analyzer/tests/fixtures/generate.sh
vendored
11
analyzer/tests/fixtures/generate.sh
vendored
|
@ -38,10 +38,12 @@ generate() {
|
|||
|
||||
# Generate sample 1
|
||||
generate s1.flac s1-mono.flac -ac 1 -acodec flac
|
||||
generate s1.flac s1-mono.wav -ac 1
|
||||
generate s1.flac s1-mono.m4a -ac 1 -acodec aac
|
||||
generate s1.flac s1-mono.mp3 -ac 1 -acodec libmp3lame
|
||||
generate s1.flac s1-mono.ogg -ac 1 -acodec libvorbis
|
||||
generate s1.flac s1-stereo.flac -ac 2 -acodec flac
|
||||
generate s1.flac s1-stereo.wav -ac 2
|
||||
generate s1.flac s1-stereo.m4a -ac 2 -acodec aac
|
||||
generate s1.flac s1-stereo.mp3 -ac 2 -acodec libmp3lame
|
||||
generate s1.flac s1-stereo.ogg -ac 2 -acodec libvorbis
|
||||
|
@ -77,10 +79,12 @@ generate s3.flac s3-stereo.ogg -ac 2 -acodec libvorbis
|
|||
|
||||
# Tag sample 1
|
||||
tag metadata.txt s1-mono.flac s1-mono-tagged.flac
|
||||
tag metadata.txt s1-mono.wav s1-mono-tagged.wav
|
||||
tag metadata.txt s1-mono.m4a s1-mono-tagged.m4a
|
||||
tag metadata.txt s1-mono.mp3 s1-mono-tagged.mp3
|
||||
tag metadata.txt s1-mono.ogg s1-mono-tagged.ogg
|
||||
tag metadata.txt s1-stereo.flac s1-stereo-tagged.flac
|
||||
tag metadata.txt s1-stereo.wav s1-stereo-tagged.wav
|
||||
tag metadata.txt s1-stereo.m4a s1-stereo-tagged.m4a
|
||||
tag metadata.txt s1-stereo.mp3 s1-stereo-tagged.mp3
|
||||
tag metadata.txt s1-stereo.ogg s1-stereo-tagged.ogg
|
||||
|
@ -88,11 +92,18 @@ tag metadata.txt s1-jointstereo.mp3 s1-jointstereo-tagged.mp3
|
|||
|
||||
# Tag utf8 sample 1
|
||||
tag metadata-utf8.txt s1-mono.flac s1-mono-tagged-utf8.flac
|
||||
tag metadata-utf8.txt s1-mono.wav s1-mono-tagged-utf8.wav
|
||||
tag metadata-utf8.txt s1-mono.m4a s1-mono-tagged-utf8.m4a
|
||||
tag metadata-utf8.txt s1-mono.mp3 s1-mono-tagged-utf8.mp3
|
||||
tag metadata-utf8.txt s1-mono.ogg s1-mono-tagged-utf8.ogg
|
||||
tag metadata-utf8.txt s1-stereo.flac s1-stereo-tagged-utf8.flac
|
||||
tag metadata-utf8.txt s1-stereo.wav s1-stereo-tagged-utf8.wav
|
||||
tag metadata-utf8.txt s1-stereo.m4a s1-stereo-tagged-utf8.m4a
|
||||
tag metadata-utf8.txt s1-stereo.mp3 s1-stereo-tagged-utf8.mp3
|
||||
tag metadata-utf8.txt s1-stereo.ogg s1-stereo-tagged-utf8.ogg
|
||||
tag metadata-utf8.txt s1-jointstereo.mp3 s1-jointstereo-tagged-utf8.mp3
|
||||
|
||||
# Extension less files
|
||||
cp s1-stereo.ogg s1-stereo
|
||||
cp s1-stereo-tagged.ogg s1-stereo-tagged
|
||||
cp s1-stereo-tagged-utf8.ogg s1-stereo-tagged-utf8
|
||||
|
|
|
@ -1,66 +1,54 @@
|
|||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from libretime_analyzer.pipeline.analyze_metadata import analyze_metadata
|
||||
from libretime_analyzer.pipeline.analyze_metadata import analyze_metadata, compute_md5
|
||||
|
||||
from ..fixtures import FILE_INVALID_DRM, FILE_INVALID_TXT, FILES_TAGGED
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"params,exception",
|
||||
[
|
||||
((42, dict()), TypeError),
|
||||
(("foo", 3), TypeError),
|
||||
],
|
||||
)
|
||||
def test_analyze_metadata_wrong_params(params, exception):
|
||||
with pytest.raises(exception):
|
||||
analyze_metadata(*params)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"filepath,metadata",
|
||||
map(lambda i: (str(i.path), i.metadata), FILES_TAGGED),
|
||||
map(lambda i: (i.path, i.metadata), FILES_TAGGED),
|
||||
)
|
||||
def test_analyze_metadata(filepath: str, metadata: dict):
|
||||
found = analyze_metadata(filepath, dict())
|
||||
|
||||
# Mutagen does not support wav files yet
|
||||
if filepath.endswith("wav"):
|
||||
return
|
||||
def test_analyze_metadata(filepath: Path, metadata: dict):
|
||||
found = analyze_metadata(str(filepath), {})
|
||||
|
||||
assert len(found["md5"]) == 32
|
||||
del found["md5"]
|
||||
|
||||
# Handle filesize
|
||||
assert found["filesize"] < 2e6 # ~2Mb
|
||||
assert found["filesize"] < 3e6 # ~3Mb
|
||||
assert found["filesize"] > 1e5 # 100Kb
|
||||
del found["filesize"]
|
||||
|
||||
# Handle track formatted length/cueout
|
||||
# Handle track formatted length
|
||||
assert metadata["length"] in found["length"]
|
||||
assert metadata["length"] in found["cueout"]
|
||||
del metadata["length"]
|
||||
del found["length"]
|
||||
del found["cueout"]
|
||||
|
||||
# mp3,ogg,flac files does not support comments yet
|
||||
if not filepath.endswith("m4a"):
|
||||
del metadata["comment"]
|
||||
if not filepath.suffix == ".m4a":
|
||||
if "comment" in metadata:
|
||||
del metadata["comment"]
|
||||
|
||||
assert found == metadata
|
||||
|
||||
|
||||
def test_analyze_metadata_invalid_wma():
|
||||
metadata = analyze_metadata(str(FILE_INVALID_DRM), dict())
|
||||
metadata = analyze_metadata(str(FILE_INVALID_DRM), {})
|
||||
assert metadata["mime"] == "audio/x-ms-wma"
|
||||
|
||||
|
||||
def test_analyze_metadata_unparsable_file():
|
||||
metadata = analyze_metadata(str(FILE_INVALID_TXT), dict())
|
||||
metadata = analyze_metadata(str(FILE_INVALID_TXT), {})
|
||||
assert metadata == {
|
||||
"filesize": 10,
|
||||
"ftype": "audioclip",
|
||||
"hidden": False,
|
||||
"md5": "4d5e4b1c8e8febbd31fa9ce7f088beae",
|
||||
"mime": "text/plain",
|
||||
}
|
||||
|
||||
|
||||
def test_compute_md5():
|
||||
assert compute_md5(FILE_INVALID_TXT) == "4d5e4b1c8e8febbd31fa9ce7f088beae"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue