From 0e8cefea8d034184750b42da50641b29b8a5344b Mon Sep 17 00:00:00 2001 From: henrique Date: Tue, 17 Mar 2026 20:30:14 -0300 Subject: [PATCH] envio de arquivo filnalizado. --- __pycache__/vr4life_cloud.cpython-311.pyc | Bin 13857 -> 23974 bytes __pycache__/vr4life_engine.cpython-311.pyc | Bin 37002 -> 44479 bytes __pycache__/vr4life_ui.cpython-311.pyc | Bin 31132 -> 42025 bytes run_vr4life.py | 10 +- vr4_config.json | 1 + vr4_state.json | 2 +- vr4life_cloud.py | 339 ++++++++++++++------- vr4life_engine.py | 28 ++ vr4life_ui.py | 58 +++- 9 files changed, 321 insertions(+), 117 deletions(-) create mode 100644 vr4_config.json diff --git a/__pycache__/vr4life_cloud.cpython-311.pyc b/__pycache__/vr4life_cloud.cpython-311.pyc index 2695c6d605d11d5d4f4bd3fd184f6773eda05fa3..b41b95b7e79b3426427163216b0bf8aaf5fba64c 100644 GIT binary patch literal 23974 zcmdUXdr%u!x@Svjq1Fq5c*}qrunn>en1^k^n3$Ih*apY=6=xhqs2h+YB+`;>tPu&5 zo4dg-?}p6vY?zF5qs+}r$c$5$y)|3cTQzsfv&rma?wzgeR`sqZRZ)}4-u#ijmQ-e{ zQvPed@95b=#P%fjk8KX0PM`Pte82O3r{6Q14HP_+pZ*tDcMC=RAACtZbi(rGe+0`L z6i0C?H+4DwtGcWr@9N8H_*J_#v-D-H3jH+hyjk64or>}l)=@mOixTt+cYWOb8OlRn zr{*=!P}k#W7%m%0TBgLW`Lda#U!gANb6TJlE)Qq{rvqBZF+i=H9%vD#8mH`r&#{oB zc2!I#1U!D%EDu)w)BcMtZkqS|oT@|}@JA2-8uv=giNOxi3tIbOY2C=K|wDm`*9g zgm`KN6meaN6pLq*-@JQn|vbQsR6EZxg0 zJ+5BxmmSk%tfN{eAAMaNU$a!yGn5McJkC1G-<3`gR=Nud#>beGMarDB=45&`s7|My zw!vyp%#|ow(x^=D$JASDA-qn~5P2F<-r-skhOqx`gk^9FEX8*=z&SeNJ8hwr#u zoTDjd?)Q3lr{Ce>yiH9_!M!tn|D3O@x!E!2YPu%0yIoU!lhZrfJQtXByPVB#m(TC$ zcX%8wU#!GGKQRNzO}M?&F3$u%@8<=N_n|i6pK9!QXo7_OyvN^o?#3Mdu*NYr2k{+# zm)Fxg-+2A{^~Nc$Fxwaq+`Px><#_IWb&Td5en(6i?$G~ef)kLj*E1dq!z9m|`XfQoryIv?*phw)5L z_ojO;W}XwgIHU%zLDTqRdC+}s*JMl!t?A=q`c!X1=A>7FPvTz)Kr_d5XOk8PhpSHTDRB1`C?krUNOcgxco5I+>krxoq!N=3(r9_@DqL)`I((-i)kk(@W%j^ z9rQRR-8>gFgMHk8!_AM+@Q^+|IT4tPl}+(}=gh>M*XQ?5z_^9dIXoWTZ8yi%0auJ6 zv%n9nrGd)D7^w3E8Oj>4;j3@X>w)$`+r*@oyAjL7@d#5$<&0@O6F_EwsQ8%bx(|69 zHuHJdG|=^(X&6(E?<6KyAdmx^*Wy?-3a4q0w%IB z0%_uG@?8X;ZjoBI6yCn^+Kabdlq@@C%g(4}cf_(=vee6#`o*CQonfit`wOouEWZ%Z zm5aLa4W>|Ls-n#92(vppx!NoqIVCZtW#+WVoL*=0m-0TL^IjQ_(j^hPWZ5gxdt`c# zNbmVTFE{i=8%{+UPDu@;a>JV{QV<@=Y6g99B0~;<{?YQp|M_&++3Zj9P3_jW5TkPMYty;^5x#;$D zQFC3yTo>+Nvx??A$=oiR+cznb{-o+YvtG9IjfEd9y#CUim!f5jk+R0sX{qdxTy|(_ zXrrX!&gC#8mDuGH`_l1GO!>EmUK_nNDw!%}Q>AFC{LE6ZvgfC};?1*3<(W^aKImV| zd;jFUllNWSueG)<>C&2vZ^2 zS|p}bW?Dt2H91Q5M3_BcVfCokb?JYd85hr;m(E;}&s>04FcR~O%seA9&yaDmlo$Vl zB76mP)LQV@M8V*kSyA6Lg!|qdSyTU#xnKLMh6jBg4Th2w$LEPCT^gZFm;Dl5DbtlAUAdkfwPNWWiLRIF zdXcVQwce|U+K)x-$2KXdPjy=T1x4*0RsV@la02_E^C)fQN}ojUlsI!)GMhf+X30Iy9ny@Higj4)uW;kV-1r?;4 zm-G*(_?@H+{$|BcbLs_62yp20B>iQz@R1^ooai&8R`Nm%v_AtOadb%iW5ARl8fe~I zT4h*hD;jc{^QZ6;@K#x9_HpV8X^ei;G!|%12N+NV=#aUqUdU4*%12<}Y*e=m{?#jM zzo1jJlp&-gT)pBn0dPZRYZ^m&Im4t7Bw)=);b?70$C)@Y;OKlMf>>al5Jxkdm7`b}9v;hF+JXW=Rs`(*wJPEG}L!3b#Q zIf8a7(&?pbTp=J#nBnPjgatF;o!nuIxZv5yNf5%$#-A`YieYPyz)y|}WF zC5>8fK5*rs0x~aP70o<9BZ%1YqQ&!FK*sQUUFGjfrv)`>Ua)MFcWpXc+6H-7aJG;I z`f0~oTTbgzx!IGsCDHd2=26L2DQ9L@|EJCx(Ii$d?_vc!hZPVG2u37`Lj_!`V|qZ( zfQ|wHB+zG^pJmT|_yNAh%mm^f0Kzf}xD^CzGIJV?Lu+q9zc8~8VhBZA}AfOE;PQE9T^`R#fXXGdwg96L!c89 zFc=zo5!Qnbc*F4p9t5y0xZn^2n^3@oNnnxSfti47g@Dsc*o6eAfq?Tyz;X%= zNboRN*pCFaDWM!mGm-;903O3xhY-_aFJX5H(<~e(zfSo2BMNf^3n~&*XP{l!YOb759hnRp|bWG2= z0J$QB7M{W=$B^`*k4|u0p8yyQt$<)Wrh+34{{#>~=fVjL!9W!V$o3V&YbKB;c3~LP z!lPM24uQot3Og;JVgLj~QMw{RSFG$xG55sv)zOznCAwIqi$%KlldnV1>ju;9hNxj@ z#IRE`)X0XK#s2kzlEvXq0989)p8x**y0!RDL)2Oqu>w?;tPQfYVM({an8o~ys~R9+ zK1LEZ5_3srE{V*gb))qQs!~6x`k`;-@av&Fp=g;sQf8OR_Q_@Y;yxRt6)W|xyYIN8 zr45nN2B~zfT)KDZ#JY8Gseiq-3sNmV4`yk2qpS+!6CCW4$~xq-j%e9ak+P>A=%lhC zxol`@=rdEHXl-2`2LeViwaKP7(bTqq&d1iC0Rl!c^~$DR(bW5ywfs&~)Y=fSHmnw{ zbv*Eh7jB4yLDAYES-&S+zqbS^-C`clY?SP{^IWuKU!-K;YX5z!Sh7zl>6S~nHz|GL z;Rnom^`5t9-<EEcV5o<3$Z~{Sd{!-i`RX!_MJ}Xu}yIxs+cPLu9 zKT^4Wb$qQ(syrlD9ukS!EP`5)su1!8R_aek(r&qI1b}Z1_0?B@E~biYce>>wI{;qu zh&q$5@2GtH(3^*T)N!}t?Wf*+YW1+RqfOq?w#;l4RLBLpqXkWof~HkLY#Vx@`X~>6 zzyNqXsTzi4sFzeH@F($xKLBzIM-b!!1)oP!gzOtdm7A0bx;2v~^KXn4G_Fpr!J!B> zpz4Pp)S&t}CY^Z8_`$pfG?+Ig^=OKDZ)z}OumBb}m&&G^sL38N*;i{YGIg1*yu|F1nO!0= zpX3bw8C|pthXG|WT_z@tZv@tr-*natcT)e|)~_3G)cmf-1TVj9q=#E{ziZK;yMty3!6dEoCPu!aggQN@@y3{L!8usz~j~@ zA<$0ODR(<;JtoL(yWH)NC0Hdab2=YnzP3Ed9^!Nf=+~lXjl3<mXjPn?JmoLd;JdJ+HVhG5?2`DTU5EaI(z=xaxc?&-S0v28%@(VcP z_s@ca!U@6|f6SQRsnE-=BK(LCK@1yb3oc_)NUp-auMm8IEzs#-2}X50BDx)tu1eNb zZBhnpEv^wvl-UtscB~9aOs&k+icHeAI>J5}r-GFd(#triQH507tXo-7 z+6TvioH__1B0N-moC8`=p+P8@c(RX3;gE@}9)cAPTj}&^5vNVt$#E$h$9mLoEUEFQ z4j^HYq}J!$>OgRWse#xGCwbY?LZ(Zj~Wre?i=; zWJ_fpUvdU=Xlx|Zl;i05(WNx!Sa;JkD@f;>wsHB{as1Hl$>%D98}ekUeZ`fv>ZrIH z#&|;Y&2AZesQS)BRrBY#+{H!dG|r!xZeoy3m00nGv+buq+&?ky-4*>@%@mS;ApTPVO>+`bCd;fIS&(-=Wq*1#&KXIkg)=ko(1rYKM>6aVs&2N*#@WE z0U8aE0QlA%WzRVT$Y5;pDu_DmD06p%1wBbF4rdct_t_ry0Oo;7JDkt9Tw$RUe&GgW zO3DHWrOV=<;XU91&>QxUMD|@yI92e^1^m}toPVaPrM2Tg!eJ&Z(?8srbeM9v`L1KN z4=>cR*QO@B;3UGwvv8=v`@8%?fM@M2k1nYUo;2NE+olWkcYv6>!Oq$PIFM1ffOH;+ zn%(RPXhmoOo*j3%uX$@e=OBdL8q}@zUwakOsoW27|=Bl z{G*V30*@kmcO{PY0JBH;QPQwt!m=jVB6 zzz-QfFgPm z_TiQ^`0CipV`A|ki9RgThei7EKUK(`W6{nlku3~f-g`!(n#dkCeiIO-7eDYYm>j^|Izago(JR7p<(&Z zuy|ExwQ5g5%=H+DBE2eKhL;Ib$DHJz^hKlYLbEB>U)1 z8xdXp<@@Lp?b?al^ndxTy-nRx`yGsm)Dy}=fWCj#Q%klf6=!&bQS5gqY;)75+!qJ3 zg~y;iE4<;)P+$#dbC)QsP<+p*&@Be{PKi@9lK?elMH_fjoQbFyr$)xNRu>bbY=#o0`0a2?*qT`)WqpKB zh>;qTkJSSCp?pOPq+{o9fh?XI%BUCUkP&8y$#+pPB2xVKwqw%D73C0~K585mEBk<) z9;M^3nXQwwZ#@yiG0)K)<*vC^!Ij)9o2G7+FO@BoPpP@mSC|D0+LtP(G+Y_H6{x9@ z1q9c6hiEBJgnq(Njq0XFk>~LJGUaoZ&F8LFSJ|%$8M8G?wu;Doj}D2 z__It!g>6#Hy_aOI+KCd?Y?DUr5@n?UdudjQZkBJOE>L^33|9QQw=~_THnTyJ{NDGNWUp$d}NsB zkSSM~C*CKDVO_B*azB77P0+%M{Vl7GE!&LS++#m$CczFt!+zQN$XwcQD?83N zS*Jm^S;;p_lF18LO zoR3;n{=ceKQWeuaGAj6?=Y;^0Ye-NQBcQZOm`8F0$V0j*=$aFPU{#2w^1uN*;mf}T z@m*LBd&`aZk~e}&`~B!7*bnwYxjKuk3y%)whirng9BdJhfVc;^dL{N{Rs zb%8n5XPoeR6W5)(iJ-yP)07VM2Bv`Q_*aXRSni6Owcd{%|8x4Er+?@Ay(>EU-N@*7 zMaQ%>IwOzHK!CTbcgx2)Fz-&+|9pYLAtu7>AmHlL4O- zZVE#GfUp2$CVn22E6+g2!G^@GLx%td|JS_i<>51#cMm-dxPC~q8UqOY4Tj^Ox#$2z z#XiULprt6leMgtztqJS_Pms5~gDQ$$?6}M06ucf+kceKOJy-`j8o0*Kg488|3rfFZ z7L?-H;l$-muP<;8T+e_gWy*041uEpCA>RnnhY!P;=6=@4gS-Up%<(MTk&NrI@+{}V z+h*vJl+Zh%ZbSu=_gr&1gqm3187PV08?0@F=ORCO(nU`E`|t*&L%0Ewq%-7l+NG9W zCy_8hLGaPSKN+_9FwlOeeuKKH38VX#hg03e>l$j{?sE^-EY3(da8=u<3o=DWSNm5-Wpk?F|@efB}SXgeD>QQI>S+cV;2hh&?SZIcq?lo_YUI8(t_&aX7#U)0tdu{E#h zBwL4U>yVgEnduahCN9p0%`^3&xS9+;RGj*u<_-8n$4z}W<(+BSA}Cj-&d#Vg5W&L% zaYo8`Q%Sk<0h36F=-dav%9VIQ`(!NHO=cSr2YpkQ7}yzWcDhbnmRi!53A0_g@LdQ< zmmvdO|CTnlu;edJ-9S_Xj4&O))l!GHC@pQ&(z{v<~Z%W`mj>B0vtj{>Wfa7pn zp7O~ps4c80VHxvY%p=Ee)B@Pj$KoJ}kKZCF&%6=ub^3XKBiw4{9kU=MofO`Lo)dnI z1l6;IyFh~GTDSoYLej*%*TB3F<|h{kyk!qc_B5^qK3sCavo3j2;moPA-hnG@a^rG? zTsyfn1=U@wT^BPt|u> zB8dn;grG4!hKcKOpTPKUBMB2942ik+aRU z^~$QZkH2~RM?-gqmi4G;8uuW+Uto|wAtA5Z5>!#m5$Y3DXJv?U>*>(02Y#{Ih34{P!cy&uR?kJM=foH0rRp1U^$p1slubd= z6wHX%w|YaY?u(mf^>Czm_~Ux1`m9`iRx*vtrg70Uo(jFhMA`C`3L2z4lj)0~Ttn zq_Ypn^azb>SEOLV_3(V)Fth4zZRc6j;7Vi@Sud{j{~(60HYT?_V%t1+i>Y!xIw z0+G1yF&jW2o?CIHH{kcqe)tZ2E&w!8Qpyr`V5x-fK_nrBWC2svrxXp~qXTiij?B^^ z-PoAevdNYctbfGq9-reHe+Diu0AFmv)bV^NSUnqX`(3y#H)rhd$zA(sdY+%+J=6Y~ zV4LCS6F&h&(S)B&U)*8OC)S36-hr`kc5w8=uF@E&7y<{`N{NE+%L-VO=@_s4ZUZdK0kb6%+9h9*ErfcmMn3i z5Xn`I%?jFzeCm@u!4l-V;42}h=rreWdVwW|OF%&rJ9z`SVf2FamW81bY)0j*c1+#J}l6E>g7~IM8JXun;zl4&s-f`tfTJ z_-zrVI{??v9Ko@af-Sk3L^yd=i2@wqOC(9E1lYt4EFz9VM~%TS07^qXxN?=a76mB4 zLEwlXSe2u2WQQRogMGyiKw)Wi!SK?SHxR5IW6unofrOm_A6(e-vb_nc)DVwuvcvVS z(_T;<^Fl%>9n6&-eDi};7l79o1PLJe8ckik^7?!qesGNkJv0E1ZXT43ARnwaxs;b2 zE0+Pkk(zq}4#h8|LDmBh+&#m?Rk3pfqT1UrdLfmUF>pOyE-x$GSsA|WMKX>A(O+CU8YjLmh2&`@w~+iC$r6&ANYXn!p7EwHk;M$i z?Z-dK6TfrTh5j8#Dv|6)vIj{$keJcsAwvhzif{p)FCw{w1Wym`JK`E%x6$F>0|6DX zpn&iprUxVq*uxFCyUf@M6ZlSa6!RQz|Aaqz!E0td{>35qiptCc-Xmkcg)BRoO1zckz|DsO$v4nTLw&B4UfRmD_$TS@vfdumw?yDZKf zY)U*f_4PLq&6eAjqUPF&xmGgolFhpokFW1o-@Ph>^57B8O6aT!9b?NcQ#HP%P0^^(;tTkT6axUjhFxYfPX z9Twi5kJfiY>XE^%@0II&S9W}2EFvG2S?M4@tB1&svgO3RN1;uQsV?B&#?88=4eD4}v^cU! zYqVXMYi?pN;`pT=gW4!<(c-9Bw0Ct#q7TaSL6JVVPFoj8m!ArQOQTFTigaV#Le^DaiQy;*O1%8NpZ2|bBD$+Rva21wZ?vmJ-qmrxR$`9I z%u$g!nlom1Jm!s`*1lUGt!<6ewyw2GwTI-|L-*AZb3|s2h|G~s==}KirNq*GD;+@M zCR*AWDQ#UlER`OSOOHr&w@i17boaV3|Fw==9m^wG%gltLNUYxL5JcbMHQvQk?ya z)-N?mbh%8Ii*)%0trrc)B)V6odqujJytb{Di-tBZsW@Nf+_G9K8d|_ebgN9aigYX7 zS7Z#?caT)t?)YHoCYOi1R-YB~yTGK{49X=ME_@)|yZ-kt{`|%JlTvf9+}tbL&#hWl ztq&H!4~#@#l#wQrm#>#rzcKrR+1I^yywTGAk<$IE7p2mJa_PaP69lsk z+&?T@2f#?CLD@7Yng%yaCFDA3W5fg(SjE1 zQXOU-&puASAVv8Tp_%U6*Dt9IP`kQosKu2 z`oUA-!&1>cxoF=KLk39ys^i|2nBNcPetG;?Vg_VpKx77z3vc|}UE;oesLOHHkXoFY zmZ#i_m-NqzDsqz-LnIt=l^7-~G`U|4cJTNbihJmWu^2z(bpe8=DJg2}>I-6iD;SAs zlbJS=X-gI``3X8mz56`oaaKK!Kk*l!Sda^(Aeb)Nzn)@2Hno^PS{MpABwduTMHt&k zyTq_E!-@%vWhk-_amGg_eVr#P z)Nd_@69+ZFt+1Xrp!w|qE!a2cnu#6M#_rzg35(_r8WX(y!9q_I>HbipL3^nR?PbJn zQ*q$3qj<7O^M~f%Mn{e2kCj?*`eTh5oc`E!Xwt6vbQijOYS)6xr%f8L|Lcz4y;E9^ zy_mopxVVQ9MhAR5vhi?J@5b!BPr#FMf;3{fGdIRv9DgYB1h2wAXY}A{^2F-h_2F?EiQ5YlT literal 13857 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 diff --git a/__pycache__/vr4life_engine.cpython-311.pyc b/__pycache__/vr4life_engine.cpython-311.pyc index f2b3e190c104f98c86717f43eac5db0f70afa1bf..b3b5bb882ea67e073464eb7faa6c885af3e826fa 100644 GIT binary patch literal 44479 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 S6VF!LKP}zw{0sYj=l=`6ul9xj literal 37002 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 G+W!Hw;{|yD diff --git a/__pycache__/vr4life_ui.cpython-311.pyc b/__pycache__/vr4life_ui.cpython-311.pyc index 12f286047b513848cc4cee04b77e14c14cf4fdd1..7b246b876b94c36065def4ff3b04ae902847d88d 100644 GIT binary patch literal 42025 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 W!Sm4k?9HrF-8=ae#t-xr#{U}+|LLs& delta 9047 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 Z!SDYJolgr|zM{@#Ue%X#-y!AP{{qJ~>frzY diff --git a/run_vr4life.py b/run_vr4life.py index 0ebde46..9f7fef8 100644 --- a/run_vr4life.py +++ b/run_vr4life.py @@ -12,6 +12,10 @@ importlib.reload(vr4life_ui) if __name__ == "__main__": from pymxs import runtime as rt - app = vr4life_ui.AutoBakeManager() - rt.vr4_app = app - app.show() \ No newline at end of file + + # Previne que o Garbage Collector limpe a interface durante o Render pesado + global _vr4life_global_window + _vr4life_global_window = vr4life_ui.AutoBakeManager() + + rt.vr4_app = _vr4life_global_window + _vr4life_global_window.show() \ No newline at end of file diff --git a/vr4_config.json b/vr4_config.json new file mode 100644 index 0000000..601cbb0 --- /dev/null +++ b/vr4_config.json @@ -0,0 +1 @@ +{"api_hash": "c863105dd63bd3c46f24c3d0f42f44ec9a6348bf6543b76911c32ea73350d083815b8daf2df54e9473f49f57c788ee4af350c9c970ea7f737e517a510188c0e1"} \ No newline at end of file diff --git a/vr4_state.json b/vr4_state.json index 034fa49..0637a08 100644 --- a/vr4_state.json +++ b/vr4_state.json @@ -1 +1 @@ -[{"name": "3d66-Editable_Poly-23107237-414", "status": "Pronto", "polys": "27,680", "res": "2048px", "id": "979.0"}, {"name": "3d66-Editable_Poly-23107237-415", "status": "Pronto", "polys": "15,776", "res": "2048px", "id": "797.2"}, {"name": "3d66diban-020", "status": "Pronto", "polys": "600", "res": "2048px", "id": "861.0"}] \ No newline at end of file +[] \ No newline at end of file diff --git a/vr4life_cloud.py b/vr4life_cloud.py index db41d9d..10dde98 100644 --- a/vr4life_cloud.py +++ b/vr4life_cloud.py @@ -3,122 +3,255 @@ from pymxs import runtime as rt try: from PySide6 import QtWidgets except ImportError: from PySide2 import QtWidgets +import urllib.request +import urllib.parse +import json + def mock_connect_api(ui): - if len(ui.e_hash.text()) < 5: QtWidgets.QMessageBox.warning(ui, "Acesso Negado", "Hash inválida."); return - ui.b_conn.setText("Conectando..."); QtWidgets.QApplication.processEvents(); time.sleep(1) - for w in [ui.c_chn, ui.c_pst, ui.e_tit, ui.e_mp3, ui.b_mp3]: w.setEnabled(True); w.setStyleSheet("background: white; color: black; font-weight: bold;") - ui.c_chn.clear(); ui.c_chn.addItems(["Canal: Imóveis Virtuais", "Canal: Showroom Zombisco"]) - ui.c_pst.clear(); ui.c_pst.addItems(["[ + Cadastrar Nova Postagem ]", "Editar: Apartamento V1"]) - ui.chk_up.setEnabled(True); ui.chk_up.setStyleSheet("color: #FFD700; font-weight: bold;"); ui.chk_up.setChecked(True) - ui.b_conn.setText("✅ Conectado!"); ui.b_conn.setStyleSheet("background: #000; color: #0F0; font-weight: bold; border: 1px solid #0F0;") - on_post_changed(ui, 0) + hash_txt = ui.e_hash.text().strip() + if len(hash_txt) < 5: + QtWidgets.QMessageBox.warning(ui, "Acesso Negado", "Hash inválida.") + return + + ui.b_conn.setText("Conectando..."); QtWidgets.QApplication.processEvents() + + # Faz chamada real para a API + url = "https://api.vr4life.com/public/listaCanais" + req_data = urllib.parse.urlencode({"tx_hash_login_externo": hash_txt}).encode('utf-8') + req = urllib.request.Request(url, data=req_data, headers={'Content-Type': 'application/x-www-form-urlencoded'}) + + try: + with urllib.request.urlopen(req, timeout=10) as response: + res_body = response.read().decode('utf-8') + canais = json.loads(res_body) + + ui.c_chn.clear() + # Espera receber lista: [{"nm_canal": "...", "tx_hash_canal": "..."}, ...] + if isinstance(canais, list) and len(canais) > 0: + for c in canais: + n_c = str(c.get("nm_canal", "Canal Desconhecido")) + h_c = str(c.get("tx_hash_canal", "")) + ui.c_chn.addItem(n_c, h_c) + else: + raise Exception("Nenhum canal encontrado para este Hash.") + + except Exception as e: + ui.b_conn.setText("🔄 Tentar Novamente") + QtWidgets.QMessageBox.critical(ui, "Erro de API", f"Falha ao conectar: {str(e)}") + return -def on_post_changed(ui, idx): - if idx == 0: - ui.e_tit.setText(""); ui.e_tit.setPlaceholderText("Título do projeto...") - ui.chk_tmb.setChecked(True); ui.chk_tmb.setEnabled(False); ui.chk_tmb.setStyleSheet("color: #00FF00; font-weight: bold;") - else: - ui.e_tit.setText(ui.c_pst.currentText().replace("Editar: ", "")) - ui.chk_tmb.setEnabled(True); ui.chk_tmb.setStyleSheet("color: white; font-weight: bold;") + # Ativa campos após sucesso + for w in [ui.c_chn, ui.rdo_add, ui.rdo_edt, ui.e_tit, ui.e_mp3, ui.b_mp3]: + w.setEnabled(True) + w.setStyleSheet("background: white; color: black; font-weight: bold;") + + ui.b_up.setEnabled(True) + ui.b_conn.setText("✅ Conectado!"); ui.b_conn.setStyleSheet("background: #000; color: #0F0; font-weight: bold; border: 1px solid #0F0;") + + # Auto-carrega postagens do primeiro canal + fetch_posts_for_channel(ui) -def finalize_export(ui, p_bk, p_glb): - if not os.path.exists(p_glb): os.makedirs(p_glb) - fo = []; rt.execute("max modify mode"); tgs = ui.get_processable_items() +def fetch_posts_for_channel(ui): + ui.c_pst.blockSignals(True) + ui.c_pst.clear() - ui.pb.setFormat("Preparando materiais VR (Multi-ID)..."); QtWidgets.QApplication.processEvents() + hash_txt = ui.e_hash.text().strip() + idx = ui.c_chn.currentIndex() + has_posts = False - for d in tgs: - if ui._is_cancelled: break - if "Bake" in d['item'].text(1) or "Já existe" in d['item'].text(1) or "Mat" in d['item'].text(1): + if idx >= 0: + ch_hash = ui.c_chn.itemData(idx) + print(f"[DEBUG UI] Canal Index {idx}. Valor Extraído do ItemData: '{ch_hash}'") + if ch_hash and str(ch_hash).strip(): + ch_hash = str(ch_hash).strip() + url = "https://api.vr4life.com/public/listaPostagemCanal" + dict_data = {"tx_hash_login_externo": hash_txt, "tx_hash_canal": ch_hash} + req_data = urllib.parse.urlencode(dict_data).encode('utf-8') + + print(f"\n[DEBUG API] Chamando: {url}") + print(f"[DEBUG API] Payload (FormData): {dict_data}") + + req = urllib.request.Request(url, data=req_data, headers={'Content-Type': 'application/x-www-form-urlencoded'}) + try: - max_id = rt.execute(f"""(local o = getNodeByName "{d['name']}"; local mid = 1; if o != undefined and isKindOf o Editable_Poly do ( for f = 1 to (polyop.getNumFaces o) do ( local id = polyop.getFaceMatID o f; if id > mid do mid = id ) ); mid)""") - - if max_id > 1: - # CONSTRUTOR DE MULTI-MATERIAL (Para objetos que foram processados pelo P4: Multi-UV) - ms_mat = f"""( - local o = getNodeByName "{d['name']}" - local mm = MultiMaterial numsubs:{int(max_id)} name:(o.name + "_MultiMat") - for i = 1 to {int(max_id)} do ( - local ip = @"{p_bk}/{d['name']}_B_ID" + (i as string) + ".jpg" - if doesFileExist ip do ( - local m = PhysicalMaterial name:(o.name + "_MatID_" + (i as string)) - m.base_color_map = BitmapTexture filename:ip - m.roughness = 1.0; m.metalness = 0.0; try(m.reflectivity = 0.0; m.reflection_weight = 0.0)catch() - mm[i] = m - ) - ) - o.material = mm - )""" - rt.execute(ms_mat) - d['item'].setText(1, "Mat OK (Multi)") - fo.append(rt.getNodeByName(d['name'])) - - else: - # MATERIAL PADRÃO (Para objetos normais que cabem numa textura só) - ip = os.path.join(p_bk, f"{d['name']}_B.jpg").replace("\\", "/") - if os.path.exists(ip): - rt.execute(f"""( - local o = getNodeByName "{d['name']}" - if o != undefined do ( - local m = PhysicalMaterial name:(o.name + "_Mat"); m.base_color_map = BitmapTexture filename:@"{ip}" - m.roughness = 1.0; m.metalness = 0.0; try(m.reflectivity = 0.0; m.reflection_weight = 0.0)catch() - o.material = m - ) - )""") - fo.append(rt.getNodeByName(d['name'])); d['item'].setText(1, "Mat OK") + with urllib.request.urlopen(req, timeout=10) as response: + raw_res = response.read().decode('utf-8') + posts = json.loads(raw_res) + if isinstance(posts, list) and len(posts) > 0: + has_posts = True + for p in posts: + t_p = p.get('tx_titulo', 'Sem Título') + h_p = p.get('hash_postagem', '') + print(f"[DEBUG API] Encontrou Postagem: '{t_p}' | Hash: {h_p}") + ui.c_pst.addItem(t_p, h_p) + except urllib.error.HTTPError as e: + err_body = e.read().decode('utf-8') + QtWidgets.QMessageBox.critical(ui, f"Erro HTTP {e.code}", f"O Servidor RECUSOU a requisição.\n\nResposta:\n{err_body}") except Exception as e: - d['item'].setText(1, "Erro Mat"); print(f"Erro Material em {d['name']}: {e}") + QtWidgets.QMessageBox.warning(ui, "Aviso de Rede", f"Falha na comunicação ou falha lendo o JSON de postagens:\n\n{e}\n\n(A API pode ter retornado HTML ao invés de JSON puro?)") + else: + QtWidgets.QMessageBox.warning(ui, "Aviso", "O Hash deste canal não foi preenchido.") + + ui.c_pst.blockSignals(False) + + # Se não retornou posts, forçar modo "Novo" e bloquear edição + if not has_posts: + ui.rdo_add.setChecked(True) + ui.rdo_edt.setEnabled(False) + else: + ui.rdo_edt.setEnabled(True) + + on_post_changed(ui) + +def on_post_changed(ui): + if ui.rdo_add.isChecked(): + ui.c_pst.setEnabled(False) + ui.c_pst.setStyleSheet("background: #CCC; color: black; font-weight: normal;") + ui.e_tit.setText(""); ui.e_tit.setPlaceholderText("Título do NOVO projeto...") + ui.b_tmb.setEnabled(False) + else: + ui.c_pst.setEnabled(True) + ui.c_pst.setStyleSheet("background: white; color: black; font-weight: bold;") + if ui.c_pst.count() > 0: + ui.e_tit.setText(ui.c_pst.currentText()) + ui.b_tmb.setEnabled(True) + +def finalize_export(ui, p_glb, f_name): + # Transição de abas após o término do Exportador V19 + ui.tabs.setCurrentIndex(3) + +def generate_thumbnail(ui): + p_glb = ui.edt_p_glb.text().replace("\\", "/") + if not p_glb.endswith("/"): p_glb += "/" + tgs = ui.get_processable_items() + if len(tgs) == 1: sn = f"{tgs[0]['name']}_Export" + else: sn = "VR4Life_Scene_Export" + tp = os.path.join(p_glb, f"{sn}_Thumb.jpg").replace("\\", "/") + + ui.pb.setFormat("📸 Tirando Snapshot da Cena..."); QtWidgets.QApplication.processEvents() + rt.execute(f"""( local c = getActiveCamera(); if c == undefined do ( local ac = for cam in cameras where (classof cam != TargetObject) collect cam; if ac.count > 0 do c = ac[1] ); try ( if c != undefined then ( render camera:c outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) else ( render outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) ) catch() )""") + ui.pb.setFormat("✅ Thumbnail Gerado e Salvo!"); ui.pb.setValue(100) + + try: os.startfile(p_glb) + except: pass + +def upload_to_cloud(ui): + p_glb = ui.edt_p_glb.text().replace("\\", "/") + if not p_glb.endswith("/"): p_glb += "/" + + tgs = ui.get_processable_items() + if len(tgs) == 1: sn = f"{tgs[0]['name']}_Export" + else: sn = "VR4Life_Scene_Export" + + oz = os.path.join(p_glb, f"{sn}.zip").replace("\\", "/") + tp = os.path.join(p_glb, f"{sn}_Thumb.jpg").replace("\\", "/") + + if not os.path.exists(oz): + try: + zip_files = [os.path.join(p_glb, f) for f in os.listdir(p_glb) if f.lower().endswith('.zip')] + if zip_files: + oz = max(zip_files, key=os.path.getmtime) + base_zip_name = os.path.basename(oz).replace(".zip", "") + alt_tp = os.path.join(p_glb, f"{base_zip_name}_Thumb.jpg") + if os.path.exists(alt_tp): tp = alt_tp + except Exception as e: print(f"Erro ao buscar zip recente: {e}") - if not fo and not ui._is_cancelled: - QtWidgets.QMessageBox.warning(ui, "Exportação Interrompida", "Nenhum objeto validado para exportação.") + if not os.path.exists(oz): + QtWidgets.QMessageBox.warning(ui, "Aviso", f"Nenhum arquivo ZIP encontrado na pasta:\n{p_glb}\n\nFaça o Bake primeiro!") + return + + ui.pb.setFormat(f"📡 API: Sincronizando com a Nuvem..."); QtWidgets.QApplication.processEvents() + + hx_login = ui.e_hash.text().strip() + ch_idx = ui.c_chn.currentIndex() + hx_canal = ui.c_chn.itemData(ch_idx) if ch_idx >= 0 else "" + titulo = ui.e_tit.text().strip() + hx_postagem = "" + if ui.rdo_edt.isChecked(): + pst_idx = ui.c_pst.currentIndex() + if pst_idx >= 0: hx_postagem = ui.c_pst.itemData(pst_idx) + + if not hx_login or not hx_canal or not titulo: + QtWidgets.QMessageBox.warning(ui, "Campos Inválidos", "Por favor conecte-se à API, selecione um Canal e digite um Título antes de enviar!") ui.pb.setFormat("Pronto"); ui.pb.setValue(0) return - if fo and not ui._is_cancelled: - rt.select(fo); sn = rt.maxFileName.split(".")[0] if rt.maxFileName else "Cena_VR4LIFE" - og = os.path.join(p_glb, f"{sn}.glb").replace("\\", "/"); oz = os.path.join(p_glb, f"{sn}.zip").replace("\\", "/") - tp = os.path.join(p_glb, f"{sn}_Thumb.jpg").replace("\\", "/"); mp = ui.e_mp3.text(); hm = os.path.exists(mp) + import mimetypes + boundary = '----WebKitFormBoundaryVR4PluginX1A' + data_parts = [] + + def add_text_field(name, value): + data_parts.append(f'--{boundary}\r\n'.encode('utf-8')) + data_parts.append(f'Content-Disposition: form-data; name="{name}"\r\n\r\n'.encode('utf-8')) + data_parts.append(f'{value}\r\n'.encode('utf-8')) - to = False - if ui.chk_tmb.isChecked() and ui.chk_tmb.isEnabled(): - ui.pb.setFormat("📸 Thumbnail (1280x720)..."); QtWidgets.QApplication.processEvents() - rt.execute(f"""( local c = getActiveCamera(); if c == undefined do ( local ac = for cam in cameras where (classof cam != TargetObject) collect cam; if ac.count > 0 do c = ac[1] ); try ( if c != undefined then ( render camera:c outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) else ( render outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) ) catch() )""") - if os.path.exists(tp): to = True + def add_file_field(name, filename, filepath): + try: + mime_type = mimetypes.guess_type(filepath)[0] or 'application/octet-stream' + with open(filepath, 'rb') as f: + file_data = f.read() + data_parts.append(f'--{boundary}\r\n'.encode('utf-8')) + data_parts.append(f'Content-Disposition: form-data; name="{name}"; filename="{filename}"\r\n'.encode('utf-8')) + data_parts.append(f'Content-Type: {mime_type}\r\n\r\n'.encode('utf-8')) + data_parts.append(file_data) + data_parts.append(b'\r\n') + except Exception as e: + print(f"[DEBUG UPLOAD] Erro ao ler arquivo {filepath}: {e}") - ui.pb.setFormat("Limpando Hierarquia e XForm..."); QtWidgets.QApplication.processEvents() - - rt.execute(""" - ( - local sel = selection as array - for o in sel do ( - o.parent = undefined - ResetXForm o - collapseStack o - if not isKindOf o Editable_Poly do try(convertToPoly o)catch() - ) - ) - """) + add_text_field('tx_hash_login_externo', hx_login) + add_text_field('tx_hash_canal', hx_canal) + add_text_field('tx_titulo', titulo) + if ui.rdo_edt.isChecked() and hx_postagem: + add_text_field('tx_hash_postagem', hx_postagem) - ui.pb.setFormat("Montando GLB..."); QtWidgets.QApplication.processEvents() - try: rt.exportFile(og, rt.name("noPrompt"), selectedOnly=True, using=rt.GLTFExporter) - except: rt.execute(f'exportFile "{og}" #noPrompt selectedOnly:true') - - zo = False - if os.path.exists(og): - ui.pb.setFormat("🗜️ ZIPando GLB..."); QtWidgets.QApplication.processEvents() - try: - with zipfile.ZipFile(oz, 'w', zipfile.ZIP_DEFLATED) as zf: zf.write(og, os.path.basename(og)) - zo = True - except: pass + if not os.path.exists(tp): + ui.pb.setFormat("📸 Tirando Snapshot Automático (Thumbnail)..."); QtWidgets.QApplication.processEvents() + rt.execute(f"""( local c = getActiveCamera(); if c == undefined do ( local ac = for cam in cameras where (classof cam != TargetObject) collect cam; if ac.count > 0 do c = ac[1] ); try ( if c != undefined then ( render camera:c outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) else ( render outputwidth:1280 outputheight:720 outputfile:@"{tp}" vfb:false quiet:true ) ) catch() )""") - if ui.chk_up.isChecked() and ui.chk_up.isEnabled() and zo: - cs = ui.c_chn.currentText(); ac = "NOVO" if ui.c_pst.currentIndex() == 0 else "ATUALIZAR"; tit = ui.e_tit.text() - ui.pb.setFormat(f"📡 API: Enviando..."); QtWidgets.QApplication.processEvents(); time.sleep(1.5) - msg = f"Sincronizado!\n\n📡 Canal: {cs}\n📝 Ação: {ac}\n🏷️ Titulo: {tit}\n\n📦 ZIP: {os.path.basename(oz)}\n📸 Thumb: {'Sim' if to else 'Não'}\n🎵 Áudio: {'Sim' if hm else 'Não'}" - QtWidgets.QMessageBox.information(ui, "Cloud API", msg) - else: - msg = f"Exportado:\n{og}"; - if zo: msg += f"\n\n🗜️ ZIP:\n{oz}" - if to: msg += f"\n\n📸 Thumb:\n{tp}" - QtWidgets.QMessageBox.information(ui, "Sucesso", msg) + if os.path.exists(tp): + add_file_field('thumbnail', os.path.basename(tp), tp) + + if os.path.exists(oz): + add_file_field('arquivo', os.path.basename(oz), oz) + + data_parts.append(f'--{boundary}--\r\n'.encode('utf-8')) + body = b''.join(data_parts) + + url = "https://api.vr4life.com/public/savePost" + req = urllib.request.Request(url, data=body) + req.add_header('Content-Type', f'multipart/form-data; boundary={boundary}') + req.add_header('Content-Length', str(len(body))) + + print("\n" + "="*50) + print("📡 [DEBUG API UPLOAD] DADOS ENVIADOS NO FORM-DATA:") + print(f" -> tx_hash_login_externo: {hx_login}") + print(f" -> tx_hash_canal : {hx_canal}") + print(f" -> tx_titulo : {titulo}") + + # Se campo não existe, printa vazio pra entender o contexto + if ui.rdo_edt.isChecked() and hx_postagem: + print(f" -> tx_hash_postagem : {hx_postagem}") + + print(f" -> thumbnail (ARQUIVO) : {tp if os.path.exists(tp) else 'NAO ENVIADO'}") + print(f" -> arquivo (ARQUIVO) : {oz if os.path.exists(oz) else 'NAO ENVIADO'}") + print(f"--------------------------------------------------") + print(f"Disparando pacote de {len(body)} bytes para {url} ...") + print("="*50 + "\n") + + ui.b_up.setEnabled(False); ui.b_up.setText("Upload em andamento...") + QtWidgets.QApplication.processEvents() + try: + with urllib.request.urlopen(req, timeout=120) as response: + raw_res = response.read().decode('utf-8') + print(f"[DEBUG API UPLOAD] Sucesso HTTP 200:\n{raw_res}") + QtWidgets.QMessageBox.information(ui, "Sincronização Cloud Concluída", f"O projeto foi enviado com sucesso para a plataforma!\n\nDados Retornados da API:\n{raw_res}") + except urllib.error.HTTPError as e: + err_body = e.read().decode('utf-8') + print(f"[DEBUG API UPLOAD] Erro HTTP {e.code}:\n{err_body}") + QtWidgets.QMessageBox.critical(ui, "Sincronização Falhou", f"O PHP Recusou o Arquivo (HTTP {e.code}).\n\nMotivo:\n{err_body}") + except Exception as e: + print(f"[DEBUG API UPLOAD] Exceção: {e}") + QtWidgets.QMessageBox.warning(ui, "Aviso de Rede", f"Não foi possível completar o envio do arquivo Zip para o servidor.\n\nDetalhes:\n{e}") + finally: + ui.b_up.setEnabled(True); ui.b_up.setText("☁️ Enviar para Nuvem") ui.pb.setFormat("Pronto"); ui.pb.setValue(0) \ No newline at end of file diff --git a/vr4life_engine.py b/vr4life_engine.py index 0ae9cdd..471ec63 100644 --- a/vr4life_engine.py +++ b/vr4life_engine.py @@ -396,6 +396,13 @@ def process_bake_logic_v19(ui, auto_export=False): res_str = d['item'].text(3).replace("px", "") sz = int(res_str) if res_str.isdigit() else res_val + expected_tex = os.path.join(p_bk, f"{obj_name}_Baked.jpg").replace("\\", "/") + if os.path.exists(expected_tex): + mprint(f"--- Ignorando {obj_name} (Ja Bakeado) ---") + d['item'].setText(1, "OK (Salvo)") + d['item'].setForeground(1, QtGui.QColor(0, 255, 0)) + continue + mprint(f"--- Iniciando script V19 portado para: {obj_name} ---") ms_v19_block = f"""( @@ -661,6 +668,27 @@ def export_glb_v19(ui): res = rt.execute(ms_export) if res == True: mprint("✅ SUCESSO: GLB Gerado com Texturas Embutidas (Modo Silencioso)!") + + # O Nome do arquivo destino completo e o GLB gerado: + full_path_glb = os.path.join(p_glb, f_name + ".glb").replace("\\", "/") + full_path_zip = os.path.join(p_glb, f_name + ".zip").replace("\\", "/") + full_path_tmb = os.path.join(p_glb, f_name + "_Thumb.jpg").replace("\\", "/") # Thumbnail adivinhada + + if os.path.exists(full_path_glb): + mprint(f"🗜️ Empacotando GLB em Arquivo ZIP... ({full_path_zip})") + import zipfile + try: + with zipfile.ZipFile(full_path_zip, 'w', zipfile.ZIP_DEFLATED) as zf: + zf.write(full_path_glb, os.path.basename(full_path_glb)) + pass # Se quiséssemos embutir o Thumb no zip, fariamos: if os.path.exists(full_path_tmb): zf.write(full_path_tmb, os.path.basename(full_path_tmb)) + mprint(f"📦 ZIP Criado com Sucesso!") + except Exception as e: + mprint(f"🚨 ERRO ao comprimir ZIP: {e}") + + # Movemos para a tela de CLOUD e batemos a foto Thumbnail baseada no nome f_name + import vr4life_cloud as cld + cld.finalize_export(ui, p_glb, f_name) + else: mprint("🚨 ERRO: Falha na geracao. Vefique o log.") diff --git a/vr4life_ui.py b/vr4life_ui.py index 41a5045..308f178 100644 --- a/vr4life_ui.py +++ b/vr4life_ui.py @@ -22,7 +22,7 @@ class AutoBakeManager(QtWidgets.QDialog): def __init__(self): super(AutoBakeManager, self).__init__(get_max_window_safe()) self.setWindowTitle("VR4LIFE AUTO-BAKE V313 - MODULAR ENTERPRISE") - self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint | QtCore.Qt.WindowCloseButtonHint) + self.setWindowFlags(self.windowFlags() | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowMaximizeButtonHint | QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowStaysOnTopHint) self.resize(570, 890); self.bake_items = []; self._is_cancelled = False p = self.palette(); p.setColor(QtGui.QPalette.Window, QtGui.QColor(43, 43, 43)); self.setPalette(p); self.setAutoFillBackground(True) self.init_ui() @@ -40,7 +40,7 @@ class AutoBakeManager(QtWidgets.QDialog): # ABA 1 t_gen = QtWidgets.QWidget(); l_gen = QtWidgets.QVBoxLayout(t_gen); f_gen = QtWidgets.QFormLayout() - self.btn_ref = QtWidgets.QPushButton("🔄 RECARREGAR MAPAS"); self.btn_ref.setStyleSheet("background: #555; color: white; height: 35px;"); self.btn_ref.clicked.connect(lambda: eng.load_bake_elements(self)) + self.btn_ref = QtWidgets.QPushButton("🔄 RECARREGAR MAPAS"); self.btn_ref.setStyleSheet("background: #444; color: white; border: 1px solid #222; font-weight: bold; height: 35px;"); self.btn_ref.clicked.connect(lambda: eng.load_bake_elements(self)) self.cmb_bake_elem = QtWidgets.QComboBox(); self.cmb_bake_elem.setStyleSheet("background: white; color: black; font-weight: bold;") self.chk_denoise = QtWidgets.QCheckBox("✨ Ativar Denoiser IA"); self.chk_denoise.setStyleSheet("color: #00FFFF; font-weight: bold;"); self.chk_denoise.setChecked(True) self.spn_light_boost = QtWidgets.QSpinBox(); self.spn_light_boost.setStyleSheet("background: white; color: black; font-weight: bold;"); self.spn_light_boost.setRange(0, 50); self.spn_light_boost.setSuffix("%"); self.spn_light_boost.setToolTip("Aumenta temporariamente a intensidade de todas as luzes da cena para o Bake.") @@ -89,18 +89,57 @@ class AutoBakeManager(QtWidgets.QDialog): l_tex.addLayout(f_tex); l_tex.addStretch(); self.tabs.addTab(t_tex, "🎨 3. Textura") t_cld = QtWidgets.QWidget(); l_cld = QtWidgets.QVBoxLayout(t_cld); f_cld = QtWidgets.QFormLayout() + + self.config_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "vr4_config.json") + saved_hash = "" + if os.path.exists(self.config_path): + try: + with open(self.config_path, "r", encoding="utf-8") as f: saved_hash = json.load(f).get("api_hash", "") + except: pass + self.e_hash = QtWidgets.QLineEdit(); self.e_hash.setStyleSheet("background: white; color: black; letter-spacing: 2px;"); self.e_hash.setEchoMode(QtWidgets.QLineEdit.Password) - self.b_conn = QtWidgets.QPushButton("🔄 Conectar CMS"); self.b_conn.setStyleSheet("background: #2E8B57; color: white; height: 30px;"); self.b_conn.clicked.connect(lambda: cld.mock_connect_api(self)) + self.e_hash.setText(saved_hash) + + def save_hash_config(): + try: + with open(self.config_path, "w", encoding="utf-8") as f: json.dump({"api_hash": self.e_hash.text()}, f) + except: pass + self.e_hash.textChanged.connect(save_hash_config) + + self.b_conn = QtWidgets.QPushButton("🔄 Conectar CMS"); self.b_conn.setStyleSheet("background: #2E8B57; color: white; font-weight: bold; border: 1px solid #1c5234; height: 30px;"); self.b_conn.clicked.connect(lambda: cld.mock_connect_api(self)) self.c_chn = QtWidgets.QComboBox(); self.c_chn.setStyleSheet("background: #CCC; color: black;"); self.c_chn.setEnabled(False) - self.c_pst = QtWidgets.QComboBox(); self.c_pst.setStyleSheet("background: #CCC; color: black;"); self.c_pst.setEnabled(False); self.c_pst.currentIndexChanged.connect(lambda idx: cld.on_post_changed(self, idx)) + def ui_do_fetch(idx=None): cld.fetch_posts_for_channel(self) + self.c_chn.currentIndexChanged.connect(ui_do_fetch) + + self.rdo_add = QtWidgets.QRadioButton("Novo Projeto"); self.rdo_add.setStyleSheet("color: white; font-weight: bold;"); self.rdo_add.setChecked(True); self.rdo_add.setEnabled(False) + self.rdo_edt = QtWidgets.QRadioButton("Atualizar Antigo"); self.rdo_edt.setStyleSheet("color: white; font-weight: bold;"); self.rdo_edt.setEnabled(False) + + def ui_do_post_change(*args): cld.on_post_changed(self) + def ui_do_fetch_edt(checked): + if checked: cld.fetch_posts_for_channel(self) + + self.rdo_add.toggled.connect(ui_do_post_change) + self.rdo_edt.toggled.connect(ui_do_post_change) + self.rdo_edt.toggled.connect(ui_do_fetch_edt) + h_act = QtWidgets.QHBoxLayout(); h_act.addWidget(self.rdo_add); h_act.addWidget(self.rdo_edt) + + self.c_pst = QtWidgets.QComboBox(); self.c_pst.setStyleSheet("background: #CCC; color: black;"); self.c_pst.setEnabled(False) + self.c_pst.currentIndexChanged.connect(ui_do_post_change) + self.e_tit = QtWidgets.QLineEdit(); self.e_tit.setStyleSheet("background: #CCC; color: black;"); self.e_tit.setEnabled(False) self.e_mp3 = QtWidgets.QLineEdit(); self.e_mp3.setStyleSheet("background: #CCC; color: black;"); self.e_mp3.setEnabled(False) self.b_mp3 = QtWidgets.QPushButton("🎵 MP3"); self.b_mp3.setStyleSheet("background: #555; color: white;"); self.b_mp3.setEnabled(False); self.b_mp3.clicked.connect(self.browse_mp3) h_mp3 = QtWidgets.QHBoxLayout(); h_mp3.addWidget(self.e_mp3); h_mp3.addWidget(self.b_mp3) - self.chk_tmb = QtWidgets.QCheckBox("📸 Thumbnail"); self.chk_tmb.setStyleSheet("color: gray; font-weight: bold;"); self.chk_tmb.setEnabled(False) - self.chk_up = QtWidgets.QCheckBox("🚀 Upload Multipart Automático"); self.chk_up.setStyleSheet("color: gray; font-weight: bold;"); self.chk_up.setEnabled(False) - f_cld.addRow("Chave:", self.e_hash); f_cld.addRow("", self.b_conn); f_cld.addRow("Canal:", self.c_chn); f_cld.addRow("Ação:", self.c_pst); f_cld.addRow("Título:", self.e_tit); f_cld.addRow("Som:", h_mp3) - f_cld.addRow("", self.chk_tmb); f_cld.addRow("", self.chk_up) + self.b_tmb = QtWidgets.QPushButton("📸 Gerar Thumbnail"); self.b_tmb.setStyleSheet("background: #FF8C00; color: white; font-weight: bold; height: 35px; border-radius: 4px;"); self.b_tmb.setEnabled(False) + self.b_tmb.clicked.connect(lambda: cld.generate_thumbnail(self)) + self.b_up = QtWidgets.QPushButton("☁️ Enviar para Nuvem"); self.b_up.setStyleSheet("background: #0078D7; color: white; font-weight: bold; height: 35px; border-radius: 4px;"); self.b_up.setEnabled(False) + self.b_up.clicked.connect(lambda: cld.upload_to_cloud(self)) + h_bot = QtWidgets.QHBoxLayout(); h_bot.addWidget(self.b_tmb); h_bot.addWidget(self.b_up) + + f_cld.addRow("Chave:", self.e_hash); f_cld.addRow("", self.b_conn); f_cld.addRow("Canal:", self.c_chn) + f_cld.addRow("Ação:", h_act); f_cld.addRow("Projetos:", self.c_pst) + f_cld.addRow("Título:", self.e_tit); f_cld.addRow("Som:", h_mp3) + f_cld.addRow("", h_bot) l_cld.addLayout(f_cld); l_cld.addStretch(); self.tabs.addTab(t_cld, "☁️ 4. API Cloud") layout.addWidget(self.tabs) @@ -148,10 +187,9 @@ class AutoBakeManager(QtWidgets.QDialog): self.b5 = QtWidgets.QPushButton("P5: UV"); self.b5.setStyleSheet("background: #E0E0E0; color: black; font-weight: bold; height: 35px; border-radius: 4px;"); self.b5.clicked.connect(lambda: eng.prepare_mesh_v19(self)) self.b6 = QtWidgets.QPushButton("P6: Bake"); self.b6.setStyleSheet("background: #E0E0E0; color: black; font-weight: bold; height: 35px; border-radius: 4px;"); self.b6.clicked.connect(lambda: eng.process_bake_logic_v19(self, False)) self.b7 = QtWidgets.QPushButton("P7: Exportar"); self.b7.setStyleSheet("background: #FFD700; color: black; font-weight: bold; height: 35px; border-radius: 4px;"); self.b7.clicked.connect(lambda: eng.export_glb_v19(self)) - self.b8 = QtWidgets.QPushButton("P8: Inspec."); self.b8.setStyleSheet("background: #9370DB; color: white; font-weight: bold; height: 35px; border-radius: 4px;"); self.b8.clicked.connect(lambda: eng.inspect_uv(self)) self.b_clear = QtWidgets.QPushButton("🗑️ Limpar"); self.b_clear.setStyleSheet("background: #666; color: white; font-weight: bold; height: 35px; border-radius: 4px;"); self.b_clear.clicked.connect(self.clear_list) - for b in [self.b1, self.b3, self.b5, self.b6, self.b7, self.b8, self.b_clear]: h_l.addWidget(b) + for b in [self.b_clear, self.b1, self.b3, self.b5, self.b6, self.b7]: h_l.addWidget(b) layout.addLayout(h_l) self.btn_cancel = QtWidgets.QPushButton("CANCELAR OPERAÇÃO"); self.btn_cancel.setStyleSheet("background: #FF0000; color: white; font-weight: bold; height: 40px; border-radius: 8px; margin-top: 10px;"); self.btn_cancel.clicked.connect(self.cancel_all)