From 6fee7d9f6348a843f2eb9ba652075dbd902443d9 Mon Sep 17 00:00:00 2001 From: sHa Date: Sat, 3 Jan 2026 14:29:30 +0000 Subject: [PATCH] Add ConversionService for AVI to MKV remux with metadata preservation - Implemented a new service to convert AVI files to MKV format while preserving metadata. - Added methods for validating AVI files, detecting subtitle files, and mapping audio languages. - Built ffmpeg command for fast remuxing without re-encoding. - Included error handling and logging for conversion processes. --- dist/renamer-0.6.6-py3-none-any.whl | Bin 0 -> 115607 bytes pyproject.toml | 2 +- renamer/app.py | 101 +++++++- renamer/screens.py | 173 ++++++++++++- renamer/services/conversion_service.py | 317 ++++++++++++++++++++++++ renamer/views/media_panel.py | 39 +-- renamer/views/media_panel_properties.py | 24 +- uv.lock | 2 +- 8 files changed, 632 insertions(+), 26 deletions(-) create mode 100644 dist/renamer-0.6.6-py3-none-any.whl create mode 100644 renamer/services/conversion_service.py diff --git a/dist/renamer-0.6.6-py3-none-any.whl b/dist/renamer-0.6.6-py3-none-any.whl new file mode 100644 index 0000000000000000000000000000000000000000..20595a84e5a0276c06a2c035c77dce3e4c0d60aa GIT binary patch literal 115607 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
JC4a5PO;MkPx5B_BQLXYyX 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%0DMx;tVCm)^XT%NnB$v7W>pPz{-xh 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

{vGHgIjyuEtc2*`Ae1upjt1+W)|nl z{PU-ABzW}swrvA*Uyn=d4b|M#pjgHZoNbybO^VZs(>2WP1sCTB+NMH17+IuJz_QVi zux~hxLL`cKrmkVtbIfpe1;hvjH%aqb)=H83=Jnx}N^)1L-+3Hjq)a!@?*=KdSx57V5ZF#2p;g#RtpG?pLjyZ!{wL1&|rX97E;3Ws)z>LyT2CR+x%y;==BtH zXN;T4a(V50u~0x=C5IU_^^5cIrZBgAQQNZh%iy@9QX^>4BKubNEU;xD%2MNOUKulaZgHWEaE4hbA}js7sG{NYH_%D+9-}e`%?%wnf@uS_iruUmOgX9|tJGBj5_-)Ye=5x)Ee6>@lSbRW4wox=J8y%X z?k(j&jCIWw?N0jEy62+eHXf!Q=1jRO}yGK#{-Mf;Lc-$FwtYEBL1zav=+19A_^XA9Q)Uf{; zvD90^TIST>00hQ#4-3%1k6IE))uPz~Q_O=F%oEV`ANr4XfB;dcq1MIKP^6$MI}C3p zF?9e+}-F_0Dv?>@DeQi~21JV;UVza?KhU|FlzCR?XC|D20?@daE+ zBL@)yC3%?Mw3F*^b(;ZCJ|UqiwbIXRNtEelgix8_`@s5KpJ!(2JS&Gk5BY+Ca)P!2+fuO48+bkndWTr@e32bAncCHYe_z(i$PB z{efS!JVyHdck~V=t71!$mD))Qm|9y4@E}B?(4aX6MNfoJbD4>PLl5ECKy#0h`=8_j$*$t7V{`jgtU-E(?`Z^+2by1kT-VCl(1<^(*9reEB+!)W=Lo!hr|huXxz=59Fzn=}aL_L3|OV z+DqY2a_#Uc4gcT7)b0n7w-j&y05`$^i5L05ZaTgHUk8ngX&Q-B23 z6NQ3u66^i-Y(Oz57t76QCswWd1z6-#&uqi~bi7(!oEbA?(Gq2z2*3Bi7WPoyIi~g| z*Z9w>ET(rgCR!9sB>%%$ljIbm#Mqah zT0oM1hUBQQN_E6dj1K3Q5-w*Q5K8W*-Pf!XI_^yo&qRlAzv(F$aL6mM*EKQ9&5-9ODIa`CH?`RFS$;jXJzJ?*?CQD!eCK-V6a44G+SEz_0naBY!ki7rxH0uSu3FK_;hFzPoFT-PMuX&DMw9ZKb9T9>Qb%4_QvL=-A` zPrvhmBRvF}T98a*;a=_oAGSFX+WSnJw^k3wp3@J2t7-=nf)p~yR1`RA6BupnBj}>z z3fv&5R%X+)K)QC_GnlC4-J7v%!r0eY%b$87_FIAO5M2W87%L=$@^;4P!*9Le>4M}} zb6V5gIa-yLXGZkUq8f%B^TWx(RW~(|YiVFP4pT0-2850=A*vO%X_~6+(A`yn^2+nM zXr9o64LfZl6+t^Si(!{-EEeS);;t}$$)HffG-dJahk2Z95<%1|oXC*&+!RcbspM|g z0xMm)ioRCOqlY<7t_i~kcuO8NktMKmne8a0z32$RKG%%>bGF*{7xfTL=UZ7pT1L3 zzvc;vA}e0}Y3Uau^>qz_j8(SoIgCzTRK}t?xJZlBZox6LcDb-@OCNWjxW%HcGn`tN zaP^$D>ss<*2$kfSgccMA0JR>4P>M{|ECR+ugWX2B=&6<9!F7^irYA>^^_m_srM1#9 z**0mp)r9gFmzN+p+E{0`i#D9!iR$)C78;*ji4EFYI)Ie{?FNi*okmfX(fx z&;uuix4CSOAv`)=-Bakd^0zUri@B^27%trW0vd*tXgtP?C z7BNqOrd>P>IUIAZL+rNzgw0j#ezK0*`M0QAA35VJ^G)1Wj;#t&D?0c7J{*Yck&v(Y0A#2ew#q!RieVr{|MTVU2 zKsn!Bs?u7ycKs(FYpiL!Y+S2QBhiH zRQTKl)fI%n#=Ps!>7hmYbgb>w6N|k4D^m zLszrF_l9)DBR#VD8!z`kp^jW?bMUuvk=tmClPt}1bodtD|JwX|Ytq-=C5!-);4W|u zXkj}a?bH4KmmT*p=%E*coYk@n*oL1>= zJI;SLXO6J%ADs{9C(b%k_rxkB?M<_ zt|M|{Qy8B{qK|ntv!+dr2AYFxq+AsZ9fz<`EBkV>arkEZc{G!kKx3@c@&uHQ4S{qN z{J6}_*3CSpF+wN#5blSjSBDCiv7C7voqQ|WgF%0_Csr~S<_5z++7jkz1=k6XrRG8- zA}b<)WWKnnVj&_G8W!dZqC!=s>Tzme_K5KTN0rV8LPaM-*VphE_Vdl}#REpQ4PZf! z;k^Jz|6cX*g0vkV?Z9%b=!1?+?7G#SG`|19tXAj3??wpy~aTtFz45){z>u z#?XM3E2xw|5_|>X79s-Hn%y2zAM^kh?VWslpg-o|q>reXAEq)0U&IL1)>x{C1eLz( z6lRexL$ko(job`*yZa$Pik6kPW`-Qvcn%m^lj#*l^5SI(wj{5Rcz#6khLwj@e`NfX z$~A43IRXsm*-$m(@jy?uRwh#0tlYzVxD4zElmJPdn?O@ohk6`f6eg3)U04W9^!WV1 zKWa%VTtvqG=k7*WO)MK|fpwMC_+tj7W5Pds2go;-wb5Xat028O4eAH5TO>2TJ_2O^ zb>;ZpcGHmT8P0ZgKWvrN7@7Up`*@u-Tsi={p=|MFjvuAH`!1s9pmq3kT&ItqH>kNG z55}VHP+qGpU?J!H8 z61ze%wgU30#i`86)%5BE1Wq?MO$%NH({o}DKq?PWbX zuMVY9obCdm5Ayfg8Fz-RW>a`819Ne1%w5Z1!~l`WpTz)dv3}o_OR1)uJP*8M}-Mu0Fx8|kip`Kg1JT9rk!g( z?5Zlk$?j_J;qFA}h>o_OA@3pHWL19p`-UY2Qp-M;ILc;j++_102aRmo{D_lNMS4bE z1KoBwW{2>Uh(_z~H;NSMu`fLrsV3VruNtTem@*!gdQUWmXpkEYt?88J#hG%E*SGsp z6}kC0OJ3U(CCz^fO^_Bm>wj3+cAjH{W0PrMZSUcuw!*hw)vAzOG49L-wcl9i@a|>5 z#Vwmg8z*i<#^9e@gWPU{<{yj_Yur8Sd!x8k;-svC^6o;S;hx3%JN5sc#?Cq}s^tsd zln6?LAV^9IQi38#cL<0yNV9bBB7$^^5+bNbh)PPg(x4(C4bm+op;7`;zrptaci+B! zzwvWFi+{}bo;l~t%(-*t&Y9g6id?@wv+CayX4rGSSg_w`zssa~RYv23WOR}k_7FH+ z)sP|lOCp#$SlB6Xz&u`6IXd;iNxDOGQOIejM;82T7JO3(dq1F&f6))t1!DqaIDt6jpV{J=0I$bP9 zy^H+;{J7sfzm*`&sUmrk`dXSf7N*&klp{lPXB7P$-rjbS&)x$se|)v5$FF((>t!?` z^YmSc;apWZYqL{^F$*%qQ|-V-Krn>chFUN^>5amSfV5-^P>S zq|#!F$rMyva8^okL1FeoZ9WVH3zes0n<+JCVC zo4FoSNm@^6@TJ;ULiM}!VG__e+Fk!SS6D}SErXP739+X?6;}w20}-*k6XqOuEM_E? zlJ6rDEXH78QG=An0mWtK8$wmsF6Ek*u~0AzxAW@x`Xo3-33Bomv-c1*DQDef3=j7u zmBF9cOO7>%swS^L**c}z&6skdTQ$pxtB^Th}23xoLbRPyR?v4`iGo>>Fl5N3Wd zjoyNr{#4aQQ@P?CUq#`>zz)atQPVe1?Xh+6`x^>U`YO=S1R0qdBCqtTTt$BcO`c*L z8s7Ucfyr+dxyQpk&`?}Hl~qB%T^`tRyOwJ_vs4EEvtGwsAdN=fs0te61<`D~#pG8T zqu3dxo?Mz**WSi;z755x>W+)q5bD3g&8`_RY3!sY&Dq@MjUUi>iC><)ylPBo7MZ0Z&1*95`b!?x|^Hpqd zxFml4T0%Uf-R$hCCydt+w*2_4vLDoMn6K_1cMLeS`ysgvJb2Y!F%4O`mTYRgiz7PG$b?)HX^ba2Xcx`W@ zPy2?m*|qTY3F$A(X!PXwh3(wst0}*U&|oHvZ z&t!%-Y)WGBVds)bXAILHCIcgY=Gmf=dJjR7Njg91O)p zr<3@NQ|LcQIgD+HioIw$H|o~?PQ7`}_nmDl#kYITfw~KxWwZS0o~iX0rv|1kQ`_&8 z6VSaVaR`cBWwAN++Jj{Gk7tAfv7Reo=gR?+9Kgi}E|=ejgSz}fEQkZl#ofrs(b@q9 z<$~RTJy21?FXs)miw;Xg|&(tiRo2?M*@T#FpAQ~`*T>tAD$7E zC--8i$nqOa%UrF)`9<1Y4_Vw;J{j6|UU9XO=k78EpW-OZl&kReEB{pvf|gG0x(9)b z&cg5B;W8H_rHC$0zWpX9ABr=?8FAlDNZfyUvM`mDKg}EydqGWSXHcireSsgtWEU5M zh-|O^zFYr~rdJu2OgHb_WM6j7D85u4wen5gC9(W6SmoiLG zVzV+K&x;G5W&iRMM+@^rCswh7m7oGSe=*yYd5yfbZ%Z!zPK!^2UeZ}CtI4;%oUkel zwA2|YOu3>))c94P-TUS6lKrN^1Zgnu=UGig6(WE1v3n-nUZQAHV_cW%l1>x0T-DVz z9KPIVQsqbNWE)Sxtv*v3gEa+tha2epa5MP9B+VS5@`g44>;o@GrmgX?J9^RIQyRzP z?t*;7Cz(AdxO9|Xw{Lgj_>zX2jtf{!_jyz8%kmSg25q&Ce_7BQqY9?8d@O!CAg<}W z>XI&0c@OtGrk9E;7MjG^J#d84*>v}vCMKFCdqIk>)O3Qo&^i&v#C&ms&6i&@jaS@Y zpR(P4+%lL7^kw@ME||UKc(p0jAG!0UU)N|XcJd8WOxJSEIna_m7blY< z%$OLQhCB-yZC9o9RQ~E0be}$&hqk=t8E-;KUh~k08#N}QZbqDEmpA_+m`k>;e8J(AW}10*F5lNh*VC+oKNQ~hTn((z zcQF`Z?P`~JK{g$hIyK2IG;^w8WI~0ew~vatFIH}vG?1hby>e{9PiW)xe z#*^>dGOM{J-A-n`sgE|mTLfwG*w`gjH|#ZxPfg1^3tMZFjnWv7_9gup6|r1+murVz zLXHv^s!Ow+n28yaIZGkWM_VwJ<&e|&Vu?I!viTCHsezfm-D&!WjJoe4r?G+s)>w>Z zY^sKyaQD)#+_{S>PDDpS5w)#HZgs<9bHP&*_pG3#tn*~#^!V=1T3uw5=hsHE+d^4q zZFO;7qj_mx&tJQc_?o0uc9!!>SeDW)6`bqiayyI;WhoN9irmp(Hb31C?$urN=h9tV z$jXEl^s|EMhMZYmDPcLDz{H9?VS9%iG!f#q9#5ZF3_Fs>~NMC>B^j25Z3Q^){K+j|u*O>)1-mfpD9V#PBM53P?V_fwNemNMu zk5kPjg5COM(!h|Li~R`)gJ4G0bv07A=%V#a#d>B*a42d373B|u=T=oATeg*79l zxOyo~-;*jl@(H9XV?7&?)+)@sT)TCB^3-Eyt{@!C-q>*&5@kdD$xQ5W*Q5-hDV=5K zzRj!+I`;1+jJ9kK;~sACiM`Gyc6cSffR2^W?ipmz&Lr*N#6EQiiot-lCx?OLpw+gS{Z`o>K*(!pJCe$i~8f#bE$2rWw~=bpGM>OLiOUN z*b{f37I*19D9eIdbQIR1xx}H% zy+(rzfs8~hA6h31!z-k69N&Dx&)2Y8dx}Hpj-N~G$nHO2>zUhH{E{>oqrg&vJG7+T zHN@fTWc7sxF*#L_8f}tFbLG^;KEDpUSr_ab6X#Yf(_sukx`$L^!dg#%){zOqT0-tI zGA5kd!D?+hHG$U^r>11kqJFAhS?I!#tK%#WD#_38*-wO$;!&4pw7(HEchJ|4JFlfR zG8S0SXH(AQ@}!)_ZghYVetyVYE{PWTtEo9Mt8t$)&|-8H0FYr-!jeF!)^9S>KTWyA|(oWMHZCwn3<Xr{axhznh`Ox2|3Z?uf*XB)|)D{c6Z zT+2=po0H3YYCQiqg85?(g@uO6d_C#tu*+SdL1vN@kE*BLa`GG=EiKybysh+F|K3;d zt!O^m7A=AZ(-tHUCnxB$h_y1Y8rn3(EknXSKN%tY@OFLs)XGp!O8g3sXae#5Z|EY=WUfgWhmM}s_wZAH zGL{FE>uF@16#DGE=^*dXHTZyF*==UjKHcDZUf^!~8^T|!154c&RJMsyK=9+I)E`pf*&~EO{B* zvI|dNU2y4fT*w4jaE%_P^j_i~bZ+~a=X$sG9f_&LPgT@1n9TN2*SN;)wP^+WE{zXt z^fti-rq#jC?brHzzWR7wHI9aQ*+NEwN37~1yvirrD}-Lt{gdK) z_1@--&x160?DftiWy|zx2Gbh(YFb6L_lp_5qqo@;aM+5SCb1@J1;+QxQ~S0xD{6)# z>vk9L#a2_y%;nsmsW;XtK3%DlflNQL&b^y!Gk|veypm-_=|ZM=qA}5q#cm(>_Xfd+ zg@zYK+YGs)P-=S4vn*sL)=SzV8=iR8FbSrt2IlyRi+%yKC8Uow)T33ge)0P5`qQzv z70;jh?)1&dc_lvkIR}ixq>QO|=H|1JO^^t56;Ga4eI{_SpLipQg4a84RnH}+5;GN# zRnxxAiiXPR3d1%=*r$YRL#mN9qrIbE@@s@Ubi@?(Qq=B&_p4nEO*Sps%Cl*>&fK+t-J`5ic@V`@L+r=AkmgNnW?vIYR6c8T*sQ6&fY+4mVir z)IyZ+{&2No&Hhq{LCm0XQC`cyc#n8qo`fL7qYeL0t$I=9At|_@3e4mDyy~SolgGCj zc4226Hlp6^;1xj^(^O0Jn25(rC)d&S3R)r}J1^YV_3&zy;X$MQF_dc^FB;)pwGz{? z8WNVE&lHHqzf?vzyK~oFPVydQ&h+aW3tZW*(*^o<9m&7g! zzgvEbdq{dKsZVHOiS5c{`gx-~EK#i&K{F)=-ypZ$TB9~L+zWO%&7F*|Tc3;W)8y8A zK0GQi>mgKGjxL=iE*sK3op6bec<>X)DTbQiUrw|M$>lZ*lAdeXFXCh& z6TDEOP}7aa%FIUXPBtoMCA=~B&XA3LzF4$9y=*6RGu&4BnS+h9t4B-2o8_73O3dkC zQ)c!P`XR4}7(8dUWp~R1BfNjP{kUUrOHNb$uBd=@fPr;ma7n_4A{W!dGNXA#({0WY z8&g$E-w*d3$A8L^^!j|kaH1EE)_==Yg55F5!Q;We{irKhL*YfNAX!gg{=5Df2BVPs zk<61EF$BArQ~CkSMYq3tP`v%6mD`>1Z2o$D7%femFf1uFBG2+^WdhN|9qgS2!=YcU zx4d~mWjk{z0#nYVED109-5|O6!FHF5r_+e{qv^fPD0_h`Bq}%rUVST=zZfq}I&ALx z5KWw@?%}PQ7?*bHyiA2AX0?DZ|Q4CwfM6eV&+==%n~syl)L;(DHF?Rl8Y(mTXGKA*qF%zPTm5m21g~u&k#s>cym)%dt{X}+QrpBfhxKH0AD%s%yDIV z6Ke+~cgEs1eT5DxYJfX~jgLnq#V-V;b2+@T3&aj$0)-%{Z$++~f&nT{t0LBaOL1Hu zYUTogI2;_wi`a5+UfC^daDPE?!QX!#e0y|we<%b1z}nA0>p$@BX3GSxncKk94ZPXt zK`xr(`Y@QagC#P6I{(1A#{iH3K6g6U7kgMz{IpUxct(9lx+YD5qb<`4iefjPP$Ytr>gx*u4; zGL{xNoC3Z{Env0nP$z#i$=<{PoK=AoW9pY4#(V+|?HYL12QSZs8;BSv3`hg9{A+g} zqK$d3rb)oUuy8dAjk#`ez0PESitmQa|}Gnv4_&bi3{xpKLhkB~8d@XpmxI%D4oiyP zE(|FY70j=7G`R>!s0Pl1KX`+1SW^5xcp`-zWFY%T4qn8;W;Hx`p$?3Cm#-sIt9<{J z`a7=~Dp|d`EHih(_|WK_^5d=M9$V&nBR^+yp9scW}n6W1@wl zi~aALOHS1%^8LSgE3+jcs%?#R$hga z49pBcjkK^b=bHvXz6Dr#I|tPKI}%m%&5h3v9fYFafePT=JhK)#(G|oF2Xi6Hw#T@< z1?xg+Xp_L~@NTa74mB2)u+nPgvI2n02{a12wS-u3OpPHvi~XV+BPf}6L2|z z!^0~LDl5d7Gg^bsi*6|5^I`tviu`V21kkmW}kQkWIQ4t#=v z()VATktmP`?N$c*1o8J#N%3oKN6K`8KppMCNooIO{;+p(pDF;32f*PCrPujiU{p#l zREu-F0ho=zTj9HuK^Iak)Y{`ex>Q_t&x?})83=3--=%(Z|2qD^ID@e>5bI}9$52vBaQ6U59Kj3&QlI+WeYK600M51<(V8h)^%?fY-^(Jhe-gWozt zKe+=HyataT@S3$4KuU&zzJ+=Wu%!AmD+D}?0u0yinms@K??_Za?#tDOn1JSog66~b zf#+k$i7qB)wy347tJXyi1k4;TQo%P|Y61llm6(pPF&|9F9 zho~NY7+98Sc|ov52*yzO2B%FSA%PJ1Hh4Nb=$?Pmkyv{Cnf^*1nAMvA5Wd0Zejs5U zgkVN6upoc}dB%6y5Ce#L5%hIg~b65 zi2?Y8aENbVfq4-R(WoP22o#`vJ0qxxy%Vs(@A&e-8pswAyj?vosX&iInkCb77Z(l%e3M1b*@wphreTIc|A(EIzvpdITZpWbl!j z5;HQ`{}uN?n5ThW2G)oLQ!G3boAuwIzr%iW2n=F&Fo_{)wn5E}A$HJg9k7xI5A|h7 z2}Ko5FRtHuQ3JXh6Ca{3zjGml9);CNB$Ou}?kEM#ro=}Ktro5#gZ+QcCH_@accMWL zp#VcG{ER&-jGFrQI)s^K_3%y;g{%f1Iw12tz!&>KOLc6%mGbkQE{e@yvu{)&rko)?Z&V8G&HS z8fIjK#Bhiw3mjvzeGxH#Es!0aGk_=%;^)%GBnA+190r1a3G@dE{^MyxDB_n|$I$Hu zh|qudJwkJleIjzq>xw+${bMKO;RhpsN{4Lg>M`x!(|@OFA8cerL?LcBJx0;R{yPeB z^C=<~ao^}MH5&yLZWk#c5^?wFA+p$S3kCA8y`(pkPJjUy4NV*T>j!HiuQR|biS|D{ CwJC!D literal 0 HcmV?d00001 diff --git a/pyproject.toml b/pyproject.toml index 77d0d6e..ac67466 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "renamer" -version = "0.6.5" +version = "0.6.6" description = "Terminal-based media file renamer and metadata viewer" readme = "README.md" requires-python = ">=3.11" diff --git a/renamer/app.py b/renamer/app.py index e13a9fd..93287bb 100644 --- a/renamer/app.py +++ b/renamer/app.py @@ -12,13 +12,14 @@ import logging import os from .constants import MEDIA_TYPES -from .screens import OpenScreen, HelpScreen, RenameConfirmScreen, SettingsScreen +from .screens import OpenScreen, HelpScreen, RenameConfirmScreen, SettingsScreen, ConvertConfirmScreen from .extractors.extractor import MediaExtractor from .views import MediaPanelView, ProposedFilenameView from .formatters.text_formatter import TextFormatter from .formatters.catalog_formatter import CatalogFormatter from .settings import Settings from .cache import Cache, CacheManager +from .services.conversion_service import ConversionService # Set up logging conditionally @@ -68,6 +69,7 @@ class AppCommandProvider(Provider): ("scan", "Scan Directory", "Scan current directory for media files (s)"), ("refresh", "Refresh File", "Refresh metadata for selected file (f)"), ("rename", "Rename File", "Rename the selected file (r)"), + ("convert", "Convert AVI to MKV", "Convert AVI file to MKV container with metadata (c)"), ("toggle_mode", "Toggle Display Mode", "Switch between technical and catalog view (m)"), ("expand", "Toggle Tree Expansion", "Expand or collapse all tree nodes (p)"), ("settings", "Settings", "Open settings screen (Ctrl+S)"), @@ -102,6 +104,7 @@ class RenamerApp(App): ("s", "scan", "Scan"), ("f", "refresh", "Refresh"), ("r", "rename", "Rename"), + ("c", "convert", "Convert AVI→MKV"), ("p", "expand", "Toggle Tree"), ("m", "toggle_mode", "Toggle Mode"), ("h", "help", "Help"), @@ -352,6 +355,45 @@ By Category:""" else: self.notify("Proposed name is the same as current name; no rename needed.", severity="information", timeout=3) + async def action_convert(self): + """Convert AVI file to MKV with metadata preservation.""" + tree = self.query_one("#file_tree", Tree) + node = tree.cursor_node + + if not (node and node.data and isinstance(node.data, Path) and node.data.is_file()): + self.notify("Please select a file first", severity="warning", timeout=3) + return + + file_path = node.data + conversion_service = ConversionService() + + # Check if file can be converted + if not conversion_service.can_convert(file_path): + self.notify("Only AVI files can be converted to MKV", severity="error", timeout=3) + return + + # Create extractor for metadata + try: + extractor = MediaExtractor(file_path) + except Exception as e: + self.notify(f"Failed to read file metadata: {e}", severity="error", timeout=5) + return + + # Get audio track count and map languages + audio_tracks = extractor.get('audio_tracks', 'MediaInfo') or [] + if not audio_tracks: + self.notify("No audio tracks found in file", severity="error", timeout=3) + return + + audio_languages = conversion_service.map_audio_languages(extractor, len(audio_tracks)) + subtitle_files = conversion_service.find_subtitle_files(file_path) + mkv_path = file_path.with_suffix('.mkv') + + # Show confirmation screen (conversion happens in screen's on_button_pressed) + self.push_screen( + ConvertConfirmScreen(file_path, mkv_path, audio_languages, subtitle_files, extractor) + ) + async def action_expand(self): tree = self.query_one("#file_tree", Tree) if self.tree_expanded: @@ -413,6 +455,63 @@ By Category:""" else: logging.info("Not refreshing details, cursor not on renamed file") + def add_file_to_tree(self, file_path: Path): + """Add a new file to the tree in the correct position. + + Args: + file_path: Path to the new file to add + """ + logging.info(f"add_file_to_tree called with file_path={file_path}") + + tree = self.query_one("#file_tree", Tree) + parent_dir = file_path.parent + + # Find the parent directory node + def find_node(node): + if node.data == parent_dir: + return node + for child in node.children: + found = find_node(child) + if found: + return found + return None + + parent_node = find_node(tree.root) + if parent_node: + logging.info(f"Found parent node for {parent_dir}, adding file {file_path.name}") + + # Add the new file node in alphabetically sorted position + new_node = None + inserted = False + + for i, child in enumerate(parent_node.children): + if child.data and isinstance(child.data, Path): + # Compare filenames for sorting + if child.data.name > file_path.name: + # Insert before this child + new_node = parent_node.add(escape(file_path.name), data=file_path, before=i) + inserted = True + logging.info(f"Inserted file before {child.data.name}") + break + + # If not inserted, add at the end + if not inserted: + new_node = parent_node.add(escape(file_path.name), data=file_path) + logging.info(f"Added file at end of directory") + + # Select the new node and show its details + if new_node: + tree.select_node(new_node) + logging.info(f"Selected new node: {new_node.data}") + + # Refresh the details panel for the new file + self._start_loading_animation() + threading.Thread( + target=self._extract_and_show_details, args=(file_path,) + ).start() + else: + logging.warning(f"No parent node found for {parent_dir}") + def on_key(self, event): if event.key == "right": tree = self.query_one("#file_tree", Tree) diff --git a/renamer/screens.py b/renamer/screens.py index bc9da09..dcc959f 100644 --- a/renamer/screens.py +++ b/renamer/screens.py @@ -342,4 +342,175 @@ Configure application settings. self.app.notify("Settings saved!", severity="information", timeout=2) # type: ignore except ValueError: - self.app.notify("Invalid TTL values. Please enter numbers only.", severity="error", timeout=3) # type: ignore \ No newline at end of file + self.app.notify("Invalid TTL values. Please enter numbers only.", severity="error", timeout=3) # type: ignore + + +class ConvertConfirmScreen(Screen): + """Confirmation screen for AVI to MKV conversion.""" + + CSS = """ + #convert_content { + text-align: center; + } + Button:focus { + background: $primary; + } + #buttons { + align: center middle; + } + #conversion_details { + text-align: left; + margin: 1 2; + padding: 1 2; + border: solid $primary; + } + #warning_content { + text-align: center; + margin-bottom: 1; + margin-top: 1; + } + """ + + def __init__( + self, + avi_path: Path, + mkv_path: Path, + audio_languages: list, + subtitle_files: list, + extractor + ): + super().__init__() + self.avi_path = avi_path + self.mkv_path = mkv_path + self.audio_languages = audio_languages + self.subtitle_files = subtitle_files + self.extractor = extractor + + def compose(self): + from .formatters.text_formatter import TextFormatter + + title_text = f"{TextFormatter.bold(TextFormatter.yellow('AVI → MKV CONVERSION'))}" + + # Build details + details_lines = [ + f"{TextFormatter.bold('Source:')} {TextFormatter.cyan(escape(self.avi_path.name))}", + f"{TextFormatter.bold('Output:')} {TextFormatter.green(escape(self.mkv_path.name))}", + "", + f"{TextFormatter.bold('Audio Languages:')}", + ] + + # Add audio language mapping + for i, lang in enumerate(self.audio_languages): + if lang: + details_lines.append(f" Track {i+1}: {TextFormatter.green(lang)}") + else: + details_lines.append(f" Track {i+1}: {TextFormatter.grey('(no language)')}") + + # Add subtitle info + if self.subtitle_files: + details_lines.append("") + details_lines.append(f"{TextFormatter.bold('Subtitles to include:')}") + for sub_file in self.subtitle_files: + details_lines.append(f" • {TextFormatter.blue(escape(sub_file.name))}") + else: + details_lines.append("") + details_lines.append(f"{TextFormatter.grey('No subtitle files found')}") + + details_text = "\n".join(details_lines) + + warning_text = f""" +{TextFormatter.bold(TextFormatter.red("Fast remux - streams will be copied without re-encoding"))} +{TextFormatter.yellow("This operation may take a few seconds to minutes depending on file size")} + +Do you want to proceed with conversion? + """.strip() + + with Center(): + with Vertical(): + yield Static(title_text, id="convert_content", markup=True) + yield Static(details_text, id="conversion_details", markup=True) + yield Static(warning_text, id="warning_content", markup=True) + with Horizontal(id="buttons"): + yield Button("Convert (y)", id="convert", variant="success") + yield Button("Cancel (n)", id="cancel", variant="error") + + def on_mount(self): + self.set_focus(self.query_one("#convert")) + + def _handle_conversion_success(self, mkv_path, message): + """Handle successful conversion - called on main thread.""" + import logging + try: + logging.info(f"_handle_conversion_success called: {mkv_path}") + self.app.notify(f"✓ {message}", severity="information", timeout=5) # type: ignore + logging.info(f"Adding file to tree: {mkv_path}") + self.app.add_file_to_tree(mkv_path) # type: ignore + logging.info("Conversion success handler completed") + except Exception as e: + logging.error(f"Error in _handle_conversion_success: {e}", exc_info=True) + + def _handle_conversion_error(self, message): + """Handle conversion error - called on main thread.""" + import logging + try: + logging.info(f"_handle_conversion_error called: {message}") + self.app.notify(f"✗ {message}", severity="error", timeout=10) # type: ignore + logging.info("Conversion error handler completed") + except Exception as e: + logging.error(f"Error in _handle_conversion_error: {e}", exc_info=True) + + def on_button_pressed(self, event): + if event.button.id == "convert": + # Start conversion + self.app.notify("Starting conversion...", severity="information", timeout=2) # type: ignore + + def do_conversion(): + from .services.conversion_service import ConversionService + import threading + import logging + + conversion_service = ConversionService() + logging.info(f"Starting conversion of {self.avi_path}") + + success, message = conversion_service.convert_avi_to_mkv( + self.avi_path, + extractor=self.extractor + ) + + logging.info(f"Conversion result: success={success}, message={message}") + + # Schedule UI updates on the main thread using set_timer + mkv_path = self.avi_path.with_suffix('.mkv') + + if success: + logging.info(f"Conversion successful, scheduling UI update for {mkv_path}") + + # Use app.set_timer to schedule callback on main thread + self.app.set_timer( + 0.1, # Small delay to ensure main thread processes it + lambda: self._handle_conversion_success(mkv_path, message) + ) # type: ignore + else: + logging.error(f"Conversion failed: {message}") + self.app.set_timer( + 0.1, + lambda: self._handle_conversion_error(message) + ) # type: ignore + + # Run conversion in background thread + import threading + threading.Thread(target=do_conversion, daemon=True).start() + + # Close the screen + self.app.pop_screen() # type: ignore + else: + # Cancel + self.app.pop_screen() # type: ignore + + def on_key(self, event): + if event.key == "y": + # Simulate convert button press + convert_button = self.query_one("#convert") + self.on_button_pressed(type('Event', (), {'button': convert_button})()) + elif event.key == "n" or event.key == "escape": + self.app.pop_screen() # type: ignore \ No newline at end of file diff --git a/renamer/services/conversion_service.py b/renamer/services/conversion_service.py new file mode 100644 index 0000000..9fa03b4 --- /dev/null +++ b/renamer/services/conversion_service.py @@ -0,0 +1,317 @@ +"""Conversion service for AVI to MKV remux with metadata preservation. + +This service manages the process of converting AVI files to MKV container: +- Fast stream copy (no re-encoding) +- Audio language detection and mapping from filename +- Subtitle file detection and inclusion +- Metadata preservation from multiple sources +- Track order matching +""" + +import logging +import subprocess +from pathlib import Path +from typing import Optional, List, Dict, Tuple + +from renamer.extractors.extractor import MediaExtractor + + +logger = logging.getLogger(__name__) + + +class ConversionService: + """Service for converting AVI files to MKV with metadata preservation. + + This service handles: + - Validating AVI files for conversion + - Detecting nearby subtitle files + - Mapping audio languages from filename to tracks + - Building ffmpeg command for fast remux + - Executing conversion with progress + + Example: + service = ConversionService() + + # Check if file can be converted + if service.can_convert(Path("/media/movie.avi")): + success, message = service.convert_avi_to_mkv( + Path("/media/movie.avi"), + extractor=media_extractor + ) + """ + + # Supported subtitle extensions + SUBTITLE_EXTENSIONS = {'.srt', '.ass', '.ssa', '.sub', '.idx'} + + def __init__(self): + """Initialize the conversion service.""" + logger.debug("ConversionService initialized") + + def can_convert(self, file_path: Path) -> bool: + """Check if a file can be converted (is AVI). + + Args: + file_path: Path to the file to check + + Returns: + True if file is AVI and can be converted + """ + if not file_path.exists() or not file_path.is_file(): + return False + + return file_path.suffix.lower() == '.avi' + + def find_subtitle_files(self, avi_path: Path) -> List[Path]: + """Find subtitle files near the AVI file. + + Looks for subtitle files with the same basename in the same directory. + + Args: + avi_path: Path to the AVI file + + Returns: + List of Path objects for found subtitle files + + Example: + >>> service.find_subtitle_files(Path("/media/movie.avi")) + [Path("/media/movie.srt"), Path("/media/movie.eng.srt")] + """ + subtitle_files = [] + base_name = avi_path.stem # filename without extension + directory = avi_path.parent + + # Look for files with same base name and subtitle extensions + for sub_ext in self.SUBTITLE_EXTENSIONS: + # Exact match: movie.srt + exact_match = directory / f"{base_name}{sub_ext}" + if exact_match.exists(): + subtitle_files.append(exact_match) + + # Pattern match: movie.eng.srt, movie.ukr.srt, etc. + pattern_files = list(directory.glob(f"{base_name}.*{sub_ext}")) + for sub_file in pattern_files: + if sub_file not in subtitle_files: + subtitle_files.append(sub_file) + + logger.debug(f"Found {len(subtitle_files)} subtitle files for {avi_path.name}") + return subtitle_files + + def map_audio_languages( + self, + extractor: MediaExtractor, + audio_track_count: int + ) -> List[Optional[str]]: + """Map audio languages from filename to track indices. + + Extracts audio language list from filename and maps them to tracks + in order. If filename has fewer languages than tracks, remaining + tracks get None. + + Args: + extractor: MediaExtractor with filename data + audio_track_count: Number of audio tracks in the file + + Returns: + List of language codes (or None) for each audio track + + Example: + >>> langs = service.map_audio_languages(extractor, 2) + >>> print(langs) + ['ukr', 'eng'] + """ + # Get audio_langs from filename extractor + audio_langs_str = extractor.get('audio_langs', 'Filename') + + if not audio_langs_str: + logger.debug("No audio languages found in filename") + return [None] * audio_track_count + + # Split by comma and clean + langs = [lang.strip().lower() for lang in audio_langs_str.split(',')] + + # Map to tracks (pad with None if needed) + result = [] + for i in range(audio_track_count): + if i < len(langs): + result.append(langs[i]) + else: + result.append(None) + + logger.debug(f"Mapped audio languages: {result}") + return result + + def build_ffmpeg_command( + self, + avi_path: Path, + mkv_path: Path, + audio_languages: List[Optional[str]], + subtitle_files: List[Path] + ) -> List[str]: + """Build ffmpeg command for AVI to MKV conversion. + + Creates a command that: + - Copies video and audio streams (no re-encoding) + - Sets audio language metadata + - Includes external subtitle files + - Sets MKV title from filename + + Args: + avi_path: Source AVI file + mkv_path: Destination MKV file + audio_languages: Language codes for each audio track + subtitle_files: List of subtitle files to include + + Returns: + List of command arguments for subprocess + """ + cmd = ['ffmpeg'] + + # Add flags to fix timestamp issues in AVI files + cmd.extend(['-fflags', '+genpts']) + + # Input file + cmd.extend(['-i', str(avi_path)]) + + # Add subtitle files as inputs + for sub_file in subtitle_files: + cmd.extend(['-i', str(sub_file)]) + + # Map video stream + cmd.extend(['-map', '0:v:0']) + + # Map all audio streams + cmd.extend(['-map', '0:a']) + + # Map subtitle streams + for i in range(len(subtitle_files)): + cmd.extend(['-map', f'{i+1}:s:0']) + + # Copy codecs (no re-encoding) + cmd.extend(['-c', 'copy']) + + # Set audio language metadata + for i, lang in enumerate(audio_languages): + if lang: + cmd.extend([f'-metadata:s:a:{i}', f'language={lang}']) + + # Set title metadata from filename + title = avi_path.stem + cmd.extend(['-metadata', f'title={title}']) + + # Output file + cmd.append(str(mkv_path)) + + logger.debug(f"Built ffmpeg command: {' '.join(cmd)}") + return cmd + + def convert_avi_to_mkv( + self, + avi_path: Path, + extractor: Optional[MediaExtractor] = None, + output_path: Optional[Path] = None, + dry_run: bool = False + ) -> Tuple[bool, str]: + """Convert AVI file to MKV with metadata preservation. + + Args: + avi_path: Source AVI file path + extractor: Optional MediaExtractor (creates new if None) + output_path: Optional output path (defaults to same name with .mkv) + dry_run: If True, build command but don't execute + + Returns: + Tuple of (success, message) + + Example: + >>> success, msg = service.convert_avi_to_mkv( + ... Path("/media/movie.avi") + ... ) + >>> print(msg) + """ + # Validate input + if not self.can_convert(avi_path): + error_msg = f"File is not AVI or doesn't exist: {avi_path}" + logger.error(error_msg) + return False, error_msg + + # Create extractor if needed + if extractor is None: + try: + extractor = MediaExtractor(avi_path) + except Exception as e: + error_msg = f"Failed to create extractor: {e}" + logger.error(error_msg) + return False, error_msg + + # Determine output path + if output_path is None: + output_path = avi_path.with_suffix('.mkv') + + # Check if output already exists + if output_path.exists(): + error_msg = f"Output file already exists: {output_path.name}" + logger.warning(error_msg) + return False, error_msg + + # Get audio track count from MediaInfo + audio_tracks = extractor.get('audio_tracks', 'MediaInfo') or [] + audio_track_count = len(audio_tracks) + + if audio_track_count == 0: + error_msg = "No audio tracks found in file" + logger.error(error_msg) + return False, error_msg + + # Map audio languages + audio_languages = self.map_audio_languages(extractor, audio_track_count) + + # Find subtitle files + subtitle_files = self.find_subtitle_files(avi_path) + + # Build ffmpeg command + cmd = self.build_ffmpeg_command( + avi_path, + output_path, + audio_languages, + subtitle_files + ) + + # Dry run mode + if dry_run: + cmd_str = ' '.join(cmd) + info_msg = f"Would convert: {avi_path.name} → {output_path.name}\n" + info_msg += f"Audio languages: {audio_languages}\n" + info_msg += f"Subtitles: {[s.name for s in subtitle_files]}\n" + info_msg += f"Command: {cmd_str}" + logger.info(info_msg) + return True, info_msg + + # Execute conversion + try: + logger.info(f"Starting conversion: {avi_path.name} → {output_path.name}") + + result = subprocess.run( + cmd, + capture_output=True, + text=True, + check=True + ) + + success_msg = f"Converted successfully: {avi_path.name} → {output_path.name}" + logger.info(success_msg) + return True, success_msg + + except subprocess.CalledProcessError as e: + error_msg = f"ffmpeg error: {e.stderr}" + logger.error(error_msg) + return False, error_msg + + except FileNotFoundError: + error_msg = "ffmpeg not found. Please install ffmpeg." + logger.error(error_msg) + return False, error_msg + + except Exception as e: + error_msg = f"Conversion failed: {e}" + logger.error(error_msg) + return False, error_msg diff --git a/renamer/views/media_panel.py b/renamer/views/media_panel.py index 426e094..d3a8014 100644 --- a/renamer/views/media_panel.py +++ b/renamer/views/media_panel.py @@ -17,8 +17,8 @@ class MediaPanelView: """Return formatted file info panel string""" return "\n".join( [ - self.fileinfo_section(), self.selected_section(), + self.fileinfo_section(), self.tmdb_section(), self.tracksinfo_section(), self.filename_section(), @@ -27,6 +27,25 @@ class MediaPanelView: ] ) + @conditional_decorators.wrap("", "\n") + def selected_section(self) -> str: + """Return formatted selected data""" + return "\n".join( + [ + self._props.title("Media Info Summary"), + self._props.media_title, + self._props.media_year, + self._props.media_duration, + self._props.media_file_size, + self._props.selected_frame_class, + self._props.selected_source, + self._props.selected_special_info, + self._props.selected_audio_langs, + self._props.selected_database_info, + self._props.selected_order, + ] + ) + @conditional_decorators.wrap("", "\n") def fileinfo_section(self) -> str: """Return formatted file info""" @@ -41,24 +60,6 @@ class MediaPanelView: ] ) - @conditional_decorators.wrap("", "\n") - def selected_section(self) -> str: - """Return formatted selected data""" - return "\n".join( - [ - self._props.title("Selected Data"), - self._props.selected_order, - self._props.selected_title, - self._props.selected_year, - self._props.selected_special_info, - self._props.selected_source, - self._props.selected_frame_class, - self._props.selected_hdr, - self._props.selected_audio_langs, - self._props.selected_database_info, - ] - ) - @conditional_decorators.wrap("", "\n") def tmdb_section(self) -> str: """Return formatted TMDB data""" diff --git a/renamer/views/media_panel_properties.py b/renamer/views/media_panel_properties.py index a23b0fd..95eeb6a 100644 --- a/renamer/views/media_panel_properties.py +++ b/renamer/views/media_panel_properties.py @@ -328,9 +328,18 @@ class MediaPanelProperties: return self._extractor.get("movie_db", "Filename") # ============================================================ - # Selected Data Properties + # Joined Data Properties # ============================================================ + @property + @text_decorators.blue() + @conditional_decorators.wrap("Duration: ") + @text_decorators.yellow() + @duration_decorators.duration_full() + def media_duration(self) -> str: + """Get media duration from best available source.""" + return self._extractor.get("duration") + @property @text_decorators.blue() @conditional_decorators.wrap("Order: ") @@ -345,7 +354,7 @@ class MediaPanelProperties: @conditional_decorators.wrap("Title: ") @text_decorators.yellow() @conditional_decorators.default("") - def selected_title(self) -> str: + def media_title(self) -> str: """Get selected title formatted with label.""" return self._extractor.get("title") @@ -354,10 +363,19 @@ class MediaPanelProperties: @conditional_decorators.wrap("Year: ") @text_decorators.yellow() @conditional_decorators.default("") - def selected_year(self) -> str: + def media_year(self) -> str: """Get selected year formatted with label.""" return self._extractor.get("year") + @property + @text_decorators.blue() + @conditional_decorators.wrap("File size: ") + @text_decorators.green() + @size_decorators.size_full() + def media_file_size(self) -> str: + """Get media file size formatted with label.""" + return self._extractor.get("file_size") + @property @text_decorators.blue() @conditional_decorators.wrap("Special info: ") diff --git a/uv.lock b/uv.lock index 8e7d5b5..ed5d4d2 100644 --- a/uv.lock +++ b/uv.lock @@ -462,7 +462,7 @@ wheels = [ [[package]] name = "renamer" -version = "0.6.5" +version = "0.6.6" source = { editable = "." } dependencies = [ { name = "langcodes" },