From bf36544140e9283206682a203602cef16f401e9d Mon Sep 17 00:00:00 2001 From: twall Date: Fri, 14 Mar 2014 12:03:43 +0100 Subject: [PATCH] fixed problems with flac tag reading, coverage is 99% --- tinytag/__init__.py | 19 ++++-- tinytag/test/samples/longer_flac.flac | Bin 0 -> 23978 bytes tinytag/test/test_tinytag.py | 90 ++++++++++++++++++++------ 3 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 tinytag/test/samples/longer_flac.flac diff --git a/tinytag/__init__.py b/tinytag/__init__.py index d9646aa..43943ff 100644 --- a/tinytag/__init__.py +++ b/tinytag/__init__.py @@ -27,7 +27,7 @@ import struct import os -__version__ = '0.4.0' +__version__ = '0.5.0' class TinyTag(object): @@ -115,10 +115,12 @@ class ID3(TinyTag): 'TPE1': 'artist', 'TP1': 'artist', 'TIT2': 'title', 'TT2': 'title', } + def __init__(self, filehandler, filesize, estimation_length_sec=30): + TinyTag.__init__(self, filehandler, filesize) + self.estimation_length_sec = estimation_length_sec def _determine_length(self, fh): - max_estimation_sec = 30 - max_estimation_frames = (max_estimation_sec*44100) // 1152 + max_estimation_frames = (self.estimation_length_sec*44100) // 1152 frame_size_mean = 0 # set sample rate from first found frame later, default to 44khz file_sample_rate = 44100 @@ -324,7 +326,12 @@ def _parse_vorbis_comment(self, fh): key, value = keyvalpair[:splitidx], keyvalpair[splitidx+1:] fieldname = mapping.get(key.lower()) if fieldname: - self._set_field(fieldname, value) + if fieldname == 'track' and '/' in value: + track, tracktotal = value.split('/') + self._set_field('track', track) + self._set_field('track_total', tracktotal) + else: + self._set_field(fieldname, value) def _parse_pages(self, fh): # for the spec, see: https://wiki.xiph.org/Ogg @@ -363,7 +370,7 @@ def _determine_length(self, fh): # and: https://en.wikipedia.org/wiki/WAV riff, size, fformat = struct.unpack('4sI4s', fh.read(12)) if riff != b'RIFF' or fformat != b'WAVE': - print('not a wave file!') + return # not a valid wave file! channels, samplerate, bitdepth = 2, 44100, 16 # assume CD quality chunk_header = fh.read(8) while len(chunk_header) > 0: @@ -434,7 +441,7 @@ def _parse_tag(self, fh): while len(header_data): meta_header = struct.unpack('B3B', header_data) size = self._bytes_to_int(meta_header[1:4]) - if meta_header[0] == 4: + if (meta_header[0] & 7) == 4: # VORBIS_COMMENT oggtag = Ogg(fh, 0) oggtag._parse_vorbis_comment(fh) self.update(oggtag) diff --git a/tinytag/test/samples/longer_flac.flac b/tinytag/test/samples/longer_flac.flac new file mode 100644 index 0000000000000000000000000000000000000000..1a79721072ac4694ff9ddf45328ed5f2999e263c GIT binary patch literal 23978 zcmZs?dtB0Y|Np-*mC@1NYf$qin<53kqr`FOr~ z-XG-ia+BVB?>#KyJ;ZzO{d4_$h+ZED153S?L-+OO3 z3?5nz6vK^7WiQd34S4w$H+|kkOA%30fpt3%EAPYG`FI%D7Q3hOL zDxu;WCS4nw+H>X&bqnpc7W|4C|3~xk*@>5jKKqHS{E)rt!kw0aJ!BjxejHWd^`8`CRz50v`rs;aITwqWmLYi zi+aZq!^G*%L_0{nEMI-dzrdCSjM9f9WLO=FZHUis-+lJc!^-bhC0<(okbY|0>DNH} zA8Ew5`nLUhiaDlsy-6J~L%Ll#ph~*f3DoVSDG~#rvQ zy(856GwRtt8Iy*#eYc)Z#oqCm+M_RI0As1;ZtSw6$u>1o5&ZMGQ=+hvZy%TD^yiJ> zPcS486P5@kUF)v=I+LBYHMVeF{Qg^$vFztPIu1Qp9euhgCM8UTs~JWT)(__&+xUdy z&Tnb-dY>dJUzF(MVq;Dn-H-3w9J}xN`3|LFNU&0o_GJTM@?N&<1&E*=834G5D zq~{0J6wpE~`zMxBQ(t9LZ!B_`Hpa5wP5ya7uwZ+5iONF_PhL>x6@U1NM&ol{w&BY& z?QKgjeuurjc|ZEA+C3qmWw^6mMGZzaCYGDx&R^Vp-!Su+=L&xLUsnS+e{{R_;3Mf; z!eqlX!~~u<&RqkNQn9HC+mBqw%2Q8-JlWH_qxKoYeI;*d=|J4oH2t+*+>FMTMOUBy zerS9^)>iSsj}(h5S#=5*Hmo>8X9O1PR#se;haF2a-YjPXZb`g_xB%W?cg=miE~exD z8MWoYs)1djZ(d(`w{+~?qlZXmkC0OL0wdr+dhK4l1XDb^ zxTwO9vj5Q$YhJ=yad}1jF4SAy_-9KW<#xu3?gY*amt1N1&L!9wKi;~ee>icZ?R)9P zQ6yC9TQr6J$SeC?$-1x3`M*5TUAl=q`*7FCC#f;KAbL7#Tgw-Ro>+;E``W|Qm1W1h zrb1*$-wiwnu@JHm>wY1nhsbs$e3)QAf23G&c_;qz=69z>x^L*(tV2JXTk*!5xzbl~EgmiT z1UUA@!s=c;QQ*0HiI#cu70Vo=(^#kfH~Gw{ot`Stmr|ZYJ9okB1uzwG^QgD4KI|y>quxh_FIwBD@7Wcnfaq6 zuB?ZEe}R(p|LM)Y8vfw)>+Gy|nhlW?zQmlq-K*$8X?ZDL> zqw)3z$N@i%BqdkE(nLKs>>PM1X`cIcfuZ`((-Zh>C?*c6&3exRU7_~i+7--!wXICX>e^3m9bk~_;9IsZL%Z>@Usiunujm+#)p zPpEtF%47ajpW*bB>)Zj=d{`|%^cuy184*O)JWd=X0o%G=O#>HSJ?Us_$u7Jc`F>O2 zkzIGbDlHia8u14Y-P$wFhz4#i;Lvg;lkCd~wIq1$L$=8Jw2n1{<)=+&R}m?RK-tAB z{m*`NeLS_ATk6ffoc^$9?WUhE>r2yGUITf7M+_T;3sLggsx|p#83n`|aG*6MM(A37 z|HlUvB_G_DDCfVSJ^%BQh4{4d_m+P(bx}gKT^pBc_H8|=1SwT)@oa9$2V(6#W7uL={TfzFHO8)+7?=@dN z-$VZDam@u}8yisIT8`~oct#gl!=n&@;8&G?Fu4EmnyXX%UgY2p>NgSQ?}{g3eZjf#R!-FQXs z){k~v-ZuJaf5c0V`j@3fAXqFpx(bu)jcE%0`S#&7U-puw^tJ}9uhUw%7GV|XG?1-*{aoP{cye}dG; zSn2gTe;+f!vI>M4W4nHi|7+cc{W%wwU!3}i>Nvfp%xvA@Ef9XMWVMeClE>z%!bdQk z1d|cNtmf3Fx@T=QzeM=#U(>@ONS|#xyA2=x)5k3bS62ddKMr+U*YKbIx(P=Aqdyj)Y4Vp)bJJ^V1#cN}G}@w2Rdet9CByR+(Wos*0~_Lojrv zu+Btwz+Mc+`s~iS;PByzjNhk!K8R<1Uw_>*(fb==&x?6m?WYIQRYjO=W%A8(a9& zX8HbYtk&YZaCdHS2QsCwM=-Dy^b@x}s!#EUVupAJ!?Yhn4RWC0axCkA-}!;}of}Qp zZol_l;Kh005-u5(xY%kA0hG86co7~K$mPpM`r>sx1U(R>ip;37@J55^0Ag!1v5&tA;c?gG z8b~`zrCdxFQCSv$2w;mzT6+LX-+&6NN8t&ij1Ye`-meH7LIm@xmW=sSy{G)Y(+LP& zjBZIZy}B?rAMx=7Awx$jKkSdB=QRBLa4^#kc?|Fxk}KG>CG`n0Q4P^8SdRaae|#y{ zda-#1R9pSL_AryU#&;b~m z)Y_aJUM3J=c8r$*9B!a4jUu#yPB*2$FD7|~f!*1qfgD5K_<8_EB?Q!m+e~heM3Nj7 zs8ec9p1Cui#UKI=LW2QxkCL>b9LMdZNq(8Euc(aVbZ1J$lpHa|5J|La4I-Yhr?Upd zbn?u0lEhN3uQEG}g;sWqWt0qX0ij4DF5e$S2j>v{XCxrL#CQQz!cBvW@Sn2GnXX1n{{AAx1+hPYytV z?yevXpTx1o=u8jkHY+#^P`R8Q(8F{(8#1oQte^7g{_i*n#q>DoR6?Q6Lb0&PS@q(8BDN}r z)fK20gLW;iQ$Xxy6mi+oLaVgjLdt}=l&#_Qd?~G{2-J6W8Y!?QMp8PPRBVHst|_M$ z_7$@_!UqEQkkjl0;k@`Noj_7EhYFKH;ebR>>^D7@7D28e4d_u#N~&mdab;UFv7R$K zg$KBdJ#vpn>vVC{TokLGlQEWKzS!lQl#CZa5SgC?r%8Q)V*5!{5W|AEs99ZX)hMgS zWOGtklC0yDWHNwCwKJrT)e?;epJkfeejETJhul#-gVr6Xp_M^@-@Iv*Ez}3Xe~YAc zLuXGK(KcrRq>~ml=+0{Ts=v|7B}pQ);0-CB1ddWcHKnsRwZ?1>lz{y`HnTOevp+d} zC`Kp}6Zn;SycN*tIXMQifuK~HEoQDHQWOcUlFm*_#Jg*Hc-;UOz7sJ=$V8)P z54`aB&O!LP2^3wUrKkvU_HvX4xf2d)p&^GLAxK1AO9OUPDKwj1!Y)~tvSCF%05RQq zNNd51)R8QT9tf<**OU0g+B0nWIL9hxi`fv~z$H*qjgZUHm$pYO;iz?z zNkc!+O6fOf!Bl4e8x;2Ui3`(+R;jG7T&eEHHjC74$c!Wqbo~-B4Rm$^!W{T14+o&c6eEQ!TT`r>3c_=gnqWhYq>rPs%6f^L!!HGJ*fSQ zP+=2+OAQqE6MAp~06WqInIMP90BXC5gGcBdcVwm^GOI}_;ZRw4OF*E)VWUgBTv8qm zE2U>@b1d$()JAJmr!lpjO$B1~q)7>t6Ujv#p=B6lX*3YR=LXk%Tf*H+Jv*|h3+yXm z%d9NDfy;4PnYJiBMb{muR4FPOdm1k`=5!H6DxQg#M(o8m1d_#|TQBCAyKGvgh$`ku z#A1pV#U&}Lx|jpuc9mJ_3gmGqIbfO4saGmXSX9Piz1FQZ=>v6*)}kV*36d5o)g(|1 zNDbO90x1nWfC@sPn*ch&WDsR_fooCz5T##hsd79v#fD$BGsjC(dx3a~hl>J&V8xWV z*xH;-5Ed+hMB8ceXboD6g-TMJb1YKHtkmi)ovs@wv=!P}`amknX|QMwtS*w)t#XEs zbDb8Fwg{j|+KRPMU|OI=>e1R=A_yH3RbYyOpn@N?qvm`b1ZB< zXwa+JT8a@BDS`C{Y4J7)CF67tXp-4Rxnwd5U)WXUgy8GzH1u&?d$@3=HWdNE27(0^ zWv5z15Qz)B97YzKLnXmNZLs*~(s?)%sf(+VxJ4XYwJyiP<%o-!PLt9}#w%5m5hRID zPsInC`$E{o1amhr8ALdB9yLdqDXPa)@m!K=&PD08S?U2|U!h%SH#ywuNHGDAY}*58 z9fz7>lUdZAJ^ei0Kw*u@0LTl)pC(gLf!v?~F&xaWJX2tuP91to;)7Xsj?kFV1on~I z=nqT8)ZNDebIei;P*}t1RQG3c3~P~9^tMn*Ujm6^Ajn76_)MmB*4<-sW*7^_WktMx z$xI?dzs#(tYyLpMzt^jTdTo>Dc1G^ltINlzDZl+AID za;a=cm>Iz4^_9_GLQsqcbF5sjQzDkZ*KZ}@&<2x*>E>!PDTY3{<~}0>6a$Kjhv(m1 z18&0`tZZ70IHs#1P{h;oWp=5|(m4oy*n2X^+t1)q#mtGV!aEe&)}3VW<#iOweM z%QU2g+u@2Cs5NlKF%|<`?$LUz1l=|&Khq@b7gISlkzQs~P4<|RLC&PbpcR^Vb`q6e z#2IBN38<=`f$+g9P*3V5bq5+G1gjWwSZP@`28&>Yz-#E`I0R{en@}Pi$JXU>MKwio z30&6S@-0*<^=M0=&OD7CMX|U5TS}v{M#)@is#&HqSpxiv@jW&@o*Kx@#JV&xII+fK zw9^~|yNG4b@zmr1kk@Z+?C*nyippYmY!%0;SCdrrfd=j4z|O6VX?Q0>FmL5#5}Qb- z9Mcrh$S$-nT~ay$ky}`eA_F+dik#GK=3M+tweydXCwGowYNOFmem?@ed`&eO>Cnxb zPbO||K0g=%vGb=h5&RDtFQM=AmwEXtT^2l#h6DkKwk1b=b{66BSR+%^*b>!o8*{rL zcI*zGmh{j6Y~Srn20x7=ri?6XtiSP>N*ywZ@LTGWY7Gd#r1?2e?z8$@LdOmNk5!Y3 zdX&N>>e1E4J@k_kA1L-p8|N418qJvq;45=E`kI26==$7-QwV&#;`NLVy!e5uh~Fj2 z`wLLa;>nCy3`Ma9^qGc{ZT1;eW}_HA$$;dZheB!w~yZUCE?D$u(mYO>urEJ zx@LFcwR9N^^}{#cpl?PuEhwy*z}TrscV7MYKNVSFb9=XWJk5PG;;zW4t4o(0K6+$> zB%)Lb7Rq;j{AJ3HDevKOd~rI2F9_zhMj+{FNj_dg#Sce}I?i!#Hm%k-esi^tFFJ?OPzM`C1g)>K$ zHC&jscE8wt*m3pK+FLd8wTgLRdb-kujlpW#nQ??8Xx^6}KaB7fHQpRYNAbJP6Sspq z=FlwnO-0$V*k>$g4vj!#FNUF`&)L&vY>M5CHWgv__g-c7=Y-5^A>v_=t6$N2>0lzm zM_ze>H&0$KK0sk8Ds8hh#3ALQP#T{?8*3R|`ZOh`n09T0m-&%UF%{o{llyp;LkRv! zFSLTVefBf-wWgOJ6i6F8`O8o`R$2~j^2Ntr4psYkJ&oGUU5UmY{+D-lY<@-+7OYH1 z5TPTXn{Pa;SYxusOE3OkTL3S9sD?}}Xgc)rKr3Ofu$JpT)IX+iGckB>InjZC06Dq}le*S5qKn#ixh{&*ev*!8%s3h`B*qBn&3 z+p(2pD*yOkpMUy9Fo<_*WN?ov3x^)1zB`0CUndcie!TdzMc;B{SikC_ZQr)c%c8CUTvl9VthLZzFqtE z`o%QbpZmAydyLZig)LpR&sp49S7p(^gT*%>))vW`?v7M{FK;@?FCA#%Hs5K8jYbt8 zIGvS!Hp9LH==q;h^ZHKR**&BFEYC)Vt-|8pWtYji%J07z*mCaWS$j~RqkT`nQ%+>X z%O-yD;H%hE4Lc}_Jw`=J_qR5sEQMFOg{fnoyb*OSg10%U{%m^q<4Xrjg9|HxGZOpi zEo**mIP_=qp6G2=-IYhCoGrh`p5jO%E}YAJHeFh|Mbd?lB)ft*+;i?vucfy10>#aH zdge_}uE+lr_-bk zrdUAfrTD@prjE~Y6vW$RGJF zO=vO`N?q;9Z%+m9#{KtL?EQ0^vSq<#CmOAT@_+v4FbJ&BI5sN!s0EHlnkylWmgZ$P z`X>Qiz20F}n8>IfzSoxd;CBx-bta}hJ#n6lPO+Kex0|o5N2|rf!k^cFju1hd0{?Mp za67S{z?Ab_#(p?bm-|gsI7DOaZOLW$-T1Yflktt?8KaJ0l^i+vD|!EEIb1bXJ(~hl z5j&hTzvauk9U^Q^Pu|gGD+?QT)Xe{PsCrupa>Cq-t~G4ke++SDFksCYOE5^vj=59Q z*Mbltc8AR(d5?&yqIy()S*=$*CQTwU>NUK@o>a3?SiVQP?c=tpvG_1_@$T)Rt5v~e zCwFE&A{EMsRjc-Pj&!*C<6<6_i{!JRG;u863|N;Oecvnob_dYiD4^b7Mju-+K)AkZ zJ|nw7Hhm5`(6nnlh(`$*Vr7$I?WH@LcHg|M;;`Z(GWH3l2VQ5~~8ZmxTTj%w4dNCh^|x7)wG>39nH^EbfNVVt0hEg7itl@v@JTe76) zso66UCWmL^YA~7AbPrPHZ*mf?2AV5BjRp!s!}0T+j>+}BDOl- zUFX)s?HnsxW07jbMJv3BEf0^>e0t=_KN62I{G$J}_YC}bwsXl*X45KTm(gSoTezR= z1?~DXl}zdz`CaN0JuO(j(+Xhy*U1P{0WJnZMtf~eeO-WR6gkrsD4l)wblZ_1 z2X?+AuQ|&~HN;HNd8PP7GB(8K)z~QSC@#FKypf^ZX%sv)zuTmSfPbYXROt&2DA2Yxf{0 z)^9$0b?wQit<&!w=M4TizSmAkFF}Rl2}hE{ae4f<)hPc}I0l2q@x*aM1TMq9)@9MJ z0#4nV{_XdPSNn@oB4#>V?9LXKqneqFUza4?AulYI%~q7AE6ieZpTIe=`0T__d-rpa z+8rBH7`M!u{p)8dcm+rrrgPl;c=D|O@l>8`c@BrWZg63cqB{BekDIDS8+sD?2LerZ zUz#sz*gvqe%|V3?$c?{~d8@zGUh_bJldw|)=Kx%l98UsoKK zpI}4L*R3*MEOpe}V0QF+x9`1_eoM1QL|*GmIZ5sQNWJmp`u#ynAqzRdUr&gWCX#8Z zkac$vjjom6tC3_-_+2fx^4z^$>f)cCeY^F}rYu|6{z${l+gd!TgHe$r!$wQ}y^VcV zdQ2QLRfVfJ&%F+$$%F^bx75DKKKN#&@@4mWj@pz}fci$?j7!=9uTYGCJ))&J*?iX@ zWhu(`P$9-oz{u}gPvp6`KG>t*H|{ap(pK+Ko|6({VldG-f2CI{FSV4%ndxuh_0C-h z+Lw3kk4L88etz?MpCNnCo#JLDuTFQI*@Mp?=EUUXJC5YwWpk5;B1_Zn5$E?W@W1%= zP0IQ8Ul@K$1;za)QjE-0PKco=B?8T>6pfnZnEZJiYbJulzTG+aKsxjEOx5TXQXfCF zHKNI};NPFj$Hn3NZP9s2I64*?onO2&8PKFnhp|ab4Ov*Xw(3r}X*5k!;bskIr|k`RG=x@SOJaU2{ZuI76_G zAlt!XGV+s|H&*g-sh;R|^ofwUUw-S^ziktVT(@N$r!HJ_-E3Z+yqr#c9)gMb>@qyFh<Cf6g;_umwcomf2=0GSjh&~ zmyU+3Zk34_Ge`4o{jXATF2JzM-dy-yt8Yigw{<%C5m~H1^2?SR%(|9|xNwgC3UueE z$3G^y#SIT#Zgt?uA0yWMPCYh!*xWc?XKY?A&Bd5j%jeCvQwa0AT5c*xO{(wqNxAU9 zuA`0T-@SY`cz4tNaOPa2W))6G$Uh>$t&3gNcTwwIMxod573@!VpT#gIR4GW*=O^zy z6#sb8CZ3rHI44X^zp;;}pa*~LFWviQ z!?uF49(}ifM;nsmS94H`Mo#{X#y(tl@ML)HVx6( zk*!y5wq`9%fBG~3P$g+!is9~K#iA65Ec`B=Cm&NV+jNd2$+-N&9SS81k5}|UbNhon zy>KfaV7H`jz=)y|=UM%V0MEk=ex@j|XDGyuxB}E43bX z4hL@PlT>Djl#s)d7qKjAP&=iw3j63Lz0L|yfpUqZSUt*dgPj($9<-Kw9*0Zy#3oMX z0MVw^*|aeDC<>xb2_TL`)(IPX0}8jYs2nbpMA1tD?Z^h*fT0G-;vR=HFj14jn~IF=RPSv}6Jf-He)J_bEoA0VO@ zS|OGg@0M5$Ts4WUGr-`$<5F|jRUoC&t}F@v`%J>Vy<`%YDJ^2US#bXdMnndLqc4Or z$-8JxHNy7|cZE2*ZDu2=hwxlB+~E_Um@Yot!Pk!BdxI!lR5pxlxRe1b6e!8EGm0RK zp|i24hKeGS0ijZl@^UdJab)k#ej5b8r3-V|ELfR|PUZ4JsjE_CPS#SFEbR!(0_$%B z+NO|)#v8s^b`0L@FvnlFE(0qY`x05T;utYQ5g6)fY2h^?F^2N`wt9CcQGoX;=ODcf zF0m~|bf9$`8?=}akO%m1G9Dr*L?mH%oB3uS()(j&lzCx21M`1J*qiDm@c62gJ|FzM zx`GI1to`>8f$?-{DszR`;kmZ7@FZ=<(6$5ry2d!H$gt4C>Rbd+r!@NKGFp5NBfRRD zV0hPzW4|-Tuu~{}kIK{27X$NC0tcpWpju39Vxg+^kwBIasaC3V^>~t{9_vwQr~D_- zYy+ncv@nYBT|5g3)M#YmB>`fB(x4`&!8Gh#J={!#K^>W*eMpP3koYleF}6rEXDhjAgt<7x}WsN~X@Qi}m^g7m5O07{Q-7QSRkXE$0Tp%$jGv-&M6g_Bn7 zmef^K11&J&WB*P0#)GXgy9s8WS`Sw>s?_ysA9orHZEmE=@iR@L4{y?Bs?|Y&m=1$D zH_RHqNs+mi*`@2FH%crzg^Sb0dXp#8n2lNV+ZyM`!9{>-sIk0oER+b`quzQakIhcGBdr zcv~nrwoFJ5$ebprOxGw$CUy1O%uaovp|i`$F=P_E1OCQLeRP+I1DT?-i9I%Ip=bU%h?-5l4MzBX15U5AwA0yNg2TZJ=;h%wg_*9;VC&VC#yPqsF>4ZTUZ*)fDA%- zg3D-GO`2kz0qzImU|cF6t-4EcN;smd%|x?{4QX?I37t(6elZDdM{|S?lukInOj5db zc3kEGJ#cT`pbwx}Ue2!`?P~d?X)+7u{aD$!z z>hXH7an4YY6fP8fyK6Fo0@tGO^%U5V!VL<{u^7}=NmUnK&CyC+#S*SIS<8bf8K_4^ z1`$Z`ta3&vRtN?~A|6Vp2S@?BE<9gaXe_M8!+{Qan);o>E^3VC0L&g>&?L3{&vkXB z5tF%;Og_a%(9mx;iA*roHa8kUj*}cvlw*Rzhn}Mc@WuSh0N8Z{+g4yY5J`xnBC8(K zJ%;};cCbE=lXr z!vf13vBhZC2U_7=g^>;(&sG*mJtkK%XEdM-2CmwlA?ApYUj*r;uC}OZu9tKif^RPw z-U9I1W}S=6k?A{m7fp{z1Tg`$uq;+Ch1V&8y%C_tx>D+fL0%@wAmO+r{1AAa^ebFS z`s}C&HVE-@Knq@@fVFSPJ<26?nqgWq3B#o{&L{xG_cYyi_7S+w?Hk7T=L#bLDyVc)@c^LIjtU!L3qmG^R|RRi z!!LuLOjQ>Q_H{7u?q%9_21zEqD{FvNBvLj6@^}izcyNDTFbtaw1`*CbDp`P!M5=~h zm4*eu&@VCBO-*bb$isyX(ItA=SrHM4?BT$J(})qBT}qvm(+#U1l|zLsIgn|Z<2eJ) zj%xV92AxC;M=u{%Xp*>CIaCY_ou!vF%5-?Z@t8D9e;2&vlsVF~GCK`omW9Phby$^a z0V*7lL!td*4qvFVo3;Tw*yv#~HGs(mwRjm6%K%NB{LHCAQ<`^C_Vj+ zIOb4{t}|Ipl}hP|?Z;vG2Ok1dne|Xmphj+I!8V^xW0p}wMG3q8M;sD3bYmJLam%30 zNYG2nq0Ct58S}LRUGno%Z>k|uidr#JR{7vzEEcf zo(0IHB1b5Tt;g0+zU*VaDJbqBfqq`-^eV3dzJ9(7t8B!Z)x?x&rM0C1Rd2iz!tnDV zri5F00v6rUbec6*&KfDtGwz$ts}T`%U7PMiwR647^s#JhT;V-MyN{QEH<5=<*`e=a zL^{agjyvfEoa^}dL#oupP<3$UC{L6mClilhmMssRT9>LfDW|z!>HJM*RF3)6QQc!HinUI;d_v?BWa= z>gfR!)QH~Fr{;L))LNW>c>|^S-vj+}T_+H{&&L&bU?$CNG4fv0p*a#)-O)%HP?O z#}ISEx4#OBM--wvu%%X8PTDCc(%=g3dztSczC4CfWH<@O!NNO5z?z=fH6brIr7%f3 zW^$xEsj=M$XNOtpLaLy0#8jEuB0Zj0TC`d*KM$scwYB!MyNWtmPNt1Z4(*fH04>Mp z!|_!JerwX})q!U9Z~x(F zP1(OzJIn%fslGd$r;6^YMcLz$1*LG2Fgl1QYUYUB+k7}ZkCq|%Bi0{ByGZFb-Hg*% zhaS6^UllVR6Ma4%LfPbdQ;jXyc4A9ajM6+szc6_$xGVrh0_B@tTq0A(dF7i!vKI;R z_?yydAcoo4>OE!xP|ankLamXBMl9}~%Q3nRPT1zQVjHan#9}L=SG6nlo@wvg0^E~` zNR}Q+0I=b_Dec_&U~Fp3O}wCT9%v<_lN!xp#3P@AnHjYvwX7<9ab)*3j`It@H>Y8=F)c8$Sk_iw2_(6cFk{OVSEfY1?}W3_}*{Lb?{H-aBN zoY2@I0BY$sdZtT)7dK5qyCTc{@{ISM^D1`vPhYA(uegb=i67TR+@O(@FKUB-IQ)M{ ztI;?+N45D<{IO_TU9SudM`(I+;REdO!S7=`_7>3V>lNl%bU}=~qby;4a63Q}Sy9@d zO6!PVbLyh7w&ncmQw6+1C|$*BCW|i)$@k8+-1j#X7azZYW4d_r%GKxM-A&QjXKn?^ zr4Oy?ZD<6udlg^R8aOG%wZZ&QhMbI);E}f*2koPE&z)}r zouwy*m(}Jw`9u{9=>Xa*gx_j0s<`4wRq;gly$BhK@1(RTyp(&cve|6B@jPKo!Uqs0+b4SRa$Uz; zyET6xvN;0Dk6}JM7LpKOi{SffHO#M^s0(qfG5#9V(<4XzZM^qPb#fQI&boeED`m4a zG^u70#Pc4+VdGPn5NeKt`Q~3s(HO?2xOAz4zh)5j=8(jv?`ZCpkbo+L^;`1=wq5>; z(KKf8nit)0fkUKu7hi zo}bSdo4J?cmK^pey%R@cR;II3kRFc8og!`Q-PjrswCnUEzrwGMtpfpi^96jw z(e(tjcQ)B z&CP98)KI0F*qRK4rtG=^P5IF#4oQuVS?RS5t@u*cAMM80m!WkGdB2j4(dioEA|l4- z?SthT(pxw7t;J-SUw?>^xbE`Mw28EECYUfNIP{-3_TS&jT>23QjbAzOuhM@kf7|pb z&c4g20YdInT)A9b(R^2vGly+C2FQV%x!)x&MOzSp77O}x1=?Id3P=#}<9@lYkbYKT z=q)P#-f*Ra_c@|>+-(m^TvNSgAM85)=FP78f-_{Rf687UIZxLfoTN)kr!9{%p`Rou%GZqK zlcU>7xZ)oL2QG1Uv}TJg{Qmj*9^G@#ju-dZc7I3-*!kFhZEBIZh#flfgWlE zTdpB2fa-LC42z3f`~1gy)n|SE5ZsT1V2s~sqm_3 z6euuqL_0bO{ytZ#ECH?P>QWxpUB7nd>*mPOcb|FEFQ1B-(OJH3{^Zv6`#H?ADcq$2 zzobS>)G%T=_=s0n2jGAUe-*%EkwS=_qsjr@%)>7hBy79ASF&xY_v=544}I4C;O%eC z%9}k^xPY-O32uxZZLGpKtU9VX*by+Chj#42czxZH^x3m_57(u?1t;y@63HEND|dQ& z=p9?<==hahOg`5aI*0Ko^A)rt@+uTSEye-V<^`JppX9x=%*?U-?w#jbC3k+B*m+iR z=d|T>yZykW(#11Z*F9;cYkcRy7AL?;U`7omID*^JL&1*#ccPaQLhjGh{9JMA(qFo_ zFZ%6d@g~V9i`ky5ub-FxIuY9!JFY#$NbqH}m~;yL0#|Hoarfh$*-0o`@6-@zk79P3#q)(LD%J%sS>~AFGUX{;HwS=TTaum zocoeVq`32W`vmYTZ8`f=bl!3{+oQL4|0#K0_T~ce&=s`%#S@Hgl7jD3#-!aOb|h5A zpDFh$M^s@lTRkU|$8sY6`Y5~CwzyCtxnMcV{qy-JZ?|0i;u5MNK~pC$r>O*W^TcC_ zC&c;SdBl*=hU{@Wc}h1UEK;j@;!f+ns}H)< zpYQqWeD7MWq`@BkY}(#&ujI=8j}_WljtW1PV~!NMm!zwhI&tg#}|o zpyxRAQ<8Unaj4_3dsNPyU0l)B)zLSW-pzLE)%3q^EdB^F%Qqx=e$sRa#HH&AGah%-vz=1;lUPu|J=7?VY;y?#!8Ap)CSl3Iwq7>V|>^ zy2Ry(BcXi1+|;n|I>-vf`nnqB)9$;+``<$Ar{CG3XEPqKUu(B)$~g;FT#XJsS@U!l z)Z7FWg5W2Jp%#WunJUidb>-X9s1(4 zeQ{edjd~RWQBC6|sxY--)uFS&LkgTKacPCd$wB%yp1F8ed64j`b!TsHslB)Of4VCr z+&$gz^v|U8(r5e()jlbDxXcH`3p<8j)bQmARbft=A`j^v&cwdOo_)Ts{^|o5!Cv_O zy!lkb^qqzBKX!F&A@?44)tq5gBuxH@Vba`~o3vWYu>=-zIM=tLO;v!+4B>BVxqJ1G z^jCb%}A{xkZQUp6#MA!?v<^kYm7pu#wb$AV44kI+MPN$3uY4=ZXh zq~TQkM;{eU-4pa?XD^nBrY$?!pFMwlCVRK>j}fI}4vaRA^)7JXWPg6ZbD{U`sqB5b-sML~H(<{-%J)T81GQy-a6~M} zIHKl>RS9lJoh2WO%nZuhdr3Yc=-#S5bztVtlIeE`4wYm>AHCc6b9B(S*Rj30mMWlD z(3scA@WnX8h7-mxshAp(w63Pft!zE3e+F&3zwOGdH@#;$-@iU9dGK!Y%&z>POn$=F zmfBg`*lcJ!Vz!0vMLdn}Kp)XD(8tKu+oNXQR_32C&Vr{TB17-sYi<9PBFW4jTd#ip z)93jw^9Mt^3V={X=wpOQAyAa5!cNm_fOJqXyP>X1_G(Ygj=P@6mr6KW)|O;n9l>6JOT+Z3xpC~`K#Kj)Ar3@ zDVR%yCuQco5|4^uCP}|-^9L1ZHPLKqtDQ{k)V4aaRi|I;d-w8RUN4{LzOVbbp8LAq zpHHvS?~-4?KXtP6i#@wfmaJHA7_0s?28WO<$Tm`PAlTTogpNcHGYAPC^T6G_s5P-g zuOGg;2O}r3d%JSo1I%p$yjL5i9{egDxfXpq5k^Rri6fLb#w>pXmseX_n}?rSf&X>w z=FH9i{CL~ThbOOdM7fre-VKj`+x2wRuVcRcO1$mknNJ1rfgWbVUGSV0<}IY@<_lz7 zVs$+J!ir$UO<8%#s$E~beqH1~@3v3&dKK@%Q-=z^*pT`tuk1x>D6Tp(9ck|1?u%~# z^{SS+h*6Wcka=mYG}zF3={M^s)z9}I$G{me${%NX;+_t0*16Z5h3^(V*%HP2AhflL zSRGTJSDTHaRFI}|k|1Wf8oz_7a$YfX9r@Du{U_LyL-SK8$WEhAJH5&c=YN2=Jy{bK z>j*VBXb2sYqm)j-MDC*;CT#(gb|g`}KB~E{`~F!+zvuq?Gm{vT=6Gzn{(S1%Hxu`Y z9{&9D^3>$q=BNn6`uGM7USgnh5HFGrADAX>VUBIdI~|maTAwdSKU~=W*B1 zKkhldaX=4Z_%U|xW@g9E>1``mCGeHGcsP$V$E|4A7)mmknQDW^d^hj?LsaRtov}yn z9lzI)#cUjiDY%h=n*aX#)zMXNEmN>Fh%V3V!0ZsHkO@=-XhujZ`_vJU2$5k*IvV1G zP`gaXl9?S!vofbeuhC4~UE_N004=0SEtW~Pix8EJ$$?6ZHs8Ue=|k)5i-zB|dAAKWH!$MIR zjEo9&Fg%SN1d^uIO{aCiCNbv&g^sIW`@PQ0<&f~iO(6oHyYz`5qmXUS1mlblW?gI+Ds>3;jitPtG&BcjcEn;622Rl= z$Q)t)h+F6cnq)(ctKS92Fb;YgQ~xo|;|R?^W0(kEQfHGZV3AbZ!7RmmO%kv;kjZNs zxh=O@u-v7-k$=_8gDuR|{JsRS6bOKHXqVV2MsrRJN-Z+!spcN7n>re$9Y=g77pDXk zo19pfT@habCFEp;3l-dRPL+zI0PD@ppgKa>nC+S@JG3c0OsPP+wJ}N=GRD%19f<1aAtN4GlJD{xoA8*BI$BZS)rn|ki|HT>wHr;@sh(+#PAIKIyDVCz z8ZmT>oeBjq9)SQ2xJ8iAmjG1Ndf{xi&1r5v%@nbF!dzGghpCyR`Vf=e%K2QJnXWZ??ui3pL+Q#%-!6*=qQMi*ZECZNb7IM$+Lb z(263c0~j4;$0JsL74q~5e52{5NR(i@%AUB)-mvcN>Cy6sia%lbq0FCD+UR&+vZ^GA zf4H8TRk@JFmsHl`_{sb5#T|j_Ac;UhNp5EP8)2FP|MjBdf8>K?Jw&Ti) z?ftKN>zsc`-yiFUs31x_gyPOXLdmd!MESO20iIj7h}bU9sxJ$^Df@Z-&a?mg8grU% z?e?5|x}V)xv`nwb)%SdKS%kb=H?;c^+hFS(VGOmFjNrM+!?nc3!74n7G8{mnbl}Ts z=YlU?srq=V^OLW3`xPxzBP|7dl3rolC8;lvDM@?Z3M6OUUKm74st6$F1tlAjiAQ~g z8>%=Y6Fq?{FE}4%up!--`HgX_U83^m8-6{z?Z*9IIMNz*x;m4vcZ^U{i6dtv4=o}w zl85mO^W-!Zpa$J>H=o99_v1i2)Q3p=2??WG$XiQc(rsHTfc*kz7Mc zUdR|@5>svO#(s4Bh+lqOxnZRL_rkE8ChzL`k$%P2mA$m{pI~KtpOd!;=OBed~UI~V&=`;On%jy z*{hBp-Cp{CNAp_M0VMShj#M%nNT%H07sybj;JL#%rXaq4PPbD9t3T?vzitAexBFdu1WTQsGyjVD!}A;N9Wmq~LS8N5wvfah6bA8=+TX$x8MlRGNe#avu~`<) z>z-SmHtcsz6^uAV;M`qJIGzy(Z7~&&>f@lDKmQ1S{lhjFxOo_uf@VhY+CZ-QVj!2Y zHzkn3sI2F9z9S&kL`7J89jX^QdK6pPC)*ya`)sOi^*Cqwqjl-m`q#O)ZhW;Siq#%y zW6bd9$XobHl^{%$hH7vG{_rAF)9CYH3XwE?LMQ#`D{&!Gj2@$qcoiffB#Kz}-jee82V*6Wb&D?$!K` zp7J6#SP}nKsvclqiYVo7Z=pzuJlnc$W@;xhy^IvOh?G=`CzT8ZkvB~*2p|#%f&O6; zqmo;}JoI6c+`9F}AK!eaLmzopH*P+s*n(1uGm|U_Tkg}<=n!HJ}02~@g3Z9@|%k>a3UJK69vtRtpKW}no&P}z^Y#FQP zGnPZqFZD4W_R_ZIp3FAZUxP!(Qd+YO+`aY0l1c-SF-!(2jVu`oB&1X`I=Br&-jSnm zpZjm>nVg0AaD~;^Wcg^c=H|jh~p1lAxhTr=Li>La8=UH^IIl*;TurQ>ZV-U-8$-qwf%~sCF8$P zC%>|v@E-cHWz3Ry%){s;Coje^BtsxZvXbAb2NIH0T;k9HaP2+aQah>gKYSJU)IGgj z>9PJE7pAv~*wALH=&HUD+9f{v6Zr3yNYKV-%iXaf`f>zStMSflYNC87k zv02w%?zr|``H4}n`JDgq>Ze~)AB}>e)9<>q2R-=w^FKF7zfYPfltNB1nXUA=19+GrSc=pL&P4 zUjykK(phs%>)7K(%M?+!6onsMesced&*^2DU;0ipu^lEzDhymuao;4f$|_QEC7xeN zP9fWQXI;_Hb{7q-x~0r02cZhSI-n>}H0{=jTYmrKiS>V+`^on}7g0^PW2OvM5kb`s z2x5RqHI6I!D~_P4ju%GPquRB5?x@dS`|l6SuI~r?qS)L9D&DS(ZZ(f~evkX3vnBEG zOkOD?NP-e8g80+m*h;`IlalTPkkvKB?0^#SVa5yI{DZAKUn|xWifFTS)OpeJ-?eSj zCgn=Z)U*)3fpUmQPp8YqRY_@?Fwx0}0d@Lh;~&dh({hOdMq} zkZi+C0x#^`KJ(MdjvGJIdRER_6`N7L4O;%_D*HIJ^5Lq>rpNk=o(pNL10HSz0a-xg z+xBs}dsFauM%M5`@}`O)ijDYbBK)9x^vH`77^g4;ic->M>ev&v68!7feR1Uv3%&DO zIRj^IO@0~~D8X~VrX&mMxoQyaAeZbTGY&T}rg4!~On78-?#DM@=ze)5-ymW)Ze6Cx zQ?9&g%s*&V#FcXjcWnLgto6!K#5_Vi461(sjsjA$fy5ZRNaEgENMKapnTzr)K~#=F`tJg1=6efCYl5C6lVFZo`)?l{|6*5x7O1#+jW$i>3}Ag@dI zE)3)!Zs1-dCL1K=dYLrs`mK|>C<EZ5x77k${f>qh_4_1vkCqkNv= zw+MHd8I=wEmEzrCWCOlfZ*Wmmm9cGwT~lb_tYf%Ln7DKFwo=j!Ls@;Nl$e#=3e&7`_V~M zbeUtjmH&7@yYI-7bknU}qq{`cJ0?DT&-kn0bS-JE0*;YtggM=W`$3Q0Ut9x;mZu0N1A0J(n5+OZ}Xq)RHBLs*{ zo3yJR>uOqJF*}tu&#cAcfK6sBG^C8H8_4tf!qW!?1+e%H5v~J2HFqx1IL zZdlbVkW6NnY+^wPHsE&y z95xVLD9QrOA_d}~>^3TBI-SJ^xJCdp5}g)iNlrb4h1Xe70Gx-R3LOLknlVOhl!{%^ zA%L!S6Z@4u3(~D9HHu+GY5|vLMzgE0R4YbfnSfvovpY2L?D`l0u;n=A9I!)mMt_VY z=QLgpH=CP{(WwX7r=s7G&f)A_y16B*A-K8#mMY>Q9&*g8jDut8;6JnA*hcNN2oQGr znfY$J(mw)}Nz;=qy9;o$0DlI!l|&aWMC`c=M67iAXY5`YVw)AEYQ_PzXtx?vNCwqy zlF=N%DFRmTa;%`)gw=Xz4v1$~DHLy_tIo7(e+X!2S-5U33M(PhXoQ%+aLNn#t`y;9%-vZVPga?Od6xq;rsYw|f%30>`BLOom00+|n z0f(A_wFC-)e$1$VOtNKs*_*CzSRP#UFE^UKq?rbl`mV2PD13^p2p4-i1oOC$*{Ocx4i?c;L9g^fb-`7H?6MG$xc2R_oC@TSP`WVm5|Z zXtB}(!878t*WOrdv9MKQs$ZQ5(b>S?2eAl`gm)dHx7vt(*`X+Et24uLM2fM| zXra-J0c<)t6a|J?%?=KY(Eo<81!u$L9~Gj;Sda`X%-Ec6md%y#`gcE;Iw|r)dKj6u zdpQ!hX%YpFG@`JswAgSCQ`We%j^uzm)rxUBWtzq=pz`oHB}ix%9MgsJc6eWktg*JUqvSgH4H z??x0bG7L#Ims08qYZcDgHQcYPCcgmP;7n_Kk^X$u^^%{WmxM4_6UWc2^c|D```dS3k+n&461N8~Q@Z3&m$h^bc`omorB_HOr~Y+{!b=!kKf`%D zlO)@R$g_XlP24mP{^K&qvlBuAKXnWEfUtPe2-x!b&tbGwpa%U+ICaJ^H=WI zMNev9FZ@1~@&*3x=`_dnuJ8AM)AF$N*O<>HK6Ca>HKv49PP5t@ATRb?$=`O@=3SCF z&Aw(=2*OjFHdY4Yu3x|Z&YI!!%3T?2!iV;J^J4p>Wvl6X{R?_leQ@j32K{+@=kNOQ zzYh!~IP8}YO~A#s6J4OQD4mEhHb2X7uZc7}Waq1Yd%tMo(0ggJjqhx|?O*%d&M(sb z_OE+?^$Usu0akgo=k?`hD{<(1itUl|;Ovd7Q)hpL8aIoCnUec`zeHjz^|;M;wN+KK zqc+8RAj&PtKN9HwruE}ZLfRKZN#DsuxAsi@<$Fp{?b|h)7sBr{yH@7y)W|YM zX)$|-FyC#P7kLY+v>M0f!@$%BW|UQfdFG z{w}e(3j?%w%(ABRZi%9}g@l4^V78yaxS+jBmxV!9TExXZCzBMy(KKMm({(VoS`N(V z+^`KesOj3@Pn|?mhc2oB^mP45UqmQ}aps_q$uehzg5!qT zTSO2TYV_%Km<;G4v_3dTC1xQGL}Q_zYPQm0;6OM%*}}HUfa{Y!)F%U&Jz$aqp7@BaZ%FXJr$ literal 0 HcmV?d00001 diff --git a/tinytag/test/test_tinytag.py b/tinytag/test/test_tinytag.py index 6b17e96..51c865b 100644 --- a/tinytag/test/test_tinytag.py +++ b/tinytag/test/test_tinytag.py @@ -6,26 +6,28 @@ from tinytag import * test_sample_folder = path.join(path.dirname(__file__), 'samples') -testfiles = {'vbri.mp3': {'track_total': None, 'length': 0.5224489795918368, 'album': 'I Can Walk On Water I Can Fly', 'year': '2007', 'title': 'I Can Walk On Water I Can Fly', 'artist': 'Basshunter', 'track': '01'}, - 'cbr.mp3': {'track_total': None, 'length': 0.4963265306122449, 'album': 'I Can Walk On Water I Can Fly', 'year': '2007', 'title': 'I Can Walk On Water I Can Fly', 'artist': 'Basshunter', 'track': '01'}, - 'id3v22-test.mp3': {'track_total': '11', 'length': 0.156734693877551, 'album': 'Hymns for the Exiled', 'year': '2004', 'title': 'cosmic american', 'artist': 'Anais Mitchell', 'track': '3'}, - 'silence-44-s-v1.mp3': {'track_total': None, 'length': 3.7355102040816326, 'album': 'Quod Libet Test Data', 'year': '2004', 'title': 'Silence', 'artist': 'piman', 'track': '2'}, - 'UTF16.mp3': {'length': 0.052244897959183675, 'track_total': '11', 'track': '07', 'artist': 'The National', 'year': '2010', 'album': 'High Violet', 'title': 'Lemonworld'}, - 'empty.ogg': {'track_total': None, 'length': 3.684716553287982, 'album': None, '_max_samplenum': 162496, 'year': None, 'title': None, 'artist': None, 'track': None, '_tags_parsed': False}, - 'multipagecomment.ogg': {'track_total': None, 'length': 3.684716553287982, 'album': None, '_max_samplenum': 162496, 'year': None, 'title': None, 'artist': None, 'track': None, '_tags_parsed': False}, - 'multipage-setup.ogg': {'track_total': None, 'length': 4.128798185941043, 'album': 'Timeless', 'year': '2006', 'title': 'Burst', 'artist': 'UVERworld', 'track': '7', '_tags_parsed': False}, - 'test.ogg': {'track_total': None, 'length': 1.0, 'album': 'the boss', 'year': '2006', 'title': 'the boss', 'artist': 'james brown', 'track': '1', '_tags_parsed': False}, - 'test.wav': {'length': 1.0}, - 'test3sMono.wav': {'length': 3.0}, - 'test-tagged.wav': {'length': 1.0}, - - 'flac1sMono.flac': {'track_total': None, 'album': None, 'year': None, 'length': 1.0, 'title': None, 'track': None, 'artist': None}, - 'flac1.5sStereo.flac': {'track_total': None, 'album': None, 'year': None, 'length': 1.4995238095238095, 'title': None, 'track': None, 'artist': None}, - 'flac_application.flac': {'track_total': None, 'album': 'Belle and Sebastian Write About Love', 'year': '2010-10-11', 'length': 273.64, 'title': 'I Want the World to Stop', 'track': '4/11', 'artist': 'Belle and Sebastian'}, - 'no-tags.flac': {'track_total': None, 'album': None, 'year': None, 'length': 3.684716553287982, 'title': None, 'track': None, 'artist': None}, - 'variable-block.flac': {'track_total': None, 'album': 'Appleseed Original Soundtrack', 'year': '2004', 'length': 261.68, 'title': 'DIVE FOR YOU', 'track': '01', 'artist': 'Boom Boom Satellites'}, - 'emptyfile.mp3': {'track_total': None, 'album': None, 'year': None, 'length': 0, 'title': None, 'track': None, 'artist': None}, - } +testfiles = { + 'vbri.mp3': {'track_total': None, 'length': 0.5224489795918368, 'album': 'I Can Walk On Water I Can Fly', 'year': '2007', 'title': 'I Can Walk On Water I Can Fly', 'artist': 'Basshunter', 'track': '01'}, + 'cbr.mp3': {'track_total': None, 'length': 0.4963265306122449, 'album': 'I Can Walk On Water I Can Fly', 'year': '2007', 'title': 'I Can Walk On Water I Can Fly', 'artist': 'Basshunter', 'track': '01'}, + 'id3v22-test.mp3': {'track_total': '11', 'length': 0.156734693877551, 'album': 'Hymns for the Exiled', 'year': '2004', 'title': 'cosmic american', 'artist': 'Anais Mitchell', 'track': '3'}, + 'silence-44-s-v1.mp3': {'track_total': None, 'length': 3.7355102040816326, 'album': 'Quod Libet Test Data', 'year': '2004', 'title': 'Silence', 'artist': 'piman', 'track': '2'}, + 'UTF16.mp3': {'length': 0.052244897959183675, 'track_total': '11', 'track': '07', 'artist': 'The National', 'year': '2010', 'album': 'High Violet', 'title': 'Lemonworld'}, + 'empty.ogg': {'track_total': None, 'length': 3.684716553287982, 'album': None, '_max_samplenum': 162496, 'year': None, 'title': None, 'artist': None, 'track': None, '_tags_parsed': False}, + 'multipagecomment.ogg': {'track_total': None, 'length': 3.684716553287982, 'album': None, '_max_samplenum': 162496, 'year': None, 'title': None, 'artist': None, 'track': None, '_tags_parsed': False}, + 'multipage-setup.ogg': {'track_total': None, 'length': 4.128798185941043, 'album': 'Timeless', 'year': '2006', 'title': 'Burst', 'artist': 'UVERworld', 'track': '7', '_tags_parsed': False}, + 'test.ogg': {'track_total': None, 'length': 1.0, 'album': 'the boss', 'year': '2006', 'title': 'the boss', 'artist': 'james brown', 'track': '1', '_tags_parsed': False}, + 'test.wav': {'length': 1.0}, + 'test3sMono.wav': {'length': 3.0}, + 'test-tagged.wav': {'length': 1.0}, + 'flac1sMono.flac': {'track_total': None, 'album': 'alb', 'year': '2014', 'length': 1.0, 'title': 'track', 'track': '23', 'artist': 'art'}, + 'flac1.5sStereo.flac': {'track_total': None, 'album': 'alb', 'year': '2014', 'length': 1.4995238095238095, 'title': 'track', 'track': '23', 'artist': 'art'}, + 'flac_application.flac': {'track_total': '11', 'album': 'Belle and Sebastian Write About Love', 'year': '2010-10-11', 'length': 273.64, 'title': 'I Want the World to Stop', 'track': '4', 'artist': 'Belle and Sebastian'}, + 'longer_flac.flac': {'track_total': None, 'album': 'Belle and Sebastian Write About Love', 'year': '2010', 'length': 0.5742176870748299, 'title': 'I Want the World to Stop', 'track': '4', 'artist': 'Belle and Sebastian'}, + 'no-tags.flac': {'track_total': None, 'album': None, 'year': None, 'length': 3.684716553287982, 'title': None, 'track': None, 'artist': None}, + 'variable-block.flac': {'track_total': None, 'album': 'Appleseed Original Soundtrack', 'year': '2004', 'length': 261.68, 'title': 'DIVE FOR YOU', 'track': '01', 'artist': 'Boom Boom Satellites'}, + 'emptyfile.mp3': {'track_total': None, 'album': None, 'year': None, 'length': 0, 'title': None, 'track': None, 'artist': None}, +} +testfile_mp3_3sec = path.join(test_sample_folder, 'silence-44-s-v1.mp3') def get_info(testfile, expected): @@ -35,7 +37,8 @@ def get_info(testfile, expected): for key, value in expected.items(): result = getattr(tag, key) fmt_string = 'field "%s": got %s (%s) expected %s (%s)!' - fmt_values = (key, repr(result), type(result), repr(value), type(value)) + fmt_values = (key, repr(result), type(result), + repr(value), type(value)) assert result == value, fmt_string % fmt_values print(tag) print('') @@ -45,9 +48,54 @@ def test_generator(): for testfile, expected in testfiles.items(): yield get_info, testfile, expected + @raises(LookupError) def test_unsupported_filetype(): get_info(path.join(test_sample_folder, 'unsupported.filetype'), {}) + +@raises(NotImplementedError) +def test_unimplemented_length_method(): + TinyTag(None, 0)._determine_length(None) + + +@raises(NotImplementedError) +def test_unimplemented_tag_method(): + TinyTag(None, 0)._parse_tag(None) + + +def test_mp3_length_estimation(): + with open(testfile_mp3_3sec, 'rb') as af: + tag = ID3(af, 0, estimation_length_sec=1) + tag.load(tags=True, length=True) + + +def test_invalid_ogg_file(): + with open(testfile_mp3_3sec, 'rb') as af: + oggtag = Ogg(af, 0) + oggtag.load(True, True) + emptytag = TinyTag(None, 0) + for attr in (a for a in vars(oggtag) if not a.startswith('_')): + eq_(getattr(emptytag, attr), getattr(oggtag, attr)) + + +def test_invalid_wav_file(): + with open(testfile_mp3_3sec, 'rb') as af: + wavetag = Wave(af, 0) + wavetag.load(True, True) + emptytag = TinyTag(None, 0) + for attr in (a for a in vars(wavetag) if not a.startswith('_')): + eq_(getattr(emptytag, attr), getattr(wavetag, attr)) + + +def test_invalid_flac_file(): + with open(testfile_mp3_3sec, 'rb') as af: + flactag = Flac(af, 0) + flactag.load(True, True) + emptytag = TinyTag(None, 0) + for attr in (a for a in vars(flactag) if not a.startswith('_')): + eq_(getattr(emptytag, attr), getattr(flactag, attr)) + + if __name__ == '__main__': nose.runmodule()