From a99dea1d9be4d2a88ac75729fc563c9c819b750b Mon Sep 17 00:00:00 2001 From: Thomas Scholtes Date: Sun, 9 Mar 2014 00:30:24 +0100 Subject: [PATCH] Add tests for legacy coverart tag in ogg Added a `coverart.ogg` fixture file that contains raw image data encoded as base64 in the COVERART tag. We test that the `art` property on mediafiles correctly reads these tags and transforms them into METADATA_BLOCK_PICTURE tags on write. --- beets/mediafile.py | 14 ++++++-------- test/rsrc/coverart.ogg | Bin 0 -> 8765 bytes test/test_mediafile.py | 12 ++++++++++++ 3 files changed, 18 insertions(+), 8 deletions(-) create mode 100644 test/rsrc/coverart.ogg diff --git a/beets/mediafile.py b/beets/mediafile.py index d60d50550..0d97b9ac2 100644 --- a/beets/mediafile.py +++ b/beets/mediafile.py @@ -704,7 +704,8 @@ class VorbisImageStorageStyle(ListStorageStyle): if 'metadata_block_picture' not in mutagen_file: # Try legacy COVERART tags. if 'coverart' in mutagen_file and mutagen_file['coverart']: - return base64.b64decode(mutagen_file['coverart'][0]) + return [base64.b64decode(data) + for data in mutagen_file['coverart']] return [] pics = [] @@ -717,13 +718,10 @@ class VorbisImageStorageStyle(ListStorageStyle): def store(self, mutagen_file, image_data): # Strip all art, including legacy COVERART. - if 'metadata_block_picture' in mutagen_file: - if 'metadata_block_picture' in mutagen_file: - del mutagen_file['metadata_block_picture'] - if 'coverart' in mutagen_file: - del mutagen_file['coverart'] - if 'coverartmime' in mutagen_file: - del mutagen_file['coverartmime'] + if 'coverart' in mutagen_file: + del mutagen_file['coverart'] + if 'coverartmime' in mutagen_file: + del mutagen_file['coverartmime'] image_data = image_data[0] # Add new art if provided. diff --git a/test/rsrc/coverart.ogg b/test/rsrc/coverart.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b5407dce82f29d44bf58652b571f9cc4d0117ef2 GIT binary patch literal 8765 zcmd6Mc|6qH|Nj{Vqv%eujFN0&gsd4-m$8nl!(eEVeH~;BZ8TZBs0c$$Oo)-Oq#;Em zxhYYWWNRWSOR2O--L!n)L*3~I@)xVcjOOtI#^WY-`+E7wq* zwO^#4RbU`qE6ko?>5nxJ^5uzgbtd4kuBIXG#EpA5ZrqD8H;uJ(fo}7_K%A)qo?>ol zXk{6&XOY*`nc(Vx-==Ry#NoEU1eP?h4r}HLZ59SlzAk9XeEc1oRA~xb+cMuL%O4niM&RLWF+r~8ECY@JAk&IbX?#hC zs`!8o0PrH!^oOeHiiTOfILSp8$eEA;v_y*IGR1G6RoZq(eOsTo6CtjD6M-;KB@OZ} zIXyoKo>UX-^8B*Za;+kMD1<0c0LVeMw^VIK@_$ng@KH5PQLdldPf1SeQ)B{8Kr)%XJ*OaB1fV z0OXUz@z(OmU#k@PLnxniba_F-GPR1*k~EzT^}1U+oxEzMwyw+QnbtL=nMifL*fzU! z{qDZijZ+1oEADs%SDzcOL6<>RMlb4*2AKyT?RU)7k|#Muo>dUlfj(Wtx2R5Nkay0F zZ&J*yqW`#VP>ikU<~Zo8x9z-Z>mWhs&mnmZ_>at!y`^GC-ccXCqdpo;_9o`~|K(cR zIcNEyoamiAOpwj=i2HszoNTbyLtb}3m!Dc#Ic$7Snnt24gcXKXiT?j&y4 z=VIX&Z81`BF-*4`jJ6w&CJ@h&hz;c70kT&v`N6xmKV8(di(9k?VA?vp)HMt2O>po9D|%5^7yZN zbeMw_O6nE(vjG6mQu-CIZbi|<(OtHkbFn+;vQ2{EK=`MkZ`Y@12Pt+vbm~Bh&(W(B za`NlfPmCg4k=aabW%+YE1g`uDVef#d?30l&*!#k&Je!pC?y?lReg%?qplG{#~-b@4tWco40Nj}LGannOiXFKYgnn`#mCB7KjO3EJ??|4KF-`>Xhzp5pKp31S4bR6B2dKWU zjR|jU`>0#`qW$}+WKSxI^v>2f*KRP!zmH1h=J=Ch{fFP__eGQX2>!#-q~REUxAP?8 zd|V$j`9Y4qmzzHk6+?QL>^Yb-5ltF#^LI0Fg+@IGlg9_B-ucE31V}QeTaV;MC3(4# z1_$)}=sd~8E+k?MB$?zkK<(D!N#<@Mx#jXCyX8_xq9JB~;(LPIJe4?@Gd@5bHy{nZ zBM|44p;4aXMk)!lmGCysIVO2L+W)~|@&jTx36tAPjq}bSkGuO54dch%b4T9g_(P)H z$-^jDqU0g3_k|PlagTOWNz&mXQ@5ICMQ+TNE_C$ulYR5!Mu-7kvFYO|qbn~TRj|*T zsM#P=uD<-r^O@^)3(cG(H8TrrsH?_pJv-C<=3{fM`l)9hT0=TpYwtB^-)|0AzY;0a z89LLUJ=5&eK;7@Pd)cpVqN$`k0i+xA)aXZ6nD`FJv@o7&S9O>a%WvSLVPGIbDYe9p zSfWbIRZU|}H8NnXR00yHxpB2QY31zUV(pczD zR!9dYn8A70#35g-3FDRoFLuKiEcJ_=N^Z@wr%k0qR>dA>a0n9;wa8pkxrZ6Dml?!n zs@Z033=d>jXY*_a`^Dl07h!NTxSZKePSwKV26-^pnw=c- zn!2!srXa>wRBBv~#zGT>YPO>$qLN)T!|T5IP!l=Rq;-iCw!p6X(6oWu6fvX2osTnz zT+msc%!SSg>`5SaZnEod@P}Lw3aQ?DcEivq8nElHClhnY-VOfa5c7F| z&w1)#4%KTg?$MzC$Yc}ec_*iOfnE8b;l)C00Dw3Kid#cP z=(8A}x4>vF03<$ghxAzza*yMSV?tW3U^hIs&Yemv35G1?2~k)T?3$Sw#u8=bDWso8 zN>h_2qojh(o@wILKt^HLY`DmIHUl--GaWVR3$5&?nhlUjXIg8a>5vJy4H5UD=-xcL z(3)92)1>*aRa?Xg2F8R}026^tRq2s zW6)!DCstZj&(8uNRUn0!p-Xws+{Fj)-z)3?Ht^jU6+aU7-5LK+;{OjY=lpk7{r~K5 z890^}36Aak=9$)zlO1ugL0>OOL~2i>e0y-JXrEh#*JU7AoRCRE;)6BLcR)T`dKXX5 zr{FyfLrl6;rKRGYw+(;6;}4&mWQ4vbt#=Kr(Vz10sMH@Upxkb(mkh0evT#bLHdH}* zAL?uJCjiFuFn}gIRBP0V>viAx&87LI%Xlo)Nc<7QDQHoJWL_5`@51XwBeADZ6y7;W zI<`0pB~FwTMvKX|&{`K$s!rLr%g^THq0PH--4@_vH zm5K%8M+GE#hZ9OcXfnA)_^u?=bkht`(+($HQLL?DZ@!Oxh^~b5F+*fww3u{=>F^Gn z*s(R7GoJ|sW@|>V8z~!PX|6RCv0##Pa16c2?oTm z1bt|KM)2i~Loc>zij8`1#I@9mt$Y-NA?@^STqmRm1!%!P7s5?nA4MGFV0W_Jtj&Q1ReMU;tt+eKVgTsv-yw_O;{E%AHxK` z^4~$!zf`6J!0u3!Lz?g-qF+MG!Rz_X{5FO1o-IR*Ma!uIy`n_EJRr;X^yPpAy#vQ>hJo)-R{cJ5$w&!+?Pq4dK#sONT0ihzba zeY%9d$E2J)I(5#TFgtE1^49*h09jF8(Kk<|pZ1J|ndLHtx5BLTs$8_-`hQHnz~#Do zTkvckvOydnr)+U&a)@Sj)QycMhXu=Hs_I zpKAYj=#$bG-zZl50|U;-OY>{e%esF(^5!?KM4^t#8lN&X@iPz3e-?8p{E{|)ny6Q! zI4|Q++IChnt#V7Th~vHwEBxF^U3bNn*3vf=7Cd!HSPmowpd~lG9H7^k!gj&}3bJWy zF7GJ3CZA|rQI!|0wb8Ha{LdTj2GwnOQb{g--7s36FU!ZwI2z0C_b?jC{gQfYM-5AG za3E8e>KeO{W!C1^7V=UfkBmBkfG@?1@7G^941rjGSr~eQQ`oQpC))xydDvlU)qgbV zlRoJUh@iX6^3%?2q&(`%*#1Fu%KAp;@U95ywm0oPx*s$*TzXlxYhb%YVU@FG))j5M ztj3tal-zwBs~Z;98q#_*@76OhnaLEP@2~$S>JpULVLd^OEh~ZCwbDzs{8~zSa6n*8 zU3(Ifx$7h8VaSSVFL9~qcc_PD<#!vO%)wPuW>-+A1m05jr#_2anB;G4yD@WgOA$=4xU@|sG8Z|Q z^Y)(acK#i*n{Sjk$xK9B&iSNxny;)GeQG&t<>Y|LP@>N4k!}VIU~0gH;S_ zO=4oM)C*p-&ujLRV{tg!g4NDYHyL>5?NmN5suC{d`b+tl!`YqfzD?2DCwFC;ZPjr7 zY2E#IJEpmPde39#8o{w-elK}sNRoGGiK z(vw8Qlnhz)*5A0i?Ssl zEM1-H!66?UJ)c;%;x{@PaW6)FPX~XeEkQBh8K@aD5VlU-LPQQv11<2q8{X76oLo1< z%<1TOo96u>bvJ%X)mei{+ZCx?QRQFm{~{CKQT6u2fa_@JcG*`0v*V%+?wPSQ^-b6^ zqeAW5*_me(SU%>T=e4D87iF?*{_P3kMX!}iD07X- z7Kg`ivEbm`{09qfznqmR^tHY|e^0FR^^ttfx* zmB9T%gQ{;NXItOQWORliI*($cc|B<6y=~QwI`lD*xV z1){B1Yc<^(r`;!k-($|z<-#Pc#k6MfhKPxS?@A7Q&6ZzDW7X^)S zq^r7Neeu6imZ0bx?h;gt z^cy+FZ}YXx)$XZuj#eg5czQ+0~C7FKV17O8n{$7dA1q>8f)YEd znwZP;l_0#|RY#aD$k^62{`c+?@ z;DoKHw)Ne(+EbwxuNdb0L4De_Wu$PebXs!d<1y>mpM3UKara^JpbsDaqWsA~qdWuM zv~gOgyTuyx1Rp;tk|13%+3_sr@r5^bo34!D$@Ay-O9ea?t(?!AGv4jwnXv3s`N-vk z5SJ@jy1f^E%hM=Cc}E<;$f|Yxq$!SVfJ+QT;Zl-QJo1P3{5DHZ<>vobGmB8-^`U6H zcoAKPiF%UJWIT}!ZmN+%rtB6 z0OB}ZPx0u(SX;y{>gM!>H;LDT;<46}%W$9Xqz0IK&x#)j_doG3l=3xgjfJ9ZF4G!@ z^byryBUTr;JOd`aTzIUYe_d6;T((LE?xJFylu_lze#*o0<+k?T5kkk?vOd;5?Fx!I zb9kG+MCFlj^4ea}eM7l-!`nS0+I`XiQrQGn1e=XN)_FM!v-a5Dxn|TGtLpdGkI(C0*|F!|?pIH?=i3C_$%tzq7oLjg z&ud=SIcMuFzs^ua>Y0y(ICpEWhuW==s`frz>w1Tkr#SzJ;VZ)u6yD=7mk9?Z8X>r= zC$O81bEJv+OCmEP zKehI(@y+<=Djmm%A5jXcobQgNK7YHC-7=pqZ-tyx=Du;xN-gZdC7=H9z`j9&;>svo z6<}}StKibsEWsXt_=Sj-Qcuj{XhgK_)-`h}cWEU%(!cDs8Lkz&j(U%~YQd{$Zm~E30)s4z^(ND*~MN zzcsJ$z9R4vu3xTjssxw587yJty_c-NESdlST~m0C5#L&{RU+f_H0fOF&+l9w-P&zS zo1)y!V~W|GaO`$xTunN@VVC?4#qwXhr5;ZA?su+yq?wVF|L9y!rBls%)h8=+Ad}IWa9j` z$S)*EtGksLv`v07JbU5ot7`6-hc(OauTs`bB?cr`Tx*ex5PM=g+u3*ge0ekBp8r|; zVC6^Y$hTVeo_MOp-t2-tO8p@9{KJB|qe(g-D7OTm5EKP_*}ew7W&ab$6I=;}PfLf> z&4wE!pZZDV^|ZfGdc2VE4TxmR^^g0N?&e%S$?8e)nqS0q1AK%feMGI9l=-8aVS?<70F`dheOe-+S_e zgdysU-Q7?TmiC~2(i1m>SBj(l%=X|P+361hWip{~9F*%bY8jLu2v~c`1+OFZjL%FQ z;5<=#QopSJ-s9GSn+o=)li08JM?7?X84{LtYwmr)?sU6dxCgmuD$ey?$KBp=`p zDHF6@ZiR0?n(5=i6u$1*?*AhMzmF|JIl~d=lR-e=)Ey-R4htIJmmcHOf;(ag`x>iZ aApo@u>;`+|NC)BffB(kzyMX__#{U3YR(Ht& literal 0 HcmV?d00001 diff --git a/test/test_mediafile.py b/test/test_mediafile.py index 85b235f7e..79e3b7d5b 100644 --- a/test/test_mediafile.py +++ b/test/test_mediafile.py @@ -500,6 +500,7 @@ class OggTest(ReadWriteTestBase, GenreListTestMixin, unittest.TestCase): 'bitdepth': 0, 'channels': 1, } + def test_read_date_from_year_tag(self): mediafile = self._mediafile_fixture('year') self.assertEqual(mediafile.year, 2000) @@ -513,6 +514,17 @@ class OggTest(ReadWriteTestBase, GenreListTestMixin, unittest.TestCase): mediafile = MediaFile(mediafile.path) self.assertEqual(mediafile.mgfile['YEAR'], [u'2000']) + def test_legacy_coverart_tag(self): + mediafile = self._mediafile_fixture('coverart') + self.assertTrue('coverart' in mediafile.mgfile) + self.assertEqual(mediafile.art, self.png_data) + + mediafile.art = self.png_data + mediafile.save() + + mediafile = MediaFile(mediafile.path) + self.assertFalse('coverart' in mediafile.mgfile) + class FlacTest(ReadWriteTestBase, PartialTestMixin, GenreListTestMixin, unittest.TestCase): extension = 'flac'