Audio-Scan
view release on metacpan or search on metacpan
is( $tags->{USLT}->[2], 'This is the lyrics field from iTunes.', 'iTunes 8.1 USLT ok' );
is( $tags->{TCMP}, 1, 'iTunes 8.1 TCP ok' );
is( $tags->{TSO2}, 'Album Artist Sort', 'iTunes 8.1 TS2 ok' );
is( $tags->{TSOA}, 'Album Sort', 'iTunes 8.1 TSA ok' );
is( $tags->{TSOC}, 'Composer Sort', 'iTunes 8.1 TSC ok' );
is( $tags->{TSOP}, 'Artist Name Sort', 'iTunes 8.1 TSP ok' );
is( $tags->{TSOT}, 'Track Title Sort', 'iTunes 8.1 TST ok' );
is( ref $tags->{RVAD}, 'ARRAY', 'iTunes 8.1 RVA ok' );
is( $tags->{RVAD}->[0], '-2.119539 dB', 'iTunes 8.1 RVA right ok' );
is( $tags->{RVAD}->[1], '0.000000', 'iTunes 8.1 RVA right peak ok' );
is( $tags->{RVAD}->[2], '-2.119539 dB', 'iTunes 8.1 RVA left ok' );
is( $tags->{RVAD}->[3], '0.000000', 'iTunes 8.1 RVA left peak ok' );
}
# ID3v2.3
{
my $s = Audio::Scan->scan( _f('v2.3.mp3') );
my $info = $s->{info};
my $tags = $s->{tags};
is( $info->{id3_version}, 'ID3v2.3.0', 'ID3v2.3 version ok' );
is( $tags->{TPE1}, 'Artist Name', 'ID3v2.3 artist ok' );
is( $tags->{TIT2}, 'Track Title', 'ID3v2.3 title ok' );
is( $tags->{TALB}, 'Album Name', 'ID3v2.3 album ok' );
is( $tags->{TCON}, 'Ambient', 'ID3v2.3 genre ok' );
is( $tags->{TRCK}, '02/10', 'ID3v2.3 track number ok' );
is( $tags->{'TAGGING TIME'}, '2009-03-16T17:58:23', 'ID3v2.3 TXXX ok' ); # TXXX tag
# Make sure TDRC is present and TYER has been removed
is( $tags->{TDRC}, 2009, 'ID3v2.3 date ok' );
is( $tags->{TYER}, undef, 'ID3v2.3 TYER removed ok' );
}
# ID3v2.3 ISO-8859-1
{
my $s = Audio::Scan->scan( _f('v2.3-iso-8859-1.mp3') );
my $info = $s->{info};
my $tags = $s->{tags};
is( $info->{id3_version}, 'ID3v2.3.0', 'ID3v2.3 version ok' );
SKIP:
{
skip 'Encode is not available', 3 unless $HAS_ENCODE;
my $a = Encode::decode_utf8('Ester Koèièková a LubomÃr Nohavica');
my $b = Encode::decode_utf8('Ester Koèièková a LubomÃr Nohavica s klavÃrem');
my $c = Encode::decode_utf8('Tøem sestrám');
is( $tags->{TPE1}, $a, 'ID3v2.3 ISO-8859-1 artist ok' );
is( $tags->{TALB}, $b, 'ID3v2.3 ISO-8859-1 album ok' );
is( $tags->{TIT2}, $c, 'ID3v2.3 ISO-8859-1 title ok' );
}
# Make sure it's been converted to UTF-8
is( utf8::valid( $tags->{TPE1} ), 1, 'ID3v2.3 ISO-8859-1 is valid UTF-8' );
}
# ID3v2.3 UTF-16 with no BOM (defaults to LE), bug 14728
{
my $s = Audio::Scan->scan_tags( _f('v2.3-utf16any.mp3') );
my $tags = $s->{tags};
is( $tags->{TPE1}, "Guns N' Roses", 'ID3v2.3 UTF-16 title ok' );
is( $tags->{TALB}, 'Use Your Illusion II', 'ID3v2.3 UTF-16 title ok' );
}
# ID3v2.3 UTF-16BE
{
my $s = Audio::Scan->scan_tags( _f('v2.3-utf16be.mp3') );
my $tags = $s->{tags};
SKIP:
{
skip 'Encode is not available', 1 unless $HAS_ENCODE;
is( $tags->{TPE1}, $pate, 'ID3v2.3 UTF-16BE artist ok' );
}
is( $tags->{TIT2}, 'Track Title', 'ID3v2.3 UTF-16BE title ok' );
is( utf8::valid( $tags->{TPE1} ), 1, 'ID3v2.3 UTF-16BE is valid UTF-8' );
}
# ID3v2.3 UTF-16LE
{
my $s = Audio::Scan->scan_tags( _f('v2.3-utf16le.mp3') );
my $tags = $s->{tags};
SKIP:
{
skip 'Encode is not available', 1 unless $HAS_ENCODE;
is( $tags->{TPE1}, $pate, 'ID3v2.3 UTF-16LE artist ok' );
}
is( $tags->{TIT2}, 'Track Title', 'ID3v2.3 UTF-16LE title ok' );
is( utf8::valid( $tags->{TPE1} ), 1, 'ID3v2.3 UTF-16LE is valid UTF-8' );
}
# ID3v2.3 mp3HD, make sure we ignore XHD3 frame properly
{
my $s = Audio::Scan->scan( _f('v2.3-mp3HD.mp3') );
my $info = $s->{info};
my $tags = $s->{tags};
is( $info->{audio_offset}, 57956, 'mp3HD offset ok' );
is( $tags->{TIT2}, 'mp3HD is evil', 'mp3HD tags ok' );
is( $tags->{XHD3}, undef, 'mp3HD XHD3 frame ignored' );
}
# ID3v2.3 with empty WXXX tag
{
my $s = Audio::Scan->scan( _f('v2.3-empty-wxxx.mp3') );
my $tags = $s->{tags};
# This is not the actual length but it's OK since we don't unsync in no-artwork mode
is( $tags->{APIC}->[3], 46240, 'v2.4 APIC unsync no-artwork length ok' );
is( !defined $tags->{APIC}->[4], 1, 'v2.4 APIC unsync no-artwork has no offset ok' );
}
{
my $s = Audio::Scan->scan( _f('v2.4-apic-unsync.mp3') );
my $tags = $s->{tags};
is( length( $tags->{APIC}->[3] ), 45984, 'v2.4 APIC unsync actual length ok' );
is( md5_hex( $tags->{APIC}->[3] ), 'e55a67f541dfdae8b4d645396d2c542a', 'v2.4 APIC unsync JPEG data ok' );
}
# v2.4 with empty text frame, a bug would insert the text from the previous frame
{
my $s = Audio::Scan->scan( _f('v2.4-empty-text.mp3') );
my $tags = $s->{tags};
ok ( !exists $tags->{TPE3}, 'v2.4 empty text TPE3 frame not present' );
is( $tags->{CATALOGNUMBER}, 'DUKE149D', 'v2.4 empty text next frame ok' );
}
# Bug 15992, v2.3 + v1.1 + APEv2 + Lyricsv2
{
my $s = Audio::Scan->scan( _f('v2.3-apev2-lyricsv2.mp3') );
my $info = $s->{info};
my $tags = $s->{tags};
is( $info->{id3_version}, 'ID3v2.3.0, ID3v1.1', 'v2.3 APEv2+Lyricsv2 id3_version ok' );
is( $info->{ape_version}, 'APEv2', 'v2.3 APEv2+Lyricsv2 ape_version ok' );
is( $tags->{TIT2}, 'Fifteen Floors', 'v2.3 APEv2+Lyricsv2 TIT2 ok' );
is( $tags->{REPLAYGAIN_TRACK_PEAK}, '1.077664', 'v2.3 APEv2+Lyricsv2 REPLAYGAIN_TRACK_PEAK ok' );
}
# Bug 16056, v2.4 + APEv2 with invalid key
{
# Hide stderr
no strict 'subs';
no warnings;
open OLD_STDERR, '>&', STDERR;
close STDERR;
my $s = Audio::Scan->scan( _f('v2.4-ape-invalid-key.mp3') );
my $tags = $s->{tags};
is( $tags->{REPLAYGAIN_ALBUM_GAIN}, '-1.720000 dB', 'v2.4 APE invalid key tag read ok' );
# Restore stderr
open STDERR, '>&', OLD_STDERR;
}
# Bug 16073, zero-byte frames
{
my $s = Audio::Scan->scan( _f('v2.3-zero-frame.mp3') );
my $tags = $s->{tags};
ok( !exists $tags->{WCOM}, 'v2.3 zero-frame WCOM not present ok' );
is( $tags->{TDRC}, 1982, 'v2.3 zero-frame TDRC ok' );
}
# Bug 16079, TCON with BOM but no text
{
my $s = Audio::Scan->scan( _f('v2.3-empty-tcon2.mp3') );
my $tags = $s->{tags};
ok( !exists $tags->{TCON}, 'v2.3 empty TCON not present ok' );
is( $tags->{TALB}, 'Unbekanntes Album', 'v2.3 empty TCON TALB ok' );
}
# RT 57664, invalid AENC tag
{
my $s = Audio::Scan->scan( _f('v2.3-invalid-aenc.mp3') );
my $tags = $s->{tags};
is( $tags->{TALB}, 'Pure Atmosphere', 'v2.3 invalid AENC TALB ok' );
is( length($tags->{TPE4}), 26939, 'v2.3 invalid AENC TPE4 ok' );
is( length($tags->{AENC}->[0]), 10600, 'v2.3 invalid AENC AENC ok' );
}
# Invalid RVAD tag
{
my $s = Audio::Scan->scan( _f('v2.3-invalid-rvad.mp3') );
my $tags = $s->{tags};
ok( !$tags->{RVAD}, 'v2.3 invalid RVAD skipped ok' );
is( $tags->{TBPM}, 125, 'v2.3 invalid RVAD frame after RVAD ok' );
}
# Bug 15992 again, APE tag wasn't read properly
{
my $s = Audio::Scan->scan( _f('ape-v1.mp3') );
my $tags = $s->{tags};
is( $tags->{TPE1}, 'Blue', 'APEv2/ID3v1 TPE1 ok' );
is( $tags->{REPLAYGAIN_ALBUM_GAIN}, '-9.240000 dB', 'APEv2/ID3v1 REPLAYGAIN_ALBUM_GAIN ok' );
}
# Bug 16452, v2.2 with multiple TT2/TP1 that are empty null bytes
{
my $s = Audio::Scan->scan( _f('v2.2-multiple-null-strings.mp3') );
my $tags = $s->{tags};
ok( !ref $tags->{TIT2}, 'v2.2 multiple null strings in TT2 ok' );
ok( !ref $tags->{TPE1}, 'v2.2 multiple null strings in TP1 ok' );
is( $tags->{TIT2}, 'Klangstudie II', 'v2.2 multiple null strings TT2 value ok' );
is( $tags->{TPE1}, 'Herbert Eimert', 'v2.2 multiple null strings TP1 value ok' );
}
# Bad first samplerate (stream from Radio Paradise)
{
my $s = Audio::Scan->scan( _f('bad-first-samplerate.mp3') );
my $info = $s->{info};
is( $info->{samplerate}, 44100, 'Bad first samplerate detected as 44100 ok' );
}
# File with Xing tag but no LAME data, used to not include info->{vbr}
{
my $s = Audio::Scan->scan( _f('v2.3-xing-no-lame.mp3') );
my $info = $s->{info};
( run in 0.352 second using v1.01-cache-2.11-cpan-39bf76dae61 )