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:
jo 2022-02-14 21:35:15 +01:00 committed by Kyle Robbertze
parent 0106b4c6cb
commit 88dcd13fc8
5 changed files with 164 additions and 155 deletions

View file

@ -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",
},
),
]

View file

@ -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

View file

@ -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"