From 8ea269362c05ea4292b29ec6ac5b3c33fd84b4a2 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 17:36:13 -0400 Subject: [PATCH 01/11] Remux WAVE_FORMAT_MPEGLAYER3 WAV files to MP3 during import WAV files containing an MP3 stream (WAVE_FORMAT_MPEGLAYER3, wFormatTag=0x0055) were silently imported with incorrect metadata and format reported as WAVE instead of MP3. When a WAV file fails to open due to FileTypeError, check if it is a MPEGLAYER3 WAV. If it is, use ffmpeg to remux it to a proper MP3 file, removing the WAV container. The original WAV file is deleted after successful remuxing. Adds a regression test and test fixture. Fixes #6455 --- beets/importer/tasks.py | 50 ++++++++++++++++++++++++++++++++++++++- docs/changelog.rst | 3 +++ test/rsrc/mpeglayer3.wav | Bin 0 -> 40438 bytes test/test_importer.py | 24 +++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 test/rsrc/mpeglayer3.wav diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index 2964c1920a..9b4058fd9c 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -898,6 +898,47 @@ def extract(self): self.toppath = extract_to +def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: + """If 'path' is a WAV file containing an MP3 stream, remix to a + proper MP3 file using ffmpeg and return the new path. Returning None + if the file is not MPEGLAYER3 or if remuxing fails. + """ + try: + import mutagen.wave + + f = mutagen.wave.WAVE(util.syspath(path)) + if getattr(f.info, "audio_format", 1) != 0x55: + return None + except Exception: + return None + mp3_path = os.path.splitext(path)[0] + b".mp3" + try: + util.command_output( + [ + os.fsencode("ffmpeg"), + b"-i", + util.syspath(path).encode(), + b"-c:a", + b"copy", + b"-y", + util.syspath(mp3_path).encode(), + ] + ) + util.remove(path) + log.debug( + "Remuxed MPEGLAYER3 WAV to MP3 and removed original: {}", + util.displayable_path(mp3_path), + ) + return mp3_path + except Exception as exc: + log.warning( + "Failed to remux MPEGLAYER3 WAV{}: {}", + util.displayable_path(path), + exc, + ) + return None + + class ImportTaskFactory: """Generate album and singleton import tasks for all media files indicated by a path. @@ -1075,7 +1116,14 @@ def read_item(self, path: util.PathBytes): return library.Item.from_path(path) except library.ReadError as exc: if isinstance(exc.reason, mediafile.FileTypeError): - # Silently ignore non-music files. + mp3_path = _remux_mpeglayer3_wav(path) + if mp3_path: + log.info( + "Remuxed MPEGLAYER3 WAV to MP3: {}", + util.displayable_path(mp3_path), + ) + return library.Item.from_path(mp3_path) + # Silently ignore other non-music files pass elif isinstance(exc.reason, mediafile.UnreadableFileError): log.warning("unreadable file: {}", util.displayable_path(path)) diff --git a/docs/changelog.rst b/docs/changelog.rst index 2536d8b837..7e61a01616 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -26,6 +26,9 @@ Bug fixes Play-count imports now use source-specific fields so :doc:`plugins/listenbrainz`, :doc:`plugins/lastimport`, and :doc:`plugins/mpdstats` do not clash. :bug:`6469` +- Automatically remux WAV files containing MP3 streams + (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of + silently importing them with incorrect metadata. :bug:`6455` .. For plugin developers diff --git a/test/rsrc/mpeglayer3.wav b/test/rsrc/mpeglayer3.wav new file mode 100644 index 0000000000000000000000000000000000000000..89f933f01315b69ae53b90e7c1a4c9b7ed1a6094 GIT binary patch literal 40438 zcmX7vbySmW7{*tO8Xb<57RiwUg7m0?bP2N29THON=o*NGv=Y)SC7^VdbO}f(9TuP< z@C`o?=lH@Ooc*}-xt{CQ*FYia>?K8oMDSk-1i%*KgNeug z{;PA{9sqzuKv~Er1q%$Jv*(l<2N0HZCx}H%*?!OKBw{wb`S2#383|#H`C2DrPEm4~ z#^u{@v@R_K3<_0&={QalxZd=~QbI(eNa9@tAf)e{P}9#FA(d~>9o|P39v4(S+sOi)T9sBw z7qp5f@x$@Hyh>P$q+VAEy!sOJ!vDRs<<*ZJ{QogNt$$VM2vpSCSIYnZU`E%X9T)A@ zxqc5Mlvtge{lgl7{aNgq-p6Tm00Iq6rw00CiDAHwZy%QrPkMqW)vYp2nNGG7-5-UgAGTI!LEVG zK%{?7NQC#1ohS(AYx}->p9lkvNkL~cm3I)PJ?j7Utu}TVVOBI;acto6hHo)upujQt z)Hs&4j%A$!`Rfba>7GsIn5JCQo~3b(_tL5Cw_~KY_Be#Aqy!Ea($w~fJ~~A)cf7@Q z&OE|>V5@_%=-#`pl(>)+@AhUE0qbZc`#cm3{54lDTp%Q@vrc#6cu?E^J*CzDVl-=* zsV3Cs?!c~&9&1(=bI6E~swi>vaIBdA1P;Ci94SxxiYf;DMbXzFv4bj}B5>?A5LGBC z+5{%_G+$8wV$FaDf(>Yal}Z6a`DiXO1`eN3<_{M)pI#mY4Orb6lCu=64-9(K{-ogO zt-|^}?E+q5XY=-9N1EWmkJN0F;lK>awUXi-iP|tp>eAGjq=i%=>cKEsXvku3X8G+m zf{bz+Ny)`3?#T#cV_mC>f(t8EJC+}(gWN=?WFM>?eqQ*#^?h))1JG4W7>K+lnqh}> z8gdFfV_Qp!0oEp8vWbLN5HsW!Gbjw!7ch(OlvBqL%Dml^3z%~yy@M`j{d^6?97g<$ z8&>tqT2U=LF9HvA&hYT&{F_VuA@v6ZhbG3=huf8mXY$&)l)MhyJli9|7d%u5%g9G( z3z43Phe#?%_TmE{_ld}UkjpaE(ciM^hlz%TVB)eCpI&g0lr}llOcSzx8 zhIARP{IAq8x!`i)!pwuI*&`jRUk7=lm&aEZ7Y}D<002s$qrAk6CSwLZrFB4XM=%e} zJXLCMM;Qjy%^uW$_m;0)*1lXCD$yYS`E%2jOnbq>uM_9<8&^g$Xy96y*bT|>f{%5G zV33ZO;v}`0V5lMDiNc(mQvupvyh%)DT$EEK?%C}f;Lp2zqqc!|h9{7Y}q*cU9baanb(k3Lkp_0HM&wbt63`(T0mSZ4F9@b>@*|QYsQpbmW1ivqZ{B z@##$>13j3jx)snacV-s!-#;%nmY=$Ob#-!8cP?kNMWB-!o}r7W%+7fe694W;&dB4^ z#pvVoC4!LU&dea`91(`fX57m%b@xPOoh7-Wr&mAZ{p_!HFJI4H6<k|F@Y zLD%l8escWmlhxJC$+O)n&s+`;nmZJd-5WDGBA0AovsQoQDA~bml)Z8>$`*m*cMN1^ zMG9>DBe{Knr^Z8Gf8+d1jaXa*`GBCmSop6aL~@;S zuIgVE*qc>@86J~2gt$>T@hq$@V1f)p94(dqIvEscb8%=Zqq7YQKwjmNm=1HiC=ETs;^CuQtHI)}1 zrgQh=?i76;GZuHZ$y>ugw9kgU6OnX0NKYt zmFll2hF4cg0EKXXwO3~}sXh0729gA{X*7{_#=U9lh^TF}3dkIt0B{7mkxQx2=o7G# z2RT$z^on0FTfQ#ei#THJlUPaEZU4FQ`s#1{>BcosIf$5@t5YFZ0#%&HR*hiY3mWE;l+xuD=SF2f`~lqZ!Vdyfk!r7e9;Lx?5z zXAUNZoOgEPUI{qy9rzV?K!F25Y_0^1w1y0I4b%@J3g@IE$JY=!B%d1}Av!D(D z!3xuh_^AFxZ~|wdNZ_Qs#Hha-&xw72De`l9NCrv!; zNw4*bL%Lc4?eqI6o&yMVlxZ=?ajx+j>uaDj5V1NZ`4~Rs97xt;4vFT&jpY2vY_QQ( z&OrJX5?O3|Yp>FG2{G&EovcKJ6A96hIo*1>V(@c~C~F{$f%(xpl^MAT_i8I;Z@D}4 zS_?$_iqO^<|V zG@4N9>mu%koy9K{XdWkMPcuEXECs9X4Tb%ptW}qzg;Ms{=M61!#a6|!#wrg#ac`zD zE%nQ}lSI!Lc%IVR_=_T&F2JC~_frf96C9vH!e^aC6-ib^V+HpHp#@_cG4UEwm}fC6 zXbR9Q^qw{_4cwv01v02P;`Th?sJ69{`v9Ng73xF>HG4*JeoG0H14$6I(Sx8k&M;I42fvnSnW-rKL zrHT3~Djf$~k`B;|2BrZ@v+fl~W8)NjGwqik!eOEL{R2JI3cLV>N`jICP% zG--Fa_a2`-pE||Q!Dm-8)= zVNA;{Uggh>+OrO>)-7{d(u|d__77UpgZ)?^w^msvoVSniwA5M1uOR17`tn_p^}bB& zImrAKd-%#+1(Hnp97pLwRUINF21wT`ATUPR5SVIq1A}iEIF?C<*~Ak9^C|3U$r_#H zR)gD))2a(9UNgt$EX6rK-gPSEJMfq}9T{Wemh!|Z^1@Ns)ip^!K+&~+D?kP|bBAl7 zqfpYnod34%4l1@ze1tqZYk*r;Ft|NHC9{B|Ju^u`Fx_UAJ7kPT!Ja!8t{n>AS73A` zb(V-Rh%#_+Id-VFYH@s(u@zJLF+oZ9;^(OG?_u@lbo9*&>SgyZ&Z;!vC2PKXQWexX z?e3Sw@VbaJ{C4J9%b=1%3*}R<=~12U;Ic;vi@oXEw;h23J7y}TV0Sxy4i>o1jeMLd zd>XTNKj@AxC;yfF)KycEpNYZMClQAW>u^egn=!Zn1_>$CP0$o6GfY`y)$1DQE0$24 zMXchnlE_@_8r>z)!iGAG1WYmyQjjwH1$&hN2HpmM>;Vy;?aE(jd`TP1%hM~Z&54|y zxW6>yk3I(I^L}p8Zx9^b__Z{raa+p^{&Y%^FDvmYt4l1CV(kvQG{;FZ00$bUg8|T7 zUD#)Eg51k=>M&|}*yApENEk7kVf8de&1+bgmH74n9N0&UoBty8Xkp>C@hoveQDVZ= z&TVVeA70N@_im})f5uzNXWq+W<01KD)FLE2lkw+pjZL-AB8z#o5rJ;B!Zpxd7^y5L zOb6c-vPszq@DUmS)rm&Mqu8YbD7$(f;*(BXJrh5`6qzIo+RInv7Gq^qhTidJVJ#BEsEdsSM)4 z(cNC^PopiD*aNm4S55VeSW_}fuL zUDH$Wf~^NfjqUhIu(TmWHi+057{hKa0Ei-%23g_)_TFDUy*fRS)9#=!+I)4E{)e>W zUHN^+(&Y4-hUQ^a=Q|FXZaQBxd6;Y}n1rpO{I`rWM{?!F2FB;Ffxd;oz8Mi+YYKjZ zYpQr4h*(7~PL$1S6eU(Us=Vqrf~bK2zC@u#_0x%j6?%?45QFIgDmF36aehxOQl4mD z5R@z@pyIdbZgG8Os+4GO+Uw6iyH39UxxcRw>aM8G5wrf>2$TAL`RQiM*$*FgIq82bOgDiqGKgYR;~ z17vK$E1J&(f(KNLo(Bp1J~6zH!vZW0by2A)eA_n6JaE743C20yi#M z%<5^SOn_pYn!J=D4C_>rQ{#-LW)!wgY#w&7TVQ>6M{}-LZJAm(TylI#=Z8run@^y7 z)UT~O^Un8X=QOi@X*G#;>8!^{z;UcTT5lOKB18Y0!jDkcfFjxTV9kkLyPiX$I3-xf zIE10osVtRQZ|ACmL6B_W;)?BcB^hy&6a%oH2x}dd3nwOr-ogSS20EXq@!|_#>35hAr`=k1&Y{j)Q;>1-lKu4L6dp9bykDVk3@={v#cy zd9yiWiG-?mGKsO-;|T@;r3>kS7dKP-t}&=K<5Ph06U0%W7AS0 znbw|f{)~53%sv-fk+Y9XFyRYXekst|FkgHHHiDM~*&)U#5+14)lz66SC8T4MV!lr+ z2;Ij^@vak00Q*uJpP{gV(xEb)21SLgXq?k`E#PEl_Z}NbeA`-veL9?%yl9SX^yv?p z2HNPK*6_2ao#mLMM=;tTZizoCxCZ(GB9}EIs>aulbktfzyP>*|qFj0y8~cP@+(F%x zVynmzB&>{2#I76WA^IVVK?-H+oTf5ZvJ%!;Pd)c!Tg|Wc7QNqxyNu%#UfOq<1KnJd z0WT9o-W$J9gtN`9d}YBlWZ}be+YSZbCZWM8Wr+Uz)^Scz(Ki$b>no(dbPWtb&P=suekM;H}Vmimav{42 zT{4ZU7@0S-G|JIFeVanH*v)-^yR$`FZt$JLD~W{jdP$WW<2(A2XLL`lJo@DWMh}c6 z017}X2gnP{2x-Qa5P5}!QZaTo2v**o&aR?uPV> z;ag*>w$`uG4U*ah!pePACb;yv`y&^lT7E$i8s|Q1+ydQl6JyP@Z(Drn>Ynv5nOq>< z&4w0IY7wkqU~Uj`4YU_VvdaB$Idz0!2JtD^&k37Ip~_egsbR~hP>fI9%^5z8S=3!i z9}lhVA%=@8#t3G()#6_A3P>3KkhFbo(^M2Q*XD5e$+vY<@A1OKee=Q_9}YO_{63`g zM(5|Gh)|6^0+MKY#C(Tg`5zOV3#)lM=^1*Xg${n(Ak%+k2g*5{-DWyRGx3P3d3FWuj2+&ANQ z!Us^G!m1(Zf zsOPeTv)%3}?eT>gf0m&dt-KyI_Q1DV=Fx90Ev!=0s}fkOK&9fbprDJPVP^~zoJN4a z|5@cV&w8+Kpj|ckr+ORxOYHl?d;|>k|}=CiRw4H)1{sIOp&m` zXr<<6we8I~O6xu1#@Wfj=uRmg9Su#LZuA)gC%)-UHE*e0aDz7L!K;n(uSRr`>1#jHPcB{e zT=aCt9c0#@6w#If_6PfRI#&1VjxXp9E*Be|kI&n+cE)#gpBIb+RBFOOVE|jG7*LnA z8?*#BAOvV_2%Tuz2+nJT5!y0{9d1hV7G$}|XcgECkTbb){1|rN$?`W6d@{-^i78^L zyT$prWzXTQX!BU=jAOslK#Q=AZU~_lH;LNP>$bU>c>)DJ>bHHi){e!I(|!M^966;C zQ5F99fC&Ew+1244bXtrL0mRM81W@eVT7{DS<1KR`a?EN2D+!? zq~9?uUXyB~ns%*r(?xu}J_~g3iVeEgf83kO{zIieqN^ul)O_O}zRgKzMnO=#^CL^6 z8>^iXFrNV>jKu&I%(hbrLb+u->Si&Q7$3hs);lgr_!1n&`RC%eJ&vT@zTe-m1;${V zbG{!WIARbWQT6aovi?t2UuR?`ne$>JN!W{~U>i=T3eurC@__oENb)U|+|vw7@eSEY z9JXGF-xQ2x2nkqRJvOC~oC;$||FV>kMu}IbPTv`ZfrDuW!MP=B=|7~dA2gcA9Ie{w zE!@ZS=-txaNM`&whW-8Anh!uq^AaF|resB6EJGimxtOh-y)Lv}E%=xJ|{Ll7Qd}_S- zcY``y^@&9C9#IIS=B+79i1rGQg7upw;BRz*PDbwvg)x{S1Zqn2}u1A^&jp z>-!-db5qB`Vj2{>1Y&H9%b&G%he)Ddg#Z|=Wpr($HXl>k+QdF!ER+j+_xVB7hl{^w ztv=;fpRZP`K3M&#E*GARH)4Y-h#<(Z{s@ka9Rw1%iYV$G71t7|6&L9pMpT6Sm8qDX z-%qx=9sim|oI#eE*ZiobEinqUJ!^Wy+z%?LXB|2FEx6$2j37#YJxt?S z(fK6Q`1vUh>+D&K+Tu!8mW6(Z<*?}*&cGud<+Jx|B?16oBc}!EcCZ6!J4`_e9j%a& z&H)PE;S1mG;d%<*&IJOl-y-op04s~5XTPUN!$Oxeo^aPC`*?&JU4Cz!Te^Ge^o#Hr zed|W+l=e)2rkp|R%?~e}T(0(2i_qMFS7<@(2wDkQ_`+|9jd_|CzeOo5|6&e+XubL5?y1W%xjRn%e9JloT`ibBT$U$epK*ZlHrD-{(! zxA^K#E)HUyBtF~}xj!zJTYoV6o)Btsm7bo5qs%Z{tGEXG10t_CfePbm$SNE^hxXM~ z(!CS%>WXccxD!MoYwl!zQ&i&dWv_Z`4}I(8_=uoYNFq2Ysb#5gFInrw_K_~w#4gp9 zZTP9n2SX9E_Rq5*7=%q!qhe}QIqMK5*l8Ru*rFZJ6Jm@LrhMG7pA3-XR44Om0$b@| z$0D#$s%SRF!LBFbcdF-qnAo`(WFy%8OZBoMzX-7=IdF6h$~LZ?aBr%NO5K{^&DtfR zV4a_PqaI=z!B1B*?wa&VMNm#tg}kzB(^NPk`>zwvzmx-!ikp#L>vCzaYpNH~^BV2n zBdK$=5+IJU_@GZ7Gp%NGoQ{y0PAp4k;{JRc_p0d4}XjxvTTF_eCxYL?KcO|9IQmUl+$Y zeu+Aaszq&&Uyg9)nv!#Dh{yVj4}>YdAIVoFf=K-Cm1DCLanV^^d>s))DcE#Gvw7N@ z@&TvC-^ZRqx{&45aN6SFP-1qxwB9Jx4~)hQ*<1r1f=K57pF@bS_3!u^66s8c*)&mP zd_<3Ki!8C@5Kp(gio~L;fnCmaP-Y#cQs{(?BP3tp{-~t<+0~`@&8xG4hoSd0uPh(D z082o2ikl;U?T}1<9nn>Nopd}qee+^@?#V8`bJN+yVQt>nr_^{i^T62jq56SgNL{Qx z6z0f$3&ZRJL%ynVn(8xDPyO~)is$Ky#;c2g!-GEV>WY{rt-CCrCho5^JT{=aOi{5- z)#(dd`3X!X6a$VB7l8aJydf&AVB&9<|7s{Kp~47yEn_8+7KfE6|P{F=hoIco9HU6jr`^(S!=Wz{vyMN?h{3Q{7x2m2On(%mh z`Z-$a9`L{zt=?e*jP7^{V(tjL2HFRa+H#W!JquNIB3%3WabF#b?pTM`chS+Vj zk9N{Jc5V`ke42+1Os{_;AI2?HC=sO#n2))*Rj*U+?GN1xscg=F7vmhr{7_1&sMMKn zVD1KByzPfrtk!LgS-?$6M*wC-!aw?Zn5vL(ab?E)v9}JU03&~1%ArB+0RL~kBP?u{ zxSmvPTzf|qj-^KKzGn0SOT1mh3V1w{7zw#uorpq znd+S*{5h9YZRt?jw~iI3RN6DgQD?y(nk=D2HG5J%g&gIr4U|K@T`IW}6R2apl$O9B zrxwLono~EtX)#TLV}d1Xh17U=jVWNDqZkC~l!bV9?U2(>iMsxp{6H?-wNIe1<6)pv zgZf)9_5m_rH;w>S_Hp}!%gB2Gc4zC}jh^ure-7;Qkk$E`=>2{ppI%_yd=HYw^rGs{ zY5JR8FaK|HGXEkJ2IDe<-N(0WkEk_8d=2f$eywaZ@XDnXQ2FErHw}rPNY4bOsi!MH z*UNRNW%&IZ7?vxKwIEmd%J!q4tn4y}+_de*eO0Qg4`#SFy@4xa^+k?+!eh&zm-sU) zB}pXM6uJpTP$5avd5V|-0e!XQWs#M-K}aTEA%~~2j1wJ>C#AVneVTXRw4iSMeYI3e zt$>oNXpvE27+G^S^MJZQ9P9VzT9UkCGQ*lTcD+Fin(#@1o#Ls)>pEr!*Tigh|rPSVYJiZmk4Jj8VSo6ZOiit4CTp`vMajrjVDUmH`6ZCL3JWy$6i|a zC8j$P9~?iIvfn0}P1$$;Rv&3M5{8j$|9tL%xd4R{?$-}XCY9BX6_oZw=$|z70S>HE zHa<^W1L1YKZ!tvwZ`&IZ?Y8PNB5W!gBk4E`Ymix-E>b@_oiXn%yi3~%{(h|tPLB-? zbtE;C*?ewC6E5ISODY%OTP`5fHhRNqZ{G~n{;3Z#@*K2@8jG@pIdc=D{k z;mS+wL)jIwXNAhQIqQ51z!nJ_Cock(&_#j~oc09jsz?}iX4B-JzrA6{Bo9ftJn$Om z7(`xiePTs+s)9Fst8Gy(lL_8E%J&w-a(Jnw&BinDQC1zRw!GuAuMO^Q&(8@e3a~2N zZTfB+QTbpN=GOk|=|xV;Q?<*{ji|f(H#(mA7Ng3#=&d|L+XvdO+~IMT8buqw{}6cr zm57msM2xO4A8~g^m{Ttl_#`#wXVPdy7!qQcBO;+s3_?;<6l^ni;VDIA(+rQ$Bb|h& zf1ac@6&0LX%&l+j$=M7ni#fEae{I~{oUP2(GMPNGeUUd}l@TZH;S!{e=EnBmms4H5 z>O&?FgI`XOonqnE+#k2q*@1lMTOs>sMerp0b==oMQu7hb|86bDGSwalN;#^CDO_B+aEMd}jm| zAH*gPDqWp(f(dcpAf1B*V00c{ox-7K0j-!V&V*mo3kk#tpY|HNb13Co9{r&#} zFAlE+<9h<;1qyFkv_&~%=Rpa!x(BJ+^Wy$7xdYV>91HZ>{5*?GvK2q<_Yvpjgn)?j zq4@h6vCW&LZ9)N|uqBFSEqw*SM=PD))~qkf!gv*W<};`ikwtUT&iI{&)(Ay}g|Tsu zZ~zi}U`!(!P{7sf$@4Ezg~4z>?QfZ4AgO-dpEQavI8w(Si2)hbFn~?&g%&6hLL{zAIKVliNJSl zRIekLUUDS49w8KQUj(zGC}JFO7s1x~Qnba}jz&6nsu_956SGbq!QMXl?AhtxtF5_U z+mKsPlU$lNy>4sj7V}U(k_=uAP~O;WnX&r(Om*wU(iXzpEgc>C`S5)nJC{R?l#j`>7Z4J%e$R=>|_+cW42 zA&WB{BMY!1kqqz~t3Huz41a>5%9xOt@(y$X!pwh+YLmF=V<{@$+p4|f)UiCZvUR&F z_mu(d4oZ}_)BfYerYK#w9WpL&*8+DyjAlJw&Fhr zPg{ao4_kX-wWkYz(~_@+;7lL@%~k~625rI;VNe!0pM86+T2U*JP!V$ty#KLVrd*?~ z16A~oO+q;wAmcC99o>W(UtbHz*VlO@VXQ}-dNcGNpXs_bxVXrRa+)3RZ|BT3Dm7~D z1-Pc7PLJv=KR7K7Ab;h{8U2=){5mux{_i$rCzM2;lS=U1S~2v13_@Q}YdoaERDH!|MY%~argc?2oW)ol=h{$|y0M()ec<87tez@rGSXFtEP8?@{ zZ!>XW-I7QZc@|teRg`txru*!OP5IB6hqg?M)cJ&+C?FWN4zwa~yMq`3OiQRDeI&R5 zCx}6XG;p3Eb}TMeBnt*(u?BQ2Jn-^YOXta?x3gUEZa2wRQ%Y0l_w^iqE-VR(U8%Gr*{SopN}a!W%Opa{O@!9JW!5A44Liku1L2$fiQ93`RpV zi3CW6qty{h6cDf{Yb-;L@ULUv+x?dLvd{Eg;x+%KQIqk(tB=!{UuNANI38JFDqdb* z89%yrto!+j2SKaAhhWE&vO@oMrT{#LAxg8ZDs|TSs7(atEc{T1H*j*d6YaC&i0^o^LO|7t(KZ<&T*02@!wfccOv3%1=qx z8x?$1MFD_&%MR09f8C=aBcZwmItjaf8}o0jI>qK)-$)wc`0yV?oDm04N{W(23rN+V zxuUqx6rn;M@0o2n-wvE4zu+e%)LR)z{mU^XaM`|JN&iF3Vdu1NVlpIVjxnTkcv(KK zHezV6z>dw%2tfxBL2xM05`aSm7)+&ny3s0BVwS5AFu4WcR3ifRds;*bC-{;@jt<}! zt0hvGx)SFuU+4b)^X{`>IdYkAgLQoby_2+M3iN9yG)%^2I>vt1F_^I5nv(2PD%Tv% z=Sy1M6lxHhi%H4j;{Vs>LSZ9D{~`neZyZ;nQ5um@djdfs+I*4_ED!tbkW!FYNF!S_ zHkyR0Y#_7Ql(d7(BJ+K&$j|(CEV3Tc$oatx6Mp+kMN*5?$Ni^9!+whcDb0m$k*NEw zffnjU!uNF56Z^l)eE!pbzwDyoLcP(Q2vJy3kWFU)CVNi-VYA{17o`Pl4BLn`(Le&( zwrJ%Z=xPt=L)aS4nso1Ly)Letlo0;FYQV<9;s3TmE%3zR2n_9AI7j{9iGyZRv8a>XL!k2L#3MT3+& zHz0kkk8Vio_%zv7@K@f}P;95WWhYq4hxUy~@ZdVxO9%)emhKfwcrac6xd(}?Yw*$! z?;Yxk0@awtq2g*ntrWdAv9RD0nl^I53MiJ~RfrrSIU3Fyj^@pQ41-Aok6@hcFJQwNBeTTs41 zi1&1;`ZR{xmv0Zdc8jYb-|6?9J|9>Svu9Q=T~MxSEnfIQy1c#TpwD>0Bzg2*L4@1r z8VGO3LUB@Dce!_XyBvNF;TU;Hsk;UWNC!p;IyPYfb3`}+zy^+R969=kaw;x9TXq== z<|F~G(VU2pnvcv?E-sy1#DDvobHTd#DgV>2nUB>+MkVXR+C}#=cTtMks%6&~s|@C- z64!}dvQ^vPW4Oq$ir%aNOj9rx*Rf%Y4y>8CjRgnYVD*5%5b z*Ul^sAM=!N)%7#V+V$PS@tW_XFa?O;%XiYeXLNDHQ-{ap{7We1X2U2ZGpm-iT9XkZX&KP_DRVK4imq2O;i&y6g zBvYUahY7Dzc5K+|ikyYR$lrmPjXHWFb=}tDd2mL?7rs;4ZfZ-NE8%&INzQpE3^y2F z`YQ)by&g(7j*sny*pj=tIV>^06?Q2`GQCZcee&S>HPBTkrKKEx4%rWeMdST{`|7{2 zt7B+%i3smD6=k0Til8GDCpb-s6X*zmL2GzMr)^N^`ItLUFtbR&@NeLGNvW0LbIsj9 z53s|uPhK7G8nHARJv^fVEEhRP-1nTa8{Xg&E(GX;LTxdF8U4_F-t1Hrj4?#XaWDU+ z<68(6qlHa}9`XR=5l#>tatHzrl6<61!W_ZSkN+=^dn|N>S^e7|H1D>Y( z^|y+CnQ@Vv!1D4lCFX8{G=1V^uwYJ8UPN->H4uJN@ce%c-3$Mha)kg+fC9J{K#l~e zGvX6L0!i#x#3SEJP;}4nO%aKwgj!UaSLK#E&aY~7lTTb>{0q$q(HUQ`X7y=84_5$x z>Ff?)s-@HJAx1`TsoF*Nm$BaC_acQJ#=Y(hbLGV^xbU8Mc0E+K|5&s(Zs0H*<%wiF zsuM`q>K*UvAlEU(^%#uM`40%A6h2_`B|??NINue0T8R?88gyPxYX7XZa5XXASe7uB zP#8ihjb#LOa1qh~I$#^Xzl`43K==bI#DwTt3Dyj^5ozB>5y161IU<9>>>YYx1lf$q zL#t9-%7xl@c{x4d^fx^?P6TsgZgn-{RtnlCtj}oo9Gdrs4{)>hbNp_9i4Ytr@xDZRcMGcOU)6A6~4m>uf7|-=i8?(iLOBjQF4$I zDTyel_YBkUO~KsJg8b&uv;FU`@QUA$vscslz^6a9BpSy@qs$(e$#1dHNcM?mTf{rL zm%edalGboLM4MC09NKRh{Hq}_8LtV+7#`^9|CbN9L@l92OzD6no0m@c^-z-E`SzN$ z+nehCc|4@w#G{J)ypC?Eyzvt$T9FZu`qayPg7|#dj#nBj^mjV%c=2D{&zh^_a)Mf2^e{2Z!?W5?jzwoUHLMKbi=gD^p8SC|06e1lMhmFB4u znQoHALdAj>Sb+o_;hH2YegD2$_<29(; z06M(BGtnUC(-1(bVO|fbg0kqC#Bw0fTkPqtPe+r@7wPAfbGKVN{OV*ow+VNSgKj$u zDo|0^DJr}J_+JAZfKe5SMAurq<^MXPwZTq$9+ZgJX;aETrsxjbiHE3$z5gbU%k9k` zS2x$9r>x>Y@Yn;Qn{i*W{Ni-K%`Ec!EjHZ!D&|&S-TrK4QC(0dd&6Zc^@dGj>F|;a zz;G~W0BLDv4RSJ|kSpgRg=1LrJf-dVGWu3Gwc-Z|ZEa>7)vtaQN!ibXlc7h9n6mhUl&?xB}Z=HXp6? zn~BP?%^q8ZZ???0Y+nS}NiX>5J7QbJ{y^P7v1q!;m#n+*Tljeo&uLUBMb5i1gzhZGFL0}Ke9SWm^=uSj)3P$7c=|~p%*=#^c5>H zk3n1m?SV+@*~!T8(zeC5inXtf?7L{>nqAQj!I(whkOmJkhhgZYm{_}hjdi=im{9Z% znD@#1ty|RI+Jsu}u3s_TWcO~nCsS;l23}pAKD22&Jwu6x(Hb8cX@tO`(0@83 zemNyFBdNkSg&2}GAl_IHC+7hxF!n*`@9T5pqB8cA-`#|Yly35le9nb|#NR!;dM{XxitYLa3fd?7Uv(=Am$ zf28!dwR}#$dhprhMeAk!&B}|n&;LHuC1nHDcklvhIy}HC9bcgDx^C0{8Z-VsLL(z4 z|BNKYMC{jEeO}KPnD$GT0wLwbw>sm}QFNrl@S8E4@euH>DDGca!sRD+wsQkv2`>|y zdF|W>WC=>QYkbZ6*xp9n{bZiq_nI*>^9D1V(YHiBKXaQBB7~VD9J)vUj)gfMFJjw9us;IDV$O11Za6Y)lu?_muX0 zXc|A9-MIIeYUXX(3im;Zr~=X4*3w4l%$;}McYVqL$nVdi?X~zBnps`_zlYT`XJm-3 zF{DQ`Erj_I>b)mVzr9w1$Vw1-lR*e-om|RZe4GEb&WTsFnIJjI_w2`!#B^_&=?w8! zlxdbPRe64bu#KDWsk7z4HV7+;W(Cxvl|vq(BmTAR9T5IT@}Dy%0RJjDzJ`b}vN3*+ zA{z9LfEYiFDpOmb!T(J~zG|JzrGFGv>%Gq+`g z?$dcC|0oej_M!6%0}*P>sWWy1OG`6TI@72)v!!*2UkA1_jvWQ^y4$xa{`oAO_jIVg z{z>JYPL`9tYGakFqE&0@jJgpei~tKqL3P<+M5|&bibOjY7v}EBiS(P1qfT)Y`?wLg z2=jnG*`NKL%Xs_^uuNy(CyV>ZYZJngjvuA{?bRpjJ>E(frFfq=&lbj=F8+F;%=pXO z#%%uhEvv$2>(k0jx|bRuT|6qhjH<@}ghsrFmhJzSQ%e4C3gvncGMq8_@zff5ZJZeq zhA=Gi2??~+BBUrq!Rg&^2A@|zMc~~;CD#ea;s~7+Tg4OOVp*$Q7pPb2 zp&dGnT70qLQf50t+q=cs@In(;WR0Pd_Pxy~+Ke4h7gMc|Uwe(f^-_v8-HH@@rSbz2 z5@I7o$H}WGbw|14`yB{nC=V%xSrlK%2d&)5$cE++=Y+tAKW+@v_0uK9%Er|?XP-we z7oLbO8jP4&))F-cT5mNrtX@Y5Z&R>P{1+i@2*>ry`buJVZm{(aXp5L`d!gXDxv=7t zEnERM7sr5*92-K+q{mBGO!4A!U+}LDd7>^fM(RqJtA*ljNVrJ~-td#x+W)N2DCWRg z`o*2mG?^maT8WhMX;rZi-lmyEX@^2fi!>_?5hZK%;^^`I?97)lsF&yk6s_*vc*^PC zeliWnr!VoeSarIymy3FfKl=Zp?XBOU{-UnoVTNWvQfX-^VJK-C8evFD0U2uO6jXZX z8jzIk?iNW2DIJhb2| zPu)H|)e6Dux;$$srjwWH8}rs**yQUjGsuU2< zDx#v8l91SbhW3~fdO*}4ZYwhVO!%S5ou)f?kVzLAVa!#V7W@Ah&M*GW@f7%rNvb-s zSlX1X(Qczlc>VoO+XH}>shf&WF;mLKd+Rcq5k}0bn-!qWn%T$W5n4^M(AZ4Z>oe5M z^k%06ASnnNx8$v~uKqc{vUpNBiR)@y_4p;JSY*m$Lo@Z zG+NZ)Ybc45Bk9xtm)Z_B;z!>u2qS?n{7YtzxWD%E&Gcb6gapG*NCw;?%WF;HzM2RQ zOPr2GJ*gTi8%Ctw0e(2iBDUd9s`3${Z4CN2hy;^F!-JFYPRG3s-1r;412C@+eRFYj ziXvYLPjFz;D;RE_+o;|N_-2(4&S_EDyUVIh%HX4O+^>$O9#g^mP_L-su~0Nf;UqSa zON5t>mD%2eA|#6OS7P@@Mk1WiBt)Iyn6@VdpPdlrbtH?OJ_{X(C?2|q!{Fh}-ru^v z0T+H28AA)zF&3!(=idTkU+~c9bS7W=mZNccsM2qe0+@vM9}itL%&G(+1rwraX(^D> z>8$85T5ZeH%v;crOmIO(x(+CV(Yw|@l_xtH-z75r_vZn<{ET8SQ9nQ3Dssz$#gbfRE9_yeJ)v~z zEtcO%DaOQMlMQzU+e=xyl5D4fr^_!c#eJo_t3?XCk6Iph{pk3MXHEC!$FKJ>EUBt! zaTq0<1I7WjgDIo;VZ{pPqVO~#(VO|uw@_lZ3E6dV8Wzi{3{(pJIIt2NMu|(M@ychS z_n`fBLKQM^<3AVX7D!KIMU?P-mh+RPN$IZnQJdH1<;RMW`sBJB|0}})^Y!Vf>XTWQ zGUPkCr&*89R2Q6{F=1NTDnADY2x?FD2lNnM&sc3(8p5e9q3N>`u{)vmb9BuvIGHb} zXayiI4T7yT$K#`Vr<-}kH&dN_I|A}*uHIew1yL_sG&sIXFRGEcQkf(wR`P(6ltNzO zbK%3uBS_wIaxuWY2Aed(@oSH-BLp-_VAt}YtzcDL%P+tkdLF@GeE(ixH2p}A{hPKt zK@}AVS}6F#HN~TiDV1g}oV8-VUzvVD#fIE}$s=#?&|>-M>(G?jl^Fk84hhMB+Rrw; zXsOZ+avRrI158T#kJ>WR)-Dd?9^UFE$dyy?$np~{vEqb6H( zH?8>LDwXn9+CED2Eb``?2pxqG*|5{qT(Ze8uv?k{n!>I}f2`iKbK{c=7)gAW=qn<2 zo_MLtKS4^I-B*Z9NTx6Xfmif=`~VWp4ucx%k`Mxnf^K9;(2L5*rOxv!Jz1jlvp)lO z^L)LeYd5-0+r-X`4APf755B~v0xbm!dW4~rkdX7BL(zS01X;ob)S;{lgR1|5fx=ba z^DB*(PRh8Gpz`TusQ>%)^y&A>A19Zae}@JeWAxxAuFp4p`^?IbXQ>62nz zO?Lv52&eHm#dOA_i1@D~v=7W!?*hdso8@I3%gkTug{i3c@RUIo6SAEB^zCs|sFeca zHa+y0@dpD$NK{`mt$*QLfNm((z5laCTwLhPGPZ+T^W(b`IfK13R?@v{MAB5;O#9A@Iogp!gtF1krIU=1xH^w#1weksn-!psEiFduf^T4dWZ|J@O&Yb!^Hv*(da4 ztNmGQ^se5r!-;QaX5!<5bE;$gSfw6+8>;4j|IRHE<)H>rg+(vlPf~rHp{9(cH0{l zHr2F)mwFi`%r;7v@klN@wxa$cAv1C@23>PMvDk$Pi^*2K=XtZ$woeqIQ$I1qIB3~Y zH+d4x{!6{e_#34@gvVbVati-kCXr2Y#X z_mK!r1Xvx!h1l(y#dNMG0lh}i*$ejzI_&Ek(wfF>mGPJd-xRAZE^cB38#X5soiEKm zR1@1k2dVEG&;b}wecq^Tq^?=c&T7v#2+=T>bPhC87>t${9mbP%{N?V}p~t1pHr@U3 zh3*u58&x_ydTT<8u&9y13-w*p^T0fOp09S(-)e@n14#A$18gjGX6&y@Kh5neS-qQ1 zfZ`%)v5WdSqNEA9=;&JE;A0ZOnv9BW&?F5|LI!vt@FJNFJD>rOs(I;`zQq*Zr|h5(*IDm z@D=+k?>R02h8#HU{BqXk8>vEd)R&37XQh8!a_-dRHa2%%Zt9&+Nk5You#@<&z4Ce- zUJ6M>hvE64^ed~wLNTb<31n-DAoXfh+Tsex@P-cUvA)+0_$-HDFy%T9mm5+$m$Q#Ql`NseemH57076KCv;1llp7tdKFlD z)lpG-aldl)Y&N$T7G&{^N=u0Pb8dF-Ujh;;HhKx7VM^MDa2~Ai+w79?=vWXZ<29g@ z5K`)YwVX;=!L=Sr$|SWoJw!fuI9zp^s6AxFld5shXg&5%tyj+WpWkgh;*P{=7)6E; zZ)=2_Qx$8^1B}k4HDR}V!eHd+QP?ecJs1r*1175aQz*78P$*D!5ylwuOe73G6T0Ca z91njicFb>IoGa*+B~m6*;vUOH^?AeW$WM>&u?6SMwDMOGnd&Ctg85;a$)%>IC$gJ0 zL#DF`^&RP;#|38AM`zY}t1&BH^5vCm-El8UI<`TtV(3uDD9K{|!R)@(je zI{3F;(<8l*g2a86xl%YlrDzk2F>Bt||WishF2*=;fQ~|m5?JqO zUMa}Sgt0{f5o!Qg>(ndaPUlmllS26uL`LuRW{$EXNF(^xSmTBBM0mpn)I$ldy(M0s zUvBa3kzM`0vbea&vrcJ}j+A6zLjC6}Zgk3tU1(~^)JYZJaKoy0eL65@Fj%H?fRXi> z!3fc5Fg$q>3=iiDMy|pQD;BJVWe-x~hJJ9#B7nYpaOS7LTEsD^?t4c$W8#H&tYO($ zAyI&xl91vLa)&!Exh|c2^)IUqCR22gn>}-98dO1!6O;jtuPSyFPp$!7g_46NaBm%# zjyOlLh68CE-Ux*t@q6HwMBoHuI{Ja7Ee^;*Aqv-l5J$<<0=?^D)0<9>&#s?NY{SNX z&u>Cpuf5Wt_CWhv+#{6KsmbFvv1OE9Vzz=#`dJ5uM=sbF41GYLppkCJpDRZ(12hKQ zLxsR`XMuv?;_~?`v>=71bk^q6bmqRwbUgGlgXXV}?2rk_)5y*kq9>i1fqlGw4m78y z48tcLzEj(>LezeyM?6U+2E~CT^S-;W=^n5?PQ6DW??(4agMcacHUAHKDo;EH6sHbR ztja(uxTV(`D$ank>K#+-BK?U&<-0L_NMiP=?9m!%ygME zJrD3M{C(7_X?F`QT2uMLv{|YE%7u&J^LKIoLR^Rsi$Df?;h%1%K zppK&RzefvKe#}{Kzkx zj44udpe>w#LtaYTJzmYh*?yRdMAG(`5I+>H!eu7Yw-`|_Pteg zfmw6=lN^Sz#EfE#tl)rCv)Nb{X;sOP`7_`;$e_1cI=9z&C z4BGg3AU!YF|B%);DoFQB-RNbqDfGqP$(^*;Ag8Wu4ioatry6;MpL2ICTP(|bo|&eQ zoVf{g4AoT3DL`58RleM0ZqEhBhyhkhwlHu{IVeOOc^4Ohd>Rk7ig9MMLdUHjgK(Xl z)7z@GP%Cr{rxA`ibQCylUCC!)=HGj2w?6Gk?^63eB>)>PiE>XeiWQchR2ci$n~%`X zlBw0qF~=6_4@Btlr_m@VQBN15YHzak&yZU(c{e$MC=}oX+pBRd(lm;jIq{h+1 zGCE`LQdA_&JKv=Q{3wi(kObuMG-9AycfMB=PEhrM9nNq2QH9Y->|Jf%8!1)Qb7!xu zeLDw%S9=4A1Fs1mZ=W4(&4579#4j;WV;wC2u$43y7-EZ)pJ@bhwVtPcShdKtl(z_Gamq&38~+&NNT^U2p^~??ex&ih>#q zHHt2cR;D_xo_ch&`=kD`dftr1k>Cv@==efatUS} z(_*h*?{8_S(JPG0^cL4_;$td6x+22JFZLD2J&shgdKe-PJcQD{|F8-ZU@Qq*H*U*+ zUPp7yeI3y=VPs~W0 zTO{cMS|}sZ^Ld`bx|;2#M{)utOjgyisWT5W^EUVu`~1|Pz`HQF9b3(6b7ClWG%jlLYrE30`f(ED zu6U-n`u*Tp77Og+-ro&k7(tH~Em*XN8M4-6OEBF_M$0`U-rh4rdFQxSj-d0q99i)A zvCb!x{Pi$=%zW`JNoSeU5{bsccH<(=QMTASjRgk|pCzTOE?Ondh4kF?QV7(=HHtN- zS~yES$K4iv+#!DBa(WzcBNPB4)K=h;D`<2A?XI=oAiY<118-qnj*6X&>qdN&^zugg)y0_br=_Brnm;iu`i7?3ngde2 zARTUEBrzxu4k3HLw2T0$bgyO>sQw*4A`QFq;ne7kOQTWIL*!np6EAif;@>2uW9 z!#<>dihR43sv{nB_O|fzyJLBF-V@J8eoYe|$!CKhSW>3yHMv=!q zx!@>f9yp5!bf1wxW`NP)V0xIr<2@F5(>=c_B?d?0(1XR4pNIFYX&!S{~?m z2toJ~;I?9iSnZX&B)2U<*zHY}@u?PVD|81nh-8Hl1y zMZ;>6H~Bz}uw6nZsE14*EkTR7W}kiwK23YCFgb&i>c0#EtN3)jo@r)nqM^1NHr>T{ zSy68%Aa2xo^{RG9o$N23eqkDXRdC06k^@nm9LXs!HXi>Isfk-=R5z> zHffj%@h9LrWEXY=NFxE4dhj{YF`|qzKZqJdX{;3C2j+`-@l#%fBA?`2jFq)ZDIYFs z6{Qpt^QpR=BkOKn6O&?Vkqe?M_sv{j`llX8AC0?D1P-#eetQsh8lBE5%87t6pafDh zi+DPI4~mw2Z6ckw4@1Y=^p=i6A(B>LZ7MgCVn~{aK6*ik0X<%S>2N3eji1<^v5T2SgF@@$i@3$=@QIO0Aj+4rUY3HyrgqYz?T+;pp=~v z8G_H}9`m}K?HB#_{aoX+!W$F3s7>``Hjcq6BKqmuvqN=ajm6Nqm*4c4qYaHc9psqk z2Xu6BT|l5#k-GOdY+!a$O%dLHunqfn3LnNM3P$!Oa5@R3%x0lNT!oB8huS+s&KgGG zRdqBqt^H%FLst9pUCYSfQPo*NZKd`v-UsTF*wCNQ($DT=XHd306+%+;}pzV z0Ccf%i~CK;hG${ku$clfSidNQV`C$kq8uACD3Uro67e03rgauG;%P2<3sroK827SW zO!M-2>K51hI=Le}b5OyHxLp0=)W?{7ohJb%1)9~)V3O{Z7KLcGjZM+itW4B1VjOv3 zXl%`47_tsZ7GZQ0V}1s47qF(4bq>8#F2D|HCTlu5-h@jzj?J*!v$Cwe-bV%2-jjFz z?HSa1G+uY*=QTBzwwtH@M?=Zn_>&5H{oyJWsXsCpNBI64&`~JH>>r@K*z2UAwq}X} z98uTL>Bm^YvG1{zAR}~NKU7wjmYss$N;p4tsdBDNr^xt%?hjokj*97#c3{rPO9mNF zYvtQqSs#j2?&IQ5z$+JgK{{$6NHWNnAQZ=jj0yr`>?d$G5fO5%{|-YKHxaBcg@*Nw z8fJ<0j?Y&=euz;F!{qV^X0t8{u6gMPCb)TD-dzbYR*gqC@1V42JihB9y%91SQPf0c zE){E{4cnieh7Pv`Tay>gPyF{~j-=*DIXv^mU2YppB*A{?`eFSDc$ZykB*D<%YtxBZ zc;y#w5Nrtz&~4i==z2mWhGmUwteUaM2+=h^ErlKa-JyK|dn8~-*!n8y@r2(S-PO`7 zKioR}h}DUUAD3=ae>7fSEunE(=xHJO(&;2UuC#Rd>*)^_y6Ez}dFfL7+G!P7cCr-! zD#uC9Csdz3-8LZ4y{2+>K-;9TWmzptCVTl$4ka3PbBD&_)}ik^-Qy|R;A=82P}ShD z96I910`oI|!UJ>qcI*{PVd<(JR_|I5hb?{wo;|zGHN(?`6IC(IDYx5nrOq+{mw-Xx zp)eNEDNJ7eJ1iR?UzG6BM&vjG1S{$zky09;$3jqLnhk`a@+^#kPhNet%0_rD2&gN> zq}HG!#8K_ZnkWmCt(Dk2LDL8AV=rXly0Ms|gY!M(ce$gVJaU|?9zV8l_|P+ba#~M? zpI2#;T3z(rj2BfGmH0ntn+34?0?Y?oaV-si{~d=u7Bfl;TF4wbx9{yEp~m7FD}8Jx ze&1UK&eu4tM5AI$%U+^vhe?Afv;|%tEIe*)@pUVm&*c>?dr|1!yl*p`TNyCT;L8~E z;CXfMZjGlO6-fRU5=;e(!VAR-BcX!8?m!4S)gFsv3MLCXt5FdW(klM>CMijk@?7%s zcMCBnwZrkIYzR~1;#*bCKM9VWd;u?;rZov-dRu9zKIjdPDAMl;-`0>?oQ;^MgBJR{ zSD{2wUov(F*s$Fs1uzL%Gg3fGWQ)v3W>DL=RT1?OAJ_YoS@A%47yUkI^!C$IbEGI^k(O8 zuX#ZV^t5>lBEk4{Oc^Y{9p-&P2^nxwk|u*wsOe8axrm5X4HzC? z@F44y$T|(t)Z4RhY7LWdwfFyQzkhM3eRHyfvpW=VD#p{?w57aaK(;c9%L1)87jYP$ z`j{NEcn#3y1n!M71yL;l_#oCg%7?l+G$XE;C3i( z*9B`HP?cU{<6$5jVqSKl^r$G?W}muJe6p7>QOJ!luBYWMQDn#5LqqXy^<1a(Za=wR zKV>A}_{g)5Z~skU#NYa;QbDjEp%Jxum*H?i<8V?;Ky~&@im7&I_EVAowZb>|=9Br; zpwriYjzdV%MmLTma9qo4s*jK8;?FO0$wbqS`W5IELg6;58$>WF9Wk|hD6J_(q7XEt zb1cFt3JF#4W*MygRGaEQGS^*6{7~{iR+k!dwz;KNELKJ^u1HcruluyMo_|nW$)k+< z;5b89HE)%%WXq(>8w5~(Q&y^)3+c5%0Tb9x4BTgaG+J zK){IgrnOxPD8YeusLzTDI!>Ch|EZ7?(!n%)V96jfos;9KaRNK5EkQa63*Xw_!8qYAR|X|V(i*@|FO1DZS1BD~u; zr1=A*3SCD{jo<91U~^`6R;_Hf$|Lkca;mDN)jM7GX72udL&jrGYyQbC_vnKUzqJ^Q zMQzwtM3paI#0^#w<}a$YUM(sR76_}5Pln{kgJww3qPrMUNqUGN6`EV%o&uSfU}?l< ziQcQLZx-c|uUsNq_$kL5b-kWZ=|1CWHMN%-sMQ;xKJ+B0IC!PCbq#1cgy=0m^|@4# z&-@2SJFg&(c=MBl4&5ulQdL2^#0O3$4WUTpkuAa4h`Dj*#~>M7fJ07bp7IG z%sT$FTq93WFk`$lVOP8PH|$-Z0Y3A(eRYkfBp3KC6d!WKjM)bhd}d;;zGSn!U`GZ6 z13dClTnYL?0=VcF1$S|T7alIY`_KHrTlM!*|JB|!-s z^n@@diB~?a2kST>$xiUtxmQx_Lpt1eOc`fAwV0Rop3K*T<^`TtiexUvT=RmJ;XU|z zdQKSCpmyXIUJ8n=D#dmOFCDoX{GTs%1a{xag{uLL!W(w|`*`hEX_t2JsqMhdXN4xG zd3Mev>!1yu=cAWd;;+RmaR*-{PG=X&iknGrk5qlXeKQ2#14G~bl|xS{8h#n((`5W=dMMtX<=L z@!=&08T;2o;gGYEs^4#d#c-fp5Md9(sfuT>bus+9AWcq!&QWFx94!Bu8G5^JT#WuV zDPuK62@C(g=}wGG!jHc5F-qF-L+un^UBK&<@AG<>lNyhIel^swIwuqKPtu7u=zsFE za59`Erhy6A579uN53xS7jRkG}vf2WdLsh`zH;Ogj4na9@UE4z>07njBIin!k41@Uj z;#{}Ns|FosBnRz&mgAGbV5s)bcH#Hf-oKzPJ@%wUi~s>TH1*?nA~>nUu<{3fA7g2D zcfN>M@nszkt0Q-Yu8o9g#WxzwJD;aDSy7ed)c3k}NG@Ph1=tRkWBr|C+)&*?ty zq3C*geQ1^QBl21%I#d`KiR!%Q3cfsF9Wm#0f1~KlU$I18MQxr$=7ub)`+S(OEcHS- zj<2RRE5L|#q@X{?w)~E*dq>RYO!+XHN}-#i04DwkXgL5t;@7;3Z8ccu0EacxUBnUy zrUVfaS~pP^nhs@$$@Hv=-a>3!r&s^CFa9+l0zb!hLhI~Dz;H>1Kx|CY`NN4me3Ucf ztPW$mE5$r`_|{&?D1OiG^R+I(K`9K| z$|e;Q9U0Y?zbdXJyenYMOWplir$O<;_jB^7ujk(#@0w)#9{s^1>%73!?hl&8THL79o35QLT*7y9YpZ! zrJh$ucC~v(TH=2=!_V0n_0lL|Wh-$qkZ1iXv_G_dM6G{p?U=<8OYZ2&>Ssr!*XRDI zKwcRBUzG%2>3!Qz+|5Y>boYqe6mocB6G~hlo#sXvT3a@*djIFoP!Di%pD$gi+Po*X zM%}sRLFfn_4D7SJts<(Qe>@<;_2~2<*;{)(&%gUmVQkiu&qrOWzPw{Ht^62W4qSs!}xnAVUBoZ!k_m}gondpft?@u z!oy9v#FAg91{x(Od)8mO(B$?C?ihr5y6svXddCZdj6NAI&Q9G#ENnE#3oNG!T=m`Y zOZ9Mx;XqsE3F`aNxq6G0se|}{kufdoF8nb}2Hgis=nD{ePvs_3qYw#81Rcs{QF*)) zv$xj#A)F%0_0GIb}tWX|n}yS8D^UkL2w=TfF08e=F>r zC+!XLSj*vb=m>DZHK70g$%g_z{uW{j9qU`C|X&bzXY!?;6{CJcs)|g9%Ja&t~ zo(H5VRL=gANAmfG1vNd5OR@MdO*6&VyP7|)s{Mu&UI)2Hj7KKnHB1`RulCDUW*|Ct z-x+3imp%Y5&@-Oyp66NtYU0Cy<7^FFya4{Tjy$`q;?{XuyvVO8I>Bry)hw@T0Q!9@uZli1$u2lMtQ zCg#IoMOlNc#j#)MyGiYa{tHmwmQNZw``KjBrA5uOqYvCix7E zQvkmU1KfgwYaTi}ouCc<_m*ymji68B9e0O>6oIzjGcpSFY)JE1eeCK;C-x*s~+H|%sjHMOam;!UXDkaDV-tQ)|K z13LF?91fvG!3g|5g%?;ANvpn>vKD2&R1#!b2R zM9mBpf5=V5c3MniyR=Bpmzdc`YHb^&oxQm8STna|u*F_MDXOPb=;l9k7($rNdgngC za^7QS2?m%kwE2rxKPFNHw(#wf1_i@>R0L=fB5;rSP&9<#YzYd*Ozj6OiC<7>$}aj$yNmTt_^5X6t!zE51SM{JvaXnTm{WT6#S9hGSOa+Jy2MM_EM7 z$jNHUU_&8XV%$27VuWBR*kI2Qq*M$v0R;(n;6lTnK*;F8y%@^}IwG2N6{mLXtF=Yg z&h|!(pQZx!ib=fWV_DX$2Ln__o4Qt#O-h5`=u7x!HVBvlLk350vRo*Ms2sEgxI>vF zH))%e+7_WE3EOdhPfW!)2_-6kAk^>dU{!mr5Cr51sOIMh_-GH~m(e(VP?XqKPB(dt zkEK=!^9;bAIJF|+tF0nu^}k{zR%kD(#F_jwPNK3{~fP$XgF03~3|-)UfZ3o-)*2 zhIDjwL>anGE9D3{;9tfJuz%*WGR`{7P1jr`bA#F0`8seFTHx(S$-UUl2W`>O(@ zzAQEBIIJN&}s zZ+;fvw(~KC5#((krz) zKl9aE+zR+bA?n-zOZKkn&60#~5Rze|8~G49uGJ%;mOH}rzY56C9>o1lmJj7vhSeVT zDAA7e1)zH66k>D3P7|zkg&pH4VrO z07OVMjBWF}IEB1#hv{()!ZejC0mg@im^!-^@2xuog>k49QprX?kS9f)$&-m>Z_dTu z=Fwq{6#W>#mF0R84u@ z%suahvslG)PfcbW_=};EUQg z48~Q=YBqt_Rb#Fp;Et*)$vYzuV+RX<> z-EVd^+f)u|+}pdBa2-<)XO?G^rH|ex(I-amx0|F#?qO3P+8-IW<2P6fK z^e}&9sBxS>QExhKpE)gWqctsWpCK*DT6>nVZZiX;y#y(_A1vRc>Cq8n^Srt%fXU|P zSN+4Uri$+#Yw{R51=e+=JaBmW!@xxFKAX*eu(Skf<=8hrK$wL4B5#rNpzn1NP!SND zrf#Ce=p&ZfSfOLeo^M3?B9!A$u3nro7E)2X7W(%U{S{3u7fo|@%c9zd@9(F-4Y6_u z{@SYYw=GtUi8b3VHnVC$#2V+~5ofOU=~lQbm5XbB*OO$gW#VbM29D~X!ISARBS+sbG{1p~Q~rtd?ZPah zfe5`rNA)$6>-2=;Q7>|ly3emDX>lWk>+@yz2^haMoz2EoFY3NIZT~Y9U~%bI*3#L9}D(4_F>**;DVOXW5ZasPosXP$}EE)x-4!@EH#3YF&du(nSzi1Qs5h%yX&J!W)&|2m0^&Qz?Ry+=_m7V-_Nh! zHJq&xRDRbEK=_AGn;DeF>5pKIpM2gdY+-0Bc~Is#N=4c*OPW^K-}$Vv#QVk>LJ>(m z)))dC4jvMNjkSv13NC{6^^il7n9w8YNR}=L)f}jw3)w&s&!u&L;rvYZ2jA)KqUVyr z;`#d7$tkYQvomFN%(lTz>fb*#HEmF#P_iZA7NX_vQ|Pp*?_n2)IL- ze-EoPLWp;JSpX&DbGOpE$v>(H2bEmwiMVc#F0GWiC-}Wnh!b3Ms z)y{4kHr}DG*ZzLI_Xgo0ffw9d>K|ylgyN~7(pvU$PUV3=Ue}n&Nj=-sPR(vh3Cuh! zIBh!e{-v+uAnK%esDf@NX-iTZLx51AZK7~A8x{-9fo4}jc$C3o&xU>@WF#|l8f9Kb`bKu^&Q-! zAn_UZIEJB5R6_YX@5LOj_`_oF$nDDN-Q4Qlm3pm4XU>}j6kgg5|lTM9)#i*dUH4E6W7BW~t6^thutHX`J1HX zA{7X$)2R{c-02RYwoizH zv3G$T4`;m?ox2_(_{4N0j~Rr6JJYk-8p`o*;dLgT-4Ab~^{JUXtaSSFshzHMx!&dS z8IAK!{CPQeu;d77DD~=xR2}TP=7A;YzOli}IEh$W_z`8L#(EFrk>r+r7sZZ*KgXxV zgGX%16@>DCox)Al?IP%+KkAM@h|wwwxLNw4z1q?$qDs5M_jEeD`=W&w+{2v?LTl0z zA*0i8%hS+`TN`Bj&xt#ggWkU=lm|n;IsiseZVL?=_Uzi}GQoEkwVpbQ5w(&Io|tAj z8!}259dmRWD}Q(+`(^z?m%1RX+&r#aqb1~rA~iWlqN(o9Dv&4a)=#{Hg&2KbbJ>5e z8fNfQxi4ge(6y1|GyOPyth_C(_7fW>qMbnosAEg}QbbLtJ4Iy`p2PA%eh{}fc>lL? zA!1`_;$6rcYWcSj`k6wFK`vgtdvn&yD-mDMxxQ#GFG)KX_80Fqv?sQXR~=mjN?wk+ zIXEgI8*zfK0bPM9Nd3Tqr==r?xCPfL)^RQsZ~C-$M0>we1g?~MYB>7r$MlL7MgMTg2T(!d-PHO}~@@u(kB z=Fw9po2tdWdkUiM+enpp{#k#XB7qWRsrCQ^qhBix zl&P~dXAB9cflOS6Ann0Uq4!b7<(p;K(-iYFug9|$%13@`1Lk$MLRQ>mz}~}WIoVY# z!9-{xm1{tUV4|=8bjF{6E*3D=zyBzs-5!|`S!lf??P)z6`5Ku8_VV&ZO}=rB9Q?cP zP-rcGOQvz2Wyv%0HOGPiJ(mWxNmBGajja>q?!|qMcE8tO&H8`q)HHnWc|f6gj_8`g z7iU`psf9G!l@6ANxI3#ZCt1>mv)DQDaN9|T9b1y&P(Cl*x;{L98^sNN?hyZ4 zxbQ*bf&Ysb=)PCP=}L*%4fzO|4_sG1i8u2u^<{RPCKx3Fgo2t$#~@M;CTA_#NQ8WF+QR^}_(@d^n&m$6u$%l&e)BfGAt|5gPTF; z!zkRL#y*gH9iTz>HP?wTfs)6v%awKliw zwr^T(>ARmXn+?-W5w?YZva+dzZtta>$pUa6IWZI`f%b;bcmyWtVTF!f zS;0?3OS)dUE8)Qfp(O5>2u2)1Ovl1~Osk~;lqtdHQ%CyO!g!bJ9f7#?dI^{2*pK(K zGhM#ux15Xmb!7d2uLA*AlYzj54+kiPj2uI6PcLrVig=9ie;kERMFv+u3x&B5H@q;x z_tRRBRs|Tw7c{@$UH!4R`dbX>yGxO5I5tRwkR)Uk9=B!6t1(AIpNEe0uevSE@Q{9t zBmGD_YJ0}`cBiI)NrBAWi1hy7LisTg;0_Vaa}%a#9&*UhHsncvKF0tlOAz|R zAHQ%{dyG>MFFI*+4A1ybUCDi4q2w9wpj`}il5oUVf}|~_Qah2I%mmMlDLG*gLDdX_ z3dX}uy(pb6%}hjXo2lLyVp{tAe+ep}LI-IQZ!Qjj-TKUk=ct00B zc%$=L8Sr;9rjhYC)9nx- z*1sk}xk=DRKlP;V4VPh~E21K4E97RS3;T}{%|J*D8HJ;8)9D4^_@+D{9VM;z`U}n@ z!eZi?b%3{0hu><;@1Kq4awSR!whd50(_x3gt(fAMl)GPt)Mg{Jg!rt0xqQutx)@pE z#5fTa{4dJ^L^z)P7ho$v5v2TI=%R zZ;u}7DHo5Lb9cCr*1KHmqh5n8(QhGi!IZdPg1-`tggs~el1unqH%EaPCk#fg@F@~Z zJ!-zTDl;k%W#Jh}GdU2n3nEd!(09{FcDv`2X6p8i>XuW0Qqh5%k!CFqymqs8D}Z^m z>t9lc*=D_&rl{fqE^UDS-#XhQ2A4L&Cr^~oLNcWJj!=?oOF{2qKI9J<%E0 z;MVd%ceq*Qi$L7xq|3Q3wpkH}jsE!HR@ztrO%e|wJJFGQk_Y*__hz{b49G*UH)5Ob zA)`9~cJ-tH6G`9>JrMT!JUz~i?<~^9XPNY!*G!}dKcB*Spz6V!?}I zVF;WKSp5J}G`A8g8Z___Rvhdmwtd`>|5&Ls&P7OM!iJj59QGp@aGd?g!2AxWXf9ru z6z9#ir-Ow{f=5TS&f+u(dm(9!4dFBPh13Pn3`@e6Q5yZxw23v^@>ym#Q+A_Fz*7GF{R5f)CwP>Kp30i30g8En_hR~-sKhUN>O%z*XCQ@T$J<>RN&Knqr{yrl zy=j~dV@S=L_d78Rus%eq?LM{%)`w+SQ+Op%yl6HW95wHP_*{b%|GRM+J$64LX?FTI zukTUokzm%!q28Ggf2x@ko@we6Wt0EC1_T5WqR2p?B!nhpK5VmVDPZr6&p?Y+lA(FW z<4~G42~9+PfApvr%i=vvP>LGSuhO9_i>oo~t1A@&v%Fh(b?zY^a@E)czy|xZrt%>vJH5o@4rNhwa-WmfHGU$ z_PIEnR?^9@Jg}YHdr3B4sH5jOz!+H_sARy%0CkQi`9i9xcVJCQ;-Qb^;F zm&i$iN!!w{r?x=^rO4h8S|(-pkM#pAyinw2mnYlZ1)2178;Gs&!02V`i|}$ zAwgjAjrBivk(l+4L$*&HG;^kBGf7duu^QtOSH)#L?5X`{jjd;YW&;KmH@y9GBWR`- zI;iGUC##ah4}NV;x60I10UlTAS_lQY6IU`AAHO&FJ*h(&FHdi_ymCWU2=_!NmL#LK zo-VOs;0;q6T|09a1zs}hz?p_w+|A{|xW^_~h?R3?4DLOI!ZWnObovL9v z(O#IF11aI4%YpG)JFYzXH~z2SM$(4RpS%@W3<#4 zWutvfExVgi`}^O2`lo29xX%QZ*IW7&)bXB__;S_Iu*w(`xc1r7m`_TrHlD@%-e=6T zU~K8s?A%Boyh+<&D4_}T(|#$S)i0OU3y?Gu)EQ%uTbrN_jj<@%JxkroI1HVE2+smy1tsK)aFa;>6dt)3;00 zYLo~#hv)-d{HQ*dC^KurYvUD`R2xx!CR`t984h!J-zPjFj+wxg$Wac=flu{gjBQtF`$}mpFB`mL$#0D3AW7dF>!Y!fzd**9EQk zw3t?7+D>^BA#l6|upSD?a^ztJ!2lp!TZ<>6bRMW3kE=5)e^FH`DSr21(LruYHg~Lw zdxC8_$^c{qfokcRQHi~vR+oPJ&7;F)ewhbWdhkekv0Zd(GV{;OA3u?(M+hrlA-i@M z6pw`#i>Jd5B>+icp)d~&W3LrrK&l_{uGbVnS8o$X^m|f;%+l=WIPSCuR+6l2_cq40 zu3Bzt!&hgYTshLDzl4Xze7QWrP~iU*cctM_zHfUrV=(qGWDV2UYB094j3w)2X()=! zjGbgJzihK8M5QcQN+UZVNsGu>l4T@WB1(!VBB4d-eTL)x_8!Ok;r~C5-}8N*XU^lg z?&rR*>$%SJ6j27(T=c7OE*X4%y>Z6y&C#4EIYs=BPlp9t@$-Pj_$2BhXRd!6lpY* zk$Xsu3UZt9-4q*KY9>7_*c;wu@GfkCPdrQ`if(tQ>-FwG>?2Y7P0_M9BMZVu-c~#s z1`eu@b)v!d$rSi5V~RiAV-H!t$dXpj;rGE1EPQrwhk`4PEg@HT4E?f1d6E%FmhT8uvq_JACP-)DR+Bvk7grv zXOR&K^7qtZI*rsvne2HDjAup1w5Wo%ekbCHfvt2X;YK6Zu1}f7KybR*2*cPp@YQ{w zMGQ*Ul(Z-&bL9}>Diwtrq#<2&;1h~(v<{k&G$HQo|1ny-6clwB9^GwMQ)bzx8gzF4 zw_DHg&dnL;CzP7!vGeHF;&$`yE9OIAduRH>ZJxddLs@%Ke5~!1`wl$}bK4fdDG*lR zoD@)E@AYyptT>csVR~LP5|!sam7U|s%9GI<3CNbbDPieXk~96(ElB{C^-6fGrfSMV z^L4eqbt)+h7Ke7@J6OMuF9JcR`*ic#0`153Yr>+vn4!zQ)}0L zsF!+fQ7#%y`h_@;wws8b`XZOG3BqW-tR*I1ytqQ2+N)?z`cHB1#CNaiVYY zGsyLh7D*0NNs^&%kd(lsBx8m(={m2OH@3giTZC7HltACuld48EfDG21)6=9;IKBjJ zYRyhjbju(K_Q7?P*NuKz>nE!c#FCvNG$gn#*Eeh4EwTE1pp5$_Ntb!@lPFXYhr$K# z7s^l9t7g9ElefNBP?mm#8cKJ{g23~YcT$cwR1WYI*h9X3RY4et(2bN(^3lWx{%@6P z{7VyGkzK&=xfRH?Th8x&e1s&?ws2(?MiksVM;mLpIoZ3=+^i$l_^Cz0#BE;I@^ik? z8!L^6db$m#J{*4{4aKf1pAuK{kC6C8d2!;+yP-;~2q1zZM9l(*V}4-eX`itU&%S7B zYs_gW9(sv21-HUoV7@W|VY8+;uyb|cn^&D8KidX%?Dk!lm5w>)VYh4&?xnMyG}YS#J_p4m)0$nBi(XtH-~J|Ccb>wHlBUJNqlw^5XQnp~9u-|I9vjY64;u_JUg*6Qa;!9A zarTUXb$hOuBH*kj==*g14d!Swazi6R^lrricFwCZRKt0Rc zmaifh4BHX(LFELlbS&g!maW_fQ#9Y`9@0shH0rtbpKI6cy_2^GYYZS$cr01+JE10LmjO!t|+bsq)1rA3qK zMFMMmy}x-kp{3503LnU7<*r`L#?*^ttX7>q7B@4WeO$u6$fwJ{Urr}{z&~;RTzb0G z8x+pshcsr!Pr4q%qiVoQfQ6#cpiE^pOvpG5PKsp<4$zR{y;W%;VKGP~D1vZtZUTCl z9l9oIkFoH7%<+@B>Txxo?Ot$o`>dVkxpd!#>w=Ie@Tt_)z`%&LRMm+7A39ffZXdQo zuQbJ5V*@%-YbOia=ye~;Ie_LFNcSBN?RdUzKq^XJBv;9rpu*M>B3e?&#ImIOE4+|p z21m_FGb1~xQj%0Skwm*(g(oxQT{Y7bI9?M~wvYR3Upz^Dax4gyN4K%%5>y+>t(>q8 z6Taq{tL5WAo4IlS+{7d~@nvGIvALU%JTjE1c^vfYQoYhwBwrzs?Rw6U;8JMMMqqu? zYHo~Kyzs{@I$fGTMV~LU4q5S>-27|udu>uu-exs5v_ za(kt##V(Ko2w>Z&@6cHPNhEV9c)ux)Cx(6Adn@CpsTcD2GY!9`Bcse0mIMAcKrNJ> zkrP{j)2NmwN4I+l;Mg%zg##%friG+k@)nuj|fSZVMWj=(slbTHIw?2x@ z_jX^L-00#H|D?1^kv|o2&LwGbsZIGmOUra!>3s<@3O_Cvmu%JT zlrb+9PeN1iD1-{F5%id$1O+Eq^5)hqIDM{Z#a79pBS-FNe~hqwUHNcY(wQ&;$FZou{zasAMQVIQZF=EGf_5E$gh$ zi_Mc^GQ1v8nc;Rb!@;99_m7uyS@#=P+^@T+wx7ZyDf{rzsDpff_49YAs9_zcciF0% zt&trnUOafh?kz0e1r=;cNCTD*7sJB9(@^~ftO3PuQcd6otsos)Zlpz5vTe`PmT%f7q&M5T;LUQy+fOd029C)iDqX?;SvQ z2|2d)Pp{O^xxy|uk4*T3k8pbt#&Z_eZodjazgtv!FUN7D6o%P>tuks2dKy=-sk+sF z?_pu)_-3=*T-kuimdA6G@k8g`iuf-fg-*aK;HpY{L{R)f$|&9sd??s^W}bIgr6}y| z)r%QNvlvgE&(!yEVn~JxQ+h&Gvt{%#-VX-liOMvtYn zGIkHKk`Y})p&7*Mhnqz7=8)&I9q~>%2jW`=hx2iEw@+j{t^Upxy3uj33hI5&He5Dr zv3)Vw{bBH(6uZ2mquw1qo|ga~Yb!Ib6d3AK_jX_IGX#m>9<0ZIVH7tMOcTt*W^Y_T zv-E|Muc41%{8`Kpd0CtEU$S!YD9t5(q$DpmY^E-EJcVu~6me0ux*R<-01-N&K3=}J zqS5(r4g$><~DmKUL^IJUYS)e`}*LyM#;IX*^a|Ia+&|fT3?hTeZs=V#i z(?@N2C|A}^?)#q(2-vuOvvlxxH6-QqT{fFld6B))a6YO;1*7+&c%h`BgdlLYu5Y^F zZCL+)@?QOtf!=f3`M;98M$Xiz9=Y#JZwUCwiO?@PA5&St9(XCVT%5}7AF_GrK5!-R zlMkO%4mv_u;e0xmTk*O!Pcaf^a6TLyEv*THI}*S&KvG5vbnUL^)jMwb56!>M;=Bfi znlW()e@d`JzQ?7W?yeFo6q#uM#5UOP5VPqm=wkep4}_;tT_F`z5m5t{tL8 zi4cVR78MvG6QKy%k0nb6QG={KM)&Tzj%hOF5*St2aD(wM82B$N@2_DLYYMz&g4w zCrqHsN1$=>mhbBRvqjZ6t%Fuijki2g1$sZqF8@v64_2a2fL39>)h<0+#>WF%+kzKg z8SMKzZ#j?T?b#)P`VS~UqfUNdrQL?Gj{wL0EH>U8YN%?{c0-0D&OYvr1< z0*-}wL9oz4Xe_JO(Z~EoZQrDG^(U3`VzFYl;#YjtgAw`1vy4K_b z>lX^&S@a~Qla4~Ps&F?g8(;p1_07S79Q}a-PaQ4Z=LU%3Z*2bj)AD%P{F`G>2wYIB z=JkGtGAdHmEcer1wlODTIO@3fbdlS@Xei?e`FW{FyvW5xEk+yb2!qYRw3DW*O< zDTfgxeAm}mR-ac+svqrlZ4W0xYe0dgAOqAx6hs-5vkxUXJLgcQB&E`=SEZ;52$UyFf!4`pdaWT) zGNEw&Dq0GXIo>XH7*$!lK3{gSC4&2$NK&9pWzwj(yRX|6|B`)z>fz(MYP*Ef4eA=nQQt3`rPxyz z`3&%7RMX4`XmiN9w$iF3Dz=*CbJ4i}+?wj;iOSkI1oiZwj#=5GfO|8`*CbwHz@}Q* zY4*qM2rV&?FFBq9l>ap}cG_icdmCE?QNTqF*x}qDP;3c{06i-Tde%k4QX-KdXsB=& zxUndcaO2R}cu{2>KibL#y6OK;6Ze?Vte0kY`}+pKT2&*;W}jYcDHI@Q+f~52Y1uEv zU$%8OAISoG-82L^lnF<3>+dV&K?!_9mY*nf$F-K~bj_5?S=;*xCGRQa^55&r-6e-c z=p%ih{#@nANGV^GQf67l&G^@*rw&cmP{PjII9HB45cRNnwg=A}4;jfdZBrlS=)6ih zDR&(h^#SUk;X2|Uj|!=O#Hk?RLeWrtB_29W0Yq=nq7dYjyyr~w0BwjmIfCpkeA(Mn z`}!>;9S`R5fic^FLIf=$OA4~2zNZ3&5bX(9LgX9#c2pm1Fg>?#6O^mk!QNWR!LSD^$FvNai} z{k)HkAM0;9wQBp$f@F_95B#$Ls9b5Uo-M;-YGW# z&=}6nmMU@7@ULAB14K1FrjCSIe6TT`5#gs0nN`g4Z^PuLhpZ|E_WsTKt2h+1{$hFm zdhBbU?|K{&O{{x!c#(e+) literal 0 HcmV?d00001 diff --git a/test/test_importer.py b/test/test_importer.py index 71d933359a..b62806000c 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1690,3 +1690,27 @@ def test_candidates_singleton(self): assert {"VALID_RECORDING_0", "VALID_RECORDING_1"} == { c.info.title for c in task.candidates } + + +@_common.slow_test() +class MpeglayerWavImportTest(AsIsImporterMixin, ImportTestCase): + """Test that WAVE_FORMAT_MPEGLAYER3 WAV files are remuxed to MP3 during import.""" + + def setUp(self): + super().setUp() + mpeglayer3_src = os.path.join(_common.RSRC, b"mpeglayer3.wav") + self.mpeglayer3_path = os.path.join(self.import_dir, b"mpeglayer3.wav") + shutil.copy(syspath(mpeglayer3_src), syspath(self.mpeglayer3_path)) + + def test_mpeglayer3_wav_remuxed_to_mp3(self): + """MPEGLAYER3 WAV files should be remuxed to MP3 on import.""" + self.run_asis_importer() + assert not os.path.exists(self.mpeglayer3_path) + mp3_path = os.path.splitext(self.mpeglayer3_path)[0] + b".mp3" + assert os.path.exists(mp3_path) + + # library should contain an MP3 item with correct metadata + items = list(self.lib.items()) + mp3_items = [i for i in items if i.format == "MP3"] + assert len(mp3_items) >= 1 + assert mp3_items[0].length == pytest.approx(5.04, abs=0.1) From 7a20252807a41fa3aa1fdd08062063bbcf99269b Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 18:03:35 -0400 Subject: [PATCH 02/11] Fix test to not depend on mediafile fix being installed --- test/test_importer.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/test/test_importer.py b/test/test_importer.py index b62806000c..b134d761e5 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1693,24 +1693,19 @@ def test_candidates_singleton(self): @_common.slow_test() -class MpeglayerWavImportTest(AsIsImporterMixin, ImportTestCase): - """Test that WAVE_FORMAT_MPEGLAYER3 WAV files are remuxed to MP3 during import.""" +class MpeglayerWavImportTest(ImportTestCase): + """Test remuxing of WAVE_FORMAT_MPEGLAYER3 WAV files""" - def setUp(self): - super().setUp() - mpeglayer3_src = os.path.join(_common.RSRC, b"mpeglayer3.wav") - self.mpeglayer3_path = os.path.join(self.import_dir, b"mpeglayer3.wav") - shutil.copy(syspath(mpeglayer3_src), syspath(self.mpeglayer3_path)) + def test_remux_mpeglayer3_wav(self): + from beets.importer.tasks import _remux_mpeglayer3_wav - def test_mpeglayer3_wav_remuxed_to_mp3(self): - """MPEGLAYER3 WAV files should be remuxed to MP3 on import.""" - self.run_asis_importer() - assert not os.path.exists(self.mpeglayer3_path) - mp3_path = os.path.splitext(self.mpeglayer3_path)[0] + b".mp3" - assert os.path.exists(mp3_path) + src = os.path.join(_common.RSRC, b"mpeglayer3.wav") + dest = os.path.join(self.temp_dir, b"mpeglayer3.wav") + shutil.copy(syspath(src), syspath(dest)) + + mp3_path = _remux_mpeglayer3_wav(dest) - # library should contain an MP3 item with correct metadata - items = list(self.lib.items()) - mp3_items = [i for i in items if i.format == "MP3"] - assert len(mp3_items) >= 1 - assert mp3_items[0].length == pytest.approx(5.04, abs=0.1) + assert mp3_path is not None + assert mp3_path.endswith(b".mp3") + assert os.path.exists(mp3_path) + assert not os.path.exists(dest) From 8557f5daf18b9b758036ca03df324346d619f06f Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 18:09:30 -0400 Subject: [PATCH 03/11] Move changelog entry to top of Bug fixes section --- docs/changelog.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 05397fddc3..bdaf95013f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -83,6 +83,9 @@ New features Bug fixes ~~~~~~~~~ +- Automatically remux WAV files containing MP3 streams + (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of + silently importing them with incorrect metadata. :bug:`6455` - :doc:`plugins/deezer`: Fix Various Artists albums being tagged with a localized string instead of the configured ``va_name``. Detection now uses Deezer's artist ID rather than the artist name string. :bug:`4956` @@ -98,9 +101,6 @@ Bug fixes Play-count imports now use source-specific fields so :doc:`plugins/listenbrainz`, :doc:`plugins/lastimport`, and :doc:`plugins/mpdstats` do not clash. :bug:`6469` -- Automatically remux WAV files containing MP3 streams - (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of - silently importing them with incorrect metadata. :bug:`6455` - :ref:`import-cmd` Fix ``albumartists_sort`` (and related fields) incorrectly prepending the full combined artist credit as the first element for multi-artist releases. :bug:`6470` From 8ce58922ad9617c15760d6a272759ca4228dce56 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 18:13:19 -0400 Subject: [PATCH 04/11] Move changelog entry to Unreleased section --- docs/changelog.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index bdaf95013f..f79e3065aa 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -29,6 +29,9 @@ New features Bug fixes ~~~~~~~~~ +- Automatically remux WAV files containing MP3 streams + (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of + silently importing them with incorrect metadata. :bug:`6455` - :doc:`plugins/listenbrainz`: Retry listenbrainz requests for temporary failures. @@ -83,9 +86,6 @@ New features Bug fixes ~~~~~~~~~ -- Automatically remux WAV files containing MP3 streams - (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of - silently importing them with incorrect metadata. :bug:`6455` - :doc:`plugins/deezer`: Fix Various Artists albums being tagged with a localized string instead of the configured ``va_name``. Detection now uses Deezer's artist ID rather than the artist name string. :bug:`4956` From 0789d0f659bdad1837749bc38b4c919e02f9e12e Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 18:31:08 -0400 Subject: [PATCH 05/11] Use string args for ffmpeg command for ubuntu and windows compatibility --- beets/importer/tasks.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index d4e9a8c51d..8413dbda45 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -916,13 +916,13 @@ def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: try: util.command_output( [ - os.fsencode("ffmpeg"), - b"-i", - util.syspath(path).encode(), - b"-c:a", - b"copy", - b"-y", - util.syspath(mp3_path).encode(), + "ffmpeg", + "-i", + util.syspath(path), + "-c:a", + "copy", + "-y", + util.syspath(mp3_path), ] ) util.remove(path) From b3ef4297889ed899fd4355ebc3f07372f1b6a6c0 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Sat, 11 Apr 2026 18:44:22 -0400 Subject: [PATCH 06/11] Use shutil.which to detect ffmpeg for test skip condition --- test/test_importer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/test_importer.py b/test/test_importer.py index d0e4dfab35..61dd47873a 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1751,8 +1751,9 @@ def test_candidates_singleton(self): @_common.slow_test() class MpeglayerWavImportTest(ImportTestCase): - """Test remuxing of WAVE_FORMAT_MPEGLAYER3 WAV files""" + """Test remuxing of WAVE_FORMAT_MPEGLAYER3 WAV files.""" + @unittest.skipUnless(shutil.which("ffmpeg"), "ffmpeg not found") def test_remux_mpeglayer3_wav(self): from beets.importer.tasks import _remux_mpeglayer3_wav From 623eb04d60a567000af2d1fc6a55c31459c10916 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Tue, 14 Apr 2026 08:52:26 -0400 Subject: [PATCH 07/11] Add remux_mp3_in_wav config option and updated mediafile to >=0.16.1 --- beets/config_default.yaml | 1 + beets/importer/tasks.py | 4 +- poetry.lock | 320 +++++++++++++++++++++++++++++++++++--- pyproject.toml | 2 +- 4 files changed, 304 insertions(+), 23 deletions(-) diff --git a/beets/config_default.yaml b/beets/config_default.yaml index 0f5cb05e0c..8df7f61e61 100644 --- a/beets/config_default.yaml +++ b/beets/config_default.yaml @@ -57,6 +57,7 @@ import: ignored_alias_types: [] singleton_album_disambig: yes fix_ext_inplace: no + remux_mp3_in_wav: yes # --------------- Paths --------------- diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index 8413dbda45..93fc241d4c 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -1123,7 +1123,9 @@ def read_item(self, path: util.PathBytes): return library.Item.from_path(path) except library.ReadError as exc: if isinstance(exc.reason, mediafile.FileTypeError): - mp3_path = _remux_mpeglayer3_wav(path) + mp3_path = None + if config["import"]["remux_mp3_in_wav"].get(bool): + mp3_path = _remux_mpeglayer3_wav(path) if mp3_path: log.info( "Remuxed MPEGLAYER3 WAV to MP3: {}", diff --git a/poetry.lock b/poetry.lock index fb7e6675aa..4161280970 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.3.3 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -6,6 +6,8 @@ version = "0.0.5" description = "A collection of accessible pygments styles" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, @@ -24,10 +26,12 @@ version = "1.0.0" description = "A light, configurable Sphinx theme" optional = false python-versions = ">=3.10" +groups = ["main", "lint"] files = [ {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "anyio" @@ -35,10 +39,12 @@ version = "4.13.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708"}, {file = "anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc"}, ] +markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} @@ -54,6 +60,8 @@ version = "1.4.1" description = "Handy tools for working with URLs and APIs." optional = true python-versions = ">=3.6.1" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e"}, {file = "apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36"}, @@ -75,6 +83,8 @@ version = "1.1.5" description = "Core (offline) functionality for the apeye library." optional = true python-versions = ">=3.6.1" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf"}, {file = "apeye_core-1.1.5.tar.gz", hash = "sha256:5de72ed3d00cc9b20fea55e54b7ab8f5ef8500eb33a5368bc162a5585e238a55"}, @@ -90,6 +100,8 @@ version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"sonosupdate\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -101,6 +113,8 @@ version = "0.2.2" description = "LTS Port of Python audioop" optional = true python-versions = ">=3.13" +groups = ["main"] +markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800"}, {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303"}, @@ -159,6 +173,8 @@ version = "3.1.0" description = "Multi-library, cross-platform audio decoding." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\" or extra == \"chroma\"" files = [ {file = "audioread-3.1.0-py3-none-any.whl", hash = "sha256:b30d1df6c5d3de5dcef0fb0e256f6ea17bdcf5f979408df0297d8a408e2971b4"}, {file = "audioread-3.1.0.tar.gz", hash = "sha256:1c4ab2f2972764c896a8ac61ac53e261c8d29f0c6ccd652f84e18f08a4cab190"}, @@ -179,6 +195,8 @@ version = "0.2.15" description = "Extended sphinx autodoc including automatic autosummaries" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "autodocsumm-0.2.15-py3-none-any.whl", hash = "sha256:dbe6fabcaeae4540748ea9b3443eb76c2692e063d44f004f67c424610a5aca9a"}, {file = "autodocsumm-0.2.15.tar.gz", hash = "sha256:eaf431e7a5a39e41a215311173c8b95e83859059df1ccf3b79c64bf3d5582b3c"}, @@ -193,13 +211,15 @@ version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" +groups = ["main", "lint"] files = [ {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] +markers = {main = "extra == \"docs\""} [package.extras] -dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] +dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] [[package]] name = "backports-zstd" @@ -207,6 +227,7 @@ version = "1.3.0" description = "Backport of compression.zstd" optional = false python-versions = "<3.14,>=3.9" +groups = ["main", "test"] files = [ {file = "backports_zstd-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a2db17a6d9bf6b4dc223b3f6414aa9db6d1afe9de9bff61d582c2934ca456a0"}, {file = "backports_zstd-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a7f16b98ba81780a9517ce6c493e1aea9b7d72de2b1efa08375136c270e1ecba"}, @@ -324,6 +345,7 @@ files = [ {file = "backports_zstd-1.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2524bd6777a828d5e7ccd7bd1a57f9e7007ae654fc2bd1bc1a207f6428674e4a"}, {file = "backports_zstd-1.3.0.tar.gz", hash = "sha256:e8b2d68e2812f5c9970cabc5e21da8b409b5ed04e79b4585dbffa33e9b45ebe2"}, ] +markers = {main = "extra == \"import\" and python_version <= \"3.13\"", test = "python_version <= \"3.13\""} [[package]] name = "beautifulsoup4" @@ -331,10 +353,12 @@ version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" +groups = ["main", "test"] files = [ {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, ] +markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"docs\""} [package.dependencies] soupsieve = ">=1.6.1" @@ -353,6 +377,7 @@ version = "26.3.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.10" +groups = ["lint"] files = [ {file = "black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2"}, {file = "black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b"}, @@ -397,7 +422,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)", "winloop (>=0.5.0)"] +uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] [[package]] name = "blinker" @@ -405,10 +430,12 @@ version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.9" +groups = ["main", "test", "typing"] files = [ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\""} [[package]] name = "brotli" @@ -416,6 +443,7 @@ version = "1.2.0" description = "Python bindings for the Brotli compression library" optional = false python-versions = "*" +groups = ["main", "test"] files = [ {file = "brotli-1.2.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:99cfa69813d79492f0e5d52a20fd18395bc82e671d5d40bd5a91d13e75e468e8"}, {file = "brotli-1.2.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3ebe801e0f4e56d17cd386ca6600573e3706ce1845376307f5d2cbd32149b69a"}, @@ -518,6 +546,7 @@ files = [ {file = "brotli-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:1ce223652fd4ed3eb2b7f78fbea31c52314baecfac68db44037bb4167062a937"}, {file = "brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a"}, ] +markers = {main = "extra == \"import\" and platform_python_implementation == \"CPython\"", test = "platform_python_implementation == \"CPython\""} [[package]] name = "brotlicffi" @@ -525,6 +554,7 @@ version = "1.2.0.1" description = "Python CFFI bindings to the Brotli library" optional = false python-versions = ">=3.8" +groups = ["main", "test"] files = [ {file = "brotlicffi-1.2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c85e65913cf2b79c57a3fdd05b98d9731d9255dc0cb696b09376cc091b9cddd"}, {file = "brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:535f2d05d0273408abc13fc0eebb467afac17b0ad85090c8913690d40207dac5"}, @@ -542,6 +572,7 @@ files = [ {file = "brotlicffi-1.2.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2a5575653b0672638ba039b82fda56854934d7a6a24d4b8b5033f73ab43cbc1"}, {file = "brotlicffi-1.2.0.1.tar.gz", hash = "sha256:c20d5c596278307ad06414a6d95a892377ea274a5c6b790c2548c009385d621c"}, ] +markers = {main = "extra == \"import\" and platform_python_implementation == \"PyPy\"", test = "platform_python_implementation == \"PyPy\""} [package.dependencies] cffi = [ @@ -555,6 +586,8 @@ version = "0.14.4" description = "httplib2 caching for requests" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b"}, {file = "cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1"}, @@ -576,6 +609,7 @@ version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" +groups = ["main", "lint", "test"] files = [ {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, @@ -587,6 +621,7 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" +groups = ["main", "test"] files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -673,6 +708,7 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] +markers = {main = "(extra == \"import\" or extra == \"autobpm\" or extra == \"reflink\") and platform_python_implementation == \"PyPy\" or extra == \"autobpm\" or extra == \"reflink\"", test = "platform_python_implementation == \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -683,6 +719,7 @@ version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["main", "lint", "test"] files = [ {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, @@ -821,10 +858,12 @@ version = "8.3.2" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" +groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d"}, {file = "click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -835,6 +874,7 @@ version = "2.1.13" description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["test"] files = [ {file = "codecov-2.1.13-py2.py3-none-any.whl", hash = "sha256:c2ca5e51bba9ebb43644c43d0690148a55086f7f5e6fd36170858fa4206744d5"}, {file = "codecov-2.1.13.tar.gz", hash = "sha256:2362b685633caeaf45b9951a9b76ce359cd3581dd515b430c6c3f5dfb4d92a8c"}, @@ -850,10 +890,12 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "sys_platform == \"win32\" or (extra == \"aura\" or extra == \"web\") and platform_system == \"Windows\"", lint = "platform_system == \"Windows\" or sys_platform == \"win32\"", release = "platform_system == \"Windows\"", test = "platform_system == \"Windows\" or sys_platform == \"win32\"", typing = "platform_system == \"Windows\""} [[package]] name = "confuse" @@ -861,6 +903,7 @@ version = "2.2.0" description = "Painless YAML config files" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "confuse-2.2.0-py3-none-any.whl", hash = "sha256:470c6aa1a5008c8d740267f2ad574e3a715b6dd873c1e5f8778b7f7abb954722"}, {file = "confuse-2.2.0.tar.gz", hash = "sha256:35c1b53e81be125f441bee535130559c935917b26aeaa61289010cd1f55c2b9e"}, @@ -878,6 +921,7 @@ version = "7.13.5" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" +groups = ["lint", "test"] files = [ {file = "coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5"}, {file = "coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf"}, @@ -991,7 +1035,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "cssutils" @@ -999,6 +1043,8 @@ version = "2.11.1" description = "A CSS Cascading Style Sheets library for Python" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "cssutils-2.11.1-py3-none-any.whl", hash = "sha256:a67bfdfdff4f3867fab43698ec4897c1a828eca5973f4073321b3bccaf1199b1"}, {file = "cssutils-2.11.1.tar.gz", hash = "sha256:0563a76513b6af6eebbe788c3bf3d01c920e46b3f90c8416738c5cfc773ff8e2"}, @@ -1009,7 +1055,7 @@ more-itertools = "*" [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["cssselect", "importlib-resources", "jaraco.test (>=5.1)", "lxml", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["cssselect", "importlib-resources ; python_version < \"3.9\"", "jaraco.test (>=5.1)", "lxml ; python_version < \"3.11\"", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "dbus-python" @@ -1017,6 +1063,8 @@ version = "1.4.0" description = "Python bindings for libdbus" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"metasync\"" files = [ {file = "dbus-python-1.4.0.tar.gz", hash = "sha256:991666e498f60dbf3e49b8b7678f5559b8a65034fdf61aae62cdecdb7d89c770"}, ] @@ -1031,6 +1079,8 @@ version = "5.2.1" description = "Decorators for Humans" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -1042,6 +1092,8 @@ version = "0.3.0.post1" description = "A μ-library for constructing cascading style sheets from Python dictionaries." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "dict2css-0.3.0.post1-py3-none-any.whl", hash = "sha256:f006a6b774c3e31869015122ae82c491fd25e7de4a75607a62aa3e798f837e0d"}, {file = "dict2css-0.3.0.post1.tar.gz", hash = "sha256:89c544c21c4ca7472c3fffb9d37d3d926f606329afdb751dc1de67a411b70719"}, @@ -1057,6 +1109,7 @@ version = "2.0.2" description = "docstrfmt: A formatter for Sphinx flavored reStructuredText." optional = false python-versions = ">=3.10" +groups = ["lint"] files = [ {file = "docstrfmt-2.0.2-py3-none-any.whl", hash = "sha256:acbff3cb00ea85a5c153355b43aeb6d40e0775cfcdbaa1dea42b333b9c8c233d"}, {file = "docstrfmt-2.0.2.tar.gz", hash = "sha256:086e74b03c337c9a932b2f8216aa8c93bb6576b525edfb5d754b6bac841d4166"}, @@ -1085,10 +1138,12 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "docutils-stubs" @@ -1096,6 +1151,7 @@ version = "0.0.22" description = "PEP 561 type stubs for docutils" optional = false python-versions = ">=3.5" +groups = ["lint"] files = [ {file = "docutils-stubs-0.0.22.tar.gz", hash = "sha256:1736d9650cfc20cff8c72582806c33a5c642694e2df9e430717e7da7e73efbdf"}, {file = "docutils_stubs-0.0.22-py3-none-any.whl", hash = "sha256:157807309de24e8c96af9a13afe207410f1fc6e5aab5d974fd6b9191f04de327"}, @@ -1110,6 +1166,8 @@ version = "3.10.0" description = "Helpful functions for Python 🐍 🛠️" optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36"}, {file = "domdf_python_tools-3.10.0.tar.gz", hash = "sha256:2ae308d2f4f1e9145f5f4ba57f840fbfd1c2983ee26e4824347789649d3ae298"}, @@ -1129,10 +1187,12 @@ version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["main", "test"] files = [ {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] +markers = {main = "(extra == \"lastgenre\" or extra == \"lastimport\") and python_version == \"3.10\"", test = "python_version == \"3.10\""} [package.dependencies] typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} @@ -1146,6 +1206,8 @@ version = "3.25.2" description = "A platform independent file lock." optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70"}, {file = "filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694"}, @@ -1157,6 +1219,7 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1168,10 +1231,12 @@ version = "3.1.3" description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.9" +groups = ["main", "test", "typing"] files = [ {file = "flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c"}, {file = "flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] blinker = ">=1.9.0" @@ -1191,6 +1256,8 @@ version = "6.0.2" description = "A Flask extension simplifying CORS support" optional = true python-versions = "<4.0,>=3.9" +groups = ["main"] +markers = "extra == \"aura\" or extra == \"web\"" files = [ {file = "flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a"}, {file = "flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423"}, @@ -1206,10 +1273,12 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" +groups = ["main", "test"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] +markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [[package]] name = "html5lib" @@ -1217,6 +1286,8 @@ version = "1.1" description = "HTML parser based on the WHATWG HTML specification" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, @@ -1227,10 +1298,10 @@ six = ">=1.9" webencodings = "*" [package.extras] -all = ["chardet (>=2.2)", "genshi", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml ; platform_python_implementation == \"CPython\""] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] -lxml = ["lxml"] +lxml = ["lxml ; platform_python_implementation == \"CPython\""] [[package]] name = "httpcore" @@ -1238,10 +1309,12 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "test"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] +markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] certifi = "*" @@ -1259,10 +1332,12 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" +groups = ["main", "test"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] +markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] anyio = "*" @@ -1271,7 +1346,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli", "brotlicffi"] +brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -1283,6 +1358,7 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" +groups = ["main", "lint", "test"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1297,6 +1373,8 @@ version = "0.2.0" description = "Cross-platform network interface and IP address enumeration library" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"sonosupdate\"" files = [ {file = "ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748"}, {file = "ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4"}, @@ -1308,10 +1386,12 @@ version = "2.0.0" description = "Get image size from headers (BMP/PNG/JPEG/JPEG2000/GIF/TIFF/SVG/Netpbm/WebP/AVIF/HEIC/HEIF)" optional = false python-versions = "<3.15,>=3.10" +groups = ["main", "lint"] files = [ {file = "imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96"}, {file = "imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "inflate64" @@ -1319,6 +1399,7 @@ version = "1.0.4" description = "deflate64 compression/decompression library" optional = false python-versions = ">=3.9" +groups = ["main", "test"] files = [ {file = "inflate64-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1a47837d4322e0684824f91eb635aa6fd1967584140c478b0a1aca7b11740d6"}, {file = "inflate64-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8600478542e2354d1ee7b5c57c957006cabacd8b787b4046951f487a2216e5c0"}, @@ -1392,6 +1473,7 @@ files = [ {file = "inflate64-1.0.4-cp39-cp39-win_arm64.whl", hash = "sha256:f5bb6c58c642859ecf5e23178b1e7e4724f3ce968fc49090919d59a5e186f3e6"}, {file = "inflate64-1.0.4.tar.gz", hash = "sha256:b398c686960c029777afc0ed281a86f66adb956cfc3fbf6667cc6453f7b407ce"}, ] +markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "flake8-deprecated", "flake8-isort", "mypy (>=1.10.0)", "mypy_extensions (>=0.4.1)", "pygments", "readme-renderer", "twine"] @@ -1404,6 +1486,7 @@ version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.10" +groups = ["test"] files = [ {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, @@ -1415,10 +1498,12 @@ version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = false python-versions = ">=3.8" +groups = ["main", "test", "typing"] files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\""} [[package]] name = "jellyfish" @@ -1426,6 +1511,7 @@ version = "1.2.1" description = "" optional = false python-versions = ">=3.9" +groups = ["main"] files = [ {file = "jellyfish-1.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea"}, {file = "jellyfish-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46"}, @@ -1520,10 +1606,12 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main", "lint", "test", "typing"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\" or extra == \"docs\""} [package.dependencies] MarkupSafe = ">=2.0" @@ -1537,6 +1625,8 @@ version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, @@ -1548,10 +1638,12 @@ version = "1.0.9" description = "Language detection library ported from Google's language-detection." optional = false python-versions = "*" +groups = ["main", "test"] files = [ {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, ] +markers = {main = "extra == \"fetchart\" or extra == \"lyrics\""} [package.dependencies] six = "*" @@ -1562,6 +1654,7 @@ version = "0.5.13" description = "Linear Assignment Problem solver (LAPJV/LAPMOD)." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "lap-0.5.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2cc08c4ff49626ba6c1b707f0b02e92cf57a44359e65d9e769acdff1b510eebf"}, {file = "lap-0.5.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32cd1d38500da8e1ef51398121f1408ce23890cbc133647a0f665576b127eca7"}, @@ -1636,6 +1729,8 @@ version = "0.5" description = "Makes it easy to load subpackages and functions on demand." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005"}, {file = "lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3"}, @@ -1655,6 +1750,7 @@ version = "1.8.6" description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.14 programs." optional = false python-versions = ">=3.9" +groups = ["lint"] files = [ {file = "libcst-1.8.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a20c5182af04332cc94d8520792befda06d73daf2865e6dddc5161c72ea92cb9"}, {file = "libcst-1.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36473e47cb199b7e6531d653ee6ffed057de1d179301e6c67f651f3af0b499d6"}, @@ -1736,6 +1832,8 @@ version = "0.11.0" description = "Python module for audio and music processing" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1"}, {file = "librosa-0.11.0.tar.gz", hash = "sha256:f5ed951ca189b375bbe2e33b2abd7e040ceeee302b9bbaeeffdfddb8d0ace908"}, @@ -1769,6 +1867,8 @@ version = "0.9.0" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" +groups = ["typing"] +markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "librt-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443"}, {file = "librt-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c"}, @@ -1868,6 +1968,7 @@ version = "0.47.0" description = "lightweight wrapper around basic LLVM functionality" optional = true python-versions = ">=3.10" +groups = ["main"] files = [ {file = "llvmlite-0.47.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41270b0b1310717f717cf6f2a9c68d3c43bd7905c33f003825aebc361d0d1b17"}, {file = "llvmlite-0.47.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f9d118bc1dd7623e0e65ca9ac485ec6dd543c3b77bc9928ddc45ebd34e1e30a7"}, @@ -1902,6 +2003,8 @@ version = "6.0.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"sonosupdate\"" files = [ {file = "lxml-6.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c524cf8c3b8d71dfc3de6cfb225138a876862a92d88bfa22eb9ff020729d45"}, {file = "lxml-6.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a10f9967859229cae38b1aa7a96eb655c96b8adc96989b52c5b1f77d963a77a4"}, @@ -2051,6 +2154,7 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" +groups = ["main", "lint", "test", "typing"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -2142,16 +2246,18 @@ files = [ {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\" or extra == \"docs\""} [[package]] name = "mediafile" -version = "0.16.0" +version = "0.16.1" description = "A simple, cross-format library for reading and writing media file metadata." optional = false python-versions = ">=3.10" +groups = ["main"] files = [ - {file = "mediafile-0.16.0-py3-none-any.whl", hash = "sha256:d6f1ebe04a2272bc63c3b8f34abd1bea477222345f1d647e08fa839836d023d4"}, - {file = "mediafile-0.16.0.tar.gz", hash = "sha256:3abdbec924a65e9bad57a439a01ff3e8d2b88a5a6c4770a3cc0b1cc0aee73f9e"}, + {file = "mediafile-0.16.1-py3-none-any.whl", hash = "sha256:dc00407d8172fb6c293b65f95aeabdf6ada99c1f0891525f8e7bf9c9179c2483"}, + {file = "mediafile-0.16.1.tar.gz", hash = "sha256:0d8856fc41fe66b6f70d0eec3c3a4146bdfa04defe2a930bd12f11df55d71a6f"}, ] [package.dependencies] @@ -2167,6 +2273,8 @@ version = "11.0.2" description = "More routines for operating on iterables, beyond itertools" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "more_itertools-11.0.2-py3-none-any.whl", hash = "sha256:6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4"}, {file = "more_itertools-11.0.2.tar.gz", hash = "sha256:392a9e1e362cbc106a2457d37cabf9b36e5e12efd4ebff1654630e76597df804"}, @@ -2178,6 +2286,8 @@ version = "1.1.2" description = "MessagePack serializer" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\" or extra == \"docs\"" files = [ {file = "msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2"}, {file = "msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87"}, @@ -2249,10 +2359,12 @@ version = "0.2.3" description = "multi volume file wrapper library" optional = false python-versions = ">=3.6" +groups = ["main", "test"] files = [ {file = "multivolumefile-0.2.3-py3-none-any.whl", hash = "sha256:237f4353b60af1703087cf7725755a1f6fcaeeea48421e1896940cd1c920d678"}, {file = "multivolumefile-0.2.3.tar.gz", hash = "sha256:a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6"}, ] +markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "pygments", "readme-renderer", "twine"] @@ -2265,6 +2377,7 @@ version = "1.47.0" description = "read and write audio tags for many formats" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719"}, {file = "mutagen-1.47.0.tar.gz", hash = "sha256:719fadef0a978c31b4cf3c956261b3c58b6948b32023078a2117b1de09f0fc99"}, @@ -2276,6 +2389,7 @@ version = "1.20.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "mypy-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99f515f95fd03a90875fdb2cca12ff074aa04490db4d190905851bdf8a549a8"}, {file = "mypy-1.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd0212976dc57a5bfeede7c219e7cd66568a32c05c9129686dd487c059c1b88a"}, @@ -2344,6 +2458,7 @@ version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.8" +groups = ["lint", "typing"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -2355,6 +2470,8 @@ version = "8.4.0" description = "Simple yet flexible natural sorting in Python." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, @@ -2370,6 +2487,7 @@ version = "0.65.0" description = "compiling Python code using LLVM" optional = true python-versions = ">=3.10" +groups = ["main"] files = [ {file = "numba-0.65.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:dff9fd5fbc9a35c517359c5823ea705d9b65f01fb46e42e35a2eabe5a52c2e96"}, {file = "numba-0.65.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4c894c94afa5ffd627c7e3b693df10cb0d905bd5eb06de3dfc31775140cf4f89"}, @@ -2408,6 +2526,8 @@ version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" +groups = ["main"] +markers = "python_version < \"3.13\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -2472,6 +2592,8 @@ version = "2.4.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" +groups = ["main"] +markers = "python_version >= \"3.13\"" files = [ {file = "numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db"}, {file = "numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0"}, @@ -2553,10 +2675,12 @@ version = "3.3.1" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.8" +groups = ["main", "test"] files = [ {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, ] +markers = {main = "extra == \"discogs\" or extra == \"beatport\""} [package.extras] rsa = ["cryptography (>=3.0.0)"] @@ -2569,6 +2693,7 @@ version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "lint", "test"] files = [ {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, @@ -2580,6 +2705,7 @@ version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.9" +groups = ["lint", "typing"] files = [ {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, @@ -2597,6 +2723,8 @@ version = "12.2.0" description = "Python Imaging Library (fork)" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"aura\" or extra == \"embedart\" or extra == \"fetchart\" or extra == \"thumbnails\"" files = [ {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, @@ -2705,6 +2833,7 @@ version = "4.9.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" +groups = ["main", "lint"] files = [ {file = "platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917"}, {file = "platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a"}, @@ -2716,6 +2845,7 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" +groups = ["test"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -2731,6 +2861,7 @@ version = "1.2.0" description = "A library to manipulate gettext files (po and mo files)." optional = false python-versions = "*" +groups = ["lint"] files = [ {file = "polib-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c77ee1b81feb31df9bca258cbc58db1bbb32d10214b173882452c73af06d62d"}, {file = "polib-1.2.0.tar.gz", hash = "sha256:f3ef94aefed6e183e342a8a269ae1fc4742ba193186ad76f175938621dbfc26b"}, @@ -2742,6 +2873,8 @@ version = "1.9.0" description = "A friend to fetch your data files" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "pooch-1.9.0-py3-none-any.whl", hash = "sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b"}, {file = "pooch-1.9.0.tar.gz", hash = "sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed"}, @@ -2764,6 +2897,7 @@ version = "7.2.2" description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" +groups = ["main", "test"] files = [ {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, @@ -2787,10 +2921,11 @@ files = [ {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, ] +markers = {main = "extra == \"import\" and sys_platform != \"cygwin\"", test = "sys_platform != \"cygwin\""} [package.extras] -dev = ["abi3audit", "black", "check-manifest", "colorama", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel", "wmi"] -test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32", "setuptools", "wheel", "wmi"] +dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] [[package]] name = "py7zr" @@ -2798,10 +2933,12 @@ version = "1.1.0" description = "Pure python 7-zip library" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "py7zr-1.1.0-py3-none-any.whl", hash = "sha256:5921bc30fb72b5453aafe3b2183664c08ef508cde2655988d5e9bd6078353ef7"}, {file = "py7zr-1.1.0.tar.gz", hash = "sha256:087b1a94861ad9eb4d21604f6aaa0a8986a7e00580abd79fedd6f82fecf0592c"}, ] +markers = {main = "extra == \"import\""} [package.dependencies] "backports.zstd" = {version = ">=1.0.0", markers = "python_version < \"3.14\""} @@ -2827,6 +2964,8 @@ version = "1.3.1" description = "Bindings for Chromaprint acoustic fingerprinting and the Acoustid API" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"chroma\"" files = [ {file = "pyacoustid-1.3.1-py3-none-any.whl", hash = "sha256:4436732937ac40e4b2fec4808fc81934c0e07ad9e3f0ef5f2b225517c99bb1e4"}, {file = "pyacoustid-1.3.1.tar.gz", hash = "sha256:bb0ecae40109c0aa80f709e33c66c83ec36b2fd84658f9fad056a34538f79e8a"}, @@ -2842,6 +2981,7 @@ version = "1.0.7" description = "bcj filter library" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "pybcj-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:618ec7345775c306d83527750e2d0ab3f42ffdc5ad6282f62f88cb53c9b2b679"}, {file = "pybcj-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7e7faa1b0f7d894685e4567dd41268b93df89cff347ebfdfdc48b4bc0d68cb2"}, @@ -2899,6 +3039,7 @@ files = [ {file = "pybcj-1.0.7-cp314-cp314t-win_arm64.whl", hash = "sha256:16fd4e51a5556d1f38d7ba5d1fab588bfb60ae23d2299b5179779bf9900adf71"}, {file = "pybcj-1.0.7.tar.gz", hash = "sha256:72d64574069ffb0a800020668376b7ebd7adea159adbf4d35f8effc62f0daa67"}, ] +markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8 (<8)", "flake8-black", "flake8-colors", "flake8-isort", "flake8-pyi", "flake8-typing-imports", "mypy (>=1.10.0)", "pygments", "readme-renderer"] @@ -2910,6 +3051,8 @@ version = "1.29.0" description = "Python interface for cairo" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"bpd\" or extra == \"replaygain\"" files = [ {file = "pycairo-1.29.0-cp310-cp310-win32.whl", hash = "sha256:96c67e6caba72afd285c2372806a0175b1aa2f4537aa88fb4d9802d726effcd1"}, {file = "pycairo-1.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:65bddd944aee9f7d7d72821b1c87e97593856617c2820a78d589d66aa8afbd08"}, @@ -2937,10 +3080,12 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] +markers = {main = "(extra == \"import\" or extra == \"autobpm\" or extra == \"reflink\") and (platform_python_implementation == \"PyPy\" or extra == \"autobpm\" or extra == \"reflink\") and implementation_name != \"PyPy\"", test = "platform_python_implementation == \"PyPy\" and implementation_name != \"PyPy\""} [[package]] name = "pycryptodomex" @@ -2948,6 +3093,7 @@ version = "3.23.0" description = "Cryptographic library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "test"] files = [ {file = "pycryptodomex-3.23.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:add243d204e125f189819db65eed55e6b4713f70a7e9576c043178656529cec7"}, {file = "pycryptodomex-3.23.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1c6d919fc8429e5cb228ba8c0d4d03d202a560b421c14867a65f6042990adc8e"}, @@ -2991,6 +3137,7 @@ files = [ {file = "pycryptodomex-3.23.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:27e13c80ac9a0a1d050ef0a7e0a18cc04c8850101ec891815b6c5a0375e8a245"}, {file = "pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da"}, ] +markers = {main = "extra == \"import\""} [[package]] name = "pydata-sphinx-theme" @@ -2998,6 +3145,8 @@ version = "0.17.0" description = "Bootstrap-based Sphinx theme from the PyData community" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "pydata_sphinx_theme-0.17.0-py3-none-any.whl", hash = "sha256:cec5c92f41f4a11541b6df8210c446b4aa9c3badb7fcf2db7893405b786d5c99"}, {file = "pydata_sphinx_theme-0.17.0.tar.gz", hash = "sha256:529c5631582cb3328cf4814fb9eb80611d1704c854406d282a75c9c86e3a1955"}, @@ -3025,10 +3174,12 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" +groups = ["main", "lint", "test"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] +markers = {main = "extra == \"docs\""} [package.extras] windows-terminal = ["colorama (>=0.4.6)"] @@ -3039,6 +3190,8 @@ version = "3.56.2" description = "Python bindings for GObject Introspection" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"bpd\" or extra == \"replaygain\"" files = [ {file = "pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313"}, ] @@ -3052,10 +3205,12 @@ version = "7.0.2" description = "A Python interface to Last.fm and Libre.fm" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "pylast-7.0.2-py3-none-any.whl", hash = "sha256:c995e078670b3a8e3116a31b17d1f0d89c4d020407f6967ee9ffab2aeecd9de7"}, {file = "pylast-7.0.2.tar.gz", hash = "sha256:825e2b5d9144c5491d9c353511169a1595813e6a1ad203faf7525cd2d1d1828e"}, ] +markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] httpx = ">=0.26" @@ -3069,6 +3224,7 @@ version = "1.3.1" description = "PPMd compression/decompression library" optional = false python-versions = ">=3.10" +groups = ["main", "test"] files = [ {file = "pyppmd-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:041f46fbeb0a59888c0a94d6b9a557c652935633a104be1c31c12de491b5f448"}, {file = "pyppmd-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9512a8b39740923559c26eb16266bf8b70d4eab6ad27a9b39cd2465e60e0acfa"}, @@ -3132,6 +3288,7 @@ files = [ {file = "pyppmd-1.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:e066cbf1d335fe20480cd8ecc10848ba78d99fe6d1e44ea00def48feaf46afdf"}, {file = "pyppmd-1.3.1.tar.gz", hash = "sha256:ced527f08ade4408c1bfc5264e9f97ffac8d221c9d13eca4f35ec1ec0c7b6b2e"}, ] +markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "flake8-isort", "mypy (>=1.10.0)", "pygments", "readme-renderer"] @@ -3145,6 +3302,7 @@ version = "4.1.0" description = "Python Rate-Limiter using Leaky-Bucket Algorithm" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "pyrate_limiter-4.1.0-py3-none-any.whl", hash = "sha256:2696b4e4a6cffb3d40fc76662baccb766697893f0979e12bebbfc7d3b6b19603"}, {file = "pyrate_limiter-4.1.0.tar.gz", hash = "sha256:be1ac413a263aa410b98757d1b01a880650948a1fc3a959512f15865eb58dbf3"}, @@ -3156,6 +3314,7 @@ version = "9.0.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.10" +groups = ["test"] files = [ {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, @@ -3179,6 +3338,7 @@ version = "7.1.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["test"] files = [ {file = "pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"}, {file = "pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"}, @@ -3198,6 +3358,7 @@ version = "1.3.0" description = "A set of py.test fixtures to test Flask applications." optional = false python-versions = ">=3.7" +groups = ["test"] files = [ {file = "pytest-flask-1.3.0.tar.gz", hash = "sha256:58be1c97b21ba3c4d47e0a7691eb41007748506c36bf51004f78df10691fa95e"}, {file = "pytest_flask-1.3.0-py3-none-any.whl", hash = "sha256:c0e36e6b0fddc3b91c4362661db83fa694d1feb91fa505475be6732b5bc8c253"}, @@ -3217,10 +3378,12 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "test"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] +markers = {main = "extra == \"discogs\""} [package.dependencies] six = ">=1.5" @@ -3231,10 +3394,12 @@ version = "3.1.1" description = "A Python MPD client library" optional = false python-versions = ">=3.6" +groups = ["main", "test"] files = [ {file = "python-mpd2-3.1.1.tar.gz", hash = "sha256:4baec3584cc43ed9948d5559079fafc2679b06b2ade273e909b3582654b2b3f5"}, {file = "python_mpd2-3.1.1-py2.py3-none-any.whl", hash = "sha256:86bf1100a0b135959d74a9a7a58cf0515bf30bb54eb25ae6fb8e175e50300fc3"}, ] +markers = {main = "extra == \"mpdstats\""} [package.extras] twisted = ["Twisted"] @@ -3245,10 +3410,12 @@ version = "2.8" description = "Python API client for Discogs" optional = false python-versions = "*" +groups = ["main", "test"] files = [ {file = "python3_discogs_client-2.8-py3-none-any.whl", hash = "sha256:60d63a613da73afeb818015e680fa5f007ffaa94d97578070e7ee4f11dc1b1b3"}, {file = "python3_discogs_client-2.8.tar.gz", hash = "sha256:0f2c77f4ff491a6ef60fe892032028df899808e65efcd48249b4ecf21146b33b"}, ] +markers = {main = "extra == \"discogs\""} [package.dependencies] oauthlib = "*" @@ -3264,6 +3431,7 @@ version = "0.4.1" description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." optional = false python-versions = ">=3.8" +groups = ["lint"] files = [ {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, @@ -3318,10 +3486,12 @@ version = "0.28" description = "PyXDG contains implementations of freedesktop.org standards in python." optional = false python-versions = "*" +groups = ["main", "test"] files = [ {file = "pyxdg-0.28-py2.py3-none-any.whl", hash = "sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab"}, {file = "pyxdg-0.28.tar.gz", hash = "sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4"}, ] +markers = {main = "extra == \"thumbnails\""} [[package]] name = "pyyaml" @@ -3329,6 +3499,7 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" +groups = ["main", "lint", "test"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -3404,6 +3575,7 @@ files = [ {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] +markers = {lint = "python_version < \"3.13\" or python_version == \"3.14\""} [[package]] name = "pyyaml-ft" @@ -3411,6 +3583,8 @@ version = "8.0.0" description = "YAML parser and emitter for Python with support for free-threading" optional = false python-versions = ">=3.13" +groups = ["lint"] +markers = "python_version == \"3.13\"" files = [ {file = "pyyaml_ft-8.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c1306282bc958bfda31237f900eb52c9bedf9b93a11f82e1aab004c9a5657a6"}, {file = "pyyaml_ft-8.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30c5f1751625786c19de751e3130fc345ebcba6a86f6bddd6e1285342f4bbb69"}, @@ -3437,10 +3611,12 @@ version = "4.2" description = "RAR archive reader for Python" optional = false python-versions = ">=3.6" +groups = ["main", "test"] files = [ {file = "rarfile-4.2-py3-none-any.whl", hash = "sha256:8757e1e3757e32962e229cab2432efc1f15f210823cc96ccba0f6a39d17370c9"}, {file = "rarfile-4.2.tar.gz", hash = "sha256:8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef"}, ] +markers = {main = "extra == \"import\""} [[package]] name = "reflink" @@ -3448,6 +3624,8 @@ version = "0.2.2" description = "Python reflink wraps around platform specific reflink implementations" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"reflink\"" files = [ {file = "reflink-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:8435c7153af4d6e66dc8acb48a9372c8ec6f978a09cdf7b57cd6656d969e343a"}, {file = "reflink-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:be4787c6208faf7fc892390909cf01e34e650ea67c37bf345addefd597ed90e1"}, @@ -3463,6 +3641,7 @@ version = "2026.4.4" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.10" +groups = ["lint"] files = [ {file = "regex-2026.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:74fa82dcc8143386c7c0392e18032009d1db715c25f4ba22d23dc2e04d02a20f"}, {file = "regex-2026.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a85b620a388d6c9caa12189233109e236b3da3deffe4ff11b84ae84e218a274f"}, @@ -3586,6 +3765,7 @@ version = "2.33.1" description = "Python HTTP for Humans." optional = false python-versions = ">=3.10" +groups = ["main", "lint", "test"] files = [ {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, @@ -3607,6 +3787,7 @@ version = "1.12.1" description = "Mock out responses from the requests package" optional = false python-versions = ">=3.5" +groups = ["test"] files = [ {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, @@ -3624,10 +3805,12 @@ version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=3.4" +groups = ["main", "test"] files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] +markers = {main = "extra == \"beatport\""} [package.dependencies] oauthlib = ">=3.0.0" @@ -3642,6 +3825,7 @@ version = "0.9.3" description = "Rate-limiting for the requests library" optional = false python-versions = ">=3.10" +groups = ["main"] files = [ {file = "requests_ratelimiter-0.9.3-py3-none-any.whl", hash = "sha256:f0d2c616891ba84d84aa9940c4251fd516bc6471d44313230653062eedc860d4"}, {file = "requests_ratelimiter-0.9.3.tar.gz", hash = "sha256:a706807210e0a5554be585f0cd6892cb57784343c4d40c7473456b26274a775c"}, @@ -3657,6 +3841,8 @@ version = "0.4.3" description = "Efficient signal resampling" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "resampy-0.4.3-py3-none-any.whl", hash = "sha256:ad2ed64516b140a122d96704e32bc0f92b23f45419e8b8f478e5a05f83edcebd"}, {file = "resampy-0.4.3.tar.gz", hash = "sha256:a0d1c28398f0e55994b739650afef4e3974115edbe96cd4bb81968425e916e47"}, @@ -3677,6 +3863,7 @@ version = "0.26.0" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" +groups = ["test"] files = [ {file = "responses-0.26.0-py3-none-any.whl", hash = "sha256:03ec4409088cd5c66b71ecbbbd27fe2c58ddfad801c66203457b3e6a04868c37"}, {file = "responses-0.26.0.tar.gz", hash = "sha256:c7f6923e6343ef3682816ba421c006626777893cb0d5e1434f674b649bac9eb4"}, @@ -3688,7 +3875,7 @@ requests = ">=2.30.0,<3.0" urllib3 = ">=1.25.10,<3.0" [package.extras] -tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli ; python_version < \"3.11\"", "tomli-w", "types-PyYAML", "types-requests"] [[package]] name = "roman" @@ -3696,10 +3883,12 @@ version = "5.2" description = "Integer to Roman numerals converter" optional = false python-versions = ">=3.10" +groups = ["main", "lint"] files = [ {file = "roman-5.2-py3-none-any.whl", hash = "sha256:89d3b47400388806d06ff77ea77c79ab080bc127820dea6bf34e1f1c1b8e676e"}, {file = "roman-5.2.tar.gz", hash = "sha256:275fe9f46290f7d0ffaea1c33251b92b8e463ace23660508ceef522e7587cb6f"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "ruamel-yaml" @@ -3707,6 +3896,8 @@ version = "0.18.16" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = true python-versions = ">=3.8" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba"}, {file = "ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a"}, @@ -3725,6 +3916,8 @@ version = "0.2.15" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "platform_python_implementation == \"CPython\" and extra == \"docs\" and python_version <= \"3.13\"" files = [ {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, @@ -3795,6 +3988,7 @@ version = "0.15.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" +groups = ["lint"] files = [ {file = "ruff-0.15.10-py3-none-linux_armv6l.whl", hash = "sha256:0744e31482f8f7d0d10a11fcbf897af272fefdfcb10f5af907b18c2813ff4d5f"}, {file = "ruff-0.15.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b1e7c16ea0ff5a53b7c2df52d947e685973049be1cdfe2b59a9c43601897b22e"}, @@ -3822,6 +4016,8 @@ version = "1.7.2" description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, @@ -3877,6 +4073,8 @@ version = "1.15.3" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "python_version < \"3.13\"" files = [ {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, @@ -3932,7 +4130,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scipy" @@ -3940,6 +4138,8 @@ version = "1.17.1" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.11" +groups = ["main"] +markers = "python_version >= \"3.13\"" files = [ {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, @@ -4010,7 +4210,7 @@ numpy = ">=1.26.4,<2.7" [package.extras] dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] -test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -4018,10 +4218,12 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "test"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] +markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"discogs\" or extra == \"docs\""} [[package]] name = "snowballstemmer" @@ -4029,10 +4231,12 @@ version = "3.0.1" description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*" +groups = ["main", "lint"] files = [ {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, ] +markers = {main = "extra == \"docs\""} [[package]] name = "soco" @@ -4040,6 +4244,8 @@ version = "0.31.0" description = "SoCo (Sonos Controller) is a simple library to control Sonos speakers." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"sonosupdate\"" files = [ {file = "soco-0.31.0-py2.py3-none-any.whl", hash = "sha256:a4152803f736705d759c052b2079af4282b31bd481e46f15c3a6d79b41bb9521"}, {file = "soco-0.31.0.tar.gz", hash = "sha256:d72279eb3b5d44b9359843c8d3237d6eaaa95ce04096539720f2d377b19fd89f"}, @@ -4054,7 +4260,7 @@ xmltodict = "*" [package.extras] events-asyncio = ["aiohttp"] -testing = ["black (>=24.4.0)", "coveralls", "flake8", "graphviz", "importlib-metadata (<5)", "pylint", "pytest (>=2.5)", "pytest-cov (<2.6.0)", "requests-mock", "sphinx (==4.5.0)", "sphinx_rtd_theme", "twine", "wheel"] +testing = ["black (>=24.4.0) ; python_version >= \"3.10\"", "coveralls", "flake8", "graphviz", "importlib-metadata (<5) ; python_version == \"3.7\"", "pylint", "pytest (>=2.5)", "pytest-cov (<2.6.0)", "requests-mock", "sphinx (==4.5.0)", "sphinx_rtd_theme", "twine", "wheel"] [[package]] name = "soundfile" @@ -4062,6 +4268,8 @@ version = "0.13.1" description = "An audio library based on libsndfile, CFFI and NumPy" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445"}, {file = "soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33"}, @@ -4083,10 +4291,12 @@ version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" +groups = ["main", "test"] files = [ {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, ] +markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"docs\""} [[package]] name = "soxr" @@ -4094,6 +4304,8 @@ version = "1.0.0" description = "High quality, one-dimensional sample-rate conversion library" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "soxr-1.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:b876a3156f67c76aef0cff1084eaf4088d9ca584bb569cb993f89a52ec5f399f"}, {file = "soxr-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d3b957a7b0cc19ae6aa45d40b2181474e53a8dd00efd7bce6bcf4e60e020892"}, @@ -4136,10 +4348,12 @@ version = "8.1.3" description = "Python documentation generator" optional = false python-versions = ">=3.10" +groups = ["main", "lint"] files = [ {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, ] +markers = {main = "extra == \"docs\""} [package.dependencies] alabaster = ">=0.7.14" @@ -4171,6 +4385,8 @@ version = "3.0.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_autodoc_typehints-3.0.1-py3-none-any.whl", hash = "sha256:4b64b676a14b5b79cefb6628a6dc8070e320d4963e8ff640a2f3e9390ae9045a"}, {file = "sphinx_autodoc_typehints-3.0.1.tar.gz", hash = "sha256:b9b40dd15dee54f6f810c924f863f9cf1c54f9f3265c495140ea01be7f44fa55"}, @@ -4189,6 +4405,8 @@ version = "0.5.2" description = "Add a copy button to each of your code cells." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, @@ -4207,6 +4425,8 @@ version = "0.6.1" description = "A sphinx extension for designing beautiful, view size responsive web components." optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c"}, {file = "sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632"}, @@ -4232,6 +4452,8 @@ version = "0.4.1" description = "Patches Jinja2 v3 to restore compatibility with earlier Sphinx versions." optional = true python-versions = ">=3.6" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_jinja2_compat-0.4.1-py3-none-any.whl", hash = "sha256:64ca0d46f0d8029fbe69ea612793a55e6ef0113e1bba4a85d402158c09f17a14"}, {file = "sphinx_jinja2_compat-0.4.1.tar.gz", hash = "sha256:0188f0802d42c3da72997533b55a00815659a78d3f81d4b4747b1fb15a5728e6"}, @@ -4248,6 +4470,7 @@ version = "1.0.2" description = "Check for stylistic and formal issues in .rst and .py files included in the documentation." optional = false python-versions = ">=3.10" +groups = ["lint"] files = [ {file = "sphinx_lint-1.0.2-py3-none-any.whl", hash = "sha256:edcd0fa4d916386c5a3ef7ef0f5136f0bb4a15feefc83c1068ba15bc16eec652"}, {file = "sphinx_lint-1.0.2.tar.gz", hash = "sha256:4e7fc12f44f750b0006eaad237d7db9b1d8aba92adda9c838af891654b371d35"}, @@ -4266,6 +4489,8 @@ version = "1.9.0" description = "Sphinx directive to add unselectable prompt" optional = true python-versions = ">=3.10" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_prompt-1.9.0-py3-none-any.whl", hash = "sha256:fd731446c03f043d1ff6df9f22414495b23067c67011cc21658ea8d36b3575fc"}, {file = "sphinx_prompt-1.9.0.tar.gz", hash = "sha256:471b3c6d466dce780a9b167d9541865fd4e9a80ed46e31b06a52a0529ae995a1"}, @@ -4285,6 +4510,8 @@ version = "3.4.5" description = "Tabbed views for Sphinx" optional = true python-versions = "~=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531"}, {file = "sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09"}, @@ -4305,6 +4532,8 @@ version = "4.1.2" description = "Box of handy tools for Sphinx 🧰 📔" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "sphinx_toolbox-4.1.2-py3-none-any.whl", hash = "sha256:0438f8342ba1c6c0d6e47207f4eac167adba61742e8c2b1dc9624ff955b7bc89"}, {file = "sphinx_toolbox-4.1.2.tar.gz", hash = "sha256:c30a4f86c4c29e97adb0eb9337d35f5093cb96a44f49caffcf7d5bc58a88b781"}, @@ -4340,10 +4569,12 @@ version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] +markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4356,10 +4587,12 @@ version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] +markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4372,10 +4605,12 @@ version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] +markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4388,10 +4623,12 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] +markers = {main = "extra == \"docs\""} [package.extras] test = ["flake8", "mypy", "pytest"] @@ -4402,10 +4639,12 @@ version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] +markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4418,10 +4657,12 @@ version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" +groups = ["main", "lint"] files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] +markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4434,6 +4675,8 @@ version = "3.13.0" description = "Standard library aifc redistribution. \"dead battery\"." optional = true python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66"}, {file = "standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43"}, @@ -4449,6 +4692,8 @@ version = "3.13.0" description = "Standard library chunk redistribution. \"dead battery\"." optional = true python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c"}, {file = "standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654"}, @@ -4460,6 +4705,8 @@ version = "3.10.14" description = "Standard library imghdr redistribution. \"dead battery\"." optional = true python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\" and extra == \"docs\"" files = [ {file = "standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2"}, {file = "standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52"}, @@ -4471,6 +4718,8 @@ version = "3.13.0" description = "Standard library sunau redistribution. \"dead battery\"." optional = true python-versions = "*" +groups = ["main"] +markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_sunau-3.13.0-py3-none-any.whl", hash = "sha256:53af624a9529c41062f4c2fd33837f297f3baa196b0cfceffea6555654602622"}, {file = "standard_sunau-3.13.0.tar.gz", hash = "sha256:b319a1ac95a09a2378a8442f403c66f4fd4b36616d6df6ae82b8e536ee790908"}, @@ -4485,10 +4734,12 @@ version = "0.10.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.10" +groups = ["main", "lint"] files = [ {file = "tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3"}, {file = "tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d"}, ] +markers = {main = "extra == \"docs\""} [package.extras] widechars = ["wcwidth"] @@ -4499,10 +4750,12 @@ version = "1.7.0" description = "module to create simple ASCII tables" optional = false python-versions = "*" +groups = ["main", "test"] files = [ {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, ] +markers = {main = "extra == \"import\""} [[package]] name = "threadpoolctl" @@ -4510,6 +4763,8 @@ version = "3.6.0" description = "threadpoolctl" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"autobpm\"" files = [ {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, @@ -4521,9 +4776,11 @@ version = "2.4.1" description = "Python Port of John Gruber's titlecase.pl" optional = false python-versions = ">=3.7" +groups = ["main", "test"] files = [ {file = "titlecase-2.4.1.tar.gz", hash = "sha256:7d83a277ccbbda11a2944e78a63e5ccaf3d32f828c594312e4862f9a07f635f5"}, ] +markers = {main = "extra == \"titlecase\""} [package.extras] regex = ["regex (>=2020.4.4)"] @@ -4534,6 +4791,7 @@ version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" +groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, @@ -4583,6 +4841,7 @@ files = [ {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] +markers = {main = "extra == \"docs\" and python_version == \"3.10\"", lint = "python_version == \"3.10\"", test = "python_full_version <= \"3.11.0a6\"", typing = "python_version == \"3.10\""} [[package]] name = "types-beautifulsoup4" @@ -4590,6 +4849,7 @@ version = "4.12.0.20250516" description = "Typing stubs for beautifulsoup4" optional = false python-versions = ">=3.9" +groups = ["typing"] files = [ {file = "types_beautifulsoup4-4.12.0.20250516-py3-none-any.whl", hash = "sha256:5923399d4a1ba9cc8f0096fe334cc732e130269541d66261bb42ab039c0376ee"}, {file = "types_beautifulsoup4-4.12.0.20250516.tar.gz", hash = "sha256:aa19dd73b33b70d6296adf92da8ab8a0c945c507e6fb7d5db553415cc77b417e"}, @@ -4604,6 +4864,7 @@ version = "0.22.3.20251115" description = "Typing stubs for docutils" optional = false python-versions = ">=3.9" +groups = ["lint", "typing"] files = [ {file = "types_docutils-0.22.3.20251115-py3-none-any.whl", hash = "sha256:c6e53715b65395d00a75a3a8a74e352c669bc63959e65a207dffaa22f4a2ad6e"}, {file = "types_docutils-0.22.3.20251115.tar.gz", hash = "sha256:0f79ea6a7bd4d12d56c9f824a0090ffae0ea4204203eb0006392906850913e16"}, @@ -4615,6 +4876,7 @@ version = "6.0.0.20260408" description = "Typing stubs for Flask-Cors" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "types_flask_cors-6.0.0.20260408-py3-none-any.whl", hash = "sha256:ccd8801862b3ebd27754734b84fc3dcfebd0f8056380ae88254c7dd799d64a39"}, {file = "types_flask_cors-6.0.0.20260408.tar.gz", hash = "sha256:8c440c158c335819bb9286870c9770687ae6d943510fdd97e4b573324f8d2178"}, @@ -4629,6 +4891,7 @@ version = "1.1.11.20260408" description = "Typing stubs for html5lib" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "types_html5lib-1.1.11.20260408-py3-none-any.whl", hash = "sha256:d18dc4b90d6d6745585790b920db13ede43e1f8ff6ee1ac0ceb0dec4223a06fa"}, {file = "types_html5lib-1.1.11.20260408.tar.gz", hash = "sha256:8a281aa367bc77dbc758358cd9bef79530f2d154eeed9b33705bb035a0dab9e4"}, @@ -4643,6 +4906,7 @@ version = "10.2.0.20240822" description = "Typing stubs for Pillow" optional = false python-versions = ">=3.8" +groups = ["typing"] files = [ {file = "types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3"}, {file = "types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d"}, @@ -4654,6 +4918,7 @@ version = "6.0.12.20260408" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "types_pyyaml-6.0.12.20260408-py3-none-any.whl", hash = "sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384"}, {file = "types_pyyaml-6.0.12.20260408.tar.gz", hash = "sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307"}, @@ -4665,6 +4930,7 @@ version = "2.33.0.20260408" description = "Typing stubs for requests" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "types_requests-2.33.0.20260408-py3-none-any.whl", hash = "sha256:81f31d5ea4acb39f03be7bc8bed569ba6d5a9c5d97e89f45ac43d819b68ca50f"}, {file = "types_requests-2.33.0.20260408.tar.gz", hash = "sha256:95b9a86376807a216b2fb412b47617b202091c3ea7c078f47cc358d5528ccb7b"}, @@ -4679,6 +4945,7 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" +groups = ["typing"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4690,6 +4957,7 @@ version = "0.5.0.20260408" description = "Typing stubs for webencodings" optional = false python-versions = ">=3.10" +groups = ["typing"] files = [ {file = "types_webencodings-0.5.0.20260408-py3-none-any.whl", hash = "sha256:19a2afe5c22d9b1e880b49ff823c7b531f473a390fe47ac903c0bdb5cd677dd9"}, {file = "types_webencodings-0.5.0.20260408.tar.gz", hash = "sha256:28c596619f367e43eee393d85f63e8d2fdb6874c654a8d441c37f8afe29c6d0d"}, @@ -4701,10 +4969,12 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" +groups = ["main", "lint", "test", "typing"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] +markers = {lint = "python_version == \"3.10\""} [[package]] name = "unidecode" @@ -4712,6 +4982,7 @@ version = "1.4.0" description = "ASCII transliterations of Unicode text" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021"}, {file = "Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23"}, @@ -4723,16 +4994,17 @@ version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" +groups = ["main", "lint", "test", "typing"] files = [ {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.2.0)", "brotlicffi (>=1.2.0.0)"] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "webencodings" @@ -4740,6 +5012,8 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"docs\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -4751,10 +5025,12 @@ version = "3.1.8" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" +groups = ["main", "test", "typing"] files = [ {file = "werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50"}, {file = "werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44"}, ] +markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] markupsafe = ">=2.1.1" @@ -4768,6 +5044,8 @@ version = "1.0.4" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.9" +groups = ["main"] +markers = "extra == \"sonosupdate\"" files = [ {file = "xmltodict-1.0.4-py3-none-any.whl", hash = "sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a"}, {file = "xmltodict-1.0.4.tar.gz", hash = "sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61"}, @@ -4805,6 +5083,6 @@ titlecase = ["titlecase"] web = ["flask", "flask-cors"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.10,<3.15" -content-hash = "b9ee78c356acf6de58b8c8e01b550bdd4f64ac48ab7fd4fc162caa91c4b90177" +content-hash = "68a454bcca74688c03221bda48dd26ea19b9cbf5cc1181d0877f1b18ce8773af" diff --git a/pyproject.toml b/pyproject.toml index 084b6cd9d3..8ace7367a6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -48,7 +48,7 @@ colorama = { version = "*", markers = "sys_platform == 'win32'" } confuse = ">=2.2.0" jellyfish = "*" lap = ">=0.5.12" -mediafile = ">=0.16.0" +mediafile = ">=0.16.1" numpy = [ { python = "<3.13", version = ">=2.0.2" }, { python = ">=3.13", version = ">=2.3.5" }, From 480e67c7bfcd77f2bd91bd74770136364bf85d82 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Tue, 14 Apr 2026 12:39:08 -0400 Subject: [PATCH 08/11] Replaced ffmpeg with Python extraction, add docs, and second test --- beets/importer/tasks.py | 42 ++- docs/reference/config.rst | 13 + poetry.lock | 676 +++++++++++--------------------------- test/test_importer.py | 14 +- 4 files changed, 248 insertions(+), 497 deletions(-) diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index 93fc241d4c..e98aaf7eeb 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -900,9 +900,10 @@ def extract(self): def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: - """If 'path' is a WAV file containing an MP3 stream, remix to a - proper MP3 file using ffmpeg and return the new path. Returning None - if the file is not MPEGLAYER3 or if remuxing fails. + """If 'path' is a WAV file containing an MP3 stream + (WAVE_FORMAT_MPEGLAYER3, wFormatTag = 0x0055), extract the MP3 stream + to a new .mp3 file and return its path. Returns None if the file is not + MPEGLAYER3 or if extraction fails. """ try: import mutagen.wave @@ -912,28 +913,35 @@ def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: return None except Exception: return None - mp3_path = os.path.splitext(path)[0] + b".mp3" + try: - util.command_output( - [ - "ffmpeg", - "-i", - util.syspath(path), - "-c:a", - "copy", - "-y", - util.syspath(mp3_path), - ] - ) + with open(util.syspath(path), "rb") as wav_file: + data = wav_file.read() + data_offset = data.find(b"data") + if data_offset == -1: + log.warning( + "Could not find data chunk in MPEGLAYER3 WAV: {}", + util.displayable_path(path), + ) + return None + + # Skip 'data' marker (4 bytes) and chunk size (4 bytes). + mp3_data = data[data_offset + 8 :] + + mp3_path = os.path.splitext(path)[0] + b".mp3" + with open(util.syspath(mp3_path), "wb") as mp3_file: + mp3_file.write(mp3_data) + util.remove(path) log.debug( - "Remuxed MPEGLAYER3 WAV to MP3 and removed original: {}", + "Extracted MP3 stream from MPEGLAYER3 WAV: {}", util.displayable_path(mp3_path), ) return mp3_path + except Exception as exc: log.warning( - "Failed to remux MPEGLAYER3 WAV{}: {}", + "Failed to extract MP3 from MPEGLAYER3 WAV{}: {}", util.displayable_path(path), exc, ) diff --git a/docs/reference/config.rst b/docs/reference/config.rst index 21b6ab3ade..8d827e40ae 100644 --- a/docs/reference/config.rst +++ b/docs/reference/config.rst @@ -903,6 +903,19 @@ FFmpeg) Default: ``no``. +.. _remux_mp3_in_wav: + +remux_mp3_in_wav +~~~~~~~~~~~~~~~~ + +Some WAV files contain MP3 audio streams (``WAVE_FORMAT_MPEGLAYER3``) rather +than the standard PCM format. When this option is enabled, beets will +automatically extract the MP3 stream into a proper ``.mp3`` file during +import, removing the WAV container. The original WAV file is deleted after +successful extraction. + +Default: ``yes``. + .. _match-config: Autotagger Matching Options diff --git a/poetry.lock b/poetry.lock index 4161280970..1ac51b7577 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 2.3.3 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.5 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -6,8 +6,6 @@ version = "0.0.5" description = "A collection of accessible pygments styles" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7"}, {file = "accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872"}, @@ -26,12 +24,10 @@ version = "1.0.0" description = "A light, configurable Sphinx theme" optional = false python-versions = ">=3.10" -groups = ["main", "lint"] files = [ {file = "alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"}, {file = "alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"}, ] -markers = {main = "extra == \"docs\""} [[package]] name = "anyio" @@ -39,12 +35,10 @@ version = "4.13.0" description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708"}, {file = "anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc"}, ] -markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} @@ -60,8 +54,6 @@ version = "1.4.1" description = "Handy tools for working with URLs and APIs." optional = true python-versions = ">=3.6.1" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "apeye-1.4.1-py3-none-any.whl", hash = "sha256:44e58a9104ec189bf42e76b3a7fe91e2b2879d96d48e9a77e5e32ff699c9204e"}, {file = "apeye-1.4.1.tar.gz", hash = "sha256:14ea542fad689e3bfdbda2189a354a4908e90aee4bf84c15ab75d68453d76a36"}, @@ -83,8 +75,6 @@ version = "1.1.5" description = "Core (offline) functionality for the apeye library." optional = true python-versions = ">=3.6.1" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "apeye_core-1.1.5-py3-none-any.whl", hash = "sha256:dc27a93f8c9e246b3b238c5ea51edf6115ab2618ef029b9f2d9a190ec8228fbf"}, {file = "apeye_core-1.1.5.tar.gz", hash = "sha256:5de72ed3d00cc9b20fea55e54b7ab8f5ef8500eb33a5368bc162a5585e238a55"}, @@ -100,8 +90,6 @@ version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"sonosupdate\"" files = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, @@ -113,8 +101,6 @@ version = "0.2.2" description = "LTS Port of Python audioop" optional = true python-versions = ">=3.13" -groups = ["main"] -markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800"}, {file = "audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303"}, @@ -173,8 +159,6 @@ version = "3.1.0" description = "Multi-library, cross-platform audio decoding." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\" or extra == \"chroma\"" files = [ {file = "audioread-3.1.0-py3-none-any.whl", hash = "sha256:b30d1df6c5d3de5dcef0fb0e256f6ea17bdcf5f979408df0297d8a408e2971b4"}, {file = "audioread-3.1.0.tar.gz", hash = "sha256:1c4ab2f2972764c896a8ac61ac53e261c8d29f0c6ccd652f84e18f08a4cab190"}, @@ -195,8 +179,6 @@ version = "0.2.15" description = "Extended sphinx autodoc including automatic autosummaries" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "autodocsumm-0.2.15-py3-none-any.whl", hash = "sha256:dbe6fabcaeae4540748ea9b3443eb76c2692e063d44f004f67c424610a5aca9a"}, {file = "autodocsumm-0.2.15.tar.gz", hash = "sha256:eaf431e7a5a39e41a215311173c8b95e83859059df1ccf3b79c64bf3d5582b3c"}, @@ -211,15 +193,13 @@ version = "2.18.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["main", "lint"] files = [ {file = "babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"}, {file = "babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"}, ] -markers = {main = "extra == \"docs\""} [package.extras] -dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] +dev = ["backports.zoneinfo", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata"] [[package]] name = "backports-zstd" @@ -227,7 +207,6 @@ version = "1.3.0" description = "Backport of compression.zstd" optional = false python-versions = "<3.14,>=3.9" -groups = ["main", "test"] files = [ {file = "backports_zstd-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a2db17a6d9bf6b4dc223b3f6414aa9db6d1afe9de9bff61d582c2934ca456a0"}, {file = "backports_zstd-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a7f16b98ba81780a9517ce6c493e1aea9b7d72de2b1efa08375136c270e1ecba"}, @@ -345,7 +324,6 @@ files = [ {file = "backports_zstd-1.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2524bd6777a828d5e7ccd7bd1a57f9e7007ae654fc2bd1bc1a207f6428674e4a"}, {file = "backports_zstd-1.3.0.tar.gz", hash = "sha256:e8b2d68e2812f5c9970cabc5e21da8b409b5ed04e79b4585dbffa33e9b45ebe2"}, ] -markers = {main = "extra == \"import\" and python_version <= \"3.13\"", test = "python_version <= \"3.13\""} [[package]] name = "beautifulsoup4" @@ -353,12 +331,10 @@ version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" -groups = ["main", "test"] files = [ {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, ] -markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"docs\""} [package.dependencies] soupsieve = ">=1.6.1" @@ -377,7 +353,6 @@ version = "26.3.1" description = "The uncompromising code formatter." optional = false python-versions = ">=3.10" -groups = ["lint"] files = [ {file = "black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2"}, {file = "black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b"}, @@ -422,7 +397,7 @@ typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.10)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2) ; sys_platform != \"win32\"", "winloop (>=0.5.0) ; sys_platform == \"win32\""] +uvloop = ["uvloop (>=0.15.2)", "winloop (>=0.5.0)"] [[package]] name = "blinker" @@ -430,12 +405,10 @@ version = "1.9.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false python-versions = ">=3.9" -groups = ["main", "test", "typing"] files = [ {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"}, {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\""} [[package]] name = "brotli" @@ -443,7 +416,6 @@ version = "1.2.0" description = "Python bindings for the Brotli compression library" optional = false python-versions = "*" -groups = ["main", "test"] files = [ {file = "brotli-1.2.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:99cfa69813d79492f0e5d52a20fd18395bc82e671d5d40bd5a91d13e75e468e8"}, {file = "brotli-1.2.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3ebe801e0f4e56d17cd386ca6600573e3706ce1845376307f5d2cbd32149b69a"}, @@ -546,7 +518,6 @@ files = [ {file = "brotli-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:1ce223652fd4ed3eb2b7f78fbea31c52314baecfac68db44037bb4167062a937"}, {file = "brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a"}, ] -markers = {main = "extra == \"import\" and platform_python_implementation == \"CPython\"", test = "platform_python_implementation == \"CPython\""} [[package]] name = "brotlicffi" @@ -554,7 +525,6 @@ version = "1.2.0.1" description = "Python CFFI bindings to the Brotli library" optional = false python-versions = ">=3.8" -groups = ["main", "test"] files = [ {file = "brotlicffi-1.2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c85e65913cf2b79c57a3fdd05b98d9731d9255dc0cb696b09376cc091b9cddd"}, {file = "brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:535f2d05d0273408abc13fc0eebb467afac17b0ad85090c8913690d40207dac5"}, @@ -572,7 +542,6 @@ files = [ {file = "brotlicffi-1.2.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2a5575653b0672638ba039b82fda56854934d7a6a24d4b8b5033f73ab43cbc1"}, {file = "brotlicffi-1.2.0.1.tar.gz", hash = "sha256:c20d5c596278307ad06414a6d95a892377ea274a5c6b790c2548c009385d621c"}, ] -markers = {main = "extra == \"import\" and platform_python_implementation == \"PyPy\"", test = "platform_python_implementation == \"PyPy\""} [package.dependencies] cffi = [ @@ -586,8 +555,6 @@ version = "0.14.4" description = "httplib2 caching for requests" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b"}, {file = "cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1"}, @@ -609,7 +576,6 @@ version = "2026.2.25" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "lint", "test"] files = [ {file = "certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa"}, {file = "certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7"}, @@ -621,7 +587,6 @@ version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.9" -groups = ["main", "test"] files = [ {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, @@ -708,7 +673,6 @@ files = [ {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] -markers = {main = "(extra == \"import\" or extra == \"autobpm\" or extra == \"reflink\") and platform_python_implementation == \"PyPy\" or extra == \"autobpm\" or extra == \"reflink\"", test = "platform_python_implementation == \"PyPy\""} [package.dependencies] pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} @@ -719,7 +683,6 @@ version = "3.4.7" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "lint", "test"] files = [ {file = "charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d"}, {file = "charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8"}, @@ -858,12 +821,10 @@ version = "8.3.2" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" -groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d"}, {file = "click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -874,7 +835,6 @@ version = "2.1.13" description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -groups = ["test"] files = [ {file = "codecov-2.1.13-py2.py3-none-any.whl", hash = "sha256:c2ca5e51bba9ebb43644c43d0690148a55086f7f5e6fd36170858fa4206744d5"}, {file = "codecov-2.1.13.tar.gz", hash = "sha256:2362b685633caeaf45b9951a9b76ce359cd3581dd515b430c6c3f5dfb4d92a8c"}, @@ -890,12 +850,10 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -markers = {main = "sys_platform == \"win32\" or (extra == \"aura\" or extra == \"web\") and platform_system == \"Windows\"", lint = "platform_system == \"Windows\" or sys_platform == \"win32\"", release = "platform_system == \"Windows\"", test = "platform_system == \"Windows\" or sys_platform == \"win32\"", typing = "platform_system == \"Windows\""} [[package]] name = "confuse" @@ -903,7 +861,6 @@ version = "2.2.0" description = "Painless YAML config files" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "confuse-2.2.0-py3-none-any.whl", hash = "sha256:470c6aa1a5008c8d740267f2ad574e3a715b6dd873c1e5f8778b7f7abb954722"}, {file = "confuse-2.2.0.tar.gz", hash = "sha256:35c1b53e81be125f441bee535130559c935917b26aeaa61289010cd1f55c2b9e"}, @@ -921,7 +878,6 @@ version = "7.13.5" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" -groups = ["lint", "test"] files = [ {file = "coverage-7.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0723d2c96324561b9aa76fb982406e11d93cdb388a7a7da2b16e04719cf7ca5"}, {file = "coverage-7.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52f444e86475992506b32d4e5ca55c24fc88d73bcbda0e9745095b28ef4dc0cf"}, @@ -1035,7 +991,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli ; python_full_version <= \"3.11.0a6\""] +toml = ["tomli"] [[package]] name = "cssutils" @@ -1043,8 +999,6 @@ version = "2.11.1" description = "A CSS Cascading Style Sheets library for Python" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "cssutils-2.11.1-py3-none-any.whl", hash = "sha256:a67bfdfdff4f3867fab43698ec4897c1a828eca5973f4073321b3bccaf1199b1"}, {file = "cssutils-2.11.1.tar.gz", hash = "sha256:0563a76513b6af6eebbe788c3bf3d01c920e46b3f90c8416738c5cfc773ff8e2"}, @@ -1055,7 +1009,7 @@ more-itertools = "*" [package.extras] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -test = ["cssselect", "importlib-resources ; python_version < \"3.9\"", "jaraco.test (>=5.1)", "lxml ; python_version < \"3.11\"", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +test = ["cssselect", "importlib-resources", "jaraco.test (>=5.1)", "lxml", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "dbus-python" @@ -1063,8 +1017,6 @@ version = "1.4.0" description = "Python bindings for libdbus" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"metasync\"" files = [ {file = "dbus-python-1.4.0.tar.gz", hash = "sha256:991666e498f60dbf3e49b8b7678f5559b8a65034fdf61aae62cdecdb7d89c770"}, ] @@ -1079,8 +1031,6 @@ version = "5.2.1" description = "Decorators for Humans" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a"}, {file = "decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360"}, @@ -1092,8 +1042,6 @@ version = "0.3.0.post1" description = "A μ-library for constructing cascading style sheets from Python dictionaries." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "dict2css-0.3.0.post1-py3-none-any.whl", hash = "sha256:f006a6b774c3e31869015122ae82c491fd25e7de4a75607a62aa3e798f837e0d"}, {file = "dict2css-0.3.0.post1.tar.gz", hash = "sha256:89c544c21c4ca7472c3fffb9d37d3d926f606329afdb751dc1de67a411b70719"}, @@ -1109,7 +1057,6 @@ version = "2.0.2" description = "docstrfmt: A formatter for Sphinx flavored reStructuredText." optional = false python-versions = ">=3.10" -groups = ["lint"] files = [ {file = "docstrfmt-2.0.2-py3-none-any.whl", hash = "sha256:acbff3cb00ea85a5c153355b43aeb6d40e0775cfcdbaa1dea42b333b9c8c233d"}, {file = "docstrfmt-2.0.2.tar.gz", hash = "sha256:086e74b03c337c9a932b2f8216aa8c93bb6576b525edfb5d754b6bac841d4166"}, @@ -1138,12 +1085,10 @@ version = "0.21.2" description = "Docutils -- Python Documentation Utilities" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] -markers = {main = "extra == \"docs\""} [[package]] name = "docutils-stubs" @@ -1151,7 +1096,6 @@ version = "0.0.22" description = "PEP 561 type stubs for docutils" optional = false python-versions = ">=3.5" -groups = ["lint"] files = [ {file = "docutils-stubs-0.0.22.tar.gz", hash = "sha256:1736d9650cfc20cff8c72582806c33a5c642694e2df9e430717e7da7e73efbdf"}, {file = "docutils_stubs-0.0.22-py3-none-any.whl", hash = "sha256:157807309de24e8c96af9a13afe207410f1fc6e5aab5d974fd6b9191f04de327"}, @@ -1166,8 +1110,6 @@ version = "3.10.0" description = "Helpful functions for Python 🐍 🛠️" optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "domdf_python_tools-3.10.0-py3-none-any.whl", hash = "sha256:5e71c1be71bbcc1f881d690c8984b60e64298ec256903b3147f068bc33090c36"}, {file = "domdf_python_tools-3.10.0.tar.gz", hash = "sha256:2ae308d2f4f1e9145f5f4ba57f840fbfd1c2983ee26e4824347789649d3ae298"}, @@ -1187,12 +1129,10 @@ version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" -groups = ["main", "test"] files = [ {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] -markers = {main = "(extra == \"lastgenre\" or extra == \"lastimport\") and python_version == \"3.10\"", test = "python_version == \"3.10\""} [package.dependencies] typing-extensions = {version = ">=4.6.0", markers = "python_version < \"3.13\""} @@ -1206,8 +1146,6 @@ version = "3.25.2" description = "A platform independent file lock." optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70"}, {file = "filelock-3.25.2.tar.gz", hash = "sha256:b64ece2b38f4ca29dd3e810287aa8c48182bbecd1ae6e9ae126c9b35f1382694"}, @@ -1219,7 +1157,6 @@ version = "1.2.0" description = "Infer file type and MIME type of any file/buffer. No external dependencies." optional = false python-versions = "*" -groups = ["main"] files = [ {file = "filetype-1.2.0-py2.py3-none-any.whl", hash = "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25"}, {file = "filetype-1.2.0.tar.gz", hash = "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb"}, @@ -1231,12 +1168,10 @@ version = "3.1.3" description = "A simple framework for building complex web applications." optional = false python-versions = ">=3.9" -groups = ["main", "test", "typing"] files = [ {file = "flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c"}, {file = "flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] blinker = ">=1.9.0" @@ -1256,8 +1191,6 @@ version = "6.0.2" description = "A Flask extension simplifying CORS support" optional = true python-versions = "<4.0,>=3.9" -groups = ["main"] -markers = "extra == \"aura\" or extra == \"web\"" files = [ {file = "flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a"}, {file = "flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423"}, @@ -1273,12 +1206,10 @@ version = "0.16.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" optional = false python-versions = ">=3.8" -groups = ["main", "test"] files = [ {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, ] -markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [[package]] name = "html5lib" @@ -1286,8 +1217,6 @@ version = "1.1" description = "HTML parser based on the WHATWG HTML specification" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, @@ -1298,10 +1227,10 @@ six = ">=1.9" webencodings = "*" [package.extras] -all = ["chardet (>=2.2)", "genshi", "lxml ; platform_python_implementation == \"CPython\""] +all = ["chardet (>=2.2)", "genshi", "lxml"] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] -lxml = ["lxml ; platform_python_implementation == \"CPython\""] +lxml = ["lxml"] [[package]] name = "httpcore" @@ -1309,12 +1238,10 @@ version = "1.0.9" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test"] files = [ {file = "httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55"}, {file = "httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8"}, ] -markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] certifi = "*" @@ -1332,12 +1259,10 @@ version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" -groups = ["main", "test"] files = [ {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] -markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] anyio = "*" @@ -1346,7 +1271,7 @@ httpcore = "==1.*" idna = "*" [package.extras] -brotli = ["brotli ; platform_python_implementation == \"CPython\"", "brotlicffi ; platform_python_implementation != \"CPython\""] +brotli = ["brotli", "brotlicffi"] cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] @@ -1358,7 +1283,6 @@ version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.8" -groups = ["main", "lint", "test"] files = [ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, @@ -1373,8 +1297,6 @@ version = "0.2.0" description = "Cross-platform network interface and IP address enumeration library" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"sonosupdate\"" files = [ {file = "ifaddr-0.2.0-py3-none-any.whl", hash = "sha256:085e0305cfe6f16ab12d72e2024030f5d52674afad6911bb1eee207177b8a748"}, {file = "ifaddr-0.2.0.tar.gz", hash = "sha256:cc0cbfcaabf765d44595825fb96a99bb12c79716b73b44330ea38ee2b0c4aed4"}, @@ -1386,12 +1308,10 @@ version = "2.0.0" description = "Get image size from headers (BMP/PNG/JPEG/JPEG2000/GIF/TIFF/SVG/Netpbm/WebP/AVIF/HEIC/HEIF)" optional = false python-versions = "<3.15,>=3.10" -groups = ["main", "lint"] files = [ {file = "imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96"}, {file = "imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3"}, ] -markers = {main = "extra == \"docs\""} [[package]] name = "inflate64" @@ -1399,7 +1319,6 @@ version = "1.0.4" description = "deflate64 compression/decompression library" optional = false python-versions = ">=3.9" -groups = ["main", "test"] files = [ {file = "inflate64-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1a47837d4322e0684824f91eb635aa6fd1967584140c478b0a1aca7b11740d6"}, {file = "inflate64-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8600478542e2354d1ee7b5c57c957006cabacd8b787b4046951f487a2216e5c0"}, @@ -1473,7 +1392,6 @@ files = [ {file = "inflate64-1.0.4-cp39-cp39-win_arm64.whl", hash = "sha256:f5bb6c58c642859ecf5e23178b1e7e4724f3ce968fc49090919d59a5e186f3e6"}, {file = "inflate64-1.0.4.tar.gz", hash = "sha256:b398c686960c029777afc0ed281a86f66adb956cfc3fbf6667cc6453f7b407ce"}, ] -markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "flake8-deprecated", "flake8-isort", "mypy (>=1.10.0)", "mypy_extensions (>=0.4.1)", "pygments", "readme-renderer", "twine"] @@ -1486,7 +1404,6 @@ version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.10" -groups = ["test"] files = [ {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, @@ -1498,12 +1415,10 @@ version = "2.2.0" description = "Safely pass data to untrusted environments and back." optional = false python-versions = ">=3.8" -groups = ["main", "test", "typing"] files = [ {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\""} [[package]] name = "jellyfish" @@ -1511,7 +1426,6 @@ version = "1.2.1" description = "" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "jellyfish-1.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea"}, {file = "jellyfish-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46"}, @@ -1606,12 +1520,10 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "lint", "test", "typing"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\" or extra == \"docs\""} [package.dependencies] MarkupSafe = ">=2.0" @@ -1625,8 +1537,6 @@ version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, @@ -1638,12 +1548,10 @@ version = "1.0.9" description = "Language detection library ported from Google's language-detection." optional = false python-versions = "*" -groups = ["main", "test"] files = [ {file = "langdetect-1.0.9-py2-none-any.whl", hash = "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a"}, {file = "langdetect-1.0.9.tar.gz", hash = "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0"}, ] -markers = {main = "extra == \"fetchart\" or extra == \"lyrics\""} [package.dependencies] six = "*" @@ -1654,7 +1562,6 @@ version = "0.5.13" description = "Linear Assignment Problem solver (LAPJV/LAPMOD)." optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "lap-0.5.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2cc08c4ff49626ba6c1b707f0b02e92cf57a44359e65d9e769acdff1b510eebf"}, {file = "lap-0.5.13-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32cd1d38500da8e1ef51398121f1408ce23890cbc133647a0f665576b127eca7"}, @@ -1729,8 +1636,6 @@ version = "0.5" description = "Makes it easy to load subpackages and functions on demand." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005"}, {file = "lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3"}, @@ -1750,7 +1655,6 @@ version = "1.8.6" description = "A concrete syntax tree with AST-like properties for Python 3.0 through 3.14 programs." optional = false python-versions = ">=3.9" -groups = ["lint"] files = [ {file = "libcst-1.8.6-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a20c5182af04332cc94d8520792befda06d73daf2865e6dddc5161c72ea92cb9"}, {file = "libcst-1.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36473e47cb199b7e6531d653ee6ffed057de1d179301e6c67f651f3af0b499d6"}, @@ -1832,8 +1736,6 @@ version = "0.11.0" description = "Python module for audio and music processing" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "librosa-0.11.0-py3-none-any.whl", hash = "sha256:0b6415c4fd68bff4c29288abe67c6d80b587e0e1e2cfb0aad23e4559504a7fa1"}, {file = "librosa-0.11.0.tar.gz", hash = "sha256:f5ed951ca189b375bbe2e33b2abd7e040ceeee302b9bbaeeffdfddb8d0ace908"}, @@ -1867,8 +1769,6 @@ version = "0.9.0" description = "Mypyc runtime library" optional = false python-versions = ">=3.9" -groups = ["typing"] -markers = "platform_python_implementation != \"PyPy\"" files = [ {file = "librt-0.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f8e12706dcb8ff6b3ed57514a19e45c49ad00bcd423e87b2b2e4b5f64578443"}, {file = "librt-0.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e3dda8345307fd7306db0ed0cb109a63a2c85ba780eb9dc2d09b2049a931f9c"}, @@ -1968,7 +1868,6 @@ version = "0.47.0" description = "lightweight wrapper around basic LLVM functionality" optional = true python-versions = ">=3.10" -groups = ["main"] files = [ {file = "llvmlite-0.47.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41270b0b1310717f717cf6f2a9c68d3c43bd7905c33f003825aebc361d0d1b17"}, {file = "llvmlite-0.47.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f9d118bc1dd7623e0e65ca9ac485ec6dd543c3b77bc9928ddc45ebd34e1e30a7"}, @@ -1999,147 +1898,145 @@ files = [ [[package]] name = "lxml" -version = "6.0.3" +version = "6.0.4" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"sonosupdate\"" -files = [ - {file = "lxml-6.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c524cf8c3b8d71dfc3de6cfb225138a876862a92d88bfa22eb9ff020729d45"}, - {file = "lxml-6.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a10f9967859229cae38b1aa7a96eb655c96b8adc96989b52c5b1f77d963a77a4"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:edccf1157677db1da741d042601754b94af3926310c5763179200718ca738e70"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:20f8caa9beb61a688c4428631cb47fd6e0ba75ef30091cec5fee992138b2be77"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0c88ca5fb307f7e817fc427681126e4712d3452258577bcb4ca86594c934852"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:72d108ef9e39f45c6865ea8a5ba6736c0b1a33ddd6343653775349869e58c30b"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:b044fe3bdb8b68efa33cb5917ae9379f07ec2e416ecd18cf5d333650d6d2fcbb"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:a4dc9f81707b9b56888fa7d3a889ac5219724cf0fbecab90ea5b197faf649534"}, - {file = "lxml-6.0.3-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:59ff244cee0270fc4cf5f2ee920d4493ee88d0bcbc6e8465e9ef01439f1785e7"}, - {file = "lxml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2a49123cc3209ccad7c4c5a4133bcfcfd4875f30461ea4d0aaa84e6608f712c5"}, - {file = "lxml-6.0.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:26cdd7c3f4c3b932b28859d0b70966c2ec8b67c106717d6320121002f8f99025"}, - {file = "lxml-6.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6556b3197bd8a237a16fcd7278d09f094c5777ae36a1435b5e8e488826386d96"}, - {file = "lxml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:87bebd6836e88c0a007f66b89814daf5d7041430eb491c91d1851abc89aa6e93"}, - {file = "lxml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:0b012cf200736d90f828b3ab4206857772c61b710f0a98d3814c7994decb6652"}, - {file = "lxml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:794b42f0112adfa3f23670aba5bc0ac9c9adfcee699c0df129b0186c812ac3ff"}, - {file = "lxml-6.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:ecdded59dc50c0c28f652a98f69a7ada8bd2377248bf48c4a83c81204eb58b33"}, - {file = "lxml-6.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c8184fdb2259bda1db2db9d6e25f667769afc2531830b4fa29f83f66a7872dea"}, - {file = "lxml-6.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4b0f01fb8bdcaf4aa69cf55b2b2f8ef722e4423e1c020e7250dcb89a1d5db38e"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fab00cef83d4f9d76c5e0722346e84bc174b071d68b4f725aeb0bf3877b9e6a6"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f753db5785ce019d7b25bb75638ef5a42a0e208aa9f19933262134e668ca6af"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:27e317e554bc6086a082688ddf137437e5f7f20ffdd736a6f5b4e3ed1ecf1247"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:feb5b9ed7d0510663a78b94f2b417a41c41b42a7bb157ef398ef9d78e6f0fd50"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:51014ee2ab2091dcd9cdef92532f0a1addb7c2cc52a2bd70682e441363de5c0d"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:abc39c4fb67f029400608f9a3a4a3f351ccb3c061b05fd3ad113e4cfbba8a8ee"}, - {file = "lxml-6.0.3-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:38652c280cf50cc5cf955e3d0b691fa6a97046d84407bbae340d8e353f9014ef"}, - {file = "lxml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c3de55b53f69ffa2fcfd897bd8a7e62f0f88a40a8a0c544e171e813f9d4ddbf5"}, - {file = "lxml-6.0.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd4f70e091f2df300396bc9ce36963f90b87611324c2ca750072a6e6375beba2"}, - {file = "lxml-6.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c157bfef4e3b19688eb4da783c5bfabf5a3ac1ac8d317e0906f3feb18d4c89b7"}, - {file = "lxml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8d10a75e4d0a6a9ac2fec2f7ade682f468b51935102c70dab638fa4e94ffcb04"}, - {file = "lxml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:d573b81c29e20b1513afa386a544797a99cecde5497e6c77b6dfa4484112c819"}, - {file = "lxml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:ac63a1ef1899ccadace10ac937c41321672771378374c254e931d001448ae372"}, - {file = "lxml-6.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:10bc4f37c28b4e1b3e901dde66e3a096eb128acf388d5b2962dc2941284293bb"}, - {file = "lxml-6.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ad6952810349cbfb843fe15e8afc580b2712359ae42b1d2b05d097bd48c4aea4"}, - {file = "lxml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b81ec1ecac3be8c1ff1e00ca1c1baf8122e87db9000cd2549963847bd5e3b41"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:448e69211e59c39f398990753d15ba49f7218ec128f64ac8012ef16762e509a3"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6289cb9145fbbc5b0e159c9fcd7fc09446dadc6b60b72c4d1012e80c7c727970"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b68c29aac4788438b07d768057836de47589c7deaa3ad8dc4af488dfc27be388"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50293e024afe5e2c25da2be68c8ceca8618912a0701a73f75b488317c8081aa6"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ac65c08ba1bd90f662cb1d5c79f7ae4c53b1c100f0bb6ec5df1f40ac29028a7e"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:16fbcf06ae534b2fa5bcdc19fcf6abd9df2e74fe8563147d1c5a687a130efed4"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:3a0484bd1e84f82766befcbd71cccd7307dacfe08071e4dbc1d9a9b498d321e8"}, - {file = "lxml-6.0.3-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c137f8c8419c3de93e2998131d94628805f148e52b34da6d7533454e4d78bc2a"}, - {file = "lxml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:775266571f7027b1d77f5fce18a247b24f51a4404bdc1b90ec56be9b1e3801b9"}, - {file = "lxml-6.0.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:aa18653b795d2c273b8676f7ad2ca916d846d15864e335f746658e4c28eb5168"}, - {file = "lxml-6.0.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:cbffd22fc8e4d80454efa968b0c93440a00b8b8a817ce0c29d2c6cb5ad324362"}, - {file = "lxml-6.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:7373ede7ccb89e6f6e39c1423b3a4d4ee48035d3b4619a6addced5c8b48d0ecc"}, - {file = "lxml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e759ff1b244725fef428c6b54f3dab4954c293b2d242a5f2e79db5cc3873de51"}, - {file = "lxml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:f179bae37ad673f57756b59f26833b7922230bef471fdb29492428f152bae8c6"}, - {file = "lxml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:8eeec925ad7f81886d413b3a1f8715551f75543519229a9b35e957771e1826d5"}, - {file = "lxml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:f96bba9a26a064ce9e11099bad12fb08384b64d3acc0acf94bf386ca5cf4f95f"}, - {file = "lxml-6.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:83c1d75e9d124ab82a4ddaf59135112f0dc49526b47355e5928ae6126a68e236"}, - {file = "lxml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b683665d0287308adafc90a5617a51a508d8af8c7040693693bb333b5f4474fe"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ed31e5852cd938704bc6c7a3822cbf84c7fa00ebfa914a1b4e2392d44f45bdfb"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8922a30704a4421d69a19e0499db5861da686c0bccc3a79cf3946e3155cf25f9"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a1adb0e220cb8691202ba9d97646a06292657a122df4b92733861d42f7cf4d2"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:821fd53699eb498990c915ba955a392d07246454c9405e6c1d0692362503013d"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:04b7cedf52e125f86d0d426635e7fbe8e353d4cc272a1757888e3c072424381d"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:9d98063e6ae0da5084ec46952bb0a5ccb5e2cad168e32b4d65d1ec84e4b4ebd4"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:ce01ab3449015358f766a1950b3d818eedf9d4cdec3fa87e4eecaad10c0784db"}, - {file = "lxml-6.0.3-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d38c25bad123d6ce30bb37931d90a4e8a167cd796eeae9cd16c2bfce52718f8e"}, - {file = "lxml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9b8e0779780026979f217603385995202f364adc9807bd21210d81b9f562fc4e"}, - {file = "lxml-6.0.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8c082ad2398664213a4bb5d133e2eb8bf239220b7d6688f8c8ffa9050057501f"}, - {file = "lxml-6.0.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfc80c74233fe01157ab550fb12b9d07a2f1fa7c5900cefb484e3bf02e856fbc"}, - {file = "lxml-6.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c45bdcdc2ca6cf26fddff3faa5de7a2ed7c7f6016b3de80125313a37f972378"}, - {file = "lxml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99457524afd384c330dc51e527976653d543ccadfa815d9f2d92c5911626e536"}, - {file = "lxml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:c8e3b8a54e65393ce1d5c7d9753fe756f0d96089e7163b20ddec3e5bb56a963e"}, - {file = "lxml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:724b26a38cef98d6869d00a33cb66083bee967598e44f6a8e53f1dd283c851b0"}, - {file = "lxml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:f27373113fda6621e4201f529908a24c8a190c2af355aed4711dadca44db4673"}, - {file = "lxml-6.0.3-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8c08926678852a233bf1ef645c4d683d56107f814482f8f41b21ef2c7659790e"}, - {file = "lxml-6.0.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2ce76d113a7c3bf42761ec1de7ca615b0cbf9d8ae478eb1d6c20111d9c9fc098"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83eca62141314d641ebe8089ffa532bbf572ea07dd6255b58c40130d06bb2509"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d8781d812bb8efd47c35651639da38980383ff0d0c1f3269ade23e3a90799079"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19b079e81aa3a31b523a224b0dd46da4f56e1b1e248eef9a599e5c885c788813"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6c055bafdcb53e7f9f75e22c009cd183dd410475e21c296d599531d7f03d1bf5"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f1594a183cee73f9a1dbfd35871c4e04b461f47eeb9bcf80f7d7856b1b136d"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:a6380c5035598e4665272ad3fc86c96ddb2a220d4059cce5ba4b660f78346ad9"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:143ac903fb6c9be6da613390825c8e8bb8c8d71517d43882031f6b9bc89770ef"}, - {file = "lxml-6.0.3-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4fff7d77f440378cd841e340398edf5dbefee334816efbf521bb6e31651e54e"}, - {file = "lxml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:631567ffc3ddb989ccdcd28f6b9fa5aab1ec7fc0e99fe65572b006a6aad347e2"}, - {file = "lxml-6.0.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:38acf7171535ffa7fff1fcec8b82ebd4e55cd02e581efe776928108421accaa1"}, - {file = "lxml-6.0.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:06b9f3ac459b4565bbaa97aa5512aa7f9a1188c662f0108364f288f6daf35773"}, - {file = "lxml-6.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2773dbe2cedee81f2769bd5d24ceb4037706cf032e1703513dd0e9476cd9375f"}, - {file = "lxml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:30c437d8bb9a9a9edff27e85b694342e47a26a6abc249abe00584a4824f9d80d"}, - {file = "lxml-6.0.3-cp314-cp314-win32.whl", hash = "sha256:1b60a3a1205f869bd47874787c792087174453b1a869db4837bf5b3ff92be017"}, - {file = "lxml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:5b6913a68d98c58c673667c864500ba31bc9b0f462effac98914e9a92ebacd2e"}, - {file = "lxml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:1b36a3c73f2a6d9c2bfae78089ca7aedae5c2ee5fd5214a15f00b2f89e558ba7"}, - {file = "lxml-6.0.3-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:239e9a6be3a79c03ec200d26f7bb17a4414704a208059e20050bf161e2d8848a"}, - {file = "lxml-6.0.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:16e5cbaa1a6351f2abefa4072e9aac1f09103b47fe7ab4496d54e5995b065162"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89f8746c206d8cf2c167221831645d6cc2b24464afd9c428a5eb3fd34c584eb1"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5d559a84b2fd583e5bcf8ec4af1ec895f98811684d5fbd6524ea31a04f92d4ad"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7966fbce2d18fde579d5593933d36ad98cc7c8dc7f2b1916d127057ce0415062"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a1f258e6aa0e6eda2c1199f5582c062c96c7d4a28d96d0c4daa79e39b3f2a764"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:738aef404c862d2c3cd951364ee7175c9d50e8290f5726611c4208c0fba8d186"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:5c35e5c3ed300990a46a144d3514465713f812b35dacfa83e928c60db7c90af7"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:4ff774b43712b0cf40d9888a5494ca39aefe990c946511cc947b9fddcf74a29b"}, - {file = "lxml-6.0.3-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d20af2784c763928d0d0879cbc5a3739e4d81eefa0d68962d3478bff4c13e644"}, - {file = "lxml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fdb7786ebefaa0dad0d399dfeaf146b370a14591af2f3aea59e06f931a426678"}, - {file = "lxml-6.0.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c71a387ea133481e725079cff22de45593bf0b834824de22829365ab1d2386c9"}, - {file = "lxml-6.0.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:841b89fc3d910d61c7c267db6bb7dc3a8b3dac240edb66220fcdf96fe70a0552"}, - {file = "lxml-6.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:ac2d6cdafa29672d6a604c641bf67ace3fd0735ec6885501a94943379219ddbf"}, - {file = "lxml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:609bf136a7339aeca2bd4268c7cd190f33d13118975fe9964eda8e5138f42802"}, - {file = "lxml-6.0.3-cp314-cp314t-win32.whl", hash = "sha256:bf98f5f87f6484302e7cce4e2ca5af43562902852063d916c3e2f1c115fdce60"}, - {file = "lxml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d3d65e511e4e656ec67b472110f7a72cbf8547ca15f76fe74cffa4e97412a064"}, - {file = "lxml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:cbc7ce67f85b92db97c92219985432be84dc1ba9a028e68c6933e89551234df2"}, - {file = "lxml-6.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fc6eeeddcee4d985707b3fc29fd6993e256e55798ca600586da68d3f0e04ec5a"}, - {file = "lxml-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9e779a9c3167d2f158c41b6347fbc9e855f6d5561920a33123beb86463c3f46"}, - {file = "lxml-6.0.3-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:911dbd0e87729016402e03533117ffe94147bfbcd7902b76af5854c4b437e096"}, - {file = "lxml-6.0.3-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:f297e9be3bbe59c31cfe5d0f38534510ed95856c480df3e8721b16d46ccaeeac"}, - {file = "lxml-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2d00902610dd91a970a06d5f1a6e4f2426e04a9fa07209d58e09b345e2269267"}, - {file = "lxml-6.0.3-cp38-cp38-win32.whl", hash = "sha256:46c80f7fd5dd7d8c269f6486b165c8f91c489e323f3a767221fb5b4b2b388d5f"}, - {file = "lxml-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:336925309af5ecd9616acbe1c28d68ee0088839b1d42ae7dcc40ffecff959537"}, - {file = "lxml-6.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:353161f166e76f0d8228f8f5216d110601d143a8b6d0fd869230e12c098a5842"}, - {file = "lxml-6.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8ad05bb1fb4aa20ee201ab2f21c3c7571828e4fad525707437bb1c5f5ab6669"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:976b56bd0f4ca72280b4569eb227d012a541860f0d6fcc128ce26d22ef82c845"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:322c825054d02d35755b80dc5c39ba8a71c7c09c43453394a13b9bd8c0abc84c"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c46a246df7fbab1f7b018c7eb361585b295ac95dec806158d9ed1e63b477f05"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8f004d5c601eb50ac29a110632595a4f4c50db81c715d46a43de64ef88246cb"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:33741ec3b4268efffae8ba40f9b64523f4489caf270bde175535e659f03af05a"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:773c22d3de2dd5454b0f89b36d366fa0052f0e924656506c40462d8107acd00f"}, - {file = "lxml-6.0.3-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b29300eeaadf85df7f2df4bb29cadfb13b9600d1bb8053f35d82d96f9e6d088a"}, - {file = "lxml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:61399a5b01d74ec5f009762c74ab6ebf387e58393fc5d78368e12d4f577fea29"}, - {file = "lxml-6.0.3-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:4723da3e8f4281853c2eaab161b69cc14bc9b0811be4cfa5a1de36df47e0c660"}, - {file = "lxml-6.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:8341c446fca7f6be003c60aededf2f23a53d4881cf7e0bafb9cef69c217ae26a"}, - {file = "lxml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:809726d4c72f1a902556df822c3acc5780053a12a05e16eac999392b30984c06"}, - {file = "lxml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:d1f14c1006722824c3f2158d147e520a82460b47ffdc2a84e444b3d244b65e4d"}, - {file = "lxml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:d8a8129bd502de138cdde22eac3990bde8a4efbafc72596baab67a495c48c974"}, - {file = "lxml-6.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:fddcf558bcb7a40993fb9e3ae3752d5d3a656479c71687799e43063563a2e68a"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:093786037b934ef4747b0e8a0e1599fe7df7dd8246e7f07d43bba1c4c8bd7b84"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6364aa77b13e04459df6a9d2b806465287e7540955527e75ebd5fda48532913d"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:955550c78afb2be47755bd1b8153724292a5b539cf3f21665b310c145d08e6f8"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a9a79144a8051bc5fbb223fac895b87eb67b361f27b00c2ed4a07ee34246b90"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8243937d4673b46da90b4f5ea2627fd26842225e62e885828fdb8133aa1f7b32"}, - {file = "lxml-6.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:5892d2ef99449ebd8e30544af5bc61fd9c30e9e989093a10589766422f6c5e1a"}, - {file = "lxml-6.0.3.tar.gz", hash = "sha256:a1664c5139755df44cab3834f4400b331b02205d62d3fdcb1554f63439bf3372"}, +files = [ + {file = "lxml-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4a2c26422c359e93d97afd29f18670ae2079dbe2dd17469f1e181aa6699e96a7"}, + {file = "lxml-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e3b455459e5ed424a4cc277cd085fc1a50a05b940af30703a13a8ec0932d6a69"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3109bdeb9674abbc4d8bd3fd273cce4a4087a93f31c17dc321130b71384992e5"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d41f733476eecf7a919a1b909b12e67f247564b21c2b5d13e5f17851340847da"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:717e702b07b512aca0f09d402896e476cfdc1db12bca0441210b1a36fdddb6dd"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ad61a5fb291e45bb1d680b4de0c99e28547bd249ec57d60e3e59ebe6628a01f"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:2c75422b742dd70cc2b5dbffb181ac093a847b338c7ca1495d92918ae35eabae"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:28df3bd54561a353ce24e80c556e993b397a41a6671d567b6c9bee757e1bf894"}, + {file = "lxml-6.0.4-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8d7db1fa5f95a8e4fcf0462809f70e536c3248944ddeba692363177ac6b44f2b"}, + {file = "lxml-6.0.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8fdae368cb2deb4b2476f886c107aecaaea084e97c0bc0a268861aa0dd2b7237"}, + {file = "lxml-6.0.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:14e4af403766322522440863ca55a9561683b4aedf828df6726b8f83de14a17f"}, + {file = "lxml-6.0.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c4633c39204e97f36d68deff76471a0251afe8a82562034e4eda63673ee62d36"}, + {file = "lxml-6.0.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a72e2e31dbc3c35427486402472ca5d8ca2ef2b33648ed0d1b22de2a96347b76"}, + {file = "lxml-6.0.4-cp310-cp310-win32.whl", hash = "sha256:15f135577ffb6514b40f02c00c1ba0ca6305248b1e310101ca17787beaf4e7ad"}, + {file = "lxml-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:fd7f6158824b8bc1e96ae87fb14159553be8f7fa82aec73e0bdf98a5af54290c"}, + {file = "lxml-6.0.4-cp310-cp310-win_arm64.whl", hash = "sha256:5ff4d73736c80cb9470c8efa492887e4e752a67b7fd798127794e2be103ebef1"}, + {file = "lxml-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3602d57fdb6f744f4c5d0bd49513fe5abbced08af85bba345fc354336667cd47"}, + {file = "lxml-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8c7976c384dcab4bca42f371449fb711e20f1bfce99c135c9b25614aed80e55"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:579e20c120c3d231e53f0376058e4e1926b71ca4f7b77a7a75f82aea7a9b501e"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f32a27be5fb286febd16c0d13d4a3aee474d34417bd172e64d76c6a28e2dc14"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d53b7cdaa961a4343312964f6c5a150d075a55e95e1338078d413bf38eba8c0"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d4cc697347f6c61764b58767109e270d0b4a92aba4a8053a967ed9de23a5ea9"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:108b8d6da624133eaa1a6a5bbcb1f116b878ea9fd050a1724792d979251706fb"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:c087d643746489df06fe3ac03460d235b4b3ae705e25838257510c79f834e50f"}, + {file = "lxml-6.0.4-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2063c486f80c32a576112201c93269a09ebeca5b663092112c5fb39b32556340"}, + {file = "lxml-6.0.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ff016e86ec14ae96253a3834302e0e89981956b73e4e74617eeba4a6a81da08b"}, + {file = "lxml-6.0.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:0e9ba5bcd75efb8cb4613463e6cfb55b5a76d4143e4cfa06ea027bc6cc696a3e"}, + {file = "lxml-6.0.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:9a69668bef9268f54a92f2254917df530ca4630a621027437f0e948eb1937e7b"}, + {file = "lxml-6.0.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:280f8e7398bdc48c7366ad375a5586692cd73b269d9e82e6898f9ada70dc0bcb"}, + {file = "lxml-6.0.4-cp311-cp311-win32.whl", hash = "sha256:a8eddf3c705e00738db695a9a77830f8d57f7d21a54954fbef23a1b8806384ed"}, + {file = "lxml-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:b74d5b391fc49fc3cc213c930f87a7dedf2b4b0755aae4638e91e4501e278430"}, + {file = "lxml-6.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:2f0cf04bafc14b0eebfbc3b5b73b296dd76b5d7640d098c02e75884bb0a70f2b"}, + {file = "lxml-6.0.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:af0b8459c4e21a8417db967b2e453d1855022dac79c79b61fb8214f3da50f17e"}, + {file = "lxml-6.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e0cdcea2affa53fa17dc4bf5cefc0edf72583eac987d669493a019998a623fa3"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8da4d4840c1bc07da6fcd647784f7fbaf538eeb7a57ce6b2487acc54c5e33330"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fb04a997588c3980894ded9172c10c5a3e45d3f1c5410472733626d268683806"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca449642a08a6ceddf6e6775b874b6aee1b6242ed80aea84124497aba28e5384"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35b3ccdd137e62033662787dd4d2b8be900c686325d6b91e3b1ff6213d05ba11"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45dc690c54b1341fec01743caed02e5f1ea49d7cfb81e3ba48903e5e844ed68a"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:15ae922e8f74b05798a0e88cee46c0244aaec6a66b5e00be7d18648fed8c432e"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:ebd816653707fbf10c65e3dee3bc24dac6b691654c21533b1ae49287433f4db0"}, + {file = "lxml-6.0.4-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:21284cf36b95dd8be774eb06c304b440cf49ee811800a30080ce6d93700f0383"}, + {file = "lxml-6.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0c08a2a9d0c4028ef5fc5a513b2e1e51af069a83c5b4206139edd08b3b8c2926"}, + {file = "lxml-6.0.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1bc2f0f417112cf1a428599dd58125ab74d8e1c66893efd9b907cbb4a5db6e44"}, + {file = "lxml-6.0.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c0d86e328405529bc93913add9ff377e8b8ea9be878e611f19dbac7766a84483"}, + {file = "lxml-6.0.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3cce9420fe8f91eae5d457582599d282195c958cb670aa4bea313a79103ba33f"}, + {file = "lxml-6.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:96214985ec194ce97b9028414e179cfb21230cba4e2413aee7e249461bb84f4d"}, + {file = "lxml-6.0.4-cp312-cp312-win32.whl", hash = "sha256:b2209b310e7ed1d4cd1c00d405ec9c49722fce731c7036abc1d876bf8df78139"}, + {file = "lxml-6.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03affcacfba4671ebc305813b02bfaf34d80b6a7c5b23eafc5d6da14a1a6e623"}, + {file = "lxml-6.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:af9678e3a2a047465515d95a61690109af7a4c9486f708249119adcef7861049"}, + {file = "lxml-6.0.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ecc3d55ed756ee6c3447748862a97e1f5392d2c5d7f474bace9382345e4fc274"}, + {file = "lxml-6.0.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7d5a627a368a0e861350ccc567a70ec675d2bc4d8b3b54f48995ae78d8d530e"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d385141b186cc39ebe4863c1e41936282c65df19b2d06a701dedc2a898877d6a"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0132bb040e9bb5a199302e12bf942741defbc52922a2a06ce9ff7be0d0046483"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26aee5321e4aa1f07c9090a35f6ab8b703903fb415c6c823cfdb20ee0d779855"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5652455de198ff76e02cfa57d5efc5f834fa45521aaf3fcc13d6b5a88bde23d"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75842801fb48aea73f4c281b923a010dfb39bad75edf8ceb2198ec30c27f01cc"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_28_i686.whl", hash = "sha256:94a1f74607a5a049ff6ff8de429fec922e643e32b5b08ec7a4fe49e8de76e17c"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:173cc246d3d3b6d3b6491f0b3aaf22ebdf2eed616879482acad8bd84d73eb231"}, + {file = "lxml-6.0.4-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f0f2ee1be1b72e9890da87e4e422f2f703ff4638fd5ec5383055db431e8e30e9"}, + {file = "lxml-6.0.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c51a274b7e8b9ce394c3f8b471eb0b23c1914eec64fdccf674e082daf72abf11"}, + {file = "lxml-6.0.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:210ea934cba1a1ec42f88c4190c4d5c67b2d14321a8faed9b39e8378198ff99d"}, + {file = "lxml-6.0.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:14fe654a59eebe16368c51778caeb0c8fda6f897adcd9afe828d87d13b5d5e51"}, + {file = "lxml-6.0.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ec160a2b7e2b3cb71ec35010b19a1adea05785d19ba5c9c5f986b64b78fef564"}, + {file = "lxml-6.0.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d305b86ef10b23cf3a6d62a2ad23fa296f76495183ee623f64d2600f65ffe09c"}, + {file = "lxml-6.0.4-cp313-cp313-win32.whl", hash = "sha256:a2f31380aa9a9b52591e79f1c1d3ac907688fbeb9d883ba28be70f2eb5db2277"}, + {file = "lxml-6.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:b8efa9f681f15043e497293d58a4a63199564b253ed2291887d92bb3f74f59ab"}, + {file = "lxml-6.0.4-cp313-cp313-win_arm64.whl", hash = "sha256:905abe6a5888129be18f85f2aea51f0c9863fa0722fb8530dfbb687d2841d221"}, + {file = "lxml-6.0.4-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:569d3b18340863f603582d2124e742a68e85755eff5e47c26a55e298521e3a01"}, + {file = "lxml-6.0.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3b6245ee5241342d45e1a54a4a8bc52ef322333ada74f24aa335c4ab36f20161"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:79a1173ba3213a3693889a435417d4e9f3c07d96e30dc7cc3a712ed7361015fe"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc18bb975666b443ba23aedd2fcf57e9d0d97546b52a1de97a447c4061ba4110"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2079f5dc83291ac190a52f8354b78648f221ecac19fb2972a2d056b555824de7"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3eda02da4ca16e9ca22bbe5654470c17fa1abcd967a52e4c2e50ff278221e351"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c3787cdc3832b70e21ac2efafea2a82a8ccb5e85bec110dc68b26023e9d3caae"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_28_i686.whl", hash = "sha256:3f276d49c23103565d39440b9b3f4fc08fa22f5a96395ea4b4d4fea4458b1505"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:fdfdad73736402375b11b3a137e48cd09634177516baf5fc0bd80d1ca85f3cda"}, + {file = "lxml-6.0.4-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75912421456946931daba0ec3cedfa824c756585d05bde97813a17992bfbd013"}, + {file = "lxml-6.0.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:48cd5a88da67233fd82f2920db344503c2818255217cd6ea462c9bb8254ba7cb"}, + {file = "lxml-6.0.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:87af86a8fa55b9ff1e6ee4233d762296f2ce641ba948af783fb995c5a8a3371b"}, + {file = "lxml-6.0.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a743714cd656ba7ccb29d199783906064c7b5ba3c0e2a79f0244ea0badc6a98c"}, + {file = "lxml-6.0.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e31c76bd066fb4f81d9a32e5843bffdf939ab27afb1ffc1c924e749bfbdb00e3"}, + {file = "lxml-6.0.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f185fd6e7d550e9917d7103dccf51be589aba953e15994fb04646c1730019685"}, + {file = "lxml-6.0.4-cp314-cp314-win32.whl", hash = "sha256:774660028f8722a598400430d2746fb0075949f84a9a5cd9767d9152e3baaac5"}, + {file = "lxml-6.0.4-cp314-cp314-win_amd64.whl", hash = "sha256:fbd7d14349413f5609c0b537b1a48117d6ccef1af37986af6b03766ad05bf43e"}, + {file = "lxml-6.0.4-cp314-cp314-win_arm64.whl", hash = "sha256:a61a01ec3fbfd5b73a69a7bf513271051fd6c5795d82fc5daa0255934cd8db3d"}, + {file = "lxml-6.0.4-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:504edb62df33cea502ea6e73847c647ba228623ca3f80a228be5723a70984dd5"}, + {file = "lxml-6.0.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:f01b7b0316d4c0926d49a7f003b2d30539f392b140a3374bb788bad180bc8478"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ab999933e662501efe4b16e6cfb7c9f9deca7d072cd1788b99c8defde78c0dfb"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67c3f084389fe75932c39b6869a377f6c8e21e818f31ae8a30c71dd2e59360e2"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:377ea1d654f76ed6205c87d14920f829c9f4d31df83374d3cbcbdaae804d37b2"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e60cd0bcacbfd1a96d63516b622183fb2e3f202300df9eb5533391a8a939dbfa"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e9e30fd63d41dd0bbdb020af5cdfffd5d9b554d907cb210f18e8fcdc8eac013"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_28_i686.whl", hash = "sha256:1fb4a1606bb68c533002e7ed50d7e55e58f0ef1696330670281cb79d5ab2050d"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:695c7708438e449d57f404db8cc1b769e77ad5b50655f32f8175686ba752f293"}, + {file = "lxml-6.0.4-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d49c35ae1e35ee9b569892cf8f8f88db9524f28d66e9daee547a5ef9f3c5f468"}, + {file = "lxml-6.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5801072f8967625e6249d162065d0d6011ef8ce3d0efb8754496b5246b81a74b"}, + {file = "lxml-6.0.4-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cbf768541526eba5ef1a49f991122e41b39781eafd0445a5a110fc09947a20b5"}, + {file = "lxml-6.0.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eecce87cc09233786fc31c230268183bf6375126cfec1c8b3673fcdc8767b560"}, + {file = "lxml-6.0.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:07dce892881179e11053066faca2da17b0eeb0bb7298f11bcf842a86db207dbd"}, + {file = "lxml-6.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e4f97aee337b947e6699e5574c90d087d3e2ce517016241c07e7e98a28dca885"}, + {file = "lxml-6.0.4-cp314-cp314t-win32.whl", hash = "sha256:064477c0d4c695aa1ea4b9c1c4ee9043ab740d12135b74c458cc658350adcd86"}, + {file = "lxml-6.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:25bad2d8438f4ef5a7ad4a8d8bcaadde20c0daced8bdb56d46236b0a7d1cbdd0"}, + {file = "lxml-6.0.4-cp314-cp314t-win_arm64.whl", hash = "sha256:1dcd9e6cb9b7df808ea33daebd1801f37a8f50e8c075013ed2a2343246727838"}, + {file = "lxml-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a656d1a26d5b2ef3948a092e0de31de8f5853c28845648996247d1b1b1fc9e7c"}, + {file = "lxml-6.0.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6eb6569faca207c7ef23dd52ee814a4d4607d71ab8e32bc106210990a201078f"}, + {file = "lxml-6.0.4-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7062d40efa3dfa04762901183b836ce15c07ed08d5c0d5c17e5b7bfea1527f5"}, + {file = "lxml-6.0.4-cp38-cp38-manylinux_2_28_i686.whl", hash = "sha256:fe4bcbad99274188c95160f06bde838ac0b043638bc58055426c43ec15ca417e"}, + {file = "lxml-6.0.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8a6e8fff7c29d4b43bf2038b02c8b33bb3a8894aa8a8acd5e5211b24990c14b2"}, + {file = "lxml-6.0.4-cp38-cp38-win32.whl", hash = "sha256:d9ac41f0dbab4adde2e687bfd6a7dff9ed861e2b83954112bc8048fc1cd354d0"}, + {file = "lxml-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:dee11e611b6434c49d35ad3d050371dc33b59a381685628cc74fa7b6647a2802"}, + {file = "lxml-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9a572e7c0b333d1330a8e2a98d9943e767b7bd91bb116928c8a556d8d17017fc"}, + {file = "lxml-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ed12ec0b1be37a7ed5395a9d236e7242b9f36a52c668d299c41b00a141ca7c5b"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6ddceb1bad7f23d0bab0de9c938c03ed3c1dae64c3414ae7d04f0a9a45a20ae1"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9a0f5edd2b5026f0ca4f62e22ee7fa051e85554c3b1dff415ada421eb6710aa6"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dee75f5601f3b1c27ad3255054b8e49339fa2b9f08cb2941f61d2be85857a4ce"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee2a470a1be95c3df59eb7264315b767749a7b7377a7e555ffc70c9d51bee8e0"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux_2_28_i686.whl", hash = "sha256:ab8a666bbc77951dd9670301562e00027f4b184fd234d4106038d92617dcc0a7"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:047ffa723e412c06fe30759e04620288c6e27049b4bc1ff2714239285bafb162"}, + {file = "lxml-6.0.4-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dd9cce7e3f691eaf0c55c37946956bfdfc9e3b68adf046894932c22ab2d71781"}, + {file = "lxml-6.0.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:371c1b831c2270fcb1a0485a6d8009ac2bdd78a21bbdd244fc586161fcde2c8e"}, + {file = "lxml-6.0.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:78388b66a5767aa3698f3b248bb46dcd2310865255bfbecf0c7788087457216d"}, + {file = "lxml-6.0.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:5d1d7274f79e4eaefe36abf1126f35413859d14c45a5c19424a71b77b2a55394"}, + {file = "lxml-6.0.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4fc4bc3743e4db7df4a0d36528cef12fb9c00b32cff23087d8c6878901c3206e"}, + {file = "lxml-6.0.4-cp39-cp39-win32.whl", hash = "sha256:169d2b2b7c4493abd82da422d23b5c63ae24317c8796d10e9dca78b2e27c05ac"}, + {file = "lxml-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:b06d15ca2f04a9cbddaed758a6027518bc557bcb05eb7b006e00af8bb8638e4f"}, + {file = "lxml-6.0.4-cp39-cp39-win_arm64.whl", hash = "sha256:931bac5346db22adeaa0297444717a46072c8af459e44b4c5cfe24bd45f8b51e"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b29bcca95e82cd201d16c2101085faa2669838f4697fd914b7124a6c77032f80"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a95e29710ecdf99b446990144598f6117271cb2ec19fd45634aa087892087077"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13085e0174e9c9fa4eb5a6bdfb81646d1f7be07e5895c958e89838afb77630c6"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e205c4869a28ec4447375333072978356cd0eeadd0412c643543238e638b89a3"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aec26080306a66ad5c62fad0053dd2170899b465137caca7eac4b72bda3588bf"}, + {file = "lxml-6.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3912221f41d96283b10a7232344351c8511e31f18734c752ed4798c12586ea35"}, + {file = "lxml-6.0.4.tar.gz", hash = "sha256:4137516be2a90775f99d8ef80ec0283f8d78b5d8bd4630ff20163b72e7e9abf2"}, ] [package.extras] @@ -2154,7 +2051,6 @@ version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "lint", "test", "typing"] files = [ {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, @@ -2246,7 +2142,6 @@ files = [ {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\" or extra == \"docs\""} [[package]] name = "mediafile" @@ -2254,7 +2149,6 @@ version = "0.16.1" description = "A simple, cross-format library for reading and writing media file metadata." optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "mediafile-0.16.1-py3-none-any.whl", hash = "sha256:dc00407d8172fb6c293b65f95aeabdf6ada99c1f0891525f8e7bf9c9179c2483"}, {file = "mediafile-0.16.1.tar.gz", hash = "sha256:0d8856fc41fe66b6f70d0eec3c3a4146bdfa04defe2a930bd12f11df55d71a6f"}, @@ -2273,8 +2167,6 @@ version = "11.0.2" description = "More routines for operating on iterables, beyond itertools" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "more_itertools-11.0.2-py3-none-any.whl", hash = "sha256:6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4"}, {file = "more_itertools-11.0.2.tar.gz", hash = "sha256:392a9e1e362cbc106a2457d37cabf9b36e5e12efd4ebff1654630e76597df804"}, @@ -2286,8 +2178,6 @@ version = "1.1.2" description = "MessagePack serializer" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\" or extra == \"docs\"" files = [ {file = "msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2"}, {file = "msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87"}, @@ -2359,12 +2249,10 @@ version = "0.2.3" description = "multi volume file wrapper library" optional = false python-versions = ">=3.6" -groups = ["main", "test"] files = [ {file = "multivolumefile-0.2.3-py3-none-any.whl", hash = "sha256:237f4353b60af1703087cf7725755a1f6fcaeeea48421e1896940cd1c920d678"}, {file = "multivolumefile-0.2.3.tar.gz", hash = "sha256:a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6"}, ] -markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "isort (>=5.0.3)", "pygments", "readme-renderer", "twine"] @@ -2377,7 +2265,6 @@ version = "1.47.0" description = "read and write audio tags for many formats" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719"}, {file = "mutagen-1.47.0.tar.gz", hash = "sha256:719fadef0a978c31b4cf3c956261b3c58b6948b32023078a2117b1de09f0fc99"}, @@ -2385,56 +2272,55 @@ files = [ [[package]] name = "mypy" -version = "1.20.0" +version = "1.20.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.10" -groups = ["typing"] -files = [ - {file = "mypy-1.20.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99f515f95fd03a90875fdb2cca12ff074aa04490db4d190905851bdf8a549a8"}, - {file = "mypy-1.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bd0212976dc57a5bfeede7c219e7cd66568a32c05c9129686dd487c059c1b88a"}, - {file = "mypy-1.20.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8426d4d75d68714abc17a4292d922f6ba2cfb984b72c2278c437f6dae797865"}, - {file = "mypy-1.20.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02cca0761c75b42a20a2757ae58713276605eb29a08dd8a6e092aa347c4115ca"}, - {file = "mypy-1.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b3a49064504be59e59da664c5e149edc1f26c67c4f8e8456f6ba6aba55033018"}, - {file = "mypy-1.20.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebea00201737ad4391142808ed16e875add5c17f676e0912b387739f84991e13"}, - {file = "mypy-1.20.0-cp310-cp310-win_arm64.whl", hash = "sha256:e80cf77847d0d3e6e3111b7b25db32a7f8762fd4b9a3a72ce53fe16a2863b281"}, - {file = "mypy-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4525e7010b1b38334516181c5b81e16180b8e149e6684cee5a727c78186b4e3b"}, - {file = "mypy-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a17c5d0bdcca61ce24a35beb828a2d0d323d3fcf387d7512206888c900193367"}, - {file = "mypy-1.20.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75ff57defcd0f1d6e006d721ccdec6c88d4f6a7816eb92f1c4890d979d9ee62"}, - {file = "mypy-1.20.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b503ab55a836136b619b5fc21c8803d810c5b87551af8600b72eecafb0059cb0"}, - {file = "mypy-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1973868d2adbb4584a3835780b27436f06d1dc606af5be09f187aaa25be1070f"}, - {file = "mypy-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:2fcedb16d456106e545b2bfd7ef9d24e70b38ec252d2a629823a4d07ebcdb69e"}, - {file = "mypy-1.20.0-cp311-cp311-win_arm64.whl", hash = "sha256:379edf079ce44ac8d2805bcf9b3dd7340d4f97aad3a5e0ebabbf9d125b84b442"}, - {file = "mypy-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:002b613ae19f4ac7d18b7e168ffe1cb9013b37c57f7411984abbd3b817b0a214"}, - {file = "mypy-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9336b5e6712f4adaf5afc3203a99a40b379049104349d747eb3e5a3aa23ac2e"}, - {file = "mypy-1.20.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f13b3e41bce9d257eded794c0f12878af3129d80aacd8a3ee0dee51f3a978651"}, - {file = "mypy-1.20.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9804c3ad27f78e54e58b32e7cb532d128b43dbfb9f3f9f06262b821a0f6bd3f5"}, - {file = "mypy-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:697f102c5c1d526bdd761a69f17c6070f9892eebcb94b1a5963d679288c09e78"}, - {file = "mypy-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ecd63f75fdd30327e4ad8b5704bd6d91fc6c1b2e029f8ee14705e1207212489"}, - {file = "mypy-1.20.0-cp312-cp312-win_arm64.whl", hash = "sha256:f194db59657c58593a3c47c6dfd7bad4ef4ac12dbc94d01b3a95521f78177e33"}, - {file = "mypy-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b20c8b0fd5877abdf402e79a3af987053de07e6fb208c18df6659f708b535134"}, - {file = "mypy-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:367e5c993ba34d5054d11937d0485ad6dfc60ba760fa326c01090fc256adf15c"}, - {file = "mypy-1.20.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f799d9db89fc00446f03281f84a221e50018fc40113a3ba9864b132895619ebe"}, - {file = "mypy-1.20.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555658c611099455b2da507582ea20d2043dfdfe7f5ad0add472b1c6238b433f"}, - {file = "mypy-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:efe8d70949c3023698c3fca1e94527e7e790a361ab8116f90d11221421cd8726"}, - {file = "mypy-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:f49590891d2c2f8a9de15614e32e459a794bcba84693c2394291a2038bbaaa69"}, - {file = "mypy-1.20.0-cp313-cp313-win_arm64.whl", hash = "sha256:76a70bf840495729be47510856b978f1b0ec7d08f257ca38c9d932720bf6b43e"}, - {file = "mypy-1.20.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0f42dfaab7ec1baff3b383ad7af562ab0de573c5f6edb44b2dab016082b89948"}, - {file = "mypy-1.20.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:31b5dbb55293c1bd27c0fc813a0d2bb5ceef9d65ac5afa2e58f829dab7921fd5"}, - {file = "mypy-1.20.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49d11c6f573a5a08f77fad13faff2139f6d0730ebed2cfa9b3d2702671dd7188"}, - {file = "mypy-1.20.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d3243c406773185144527f83be0e0aefc7bf4601b0b2b956665608bf7c98a83"}, - {file = "mypy-1.20.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a79c1eba7ac4209f2d850f0edd0a2f8bba88cbfdfefe6fb76a19e9d4fe5e71a2"}, - {file = "mypy-1.20.0-cp314-cp314-win_amd64.whl", hash = "sha256:00e047c74d3ec6e71a2eb88e9ea551a2edb90c21f993aefa9e0d2a898e0bb732"}, - {file = "mypy-1.20.0-cp314-cp314-win_arm64.whl", hash = "sha256:931a7630bba591593dcf6e97224a21ff80fb357e7982628d25e3c618e7f598ef"}, - {file = "mypy-1.20.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:26c8b52627b6552f47ff11adb4e1509605f094e29815323e487fc0053ebe93d1"}, - {file = "mypy-1.20.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:39362cdb4ba5f916e7976fccecaab1ba3a83e35f60fa68b64e9a70e221bb2436"}, - {file = "mypy-1.20.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:34506397dbf40c15dc567635d18a21d33827e9ab29014fb83d292a8f4f8953b6"}, - {file = "mypy-1.20.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:555493c44a4f5a1b58d611a43333e71a9981c6dbe26270377b6f8174126a0526"}, - {file = "mypy-1.20.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2721f0ce49cb74a38f00c50da67cb7d36317b5eda38877a49614dc018e91c787"}, - {file = "mypy-1.20.0-cp314-cp314t-win_amd64.whl", hash = "sha256:47781555a7aa5fedcc2d16bcd72e0dc83eb272c10dd657f9fb3f9cc08e2e6abb"}, - {file = "mypy-1.20.0-cp314-cp314t-win_arm64.whl", hash = "sha256:c70380fe5d64010f79fb863b9081c7004dd65225d2277333c219d93a10dad4dd"}, - {file = "mypy-1.20.0-py3-none-any.whl", hash = "sha256:a6e0641147cbfa7e4e94efdb95c2dab1aff8cfc159ded13e07f308ddccc8c48e"}, - {file = "mypy-1.20.0.tar.gz", hash = "sha256:eb96c84efcc33f0b5e0e04beacf00129dd963b67226b01c00b9dfc8affb464c3"}, +files = [ + {file = "mypy-1.20.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3ba5d1e712ada9c3b6223dcbc5a31dac334ed62991e5caa17bcf5a4ddc349af0"}, + {file = "mypy-1.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e731284c117b0987fb1e6c5013a56f33e7faa1fce594066ab83876183ce1c66"}, + {file = "mypy-1.20.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8e945b872a05f4fbefabe2249c0b07b6b194e5e11a86ebee9edf855de09806c"}, + {file = "mypy-1.20.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fc88acef0dc9b15246502b418980478c1bfc9702057a0e1e7598d01a7af8937"}, + {file = "mypy-1.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:14911a115c73608f155f648b978c5055d16ff974e6b1b5512d7fedf4fa8b15c6"}, + {file = "mypy-1.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:76d9b4c992cca3331d9793ef197ae360ea44953cf35beb2526e95b9e074f2866"}, + {file = "mypy-1.20.1-cp310-cp310-win_arm64.whl", hash = "sha256:b408722f80be44845da555671a5ef3a0c63f51ca5752b0c20e992dc9c0fbd3cd"}, + {file = "mypy-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c01eb9bac2c6a962d00f9d23421cd2913840e65bba365167d057bd0b4171a92e"}, + {file = "mypy-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55d12ddbd8a9cac5b276878bd534fa39fff5bf543dc6ae18f25d30c8d7d27fca"}, + {file = "mypy-1.20.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0aa322c1468b6cdfc927a44ce130f79bb44bcd34eb4a009eb9f96571fd80955"}, + {file = "mypy-1.20.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f8bc95899cf676b6e2285779a08a998cc3a7b26f1026752df9d2741df3c79e8"}, + {file = "mypy-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:47c2b90191a870a04041e910277494b0d92f0711be9e524d45c074fe60c00b65"}, + {file = "mypy-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:9857dc8d2ec1a392ffbda518075beb00ac58859979c79f9e6bdcb7277082c2f2"}, + {file = "mypy-1.20.1-cp311-cp311-win_arm64.whl", hash = "sha256:09d8df92bb25b6065ab91b178da843dda67b33eb819321679a6e98a907ce0e10"}, + {file = "mypy-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:36ee2b9c6599c230fea89bbd79f401f9f9f8e9fcf0c777827789b19b7da90f51"}, + {file = "mypy-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fba3fb0968a7b48806b0c90f38d39296f10766885a94c83bd21399de1e14eb28"}, + {file = "mypy-1.20.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef1415a637cd3627d6304dfbeddbadd21079dafc2a8a753c477ce4fc0c2af54f"}, + {file = "mypy-1.20.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef3461b1ad5cd446e540016e90b5984657edda39f982f4cc45ca317b628f5a37"}, + {file = "mypy-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:542dd63c9e1339b6092eb25bd515f3a32a1453aee8c9521d2ddb17dacd840237"}, + {file = "mypy-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:1d55c7cd8ca22e31f93af2a01160a9e95465b5878de23dba7e48116052f20a8d"}, + {file = "mypy-1.20.1-cp312-cp312-win_arm64.whl", hash = "sha256:f5b84a79070586e0d353ee07b719d9d0a4aa7c8ee90c0ea97747e98cbe193019"}, + {file = "mypy-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f3886c03e40afefd327bd70b3f634b39ea82e87f314edaa4d0cce4b927ddcc1"}, + {file = "mypy-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e860eb3904f9764e83bafd70c8250bdffdc7dde6b82f486e8156348bf7ceb184"}, + {file = "mypy-1.20.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a4b5aac6e785719da51a84f5d09e9e843d473170a9045b1ea7ea1af86225df4b"}, + {file = "mypy-1.20.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f37b6cd0fe2ad3a20f05ace48ca3523fc52ff86940e34937b439613b6854472e"}, + {file = "mypy-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e4bbb0f6b54ce7cc350ef4a770650d15fa70edd99ad5267e227133eda9c94218"}, + {file = "mypy-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:c3dc20f8ec76eecd77148cdd2f1542ed496e51e185713bf488a414f862deb8f2"}, + {file = "mypy-1.20.1-cp313-cp313-win_arm64.whl", hash = "sha256:a9d62bbac5d6d46718e2b0330b25e6264463ed832722b8f7d4440ff1be3ca895"}, + {file = "mypy-1.20.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:12927b9c0ed794daedcf1dab055b6c613d9d5659ac511e8d936d96f19c087d12"}, + {file = "mypy-1.20.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:752507dd481e958b2c08fc966d3806c962af5a9433b5bf8f3bdd7175c20e34fe"}, + {file = "mypy-1.20.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c614655b5a065e56274c6cbbe405f7cf7e96c0654db7ba39bc680238837f7b08"}, + {file = "mypy-1.20.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c3f6221a76f34d5100c6d35b3ef6b947054123c3f8d6938a4ba00b1308aa572"}, + {file = "mypy-1.20.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4bdfc06303ac06500af71ea0cdbe995c502b3c9ba32f3f8313523c137a25d1b6"}, + {file = "mypy-1.20.1-cp314-cp314-win_amd64.whl", hash = "sha256:0131edd7eba289973d1ba1003d1a37c426b85cdef76650cd02da6420898a5eb3"}, + {file = "mypy-1.20.1-cp314-cp314-win_arm64.whl", hash = "sha256:33f02904feb2c07e1fdf7909026206396c9deeb9e6f34d466b4cfedb0aadbbe4"}, + {file = "mypy-1.20.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:168472149dd8cc505c98cefd21ad77e4257ed6022cd5ed2fe2999bed56977a5a"}, + {file = "mypy-1.20.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:eb674600309a8f22790cca883a97c90299f948183ebb210fbef6bcee07cb1986"}, + {file = "mypy-1.20.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef2b2e4cc464ba9795459f2586923abd58a0055487cbe558cb538ea6e6bc142a"}, + {file = "mypy-1.20.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dee461d396dd46b3f0ed5a098dbc9b8860c81c46ad44fa071afcfbc149f167c9"}, + {file = "mypy-1.20.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e364926308b3e66f1361f81a566fc1b2f8cd47fc8525e8136d4058a65a4b4f02"}, + {file = "mypy-1.20.1-cp314-cp314t-win_amd64.whl", hash = "sha256:a0c17fbd746d38c70cbc42647cfd884f845a9708a4b160a8b4f7e70d41f4d7fa"}, + {file = "mypy-1.20.1-cp314-cp314t-win_arm64.whl", hash = "sha256:db2cb89654626a912efda69c0d5c1d22d948265e2069010d3dde3abf751c7d08"}, + {file = "mypy-1.20.1-py3-none-any.whl", hash = "sha256:1aae28507f253fe82d883790d1c0a0d35798a810117c88184097fe8881052f06"}, + {file = "mypy-1.20.1.tar.gz", hash = "sha256:6fc3f4ecd52de81648fed1945498bf42fa2993ddfad67c9056df36ae5757f804"}, ] [package.dependencies] @@ -2458,7 +2344,6 @@ version = "1.1.0" description = "Type system extensions for programs checked with the mypy type checker." optional = false python-versions = ">=3.8" -groups = ["lint", "typing"] files = [ {file = "mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505"}, {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, @@ -2470,8 +2355,6 @@ version = "8.4.0" description = "Simple yet flexible natural sorting in Python." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, @@ -2487,7 +2370,6 @@ version = "0.65.0" description = "compiling Python code using LLVM" optional = true python-versions = ">=3.10" -groups = ["main"] files = [ {file = "numba-0.65.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:dff9fd5fbc9a35c517359c5823ea705d9b65f01fb46e42e35a2eabe5a52c2e96"}, {file = "numba-0.65.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4c894c94afa5ffd627c7e3b693df10cb0d905bd5eb06de3dfc31775140cf4f89"}, @@ -2526,8 +2408,6 @@ version = "2.2.6" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "python_version < \"3.13\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -2592,8 +2472,6 @@ version = "2.4.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.13\"" files = [ {file = "numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db"}, {file = "numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0"}, @@ -2675,12 +2553,10 @@ version = "3.3.1" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false python-versions = ">=3.8" -groups = ["main", "test"] files = [ {file = "oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1"}, {file = "oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9"}, ] -markers = {main = "extra == \"discogs\" or extra == \"beatport\""} [package.extras] rsa = ["cryptography (>=3.0.0)"] @@ -2693,7 +2569,6 @@ version = "26.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "lint", "test"] files = [ {file = "packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529"}, {file = "packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4"}, @@ -2705,7 +2580,6 @@ version = "1.0.4" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.9" -groups = ["lint", "typing"] files = [ {file = "pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723"}, {file = "pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645"}, @@ -2723,8 +2597,6 @@ version = "12.2.0" description = "Python Imaging Library (fork)" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"aura\" or extra == \"embedart\" or extra == \"fetchart\" or extra == \"thumbnails\"" files = [ {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, @@ -2833,7 +2705,6 @@ version = "4.9.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.10" -groups = ["main", "lint"] files = [ {file = "platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917"}, {file = "platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a"}, @@ -2845,7 +2716,6 @@ version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" -groups = ["test"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -2861,7 +2731,6 @@ version = "1.2.0" description = "A library to manipulate gettext files (po and mo files)." optional = false python-versions = "*" -groups = ["lint"] files = [ {file = "polib-1.2.0-py2.py3-none-any.whl", hash = "sha256:1c77ee1b81feb31df9bca258cbc58db1bbb32d10214b173882452c73af06d62d"}, {file = "polib-1.2.0.tar.gz", hash = "sha256:f3ef94aefed6e183e342a8a269ae1fc4742ba193186ad76f175938621dbfc26b"}, @@ -2873,8 +2742,6 @@ version = "1.9.0" description = "A friend to fetch your data files" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "pooch-1.9.0-py3-none-any.whl", hash = "sha256:f265597baa9f760d25ceb29d0beb8186c243d6607b0f60b83ecf14078dbc703b"}, {file = "pooch-1.9.0.tar.gz", hash = "sha256:de46729579b9857ffd3e741987a2f6d5e0e03219892c167c6578c0091fb511ed"}, @@ -2897,7 +2764,6 @@ version = "7.2.2" description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" -groups = ["main", "test"] files = [ {file = "psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b"}, {file = "psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea"}, @@ -2921,11 +2787,10 @@ files = [ {file = "psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee"}, {file = "psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372"}, ] -markers = {main = "extra == \"import\" and sys_platform != \"cygwin\"", test = "sys_platform != \"cygwin\""} [package.extras] -dev = ["abi3audit", "black", "check-manifest", "colorama ; os_name == \"nt\"", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3 ; os_name == \"nt\"", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] -test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32 ; os_name == \"nt\" and implementation_name != \"pypy\"", "setuptools", "wheel ; os_name == \"nt\" and implementation_name != \"pypy\"", "wmi ; os_name == \"nt\" and implementation_name != \"pypy\""] +dev = ["abi3audit", "black", "check-manifest", "colorama", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pyreadline3", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "pywin32", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel", "wheel", "wmi"] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "pywin32", "setuptools", "wheel", "wmi"] [[package]] name = "py7zr" @@ -2933,12 +2798,10 @@ version = "1.1.0" description = "Pure python 7-zip library" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "py7zr-1.1.0-py3-none-any.whl", hash = "sha256:5921bc30fb72b5453aafe3b2183664c08ef508cde2655988d5e9bd6078353ef7"}, {file = "py7zr-1.1.0.tar.gz", hash = "sha256:087b1a94861ad9eb4d21604f6aaa0a8986a7e00580abd79fedd6f82fecf0592c"}, ] -markers = {main = "extra == \"import\""} [package.dependencies] "backports.zstd" = {version = ">=1.0.0", markers = "python_version < \"3.14\""} @@ -2964,8 +2827,6 @@ version = "1.3.1" description = "Bindings for Chromaprint acoustic fingerprinting and the Acoustid API" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"chroma\"" files = [ {file = "pyacoustid-1.3.1-py3-none-any.whl", hash = "sha256:4436732937ac40e4b2fec4808fc81934c0e07ad9e3f0ef5f2b225517c99bb1e4"}, {file = "pyacoustid-1.3.1.tar.gz", hash = "sha256:bb0ecae40109c0aa80f709e33c66c83ec36b2fd84658f9fad056a34538f79e8a"}, @@ -2981,7 +2842,6 @@ version = "1.0.7" description = "bcj filter library" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "pybcj-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:618ec7345775c306d83527750e2d0ab3f42ffdc5ad6282f62f88cb53c9b2b679"}, {file = "pybcj-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7e7faa1b0f7d894685e4567dd41268b93df89cff347ebfdfdc48b4bc0d68cb2"}, @@ -3039,7 +2899,6 @@ files = [ {file = "pybcj-1.0.7-cp314-cp314t-win_arm64.whl", hash = "sha256:16fd4e51a5556d1f38d7ba5d1fab588bfb60ae23d2299b5179779bf9900adf71"}, {file = "pybcj-1.0.7.tar.gz", hash = "sha256:72d64574069ffb0a800020668376b7ebd7adea159adbf4d35f8effc62f0daa67"}, ] -markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8 (<8)", "flake8-black", "flake8-colors", "flake8-isort", "flake8-pyi", "flake8-typing-imports", "mypy (>=1.10.0)", "pygments", "readme-renderer"] @@ -3051,8 +2910,6 @@ version = "1.29.0" description = "Python interface for cairo" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"bpd\" or extra == \"replaygain\"" files = [ {file = "pycairo-1.29.0-cp310-cp310-win32.whl", hash = "sha256:96c67e6caba72afd285c2372806a0175b1aa2f4537aa88fb4d9802d726effcd1"}, {file = "pycairo-1.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:65bddd944aee9f7d7d72821b1c87e97593856617c2820a78d589d66aa8afbd08"}, @@ -3080,12 +2937,10 @@ version = "3.0" description = "C parser in Python" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992"}, {file = "pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29"}, ] -markers = {main = "(extra == \"import\" or extra == \"autobpm\" or extra == \"reflink\") and (platform_python_implementation == \"PyPy\" or extra == \"autobpm\" or extra == \"reflink\") and implementation_name != \"PyPy\"", test = "platform_python_implementation == \"PyPy\" and implementation_name != \"PyPy\""} [[package]] name = "pycryptodomex" @@ -3093,7 +2948,6 @@ version = "3.23.0" description = "Cryptographic library for Python" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["main", "test"] files = [ {file = "pycryptodomex-3.23.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:add243d204e125f189819db65eed55e6b4713f70a7e9576c043178656529cec7"}, {file = "pycryptodomex-3.23.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1c6d919fc8429e5cb228ba8c0d4d03d202a560b421c14867a65f6042990adc8e"}, @@ -3137,7 +2991,6 @@ files = [ {file = "pycryptodomex-3.23.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:27e13c80ac9a0a1d050ef0a7e0a18cc04c8850101ec891815b6c5a0375e8a245"}, {file = "pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da"}, ] -markers = {main = "extra == \"import\""} [[package]] name = "pydata-sphinx-theme" @@ -3145,8 +2998,6 @@ version = "0.17.0" description = "Bootstrap-based Sphinx theme from the PyData community" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "pydata_sphinx_theme-0.17.0-py3-none-any.whl", hash = "sha256:cec5c92f41f4a11541b6df8210c446b4aa9c3badb7fcf2db7893405b786d5c99"}, {file = "pydata_sphinx_theme-0.17.0.tar.gz", hash = "sha256:529c5631582cb3328cf4814fb9eb80611d1704c854406d282a75c9c86e3a1955"}, @@ -3174,12 +3025,10 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" -groups = ["main", "lint", "test"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, ] -markers = {main = "extra == \"docs\""} [package.extras] windows-terminal = ["colorama (>=0.4.6)"] @@ -3190,8 +3039,6 @@ version = "3.56.2" description = "Python bindings for GObject Introspection" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"bpd\" or extra == \"replaygain\"" files = [ {file = "pygobject-3.56.2.tar.gz", hash = "sha256:b816098969544081de9eecedb94ad6ac59c77e4d571fe7051f18bebcec074313"}, ] @@ -3205,12 +3052,10 @@ version = "7.0.2" description = "A Python interface to Last.fm and Libre.fm" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "pylast-7.0.2-py3-none-any.whl", hash = "sha256:c995e078670b3a8e3116a31b17d1f0d89c4d020407f6967ee9ffab2aeecd9de7"}, {file = "pylast-7.0.2.tar.gz", hash = "sha256:825e2b5d9144c5491d9c353511169a1595813e6a1ad203faf7525cd2d1d1828e"}, ] -markers = {main = "extra == \"lastgenre\" or extra == \"lastimport\""} [package.dependencies] httpx = ">=0.26" @@ -3224,7 +3069,6 @@ version = "1.3.1" description = "PPMd compression/decompression library" optional = false python-versions = ">=3.10" -groups = ["main", "test"] files = [ {file = "pyppmd-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:041f46fbeb0a59888c0a94d6b9a557c652935633a104be1c31c12de491b5f448"}, {file = "pyppmd-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9512a8b39740923559c26eb16266bf8b70d4eab6ad27a9b39cd2465e60e0acfa"}, @@ -3288,7 +3132,6 @@ files = [ {file = "pyppmd-1.3.1-cp314-cp314t-win_arm64.whl", hash = "sha256:e066cbf1d335fe20480cd8ecc10848ba78d99fe6d1e44ea00def48feaf46afdf"}, {file = "pyppmd-1.3.1.tar.gz", hash = "sha256:ced527f08ade4408c1bfc5264e9f97ffac8d221c9d13eca4f35ec1ec0c7b6b2e"}, ] -markers = {main = "extra == \"import\""} [package.extras] check = ["check-manifest", "flake8", "flake8-black", "flake8-isort", "mypy (>=1.10.0)", "pygments", "readme-renderer"] @@ -3302,7 +3145,6 @@ version = "4.1.0" description = "Python Rate-Limiter using Leaky-Bucket Algorithm" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "pyrate_limiter-4.1.0-py3-none-any.whl", hash = "sha256:2696b4e4a6cffb3d40fc76662baccb766697893f0979e12bebbfc7d3b6b19603"}, {file = "pyrate_limiter-4.1.0.tar.gz", hash = "sha256:be1ac413a263aa410b98757d1b01a880650948a1fc3a959512f15865eb58dbf3"}, @@ -3314,7 +3156,6 @@ version = "9.0.3" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.10" -groups = ["test"] files = [ {file = "pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9"}, {file = "pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c"}, @@ -3338,7 +3179,6 @@ version = "7.1.0" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" -groups = ["test"] files = [ {file = "pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"}, {file = "pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"}, @@ -3358,7 +3198,6 @@ version = "1.3.0" description = "A set of py.test fixtures to test Flask applications." optional = false python-versions = ">=3.7" -groups = ["test"] files = [ {file = "pytest-flask-1.3.0.tar.gz", hash = "sha256:58be1c97b21ba3c4d47e0a7691eb41007748506c36bf51004f78df10691fa95e"}, {file = "pytest_flask-1.3.0-py3-none-any.whl", hash = "sha256:c0e36e6b0fddc3b91c4362661db83fa694d1feb91fa505475be6732b5bc8c253"}, @@ -3378,12 +3217,10 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "test"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] -markers = {main = "extra == \"discogs\""} [package.dependencies] six = ">=1.5" @@ -3394,12 +3231,10 @@ version = "3.1.1" description = "A Python MPD client library" optional = false python-versions = ">=3.6" -groups = ["main", "test"] files = [ {file = "python-mpd2-3.1.1.tar.gz", hash = "sha256:4baec3584cc43ed9948d5559079fafc2679b06b2ade273e909b3582654b2b3f5"}, {file = "python_mpd2-3.1.1-py2.py3-none-any.whl", hash = "sha256:86bf1100a0b135959d74a9a7a58cf0515bf30bb54eb25ae6fb8e175e50300fc3"}, ] -markers = {main = "extra == \"mpdstats\""} [package.extras] twisted = ["Twisted"] @@ -3410,12 +3245,10 @@ version = "2.8" description = "Python API client for Discogs" optional = false python-versions = "*" -groups = ["main", "test"] files = [ {file = "python3_discogs_client-2.8-py3-none-any.whl", hash = "sha256:60d63a613da73afeb818015e680fa5f007ffaa94d97578070e7ee4f11dc1b1b3"}, {file = "python3_discogs_client-2.8.tar.gz", hash = "sha256:0f2c77f4ff491a6ef60fe892032028df899808e65efcd48249b4ecf21146b33b"}, ] -markers = {main = "extra == \"discogs\""} [package.dependencies] oauthlib = "*" @@ -3431,7 +3264,6 @@ version = "0.4.1" description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." optional = false python-versions = ">=3.8" -groups = ["lint"] files = [ {file = "pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5"}, {file = "pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe"}, @@ -3486,12 +3318,10 @@ version = "0.28" description = "PyXDG contains implementations of freedesktop.org standards in python." optional = false python-versions = "*" -groups = ["main", "test"] files = [ {file = "pyxdg-0.28-py2.py3-none-any.whl", hash = "sha256:bdaf595999a0178ecea4052b7f4195569c1ff4d344567bccdc12dfdf02d545ab"}, {file = "pyxdg-0.28.tar.gz", hash = "sha256:3267bb3074e934df202af2ee0868575484108581e6f3cb006af1da35395e88b4"}, ] -markers = {main = "extra == \"thumbnails\""} [[package]] name = "pyyaml" @@ -3499,7 +3329,6 @@ version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "lint", "test"] files = [ {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, @@ -3575,7 +3404,6 @@ files = [ {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, ] -markers = {lint = "python_version < \"3.13\" or python_version == \"3.14\""} [[package]] name = "pyyaml-ft" @@ -3583,8 +3411,6 @@ version = "8.0.0" description = "YAML parser and emitter for Python with support for free-threading" optional = false python-versions = ">=3.13" -groups = ["lint"] -markers = "python_version == \"3.13\"" files = [ {file = "pyyaml_ft-8.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c1306282bc958bfda31237f900eb52c9bedf9b93a11f82e1aab004c9a5657a6"}, {file = "pyyaml_ft-8.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:30c5f1751625786c19de751e3130fc345ebcba6a86f6bddd6e1285342f4bbb69"}, @@ -3611,12 +3437,10 @@ version = "4.2" description = "RAR archive reader for Python" optional = false python-versions = ">=3.6" -groups = ["main", "test"] files = [ {file = "rarfile-4.2-py3-none-any.whl", hash = "sha256:8757e1e3757e32962e229cab2432efc1f15f210823cc96ccba0f6a39d17370c9"}, {file = "rarfile-4.2.tar.gz", hash = "sha256:8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef"}, ] -markers = {main = "extra == \"import\""} [[package]] name = "reflink" @@ -3624,8 +3448,6 @@ version = "0.2.2" description = "Python reflink wraps around platform specific reflink implementations" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"reflink\"" files = [ {file = "reflink-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:8435c7153af4d6e66dc8acb48a9372c8ec6f978a09cdf7b57cd6656d969e343a"}, {file = "reflink-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:be4787c6208faf7fc892390909cf01e34e650ea67c37bf345addefd597ed90e1"}, @@ -3641,7 +3463,6 @@ version = "2026.4.4" description = "Alternative regular expression module, to replace re." optional = false python-versions = ">=3.10" -groups = ["lint"] files = [ {file = "regex-2026.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:74fa82dcc8143386c7c0392e18032009d1db715c25f4ba22d23dc2e04d02a20f"}, {file = "regex-2026.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a85b620a388d6c9caa12189233109e236b3da3deffe4ff11b84ae84e218a274f"}, @@ -3765,7 +3586,6 @@ version = "2.33.1" description = "Python HTTP for Humans." optional = false python-versions = ">=3.10" -groups = ["main", "lint", "test"] files = [ {file = "requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a"}, {file = "requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517"}, @@ -3787,7 +3607,6 @@ version = "1.12.1" description = "Mock out responses from the requests package" optional = false python-versions = ">=3.5" -groups = ["test"] files = [ {file = "requests-mock-1.12.1.tar.gz", hash = "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401"}, {file = "requests_mock-1.12.1-py2.py3-none-any.whl", hash = "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563"}, @@ -3805,12 +3624,10 @@ version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false python-versions = ">=3.4" -groups = ["main", "test"] files = [ {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] -markers = {main = "extra == \"beatport\""} [package.dependencies] oauthlib = ">=3.0.0" @@ -3825,7 +3642,6 @@ version = "0.9.3" description = "Rate-limiting for the requests library" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "requests_ratelimiter-0.9.3-py3-none-any.whl", hash = "sha256:f0d2c616891ba84d84aa9940c4251fd516bc6471d44313230653062eedc860d4"}, {file = "requests_ratelimiter-0.9.3.tar.gz", hash = "sha256:a706807210e0a5554be585f0cd6892cb57784343c4d40c7473456b26274a775c"}, @@ -3841,8 +3657,6 @@ version = "0.4.3" description = "Efficient signal resampling" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "resampy-0.4.3-py3-none-any.whl", hash = "sha256:ad2ed64516b140a122d96704e32bc0f92b23f45419e8b8f478e5a05f83edcebd"}, {file = "resampy-0.4.3.tar.gz", hash = "sha256:a0d1c28398f0e55994b739650afef4e3974115edbe96cd4bb81968425e916e47"}, @@ -3863,7 +3677,6 @@ version = "0.26.0" description = "A utility library for mocking out the `requests` Python library." optional = false python-versions = ">=3.8" -groups = ["test"] files = [ {file = "responses-0.26.0-py3-none-any.whl", hash = "sha256:03ec4409088cd5c66b71ecbbbd27fe2c58ddfad801c66203457b3e6a04868c37"}, {file = "responses-0.26.0.tar.gz", hash = "sha256:c7f6923e6343ef3682816ba421c006626777893cb0d5e1434f674b649bac9eb4"}, @@ -3875,7 +3688,7 @@ requests = ">=2.30.0,<3.0" urllib3 = ">=1.25.10,<3.0" [package.extras] -tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli ; python_version < \"3.11\"", "tomli-w", "types-PyYAML", "types-requests"] +tests = ["coverage (>=6.0.0)", "flake8", "mypy", "pytest (>=7.0.0)", "pytest-asyncio", "pytest-cov", "pytest-httpserver", "tomli", "tomli-w", "types-PyYAML", "types-requests"] [[package]] name = "roman" @@ -3883,12 +3696,10 @@ version = "5.2" description = "Integer to Roman numerals converter" optional = false python-versions = ">=3.10" -groups = ["main", "lint"] files = [ {file = "roman-5.2-py3-none-any.whl", hash = "sha256:89d3b47400388806d06ff77ea77c79ab080bc127820dea6bf34e1f1c1b8e676e"}, {file = "roman-5.2.tar.gz", hash = "sha256:275fe9f46290f7d0ffaea1c33251b92b8e463ace23660508ceef522e7587cb6f"}, ] -markers = {main = "extra == \"docs\""} [[package]] name = "ruamel-yaml" @@ -3896,8 +3707,6 @@ version = "0.18.16" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = true python-versions = ">=3.8" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "ruamel.yaml-0.18.16-py3-none-any.whl", hash = "sha256:048f26d64245bae57a4f9ef6feb5b552a386830ef7a826f235ffb804c59efbba"}, {file = "ruamel.yaml-0.18.16.tar.gz", hash = "sha256:a6e587512f3c998b2225d68aa1f35111c29fad14aed561a26e73fab729ec5e5a"}, @@ -3916,8 +3725,6 @@ version = "0.2.15" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "platform_python_implementation == \"CPython\" and extra == \"docs\" and python_version <= \"3.13\"" files = [ {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88eea8baf72f0ccf232c22124d122a7f26e8a24110a0273d9bcddcb0f7e1fa03"}, {file = "ruamel_yaml_clib-0.2.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b6f7d74d094d1f3a4e157278da97752f16ee230080ae331fcc219056ca54f77"}, @@ -3988,7 +3795,6 @@ version = "0.15.10" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" -groups = ["lint"] files = [ {file = "ruff-0.15.10-py3-none-linux_armv6l.whl", hash = "sha256:0744e31482f8f7d0d10a11fcbf897af272fefdfcb10f5af907b18c2813ff4d5f"}, {file = "ruff-0.15.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b1e7c16ea0ff5a53b7c2df52d947e685973049be1cdfe2b59a9c43601897b22e"}, @@ -4016,8 +3822,6 @@ version = "1.7.2" description = "A set of python modules for machine learning and data mining" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, @@ -4073,8 +3877,6 @@ version = "1.15.3" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "python_version < \"3.13\"" files = [ {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, @@ -4130,7 +3932,7 @@ numpy = ">=1.23.5,<2.5" [package.extras] dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] -test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "scipy" @@ -4138,8 +3940,6 @@ version = "1.17.1" description = "Fundamental algorithms for scientific computing in Python" optional = true python-versions = ">=3.11" -groups = ["main"] -markers = "python_version >= \"3.13\"" files = [ {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, @@ -4210,7 +4010,7 @@ numpy = ">=1.26.4,<2.7" [package.extras] dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] -test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -4218,12 +4018,10 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "test"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"discogs\" or extra == \"docs\""} [[package]] name = "snowballstemmer" @@ -4231,12 +4029,10 @@ version = "3.0.1" description = "This package provides 32 stemmers for 30 languages generated from Snowball algorithms." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*" -groups = ["main", "lint"] files = [ {file = "snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064"}, {file = "snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895"}, ] -markers = {main = "extra == \"docs\""} [[package]] name = "soco" @@ -4244,8 +4040,6 @@ version = "0.31.0" description = "SoCo (Sonos Controller) is a simple library to control Sonos speakers." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"sonosupdate\"" files = [ {file = "soco-0.31.0-py2.py3-none-any.whl", hash = "sha256:a4152803f736705d759c052b2079af4282b31bd481e46f15c3a6d79b41bb9521"}, {file = "soco-0.31.0.tar.gz", hash = "sha256:d72279eb3b5d44b9359843c8d3237d6eaaa95ce04096539720f2d377b19fd89f"}, @@ -4260,7 +4054,7 @@ xmltodict = "*" [package.extras] events-asyncio = ["aiohttp"] -testing = ["black (>=24.4.0) ; python_version >= \"3.10\"", "coveralls", "flake8", "graphviz", "importlib-metadata (<5) ; python_version == \"3.7\"", "pylint", "pytest (>=2.5)", "pytest-cov (<2.6.0)", "requests-mock", "sphinx (==4.5.0)", "sphinx_rtd_theme", "twine", "wheel"] +testing = ["black (>=24.4.0)", "coveralls", "flake8", "graphviz", "importlib-metadata (<5)", "pylint", "pytest (>=2.5)", "pytest-cov (<2.6.0)", "requests-mock", "sphinx (==4.5.0)", "sphinx_rtd_theme", "twine", "wheel"] [[package]] name = "soundfile" @@ -4268,8 +4062,6 @@ version = "0.13.1" description = "An audio library based on libsndfile, CFFI and NumPy" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "soundfile-0.13.1-py2.py3-none-any.whl", hash = "sha256:a23c717560da2cf4c7b5ae1142514e0fd82d6bbd9dfc93a50423447142f2c445"}, {file = "soundfile-0.13.1-py2.py3-none-macosx_10_9_x86_64.whl", hash = "sha256:82dc664d19831933fe59adad199bf3945ad06d84bc111a5b4c0d3089a5b9ec33"}, @@ -4291,12 +4083,10 @@ version = "2.8.3" description = "A modern CSS selector implementation for Beautiful Soup." optional = false python-versions = ">=3.9" -groups = ["main", "test"] files = [ {file = "soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95"}, {file = "soupsieve-2.8.3.tar.gz", hash = "sha256:3267f1eeea4251fb42728b6dfb746edc9acaffc4a45b27e19450b676586e8349"}, ] -markers = {main = "extra == \"fetchart\" or extra == \"lyrics\" or extra == \"docs\""} [[package]] name = "soxr" @@ -4304,8 +4094,6 @@ version = "1.0.0" description = "High quality, one-dimensional sample-rate conversion library" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "soxr-1.0.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:b876a3156f67c76aef0cff1084eaf4088d9ca584bb569cb993f89a52ec5f399f"}, {file = "soxr-1.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d3b957a7b0cc19ae6aa45d40b2181474e53a8dd00efd7bce6bcf4e60e020892"}, @@ -4348,12 +4136,10 @@ version = "8.1.3" description = "Python documentation generator" optional = false python-versions = ">=3.10" -groups = ["main", "lint"] files = [ {file = "sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2"}, {file = "sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927"}, ] -markers = {main = "extra == \"docs\""} [package.dependencies] alabaster = ">=0.7.14" @@ -4385,8 +4171,6 @@ version = "3.0.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx_autodoc_typehints-3.0.1-py3-none-any.whl", hash = "sha256:4b64b676a14b5b79cefb6628a6dc8070e320d4963e8ff640a2f3e9390ae9045a"}, {file = "sphinx_autodoc_typehints-3.0.1.tar.gz", hash = "sha256:b9b40dd15dee54f6f810c924f863f9cf1c54f9f3265c495140ea01be7f44fa55"}, @@ -4405,8 +4189,6 @@ version = "0.5.2" description = "Add a copy button to each of your code cells." optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, @@ -4425,8 +4207,6 @@ version = "0.6.1" description = "A sphinx extension for designing beautiful, view size responsive web components." optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c"}, {file = "sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632"}, @@ -4452,8 +4232,6 @@ version = "0.4.1" description = "Patches Jinja2 v3 to restore compatibility with earlier Sphinx versions." optional = true python-versions = ">=3.6" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx_jinja2_compat-0.4.1-py3-none-any.whl", hash = "sha256:64ca0d46f0d8029fbe69ea612793a55e6ef0113e1bba4a85d402158c09f17a14"}, {file = "sphinx_jinja2_compat-0.4.1.tar.gz", hash = "sha256:0188f0802d42c3da72997533b55a00815659a78d3f81d4b4747b1fb15a5728e6"}, @@ -4470,7 +4248,6 @@ version = "1.0.2" description = "Check for stylistic and formal issues in .rst and .py files included in the documentation." optional = false python-versions = ">=3.10" -groups = ["lint"] files = [ {file = "sphinx_lint-1.0.2-py3-none-any.whl", hash = "sha256:edcd0fa4d916386c5a3ef7ef0f5136f0bb4a15feefc83c1068ba15bc16eec652"}, {file = "sphinx_lint-1.0.2.tar.gz", hash = "sha256:4e7fc12f44f750b0006eaad237d7db9b1d8aba92adda9c838af891654b371d35"}, @@ -4489,8 +4266,6 @@ version = "1.9.0" description = "Sphinx directive to add unselectable prompt" optional = true python-versions = ">=3.10" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx_prompt-1.9.0-py3-none-any.whl", hash = "sha256:fd731446c03f043d1ff6df9f22414495b23067c67011cc21658ea8d36b3575fc"}, {file = "sphinx_prompt-1.9.0.tar.gz", hash = "sha256:471b3c6d466dce780a9b167d9541865fd4e9a80ed46e31b06a52a0529ae995a1"}, @@ -4510,8 +4285,6 @@ version = "3.4.5" description = "Tabbed views for Sphinx" optional = true python-versions = "~=3.7" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx-tabs-3.4.5.tar.gz", hash = "sha256:ba9d0c1e3e37aaadd4b5678449eb08176770e0fc227e769b6ce747df3ceea531"}, {file = "sphinx_tabs-3.4.5-py3-none-any.whl", hash = "sha256:92cc9473e2ecf1828ca3f6617d0efc0aa8acb06b08c56ba29d1413f2f0f6cf09"}, @@ -4532,8 +4305,6 @@ version = "4.1.2" description = "Box of handy tools for Sphinx 🧰 📔" optional = true python-versions = ">=3.7" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "sphinx_toolbox-4.1.2-py3-none-any.whl", hash = "sha256:0438f8342ba1c6c0d6e47207f4eac167adba61742e8c2b1dc9624ff955b7bc89"}, {file = "sphinx_toolbox-4.1.2.tar.gz", hash = "sha256:c30a4f86c4c29e97adb0eb9337d35f5093cb96a44f49caffcf7d5bc58a88b781"}, @@ -4569,12 +4340,10 @@ version = "2.0.0" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"}, {file = "sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"}, ] -markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4587,12 +4356,10 @@ version = "2.0.0" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"}, {file = "sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"}, ] -markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4605,12 +4372,10 @@ version = "2.1.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"}, {file = "sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"}, ] -markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4623,12 +4388,10 @@ version = "1.0.1" description = "A sphinx extension which renders display math in HTML via JavaScript" optional = false python-versions = ">=3.5" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, ] -markers = {main = "extra == \"docs\""} [package.extras] test = ["flake8", "mypy", "pytest"] @@ -4639,12 +4402,10 @@ version = "2.0.0" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"}, {file = "sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"}, ] -markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4657,12 +4418,10 @@ version = "2.0.0" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" optional = false python-versions = ">=3.9" -groups = ["main", "lint"] files = [ {file = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"}, {file = "sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"}, ] -markers = {main = "extra == \"docs\""} [package.extras] lint = ["mypy", "ruff (==0.5.5)", "types-docutils"] @@ -4675,8 +4434,6 @@ version = "3.13.0" description = "Standard library aifc redistribution. \"dead battery\"." optional = true python-versions = "*" -groups = ["main"] -markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_aifc-3.13.0-py3-none-any.whl", hash = "sha256:f7ae09cc57de1224a0dd8e3eb8f73830be7c3d0bc485de4c1f82b4a7f645ac66"}, {file = "standard_aifc-3.13.0.tar.gz", hash = "sha256:64e249c7cb4b3daf2fdba4e95721f811bde8bdfc43ad9f936589b7bb2fae2e43"}, @@ -4692,8 +4449,6 @@ version = "3.13.0" description = "Standard library chunk redistribution. \"dead battery\"." optional = true python-versions = "*" -groups = ["main"] -markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_chunk-3.13.0-py3-none-any.whl", hash = "sha256:17880a26c285189c644bd5bd8f8ed2bdb795d216e3293e6dbe55bbd848e2982c"}, {file = "standard_chunk-3.13.0.tar.gz", hash = "sha256:4ac345d37d7e686d2755e01836b8d98eda0d1a3ee90375e597ae43aaf064d654"}, @@ -4705,8 +4460,6 @@ version = "3.10.14" description = "Standard library imghdr redistribution. \"dead battery\"." optional = true python-versions = "*" -groups = ["main"] -markers = "python_version >= \"3.13\" and extra == \"docs\"" files = [ {file = "standard_imghdr-3.10.14-py3-none-any.whl", hash = "sha256:cdf6883163349624dee9a81d2853a20260337c4cd41c04e99c082e01833a08e2"}, {file = "standard_imghdr-3.10.14.tar.gz", hash = "sha256:2598fe2e7c540dbda34b233295e10957ab8dc8ac6f3bd9eaa8d38be167232e52"}, @@ -4718,8 +4471,6 @@ version = "3.13.0" description = "Standard library sunau redistribution. \"dead battery\"." optional = true python-versions = "*" -groups = ["main"] -markers = "python_version >= \"3.13\" and (extra == \"autobpm\" or extra == \"chroma\")" files = [ {file = "standard_sunau-3.13.0-py3-none-any.whl", hash = "sha256:53af624a9529c41062f4c2fd33837f297f3baa196b0cfceffea6555654602622"}, {file = "standard_sunau-3.13.0.tar.gz", hash = "sha256:b319a1ac95a09a2378a8442f403c66f4fd4b36616d6df6ae82b8e536ee790908"}, @@ -4734,12 +4485,10 @@ version = "0.10.0" description = "Pretty-print tabular data" optional = false python-versions = ">=3.10" -groups = ["main", "lint"] files = [ {file = "tabulate-0.10.0-py3-none-any.whl", hash = "sha256:f0b0622e567335c8fabaaa659f1b33bcb6ddfe2e496071b743aa113f8774f2d3"}, {file = "tabulate-0.10.0.tar.gz", hash = "sha256:e2cfde8f79420f6deeffdeda9aaec3b6bc5abce947655d17ac662b126e48a60d"}, ] -markers = {main = "extra == \"docs\""} [package.extras] widechars = ["wcwidth"] @@ -4750,12 +4499,10 @@ version = "1.7.0" description = "module to create simple ASCII tables" optional = false python-versions = "*" -groups = ["main", "test"] files = [ {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, ] -markers = {main = "extra == \"import\""} [[package]] name = "threadpoolctl" @@ -4763,8 +4510,6 @@ version = "3.6.0" description = "threadpoolctl" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"autobpm\"" files = [ {file = "threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb"}, {file = "threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e"}, @@ -4776,11 +4521,9 @@ version = "2.4.1" description = "Python Port of John Gruber's titlecase.pl" optional = false python-versions = ">=3.7" -groups = ["main", "test"] files = [ {file = "titlecase-2.4.1.tar.gz", hash = "sha256:7d83a277ccbbda11a2944e78a63e5ccaf3d32f828c594312e4862f9a07f635f5"}, ] -markers = {main = "extra == \"titlecase\""} [package.extras] regex = ["regex (>=2020.4.4)"] @@ -4791,7 +4534,6 @@ version = "2.4.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" -groups = ["main", "lint", "release", "test", "typing"] files = [ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"}, {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"}, @@ -4841,7 +4583,6 @@ files = [ {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"}, {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"}, ] -markers = {main = "extra == \"docs\" and python_version == \"3.10\"", lint = "python_version == \"3.10\"", test = "python_full_version <= \"3.11.0a6\"", typing = "python_version == \"3.10\""} [[package]] name = "types-beautifulsoup4" @@ -4849,7 +4590,6 @@ version = "4.12.0.20250516" description = "Typing stubs for beautifulsoup4" optional = false python-versions = ">=3.9" -groups = ["typing"] files = [ {file = "types_beautifulsoup4-4.12.0.20250516-py3-none-any.whl", hash = "sha256:5923399d4a1ba9cc8f0096fe334cc732e130269541d66261bb42ab039c0376ee"}, {file = "types_beautifulsoup4-4.12.0.20250516.tar.gz", hash = "sha256:aa19dd73b33b70d6296adf92da8ab8a0c945c507e6fb7d5db553415cc77b417e"}, @@ -4864,7 +4604,6 @@ version = "0.22.3.20251115" description = "Typing stubs for docutils" optional = false python-versions = ">=3.9" -groups = ["lint", "typing"] files = [ {file = "types_docutils-0.22.3.20251115-py3-none-any.whl", hash = "sha256:c6e53715b65395d00a75a3a8a74e352c669bc63959e65a207dffaa22f4a2ad6e"}, {file = "types_docutils-0.22.3.20251115.tar.gz", hash = "sha256:0f79ea6a7bd4d12d56c9f824a0090ffae0ea4204203eb0006392906850913e16"}, @@ -4876,7 +4615,6 @@ version = "6.0.0.20260408" description = "Typing stubs for Flask-Cors" optional = false python-versions = ">=3.10" -groups = ["typing"] files = [ {file = "types_flask_cors-6.0.0.20260408-py3-none-any.whl", hash = "sha256:ccd8801862b3ebd27754734b84fc3dcfebd0f8056380ae88254c7dd799d64a39"}, {file = "types_flask_cors-6.0.0.20260408.tar.gz", hash = "sha256:8c440c158c335819bb9286870c9770687ae6d943510fdd97e4b573324f8d2178"}, @@ -4891,7 +4629,6 @@ version = "1.1.11.20260408" description = "Typing stubs for html5lib" optional = false python-versions = ">=3.10" -groups = ["typing"] files = [ {file = "types_html5lib-1.1.11.20260408-py3-none-any.whl", hash = "sha256:d18dc4b90d6d6745585790b920db13ede43e1f8ff6ee1ac0ceb0dec4223a06fa"}, {file = "types_html5lib-1.1.11.20260408.tar.gz", hash = "sha256:8a281aa367bc77dbc758358cd9bef79530f2d154eeed9b33705bb035a0dab9e4"}, @@ -4906,7 +4643,6 @@ version = "10.2.0.20240822" description = "Typing stubs for Pillow" optional = false python-versions = ">=3.8" -groups = ["typing"] files = [ {file = "types-Pillow-10.2.0.20240822.tar.gz", hash = "sha256:559fb52a2ef991c326e4a0d20accb3bb63a7ba8d40eb493e0ecb0310ba52f0d3"}, {file = "types_Pillow-10.2.0.20240822-py3-none-any.whl", hash = "sha256:d9dab025aba07aeb12fd50a6799d4eac52a9603488eca09d7662543983f16c5d"}, @@ -4918,7 +4654,6 @@ version = "6.0.12.20260408" description = "Typing stubs for PyYAML" optional = false python-versions = ">=3.10" -groups = ["typing"] files = [ {file = "types_pyyaml-6.0.12.20260408-py3-none-any.whl", hash = "sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384"}, {file = "types_pyyaml-6.0.12.20260408.tar.gz", hash = "sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307"}, @@ -4930,7 +4665,6 @@ version = "2.33.0.20260408" description = "Typing stubs for requests" optional = false python-versions = ">=3.10" -groups = ["typing"] files = [ {file = "types_requests-2.33.0.20260408-py3-none-any.whl", hash = "sha256:81f31d5ea4acb39f03be7bc8bed569ba6d5a9c5d97e89f45ac43d819b68ca50f"}, {file = "types_requests-2.33.0.20260408.tar.gz", hash = "sha256:95b9a86376807a216b2fb412b47617b202091c3ea7c078f47cc358d5528ccb7b"}, @@ -4945,7 +4679,6 @@ version = "1.26.25.14" description = "Typing stubs for urllib3" optional = false python-versions = "*" -groups = ["typing"] files = [ {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, @@ -4957,7 +4690,6 @@ version = "0.5.0.20260408" description = "Typing stubs for webencodings" optional = false python-versions = ">=3.10" -groups = ["typing"] files = [ {file = "types_webencodings-0.5.0.20260408-py3-none-any.whl", hash = "sha256:19a2afe5c22d9b1e880b49ff823c7b531f473a390fe47ac903c0bdb5cd677dd9"}, {file = "types_webencodings-0.5.0.20260408.tar.gz", hash = "sha256:28c596619f367e43eee393d85f63e8d2fdb6874c654a8d441c37f8afe29c6d0d"}, @@ -4969,12 +4701,10 @@ version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main", "lint", "test", "typing"] files = [ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] -markers = {lint = "python_version == \"3.10\""} [[package]] name = "unidecode" @@ -4982,7 +4712,6 @@ version = "1.4.0" description = "ASCII transliterations of Unicode text" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021"}, {file = "Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23"}, @@ -4994,17 +4723,16 @@ version = "2.6.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "lint", "test", "typing"] files = [ {file = "urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4"}, {file = "urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed"}, ] [package.extras] -brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0)", "brotlicffi (>=1.2.0.0)"] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] +zstd = ["backports-zstd (>=1.0.0)"] [[package]] name = "webencodings" @@ -5012,8 +4740,6 @@ version = "0.5.1" description = "Character encoding aliases for legacy web content" optional = true python-versions = "*" -groups = ["main"] -markers = "extra == \"docs\"" files = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, @@ -5025,12 +4751,10 @@ version = "3.1.8" description = "The comprehensive WSGI web application library." optional = false python-versions = ">=3.9" -groups = ["main", "test", "typing"] files = [ {file = "werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50"}, {file = "werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44"}, ] -markers = {main = "extra == \"aura\" or extra == \"web\""} [package.dependencies] markupsafe = ">=2.1.1" @@ -5044,8 +4768,6 @@ version = "1.0.4" description = "Makes working with XML feel like you are working with JSON" optional = true python-versions = ">=3.9" -groups = ["main"] -markers = "extra == \"sonosupdate\"" files = [ {file = "xmltodict-1.0.4-py3-none-any.whl", hash = "sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a"}, {file = "xmltodict-1.0.4.tar.gz", hash = "sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61"}, @@ -5083,6 +4805,6 @@ titlecase = ["titlecase"] web = ["flask", "flask-cors"] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = ">=3.10,<3.15" content-hash = "68a454bcca74688c03221bda48dd26ea19b9cbf5cc1181d0877f1b18ce8773af" diff --git a/test/test_importer.py b/test/test_importer.py index 61dd47873a..d61b48032c 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -1749,11 +1749,9 @@ def test_candidates_singleton(self): } -@_common.slow_test() -class MpeglayerWavImportTest(ImportTestCase): +class MpeglayerWavImportTest(AsIsImporterMixin, ImportTestCase): """Test remuxing of WAVE_FORMAT_MPEGLAYER3 WAV files.""" - @unittest.skipUnless(shutil.which("ffmpeg"), "ffmpeg not found") def test_remux_mpeglayer3_wav(self): from beets.importer.tasks import _remux_mpeglayer3_wav @@ -1767,3 +1765,13 @@ def test_remux_mpeglayer3_wav(self): assert mp3_path.endswith(b".mp3") assert os.path.exists(mp3_path) assert not os.path.exists(dest) + + def test_remux_mpeglayer3_wav_disabled(self): + """When remux_mp3_in_wav is disabled, WAV file should not be remuxed.""" + self.config["import"]["remux_mp3_in_wav"] = False + src = os.path.join(_common.RSRC, b"mpeglayer3.wav") + dest = os.path.join(self.import_dir, b"mpeglayer3.wav") + shutil.copy(syspath(src), syspath(dest)) + + self.run_asis_importer() + assert os.path.exists(dest) From 4478ece59c522468de843a7a88e4817e2c2b0c72 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Tue, 14 Apr 2026 15:01:46 -0400 Subject: [PATCH 09/11] Fix docs formatting --- docs/reference/config.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/reference/config.rst b/docs/reference/config.rst index 8d827e40ae..88657084f5 100644 --- a/docs/reference/config.rst +++ b/docs/reference/config.rst @@ -910,9 +910,9 @@ remux_mp3_in_wav Some WAV files contain MP3 audio streams (``WAVE_FORMAT_MPEGLAYER3``) rather than the standard PCM format. When this option is enabled, beets will -automatically extract the MP3 stream into a proper ``.mp3`` file during -import, removing the WAV container. The original WAV file is deleted after -successful extraction. +automatically extract the MP3 stream into a proper ``.mp3`` file during import, +removing the WAV container. The original WAV file is deleted after successful +extraction. Default: ``yes``. From e7247b54aa3e718886e6c75bad64a0516d9b946e Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Tue, 14 Apr 2026 15:53:43 -0400 Subject: [PATCH 10/11] Moved remux function to util.extension, fixed exception handling, added docs --- beets/importer/tasks.py | 50 +---------------------------------------- beets/util/extension.py | 33 +++++++++++++++++++++++++++ docs/changelog.rst | 2 +- test/test_importer.py | 3 +-- 4 files changed, 36 insertions(+), 52 deletions(-) diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index e98aaf7eeb..b97cf60df6 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -32,6 +32,7 @@ from beets.autotag.match import tag_album, tag_item from beets.dbcore.query import PathQuery from beets.util import extension +from beets.util.extension import _remux_mpeglayer3_wav from .state import ImportState @@ -899,55 +900,6 @@ def extract(self): self.toppath = extract_to -def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: - """If 'path' is a WAV file containing an MP3 stream - (WAVE_FORMAT_MPEGLAYER3, wFormatTag = 0x0055), extract the MP3 stream - to a new .mp3 file and return its path. Returns None if the file is not - MPEGLAYER3 or if extraction fails. - """ - try: - import mutagen.wave - - f = mutagen.wave.WAVE(util.syspath(path)) - if getattr(f.info, "audio_format", 1) != 0x55: - return None - except Exception: - return None - - try: - with open(util.syspath(path), "rb") as wav_file: - data = wav_file.read() - data_offset = data.find(b"data") - if data_offset == -1: - log.warning( - "Could not find data chunk in MPEGLAYER3 WAV: {}", - util.displayable_path(path), - ) - return None - - # Skip 'data' marker (4 bytes) and chunk size (4 bytes). - mp3_data = data[data_offset + 8 :] - - mp3_path = os.path.splitext(path)[0] + b".mp3" - with open(util.syspath(mp3_path), "wb") as mp3_file: - mp3_file.write(mp3_data) - - util.remove(path) - log.debug( - "Extracted MP3 stream from MPEGLAYER3 WAV: {}", - util.displayable_path(mp3_path), - ) - return mp3_path - - except Exception as exc: - log.warning( - "Failed to extract MP3 from MPEGLAYER3 WAV{}: {}", - util.displayable_path(path), - exc, - ) - return None - - class ImportTaskFactory: """Generate album and singleton import tasks for all media files indicated by a path. diff --git a/beets/util/extension.py b/beets/util/extension.py index b069408fce..4301a85697 100644 --- a/beets/util/extension.py +++ b/beets/util/extension.py @@ -19,6 +19,8 @@ from logging import Logger from pathlib import Path +import mutagen.wave + import beets from beets import util @@ -147,3 +149,34 @@ def fix_extension(path_bytes: PathBytes, logger: Logger | None = None): if logger: logger.info("Import file with matching format to original target") return new_path + + +def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: + """If 'path' is a WAV file containing an MP3 stream + (WAVE_FORMAT_MPEGLAYER3, wFormatTag = 0x0055), extract the MP3 stream + to a new .mp3 file and return its path. Returns None if the file is not + MPEGLAYER3 or if extraction fails. + """ + try: + f = mutagen.wave.WAVE(util.syspath(path)) + except mutagen.MutagenError: + return None + if getattr(f.info, "audio_format", 1) != 0x55: + return None + + with open(util.syspath(path), "rb") as wav_file: + data = wav_file.read() + + data_offset = data.find(b"data") + if data_offset == -1: + return None + + # Skip 'data' marker (4 bytes) and chunk size (4 bytes). + mp3_data = data[data_offset + 8 :] + + mp3_path = os.path.splitext(path)[0] + b".mp3" + with open(util.syspath(mp3_path), "wb") as mp3_file: + mp3_file.write(mp3_data) + + util.remove(path) + return mp3_path diff --git a/docs/changelog.rst b/docs/changelog.rst index f79e3065aa..f623fa1fdb 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -29,7 +29,7 @@ New features Bug fixes ~~~~~~~~~ -- Automatically remux WAV files containing MP3 streams +- :ref:`import-cmd` Automatically remux WAV files containing MP3 streams (``WAVE_FORMAT_MPEGLAYER3``) to proper MP3 files during import, instead of silently importing them with incorrect metadata. :bug:`6455` - :doc:`plugins/listenbrainz`: Retry listenbrainz requests for temporary diff --git a/test/test_importer.py b/test/test_importer.py index d61b48032c..23629ad39c 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -53,6 +53,7 @@ has_program, ) from beets.util import bytestring_path, displayable_path, syspath +from beets.util.extension import _remux_mpeglayer3_wav class PathsMixin: @@ -1753,8 +1754,6 @@ class MpeglayerWavImportTest(AsIsImporterMixin, ImportTestCase): """Test remuxing of WAVE_FORMAT_MPEGLAYER3 WAV files.""" def test_remux_mpeglayer3_wav(self): - from beets.importer.tasks import _remux_mpeglayer3_wav - src = os.path.join(_common.RSRC, b"mpeglayer3.wav") dest = os.path.join(self.temp_dir, b"mpeglayer3.wav") shutil.copy(syspath(src), syspath(dest)) From 3f5bb512eb3afb286117e7fd782d4132e9457941 Mon Sep 17 00:00:00 2001 From: Elaine Chen Date: Tue, 14 Apr 2026 16:16:46 -0400 Subject: [PATCH 11/11] Renamed to public function remux_mpeglayer3_wav --- beets/importer/tasks.py | 4 ++-- beets/util/extension.py | 2 +- test/test_importer.py | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/beets/importer/tasks.py b/beets/importer/tasks.py index b97cf60df6..ee2b7c61fd 100644 --- a/beets/importer/tasks.py +++ b/beets/importer/tasks.py @@ -32,7 +32,7 @@ from beets.autotag.match import tag_album, tag_item from beets.dbcore.query import PathQuery from beets.util import extension -from beets.util.extension import _remux_mpeglayer3_wav +from beets.util.extension import remux_mpeglayer3_wav from .state import ImportState @@ -1085,7 +1085,7 @@ def read_item(self, path: util.PathBytes): if isinstance(exc.reason, mediafile.FileTypeError): mp3_path = None if config["import"]["remux_mp3_in_wav"].get(bool): - mp3_path = _remux_mpeglayer3_wav(path) + mp3_path = remux_mpeglayer3_wav(path) if mp3_path: log.info( "Remuxed MPEGLAYER3 WAV to MP3: {}", diff --git a/beets/util/extension.py b/beets/util/extension.py index 4301a85697..7d13c300f4 100644 --- a/beets/util/extension.py +++ b/beets/util/extension.py @@ -151,7 +151,7 @@ def fix_extension(path_bytes: PathBytes, logger: Logger | None = None): return new_path -def _remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: +def remux_mpeglayer3_wav(path: util.PathBytes) -> util.PathBytes | None: """If 'path' is a WAV file containing an MP3 stream (WAVE_FORMAT_MPEGLAYER3, wFormatTag = 0x0055), extract the MP3 stream to a new .mp3 file and return its path. Returns None if the file is not diff --git a/test/test_importer.py b/test/test_importer.py index 23629ad39c..59f676cfe5 100644 --- a/test/test_importer.py +++ b/test/test_importer.py @@ -53,7 +53,7 @@ has_program, ) from beets.util import bytestring_path, displayable_path, syspath -from beets.util.extension import _remux_mpeglayer3_wav +from beets.util.extension import remux_mpeglayer3_wav class PathsMixin: @@ -1758,7 +1758,7 @@ def test_remux_mpeglayer3_wav(self): dest = os.path.join(self.temp_dir, b"mpeglayer3.wav") shutil.copy(syspath(src), syspath(dest)) - mp3_path = _remux_mpeglayer3_wav(dest) + mp3_path = remux_mpeglayer3_wav(dest) assert mp3_path is not None assert mp3_path.endswith(b".mp3")