From a41ece4af75d61ea14ccac2223196127e3ddfeb5 Mon Sep 17 00:00:00 2001 From: ChemicalXandco <32775248+ChemicalXandco@users.noreply.github.com> Date: Sun, 14 Mar 2021 12:51:08 +0000 Subject: [PATCH 1/5] remove all __pycache__ --- .../__pycache__/AccountWidget.cpython-38.pyc | Bin 1697 -> 0 bytes .../__pycache__/AccountWidget.cpython-39.pyc | Bin 1711 -> 0 bytes .../Games/__pycache__/GameList.cpython-38.pyc | Bin 1732 -> 0 bytes .../Games/__pycache__/GameList.cpython-39.pyc | Bin 3088 -> 0 bytes .../GameWidgetInstalled.cpython-39.pyc | Bin 5037 -> 0 bytes .../GameWidgetUninstalled.cpython-38.pyc | Bin 2130 -> 0 bytes .../GameWidgetUninstalled.cpython-39.pyc | Bin 2830 -> 0 bytes .../Games/__pycache__/__init__.cpython-38.pyc | Bin 174 -> 0 bytes .../Games/__pycache__/__init__.cpython-39.pyc | Bin 174 -> 0 bytes .../Tabs/__pycache__/__init__.cpython-38.pyc | Bin 168 -> 0 bytes .../Tabs/__pycache__/__init__.cpython-39.pyc | Bin 168 -> 0 bytes .../__pycache__/MainWindow.cpython-38.pyc | Bin 773 -> 0 bytes .../__pycache__/MainWindow.cpython-39.pyc | Bin 773 -> 0 bytes .../__pycache__/TabWidget.cpython-38.pyc | Bin 2782 -> 0 bytes .../__pycache__/TabWidget.cpython-39.pyc | Bin 3253 -> 0 bytes .../__pycache__/__init__.cpython-38.pyc | Bin 163 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 163 -> 0 bytes Rare/__pycache__/__init__.cpython-38.pyc | Bin 315 -> 0 bytes Rare/__pycache__/__init__.cpython-39.pyc | Bin 315 -> 0 bytes .../__pycache__/LegendaryApi.cpython-39.pyc | Bin 1219 -> 0 bytes .../__pycache__/QtExtensions.cpython-38.pyc | Bin 4459 -> 0 bytes .../__pycache__/QtExtensions.cpython-39.pyc | Bin 5895 -> 0 bytes Rare/utils/__pycache__/__init__.cpython-38.pyc | Bin 158 -> 0 bytes Rare/utils/__pycache__/__init__.cpython-39.pyc | Bin 158 -> 0 bytes 24 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Rare/Components/Tabs/Account/__pycache__/AccountWidget.cpython-38.pyc delete mode 100644 Rare/Components/Tabs/Account/__pycache__/AccountWidget.cpython-39.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/GameList.cpython-38.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/GameList.cpython-39.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/GameWidgetInstalled.cpython-39.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-38.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-39.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/__init__.cpython-38.pyc delete mode 100644 Rare/Components/Tabs/Games/__pycache__/__init__.cpython-39.pyc delete mode 100644 Rare/Components/Tabs/__pycache__/__init__.cpython-38.pyc delete mode 100644 Rare/Components/Tabs/__pycache__/__init__.cpython-39.pyc delete mode 100644 Rare/Components/__pycache__/MainWindow.cpython-38.pyc delete mode 100644 Rare/Components/__pycache__/MainWindow.cpython-39.pyc delete mode 100644 Rare/Components/__pycache__/TabWidget.cpython-38.pyc delete mode 100644 Rare/Components/__pycache__/TabWidget.cpython-39.pyc delete mode 100644 Rare/Components/__pycache__/__init__.cpython-38.pyc delete mode 100644 Rare/Components/__pycache__/__init__.cpython-39.pyc delete mode 100644 Rare/__pycache__/__init__.cpython-38.pyc delete mode 100644 Rare/__pycache__/__init__.cpython-39.pyc delete mode 100644 Rare/utils/__pycache__/LegendaryApi.cpython-39.pyc delete mode 100644 Rare/utils/__pycache__/QtExtensions.cpython-38.pyc delete mode 100644 Rare/utils/__pycache__/QtExtensions.cpython-39.pyc delete mode 100644 Rare/utils/__pycache__/__init__.cpython-38.pyc delete mode 100644 Rare/utils/__pycache__/__init__.cpython-39.pyc diff --git a/Rare/Components/Tabs/Account/__pycache__/AccountWidget.cpython-38.pyc b/Rare/Components/Tabs/Account/__pycache__/AccountWidget.cpython-38.pyc deleted file mode 100644 index 524aba189dd43da82a1e0cf0272e8fe0b59b7e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1697 zcmZ8hOK%%D5GHrI56P14*e%=uX`uqW=wbl@dMWxy>;Ub-5v)E@UbgEcBd@ZrkW>{3 z?#Tx77h0eP<(U2?UVG|a=%MWlSAL`fI3$Nda^{CD8m|Km6&pfRI0Naknv8 zJc6!IK?ovfK{$?HK}(N&6z6{7myEMA;6WMku#9+A#yoa=tmu?o-lgPAA_5U!5fMsu z>GLf?zahiuFSwPAht%#)j%y_!H%*aesmbeV7}#j?LoTM$*saO;NA=5-bXm`F@l;pI5|nrWC6<4xjsLd8v`e)?Vrf0tVF7ocx#4_+-(>XHvJHUB%BJuJ?RVjJAFl- zQQ-;ys>hjNBDf+P+!hgx;VZ%jkHGENcAw@|-g*bmu?%1F+?}n!c?jKyuKxgGh@ltc z(p!742_?qABo`!M7obam3o>Kt&_se>($|#2&SvewESSZ!j_~i31JdrAu3(pVZVPs| zX1#SE#_ij4sKpi71u+-M8#^+SU3VSTLLm0?~zI8$HgldS01T|D>Kyr5NPZ zAk_og6S;1RbeU9XDObB2tAUorP*!#x}5c_WqTKJBH77*Cz zbeWx}sytQo3?9^@uTv$*a^Xg>DVw^I73jZB&-7@6%JtYrci1e|HUxu!==VSnx=mvm z(p~z2*9E!VO1j#=rPkp!a2drDn}*y%T#ljZuRs{G20kFOunXX?Au}I3JAysPZ14-c zps0K9sV9)@U>2?;$HRCH+`7p;gUoM=YxUqsJ%BU~luV0aIas8X8JK#|qN&iIVOPPA zL3sRPE;W{{4I99vGTi@BYVM6|hp^fKBfFnhKc__wNtMY>b}kbyTGv%te9@>{%ri3vi_dOMfmYpxJloLJ zG9>Mgy0HEq&mMU25p?ao47xhF zj$95Xg}2-OhSZrX3Mjl=K;K1UhbmGLk7_KunC|VyTdrP*J@r0lZ0~eAF&`gJ4E~|Y zp3nS3$58y zfXYUbGj<^)D9`8m@?>rdoTRpYCZ?j|OfB)&93Q#cFeq&LBM^e5l#|pGKBvFZ7vu@$ z9`|p0X}|*>-jEdB<}r-X3lfkt2DcO2eOy#U>m587a(Hfzr$Fb`*)S$Dm|{ae^SBCU<-@!%Ry z_ran++g;y-aqrb>)Zz;4LT9%Rn*EL4!E1K=?P`4p76HyVff%E)jUVQDJ+I8Fe^yVY zf)9#n!1TcOc%d7~mRZG0vD({M4YV+(sHQrNz#K9)e8Yx%-Uy{S0Dw)h3@|fUrVxG` z!3AKXkbbtqIB(HZ5w3l0l=bD5+hneV;>%c}Z<2%W}!I&a#)}uXJ=-mtrJE zRWZd!r!|KVN9W7@lBx1s)iZcdkG^3_jK#u@U{f}AB`VN=$1e0}gU@zs<2-JbY8Qe* zX!M&P2;HR#jp!cz(CdQSZ6#eDzM|Uk7Q&q3iA_VUAugxT_17Q_SpzeWY1ldN*^rqJ zJvf0q$Z_}!y`rdl>ZwPN^>7xgW5>&6-9eshI1m5_HpRBO|EL~7!Ujq(DVKuaaVed`rdf;;L?~ze>xg17K>xi6!{dWu8;G&9Bp_t0%GgBV)DyI)qI|tF<5;5 zpDB>4yAT&!k_JfGA$39hKbj-(;C<*C!zXlgbjN$g^v#R#?LZA-&1ISGW?2c(N}Tty z?Ae^jc1Pj2A1Qb_S6TUvAy%< z#C&o*G5DjlnYy=CwUpKhL3P#bh~P@uRjl2W+y59KgyYUfeDRJe&M9=oCZDyTeSwM6 NXq$LFdY|_Ee*rafwm<*? diff --git a/Rare/Components/Tabs/Games/__pycache__/GameList.cpython-38.pyc b/Rare/Components/Tabs/Games/__pycache__/GameList.cpython-38.pyc deleted file mode 100644 index 24165df8192e8e1d8ef524bf94a133296902a817..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1732 zcma)6y>A;g6esUXC;6n*isQIJmwseW2PsQ8!>F6KX#vBvVy7(#1lRMCR?gww*(3!= zf;>4urVh>AK_0X9Z|QhzfC8Pnb?SRO%T`dJC;>h`zI*q+e(&)~yWJwNet-SpPj5X! z-r{9>fsA|(TmJ}z6HX<`DWep5M>+?1y3)-(=2@91{XAfS<$c-6Ll#;-kj=csT9iB@ zyurhlgok3~!etR}?vq~YPq0pUv~q?9DE$;jdq<2!!4oxkSSkU6+mDi5{E+dHFy9v1 zBvJ|v;yX9uCq=gOq4l*a&vueYIW{SpUtX9NF8vV@K^WzPIl|@iSNe(^QSNZ}WyHK! z#3Rgy0KFr8!h;# zH81G7XIA0Xy(HY@K9oB6*#Qe1=l;w;zCH7vH`MEyJ71gm)&}tJ*uS%6|2OdI&)3oO zRg8C0f;=Zsm&WcvN+I3F!kS@0)lb@7@ zC_sLY9O?mrRa1nle=@0Bn-aJb^tRr|;IIP%;*jb61+e`%&Wg;$aeq^mX(II&FpGcQ z$r3ZhZL>t!p(a=jx(lf_F*TDJi9JhS+~lP?pjm~RGRY5lvULw`f59fxkN-1*S{rP+ z&&8y-QTcj&B9scPu|>$LiPy%k9uF3r*)d^VEle$XEOa(a4y9oCK=!>*CW93BQ&md& zMWXgfnWYnj@Uhiv>9*b#f(y<*fPcOzRW>aPn7ixm^Pay5| zRb3casO{Cv##mG+6X$hk%D1|@R7UWsjk+U%&#I{v`wdD8Pl3WxS51heo@$0{ZKD@d zo)+@R)_s+Hw eiA`r|Tx{}JGgDV@3x`feKq3GnasUt-x&Hv5%F3+( diff --git a/Rare/Components/Tabs/Games/__pycache__/GameList.cpython-39.pyc b/Rare/Components/Tabs/Games/__pycache__/GameList.cpython-39.pyc deleted file mode 100644 index 2c762c19862b748c0dd93b6711fb5c3e67a4511e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3088 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 Dd`Hm= diff --git a/Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-38.pyc b/Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-38.pyc deleted file mode 100644 index c338885d342f0e79bdde79d99dee72463bc21b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2130 zcmb7FTW=IM6t?HKv)2TYkTmp?R_epHWfv8psuUq;pea%sC0vR$FT=2QHj{d0wzjuP zmW@^WHy+kgj=jUqQSW}!YZu#jIb*AMs{$X(fg!XI{_4Aqe)G< z%k_HJ?Q#i|($;3YpG3W;4eXx~pjuz&U7oT?9;{}P zgTPsf5*!<=BJTVWJrVp=wS4!dTWfd1+js8;)rV=EDjf;ISqC9ZH*^s;brT3D0c9kx zxXm3#Us}(}Hf0vGpVb1FIm~@Yna4`coWPsRd{%~8={a#o;Dd=3vw(;SE2ge(TE^)B zWaD&Uxntvvljgz*u_Gu`pHV_I(R4^g*4R2GlxTZIh9q=`APe201=Q1}U4LBGl@}1v zp|x9u(K>RDseGVo?@CAX&`y_hecWL7knDQ9GcU-IbxbjChxX8xe=z6J8QSC7p`*_Y z!N_^Syo+Q+kF7&npU-cfgPn8Z`Js*bfOp0VD8ZS&z)FAtPG$a)JwlX=u(mi}V&#eU z;`jqr`Pa_H$i4*mRX}6>FpSe!hoQtgFrLU$Ue;hD>nO1@ zWt?85cZ|pPW2KeEk~exC)gl0>6mUtUe7v=>Q8_O2=8x{kHr##5aLGT+#7s%06q z-54EY%8Kiv^gx}lB55V&qN(OvLxFW?>Y#UD9|(SbhhuHR^id|+BN_EfB~G`qi5{Le zDOud|L%h%NP=M~Mc))*z`;EJYf~IR6#l`lNon9}01PtAK1@A)`c0{C97``H}AGde1 zgtrAx(@3)RYR168_U1unCz8pg%yxN4tMS(Dy2{ z)jN>$VDb!f^%W388`P&B^{i#OWX)42|CT^jgOzz&b78b9&}($?@tM`$It?nmb)Mw9 zFVl{NXHOdP*jJ$|jJ1YJ9-U^lwP761l?F$+JqccWWyvo<$ym{4*#@Q{mr*p6WPQaq zC0FXsZ(uMktNbcD`21{e@9g-0z&w`q;gywF5XRLvSaMW3poRSS+qqW$DCe-go`Ut| zf53WoU$cxAf_WZ>rV@rp#`*&JS{VM?k3_K|O9;eAf}xb(Ao&)EsZSEA!-aqvd+WSQ zsDgm=GHd{&F!6mlztXUCS#wTa0EsDKX+g$G^s1?D9&G8Wtu4LQkBicqIh7Qtr6fKz zc{LZM)DWlttQP(Oa;#?Itq@G&LbbYB%V>gG#8htebqvxieP>_uRK;1UirQV6T19p> qOSj{0{wT<0ycwUBDMQ~z#=l;8?*{y1h&m4hQW}yNQo8so-~I>u*(q%R diff --git a/Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-39.pyc b/Rare/Components/Tabs/Games/__pycache__/GameWidgetUninstalled.cpython-39.pyc deleted file mode 100644 index 47884c73ac5503e6fd7ef95d135fdd00e581717a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2830 zcmb7G&2AjW5$>M<{Us@p5+lp<+Kvu;$gYw2Cvg-(wxrMk7=o0P2p9wyjka6Mp?YT4 z-Mu2YSe{mZbMX_H0+vU;K%OD5kiO=mHwb(%T-CEQX<0dB7E@haU0Yq%RrO7$tyZ1D z^U**0kN;gG@lW&Ab)2EFX$?z7#K6J`&6MO1xtEnz)c(j4xWgE>`okc#RV7u*QtW zmo^A%vepa2TD&%M$B@Q`eEsi_UQ-YkbhF1wDYj}E`q53*sA3RBy8z_reb zp#rUNXFEH{(^1z2_EE;*Po}Z+w=c_s&GfJwYZL5jrcby4)z&5-@`9!E@OCLV2)vCn z$FX&&WO+K|apSK=R{e>y0eXD?!PCY^ z-3P)+Oc{wC?s5;J_IbcVMvt9u$WzK3=Dujg5%ZXTOj*Ff7hYUr5v#o*ah=s!1I9*m zN^$cW;*q$8XJppU^D5eNj=(v20|?D{Ls%ZT)`^M)FyMME(=jFM_2N7F;H{rdOv93t99n6y)1&PCfZw zRy*>+!rIi=m!>|euM*aHhs@}SbL8pEHjZ`JbAA4+DR@UAu03yl1toTmcUTkm1n*lf z-5JJv71plK-(}&?w689-+g9h=Pgbr~TJ!f%vfw*YGJpSs%s)7>aWDc&TG}#UmJbt_ zNh~#eIO5;a{^Vl+T*AJPx;H9@ljW_la}VpP^Ryfn?DNiKt+Sh|PTGNV%JE2dY}NH1 zf+hcHDF^)ZzaWvXvCv*)N+;fp-QV4u_&5467}EXF_-Z`jQnq2yL`jkrnNAWJ;xrJp zGvpFXMu+kWgu4o_`WOhIZ5q*l2F^0QLf4&D z>NyczrcHXu@u)}FVYNxyAV*q!1N8+0Uu0(i&|G|a89!H)IkO@Hg)BbRpR z^K-6RQ@_m5nezYbrCbN|@+Oj7NZvTNy5Q+^ZvFTZET10P|M25Xc>wVJ(}S&xz-~`# z6BupJ3eL>ga~H7c&B)w8AxCryUz}&I{Ax=7?i>N6gH|vPt!@OM?=tt;Vcziqr~$m_&x&| z0WRbzDx2n_zLFs%(s(@2w6)gtsvP>Ltn8-p4x0J-A<933>=wKV8;H;gZXNog>K}(X zKX^Y(-hF!sp4N36;Sqr?NlZOS@{)}O^35dqdYp=CMPfl3k7WZbH-MFJ$s!W(T()^7 z=1+c!1oL2>GOY!O47d;gy=Q)ZiYnMS7M)jsvAqXwJF6eI-3WemrMoV#!J-M_QZfY0 zk=RqFxqY~!Kk4mgyu?_)D)?@k$~VSYh0#l=lB%ec#5%E`fC^yS;`Bb$!&`%m$*i3T z;V8IJJxq)Z)m%rA>z#pHueva)-l9aRX_e^9R(Gs3u&|@=9%x=DERG8Om(Q(Q9s8N6 n$_77K=T6I>o5h*vMwOhKScvKp5I{me$tFcCYyu7g`kg2mQ~2_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o10aKO;XkRX-;+ zFE6nuMc+9;B{MHwKcF%>Be5tqpeR2pHMyi%KPa&%)i1RiOas;A7Ubup<^jb+5|fJc l-4kg`kg2mQ~2_X70h(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o10aKO;XkRX-;+ zFE6nuMc+9;B{MHwKcF%>Be5tqpeR2pHMyi%KPa&%)i1RiOas;A7Ubup<^jb+5|fJc l-4kg`kf;MZ#1Q7igL?8o3AjbiSi&=m~3PUi1CZpdACy>>>X%v$rh#g53-a?)^MK+ZiAlx! f@$s2?nI-Y@dIgoYIBatBQ%ZAE?LgLi24V&Pr5-7O diff --git a/Rare/Components/Tabs/__pycache__/__init__.cpython-39.pyc b/Rare/Components/Tabs/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 18a578efed1aa8f4ca1397522a6e807733eee852..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmYe~<>g`kf;MZ#1Q7igL?8o3AjbiSi&=m~3PUi1CZpdACy>>>X%v$rh#g53-a?)^MK+ZiAlx! f@$s2?nI-Y@dIgoYIBatBQ%ZAE?LgLi24V&Pto|vC diff --git a/Rare/Components/__pycache__/MainWindow.cpython-38.pyc b/Rare/Components/__pycache__/MainWindow.cpython-38.pyc deleted file mode 100644 index 32ac6a894a639623cf665309c361217942a6702c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 773 zcmYjPO>Yx15FPJ2X_}8xi3>;^!Z8wLPuvhf^bmnWlt8OWzL;h0B#XSesqLtw$}N@p zH=1Mr(q6g1nHwi&Hi5*FXXnY|_h#PuqSI*tuHWCEf0;3W9|R5;NAMQ6dx1fLVg@oM z7^6HeK^BUT!2ndK_$?@|**X+l)jmV7{tItFkCmua~KsYM)TS z;R<)aJ;OwUUwnIl$uK?9*LyO)(`V&dhE{2;YpJJ=KFS~<__uWZh zyGBoSu423FHOiV>%(b=TT-lH^%~LO>XgTc%y2!M*OL2l=Ysh)(jTWbf&vfo>Y_`@| zYF}_SL(77aJ8dQraJ%YBuoHI5niy{$AC&!@r&pud@;K8{mQ5+M zLM;sCZ7Hu7vDuzflx1hvaH5To(zZ}y8;&V!Qy{ZQ-qG)CunG@RYx15FPJ2X_}8xsTYtqgkvPgp12`|=pmvKQ36Gkd@*M2B#XSe!QQB($}N@p zH=1Mr(q6g1nHwi&Hi5*FXXnY|_h#N&bvjMJ_51s?&oc(_gTUe92;SiK&oOAw%tFcp zW0VIrNJ9}a7=R8nzXi<=TZe+{+DGWsf8h=2v9dLOuafL4$#i~=@c2@Fxk~iZ6fqSX zu5btZQ%np9ra=UEFkzbM;I<*cJK!KVl80q;PZ|dYB$U^26PJIBp@4#|U>)2C8(^@4 z`w-cXPlp>`VXpZG2f~wDQD3n&+o2<>*MMrZp+j#V`H7@S7sJit56YSDi|*jlyY3`+ zU2CQ$)5CQnV_mf{4#){x7jutuCBJ~vt6l-*k6 zsC~ix3@r;v?v0(4JkFhYKm(D6eqOr=K3vMFVn z>xHGfE##moK}-J%!c o9i59OG*5p&NB{qms(h<%AIMaKBvUqCZToypztfXwJ7|Z00eIQHPyhe` diff --git a/Rare/Components/__pycache__/TabWidget.cpython-38.pyc b/Rare/Components/__pycache__/TabWidget.cpython-38.pyc deleted file mode 100644 index 29c02f8125761b63750bd612b59641111b6ba4de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2782 zcmb7GOK%%D5GMDf)oLXxvfH>pnx;)(Dhlb;$Dt^iG-(>3G3+Eo0RqK#Ez-8!eJEV2 zu~p@y0J-+iA7CBxU-}Dp?J0kur_OL!mh89)x`JkB$RRnL`S@{vY&HV|kNfAlzx?hK z@;4f*j|0Xx@Gt%V!3n1cNhzZgbt|z_o7t(uoYZA*>M<{^v0Cag-}Ku_Jq=i3bSG(~ zAq$P}Ce5_PT1NMhwY1IJl-wn}#{Fl6`@){t>=M{@9)KMP2kZ{m4IY9W3J>gc-h4>9 zt(OoL=~C_P+#BRs*VDnyqj>kHA>S8D*HFI|OHito#?GTWPi~Es$}`=pT5k^25KMRH zzR1QfS5TpXj2k-&|aI8Lwx((n$x)jz4aORM?uvWa2s3E!XEBaRs#ZcSNy}uKV0$f&UiE{ zkEUv=HD0?+W)ysFGk1GVPA+kb1GK}ATE_^nj}zFozx5I~C_@meemj4XC3(yXO}=}H z8=kE9v93kG5K0ZR{h~L@_PZO}Eyg1uWfNSqA4O0h6-BHLURA}t@?Fil4~2>ns2cNP z&Y??NN=nzP$ro#~W;y&$7Vjp4vsyeDb}a1_BH7cbpxr0;0GAU>Vt{G=YO7jxejAq$vjSGGLJbqcjobg+n8&44LZ9{nNXa@>&sU$)seN_~dVL9gk9$)Kn8*hSEtRx^OMtzANvy?g>&xBhhKhF| z0)D<90$>oL@*NP`m2tK&v}?{U!}D9h&rahb$X1E6A>`)>4kZlNUcR>nUgwkZ5lr?e z{EHR{LfbT;KFBNdDmAAE?v~z41OR(PsJwyVeH55oiL=NLP#9R9!xmNzJr>wjc=}uzTrYn15=jXSm+kVh*zTq*IZ4MX<=}tah_x+is^U zFYdvlkJXT3#gQ^xyPc25qx(4*5>d#)ds(64Oqpimi3==wnguu*uKY*Ck?F=OUcz?{ zku@COhVI*9FCHg|5cp=0NS*LG18%GicSZSa069g>$hSafFE-x`=dpsN{sR65D#*J5 z4S}UlBIiyvfvr|AgwylYbuUECe*y+G^Eobrw~=RUb%PXb_!56)%M2q)o#%^3Vz%`~beo^uzSds*7x^E1AOHXW diff --git a/Rare/Components/__pycache__/TabWidget.cpython-39.pyc b/Rare/Components/__pycache__/TabWidget.cpython-39.pyc deleted file mode 100644 index c2ba93edfbdcfd1e78925f22ab835aa0626dc6cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3253 zcmZ`*OK%%T67HTChvbl=Y1vY|-i?trgMR71_Cq?Oh)XHL}eaK zPjf8^@<|5bACUujTmPlG=Hzp3IpwRKAt~F+5Yw#guCD2-`s(YBI-M57v;FwvpEe== zPMwR7gU%Oti~pmMO!9=KTyRdZl~}1Q?9>rX>IygYgqJo%BlU%E=Ix}JwnWRwPSQ>T z5g6G`I%!vQjqD|BX;1Ww+(@pZebG0vpIlAX#X4tqnQY3|6DC`+eQt|u=(lBneh@q8 zUq`+=h!V9@Y3D6H_EetSGIN@MteVuF70mgLX@Ek|AWR?dKE};Zk}E(Oe|07$G{#hh&P`RlG%j241ikKVx&g%bxM= zfmOEUD&1u;&I%nRNq7LONIpM)#!IJ&ll^Dx&wE>kc^Ypeah63&Zhf6gU}5XQ$>=ar z=>wG?#Uov8eIKcKJAP#Tp_5MXEY2{#Oz?1WQu?1KQMxCi+t;zDKk%~Cw^j;a2t4XA z9DbhUqbMnEL#WhC_MhkE&*{}Is*Yl-s1Z4wWCw$Plx{Jd#7eC}rSunOL=#%DPIco| z|Eg;=7OPbUUC|_`!(?1&;YE_*Us_rz3Y($;mi|8WRUF2$Y~bS=+!b9J??=-_hmTBw ziuQCOBVAch>$K7()17Ju-(=BV5=+sDMx%V1X+5*0-lDvGIkjhffdkZZ*)G>mugYvH$!x67~d8&;PG zmJd0wH?7k?zEIg7E<*Q85mJ?#B76tJ8JjVH6mX(4G^K|!JfpHi2~wY+s`^kJcvVtg8Z^FN?wQ2AK8G4<5Dq_jzm@$P*{Z{aNr z_3%DFy|(h;qLl_=A*1AmWh)HRTuwoLVHt$sFViTgW>k|5Q^XV*E<1HVM={DFtUhbL zZFXTcKrkb8m<{;6zhOKWVdRB};zdvK9-0L+8VUg`f(LCQ+tPsyegr4FC~#NZg8C~7 zAY�Z$KaxG~qTZcm_GNkqj{5BKQMqTLft|&O+cT+=~?Knpl%@<1LUAA5Wr80@ei6 z@AjyUx2gWC=nH=_|8fE-SQM**sF~p9@lylSNL`K~O4O3Z6LeM%5MCZz8dC@h)dU$sPGY!3aWM*9SYzUSYCSh{ywx`4$sFh zwuQGKvSGZ3s`Js_;5WIcHSp2!!VXX(A3#riNDUpL6&T5iA~Tml@D?U$(=`Nx8Z{Vs z;aNiPCWbGEAYkVJcDAC*egSs0m{`ofPD5B_fDT{e2dBJ=GIFNfBd?Z`4c(L$9cuMR z3kNJ^gU#AHIIkF^0{~Oztyx#EnIo>!=z&?ToSE#I1JBtO4srfzzo!10Ly7rCyM2&wL2i0P84OD{5avzM_#rSuuzg2<9esRd^4 zQwz*=`ROK@?IQax>kIXK8EXC(Fcg_j=|gn%_}pZBd$1|m4^DRUC&L|mcRDr^DAyJv zm2ZWj{3|M9bEcUPnmCwOuhpP+05FQo7I&X{ri($Nc z!SbFnTu88E&S>%GrC%`jqoHX@)135!OEq^FcZr2S`c%7y)(st-a9t?Gg`kf*NbZ1Q7igL?8o3AjbiSi&=m~3PUi1CZpdACy>>>X%v$rh#g53-a?)^MK;<@tJv< aCGqik1(mlrY;yBcN^?@}KsI~^Vg>-p(kHk8 diff --git a/Rare/Components/__pycache__/__init__.cpython-39.pyc b/Rare/Components/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 629a852f1e0963acaccee221ac4ee1c244002802..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmYe~<>g`kf*NbZ1Q7igL?8o3AjbiSi&=m~3PUi1CZpdACy>>>X%v$rh#g53-a?)^MK;<@tJv< aCGqik1(mlrY;yBcN^?@}KsI~^Vg>-xb|=ID diff --git a/Rare/__pycache__/__init__.cpython-38.pyc b/Rare/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index eac0adecbe9268686dad5b6b3760b979838e7788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmZWku};G<5Vg~!2|-;Mkr=zgNQkWXOA+^^rJo?8;6-$=6Uee#t8nzre&L z6A~xgyZ7Fmo^-p#A}3gv_0{tS&aYAYtpvpbwqGGgBB>@Nkx@y3G|~HP!Wfbhm9tY+ z&i}bFx~ZgFvP`})fvkt*y0|HBhjiQZ8ax|vElhP374l^kBJ0CB=da+rvWD{zA4FG& zxUtHFR4Qjg3nAnDMQOlw?#CED9i5Fy6a6G^d~1TAJ678kmThb3exL>F8oin&=mC<69H_-m==Zz%&>moMaDHDpRp-zpsUB qx6U@O?>u`H4mR*MO~$!0s^h#k^dVcfRvtCnQB3r6gp9`Yik<-wDp<1s diff --git a/Rare/utils/__pycache__/LegendaryApi.cpython-39.pyc b/Rare/utils/__pycache__/LegendaryApi.cpython-39.pyc deleted file mode 100644 index 51a67440c7da4ec76507e151a99cc147bcf13835..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1219 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 diff --git a/Rare/utils/__pycache__/QtExtensions.cpython-39.pyc b/Rare/utils/__pycache__/QtExtensions.cpython-39.pyc deleted file mode 100644 index ca7ec4f60965fb9a5e8f1507b42b58051577594f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5895 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 Date: Sun, 14 Mar 2021 12:53:12 +0000 Subject: [PATCH 2/5] add start.sh --- Rare/Components/Tabs/Games/GameInfo/GameSettings.py | 13 ++++++++----- Rare/{Main.py => __main__.py} | 0 requirements.txt | 4 ++-- start.sh | 2 ++ 4 files changed, 12 insertions(+), 7 deletions(-) rename Rare/{Main.py => __main__.py} (100%) create mode 100644 start.sh diff --git a/Rare/Components/Tabs/Games/GameInfo/GameSettings.py b/Rare/Components/Tabs/Games/GameInfo/GameSettings.py index c1bbd28e..8235b169 100644 --- a/Rare/Components/Tabs/Games/GameInfo/GameSettings.py +++ b/Rare/Components/Tabs/Games/GameInfo/GameSettings.py @@ -40,11 +40,14 @@ class GameSettings(QWidget): self.layout.addWidget(self.linux_settings) self.possible_proton_wrappers = [] - for i in os.listdir(os.path.expanduser("~/.steam/steam/steamapps/common")): - if i.startswith("Proton"): - wrapper = '"' + os.path.join(os.path.expanduser("~/.steam/steam/steamapps/common"), i, - "proton") + '" run' - self.possible_proton_wrappers.append(wrapper) + try: + for i in os.listdir(os.path.expanduser("~/.steam/steam/steamapps/common")): + if i.startswith("Proton"): + wrapper = '"' + os.path.join(os.path.expanduser("~/.steam/steam/steamapps/common"), i, + "proton") + '" run' + self.possible_proton_wrappers.append(wrapper) + except FileNotFoundError as e: + print("Unable to find Proton:", e) self.select_proton = QComboBox() self.select_proton.addItems(["Don't use Proton"] + self.possible_proton_wrappers) self.select_proton.currentIndexChanged.connect(self.change_proton) diff --git a/Rare/Main.py b/Rare/__main__.py similarity index 100% rename from Rare/Main.py rename to Rare/__main__.py diff --git a/requirements.txt b/requirements.txt index 7ed2416f..11e0ebc0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ -legendary-gl +git+https://github.com/ChemicalXandco/legendary.git@c1db2b9#egg=legendary-gl requests Pillow PyQt5 QtAwesome -notify-py \ No newline at end of file +notify-py diff --git a/start.sh b/start.sh new file mode 100644 index 00000000..064e6a60 --- /dev/null +++ b/start.sh @@ -0,0 +1,2 @@ +export PYTHONPATH=$PWD +python3 Rare \ No newline at end of file From 507e7768f896f943de1f7a36697fd5bcd48c3a51 Mon Sep 17 00:00:00 2001 From: ChemicalXandco <32775248+ChemicalXandco@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:11:03 +0000 Subject: [PATCH 3/5] update download statistics during download --- .gitignore | 1 + Rare/Components/Tabs/Downloads/DownloadTab.py | 179 ++++++++++-------- .../Tabs/Games/GameInfo/GameInfo.py | 1 - start.sh | 2 +- 4 files changed, 102 insertions(+), 81 deletions(-) diff --git a/.gitignore b/.gitignore index 69e93893..2547711d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ __pycache__ /.idea +/.vscode /build /dist /Rare.egg-info/ diff --git a/Rare/Components/Tabs/Downloads/DownloadTab.py b/Rare/Components/Tabs/Downloads/DownloadTab.py index 14d8b2dd..c99be7a3 100644 --- a/Rare/Components/Tabs/Downloads/DownloadTab.py +++ b/Rare/Components/Tabs/Downloads/DownloadTab.py @@ -1,13 +1,17 @@ import os +import queue import subprocess import time from logging import getLogger +from multiprocessing import Queue as MPQueue -from PyQt5.QtCore import QThread, pyqtSignal -from PyQt5.QtWidgets import QWidget, QMessageBox, QVBoxLayout, QLabel, QGridLayout, QProgressBar, QPushButton +from PyQt5.QtCore import QThread, pyqtSignal, Qt, QVariant +from PyQt5.QtWidgets import QWidget, QMessageBox, QVBoxLayout, QLabel, QGridLayout, QProgressBar, QPushButton, QDialog, QListWidget +from notifypy import Notify from legendary.core import LegendaryCore from legendary.models.game import Game -from notifypy import Notify +from legendary.models.downloading import UIUpdate +from legendary.utils.selective_dl import games from Rare.Components.Dialogs.InstallDialog import InstallInfoDialog from Rare.utils.LegendaryApi import VerifyThread @@ -18,11 +22,13 @@ logger = getLogger("Download") class DownloadThread(QThread): status = pyqtSignal(str) + statistics = pyqtSignal(UIUpdate) - def __init__(self, dlm, core: LegendaryCore, igame, repair=False, repair_file=None): + def __init__(self, dlm, core: LegendaryCore, status_queue: MPQueue, igame, repair=False, repair_file=None): super(DownloadThread, self).__init__() self.dlm = dlm self.core = core + self.status_queue = status_queue self.igame = igame self.repair = repair self.repair_file = repair_file @@ -32,9 +38,15 @@ class DownloadThread(QThread): try: self.dlm.start() + time.sleep(1) + while self.dlm.is_alive(): + try: + self.statistics.emit(self.status_queue.get(timeout=0.1)) + except queue.Empty: + pass self.dlm.join() - except: - logger.error(f"Installation failed after{time.time() - start_time:.02f} seconds.") + except Exception as e: + logger.error(f"Installation failed after {time.time() - start_time:.02f} seconds: {e}") self.status.emit("error") return @@ -104,9 +116,9 @@ class DownloadTab(QWidget): self.active_game: Game = None self.installing_game = QLabel(self.tr("No active Download")) - self.dl_speed = QLabel(self.tr("Download speed") + ": 0MB/s") - self.cache_used = QLabel(self.tr("Cache used") + ": 0MB") - self.downloaded = QLabel(self.tr("Downloaded") + ": 0MB") + self.dl_speed = QLabel() + self.cache_used = QLabel() + self.downloaded = QLabel() self.info_layout = QGridLayout() @@ -114,16 +126,11 @@ class DownloadTab(QWidget): self.info_layout.addWidget(self.dl_speed, 0, 1) self.info_layout.addWidget(self.cache_used, 1, 0) self.info_layout.addWidget(self.downloaded, 1, 1) - self.layout.addLayout(self.info_layout) + self.prog_bar = QProgressBar() + self.prog_bar.setMaximum(100) self.layout.addWidget(self.prog_bar) - label = QLabel( - self.tr("WARNING: The progress bar is not implemented. It is normal, if there is no progress. The " - "progress is visible in console, because Legendary prints output to console. A pull request is " - "active to get output")) - label.setWordWrap(True) - self.layout.addWidget(label) self.installing_game_widget = QLabel(self.tr("No active Download")) self.layout.addWidget(self.installing_game_widget) @@ -150,55 +157,39 @@ class DownloadTab(QWidget): def install_game(self, options: InstallOptions): game = self.core.get_game(options.app_name, update_meta=True) - if self.core.is_installed(options.app_name): - igame = self.core.get_installed_game(options.app_name) - if igame.needs_verification and not options.repair: - options.repair = True - repair_file = None - if options.repair: - repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{options.app_name}.repair') - - if not game: - QMessageBox.warning(self, "Error", self.tr("Could not find Game in your library")) + status_queue = MPQueue() + try: + dlm, analysis, game, igame, repair, repair_file = self.core.prepare_download( + app_name=options.app_name, + base_path=options.path, + force=False, # TODO allow overwrite + no_install=options.download_only, + status_q=status_queue, + #max_shm=, + max_workers=options.max_workers, + #game_folder=, + #disable_patching=, + #override_manifest=, + #override_old_manifest=, + #override_base_url=, + #platform_override=, + #file_prefix_filter=, + #file_exclude_filter=, + #file_install_tag=, + #dl_optimizations=, + #dl_timeout=, + repair=options.repair, + #repair_use_latest=, + #ignore_space_req=, + #disable_delta=, + #override_delta_manifest=, + #reset_sdl=, + sdl_prompt=self.sdl_prompt) + except Exception as e: + QMessageBox.warning(self, self.tr("Error preparing download"), + str(e)) return - if game.is_dlc: - logger.info("DLCs are currently not supported") - return - - if game.is_dlc: - logger.info('Install candidate is DLC') - app_name = game.metadata['mainGameItem']['releaseInfo'][0]['appId'] - base_game = self.core.get_game(app_name) - # check if base_game is actually installed - if not self.core.is_installed(app_name): - # download mode doesn't care about whether or not something's installed - logger.error("Base Game is not installed") - return - else: - base_game = None - - if options.repair: - repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{options.app_name}.repair') - if not self.core.is_installed(game.app_name): - return - - if not os.path.exists(repair_file): - logger.info("Game has not been verified yet") - if QMessageBox.question(self, "Verify", self.tr("Game has not been verified yet. Do you want to verify first?"), - QMessageBox.Yes | QMessageBox.No, QMessageBox.No) == QMessageBox.Yes: - self.verify_thread = VerifyThread(self.core, game.app_name) - self.verify_thread.finished.connect( - lambda: self.prepare_download(game, options, base_game, repair_file)) - self.verify_thread.start() - return - self.prepare_download(game, options, base_game, repair_file) - - def prepare_download(self, game, options, base_game, repair_file): - dlm, analysis, igame = self.core.prepare_download( - game=game, - base_path=options.path, - max_workers=options.max_workers, base_game=base_game, repair=options.repair) if not analysis.dl_size: QMessageBox.information(self, "Warning", self.tr("Download size is 0. Game already exists")) return @@ -206,26 +197,50 @@ class DownloadTab(QWidget): if not InstallInfoDialog(dl_size=analysis.dl_size, install_size=analysis.install_size).get_accept(): return - self.installing_game_widget.setText("") - self.installing_game.setText(self.tr("Installing Game: ") + game.app_title) - res = self.core.check_installation_conditions(analysis=analysis, install=igame, game=game, - updating=self.core.is_installed(options.app_name), - ) - if res.warnings: - for w in sorted(res.warnings): - logger.warning(w) - if res.failures: - for msg in sorted(res.failures): - logger.error(msg) - logger.error('Installation cannot proceed, exiting.') - QMessageBox.warning(self, "Installation failed", - self.tr("Installation failed. See logs for more information")) - return self.active_game = game - self.thread = DownloadThread(dlm, self.core, igame, options.repair, repair_file) + self.thread = DownloadThread(dlm, self.core, status_queue, igame, options.repair, repair_file) self.thread.status.connect(self.status) + self.thread.statistics.connect(self.statistics) self.thread.start() + def sdl_prompt(self, app_name: str = '', title: str = '') -> list: + sdl = QDialog() + sdl.setWindowTitle('Select Additional Downloads') + + layout = QVBoxLayout(sdl) + sdl.setLayout(layout) + + pack_list = QListWidget() + layout.addWidget(pack_list) + + done = QPushButton(text='Done') + done.clicked.connect(sdl.accept) + layout.addWidget(done) + + tags = [''] + if '__required' in games[app_name]: + tags.extend(games[app_name]['__required']['tags']) + + # add available additional downloads to list + pack_list.addItems([ tag + ': ' + info['name'] for tag, info in games[app_name].items() if tag != '__required' ]) + + # enable checkboxes + for i in range(len(pack_list)): + item = pack_list.item(i) + item.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled) + item.setCheckState(Qt.Unchecked) + + sdl.exec_() + + # read checkboxes states + for i in range(len(pack_list)): + item = pack_list.item(i) + if item.checkState() == Qt.Checked: + tag = item.text().split(':')[0] + tags.extend(games[app_name][tag]['tags']) + + return tags + def status(self, text): if text == "dl_finished": pass @@ -240,6 +255,12 @@ class DownloadTab(QWidget): elif text == "error": QMessageBox.warning(self, "warn", "Download error") + def statistics(self, ui_update: UIUpdate): + self.prog_bar.setValue(ui_update.progress) + self.dl_speed.setText(self.tr("Download speed") + f": {ui_update.download_speed/1024/1024:.02f}MB/s") + self.cache_used.setText(self.tr("Cache used") + f": {ui_update.cache_usage/1024/1024:.02f}MB") + self.downloaded.setText(self.tr("Downloaded") + f": {ui_update.total_downloaded/1024/1024:.02f}MB") + def update_game(self, app_name: str): print("Update ", app_name) self.install_game(InstallOptions(app_name)) diff --git a/Rare/Components/Tabs/Games/GameInfo/GameInfo.py b/Rare/Components/Tabs/Games/GameInfo/GameInfo.py index 3b0c0b06..330cebb7 100644 --- a/Rare/Components/Tabs/Games/GameInfo/GameInfo.py +++ b/Rare/Components/Tabs/Games/GameInfo/GameInfo.py @@ -98,7 +98,6 @@ class GameInfo(QWidget): QMessageBox.Yes | QMessageBox.No) == QMessageBox.Yes: LegendaryApi.uninstall(self.game.app_name, self.core) self.update_list.emit() - self.back_button.click() def repair(self): repair_file = os.path.join(self.core.lgd.get_tmp_path(), f'{self.game.app_name}.repair') diff --git a/start.sh b/start.sh index 064e6a60..f6fb2402 100644 --- a/start.sh +++ b/start.sh @@ -1,2 +1,2 @@ export PYTHONPATH=$PWD -python3 Rare \ No newline at end of file +python3 Rare From 217eb2312d9570d279ccb8c0eb730e2fd844460e Mon Sep 17 00:00:00 2001 From: ChemicalXandco <32775248+ChemicalXandco@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:32:45 +0000 Subject: [PATCH 4/5] Update setup.py --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 8785917e..d4d4f55a 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ setuptools.setup( "Operating System :: OS Independent" ], python_requires=">=3.8", - entry_points=dict(console_scripts=["rare=Rare.Main:main"]), + entry_points=dict(console_scripts=["rare=Rare.__main__:main"]), install_requires=[ "legendary-gl", "requests<3.0", From eb26e0f6cb37ef5f97bbc74e8ebac58fe3106d2c Mon Sep 17 00:00:00 2001 From: ChemicalXandco <32775248+ChemicalXandco@users.noreply.github.com> Date: Sun, 14 Mar 2021 21:40:08 +0000 Subject: [PATCH 5/5] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index b787120b..4be4fec8 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,12 @@ Using the exe-file could cause an error with the stylesheets - Launch, install and uninstall games - Authentication(Import from existing installation and via Browser) -- In-app Browser to buy games +- Download progress bar - Settings (Legendary and games) - Translations (English and German) ## Planned - Sync Cloud Saves -- Download Progressbar - Offline mode - More Translations