From f40ab3fb2c53577b17d030a1136110509c8efd4d Mon Sep 17 00:00:00 2001 From: Yvan Sraka Date: Thu, 22 Mar 2018 20:10:25 +0100 Subject: [PATCH 001/777] % chmod +x make_popcorn.sh --- make_popcorn.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 make_popcorn.sh diff --git a/make_popcorn.sh b/make_popcorn.sh old mode 100644 new mode 100755 From ec97c3d10664cee7321c7a8151ef00920f93617a Mon Sep 17 00:00:00 2001 From: "Pedro L.C.A" Date: Wed, 19 Sep 2018 02:00:18 -0300 Subject: [PATCH 002/777] Improve/update bg-header.jpg image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The image was super low and there was no references to Pochoclín --- src/app/images/bg-header.jpg | Bin 17867 -> 118625 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/app/images/bg-header.jpg b/src/app/images/bg-header.jpg index 75df055d5a048307d40ee3d572c8f67785449289..77e71188b042d727d5abcb4913d39a187085e0f5 100644 GIT binary patch literal 118625 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

-`^Z#zi&KDkQ~_G)qJvor$||rhFxWwaI60|R_@%8U1pa@b7nW!b~=N!uauX= z1Na{*%b7ZTb^P+`;~ZKci+Ob^hITIawsHNR7^)m?BlWb{Qgw6hzS`50uB$$|v=^<~ zanfg+WRKV0nVYTExvz9fD?w~?c6<^(rQ3I8a5lt;eo{2mY1U`0>kE98GBGO4rBtDL z5QaFmu$X2Nwllw=b*Xk3e@g%8j8m815utiAIwwW#4l*~Nk8lmWYtdh^6-%YrRK?y~(JdBYUTR$s9eQp+{B77y*2U@@bPBO;KQeA=Nn(JP#a-D$0pas%<60iduP&3N}fpC<(eX~ zXy$-DhTM`^0b(LLmI3(XiAQ5DBXgD;=^7_Bn${yfVhC?&+f@(FT=#~q)lv1AHpDUT zQ`9kpk4-Ogeq6Rm6R@z9RmG@A+K zL@+K30y+!VtyTu|`{%@9{j6`7wqmN3i8w z=!TYq7?8tph(NErK)GIW5JNc+Ncyq9uwmuU)850`VL*BoK7Qr}lBbV1OoY+X$9^D^ z$5a4RtH?8$n!dn1HHtXPp?@iyDStj5zdA1)7DGw1aunfi8N%%xkzPquDupbF=t}}SBc8@bw9cw?QU_P4^Xw{Y zX;Jd->cRw*k&vE*5*P_W4V{u_<5W_#-n6VvZox9K$lp8*Sr_G*73wriERgV-vLV7^ zfdC`rfJ7in&sK-s+!s_e(N&VlS3A_s;2Pp2;nQ)VGrx4|%m@O8bF(Phq+?>HPJJJ% zw;b)75+l{0C=j@;VFvp`kPYD3^UOV5_dd!W(v{KBDS_x%Kvcd!0v-M5WSER+`&3!q zlWw*xRe$YFaN_;#jnnUJIbb@7ERP}mb&jW`7bbyOC?7RL3}AI-l^pBPrA)8Bdq~G_ z2CLX_QrEUus)@wT|9V#jrq&QKn_<+m${A!}8#@^R#opE~mvc{<;0@5)QUgP$fkyHu zz|>)2xLhTJv2UN%4o5i@rnTT_E7}CFFW0y2@Z>%((TGdHO2=e#1g1{C>eQ`>)A)@J zHUgj2)Xi-XHImo{7j)L^rc9K#xO@4?j(4kHgOJOCsnfu48I?{?{emBgamLkR4WnPO zy9y=58&<8is_a!AhSz$Ui{rh78(Va3{#O^oK=`5IiXiF(Myf?+0qKH)MCDrUZ4BNUyXnXLN!q9OCR;_& zD_CBYBV`(uL=e2=D9KbM{b}Vw<#oIQxhocUGM)FKN?Nm6%6Mgc(yxpR1sN3u9ql!_ z5&bpv`I?uBOvvz#fJjyg<&y_JBY#-wPvW%J;U99^OQ?KSwT2$hp3s zSEW^LKaI+@XBABxsiS%8A~b8*^Y^jT6G)r`nAQPaRC_J%SPuj$B=WnEUS@WQTib# z@YYK?9}`o)W`ND{n(SYFv_lFfhXVfJp$j<1FBSU)LaXE~_;20jYU{c$eLlR{{P`=N z1T@p*Mm|v9U5O-)?yP&=O>yUbkVWPC5jk<{5yrWXp$|@4Z3=q^{|6W;*jK*srO&t< z-TrPx(y+bA$V|&ePCI?ran$D45jeCMv!aLb;trEfJB{`o!J~sEnmE+t(0?dvcnX+FV zrhA!Jw&*nzVsOexob90(M#iVnv{Clw4e`u%t%$iy#fjbcMehxY0eJAw{NU6cxtJXS z%9ur#{{WgWk6-WccQVA;&0n~Gw}1E#fNgtw_wQGPyvm;K+q2-mfdKV6BuE?8vSZ{w zQW%D1Dgne-d$}}IOzV5+sO^6Md`&|6u-}QzVeJ`yTKhV15kIQKNK zE*l9vSY~wpEVbNgEU7=~=CgczM2ahElVI6`0r2IXl`&RZ>RC;nrq_s}^ zZDEK<8HKjvVWQ(@t*l>sn>f=4vk&JjGe1TW$7(ypITXM88>zY$c}-#>>)gworzZdG z_y?a8(mVpdAODnnkQ1}NAiMj3E7^i_SNn&D+PR#)ZogZ?u?+d$k_VSV-u_VDziGlP z418t|z4niKDok3=Y)VojwI8C`hA}(P%oZV)LFVjBK^pIYW|I=^2iIRut|NLna(M1b zv?6&UmHq>C0|Q&t*=pjxdZ9G)bx2cVs0A zynyx8^;Q@2AF-c*#c$4NRj|~5fE{t?NTweWP9?M+SpQHLh@j&_myVH;k$1$2P}s!4 z;q1EcpQ@Y({Tt3l6*8~mGp{+BRfuk=(5rvC0~Cd zyMl&^PHdN(;Z*{aOG<&KlkCRE?I8Utxc z4W(7&=dt06>qoJC7(K?jzW`VoXfQ;$4=U9krMy>d--ls1Nn|iyTw-grs9#G+8qavxcL^L!z?x;jl!J_;SKEwxjhKh40OigHCs2x}A^cw0#!0ThC+cIIkRstu5%+O5yH|&P(K}4+crRlem`Uv{`W&1 z1)Un@;l6uQ305P=&;m0Q#9q3u@_zu*@)md*9ic+o60uZBodHO$V(sKO+GijV*I|#l zx8{aWU?8L^c4`KzhWwjzPidPOfuPeZ7Nhkl&dxWXxAn5q!dBs{IxJZAB*zVF-t4XN0%T; z)a0}-2On0f=fC{WVv>u4=|nb+d${sNQrj3ajkO_+{2K;VXh&w+NYl31_}YrHwFN&q zl*$@eqI@lDek$0oqF9#BjsG<6qt7Ziu(GdTL=yCqLH4q9G3t}}NfR!y6jzTATU6O1 zZyfp?Wj3+?+T53NdrN}CFQ-*ngo}-={}%wEKwiJq3Y;5B`s}R-bjQg(Zgu3WZw7Sz zDEFd(Q|HY*{4pTNHs*jX1dl)QLD^^NzcdW%Jkg($c_x4$$P*XUW%Tq+zUlg0&cEC# z#t|wPB@l(ysi1_|R;d2~Nv3~MG6vCCFi5ITPzWJ|x7nhRPe#PQSCmUUH;zWG#nnsEQ4wv0zqK-@7RUDRI z@mUY;SsnXUL;F@oY_c7eLb4T++}2lYR#$9)m6Y@OA`aeApmP3HbXkAIEWhFwU-3nw z_N=32kZe{)^I03s8{phcBA3C4VRS@c2w}#4XL7<+;51jN7#y%8&#nP!fTCqu6Z}rW znywzGsP0M@S4E9<4Ui9IjEG;Q#42lpNrJM{iLNR^h#eJ*Dr-v%Pu)L7!iP*~B(1IQ zb=-k78ro<0P8r^3WI++Oi1>?iB?yjwm9;S>_S~JNdn^hNvNwu( zBNGCo**Lk5h@em6$vOC76ScgR^s3VfMh_j=a=PL8)`)9Pyp(1ocAV zu!y+VP_mL*0KKs)RQ9;KAyo)?LW(n@4H|@XA)#h+B>v*7zhla)$yfHOkJ7*KU-+JD zH@I1c?pe8o{{Vn{eu$yrOtSO*;R(RO zKRjEibz!^VmZRv4putfhP)4hPNs-f+G{=^g%o#Q2jmaPDl0WvR2`S^hC?4!75pKNk za5-&%RMb}Zd3L6eiLy8WfCx4bRZ?0T-sl$!#%*#nE5)pHKSbv~GP=V}iB<58RkpSg ziI6!bp6N{S40pq0@<5L*Rqzotw^={Faz~ ztd0=37}F194?Pv)y*XnIIw+)Rb&%-fTH#S2ba~(c1dUU`jKFn9$lnGDM#@)3`h3$d z3VwFOd^qlx^i??BRzCPj3!?ep(hN<$i-yAE5i)~AL{I)upnK5}TjylqE^;*TOz{dP zP@3QmbcD+%Ma2%IWH6*0S*ji~e6TPDtAOrJXoU#(3Z%l}R9?SSMxuxHa$ezSHS51D zIEEgXW#qM>La5D*)6r{X=6a|qn_vX=)aH@ z0F#v-;qP8PYd%`G{{TfKTp(x7aw-=PLrJ@L-EjP45~4x2We8--*dXwi%+r+ zjrsoomn2QpqkGO1fjyosn6_ye;%GjYQ~MP&Lrr#4gN&0VP5G%H$i!CWF)*@hq_+57 zjz-DXMK=g2PrXx96k7((Xo;Lk;`rU!ID-moq?u5*TqwSYrcMrod``9u@dV4@JT6Q$ zJ&)3+46Y+Ubu2`t>(OxhJ(fhqvLkOaL>F~jBT|Nlv<_fjs;(SS-U*SE^-~qYKD*wU za!x-a5jm^av{@LWO}kR0DGG?NxKV9PN@0XgeL!~y{ESB4Yl8qpUcA>G+4#J&aOn2fs&9aFVR@iJxH!os0OS|dP80p8q^>TQiv<)_jVJeLnzt94Sew`Yz!>N^z1`Y2UhaAlKD4-}N+Ql?Wp zNxm!voSCZG4r&Nm6_Bj5!MjR(X?l`?kLR#!{3=MK!f?uO@?0=sW(~NZ(LKP#5J`_N zN=CGuFyqO}nw>D3O%S)bCu{CgRfP5ls+3BUUP!I?O4cD zJwLG990Gz99Ghg%e3R$^-8$#44e_ls1azXU`B#!J1X`eJ^;re( zG&`zA{{Rb&+7Co1qEO2so=9B7`XAlNaau)%b^ibyDZ1RLQ-zmK$6xi0QB?fyo5hpf zqpTP0W4uu`vdRViYddp&_C(G@HQ5%+gc+?4=-7xIc0!ydQe+x^&<<#snDtjMX&V03 zN_R{RKI+c>-*jm2bmfN=z<#@~7mQXp?1|ISRi|;j>IB!j&-SMP1l#<1ZmbP|DZAVJ zziJKTH>ce=M16O{`dj-FP>A1>r{{bG+bJ}d`>rqPrX%#laCd~DC+*D{n&DgtS*c~1 z;WA|Q?rK*oJo^L0j;Ytdy_RD=g1@L91aH`(?FuTC)~19EFBG{JI$dS(`Jl+EfDv$S z***E?aNGb50!(+4ZrP4slt?7=zu^--d0PTNy5YYdbD(^aJUvsM8`VjZE(3G?FNu}? z%X3-zCc84!Tg?YZHKfWd8r&M~9FfuwvAT&iM>O0}Cb&DQcm=4fK8ocD?+K_9Q=RI9 zH0&P57Qa+Qh_;=HM(2Dud|aa`@Sx_ALJ0k-{5~AtDV0XXp-KeP(Fajz_R`uW5fK#@ z=haU%WRpOzgN+?Q{3dw76&OiA?1Q{L-u9Z$R9z$Qs;ozv4uo8Qzp6curz!d)5l+Cb zK(j%o%YLggE;-C+ELBQ@?{w2|RpN96=&B}6$IB1XZE+}J@tHB+K1dKiAzK4Zx}a0| zt!CvniScGb()a`MbJTuxD4ja$uMWkOAgxX+A z;h099F>%V-MZ}@%z8Dsv-FJoS(E<&KPj*(F(0PCa%a%~q8S!pW@HB5#E_JNF9Y%|c z*e&UUNfud5?6Q-hlE@+5;bY5X;%R_wJrR@C`mb_}HJ>e0>rr{HH1` z3HhgrH?PTRX4p6Mp#=Rxalmw53n6X(%9C!W*A6d(&2V_X3paL2r;^~w51n1|R;D89 zz}9c7e;H0%{fA}*fXq>jWP zvf;B*Iwx^XiN`h32qs~a!VJm?S-aj8(;_kAx`Hh?!JIu@yUhOpA?kq+s6T|}ik(xA zc#^xY8U?IVoJb9dp~9$=p7P2z`=fOv4bge!&X!ra#EUkQytp^YcfnCluRP{i7iCL!ydy{q#+4Y76YV z@T&7(zhzOUlFjdRdh_`$KFNl@>Y8AkCtX6BiVJ%xv6$;MI;VGCD*pgA@2Up}cuHr8 zU~PXqIVzx3QgG%l2#_vOdBSL^vW0SJnxcEtD_Yy>gUrXTHCe%?jnnRdkL5eUdM&Wz zx2h^stMo^N-OofI00ooyq!=1%SH^ejYWVK`txa^aJAXv>G3QX3!(%J1BBOrDU(}BD?}agK(D0P_XlepP;?xS7RQJ6R@SceA1SU!bKFf;W8$~yuvf(gz zkCqejMS#>$qr@Uw=G94QTsOI{oU^iXiF~h!1c;NW&c>2JnyG8u-W1jl;RAPRW$?IT zMGU1ViyM@{s{LISX2{Jks?2LhS%XT=Hbul9siG5;^gy5hsX$dewjO`VhzJk|HJ9dW zyT8v=O!nxhkCM&0?)m77iA;iin|Y!*dK33VLy)s7Iet?>i__H~1MOo!gz+syNnS{W z(LSvygS-rMR6?^wV~kVj*o{++1Z0(4D3YI79HNtCSn~u5A_$?PtR|Ocy@Je2ecG>>mwr@gyVJBH zWY=^iXjV`_`YlR5Q?x_siH%ljD}DK=Xm#jJstopIL`8SNBJ=hg6rh1rb7Fa- z#|ofls@9Z4GmL)YRbkKfEpKEbiHp?k`sjv-G|0c%KmM5!YjQ+gW#$kBFJ)|vm+ixB zK#So&JSeW7YbsR8z+g<8TM322s2r2p*Nmd*%6^O4!M0`&g2y4t10@L8$#EkiqI@Z` z_BhQz`NC|U4wX~tfxUEFFAyU9k>QH>iep;aUvq@1sE;mPR<)|S)3Gq0#4b{&bb6rW zd^6jXl?{Gri$<9oxhCb*Q&FlNuj+gQt{(be5LIalXG(W@vY?z@<&QW z97km9^i2ne@6`t65fU_fUy`=5_FoaBRCvthoJl0=s#n8{nxI2wMR(amK_ap98>Se0 z;a0qpyU$sgL>s1R6>~S5bxLRylh=|X@UoH%w40}jpH((lpjf8yB0@5LN%|Ds(W(NX zDxIkL@fl!#DcujY4j+ zY4zlrY|SKZ{wM-kBjxu^@3c}+)eveT$KvaRdHXQ$aqK1Ssq6hx^WSV;Rq&}q zMSu`*J{kL}S`(rnWoF$JWo10~ML^5vg=-L@%erILLi%Zd?C7Thh=q`7YCcF8HD?dj z3UiD@g>)%|Sm65BfpFl{T@zvq+mc|s5KMQi9!c#X`ActZXpZgw0NT0$(*t6e;uwJ_ z>0ZQ0rj;XQ9=2Rh51(KwDXi5_1$!!^FEr}0srEwn3k7v+6euD)E$;E2I;PW%?=@~e zy_3J|H>*_DaU9o(SmOAjL#+P*2>$@m;?P>Wx+>C|E+2p=_(gGuvFB4}1@!^K!%q|^TZ9l5H*gwWrb z7Qz#nPO8bF#jdil(Mz@0)ky@Y0DTacHD6V(G1vt;0F8g0)qg5Z)8<=+&?kKrE9i+D4ydEyO(QU0Tm}?V@;AW!7USlgjxuAS zoz;|}bT-uxZ|a7MpU*O+hKSTceUOc9gM2N-Td*Q)WyBeHoF=$}R!=wp%=O(QE#r|7uGjq60%m@^!aB+Yb;3N=n9RH0>22eYa)ntm`B zx@lCx?1F45`Cj@f>G{FOH}Qs$pdAt5?3~97{MJ&V0oZMHS(_2(KV(h89(y95JI20g zz}W_FR#uB2HKGIkBAmz)DF{o*ja8kOVz`Z#la|_qd&W)|19h7&h`br@E)f=}lsH7V z&VfIONQTp%=mf(Q%Ba^;wNI@_%WMNl0Q|YHeG!vy_KM-VFX{7KR>86&4Gi-{ltSUK zypR((AG(PD08AqFU+|=h_mj9!VKO2VcB*vpQCrU3)Eb?y$rDeqlL#OV=w^zU1v!Ex zuIe^IL9%EL6F0Xqsvd74H|&^s{#PIVmrq0vI(?C`Oz{rHa?w}k>YC^`jgHD9kzKy( zQPm$0*>WH69cfjr%GVe+_l|oi#i9NzE*f+uuI16@vsG;Gw zE+IME_kXx6h zqtQ6~-wQ44h{kc@)f#J}p(ncvO>2K#Ty#}Km|0XRD3$QqX>GqK@W@bz80e&7nomn2 z1tNLQ>Es&4eJ~1`omRY;hrd51Ozo#tF&>G)H#Xp+Bw;cWffr16K`Dl3qGm_U7FG=x z#o>c#=$uT|Ou(Q{4Wv&#xIv{?TPGCS6~t-GNkkC0^isd29y5nr3>JVuTuuP}A0$O; zqwuJVDt`))iK(|VO!-?Hp_w!YM}?iDGNK`HT}V#xc_5qJkeo9$!*IBKHj!EUrwi|n zj!dJQ*b%9xs?8PV8Iu!b~ss8|?np2wNL^dr{O;;DjX|mvv-cIm1{Lw2$^b3n| z(Qr;zg8<&@kfUudDc8eKG%$=NI{`A-eKf$CGH$G!YzMQl_ZWMeeAEIh~d8myO zT6MAY!1VIO-wP^iv=scNiH`8=pz5QPe~;Y^uDI5}ArPGEmj<`$AELW%$=X4b#q zN)8(NDkGFdWRRvZkl=|1OremA*U@LE(QbhM0D3MUhfk&uM!I0zA7ufgi!FvRR@hCs zbzi9Zsg@1?$@U#^YHx%gX7s|&>)44D`7R*;0G9rU!Qq8|AIWhl0tSM7xh^M+`7R&o zu8HTleu|6uPZHr#Z<1xonyqm-g|v>tsm$-DAuv#LTjC7LC=JYWK?BKqm2SU9t-QBU z-Q~KEdnn|ipPDU+1Xo^5ATdS6{{WWZS`-ZR+hrBD8vCL$(kY~baBO}MMo8)Co5Uip zEg5t?)R{2iW|O}q5j2Q4{i?m%X>Iwa?&gyl^Vt)W8Pm~abDSwxRep>4tv%5;BcWNO zosp^A?1(M6M4Jffs)r#o!c`al0OvpCq}dDemBfuJ%>-zU7Yl{}V@D)t36;PUF5P&X zvIP!m97)5Az@aVw0M%OwM9tL{5fsvJg$i&!6?ERIgIu%82>kA(?{7uMuM*cD%4v~Q z@tuOc8*)aPDI#liD3Q~WlPY4P{VM2;o z#c{Pk>;=Q?*d{OyR>#;~+C=l}fy zvo~&t6BbN4rKb16!YqnzUDNW-B@^>NYM9wA>WP#5E+tq-tH8)iY!f(8gyw1!UPTI# z6kJ{iaFKLGW0zz_Jk(EKz@n8y8>U(|O$ZD>r~+9BPgD;sypvu2x9Yg;j_|TK*-Dxq zTOBk|vX$`6rts%qJyGENKOH{Ex=+&w znm9m2+Xnaqd8YVAJ_9;qDpQ⁡`ihSP1oBp$j*ne~Za8RPPBx2OjgfrV1g0h^KT4 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 z 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
U?YP}+QTO9HXD!fKHVw?bWptUg+ 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 literal 17867 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 I01rR^*+=x57XSbN From 525dfbe13689861bd8e4064548d63773ca8b785f Mon Sep 17 00:00:00 2001 From: Ben Holden-Crowther Date: Sat, 26 Jan 2019 12:13:11 +0000 Subject: [PATCH 003/777] Removed link to placeholder file --- CONTRIBUTING.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac6381683d..c601bb35d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -133,8 +133,6 @@ For translations please go to: [Transifex](https://www.transifex.com/butterproje 1. cd into the project folder 1. Run `npm install -g grunt-cli bower` - to make it possible to run grunt commands -[Complete documentation](https://github.com/popcorn-official/popcorn-desktop/tree/master/docs/Build-Debug.md) - ### Updating with the latest changes Pulling down the latest changes from master will often require more than just a pull, you may also need to do one or more of the following: From c7799212b5a4779a7b34ad2d9a28632e50e3ae55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=B6zkan=20pakdil?= Date: Sat, 13 Jul 2019 10:25:47 +0200 Subject: [PATCH 004/777] Update make_popcorn.sh fix https://github.com/popcorn-official/popcorn-desktop/issues/1026 --- make_popcorn.sh | 90 +++++-------------------------------------------- 1 file changed, 9 insertions(+), 81 deletions(-) diff --git a/make_popcorn.sh b/make_popcorn.sh index f0531d53c2..6c1a068782 100644 --- a/make_popcorn.sh +++ b/make_popcorn.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash ## Version 0.1.1 ## @@ -23,17 +23,6 @@ else clone_url="$1" fi -execsudo() { - case $OSTYPE in msys*) - echo $OSTYPE - $1 - ;; - *) - sudo $1 - ;; - esac -} - clone_command() { if git clone $clone_url $dir; then echo "Cloned Popcorn Time successfully" @@ -109,10 +98,7 @@ if [ "$clone_repo" = "True" ]; then echo "Removing old directory" if [ "$dir" != "." ] || [ "$dir" != "$PWD" ]; then echo "Cleaning up from inside the destination directory" - sudo rm -rf $dir/* - else - echo "Cleaning up from outside the destination directory" - sudo rm -rf $dir + rm -rf $dir fi clone_command else @@ -120,23 +106,6 @@ if [ "$clone_repo" = "True" ]; then fi fi fi -try="True" -tries=0 -while [ "$try" = "True" ]; do - read -p "Do you wish to install the required dependencies for Popcorn Time and setup for building? (yes/no) [yes] " rd_dep - if [ -z "$rd_dep" ]; then - rd_dep="yes" - fi - tries=$((tries+1)) - if [ "$rd_dep" = "yes" ] || [ "$rd_dep" = "no" ]; then - try="False" - elif [ "$tries" -ge "3" ]; then - echo "No valid input, exiting" - exit 3 - else - echo "Not a valid answer, please try again" - fi -done if [ -z "$dir" ]; then dir="." @@ -146,60 +115,19 @@ echo "Switched to $PWD" if [ "$rd_dep" = "yes" ]; then - echo "Installing global dependencies" - if execsudo "npm install -g bower gulp gulp-cli"; then - echo "Global dependencies installed successfully!" - else - echo "Global dependencies encountered an error while installing" - exit 4 - fi - - echo "Downloading Popcorn dependencies files" - if execsudo "wget -i popcorn_dependencies_files.txt"; then - echo "Local Popcorn files downloaded successfully!" - echo "Moving Popcorn local files" - mv torrent_collection.js src/app/lib/views/torrent_collection.js - else - echo "Local Popcorn files encountered an error while downloading" - exit 4 - fi - echo "Installing local dependencies" - if execsudo "npm install"; then - echo "Local dependencies installed successfully!" - else - echo "Local dependencies encountered an error while installing" - exit 4 - fi - - curh=$HOME - case $OSTYPE in msys*) - ;; - *) - if execsudo "chown -R $USER ." && execsudo "chown -R $USER $curh/.cache"; then - echo "Local permissions corrected successfully!" - else - echo "Local permissions encountered an error while correcting" - exit 4 - fi - ;; - esac - - echo "Setting up Bower" - if bower install; then - echo "Bower successfully installed" - else - echo "Encountered an error while installing bower" - exit 4 - fi - + yarn config set yarn-offline-mirror ./node_modules/ + yarn install --ignore-engines + yarn build echo "Successfully setup for Popcorn Time" fi if gulp build; then echo "Popcorn Time built successfully!" - ./Create-Desktop-Entry - echo "Run 'gulp run' from inside the repository to launch the app" + if [[ `uname -s` != *"NT"* ]]; then # if not windows + ./Create-Desktop-Entry + fi + echo "Run 'gulp run' from inside the repository to launch the app or check out under ./build folder..." echo "Enjoy!" else echo "Popcorn Time encountered an error and couldn't be built" From 9ead9dfb757c98fef0380daeea5df06dabc27c02 Mon Sep 17 00:00:00 2001 From: team-pct Date: Tue, 14 Apr 2020 11:40:12 +0100 Subject: [PATCH 005/777] v0.4.4 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e1300922c..10e81bcdfe 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ }, "license": "GPL-3.0", "main": "src/app/index.html", - "version": "0.4.3", + "version": "0.4.4", "releaseName": "Love in the Time of Corona", "scripts": { "start": "gulp run", From 8843b1d5f8a807228290e4c0d3f7eaf48b494ff8 Mon Sep 17 00:00:00 2001 From: Ziro Official Date: Mon, 23 Sep 2019 22:30:55 +0700 Subject: [PATCH 006/777] Add setting page for api server url --- src/app/database.js | 4 ++++ src/app/lib/providers/generic.js | 9 +++++++++ src/app/lib/views/settings_container.js | 4 ++++ src/app/settings.js | 3 +++ src/app/templates/settings-container.tpl | 15 +++++++++++++++ 5 files changed, 35 insertions(+) diff --git a/src/app/database.js b/src/app/database.js index cf0dd4de55..13eb88bda6 100644 --- a/src/app/database.js +++ b/src/app/database.js @@ -409,6 +409,10 @@ var Database = { window.__isNewInstall = true; } + if (Settings.apiserver) { + App.Providers.updateUrl(Settings.apiserver); + } + App.vent.trigger('initHttpApi'); App.vent.trigger('db:ready'); App.vent.trigger('stream:loadExistTorrents'); diff --git a/src/app/lib/providers/generic.js b/src/app/lib/providers/generic.js index 93efe5972d..12d3585d5c 100644 --- a/src/app/lib/providers/generic.js +++ b/src/app/lib/providers/generic.js @@ -6,6 +6,14 @@ App.Providers.Generic = require("butter-provider"); + function updateProviderUrl (url) { + for (let provider in cache) { + if (cache[provider] && cache[provider].apiURL) { + cache[provider].apiURL = [url,`cloudflare+${url}`]; + } + } + } + function delProvider(name) { if (cache[name]) { win.info("Delete provider cache", name); @@ -87,6 +95,7 @@ App.Providers.get = getProvider; App.Providers.delete = delProvider; App.Providers.install = installProvider; + App.Providers.updateUrl = updateProviderUrl; App.Providers.getFromRegistry = getProviderFromRegistry; })(window.App); diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 81ddd87f3f..16cc19586e 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -185,6 +185,10 @@ data = {}; switch (field.attr('name')) { + case 'apiserver': + apiDataChanged = true; + value = field.val(); + break; case 'httpApiPort': apiDataChanged = true; value = parseInt(field.val()); diff --git a/src/app/settings.js b/src/app/settings.js index 55459ebb89..1b7e2477a6 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -104,6 +104,9 @@ Settings.trackers = { ] }; +// API Servers +Settings.apiserver = ''; + // User interface Settings.language = ""; Settings.translateSynopsis = true; diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 781a291b77..cd7797223b 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -14,6 +14,21 @@ +
+
Servers
+
+ +
+

<%= i18n.__("API Server") %>

+ + + + +
+
+
+
+
<%= i18n.__("User Interface") %>
From 5e0688ebd1ce05511c78c566ae3b4cd19377437a Mon Sep 17 00:00:00 2001 From: Ivan Borzenkov Date: Fri, 20 Mar 2020 02:36:45 +0300 Subject: [PATCH 007/777] rename to custom --- src/app/database.js | 4 ++-- src/app/lib/views/settings_container.js | 9 +++++++-- src/app/settings.js | 2 +- src/app/templates/settings-container.tpl | 4 ++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/app/database.js b/src/app/database.js index 13eb88bda6..50dc8989dc 100644 --- a/src/app/database.js +++ b/src/app/database.js @@ -409,8 +409,8 @@ var Database = { window.__isNewInstall = true; } - if (Settings.apiserver) { - App.Providers.updateUrl(Settings.apiserver); + if (Settings.apiServer) { + App.Providers.updateUrl(Settings.apiServer); } App.vent.trigger('initHttpApi'); diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 16cc19586e..6b19f02987 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -180,13 +180,14 @@ saveSetting: function (e) { var value = false, apiDataChanged = false, + apiServerChanged = false, tmpLocationChanged = false, field = $(e.currentTarget), data = {}; switch (field.attr('name')) { - case 'apiserver': - apiDataChanged = true; + case 'apiServer': + apiServerChanged = true; value = field.val(); break; case 'httpApiPort': @@ -283,6 +284,10 @@ // update active session App.settings[field.attr('name')] = value; + if (apiServerChanged && value) { + App.Providers.updateUrl(value); + } + if (apiDataChanged) { App.vent.trigger('initHttpApi'); } diff --git a/src/app/settings.js b/src/app/settings.js index 1b7e2477a6..064c598d18 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -105,7 +105,7 @@ Settings.trackers = { }; // API Servers -Settings.apiserver = ''; +Settings.apiServer = ''; // User interface Settings.language = ""; diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index cd7797223b..9d153d2863 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -19,8 +19,8 @@
-

<%= i18n.__("API Server") %>

- +

<%= i18n.__("Custom API Server") %>

+ From f7a2d27a4b91b0359e36c10e2c5083bf8aefccdb Mon Sep 17 00:00:00 2001 From: Ivan Borzenkov Date: Tue, 14 Apr 2020 18:55:41 +0300 Subject: [PATCH 008/777] add support tor and i2p --- package.json | 1 + src/app/butter-provider/generic.js | 26 ++++++++++++++ src/app/butter-provider/movie.js | 17 +-------- src/app/butter-provider/tv.js | 17 +-------- src/app/database.js | 4 +-- src/app/lib/providers/generic.js | 7 ++-- src/app/lib/views/settings_container.js | 6 ++-- src/app/settings.js | 1 + src/app/templates/settings-container.tpl | 15 ++++++-- yarn.lock | 45 ++++++++++++++++++++++-- 10 files changed, 96 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index 9e1300922c..42ee96ab83 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "sanitizer": "0.x.x", "semver": "5.x.x", "send": "0.16.x", + "socks-proxy-agent": "^5.0.0", "subsrt": "^1.0.0", "tar": "4.4.8", "temp": "0.x.x", diff --git a/src/app/butter-provider/generic.js b/src/app/butter-provider/generic.js index 56deb4d042..15ddb8e791 100644 --- a/src/app/butter-provider/generic.js +++ b/src/app/butter-provider/generic.js @@ -1,6 +1,7 @@ var assign = Object.assign || require("es6-object-assign").assign; var memoize = require("memoizee"); var _ = require("lodash"); +const socksProxyAgent = require( 'socks-proxy-agent' ); var processArgs = function(config, args) { var newArgs = {}; @@ -51,6 +52,7 @@ var Provider = function(args) { this.memfetch = memoize(this.fetch.bind(this), memopts); this.fetch = this._fetch.bind(this); + this.proxy = ''; this.detail = memoize( this.detail.bind(this), @@ -122,6 +124,30 @@ Provider.prototype.toString = function(arg) { return JSON.stringify(this); }; +Provider.prototype.buildRequest = function(options, url) { + const match = url.match(/^cloudflare\+(.*):\/\/(.*)/); + if (match) { + options = Object.assign(options, { + uri: `${match[1]}://cloudflare.com/`, + headers: { + Host: match[2], + } + }); + } + options = Object.assign(options, { + headers: { + "User-Agent": + "Mozilla/5.0 (Linux) AppleWebkit/534.30 (KHTML, like Gecko) PT/4.4.0" + } + }); + + if (this.proxy) { + options.agent = socksProxyAgent('socks://' + this.proxy); + } + + return options; +} + Provider.prototype.parseArgs = function(name) { var tokenize = name.split("?"); diff --git a/src/app/butter-provider/movie.js b/src/app/butter-provider/movie.js index 6f3a9a7c99..b298a5ba93 100644 --- a/src/app/butter-provider/movie.js +++ b/src/app/butter-provider/movie.js @@ -50,23 +50,8 @@ class MovieApi extends Generic { }; } - _processCloudFlareHack(options, url) { - const match = url.match(/^cloudflare\+(.*):\/\/(.*)/); - if (match) { - options = Object.assign(options, { - uri: `${match[1]}://cloudflare.com/`, - headers: { - Host: match[2], - "User-Agent": - "Mozilla/5.0 (Linux) AppleWebkit/534.30 (KHTML, like Gecko) PT/3.8.0" - } - }); - } - return options; - } - _get(index, url, qs) { - const req = this._processCloudFlareHack( + const req = this.buildRequest( { url, json: true, diff --git a/src/app/butter-provider/tv.js b/src/app/butter-provider/tv.js index 65008919c7..64b3b197fd 100644 --- a/src/app/butter-provider/tv.js +++ b/src/app/butter-provider/tv.js @@ -26,23 +26,8 @@ class TVApi extends Generic { } } - _processCloudFlareHack(options, url) { - const match = url.match(/^cloudflare\+(.*):\/\/(.*)/); - if (match) { - options = Object.assign(options, { - uri: `${match[1]}://cloudflare.com/`, - headers: { - Host: match[2], - "User-Agent": - "Mozilla/5.0 (Linux) AppleWebkit/534.30 (KHTML, like Gecko) PT/3.8.0" - } - }); - } - return options; - } - _get(index, url, qs) { - const req = this._processCloudFlareHack( + const req = this.buildRequest( { url, json: true, diff --git a/src/app/database.js b/src/app/database.js index 50dc8989dc..7599dc4bab 100644 --- a/src/app/database.js +++ b/src/app/database.js @@ -409,8 +409,8 @@ var Database = { window.__isNewInstall = true; } - if (Settings.apiServer) { - App.Providers.updateUrl(Settings.apiServer); + if (Settings.apiServer || Settings.proxyServer) { + App.Providers.updateConnection(Settings.apiServer, Settings.proxyServer); } App.vent.trigger('initHttpApi'); diff --git a/src/app/lib/providers/generic.js b/src/app/lib/providers/generic.js index 12d3585d5c..c2044435e7 100644 --- a/src/app/lib/providers/generic.js +++ b/src/app/lib/providers/generic.js @@ -6,10 +6,11 @@ App.Providers.Generic = require("butter-provider"); - function updateProviderUrl (url) { + function updateProviderConnection (server, proxy) { for (let provider in cache) { if (cache[provider] && cache[provider].apiURL) { - cache[provider].apiURL = [url,`cloudflare+${url}`]; + cache[provider].apiURL = [server]; + cache[provider].proxy = proxy; } } } @@ -95,7 +96,7 @@ App.Providers.get = getProvider; App.Providers.delete = delProvider; App.Providers.install = installProvider; - App.Providers.updateUrl = updateProviderUrl; + App.Providers.updateConnection = updateProviderConnection; App.Providers.getFromRegistry = getProviderFromRegistry; })(window.App); diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 6b19f02987..03bb734a1e 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -187,6 +187,7 @@ switch (field.attr('name')) { case 'apiServer': + case 'proxyServer': apiServerChanged = true; value = field.val(); break; @@ -284,8 +285,9 @@ // update active session App.settings[field.attr('name')] = value; - if (apiServerChanged && value) { - App.Providers.updateUrl(value); + if (apiServerChanged) { + console.log(App.settings['apiServer'], App.settings['proxyServer']); + App.Providers.updateConnection(App.settings['apiServer'], App.settings['proxyServer']); } if (apiDataChanged) { diff --git a/src/app/settings.js b/src/app/settings.js index 064c598d18..3b5de29151 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -106,6 +106,7 @@ Settings.trackers = { // API Servers Settings.apiServer = ''; +Settings.proxyServer = ''; // User interface Settings.language = ""; diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 9d153d2863..7cb6161ebc 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -15,12 +15,23 @@
From 92e40cb164e2bce0bc70cba9c30609423746d162 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 07:26:05 +0300 Subject: [PATCH 176/777] Replace 'Big picture mode' with 'UI scaling' and 'Poster size' options --- src/app/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/settings.js b/src/app/settings.js index 38d851e8de..3da9c3738f 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -194,7 +194,7 @@ Settings.automaticUpdating = true; Settings.UpdateSeed = false; Settings.events = true; Settings.minimizeToTray = false; -Settings.bigPicture = false; +Settings.bigPicture = 100; // Features Settings.activateTorrentCollection = true; From 308add4cca707655320c26a8a15cdfe6b18bddba Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 07:26:49 +0300 Subject: [PATCH 177/777] Update player UI --- src/app/styl/views/player.styl | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/styl/views/player.styl b/src/app/styl/views/player.styl index fd52b78f88..cb7e8225f5 100644 --- a/src/app/styl/views/player.styl +++ b/src/app/styl/views/player.styl @@ -384,29 +384,30 @@ .vjs-quality-button { color: #fff - right: 15px - top: 8px + right: 35px + top: 19px + font-size: 12px } .vjs-subtitles-button { - top: 12px + top: 24px } .vjs_smallersub_button { &.vjs-control { - top: 13px + top: 24px } } .vjs_biggersub_button { &.vjs-control { - top: 13px + top: 24px } } .player-header-background { position: absolute - background: linear-gradient(#000, transparent) !important + background: linear-gradient(rgba(0,0,0,0.7), transparent) !important width: 100% !important height: 75px !important z-index: 3 From 2deb3272bd351b948805cae9b01b39abd1739dde Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 07:27:24 +0300 Subject: [PATCH 178/777] Update player UI --- src/app/styl/views/videojs.styl | 142 +++++++++++++++++++------------- 1 file changed, 83 insertions(+), 59 deletions(-) diff --git a/src/app/styl/views/videojs.styl b/src/app/styl/views/videojs.styl index d6ee2d0318..a04b4e3b7b 100644 --- a/src/app/styl/views/videojs.styl +++ b/src/app/styl/views/videojs.styl @@ -3,18 +3,26 @@ .vjs-slider { position: relative; cursor: pointer; - background-color: #bababa; + background-color: rgba(255,255,255,0.2); + &:hover { + & > .vjs-slider-handle { + opacity: 1; + } + } } .vjs-slider-handle { position: absolute; - top: -3px; - width: 11px; - height: 11px; + top: -6px; + width: 14px; + height: 14px; + opacity: 0; + transition: all .5s ease, opacity .1s !important; + margin-left: -8px; &:before { - color: white; + color: $PlayerColor; content: '\25CF'; - font-size: 22px; - line-height: 9px; + font-size: 46px; + line-height: 14px; } } @@ -23,12 +31,12 @@ position: absolute; bottom: 0; left: 0; - background-color: rgba(23, 24, 27, 0.75); + background-color: linear-gradient(transparent, rgba(0,0,0,0.7)); } .vjs-control-bar { right: 0; - height: 40px; + height: 60px; width: 100%; } @@ -104,11 +112,11 @@ width: 1px; } .vjs-play-control { - top: 13px; + top: 24px; cursor: pointer; - width: 12px; - height: 14px; - margin-left: 16px; + width: 14px; + height: 16px; + margin-left: 20px; &:hover { transition: all .5s; -webkit-filter: brightness(0.70); @@ -122,8 +130,8 @@ content: "\f04b"; color: white; font-family: "Font Awesome 5 Free"; - font-size: 12px; - line-height: 15px; + font-size: 14px; + line-height: 17px; font-weight: 900; } } @@ -163,16 +171,27 @@ } } .vjs-volume-control { - top: 17px; + top: 24px; width: 54px; float: right; margin-right: 0px; } .vjs-volume-bar { - height: 5px; + top: 5px; + height: 6px; width: 54px; margin-right: 0px; border-radius: 3px / 2px; + &:hover { + top: 4px; + height: 8px; + & > .vjs-volume-level { + height: 8px; + } + & > .vjs-volume-handle:before { + line-height: 15px; + } + } } .vjs-volume-menu-button { .vjs-menu-content { @@ -183,33 +202,37 @@ position: absolute; top: 0; left: 0; - height: 5px; + height: 6px; background-color: $PlayerColor; border-radius: 3px / 2px; border-radius: 3px / 2px; background-clip: padding; background-clip: padding-box; - background-clip: padding-box; } .vjs-volume-handle { &:before { - color: white; + color: $PlayerColor; content: '\25CF'; - font-size: 22px; - line-height: 9px; + font-size: 46px; + line-height: 14px; } } .vjs-progress-control { position: absolute; - top: 17px; + top: 29px; width: auto; height: 6px; border-radius: 3px / 2px; border-radius: 3px / 2px; background-clip: padding-box; background-clip: padding-box; - left: 180px; - right: 230px; + left: 190px; + right: 250px; + transition: all .1s !important; + &:hover { + height: 8px; + top: 28px; + } } &:hover { .vjs-progress-control { @@ -244,7 +267,7 @@ transition: width 2s; animation: progress 2.8s linear infinite; background-repeat: repeat-x; - background-color: $PlayerColor; + background-color: white; opacity: 0.4; } .vjs-seek-handle { @@ -259,8 +282,8 @@ position: relative; color: #fff; font-family: "Open Sans", sans-serif; - font-size: 14px; - top: 13px; + font-size: 16px; + top: 24px; } .vjs-current-time { position: relative; @@ -277,13 +300,13 @@ } .vjs-fullscreen-control { position: relative; - top: 12px; - margin-right: 15px; - margin-left: 15px; + top: 23px; + margin-right: 17px; + margin-left: 17px; cursor: pointer; float: right; - width: 16px; - height: 16px; + width: 18px; + height: 18px; &:hover { transition: all .5s; -webkit-filter: brightness(0.70); @@ -294,10 +317,10 @@ &:before { content: "\f065"; text-shadow: none !important; - font-size: 16px; + font-size: 18px; font-family: "Font Awesome 5 Free"; - height: 16px; - width: 16px; + height: 18px; + width: 18px; color: white; font-weight: 900; } @@ -367,9 +390,9 @@ position: relative; float: right; cursor: pointer; - margin-right: 12px; - height: 16px; - width: 17px; + margin-right: 14px; + height: 18px; + width: 19px; .vjs-menu { .vjs-menu-content { display: block; @@ -450,9 +473,9 @@ position: relative; float: right; cursor: pointer; - margin-right: 12px; - height: 11px; - width: 12px; + margin-right: 14px; + height: 13px; + width: 14px; &:hover { transition: all .5s; -webkit-filter: brightness(0.70); @@ -461,10 +484,10 @@ } } &:before { - height: 11px; - width: 12px; - font-size: 12px; - line-height: 14px; + height: 13px; + width: 14px; + font-size: 14px; + line-height: 16px; content: "A"; color: #fff; } @@ -476,9 +499,9 @@ position: relative; float: right; cursor: pointer; - margin-right: 12px; - height: 11px; - width: 12px; + margin-right: 14px; + height: 13px; + width: 14px; &:hover { transition: all .5s; -webkit-filter: brightness(0.70); @@ -487,10 +510,10 @@ } } &:before { - height: 11px; - width: 12px; - font-size: 16px; - line-height: 12px; + height: 13px; + width: 14px; + font-size: 18px; + line-height: 14px; content: "A"; color: #fff; } @@ -532,12 +555,12 @@ .vjs-popcorn-skin .vjs-mute-control, .vjs-popcorn-skin .vjs-volume-menu-button { - top: 12px; + top: 25px; cursor: pointer; float: right; - height: 14px; - width: 20px; - margin-right: 10px; + height: 16px; + width: 22px; + margin-right: 11px; } .vjs-popcorn-skin .vjs-mute-control:before, @@ -591,11 +614,12 @@ position: relative; color: #fff; font-family: "Open Sans", sans-serif; - font-size: 14px; + font-size: 16px; position: relative; float: left; - margin-left: 3px; + margin-left: 4px; margin-right: 3px; + top: 8px; } .vjs-popcorn-skin:hover .vjs-big-play-button, From b59fedf53aeeec6d488223a5c1388507030241e5 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 07:28:20 +0300 Subject: [PATCH 179/777] Fix undefined poster variable --- src/app/butter-provider/movie.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/butter-provider/movie.js b/src/app/butter-provider/movie.js index bf4af6ee58..1f98ce289c 100644 --- a/src/app/butter-provider/movie.js +++ b/src/app/butter-provider/movie.js @@ -30,10 +30,10 @@ class MovieApi extends Generic { rating: parseInt(movie.rating.percentage, 10) / 10, runtime: movie.runtime, images: movie.images, - image: movie.images.poster, - cover: movie.images.poster, - backdrop: movie.images.fanart, - poster: movie.images.poster, + image: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, + cover: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, + backdrop: movie.images !== null && movie.images !== undefined ? movie.images.fanart : false, + poster: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, synopsis: movie.synopsis, trailer: movie.trailer !== null ? movie.trailer : false, certification: movie.certification, From db044c12042e1c8f68fa55d5f00002af0a4ccad4 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 07:42:32 +0300 Subject: [PATCH 180/777] Replace 'Big picture mode' with 'UI scaling' and 'Poster size' options --- src/app/templates/keyboard.tpl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/app/templates/keyboard.tpl b/src/app/templates/keyboard.tpl index 673d60c283..8ed5b2346e 100644 --- a/src/app/templates/keyboard.tpl +++ b/src/app/templates/keyboard.tpl @@ -64,10 +64,6 @@ <%= i18n.__("ctrl") %>+ALT+F <%= i18n.__("Toggle Fullscreen") %> - - <%= i18n.__("shift") %>+B - <%= i18n.__("Big Picture Mode") %> - <%= i18n.__("ctrl") %>+F <%= i18n.__("Search") %> From 72f50de861e69b1f6a542247d1993bebc66730ba Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Wed, 12 Aug 2020 11:40:02 +0300 Subject: [PATCH 181/777] Update player UI --- src/app/styl/views/videojs.styl | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/app/styl/views/videojs.styl b/src/app/styl/views/videojs.styl index a04b4e3b7b..c6eba4ea30 100644 --- a/src/app/styl/views/videojs.styl +++ b/src/app/styl/views/videojs.styl @@ -5,8 +5,8 @@ cursor: pointer; background-color: rgba(255,255,255,0.2); &:hover { - & > .vjs-slider-handle { - opacity: 1; + & > .vjs-slider-handle:before { + color: $PlayerColor; } } } @@ -15,14 +15,13 @@ top: -6px; width: 14px; height: 14px; - opacity: 0; - transition: all .5s ease, opacity .1s !important; margin-left: -8px; &:before { - color: $PlayerColor; + color: rgba(255,255,255,0); content: '\25CF'; font-size: 46px; line-height: 14px; + transition: all .1s !important; } } @@ -189,7 +188,7 @@ height: 8px; } & > .vjs-volume-handle:before { - line-height: 15px; + font-size: 25px; } } } @@ -213,8 +212,9 @@ &:before { color: $PlayerColor; content: '\25CF'; - font-size: 46px; - line-height: 14px; + font-size: 14px; + line-height: 17px; + margin-left: 10px; } } .vjs-progress-control { From 812c7a4af8f2d0c2c22dc1f042960764979cba2e Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Thu, 13 Aug 2020 09:32:08 +0300 Subject: [PATCH 182/777] Fix undefined poster variable --- src/app/butter-provider/movie.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/butter-provider/movie.js b/src/app/butter-provider/movie.js index 1f98ce289c..85257e63d5 100644 --- a/src/app/butter-provider/movie.js +++ b/src/app/butter-provider/movie.js @@ -30,10 +30,10 @@ class MovieApi extends Generic { rating: parseInt(movie.rating.percentage, 10) / 10, runtime: movie.runtime, images: movie.images, - image: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, - cover: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, - backdrop: movie.images !== null && movie.images !== undefined ? movie.images.fanart : false, - poster: movie.images !== null && movie.images !== undefined ? movie.images.poster : false, + image: movie.images ? movie.images.poster : false, + cover: movie.images ? movie.images.poster : false, + backdrop: movie.images ? movie.images.fanart : false, + poster: movie.images ? movie.images.poster : false, synopsis: movie.synopsis, trailer: movie.trailer !== null ? movie.trailer : false, certification: movie.certification, From 83f927f6ab0c9c82d94aa12c0fd011e9c7fbfd5d Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Thu, 13 Aug 2020 22:32:57 +0300 Subject: [PATCH 183/777] Change the Torrent Collection overlay icon --- src/app/templates/torrent_collection.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/torrent_collection.tpl b/src/app/templates/torrent_collection.tpl index 6c1366436a..c3f24b6d82 100644 --- a/src/app/templates/torrent_collection.tpl +++ b/src/app/templates/torrent_collection.tpl @@ -42,7 +42,7 @@
- +

<%= i18n.__("Drop Magnet or .torrent")%>

From 78e35cd98fa2730ef5789df95159b2c7d95d2e4b Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Thu, 13 Aug 2020 22:34:49 +0300 Subject: [PATCH 184/777] Change the Torrent Collection overlay icon --- src/app/styl/views/torrent_collection.styl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/styl/views/torrent_collection.styl b/src/app/styl/views/torrent_collection.styl index c60ed9f884..29646f7b09 100644 --- a/src/app/styl/views/torrent_collection.styl +++ b/src/app/styl/views/torrent_collection.styl @@ -252,8 +252,8 @@ border-color $ButtonBgActive .notorrents-icon - font-size 140px - padding-top 20px + font-size 120px + padding-top 40px .notorrents-message font-family $MainFontBold From 809e5a7c3be88fabf6a56b02919da68eac69cfd4 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 00:52:04 +0300 Subject: [PATCH 185/777] Change the Torrent Collection icon --- src/app/templates/browser/filter-bar.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/browser/filter-bar.tpl b/src/app/templates/browser/filter-bar.tpl index c95c142ea7..e3124594a7 100644 --- a/src/app/templates/browser/filter-bar.tpl +++ b/src/app/templates/browser/filter-bar.tpl @@ -78,7 +78,7 @@ <% } else { %> From 832a0aaa8f4e3c17037228011ed602e616bd3632 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:38:27 +0300 Subject: [PATCH 186/777] Add optional 'Cache Folder' button in the filterbar --- src/app/templates/browser/filter-bar.tpl | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/app/templates/browser/filter-bar.tpl b/src/app/templates/browser/filter-bar.tpl index e3124594a7..d40e8c5aed 100644 --- a/src/app/templates/browser/filter-bar.tpl +++ b/src/app/templates/browser/filter-bar.tpl @@ -86,6 +86,15 @@ "> + + <% if (Settings.activateTempf) { %> +
  • + <% } else { %> +
  • + <% } %> + "> +
  • +
  • "> From e75d13f5546411becfc2b3e35693670e920cbcd3 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:38:59 +0300 Subject: [PATCH 187/777] Add optional 'Cache Folder' button in the filterbar --- src/app/templates/settings-container.tpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index ddafd40ce0..abfe1aceaf 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -450,6 +450,10 @@ > + + > + + From 66d9746e0156e6f19e9a0c6fdfdf71f52135545b Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:39:26 +0300 Subject: [PATCH 188/777] Add optional 'Cache Folder' button in the filterbar --- src/app/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/settings.js b/src/app/settings.js index 3da9c3738f..0441ad3954 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -199,6 +199,7 @@ Settings.bigPicture = 100; // Features Settings.activateTorrentCollection = true; Settings.activateWatchlist = true; +Settings.activateTempf = true; Settings.onlineSearchEngine = 'ExtraTorrent'; Settings.enableThepiratebaySearch = true; Settings.enable1337xSearch = true; From 1235fd299ecf1c9e6b83a08688a8e57d98a6b059 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:40:03 +0300 Subject: [PATCH 189/777] Add optional 'Cache Folder' button in the filterbar --- src/app/lib/views/settings_container.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index ce4c77b7fe..667abe8f0d 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -254,6 +254,7 @@ case 'minimizeToTray': case 'activateTorrentCollection': case 'activateWatchlist': + case 'activateTempf': case 'opensubtitlesAutoUpload': case 'subtitles_bold': case 'rememberFilters': @@ -397,6 +398,7 @@ } break; case 'activateWatchlist': + case 'activateTempf': App.vent.trigger('movies:list'); App.vent.trigger('settings:show'); break; From c84543668320d5577a5dc705d52b594e26009a27 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 01:41:21 +0300 Subject: [PATCH 190/777] Add optional 'Cache Folder' button in the filterbar --- src/app/lib/views/browser/filter_bar.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/lib/views/browser/filter_bar.js b/src/app/lib/views/browser/filter_bar.js index 64174ab993..a5b3e6e2b1 100644 --- a/src/app/lib/views/browser/filter_bar.js +++ b/src/app/lib/views/browser/filter_bar.js @@ -23,6 +23,7 @@ 'click .genres .dropdown-menu a': 'changeGenre', 'click .types .dropdown-menu a': 'changeType', 'click #filterbar-settings': 'settings', + 'click #filterbar-tempf': 'tempf', 'click #filterbar-about': 'about', 'click #filterbar-vpn': 'vpn', 'click .movieTabShow': 'movieTabShow', @@ -352,6 +353,10 @@ App.vent.trigger('settings:show'); }, + tempf: function (e) { + nw.Shell.openExternal(Settings.tmpLocation); + }, + about: function(e) { App.vent.trigger('about:show'); }, From 8ec3ef5b221108928b3e5361d435dc1e2b41e91d Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 04:16:17 +0300 Subject: [PATCH 191/777] Fix 'Cache Folder' button in loading screen --- src/app/templates/loading.tpl | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/templates/loading.tpl b/src/app/templates/loading.tpl index f0750226dd..364af53870 100644 --- a/src/app/templates/loading.tpl +++ b/src/app/templates/loading.tpl @@ -87,7 +87,9 @@
    <%= i18n.__("Cancel") %>
    - +
    "> +
    +
    From 9cc1bb7f42b3de2bbe814025e33ccb79e7acc9d3 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 04:17:04 +0300 Subject: [PATCH 192/777] Fix 'Cache Folder' button in loading screen --- src/app/lib/views/player/loading.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index 6498bbdfe2..e24367d379 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -1,6 +1,7 @@ (function(App) { 'use strict'; + var ddone = 'false'; var Loading = Marionette.View.extend({ template: '#loading-tpl', className: 'app-overlay', @@ -52,6 +53,7 @@ 'click #cancel-button': 'cancelStreaming', 'click #cancel-button-regular': 'cancelStreaming', 'click #cancel-button-vpn': 'cancelStreamingVPN', + 'click .open-button': 'tempf', 'click .pause': 'pauseStreaming', 'click .stop': 'stopStreaming', 'click .play': 'resumeStreaming', @@ -107,6 +109,7 @@ win.info('Loading torrent'); this.listenTo(this.model, 'change:state', this.onStateUpdate); + ddone = 'false'; }, showVPNLoader: function() { @@ -300,7 +303,7 @@ this.ddone = 'true'; cancelButton.css('background-color', '#27ae60'); - cancelButton.css('left', '-45px'); + cancelButton.css('margin-left', '168px'); if (Settings.activateLoCtrl === false) { $('.open-button').css('visibility', 'visible').css('display', 'block'); } else if (Settings.activateLoCtrl === true) { From 4526181e928982fa4f87185ee807eca814268ac2 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 14 Aug 2020 04:21:18 +0300 Subject: [PATCH 193/777] Fix 'Cache Folder' button in loading screen --- src/app/styl/views/loading.styl | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/app/styl/views/loading.styl b/src/app/styl/views/loading.styl index 127d945d42..92b1d013c1 100644 --- a/src/app/styl/views/loading.styl +++ b/src/app/styl/views/loading.styl @@ -185,6 +185,41 @@ top 12px font-size 12px + .open-button + visibility hidden + z-index 2 + cursor pointer + width 35px + height 35px + margin -35px auto auto 297px + -moz-border-radius 3px + -webkit-border-radius 3px + border-radius 3px + -moz-background-clip padding + -webkit-background-clip padding-box + background-clip padding-box + background-color #27ae60 + -webkit-backface-visibility hidden + transition all .5s + + &:hover + background: #27ae60 + text-decoration: none + + &:active + box-shadow: inset 0 1px 4px rgba(0,0,0,0.6) + background: #27ae60 + + .open-button-text + -webkit-backface-visibility hidden + position relative + color #fff + font-family $MainFont, $Font, $AlternateFont + -webkit-font-smoothing antialiased + text-align center + top 12px + font-size 12px + .loading-info width auto height auto From a553d20f5e2a5b4540de9c7b0f64e836d3f05c0a Mon Sep 17 00:00:00 2001 From: pcenta Date: Fri, 14 Aug 2020 19:13:05 +0200 Subject: [PATCH 194/777] Font Awesome 5.14.0 --- package.json | 2 +- src/app/index.html | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 629cc05cec..b86c6189e5 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "butter-provider/tv.js" ], "dependencies": { - "@fortawesome/fontawesome-free": "^5.12.1", + "@fortawesome/fontawesome-free": "^5.14.0", "@vpnht/sdk": "^1.0.10", "adm-zip": "0.4.13", "airplayer": "2.0.0", diff --git a/src/app/index.html b/src/app/index.html index ed010c6346..d49c2a01f8 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -5,7 +5,6 @@ - From b0bcc9256bba971b54fbf10158ff8a2d37af3011 Mon Sep 17 00:00:00 2001 From: pcenta Date: Fri, 14 Aug 2020 19:14:24 +0200 Subject: [PATCH 195/777] Bootstrap 3.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b86c6189e5..52bb36a371 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "backbone.marionette": "~3.x.x", "backbone.radio": "^2.0.0", "backbone.wreqr": "^1.4.0", - "bootstrap": "~3.3.7", + "bootstrap": "^3.4.1", "butter-provider": "0.11.0", "butter-sanitize": "^0.1.1", "butter-settings-popcorntime.io": "0.0.4", From f4e9b4e22b16cd92224f647907dda4b8669adefe Mon Sep 17 00:00:00 2001 From: pcenta Date: Fri, 14 Aug 2020 19:14:43 +0200 Subject: [PATCH 196/777] JQuery 3.5.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52bb36a371..03f068ed74 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "gitlab": "1.4.1", "i18n": "0.x.x", "iconv-lite": "0.x.x", - "jquery": "^3.3.1", + "jquery": "^3.5.1", "jschardet": "1.6.0", "json-rpc2": "1.x.x", "lodash": "^4.17.15", From bffc2d7a00b97c466a84ff8612015bce8c9a7e6b Mon Sep 17 00:00:00 2001 From: pcenta Date: Fri, 14 Aug 2020 19:27:04 +0200 Subject: [PATCH 197/777] Remove broken in app issue reporting functionality --- package.json | 3 - src/app/index.html | 2 - src/app/lib/views/issue.js | 271 ---------------------------------- src/app/styl/views/issue.styl | 208 -------------------------- src/app/templates/help.tpl | 6 +- src/app/templates/issue.tpl | 70 --------- 6 files changed, 1 insertion(+), 559 deletions(-) delete mode 100644 src/app/lib/views/issue.js delete mode 100644 src/app/styl/views/issue.styl delete mode 100644 src/app/templates/issue.tpl diff --git a/package.json b/package.json index 629cc05cec..429edb10f2 100644 --- a/package.json +++ b/package.json @@ -60,14 +60,12 @@ "dlnacasts2": "0.2.0", "es6-object-assign": "^1.0.1", "flag-icon-css": "^3.5.0", - "gitlab": "1.4.1", "i18n": "0.x.x", "iconv-lite": "0.x.x", "jquery": "^3.3.1", "jschardet": "1.6.0", "json-rpc2": "1.x.x", "lodash": "^4.17.15", - "markdown": "0.5.x", "memoizee": "0.x.x", "mkdirp": "*", "moment": ">=2.22.2", @@ -77,7 +75,6 @@ "node-captions": "0.4.6", "node-tvdb": "^4.1.0", "opensubtitles-api": "5.0.0", - "os-name": "3.0.0", "q": "2.0.3", "querystring": "^0.2.0", "readdirp": "*", diff --git a/src/app/index.html b/src/app/index.html index ed010c6346..d200e6f493 100644 --- a/src/app/index.html +++ b/src/app/index.html @@ -37,7 +37,6 @@ - @@ -125,7 +124,6 @@ - diff --git a/src/app/lib/views/issue.js b/src/app/lib/views/issue.js deleted file mode 100644 index 16997728d8..0000000000 --- a/src/app/lib/views/issue.js +++ /dev/null @@ -1,271 +0,0 @@ -(function (App) { - 'use strict'; - - var BT_id = 13, //ID of project (got with gitlab.projects.all). 13 is for 'butterproject/butter' - BT_url = Settings.issuesUrl, //Url of 'issues' of the above project - token; - - var Issue = Marionette.View.extend({ - template: '#issue-tpl', - className: 'issue', - - ui: { - success_alert: '.success_alert' - }, - - events: { - 'click .close-icon': 'closeIssue', - 'click .submit-issue': 'submitIssue', - 'click .search-issue': 'searchIssue', - 'click .issue-title': 'showIssueDetails', - 'click .found-issue': 'closeIssue', - 'click .notfound-issue': 'newIssue', - //'click .anonymous-issue': 'anonIssue', - 'click .login-issue': 'login' - }, - - onAttach: function () { - if (AdvSettings.get('gitlabPassword') && AdvSettings.get('gitlabMail')) { - $('#issue-email').val(AdvSettings.get('gitlabMail')), - $('#issue-pw').val(AdvSettings.get('gitlabPassword')); - } - - $('#issue-content').on('keyup', function (e) { - var userInput = document.getElementById('issue-content').value.replace(/(\w|\W)\1{3}/igm, '').length; - if (userInput > 200) { - $('#issue-length').hide(); - } else { - $('#issue-length').show().text('(' + userInput + '/200)'); - } - }); - - Mousetrap.bind(['esc', 'backspace'], function (e) { - App.vent.trigger('issue:close'); - }); - Mousetrap(document.getElementById('issue-pw')).bind(['enter'], function (e, combo) { - $('.login-issue').click(); - }); - Mousetrap(document.getElementById('issue-email')).bind(['enter'], function (e, combo) { - $('.login-issue').click(); - }); - Mousetrap(document.getElementById('issue-search-field')).bind(['enter'], function (e, combo) { - $('.search-issue').click(); - }); - }, - - searchGitLab: function (keyword) { - - var gitlab = require('gitlab')({ - url: Settings.sourceUrl, - token: token || 'sb1SeWoyoAWrGPTuQcNE' //public reporter token - }); - var issue_desc, - result, - results = []; - - gitlab.projects.issues.list(BT_id, { - state: 'opened' - }, function (data) { - data = Common.sanitize(data); - //stores in 'results' all issues (id + title) containing the keyword - data.forEach(function (item) { - issue_desc = - item.description.toLowerCase() + ' ' + item.title.toLowerCase(); - - result = issue_desc.search(keyword.toLowerCase()); - if (result !== -1) { - results.push({ - id: item.iid, - title: item.title, - description: item.description, - labels: item.labels - }); - return; - } else { - return; - } - }); - - //interpret results - if (results.length === 0) { - $('.search-issue').removeClass('fa-spinner fa-spin').addClass('fa-search'); - $('#issue-results').append('

    ' + i18n.__('No issues found...') + '

    '); - $('#issue-search .button.notfound-issue').show(); - } else { - $('.search-issue').removeClass('fa-spinner fa-spin').addClass('fa-search'); - var newLine = function (id, title, description, labels) { - $('#issue-results').append( - '
  • ' + '' + title + '' + ' #' + id + ' - ' + labels + '' + '
    ' + '

    ' + description + '

    ' + '' + i18n.__('Open in your browser') + '' + '
    ' + '
  • ' - ); - }; - for (var i = 0; i < results.length; i++) { - results[i].description = require('markdown').markdown.toHTML(results[i].description).replace(/|<\/em>/g, '_'); - results[i].labels = results[i].labels.length !== 0 ? results[i].labels.join(', ') : 'Uncategorized'; - newLine(results[i].id, results[i].title, results[i].description, results[i].labels); - } - $('#issue-search .button').show(); - } - - }); - - }, - - showIssueDetails: function (e) { - var elm = e.currentTarget.parentElement.children[2]; - var visible = $(elm).css('display'); - - if (visible === 'none') { - $(elm).show(); - } else { - $(elm).hide(); - } - }, - - getLogs: function () { - if (fs.existsSync(path.join(data_path, 'logs.txt'))) { - return '\n\n---' + '\n\n**Error log:**' + '\n\n```' + fs.readFileSync(path.join(data_path, 'logs.txt'), 'utf-8') + '\n\n```'; - } else { - return false; - } - }, - - getSpecs: function () { - var release = require('os-name')(os.platform(), os.release()); - - var cpu = os.cpus(); - cpu = cpu[0].model; - - var ram = Math.round(os.totalmem() / (1000 * 1000 * 1000)) + 'GB'; - - return '\n\n---' + '\n\n**Environment:**' + '\n\n' + Settings.projectName + ' version: ' + Settings.version + ' ' + App.git.commit.slice(0, 8) + '\n\nOS: ' + release + '\n\nCPU Model: ' + cpu + '\n\nAvailable Memory: ' + ram; - - }, - - reportBug: function (title, content, token) { - var that = this; - if (this.isReporting) { - return; - } - this.isReporting = true; - - var gitlab = require('gitlab')({ - url: Settings.projectUrl, - token: token //Private token - }); - var issue_id = false; - - content += this.getSpecs(); //add OS, version, etc. - - if (this.getLogs()) { - content += this.getLogs(); //add error logs - } - - gitlab.issues.create( - BT_id, { - title: title, - description: content, - labels: 'In-App Reporter' - }, - function (callback) { - callback = Common.sanitize(callback); - issue_id = BT_url + callback.iid; - - win.debug('Issue created:', issue_id); - - document.getElementById('issue-url').href = issue_id; - $('#issue-url').text(issue_id); - - $('#issue-form').hide(); - $('#issue-success').show(); - that.isReporting = false; - - } - ); - }, - - login: function () { - var that = this; - $('#issue-auth .issue-loading-icon').show(); - this.getToken(function (data) { - if (data) { - token = data; - win.debug('GitLab API: auth success'); - AdvSettings.set('gitlabMail', $('#issue-email').val()); - AdvSettings.set('gitlabPassword', $('#issue-pw').val()); - $('#issue-auth .issue-loading-icon').hide(); - that.anonIssue(); - } else { - $('#issue-auth .issue-loading-icon').hide(); - $('.notification_alert').show().text(i18n.__('Invalid credentials')).delay(2500).fadeOut(400); - } - }); - }, - - getToken: function (callback) { - var email = $('#issue-email').val(), - password = $('#issue-pw').val(); - - var gitlab = require('gitlab')({ - url: Settings.projectUrl, - token: 'sb1SeWoyoAWrGPTuQcNE' //public reporter token - }); - - gitlab.users.session(email, password, function (response) { - callback(response.private_token); - }); - }, - - submitIssue: function () { - var title = $('#issue-title').val(); - var content = $('#issue-content').val(); - - if (!title || !content) { - $('.notification_alert').show().text(i18n.__('Fields cannot be empty')).delay(2500).fadeOut(400); - return; - } - if (content.replace(/(\w|\W)\1{3}/igm, '').length < 200) { - $('.notification_alert').show().text(i18n.__('200 characters minimum')).delay(2500).fadeOut(400); - return; - } - - this.reportBug(title, content, (token || 'sb1SeWoyoAWrGPTuQcNE')); - }, - - searchIssue: function () { - var searchIssue = $('.search-issue'); - searchIssue.removeClass('fa-search').addClass('fa-spinner fa-spin'); - document.getElementById('issue-results').innerHTML = ''; //clear - - var keyword = $('#issue-search-field').val().replace(/\W/g, ' ').replace(/\s\s+/g, ' '); - - if (!keyword) { - $('.notification_alert').show().text(i18n.__('Fields cannot be empty')).delay(2500).fadeOut(400); - searchIssue.removeClass('fa-spinner fa-spin').addClass('fa-search'); - return; - } - this.searchGitLab(keyword); - }, - - newIssue: function () { - $('#issue-search').hide(); - $('#issue-form').show(); - }, - - anonIssue: function () { - $('#issue-auth').hide(); - $('#issue-search').show(); - }, - - onBeforeDestroy: function () { - Mousetrap.unbind(['esc', 'backspace']); - }, - - closeIssue: function () { - App.vent.trigger('issue:close'); - } - - }); - - App.View.Issue = Issue; - -})(window.App); diff --git a/src/app/styl/views/issue.styl b/src/app/styl/views/issue.styl deleted file mode 100644 index 8376b5456a..0000000000 --- a/src/app/styl/views/issue.styl +++ /dev/null @@ -1,208 +0,0 @@ -.issue-container - z-index 15 - height 100% - width 100% - position fixed - -webkit-user-select none - opacity 1 - - .overlay-content - height 100% - width 100% - position absolute - background $BgColor1 - opacity 0.95 - z-index -1 - - h1 - font-family $AlternateFont - font-weight bold - font-size 20px - - & + hr - margin-top: 10px - margin-bottom: 10px - - - .content - height: 95% - margin 0 auto - margin-top 60px - width 80% - max-width 900px - color $Text1 - font-family $AlternateFont - font-size 15px - - .issue-outer - scrollable() - height: calc(100% - 100px); - padding-right 10px - text-align justify - - .report-info - margin-bottom 15px - font-weight bold - - a - font-size 11px - margin-left 6px - - #issue-auth - display block - - input - margin-bottom 5px - padding-right 5px - line-height 16px - - p - font-size 13px - padding 5px - margin-top 70px - - .note - font-size 11px !important - margin-left 5px - &:before - content: '- ' - - .issue-loading-icon - display none - color #BBB - margin-left 5px - - #issue-search - display none - - .search-issue - margin-left 5px - cursor pointer - - #issue-results - text-align left - - small - font-size 85% - opacity .6 - - img - width 100% - - ul, ol - padding-left 20px - li - font-size inherit - line-height initial - list-style initial - margin-bottom 6px - - .issue-title - cursor pointer - - .issue-details - display none - padding 10px - margin 5px 0px 15px 15px - width 80% - background rgba($Text1, .1) - font-size 12px - - p - font-size 12px - color rgba($Text1,.9); - - .button - display none - - #issue-form - display none - - #issue-length - font-size .9em - margin-left 10px - - #issue-success - display none - - .button - position relative - margin-top 13px - float left - padding-left 10px - padding-right 10px - margin-right 20px - border-radius $ButtonRadius - height 35px - background-color $ButtonBg - text-align center - color $SettingsButtonText - font-family $ButtonFont, $AlternateFont - font-size 12px - line-height 34px - cursor pointer - transition background-color .5s - - &:hover - background: $ButtonBgHover - text-decoration: none - - &:active - box-shadow: inset 0 1px 4px rgba(0,0,0,0.6) - background: $ButtonBgActive - - input[type="text"], input[type="password"], textarea - margin-top 10px - margin-bottom 20px - border 0 !important - line-height 16px - background-color $InputBoxBg - resize none - color $InputBoxText - font-family $Font, $AlternateFont - font-size 13px - padding-left 10px - cursor text - outline 0 !important - - input[type="text"], input[type="password"] - height 30px - - textarea - height 35vh - scrollable(); - - h2 - font-family $AlternateFont - font-weight bold - font-size 16px - line-height 22px - color $Text1 - margin-top 10px - - &.top - margin-top 5px - - p - font-family $AlternateFont - font-size 15px - line-height 20px - color $Text1 - - li - margin-top 6px - line-height 18px - font-size 14px - font-family $AlternateFont - - b - font-family $AlternateFont - font-weight: bold - - .code - font-family monospace - font-size 13px - - em - font-size .7em - font-weight 400 diff --git a/src/app/templates/help.tpl b/src/app/templates/help.tpl index 005c08aaa1..0435c29044 100644 --- a/src/app/templates/help.tpl +++ b/src/app/templates/help.tpl @@ -38,12 +38,8 @@

    <%= i18n.__("I found a bug, how do I report it?") %>

    <%= i18n.__("Warning: Always use English when contacting us, or we might not understand you.") %>

    - A) <%= i18n.__("First method") %>
    -
    <%= i18n.__("Use the in-app reporter") %>
    - <%= i18n.__("You can find it later on the About page") %> -

    - B) <%= i18n.__("Second method") %>
    +
    <%= i18n.__('You can create an account on our GitHub repository, and click on "Issues".', Settings.issuesUrl) %>

  • <%= i18n.__("Use the %s issue filter to search and check if the issue has already been reported or is already fixed.", 'GitHub') %>
  • <%= i18n.__("Include a screenshot if relevant - Is your issue about a design feature or a bug?") %>
  • diff --git a/src/app/templates/issue.tpl b/src/app/templates/issue.tpl deleted file mode 100644 index ffcaba1541..0000000000 --- a/src/app/templates/issue.tpl +++ /dev/null @@ -1,70 +0,0 @@ -
    -
    -
    -
    -

    <%= i18n.__("Report an issue") %>

    -
    - -
    - -
    -
    - <%= i18n.__("Log in into your GitLab account") %> - <%= i18n.__("Create Account") %> -
    - -
    - -
    - - - -
    - - - -
    -
    -

    <%= i18n.__("Step 2: Report a new issue") %>

    - <%= i18n.__("Note: please don't use this form to contact us. It is limited to bug reports only.") %>
    - <%= i18n.__("Warning: Always use English when contacting us, or we might not understand you.") %> -
    - -

    <%= i18n.__("Title") %>

    - - -

    <%= i18n.__("Description") %>

    -

    <%= i18n.__("200 characters minimum") %> (0/200)

    - - -
    <%= i18n.__("Submit") %>
    -
    - -
    -
    - <%= i18n.__("Step 3: Thank you !") %> -
    - -

    <%= i18n.__("Success") %>

    -

    <%= i18n.__("Your issue has been reported.") %>

    -

    -
    -
    -
    -
    From 183a0db8dc90e447a12012da9aa16ac8226fddfa Mon Sep 17 00:00:00 2001 From: pcenta Date: Sat, 15 Aug 2020 17:57:29 +0200 Subject: [PATCH 198/777] Removed unused 'subsrt' and 'temp' dependencies --- package.json | 2 -- src/app/lib/device/dlna.js | 1 - 2 files changed, 3 deletions(-) diff --git a/package.json b/package.json index 03f068ed74..68269c4292 100644 --- a/package.json +++ b/package.json @@ -87,9 +87,7 @@ "semver": "5.x.x", "send": "0.16.x", "socks-proxy-agent": "^5.0.0", - "subsrt": "^1.0.0", "tar": "4.4.8", - "temp": "0.x.x", "torrentcollection2": "0.0.9", "trakt.tv": "7.x.x", "trakt.tv-images": "5.x.x", diff --git a/src/app/lib/device/dlna.js b/src/app/lib/device/dlna.js index 486c15cc9d..76e125170f 100644 --- a/src/app/lib/device/dlna.js +++ b/src/app/lib/device/dlna.js @@ -1,7 +1,6 @@ (function(App) { 'use strict'; var dlnacasts = require('dlnacasts2')(); - var xmlb = require('xmlbuilder'); var collection = App.Device.Collection; From 93ebbd293ac30d664d826d5ac61afe74b02be9d6 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 12:09:42 +0300 Subject: [PATCH 199/777] Player UI fix --- src/app/lib/views/player/player.js | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/app/lib/views/player/player.js b/src/app/lib/views/player/player.js index 8986a2d64c..04c7e8d3ca 100644 --- a/src/app/lib/views/player/player.js +++ b/src/app/lib/views/player/player.js @@ -12,8 +12,8 @@ uploadSpeed: '.upload_speed_player', activePeers: '.active_peers_player', downloaded: '.downloaded_player', - pause: 'fas .fa-pause', - play: 'fas .fa-play' + pause: '.fa-pause', + play: '.fa-play' }, events: { @@ -304,10 +304,10 @@ this.firstPlay = false; return; } - this.ui.pause.hide().dequeue(); + this.ui.pause.hide().dequeue().css('transform', 'scale(1)'); this.ui.play.appendTo('div#video_player'); - this.ui.play.show().delay(1500).queue(function () { - this.ui.play.hide().dequeue(); + this.ui.play.show().delay(50).queue(function () { + this.ui.play.css('transform', 'scale(1.8)').fadeOut(400).dequeue(); }.bind(this)); App.vent.trigger('player:play'); } @@ -320,10 +320,10 @@ this.wasSeek = true; } else { this.wasSeek = false; - this.ui.play.hide().dequeue(); + this.ui.play.hide().dequeue().css('transform', 'scale(1)'); this.ui.pause.appendTo('div#video_player'); - this.ui.pause.show().delay(1500).queue(function () { - this.ui.pause.hide().dequeue(); + this.ui.pause.show().delay(50).queue(function () { + this.ui.pause.css('transform', 'scale(1.8)').fadeOut(400).dequeue(); }.bind(this)); App.vent.trigger('player:pause'); this.sendToTrakt('pause'); @@ -374,7 +374,7 @@ var that = this; // Double Click to toggle Fullscreen - $('#video_player').dblclick(function (event) { + $('#video_player, .state-info-player').dblclick(function (event) { that.toggleFullscreen(); // Stop any mouseup events pausing video event.preventDefault(); @@ -901,6 +901,7 @@ var v = this.player.volume(); this.player.volume(v + i); App.vent.trigger('volumechange'); + $('.vjs-overlay').css('opacity', '1'); }, toggleMute: function () { @@ -930,6 +931,7 @@ if (this.customSubtitles) { this.customSubtitles.modified = true; } + $('.vjs-overlay').css('opacity', '1'); }, adjustPlaybackRate: function (rate, delta) { @@ -942,6 +944,7 @@ this.displayOverlayMsg(i18n.__('Playback rate') + ': ' + parseFloat(nRate.toFixed(1)) + 'x'); } } + $('.vjs-overlay').css('opacity', '1'); }, displayOverlayMsg: function (message) { @@ -954,14 +957,14 @@ $('.vjs-overlay').fadeOut('normal', function () { $(this).remove(); }); - }, 3000)); + }, 1200)); } else { $(this.player.el()).append('
    ' + message + '
    '); $.data(this, 'overlayTimer', setTimeout(function () { $('.vjs-overlay').fadeOut('normal', function () { $(this).remove(); }); - }, 3000)); + }, 1200)); } }, From f7f95e263dadb07337e4d92e1596e153ace5c0c5 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 12:10:09 +0300 Subject: [PATCH 200/777] Player UI fix --- src/app/styl/views/player.styl | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/app/styl/views/player.styl b/src/app/styl/views/player.styl index cb7e8225f5..41a1dc737b 100644 --- a/src/app/styl/views/player.styl +++ b/src/app/styl/views/player.styl @@ -48,12 +48,13 @@ } .state-info-player { position: absolute - right: 60px - top: 80px + right: 90px + top: 120px font-size 50px - color: rgba(255,255,255,.9) + color: rgba(255,255,255,.3) z-index: 23 display: none + transition: all .4s ease-out } .eye-info-player { position: absolute @@ -74,12 +75,12 @@ .details-info-player { display: none width: auto - background: rgba(31,31,31,0.74) - padding: 10px + background: rgba(31,31,31,0.7) + padding: 12px 20px top: 32px position: absolute right: 45px - border-radius: 2px + border-radius: 5px span { position relative @@ -108,7 +109,7 @@ height: 0 border-left: 6px solid rgba(0,0,0,0) border-right: 6px solid rgba(0,0,0,0) - border-bottom: 6px solid rgba(31,31,31,0.74) + border-bottom: 6px solid rgba(31,31,31,0.7) top: -6px right: 15px position: absolute @@ -407,7 +408,7 @@ .player-header-background { position: absolute - background: linear-gradient(rgba(0,0,0,0.7), transparent) !important + background: linear-gradient(rgba(0,0,0,0.7), transparent 95%, transparent) !important width: 100% !important height: 75px !important z-index: 3 @@ -417,16 +418,18 @@ .vjs-overlay, .vjs-overlay.vjs-overlay-top-left { position: absolute - width: 33% - font-size: 14px - background-color: transparent + width: auto + font-size: 16px + background-color: rgba(0,0,0,0.24) color: #fff font-family: "Open Sans Semibold" font-smoothing: antialiased - padding: 10px + padding: 14px border-radius: 3px - top: 65px - left: 5px + top: 80px + right: 30px + text-align: right + opacity: 0 } .vjs-overlay { From 295acdf3f0faef31d426a29c3dd9d89300b5acb6 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 12:10:26 +0300 Subject: [PATCH 201/777] Player UI fix --- src/app/styl/views/videojs.styl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/styl/views/videojs.styl b/src/app/styl/views/videojs.styl index c6eba4ea30..8bd9bcb632 100644 --- a/src/app/styl/views/videojs.styl +++ b/src/app/styl/views/videojs.styl @@ -30,7 +30,7 @@ position: absolute; bottom: 0; left: 0; - background-color: linear-gradient(transparent, rgba(0,0,0,0.7)); + background: linear-gradient(transparent, rgba(0,0,0,0.7)); } .vjs-control-bar { @@ -826,7 +826,7 @@ body { display: block; opacity: .8; padding: 5px; - font-size: 10px; + font-size: 11px; position: absolute; z-index: 100000; } @@ -846,7 +846,7 @@ body { border-radius: 3px; border-radius: 3px; padding: 5px 8px 4px; - background-color: #000; + background-color: rgba(0,0,0,0.9); color: #fff; max-width: 200px; text-align: center; From 6117affa6155b16b12c3b36d3647ab3b7e82b98d Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 12:10:57 +0300 Subject: [PATCH 202/777] Subtitle scaling fix --- src/app/vendor/videojshooks.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/app/vendor/videojshooks.js b/src/app/vendor/videojshooks.js index 9148b48d75..656f1d8e13 100644 --- a/src/app/vendor/videojshooks.js +++ b/src/app/vendor/videojshooks.js @@ -86,11 +86,12 @@ vjs.TextTrack.prototype.load = function () { this.readyState_ = 1; var subsParams = function () { - var subtitles = $('.vjs-subtitles'); - var vjsTextTrack = $('.vjs-text-track'); + var subtitles = $('.vjs-subtitles'), + vjsTextTrack = $('.vjs-text-track'), + vjsTextTrackDsp = $('.vjs-text-track-display'); vjsTextTrack.css('display', 'inline-block').drags(); - vjsTextTrack.css('font-size', Settings.subtitle_size); + vjsTextTrackDsp.css('font-size', Settings.subtitle_size); if (win.isFullscreen) { vjsTextTrack.css('font-size', '140%'); } @@ -438,6 +439,9 @@ vjs.Player.prototype.volume = function (percentAsDecimal) { this.cache_.volume = vol; this.techCall('setVolume', vol); vjs.setLocalStorage('volume', vol); + if ($('.vjs-overlay')) { + $('.vjs-overlay').css('opacity', '1'); + } //let's save this bad boy AdvSettings.set('playerVolume', vol.toFixed(1)); From df9380ef8cdec86de4496576972cd18e5e4d5d43 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 12:11:51 +0300 Subject: [PATCH 203/777] Indent and spacing --- src/app/lib/views/player/loading.js | 207 ++++++++++++++-------------- 1 file changed, 102 insertions(+), 105 deletions(-) diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index e24367d379..34d8728312 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -107,9 +107,7 @@ this.ddone = 'false'; win.info('Loading torrent'); - this.listenTo(this.model, 'change:state', this.onStateUpdate); - ddone = 'false'; }, showVPNLoader: function() { @@ -149,36 +147,36 @@ unbindKeyboardShortcuts: function() { Mousetrap.unbind(['esc', 'backspace']); }, + minDetails: function () { var loading = $('.loading'); var loadingBackground = $('.loading-background'); var minimizeIcon = $('.minimize-icon'); var maximizeIcon = $('.maximize-icon'); - - if (minimizeIcon.css('visibility') === 'visible') { - loading.css('height', '0px'); - loading.css('width', '0px'); - loading.css('float', 'right'); - loadingBackground.css('visibility', 'hidden'); - minimizeIcon.css('visibility', 'hidden'); - if (this.ddone === 'false') { - maximizeIcon.css('visibility', 'visible'); - } else { - maximizeIcon.css('visibility', 'visible'); + if (minimizeIcon.css('visibility') === 'visible') { + loading.css('height', '0px'); + loading.css('width', '0px'); + loading.css('float', 'right'); + loadingBackground.css('visibility', 'hidden'); + minimizeIcon.css('visibility', 'hidden'); + if (this.ddone === 'false') { + maximizeIcon.css('visibility', 'visible'); + } else { + maximizeIcon.css('visibility', 'visible'); + } + $('.filter-bar').show(); + } else if ((maximizeIcon.css('visibility') === 'visible') || (maximizeIcon.css('visibility') === 'visible')) { + loading.css('height', '100%'); + loading.css('width', '100%'); + loading.css('float', ''); + loadingBackground.css('visibility', 'visible'); + maximizeIcon.css('visibility', 'hidden'); + maximizeIcon.css('visibility', 'hidden'); + minimizeIcon.css('visibility', 'visible'); + $('.filter-bar').hide(); } - $('.filter-bar').show(); - } else if ((maximizeIcon.css('visibility') === 'visible') || (maximizeIcon.css('visibility') === 'visible')) { - loading.css('height', '100%'); - loading.css('width', '100%'); - loading.css('float', ''); - loadingBackground.css('visibility', 'visible'); - maximizeIcon.css('visibility', 'hidden'); - maximizeIcon.css('visibility', 'hidden'); - minimizeIcon.css('visibility', 'visible'); - $('.filter-bar').hide(); - } else { - } -}, + }, + onAttach: function() { $('.filter-bar').hide(); $('#header').addClass('header-shadow'); @@ -265,29 +263,26 @@ if (streamInfo.get('title') !== '') { this.ui.title.html(streamInfo.get('title')); } - if ( - streamInfo.get('player') && - streamInfo.get('player').get('type') !== 'local' - ) { + if (streamInfo.get('player') && streamInfo.get('player').get('type') !== 'local') { this.ui.player.text(streamInfo.get('player').get('name')); this.ui.streaming.css('visibility', 'visible'); } }, onProgressUpdate: function () { - var streamInfo = this.model.get('streamInfo'); + var streamInfo = this.model.get('streamInfo'); - var downloaded = streamInfo.get('downloaded') / (1024 * 1024); - this.ui.progressTextDownload.text(downloaded.toFixed(2) + ' Mb'); + var downloaded = streamInfo.get('downloaded') / (1024 * 1024); + this.ui.progressTextDownload.text(downloaded.toFixed(2) + ' Mb'); - if (streamInfo.get('downloaded') < streamInfo.get('size')) { + if (streamInfo.get('downloaded') < streamInfo.get('size')) { this.ui.stateTextDownload.text(i18n.__('Downloading')); this.ui.stateTextDownloadedFormatted.text(Common.fileSize(streamInfo.get('downloaded')) + ' / '); this.ui.progressTextPeers.text(streamInfo.get('active_peers')); this.ui.progressTextSeeds.text(streamInfo.get('total_peers')); this.ui.downloadSpeed.text(streamInfo.get('downloadSpeed')); this.ui.stateTextRemaining.text(this.remainingTime()); - } else { + } else { this.ui.stateTextDownload.text(i18n.__('Downloaded')); this.ui.stateTextDownloadedFormatted.hide(); this.ui.progressTextPeers.hide(); @@ -298,34 +293,34 @@ $('#rdownl').hide(); $('#ractpr').hide(); if (this.ddone === 'false') { - var cancelButton = $('.cancel-button'); - var maximizeIcon = $('.maximize-icon'); - - this.ddone = 'true'; - cancelButton.css('background-color', '#27ae60'); - cancelButton.css('margin-left', '168px'); - if (Settings.activateLoCtrl === false) { - $('.open-button').css('visibility', 'visible').css('display', 'block'); - } else if (Settings.activateLoCtrl === true) { - $('.open-button').css('visibility', 'visible').css('display', 'none'); - } - if (maximizeIcon.css('visibility') === 'visible') { - maximizeIcon.css('visibility', 'visible'); - maximizeIcon.css('visibility', 'hidden'); - } - this.listenTo(this.model.get('streamInfo'), 'change:uploadSpeed', this.onProgressUpdate); + var cancelButton = $('.cancel-button'); + var maximizeIcon = $('.maximize-icon'); + + this.ddone = 'true'; + cancelButton.css('background-color', '#27ae60'); + cancelButton.css('margin-left', '168px'); + if (Settings.activateLoCtrl === false) { + $('.open-button').css('visibility', 'visible').css('display', 'block'); + } else if (Settings.activateLoCtrl === true) { + $('.open-button').css('visibility', 'visible').css('display', 'none'); + } + if (maximizeIcon.css('visibility') === 'visible') { + maximizeIcon.css('visibility', 'visible'); + maximizeIcon.css('visibility', 'hidden'); + } + this.listenTo(this.model.get('streamInfo'), 'change:uploadSpeed', this.onProgressUpdate); } - } + } - this.ui.bufferPercent.text(streamInfo.get('downloadedPercent').toFixed() + '%'); - this.ui.uploadSpeed.text(streamInfo.get('uploadSpeed')); + this.ui.bufferPercent.text(streamInfo.get('downloadedPercent').toFixed() + '%'); + this.ui.uploadSpeed.text(streamInfo.get('uploadSpeed')); - this.ui.loadingInfos.show(); + this.ui.loadingInfos.show(); - if (this.model.get('state') === 'playingExternally') { + if (this.model.get('state') === 'playingExternally') { this.ui.bufferPercent.text(streamInfo.get('downloadedPercent').toFixed() + '%'); - } -}, + } + }, onDeviceStatus: function(status) { if (status.media !== undefined && status.media.duration !== undefined) { @@ -374,75 +369,77 @@ }, showpcontrols: function (e) { - if (Settings.activateLoCtrl === false) { - AdvSettings.set('activateLoCtrl', true); - $('.show-pcontrols').removeClass('fa-angle-down').addClass('fa-angle-up').tooltip('hide').attr('data-original-title', i18n.__('Hide playback controls')); - this.ui.cancel_button.css('display', 'none'); - $('.open-button').css('display', 'none'); - this.ui.controls.css('display', 'block'); - this.ui.playingbarBox.css('display', 'block'); - } else if (Settings.activateLoCtrl === true) { - AdvSettings.set('activateLoCtrl', false); - $('.show-pcontrols').removeClass('fa-angle-up').addClass('fa-angle-down').tooltip('hide').attr('data-original-title', i18n.__('Show playback controls')); - this.ui.cancel_button.css('display', 'block'); - $('.open-button').css('display', 'block'); - this.ui.controls.css('display', 'none'); - this.ui.playingbarBox.css('display', 'none'); - } - }, + if (Settings.activateLoCtrl === false) { + AdvSettings.set('activateLoCtrl', true); + $('.show-pcontrols').removeClass('fa-angle-down').addClass('fa-angle-up').tooltip('hide').attr('data-original-title', i18n.__('Hide playback controls')); + this.ui.cancel_button.css('display', 'none'); + $('.open-button').css('display', 'none'); + this.ui.controls.css('display', 'block'); + this.ui.playingbarBox.css('display', 'block'); + } else if (Settings.activateLoCtrl === true) { + AdvSettings.set('activateLoCtrl', false); + $('.show-pcontrols').removeClass('fa-angle-up').addClass('fa-angle-down').tooltip('hide').attr('data-original-title', i18n.__('Show playback controls')); + this.ui.cancel_button.css('display', 'block'); + $('.open-button').css('display', 'block'); + this.ui.controls.css('display', 'none'); + this.ui.playingbarBox.css('display', 'none'); + } + }, - tempf: function (e) { - nw.Shell.openExternal(Settings.tmpLocation); - }, + tempf: function (e) { + nw.Shell.openExternal(Settings.tmpLocation); + }, - filenameovrflsh: function () { - $('.text_filename').css('overflow', 'visible'); - }, + filenameovrflsh: function () { + $('.text_filename').css('overflow', 'visible'); + }, - filenameovrflhd: function () { - $('.text_filename').css('overflow', 'hidden'); - }, - remainingTime: function () { - var streamInfo = this.model.get('streamInfo'); - var timeLeft = streamInfo.get('time_left'); + filenameovrflhd: function () { + $('.text_filename').css('overflow', 'hidden'); + }, + + remainingTime: function () { + var streamInfo = this.model.get('streamInfo'); + var timeLeft = streamInfo.get('time_left'); - if (timeLeft === undefined) { + if (timeLeft === undefined) { return i18n.__('Unknown time remaining'); - } else if (timeLeft > 3600) { + } else if (timeLeft > 3600) { return i18n.__('%s hour(s) remaining', Math.round(timeLeft / 3600)); - } else if (timeLeft > 60) { + } else if (timeLeft > 60) { return i18n.__('%s minute(s) remaining', Math.round(timeLeft / 60)); - } else if (timeLeft <= 60) { + } else if (timeLeft <= 60) { return i18n.__('%s second(s) remaining', timeLeft); - } -}, + } + }, -titletoclip: function (e) { - if (e.button === 2) { + titletoclip: function (e) { + if (e.button === 2) { var streamInfo = this.model.get('streamInfo'); var clipboard = nw.Clipboard.get(); clipboard.set(streamInfo.get('title'), 'text'); $('.notification_alert').text(i18n.__('The title was copied to the clipboard')).fadeIn('fast').delay(2500).fadeOut('fast'); - } -}, + } + }, -filenametoclip: function (e) { - if (e.button === 2) { + filenametoclip: function (e) { + if (e.button === 2) { var streamInfo = this.model.get('streamInfo'); var clipboard = nw.Clipboard.get(); clipboard.set(streamInfo.get('filename'), 'text'); $('.notification_alert').text(i18n.__('The filename was copied to the clipboard')).fadeIn('fast').delay(2500).fadeOut('fast'); - } -}, + } + }, -streamurltoclip: function (e) { - if (e.button === 2) { + streamurltoclip: function (e) { + if (e.button === 2) { var streamInfo = this.model.get('streamInfo'); var clipboard = nw.Clipboard.get(); clipboard.set(streamInfo.get('src').replace('127.0.0.1', Settings.ipAddress), 'text'); $('.notification_alert').text(i18n.__('The stream url was copied to the clipboard')).fadeIn('fast').delay(2500).fadeOut('fast'); - } -}, + } + }, + pauseStreaming: function() { App.vent.trigger('device:pause'); $('.pause') @@ -541,7 +538,7 @@ streamurltoclip: function (e) { App.vent.trigger('movie:closeDetail'); }); } - }); + }); App.View.Loading = Loading; })(window.App); From 87add34a3d6b0dcee56667a83d8953a5580d3783 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 17 Aug 2020 15:30:06 +0300 Subject: [PATCH 204/777] Player UI fix --- src/app/styl/views/videojs.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styl/views/videojs.styl b/src/app/styl/views/videojs.styl index 8bd9bcb632..f379a26e22 100644 --- a/src/app/styl/views/videojs.styl +++ b/src/app/styl/views/videojs.styl @@ -736,7 +736,7 @@ .vjs-text-track-display { text-align: center; position: absolute; - bottom: 40px; + bottom: 38px; left: 1em; right: 1em; } From efe2c0f90400e26b18510f613a8ff12a2369ff63 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 01:58:06 +0300 Subject: [PATCH 205/777] Fix hiding the navigation filters ..when in the Torrent Collection or Seedbox --- src/app/lib/views/browser/filter_bar.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/lib/views/browser/filter_bar.js b/src/app/lib/views/browser/filter_bar.js index a5b3e6e2b1..995f3180a1 100644 --- a/src/app/lib/views/browser/filter_bar.js +++ b/src/app/lib/views/browser/filter_bar.js @@ -73,6 +73,7 @@ }, setActive: function(set) { var rightSearch = $('.right .search'); + var navFilters = $('#nav-filters'); var filterbarRandom = $('#filterbar-random'); if (Settings.startScreen === 'Last Open') { @@ -80,6 +81,7 @@ } rightSearch.show(); + navFilters.show(); filterbarRandom.hide(); $('.filter-bar') .find('.active') @@ -109,10 +111,12 @@ break; case 'Torrent-collection': rightSearch.hide(); + navFilters.hide(); $('#filterbar-torrent-collection').addClass('active'); break; case 'Seedbox': rightSearch.hide(); + navFilters.hide(); $('#filterbar-seedbox').addClass('active'); break; } From 66804b1ebfd9bd0b20f9e920cd99458b145db5aa Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 01:59:40 +0300 Subject: [PATCH 206/777] Fix hiding the navigation filters ..when in the Torrent Collection or Seedbox --- src/app/lib/views/play_control.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/lib/views/play_control.js b/src/app/lib/views/play_control.js index 9aaee7b15f..1641735766 100644 --- a/src/app/lib/views/play_control.js +++ b/src/app/lib/views/play_control.js @@ -218,6 +218,7 @@ App.vent.trigger('seedbox:show'); $('.filter-bar').find('.active').removeClass('active'); $('#filterbar-seedbox').addClass('active'); + $('#nav-filters').hide(); }, startStreaming: function() { From fc061463fb64ba642ee5c8feda27fc7cd4789d4c Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:00:31 +0300 Subject: [PATCH 207/777] Fix hiding the navigation filters ..when in the Torrent Collection or Seedbox --- src/app/lib/views/show_detail.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/lib/views/show_detail.js b/src/app/lib/views/show_detail.js index d6f906c47a..5a510d2af2 100644 --- a/src/app/lib/views/show_detail.js +++ b/src/app/lib/views/show_detail.js @@ -511,6 +511,7 @@ App.vent.trigger('seedbox:show'); $('.filter-bar').find('.active').removeClass('active'); $('#filterbar-seedbox').addClass('active'); + $('#nav-filters').hide(); }, closeDetails: function (e) { From 9a1da2a20f00ed1db5a9af3fde6d8ba086291441 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:02:06 +0300 Subject: [PATCH 208/777] Update the keyboard shorcuts help 'ctrl+tab_number' goes up to 'ctrl+4' now with Favorites becoming a tab --- src/app/templates/keyboard.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/keyboard.tpl b/src/app/templates/keyboard.tpl index 8ed5b2346e..e1b4c8f51e 100644 --- a/src/app/templates/keyboard.tpl +++ b/src/app/templates/keyboard.tpl @@ -37,7 +37,7 @@ <%= i18n.__("Switch to previous tab") %> - <%= i18n.__("ctrl") %>+1<%= i18n.__("through") %><%= i18n.__("ctrl") %>+3 + <%= i18n.__("ctrl") %>+1<%= i18n.__("through") %><%= i18n.__("ctrl") %>+4 <%= i18n.__("Switch to corresponding tab") %> From 24cea81a1a4521270c6d2942cb3fcfa8f5fcd4b9 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:02:56 +0300 Subject: [PATCH 209/777] Fix fontawesome --- src/app/lib/views/seedbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/views/seedbox.js b/src/app/lib/views/seedbox.js index 3f15d3f382..555f5e167d 100644 --- a/src/app/lib/views/seedbox.js +++ b/src/app/lib/views/seedbox.js @@ -130,7 +130,7 @@
    ${App.plugins.mediaName.getMediaName(torrent)}
    - + 0 Kb/s From 01129afaaa66d78b5c5d6b23a5f194ee9820d96a Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:03:29 +0300 Subject: [PATCH 210/777] Fix fontawesome --- src/app/templates/movie-error.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/templates/movie-error.tpl b/src/app/templates/movie-error.tpl index 596ce707dc..6126d627f9 100644 --- a/src/app/templates/movie-error.tpl +++ b/src/app/templates/movie-error.tpl @@ -1,9 +1,9 @@

    <%= error %>

    -
    \ No newline at end of file + From f6b09d0ef7b9d636303124fdb0a411b01571009e Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:03:47 +0300 Subject: [PATCH 211/777] Fix fontawesome --- src/app/templates/seedbox.tpl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/templates/seedbox.tpl b/src/app/templates/seedbox.tpl index ea2cb43ccf..506d282496 100644 --- a/src/app/templates/seedbox.tpl +++ b/src/app/templates/seedbox.tpl @@ -36,8 +36,8 @@ <% } else { %>
    ">
    <% } %> - "> - "> + "> + "> <% }); %> From fc2bf971c42f9612f7c77736d46715b440f29ae0 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:04:20 +0300 Subject: [PATCH 212/777] Fix fontawesome --- src/app/templates/settings-container.tpl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index abfe1aceaf..93c2762e77 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -349,7 +349,7 @@
    -    +    <%= i18n.__("Sync With Trakt") %>
    @@ -541,7 +541,7 @@

    <%= i18n.__("Cache Directory") %>

    " id="faketmpLocation" value="<%= Settings.tmpLocation %>" readonly="readonly" size="65" /> - "> + ">
    @@ -565,18 +565,18 @@

    <%= i18n.__("Database Directory") %>

    " id="fakedatabaseLocation" value="<%= Settings.databaseLocation %>" readonly="readonly" size="65" /> - "> + ">
    -    +   
    -    +   
    From e0bed593134a2e6f70210c7150c976df0b0b8d07 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:04:50 +0300 Subject: [PATCH 213/777] Fix fontawesome --- src/app/templates/torrent_collection.tpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/templates/torrent_collection.tpl b/src/app/templates/torrent_collection.tpl index c3f24b6d82..a1fb85f936 100644 --- a/src/app/templates/torrent_collection.tpl +++ b/src/app/templates/torrent_collection.tpl @@ -60,8 +60,8 @@ <% } else { %>
    ">
    <% } %> - "> - "> + "> + "> <% }); %> @@ -78,9 +78,9 @@
    ">
    -
    ">
    +
    ">
    -
    ">
    +
    ">
    From f519fe996a42d389d935feb966cd695414a4fef8 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 02:05:31 +0300 Subject: [PATCH 214/777] Fix 'Cast' tooltip styling --- src/app/lib/views/movie_detail.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/lib/views/movie_detail.js b/src/app/lib/views/movie_detail.js index fb5690899e..64f3f8e739 100644 --- a/src/app/lib/views/movie_detail.js +++ b/src/app/lib/views/movie_detail.js @@ -276,7 +276,7 @@ if (curSynopsis.cast !== '') { $('.overview').html(curSynopsis.crew + curSynopsis.cast + curSynopsis.old); $('.show-cast').attr('title', i18n.__('Hide cast')).tooltip('hide').tooltip('fixTitle'); - $('.overview *').tooltip({html: true, container: 'body', placement: 'bottom', delay: {show: 200, hide: 0}, template: '
    '}); + $('.overview *').tooltip({html: true, sanitize: false, container: 'body', placement: 'bottom', delay: {show: 200, hide: 0}, template: '
    '}); curSynopsis.vstatus = true; } else { $('.show-cast').css({cursor: 'default', opacity: 0.4}).attr('title', i18n.__('Cast not available')).tooltip('hide').tooltip('fixTitle'); @@ -291,7 +291,7 @@ showallCast: function () { $('.overview').html(curSynopsis.crew + curSynopsis.allcast + curSynopsis.old); - $('.overview *').tooltip({html: true, container: 'body', placement: 'bottom', delay: {show: 200, hide: 0}, template: '
    '}); + $('.overview *').tooltip({html: true, sanitize: false, container: 'body', placement: 'bottom', delay: {show: 200, hide: 0}, template: '
    '}); }, onBeforeDestroy: function() { From aae85e99a81a50acfb014662555e10cdbd07f4ae Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 03:03:39 +0300 Subject: [PATCH 215/777] Stop play-control from moving ..when overview is big enough to have overflow --- src/app/styl/views/movie_detail.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styl/views/movie_detail.styl b/src/app/styl/views/movie_detail.styl index 7227b49a15..f747f1dc9c 100644 --- a/src/app/styl/views/movie_detail.styl +++ b/src/app/styl/views/movie_detail.styl @@ -251,7 +251,7 @@ height: 70px line-height: 35px - margin: 10px 25px 1px 16px + margin: -1px 25px 1px 16px .setup-container display: flex From b09a9a200457cbe09e2c1032ae1b14771659889e Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 04:24:14 +0300 Subject: [PATCH 216/777] Update torrent_collection.styl --- src/app/styl/views/torrent_collection.styl | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/styl/views/torrent_collection.styl b/src/app/styl/views/torrent_collection.styl index 29646f7b09..30c03914de 100644 --- a/src/app/styl/views/torrent_collection.styl +++ b/src/app/styl/views/torrent_collection.styl @@ -169,6 +169,7 @@ cursor text outline 0 !important height 30px + min-width 264px .online-search margin-left 5px From cb6cfb05d0112cd2c4fc8b9c50eb1aecb1c508bd Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 21 Aug 2020 05:02:59 +0300 Subject: [PATCH 217/777] Fix health tooltip's linebreaks --- src/app/common.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/common.js b/src/app/common.js index 88731ea7a4..2628808429 100644 --- a/src/app/common.js +++ b/src/app/common.js @@ -129,7 +129,7 @@ Common.HealthButton = function (selector, retrieveHealthCallback) { ]; if (!isNaN(ratio)) { - tooltipPieces.push(`${i18n.__('Ratio:')} ${ratio.toFixed(2)}`); + tooltipPieces.push(` - ${i18n.__('Ratio:')} ${ratio.toFixed(2)}
    `); } if (!isNaN(seeds)) { @@ -137,7 +137,7 @@ Common.HealthButton = function (selector, retrieveHealthCallback) { } if (!isNaN(peers)) { - tooltipPieces.push(`${i18n.__('Peers:')} ${peers}`); + tooltipPieces.push(` - ${i18n.__('Peers:')} ${peers}`); } getIcon() @@ -146,7 +146,7 @@ Common.HealthButton = function (selector, retrieveHealthCallback) { }) .removeClass('None Bad Medium Good Excellent') .addClass(healthString) - .attr('data-original-title', tooltipPieces.join('
    ')) + .attr('data-original-title', tooltipPieces.join('')) .tooltip('fixTitle'); } }); From 6caaa1a7d3621abbc53fc736990888233b88234b Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 22 Aug 2020 19:52:41 +0300 Subject: [PATCH 218/777] Make the 'Cache Folder' button in the loading screen specific to that torrent --- src/app/lib/views/player/loading.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index 34d8728312..ed5102ae40 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -387,7 +387,12 @@ }, tempf: function (e) { - nw.Shell.openExternal(Settings.tmpLocation); + try { var infoHash = this.model.attributes.streamInfo.attributes.torrentModel.attributes.torrent.infoHash; } catch (err) {} + if (infoHash) { + nw.Shell.openExternal(Settings.tmpLocation + '/' + infoHash); + } else { + nw.Shell.openExternal(Settings.tmpLocation); + } }, filenameovrflsh: function () { From 4c6a9d27f2ee265aca364c5f011ac8245ca811e5 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 03:53:47 +0300 Subject: [PATCH 219/777] Update settings-container.tpl --- src/app/templates/settings-container.tpl | 195 ++++++++++------------- 1 file changed, 85 insertions(+), 110 deletions(-) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 93c2762e77..f496a89788 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -6,7 +6,7 @@
    <%= i18n.__("Settings") %>
    - "> + "> "> > @@ -14,32 +14,6 @@
    -
    -
    <%= i18n.__("Server") %>
    -
    - -
    -

    <%= i18n.__("Custom API Server") %>

    - - - - -
    -
    - -
    -

    <%= i18n.__("Proxy Server") %>

    - - - - -
    -
    -
    -
    -
    <%= i18n.__("User Interface") %>
    @@ -49,10 +23,9 @@ <% var langs = ""; for(var key in App.Localization.allTranslations) { - key = App.Localization.allTranslations[key]; - if (App.Localization.langcodes[key] !== undefined) { - langs += ""; + key = App.Localization.allTranslations[key]; + if (App.Localization.langcodes[key] !== undefined) { + langs += ""; } } %> @@ -60,7 +33,6 @@
    - - - - + > @@ -116,17 +85,14 @@ > - > - > - - + + + + +

    <%= i18n.__("UI Scaling") %>

    +   <%= i18n.__("(25% - 400%)") %> +
    @@ -159,11 +141,9 @@ <% var sub_langs = ""; - for(var key in App.Localization.langcodes) { if (App.Localization.langcodes[key].subtitle !== undefined && App.Localization.langcodes[key].subtitle == true) { - sub_langs += ""; + sub_langs += ""; } } %> @@ -171,7 +151,6 @@
    - - - -

    <%= i18n.__("Color") %>

    @@ -290,7 +260,6 @@ > -
    @@ -314,10 +283,11 @@
    +
    <%= i18n.__("Playback") %>
    - + > @@ -374,16 +344,16 @@ <% } %> <% if(App.TVShowTime) { %> -
    -
    TVShow Time
    -
    -
    "> - <% if(App.TVShowTime.authenticated) { %> +
    +
    TVShow Time
    +
    +
    "> + <% if(App.TVShowTime.authenticated) { %> <%= i18n.__("You are currently connected to %s", "TVShow Time") %>. <%= i18n.__("Disconnect account") %> - <% } else { %> + <% } else { %>
       @@ -391,10 +361,10 @@
    - <% } %> -
    -
    -
    + <% } %> +
    +
    +
    <% } %>
    @@ -407,17 +377,17 @@ <%= i18n.__("Disconnect account") %> <% } else { %> - -

    <%= i18n.__("Username") %>

    - + +

    <%= i18n.__("Username") %>

    + -
    - -

    <%= i18n.__("Password") %>

    - -
    +
    + +

    <%= i18n.__("Password") %>

    + +
       @@ -427,9 +397,9 @@   <%= i18n.__("Create account") %>
    - - <%= i18n.__("* %s stores an encrypted hash of your password in your local database", Settings.projectName) %> - + + <%= i18n.__("* %s stores an encrypted hash of your password in your local database", Settings.projectName) %> + <% } %> > @@ -497,6 +467,30 @@
    +
    +
    <%= i18n.__("Server") %>
    +
    + +
    +

    <%= i18n.__("Custom API Server") %>

    + + + + +
    +
    + +
    +

    <%= i18n.__("Proxy Server") %>

    + + + + +
    +
    +
    +
    +
    <%= i18n.__("Connection") %>
    @@ -531,7 +525,6 @@ > -
    @@ -569,20 +562,20 @@
    -
    - -    - -
    -
    - -    - -
    - +
    + +    + +
    +
    + +    + +
    +
    <%= i18n.__("Miscellaneous") %>
    @@ -594,7 +587,6 @@ "firstUnwatched": "First Unwatched Episode", "next": "Next Episode In Series" }; - var selected_tv_detail_jump = ""; for(var key in tv_detail_jump_to) { selected_tv_detail_jump += ""; @@ -620,29 +612,12 @@ > - - - - -

    <%= i18n.__("UI Scaling") %>

    -   <%= i18n.__("(25% - 400%)") %> -
    +
    -
    <%= i18n.__("Flush bookmarks database") %>
    -
    <%= i18n.__("Flush subtitles cache") %>
    +
    <%= i18n.__("Flush bookmarks database") %>
    +
    <%= i18n.__("Flush subtitles cache") %>
    <%= i18n.__("Flush all databases") %>
    <%= i18n.__("Reset to Default Settings") %>
    From 6a80503da7d11b1d2f0eec861883650107a86ff8 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 04:11:29 +0300 Subject: [PATCH 220/777] Update settings-container.tpl --- src/app/templates/settings-container.tpl | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index f496a89788..41ac0fd265 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -295,7 +295,6 @@ > - From b7fc6e7d9c5c7774c9e5f1b85bcfb5371e2dca0f Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 05:33:54 +0300 Subject: [PATCH 221/777] Update settings-container.tpl --- src/app/templates/settings-container.tpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 41ac0fd265..17e97e85a3 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -411,14 +411,14 @@
    <%= i18n.__("Features") %>
    - - > - - > + + > + + > From c1d179964cfc342bbe2ba02008a9a1874a6642f1 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 15:59:30 +0300 Subject: [PATCH 222/777] Remove infoHash top dir for cache files/folders --- src/app/lib/streamer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index b5a62bfa36..5fd59b16be 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -105,7 +105,7 @@ } App.WebTorrent.add(uri, { - path : App.settings.tmpLocation + '/' + infoHash, + path : App.settings.tmpLocation, maxConns : 5, dht : true, announce : Settings.trackers.forced, @@ -181,7 +181,7 @@ if (!this.torrent) { this.torrent = App.WebTorrent.add(uri, { - path: App.settings.tmpLocation + '/' + infoHash, + path: App.settings.tmpLocation, announce: Settings.trackers.forced }); } From 357c9c4c6e617d5566af152bbce25a6480a67c6d Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 16:04:24 +0300 Subject: [PATCH 223/777] Revert 'Make the 'Cache Folder' button in the loading screen specific to that torrent' Its unnecessary now with https://github.com/kiriles90/popcorn-desktop/commit/c1d179964cfc342bbe2ba02008a9a1874a6642f1 --- src/app/lib/views/player/loading.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index ed5102ae40..34d8728312 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -387,12 +387,7 @@ }, tempf: function (e) { - try { var infoHash = this.model.attributes.streamInfo.attributes.torrentModel.attributes.torrent.infoHash; } catch (err) {} - if (infoHash) { - nw.Shell.openExternal(Settings.tmpLocation + '/' + infoHash); - } else { - nw.Shell.openExternal(Settings.tmpLocation); - } + nw.Shell.openExternal(Settings.tmpLocation); }, filenameovrflsh: function () { From ad7bb77a1c634da0a320ba0c88f4e10e4a157cec Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 17:04:58 +0300 Subject: [PATCH 224/777] Remove infoHash top dir for cache files/folders --- src/app/lib/streamer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index 5fd59b16be..04aaaae865 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -53,7 +53,7 @@ } App.WebTorrent.add(data, { - path : App.settings.tmpLocation + '/' + file, + path : App.settings.tmpLocation, maxConns : 5, dht : true, announce : Settings.trackers.forced, From dd815dabeb4bf30ece4527d0eed1d29362ce864b Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 18:19:01 +0300 Subject: [PATCH 225/777] Remove infoHash top dir for cache files/folders --- src/app/lib/views/seedbox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/views/seedbox.js b/src/app/lib/views/seedbox.js index 555f5e167d..20418e9178 100644 --- a/src/app/lib/views/seedbox.js +++ b/src/app/lib/views/seedbox.js @@ -242,7 +242,7 @@ if (torrent) { torrent.destroy(() => { fs.unlinkSync(path.join(torrentsDir, torrent.infoHash)); - rimraf(path.join(App.settings.tmpLocation, torrent.infoHash), () => { + rimraf(path.join(App.settings.tmpLocation, torrent.name), () => { }); }); From 89366c08f186e34874f0e5f7ec8abe23e75b6215 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 20:43:04 +0300 Subject: [PATCH 226/777] Fix 'Watch now' button from idling when bad health torrent that delays to (or cant) resolve --- src/app/lib/streamer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index 04aaaae865..1c27eef47e 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -407,7 +407,6 @@ this.updateStatsInterval = setInterval(this.streamInfo.updateStats.bind(this.streamInfo), 1000); this.streamInfo.updateInfos(); this.torrentModel.on('change', this.streamInfo.updateInfos.bind(this.streamInfo)); - return App.vent.trigger('stream:started', this.stateModel); }, // dummy element to fire stream:start @@ -450,6 +449,7 @@ show_controls: false, streamInfo: this.streamInfo }); + App.vent.trigger('stream:started', this.stateModel); }, watchState: function () { From 5a91d406370a1aafbe6a1bd410c9fd46f457c9c8 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 21:23:54 +0300 Subject: [PATCH 227/777] Fix 'Watch now' button from idling when bad health torrent that delays to (or cant) resolve --- src/app/templates/loading.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/loading.tpl b/src/app/templates/loading.tpl index 364af53870..ec341c31d8 100644 --- a/src/app/templates/loading.tpl +++ b/src/app/templates/loading.tpl @@ -1,5 +1,5 @@
    -
    +
    From 304771d48064de0f20575eee0303e3ee1c8183c9 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 23 Aug 2020 21:59:57 +0300 Subject: [PATCH 228/777] Fix 'Watch now' button from idling when bad health torrent that delays to (or cant) resolve --- src/app/templates/loading.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/loading.tpl b/src/app/templates/loading.tpl index ec341c31d8..edf33254d5 100644 --- a/src/app/templates/loading.tpl +++ b/src/app/templates/loading.tpl @@ -1,5 +1,5 @@
    -
    +
    style="background-image:url( <%= backdrop %> )" <% }catch(err) {} %>>
    From 546e5dd28b0becc9d54e252fc62b01df05df60ee Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:52:00 +0300 Subject: [PATCH 229/777] Option to disable Seedbox --- src/app/lib/views/settings_container.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 667abe8f0d..60a6b68732 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -253,6 +253,7 @@ case 'alwaysFullscreen': case 'minimizeToTray': case 'activateTorrentCollection': + case 'activateSeedbox': case 'activateWatchlist': case 'activateTempf': case 'opensubtitlesAutoUpload': @@ -399,6 +400,7 @@ break; case 'activateWatchlist': case 'activateTempf': + case 'activateSeedbox': App.vent.trigger('movies:list'); App.vent.trigger('settings:show'); break; From 619f84614feb36acc42e358c7d1b8cf85a392f56 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:52:44 +0300 Subject: [PATCH 230/777] Option to disable Seedbox --- src/app/lib/streamer.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index 1c27eef47e..da9590cdc8 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -121,15 +121,20 @@ // update ratio AdvSettings.set('totalDownloaded', Settings.totalDownloaded + this.downloaded); AdvSettings.set('totalUploaded', Settings.totalUploaded + this.uploaded); - this.torrent.pause(); - // complete fause torrent, stop download data - for (const id in this.torrent._peers) { - this.torrent.removePeer(id); - } - this.torrent._xsRequests.forEach(req => { - req.abort(); - }); + if (Settings.activateSeedbox) { + this.torrent.pause(); + // complete fause torrent, stop download data + for (const id in this.torrent._peers) { + this.torrent.removePeer(id); + } + + this.torrent._xsRequests.forEach(req => { + req.abort(); + }); + } else { + this.torrent.destroy(); + } } if (this.video) { From 8dc4a162ae158409f549b9d4d2e8e4cd2b564d18 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:53:43 +0300 Subject: [PATCH 231/777] Option to disable Seedbox --- src/app/templates/browser/filter-bar.tpl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/templates/browser/filter-bar.tpl b/src/app/templates/browser/filter-bar.tpl index d40e8c5aed..ea548a43ca 100644 --- a/src/app/templates/browser/filter-bar.tpl +++ b/src/app/templates/browser/filter-bar.tpl @@ -82,7 +82,11 @@ -
  • + <% if (Settings.activateSeedbox) { %> +
  • + <% } else { %> +
  • + <% } %> ">
  • From ef5175c13a89e219048a1f3619726fb5d8b45596 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:54:24 +0300 Subject: [PATCH 232/777] Option to disable Seedbox --- src/app/templates/play-control.tpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/templates/play-control.tpl b/src/app/templates/play-control.tpl index 890294adfb..22b144fe0a 100644 --- a/src/app/templates/play-control.tpl +++ b/src/app/templates/play-control.tpl @@ -9,7 +9,9 @@
    <%=i18n.__("Watch Trailer") %>
    + <% if (Settings.activateSeedbox) { %>
    <%=i18n.__("Download") %>
    + <% } %>
    From dfdf969d5c53870d8dd7c3abd499818c39e2872d Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:54:58 +0300 Subject: [PATCH 233/777] Option to disable Seedbox --- src/app/templates/settings-container.tpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 17e97e85a3..287597af12 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -419,6 +419,10 @@ > + + > + + > From 6371562e0e60b53e9fb3110f887b8fcbac644478 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:55:31 +0300 Subject: [PATCH 234/777] Option to disable Seedbox --- src/app/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/settings.js b/src/app/settings.js index 0441ad3954..b6a020b69f 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -200,6 +200,7 @@ Settings.bigPicture = 100; Settings.activateTorrentCollection = true; Settings.activateWatchlist = true; Settings.activateTempf = true; +Settings.activateSeedbox = true; Settings.onlineSearchEngine = 'ExtraTorrent'; Settings.enableThepiratebaySearch = true; Settings.enable1337xSearch = true; From 22234b8534c6c70bc1612a4eb7db1da7ab2b3e07 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 01:57:43 +0300 Subject: [PATCH 235/777] Option to disable Seedbox --- src/app/templates/show-detail.tpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/templates/show-detail.tpl b/src/app/templates/show-detail.tpl index cb972cbcc4..ce2ca5fdda 100644 --- a/src/app/templates/show-detail.tpl +++ b/src/app/templates/show-detail.tpl @@ -100,7 +100,9 @@
    + <% if (Settings.activateSeedbox) { %>
    <%=i18n.__("Download") %>
    + <% } %>
    From 862cf16d5f2ffbafae877057176dfc0b6dacd4ae Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 02:21:32 +0300 Subject: [PATCH 236/777] Option to disable Seedbox --- src/app/templates/settings-container.tpl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 287597af12..ef34c3f6ce 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -548,10 +548,12 @@ > + <% if (Settings.activateSeedbox) { %>

    <%= i18n.__("Maximum number of active torrents") %>

    + <% } %> From 58a2effc6eaa8a5c55eacf52235d2979cb1e5069 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:52:45 +0300 Subject: [PATCH 237/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/settings.js b/src/app/settings.js index b6a020b69f..51da77cb25 100644 --- a/src/app/settings.js +++ b/src/app/settings.js @@ -158,6 +158,7 @@ Settings.subtitle_size = '38px'; Settings.subtitle_color = '#ffffff'; Settings.subtitle_decoration = 'Outline'; Settings.subtitle_font = 'Arial'; +Settings.multipleExtSubtitles = false; // More options Settings.httpApiEnabled = false; From dd6796c54a57a4c37de8fa58eaee67c90b6f141e Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:53:56 +0300 Subject: [PATCH 238/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/lib/views/lang_dropdown.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/lib/views/lang_dropdown.js b/src/app/lib/views/lang_dropdown.js index 047520c963..72985d88d8 100644 --- a/src/app/lib/views/lang_dropdown.js +++ b/src/app/lib/views/lang_dropdown.js @@ -58,7 +58,11 @@ setLang: function (value) { console.log(value); this.model.set('selected', value); - this.ui.selected.removeClass().addClass('flag toggle selected-lang').addClass(value); + if (value !== 'none') { + this.ui.selected.removeClass().addClass('flag toggle selected-lang').addClass(value.substr(0,2)); + } else { + this.ui.selected.removeClass().addClass('flag toggle selected-lang').addClass(value); + } App.vent.trigger(this.type + ':lang', value); }, From 4f2bb10ffe1f26e4005a543748b31d476c0e8d86 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:54:33 +0300 Subject: [PATCH 239/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/lib/views/settings_container.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 60a6b68732..13b7b23aba 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -258,6 +258,7 @@ case 'activateTempf': case 'opensubtitlesAutoUpload': case 'subtitles_bold': + case 'multipleExtSubtitles': case 'rememberFilters': case 'animeTabDisable': value = field.is(':checked'); @@ -401,6 +402,7 @@ case 'activateWatchlist': case 'activateTempf': case 'activateSeedbox': + case 'multipleExtSubtitles': App.vent.trigger('movies:list'); App.vent.trigger('settings:show'); break; From c94d373d04ec2f4339237f004feb6a893c69fe1c Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:56:28 +0300 Subject: [PATCH 240/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/lib/subtitle/generic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/subtitle/generic.js b/src/app/lib/subtitle/generic.js index e44559ce6c..b5f98b92c5 100644 --- a/src/app/lib/subtitle/generic.js +++ b/src/app/lib/subtitle/generic.js @@ -29,7 +29,7 @@ var vname = path.basename(vpath).substring(0, path.basename(vpath).lastIndexOf(vext)); // video file name var folder = path.dirname(vpath); // cwd var furl = data.url; // subtitle url - var fpath = path.join(folder, vname + '.' + streamInfo.get("defaultSubtitle")); // subtitle local path, no extension + var fpath = path.join(folder, vname + '.' + streamInfo.get("defaultSubtitle").substr(0,streamInfo.get("defaultSubtitle").indexOf('|'))); // subtitle local path, no extension request.get(furl).on('response', function (response) { var rtype = (response.headers['content-type'] || '').split(';')[0].trim(); // response type From a81e3059594d29ae41c9003a2c25cad80dded6d5 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:57:09 +0300 Subject: [PATCH 241/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/templates/settings-container.tpl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index ef34c3f6ce..8ae62611e5 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -260,6 +260,10 @@ > + + > + + From 098bdd68e9cc5d1b1548c6b0dd4b2c158ac1e76c Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 06:58:03 +0300 Subject: [PATCH 242/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/templates/lang-dropdown.tpl | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/templates/lang-dropdown.tpl b/src/app/templates/lang-dropdown.tpl index 7e147ffdec..7e659935ef 100644 --- a/src/app/templates/lang-dropdown.tpl +++ b/src/app/templates/lang-dropdown.tpl @@ -7,8 +7,16 @@ From 4fc1c223326c52dedf1bbc5dd31ce472f315580c Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 07:25:15 +0300 Subject: [PATCH 243/777] Update lang-dropdown.tpl --- src/app/templates/lang-dropdown.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/lang-dropdown.tpl b/src/app/templates/lang-dropdown.tpl index 7e659935ef..bf39dab642 100644 --- a/src/app/templates/lang-dropdown.tpl +++ b/src/app/templates/lang-dropdown.tpl @@ -13,7 +13,7 @@ <% if(lang.indexOf('|')!==-1) continue; %> <% } %> <% if(lang !== 'none') { %> -
    +
    <% } else { %>
    <% } %> From f1a85c2c7f4fecb8112d1da4d6fd92e17dd4a526 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Mon, 24 Aug 2020 07:26:21 +0300 Subject: [PATCH 244/777] Show all available subtitles for the default subtitle language in the flag dropdown menu --- src/app/lib/subtitle/generic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/subtitle/generic.js b/src/app/lib/subtitle/generic.js index b5f98b92c5..1fcc40213b 100644 --- a/src/app/lib/subtitle/generic.js +++ b/src/app/lib/subtitle/generic.js @@ -29,7 +29,7 @@ var vname = path.basename(vpath).substring(0, path.basename(vpath).lastIndexOf(vext)); // video file name var folder = path.dirname(vpath); // cwd var furl = data.url; // subtitle url - var fpath = path.join(folder, vname + '.' + streamInfo.get("defaultSubtitle").substr(0,streamInfo.get("defaultSubtitle").indexOf('|'))); // subtitle local path, no extension + var fpath = path.join(folder, vname + '.' + streamInfo.get("defaultSubtitle").substr(0,2)); // subtitle local path, no extension request.get(furl).on('response', function (response) { var rtype = (response.headers['content-type'] || '').split(';')[0].trim(); // response type From 1153f998c26eed7a9a6c94fd0436da4908f0e853 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Tue, 25 Aug 2020 09:03:20 +0300 Subject: [PATCH 245/777] Fix external & Torrent Collection magnet links/.torrent's the stop() function was removing all their peers.. --- src/app/lib/streamer.js | 51 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index da9590cdc8..a5bdee071a 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -159,6 +159,37 @@ win.info('Streaming cancelled'); }, + stopFS: function() { + if (this.torrent) { + // update ratio + AdvSettings.set('totalDownloaded', Settings.totalDownloaded + this.downloaded); + AdvSettings.set('totalUploaded', Settings.totalUploaded + this.uploaded); + + this.torrent.destroy(); + } + + if (this.video) { + this.video.pause(); + this.video.src = ''; + this.video.load(); + this.video = null; + } + + this.torrent = null; + this.torrentModel = null; + this.stateModel = null; + this.streamInfo = null; + this.subtitleReady = false; + this.canPlay = false; + this.stopped = true; + clearInterval(this.updateStatsInterval); + this.updateStatsInterval = null; + + App.vent.off('subtitle:downloaded'); + App.SubtitlesServer.stop(); + win.info('Streaming cancelled'); + }, + handleErrors: function (reason) { if (!this.stopped) { win.error(reason); @@ -264,8 +295,10 @@ tvdb: metadatas.type === 'movie' ? false : metadatas.show.ids.tvdb, tmdb: metadatas.type === 'movie' ? metadatas.movie.ids.tmdb : false }).then(function (img) { - this.torrentModel.set('backdrop', img.background); - this.torrentModel.set('poster', img.poster); + if (this.torrentModel) { + this.torrentModel.set('backdrop', img.background); + this.torrentModel.set('poster', img.poster); + } }.bind(this)); }, @@ -308,13 +341,17 @@ throw 'trakt.matcher.match failed'; } - this.torrentModel.set(props); + if (this.torrentModel) { + this.torrentModel.set(props); + } this.lookForImages(metadatas); this.handleSubtitles(); }.bind(this)).catch(function(err) { win.error('An error occured while trying to get metadata', err); - this.torrentModel.set('title', fileName); + if (this.torrentModel) { + this.torrentModel.set('title', fileName); + } this.handleSubtitles(); }.bind(this)); }, @@ -511,8 +548,9 @@ win.info(total + ' subtitles found'); - - this.torrentModel.set('subtitle', subtitles); + if (this.torrentModel) { + this.torrentModel.set('subtitle', subtitles); + } if (defaultSubtitle !== 'none') { if (total === 0) { @@ -661,6 +699,7 @@ App.vent.on('stream:loadExistTorrents', streamer.initExistTorrents.bind(streamer)); App.vent.on('stream:start', streamer.start.bind(streamer)); App.vent.on('stream:stop', streamer.stop.bind(streamer)); + App.vent.on('stream:stopFS', streamer.stopFS.bind(streamer)); App.vent.on('stream:download', streamer.download.bind(streamer)); App.vent.on('stream:serve_subtitles', streamer.serveSubtitles.bind(streamer)); })(window.App); From dc4a14bdba1aac863cde225011b316f934ee5453 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Tue, 25 Aug 2020 09:03:57 +0300 Subject: [PATCH 246/777] Fix external & Torrent Collection magnet links/.torrent's the stop() function was removing all their peers.. --- src/app/lib/views/main_window.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/views/main_window.js b/src/app/lib/views/main_window.js index 9e4b38146b..f2b6a886cf 100644 --- a/src/app/lib/views/main_window.js +++ b/src/app/lib/views/main_window.js @@ -511,7 +511,7 @@ showFileSelector: function(fileModel) { App.vent.trigger('about:close'); - App.vent.trigger('stream:stop'); + App.vent.trigger('stream:stopFS'); App.vent.trigger('player:close'); this.showChildView( 'FileSelector', From 06fa419a041e942dac1f8aaa51c930cfef7cbb66 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Tue, 25 Aug 2020 09:05:17 +0300 Subject: [PATCH 247/777] Get rid of some loading screen errors --- src/app/lib/views/player/loading.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/app/lib/views/player/loading.js b/src/app/lib/views/player/loading.js index 34d8728312..59924dc6ca 100644 --- a/src/app/lib/views/player/loading.js +++ b/src/app/lib/views/player/loading.js @@ -200,12 +200,14 @@ win.info('Loading torrent:', state); this.ui.stateTextDownload.text(i18n.__(state)); - if (streamInfo.get('src') && Settings.ipAddress) { - this.ui.stateTextStreamUrl.text(streamInfo.get('src').replace('127.0.0.1', Settings.ipAddress)); + if (streamInfo) { + if (streamInfo.get('src') && Settings.ipAddress) { + this.ui.stateTextStreamUrl.text(streamInfo.get('src').replace('127.0.0.1', Settings.ipAddress)); + } + this.ui.stateTextFilename.text(streamInfo.get('filename')); + this.ui.stateTextSize.text(Common.fileSize(streamInfo.get('size'))); + this.ui.stateTextDownloadedFormatted.text(Common.fileSize(streamInfo.get('downloaded')) + ' / '); } - this.ui.stateTextFilename.text(streamInfo.get('filename')); - this.ui.stateTextSize.text(Common.fileSize(streamInfo.get('size'))); - this.ui.stateTextDownloadedFormatted.text(Common.fileSize(streamInfo.get('downloaded')) + ' / '); this.listenTo(this.model.get('streamInfo'), 'change', this.onInfosUpdate); if (state === 'downloading') { From 1f4dc9fdebc8c2ffc8e3f0bfa888fe8e10b22412 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Tue, 25 Aug 2020 09:05:48 +0300 Subject: [PATCH 248/777] Get rid of some seedbox errors --- src/app/lib/views/seedbox.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/lib/views/seedbox.js b/src/app/lib/views/seedbox.js index 20418e9178..0180cc6647 100644 --- a/src/app/lib/views/seedbox.js +++ b/src/app/lib/views/seedbox.js @@ -241,7 +241,7 @@ const torrent = this.getTorrentFromEvent(e); if (torrent) { torrent.destroy(() => { - fs.unlinkSync(path.join(torrentsDir, torrent.infoHash)); + try { fs.unlinkSync(path.join(torrentsDir, torrent.infoHash)); } catch(err) {} rimraf(path.join(App.settings.tmpLocation, torrent.name), () => { }); }); @@ -277,7 +277,7 @@ } const infoHash = $elem.attr('id'); - const stats = fs.statSync(App.settings.tmpLocation + '/TorrentCache/' + infoHash); + try { const stats = fs.statSync(App.settings.tmpLocation + '/TorrentCache/' + infoHash); } catch(err) {} const torrent = App.WebTorrent.get(infoHash); if (wasJustSelected) { @@ -290,7 +290,7 @@ $('.seedbox-infos-title').text(torrent.name); $('.seedbox-downloaded').text(' ' + formatBytes(torrent.downloaded)); $('.seedbox-uploaded').text(' ' + formatBytes(torrent.uploaded)); - $('.seedbox-infos-date').text(stats.ctime); + try { $('.seedbox-infos-date').text(stats.ctime); } catch(err) {} $('.progress-bar').css('width', (torrent.progress * 100).toFixed(2) + '%'); $('.progress-percentage>span').text((torrent.progress * 100).toFixed(2) + '%'); From 451f8947e75106e4a18e88f2e9f6169f0133e5d8 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Tue, 25 Aug 2020 22:27:28 +0300 Subject: [PATCH 249/777] Prevent the lookForMetadata and (fetch)handleSubtitles run for an undetermined amount of time (they were running until they error'ed out, no timeout or anything. 20seconds is more than enough for each of them, especially for the lookForMetadata function. Beats getting stuck at connecting for 2 minutes up to forever, depending..) --- src/app/lib/streamer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/app/lib/streamer.js b/src/app/lib/streamer.js index a5bdee071a..0949c9b0cd 100644 --- a/src/app/lib/streamer.js +++ b/src/app/lib/streamer.js @@ -310,6 +310,10 @@ var fileName = this.torrentModel.get('video_file').name; + if (this.torrentModel) { + this.torrentModel.set('title', fileName); + } + App.Trakt.client.matcher.match({ filename: fileName, torrent: torrent.name @@ -348,12 +352,12 @@ this.handleSubtitles(); }.bind(this)).catch(function(err) { - win.error('An error occured while trying to get metadata', err); if (this.torrentModel) { this.torrentModel.set('title', fileName); } this.handleSubtitles(); }.bind(this)); + setTimeout(() => { if (!this.subtitleReady) { this.handleSubtitles(); }}, 20000); }, // set video file name & index @@ -653,6 +657,7 @@ } }.bind(this)); + setTimeout(() => { if (!this.subtitleReady) { this.subtitleReady = true; }}, 20000); return; }, From cc4eb08d35449a7a99636ad13bcf8d191a370a6a Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Thu, 27 Aug 2020 11:51:01 +0300 Subject: [PATCH 250/777] Fix UI scaling / old Big Picture mode --- src/app/lib/views/browser/generic_browser.js | 23 ++++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/app/lib/views/browser/generic_browser.js b/src/app/lib/views/browser/generic_browser.js index 3e71eef6ba..067ea9371a 100644 --- a/src/app/lib/views/browser/generic_browser.js +++ b/src/app/lib/views/browser/generic_browser.js @@ -52,15 +52,20 @@ if (!isNaN(startupTime)) { win.debug('Butter %s startup time: %sms', Settings.version, (window.performance.now() - startupTime).toFixed(3)); // started in database.js; startupTime = 'none'; - if ((AdvSettings.get('bigPicture') == null) || (AdvSettings.get('bigPicture') == false)) { - AdvSettings.set('bigPicture', 100); - } - if ((!AdvSettings.get('disclaimerAccepted')) && (ScreenResolution.QuadHD)) { - AdvSettings.set('bigPicture', 140); - win.zoomLevel = Math.log(1.4) / Math.log(1.2); - } - if (AdvSettings.get('bigPicture') != 100) { - win.zoomLevel = Math.log(AdvSettings.get('bigPicture')/100) / Math.log(1.2); + if (parseInt(AdvSettings.get('bigPicture'))) { + if (AdvSettings.get('bigPicture') != 100) { + win.zoomLevel = Math.log(AdvSettings.get('bigPicture')/100) / Math.log(1.2); + } else if (!AdvSettings.get('disclaimerAccepted') && ScreenResolution.QuadHD) { + AdvSettings.set('bigPicture', 140); + win.zoomLevel = Math.log(1.4) / Math.log(1.2); + } + } else { + if (ScreenResolution.QuadHD) { + AdvSettings.set('bigPicture', 140); + win.zoomLevel = Math.log(1.4) / Math.log(1.2); + } else { + AdvSettings.set('bigPicture', 100); + } } App.vent.trigger('app:started'); } From 25938ad5e1057229bbd3134a90772ea016fc7eb9 Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 4 Sep 2020 06:21:50 +0200 Subject: [PATCH 251/777] Updating Chromecast-api and yarn.lock Updating Chromecast-api to 0.3.4 --- package.json | 2 +- yarn.lock | 127 ++++++++------------------------------------------- 2 files changed, 19 insertions(+), 110 deletions(-) diff --git a/package.json b/package.json index 74a8c75c71..4b50087802 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "butter-provider": "0.11.0", "butter-sanitize": "^0.1.1", "butter-settings-popcorntime.io": "0.0.4", - "chromecast-api": "0.3.3", + "chromecast-api": "0.3.4", "defer-request": "0.0.3", "dlnacasts2": "0.2.0", "es6-object-assign": "^1.0.1", diff --git a/yarn.lock b/yarn.lock index 9364fe30ea..0a4ef8f374 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@fortawesome/fontawesome-free@^5.12.1": - version "5.12.1" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.12.1.tgz#2a98fea9fbb8a606ddc79a4680034e9d5591c550" - integrity sha512-ZtjIIFplxncqxvogq148C3hBLQE+W3iJ8E4UvJ09zIJUgzwLcROsWwFDErVSXY2Plzao5J9KUYNHKHMEUYDMKw== +"@fortawesome/fontawesome-free@^5.14.0": + version "5.14.0" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.14.0.tgz#a371e91029ebf265015e64f81bfbf7d228c9681f" + integrity sha512-OfdMsF+ZQgdKHP9jUbmDcRrP0eX90XXrsXIdyjLbkmSBzmMXPABB8eobUJtivaupucYaByz6WNe1PI1JuYm3qA== "@sindresorhus/is@^0.14.0": version "0.14.0" @@ -341,13 +341,6 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - arr-diff@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-1.1.0.tgz#687c32758163588fef7de7b36fabe495eb1a399a" @@ -837,10 +830,10 @@ boolbase@~1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= -bootstrap@~3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.3.7.tgz#5a389394549f23330875a3b150656574f8a9eb71" - integrity sha1-WjiTlFSfIzMIdaOxUGVldPip63E= +bootstrap@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.1.tgz#c3a347d419e289ad11f4033e3c4132b87c081d72" + integrity sha512-yN5oZVmRCwe5aKwzRj6736nSmKDX7pLYwsXiCj/EYmo16hODaBiT4En5btW/jhBF/seV+XMx3aYwukYC3A49DA== boxen@^1.1.0, boxen@^1.2.1: version "1.3.0" @@ -902,11 +895,6 @@ braces@^2.3.0, braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browser-request@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/browser-request/-/browser-request-0.3.3.tgz#9ece5b5aca89a29932242e18bf933def9876cc17" - integrity sha1-ns5bWsqJopkyJC4Yv5M975h2zBc= - browserify-package-json@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/browserify-package-json/-/browserify-package-json-1.0.1.tgz#98dde8aa5c561fd6d3fe49bbaa102b74b396fdea" @@ -1224,10 +1212,10 @@ chrome-net@^3.3.2, chrome-net@^3.3.3: dependencies: inherits "^2.0.1" -chromecast-api@0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/chromecast-api/-/chromecast-api-0.3.3.tgz#bc16bf7fbdc3f0401372d80df21c7f920f694eff" - integrity sha512-5khMTPbcm4XAI9tC9+AmBekc+JsyUvtWvYuJtHJtmj2psx0LaGoXYDgCm3veoBvoZ9hr8y0z9zbceymd49uutw== +chromecast-api@0.3.4: + version "0.3.4" + resolved "https://registry.yarnpkg.com/chromecast-api/-/chromecast-api-0.3.4.tgz#7c4a30f29dc8a76aa725da893c926dcfb616d647" + integrity sha512-b7+qyms+78cRMUiygPW/x8E5SL3gFRycmZDO5JWKYp0NS3wY4S620j0Xo6oQumQFMKUEvnVlEIPqPcDwzlam3A== dependencies: castv2-client "1.2.0" debug "^4.1.1" @@ -2608,14 +2596,6 @@ git-rev@^0.2.1: resolved "https://registry.yarnpkg.com/git-rev/-/git-rev-0.2.1.tgz#8ccbd2092b345bc2c9149548396df549646ca63f" integrity sha1-jMvSCSs0W8LJFJVIOW31SWRspj8= -gitlab@1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/gitlab/-/gitlab-1.4.1.tgz#58aef1e39804946620c5a8d67a49466910948182" - integrity sha1-WK7x45gElGYgxajWeklGaRCUgYI= - dependencies: - debug "*" - slumber ">=0.7.0" - glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -3753,10 +3733,10 @@ isurl@^1.0.0-alpha5: has-to-string-tag-x "^1.2.0" is-object "^1.0.1" -jquery@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.3.1.tgz#958ce29e81c9790f31be7792df5d4d95fc57fbca" - integrity sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg== +jquery@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5" + integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg== js-beautify@^1.7.5: version "1.8.9" @@ -4338,11 +4318,6 @@ lru@^3.0.0, lru@^3.1.0: dependencies: inherits "^2.0.1" -macos-release@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.0.0.tgz#7dddf4caf79001a851eb4fba7fb6034f251276ab" - integrity sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A== - magnet-uri@^5.1.3: version "5.2.4" resolved "https://registry.yarnpkg.com/magnet-uri/-/magnet-uri-5.2.4.tgz#7afe5b736af04445aff744c93a890a3710077688" @@ -4401,13 +4376,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown@0.5.x: - version "0.5.0" - resolved "https://registry.yarnpkg.com/markdown/-/markdown-0.5.0.tgz#28205b565a8ae7592de207463d6637dc182722b2" - integrity sha1-KCBbVlqK51kt4gdGPWY33BgnIrI= - dependencies: - nopt "~2.1.1" - matchdep@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" @@ -4922,13 +4890,6 @@ nopt@^4.0.1, nopt@~4.0.1: abbrev "1" osenv "^0.1.4" -nopt@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-2.1.2.tgz#6cccd977b80132a07731d6e8ce58c2c8303cf9af" - integrity sha1-bMzZd7gBMqB3MdbozljCyDA8+a8= - dependencies: - abbrev "1" - nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -5210,14 +5171,6 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-name@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.0.0.tgz#e1434dbfddb8e74b44c98b56797d951b7648a5d9" - integrity sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g== - dependencies: - macos-release "^2.0.0" - windows-release "^3.1.0" - os-tmpdir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5998,7 +5951,7 @@ request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@2.88.x, request@^2.72.0, request@^2.79.0, request@^2.88.0: +request@2.88.x, request@^2.79.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -6118,7 +6071,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.1, rimraf@~2.6.2: +rimraf@2.x.x, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== @@ -6399,18 +6352,6 @@ single-line-log@^1.0.1: dependencies: string-width "^1.0.1" -slumber@>=0.7.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/slumber/-/slumber-0.11.0.tgz#ee8408be72fd2a626cb6efd24c58201fd2bf408d" - integrity sha1-7oQIvnL9KmJstu/STFggH9K/QI0= - dependencies: - browser-request "^0.3.3" - debug "^2.2.0" - querystring "^0.2.0" - request "^2.72.0" - optionalDependencies: - yamljs "0.2" - smart-buffer@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" @@ -6546,11 +6487,6 @@ sprintf-js@>=1.0.3: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - sshpk@^1.7.0: version "1.15.2" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.15.2.tgz#c946d6bd9b1a39d0e8635763f5242d6ed6dcb629" @@ -6770,11 +6706,6 @@ stylus@0.54.5, stylus@^0.54.0, stylus@^0.54.5: sax "0.5.x" source-map "0.1.x" -subsrt@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subsrt/-/subsrt-1.0.0.tgz#1603442cd1467a0de8ea31d9646853b8e7b9b961" - integrity sha1-FgNELNFGeg3o6jHZZGhTuOe5uWE= - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -6839,13 +6770,6 @@ taskgroup@^4.0.5, taskgroup@^4.2.0: ambi "^2.2.0" csextends "^1.0.3" -temp@0.x.x: - version "0.9.0" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.0.tgz#61391795a11bd9738d4c4d7f55f012cb8f55edaa" - integrity sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ== - dependencies: - rimraf "~2.6.2" - "temp@github:adam-lynch/node-temp#remove_tmpdir_dep": version "0.8.3" resolved "https://codeload.github.com/adam-lynch/node-temp/tar.gz/279c1350cb7e4f02515d91da9e35d39a40774016" @@ -7709,13 +7633,6 @@ window-size@^0.1.4: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" integrity sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY= -windows-release@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.1.0.tgz#8d4a7e266cbf5a233f6c717dac19ce00af36e12e" - integrity sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA== - dependencies: - execa "^0.10.0" - winresourcer@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/winresourcer/-/winresourcer-0.9.0.tgz#0afca30f3c6e7458058d28a0b673c9dda622b9b5" @@ -7859,14 +7776,6 @@ yallist@^3.0.0, yallist@^3.0.2: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yamljs@0.2: - version "0.2.10" - resolved "https://registry.yarnpkg.com/yamljs/-/yamljs-0.2.10.tgz#481cc7c25ca73af59f591f0c96e3ce56c757a40f" - integrity sha1-SBzHwlynOvWfWR8MluPOVsdXpA8= - dependencies: - argparse "^1.0.7" - glob "^7.0.5" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" From f55f12ae1c3434b9f3babd8a9e8119b77b2bad2e Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 4 Sep 2020 06:26:20 +0200 Subject: [PATCH 252/777] Fix Chromecast detection and some controls Chromecast with .local in host name were filtered resulting in no detections in PT. Subtitles, Subtitles style, jump backward, forward were broken. Also now the chromecast go back to home screen when you stop or cancel a video. Probably other things to check, like the dropped subtitles files, but for now the main features are here --- src/app/language/en.json | 40 ++++++++++++++++++++++- src/app/lib/device/chromecast.js | 54 ++++++++++---------------------- 2 files changed, 55 insertions(+), 39 deletions(-) diff --git a/src/app/language/en.json b/src/app/language/en.json index 0342f214ec..a205fc7b1b 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -451,5 +451,43 @@ "Enable VPN": "Enable VPN", "Popularity": "Popularity", "Last Added": "Last Added", - "Seedbox": "Seedbox" + "Seedbox": "Seedbox", + "Cache Folder": "Cache Folder", + "adventure": "adventure", + "science-fiction": "science-fiction", + "superhero": "superhero", + "fantasy": "fantasy", + "Show cast": "Show cast", + "Health Good": "Health Good", + "crime": "crime", + "drama": "drama", + "thriller": "thriller", + "Health Medium": "Health Medium", + "Health Excellent": "Health Excellent", + "Right click to copy": "Right click to copy", + "Filename": "Filename", + "Stream Url": "Stream Url", + "Show playback controls": "Show playback controls", + "Downloading": "Downloading", + "Hide playback controls": "Hide playback controls", + "Poster Size": "Poster Size", + "100%": "100%", + "113%": "113%", + "125%": "125%", + "138%": "138%", + "150%": "150%", + "163%": "163%", + "175%": "175%", + "188%": "188%", + "200%": "200%", + "UI Scaling": "UI Scaling", + "(25% - 400%)": "(25% - 400%)", + "Show all available subtitles for the default subtitle language in the flag dropdown menu": "Show all available subtitles for the default subtitle language in the flag dropdown menu", + "Cache Folder Button": "Cache Folder Button", + "Enable remote control": "Enable remote control", + "Server": "Server", + "Custom API Server": "Custom API Server", + "Proxy Server": "Proxy Server", + "comedy": "comedy", + "musical": "musical" } \ No newline at end of file diff --git a/src/app/lib/device/chromecast.js b/src/app/lib/device/chromecast.js index 2c06ec0ce5..836cf11381 100644 --- a/src/app/lib/device/chromecast.js +++ b/src/app/lib/device/chromecast.js @@ -95,9 +95,11 @@ url: cover }, title: streamModel.get('title').substring(0,50), - subtitles: ['http:' + url.split(':')[1] + ':9999/data.vtt'], + subtitles: [{ + url: 'http:' + url.split(':')[1] + ':9999/data.vtt', + }], - textTrackStyle: { + subtitles_style: { backgroundColor: AdvSettings.get('subtitle_decoration') === 'Opaque Background' ? '#000000FF' : '#00000000', // color of background - see http://dev.w3.org/csswg/css-color/#hex-notation foregroundColor: AdvSettings.get('subtitle_color') + 'ff', // color of text - see http://dev.w3.org/csswg/css-color/#hex-notation edgeType: AdvSettings.get('subtitle_decoration') === 'Outline' ? 'OUTLINE' : 'NONE', // border of text - can be: "NONE", "OUTLINE", "DROP_SHADOW", "RAISED", "DEPRESSED" @@ -106,9 +108,9 @@ fontStyle: 'NORMAL', // can be: "NORMAL", "BOLD", "BOLD_ITALIC", "ITALIC", fontFamily: 'Helvetica', fontGenericFamily: 'SANS_SERIF', // can be: "SANS_SERIF", "MONOSPACED_SANS_SERIF", "SERIF", "MONOSPACED_SERIF", "CASUAL", "CURSIVE", "SMALL_CAPITALS", - windowColor: '#00000000', // see http://dev.w3.org/csswg/css-color/#hex-notation - windowRoundedCornerRadius: 0, // radius in px - windowType: 'NONE' // can be: "NONE", "NORMAL", "ROUNDED_CORNERS" + //windowColor: '#00000000', // see http://dev.w3.org/csswg/css-color/#hex-notation + //windowRoundedCornerRadius: 0, // radius in px + //windowType: 'NONE' // can be: "NONE", "NORMAL", "ROUNDED_CORNERS" } }; } else { @@ -140,44 +142,23 @@ device.removeAllListeners(); win.info('Chromecast: stopped. Listeners removed!'); }); + device.close(); //Back to ChromeCast home screen instead of black screen App.vent.trigger('stream:unserve_subtitles'); }, - seekTo: function (seconds) { - this.get('device').seekTo(seconds, function (err, status) { - if (err) { - win.error('Chromecast.seek error:', err); - } else { - win.debug('Chromecast, seeked to', seconds); - } - }); - }, - seekPercentage: function (percentage) { win.info('Chromecast: seek percentage %s%', percentage.toFixed(2)); var newCurrentTime = this.get('loadedMedia').duration / 100 * percentage; - this.seekTo(newCurrentTime); + this.get('device').seekTo(newCurrentTime); }, forward: function () { - var self = this; - this.get('device').status(function (err, status) { - if (err) { - return win.info('Chromecast.forward:Error', err); - } - self.seekTo(status.currentTime + 30); - }); + this.get('device').seek(30); }, backward: function () { - var self = this; - this.get('device').status(function (err, status) { - if (err) { - return win.info('Chromecast.backward:Error', err); - } - self.seekTo(status.currentTime - 30); - }); + this.get('device').seek(-30); }, unpause: function () { @@ -204,14 +185,11 @@ } }); -win.info('Scanning: Local Network for Chromecast devices'); -client.update(); -client.on('device', function (player) { - if (player.host.includes('.local')){ - return; - } - win.info('Found Chromecast Device Device: %s at %s', player.friendlyName, player.host); - collection.add(new Chromecast({ + win.info('Scanning: Local Network for Chromecast devices'); + client.update(); + client.on('device', function (player) { + win.info('Found Chromecast Device: %s at %s', player.friendlyName, player.host); + collection.add(new Chromecast({ device: player })); }); From 3a60bf583529c93d0e6352e596155dc77de14795 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 02:04:27 +0300 Subject: [PATCH 253/777] Add 'Export Database' button in the 'Update now' popup --- src/app/updater.js | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/app/updater.js b/src/app/updater.js index 543c418166..cf64f6f4cb 100644 --- a/src/app/updater.js +++ b/src/app/updater.js @@ -191,15 +191,36 @@ win.close(true); }; + var backupDB = function () { + var zip = new AdmZip(); + var databaseFiles = fs.readdirSync(App.settings['databaseLocation']); + var fileinput = document.querySelector('input[id=exportdatabase]'); + + $('#exportdatabase').on('change', function () { + var path = fileinput.value; + try { + databaseFiles.forEach(function (entry) { + zip.addLocalFile(App.settings['databaseLocation'] + '/' + entry); + }); + fs.writeFile(path + '/database.zip', zip.toBuffer(), function (err) { + this.alertMessageWait(i18n.__('Exporting Database...')); + win.info('Database exported to:', path); + }); + } catch (err) { + console.log(err); + } + }); + }; + App.vent.trigger('notification:show', new App.Model.Notification({ title: 'Update ' + (updateData.version || 'Hotfix') + ' Installed', - body: (updateData.description || 'Auto update'), + body: (updateData.description + '

    * Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings' || 'Auto update'), showRestart: false, type: 'info', - buttons: [{ - title: 'Update Now', - action: startWinUpdate - }] + buttons: [ + { title: '' + '', action: backupDB }, + { title: 'Update Now', action: startWinUpdate } + ] })); win.on('close', function () { startWinUpdate(); From 0b21af3d6a23b0b500a45160fd88dbbb46d32ff0 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 02:37:15 +0300 Subject: [PATCH 254/777] Update updater.js --- src/app/updater.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/updater.js b/src/app/updater.js index cf64f6f4cb..84ef6d2b6d 100644 --- a/src/app/updater.js +++ b/src/app/updater.js @@ -214,12 +214,12 @@ App.vent.trigger('notification:show', new App.Model.Notification({ title: 'Update ' + (updateData.version || 'Hotfix') + ' Installed', - body: (updateData.description + '

    * Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings' || 'Auto update'), + body: (updateData.description + '

    * ' + i18n.__('Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings') + '' || 'Auto update'), showRestart: false, type: 'info', buttons: [ - { title: '' + '', action: backupDB }, - { title: 'Update Now', action: startWinUpdate } + { title: '' + '', action: backupDB }, + { title: i18n.__('Update Now'), action: startWinUpdate } ] })); win.on('close', function () { From 3d06eefa038960d730b4ded76fd85f6050005278 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 02:41:05 +0300 Subject: [PATCH 255/777] Update en.json --- src/app/language/en.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/app/language/en.json b/src/app/language/en.json index a205fc7b1b..320e7d2bf1 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -489,5 +489,7 @@ "Custom API Server": "Custom API Server", "Proxy Server": "Proxy Server", "comedy": "comedy", - "musical": "musical" -} \ No newline at end of file + "musical": "musical", + "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings": "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings", + "Update Now": "Update Now" +} From 20166eb92475b13b2aa627d4f3f1a018f27ef510 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 04:08:42 +0300 Subject: [PATCH 256/777] Update updater.js --- src/app/updater.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/updater.js b/src/app/updater.js index 84ef6d2b6d..e1aff67f70 100644 --- a/src/app/updater.js +++ b/src/app/updater.js @@ -203,8 +203,8 @@ zip.addLocalFile(App.settings['databaseLocation'] + '/' + entry); }); fs.writeFile(path + '/database.zip', zip.toBuffer(), function (err) { - this.alertMessageWait(i18n.__('Exporting Database...')); win.info('Database exported to:', path); + document.getElementsByClassName('export-database')[0].innerHTML = i18n.__('Database Exported'); }); } catch (err) { console.log(err); From 36260c7e0da637f2c46c031c76975d318da10455 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 04:10:37 +0300 Subject: [PATCH 257/777] Update en.json --- src/app/language/en.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/app/language/en.json b/src/app/language/en.json index 320e7d2bf1..d73ec67e72 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -491,5 +491,6 @@ "comedy": "comedy", "musical": "musical", "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings": "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings", - "Update Now": "Update Now" + "Update Now": "Update Now", + "Database Exported": "Database Exported" } From 9889128b675631375bb2a440d5b14b94d9a51e3a Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 06:11:01 +0300 Subject: [PATCH 258/777] Update updater.js --- src/app/updater.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/updater.js b/src/app/updater.js index e1aff67f70..52de59d17c 100644 --- a/src/app/updater.js +++ b/src/app/updater.js @@ -214,7 +214,7 @@ App.vent.trigger('notification:show', new App.Model.Notification({ title: 'Update ' + (updateData.version || 'Hotfix') + ' Installed', - body: (updateData.description + '

    * ' + i18n.__('Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings') + '' || 'Auto update'), + body: (updateData.description + '

    * ' + i18n.__('Remember to Export your Database before updating in case its necessary to restore your Favorites, marked as watched or settings') + '' || 'Auto update'), showRestart: false, type: 'info', buttons: [ From 5190ab167ef7d75556e9d1198ff1b74122fbceb5 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 5 Sep 2020 06:11:32 +0300 Subject: [PATCH 259/777] Update en.json --- src/app/language/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/language/en.json b/src/app/language/en.json index d73ec67e72..37d0dfb6e7 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -490,7 +490,7 @@ "Proxy Server": "Proxy Server", "comedy": "comedy", "musical": "musical", - "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings": "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings", + "Remember to Export your Database before updating in case its necessary to restore your Favorites, marked as watched or settings": "Remember to Export your Database before updating in case its necessary to restore your Favorites, marked as watched or settings", "Update Now": "Update Now", "Database Exported": "Database Exported" } From 8fc94c47cd76ff69115d221c27ddfe25ff1738ef Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 11 Sep 2020 06:11:41 +0300 Subject: [PATCH 260/777] Fix adding custom subtitles in the native player --- src/app/vendor/videojshooks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/vendor/videojshooks.js b/src/app/vendor/videojshooks.js index 656f1d8e13..e17aaae7d2 100644 --- a/src/app/vendor/videojshooks.js +++ b/src/app/vendor/videojshooks.js @@ -280,7 +280,7 @@ vjs.TextTrack.prototype.load = function () { // Handles charset encoding var decode = function (dataBuff, language, callback) { - if(language.indexOf('|')!==-1){ + if(language && language.indexOf('|')!==-1){ language = language.substr(0,language.indexOf('|')); } From bbb32e08b54ec3441e92d165d68bdfa13a42c6bd Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 11 Sep 2020 18:36:22 +0200 Subject: [PATCH 261/777] WIP poppup to select which items to import WIP add a popup to select which items to import (setting, favorites, watched, ...) actually just the popup thing is done --- src/app/language/en.json | 12 ++++++++-- src/app/lib/views/settings_container.js | 27 ++++++++++++++++++---- src/app/styl/views/settings_container.styl | 6 ++--- src/app/templates/settings-container.tpl | 24 ++++++++++++------- 4 files changed, 52 insertions(+), 17 deletions(-) diff --git a/src/app/language/en.json b/src/app/language/en.json index 320e7d2bf1..5694d5ec56 100644 --- a/src/app/language/en.json +++ b/src/app/language/en.json @@ -491,5 +491,13 @@ "comedy": "comedy", "musical": "musical", "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings": "Remember to Export your Database before updating if you would like to be able to restore your Favorites, marked as watched and settings", - "Update Now": "Update Now" -} + "Update Now": "Update Now", + "Create account": "Create account", + "* %s stores an encrypted hash of your password in your local database": "* %s stores an encrypted hash of your password in your local database", + "Maximum number of active torrents": "Maximum number of active torrents", + "Import": "Import", + "Browse Directory to save to": "Browse Directory to save to", + "Home And Garden": "Home And Garden", + "No shows found...": "No shows found...", + "Health Bad": "Health Bad" +} \ No newline at end of file diff --git a/src/app/lib/views/settings_container.js b/src/app/lib/views/settings_container.js index 13b7b23aba..527871ab5a 100644 --- a/src/app/lib/views/settings_container.js +++ b/src/app/lib/views/settings_container.js @@ -40,8 +40,9 @@ 'change #tmpLocation': 'updateCacheDirectory', 'click #syncTrakt': 'syncTrakt', 'click .qr-code': 'generateQRcode', - 'click #qrcode-overlay': 'closeModal', - 'click #qrcode-close': 'closeModal' + 'click .import-db': 'openModal', + 'click .modal-overlay': 'closeModal', + 'click .modal-close': 'closeModal' }, onAttach: function () { @@ -165,8 +166,26 @@ $('#qrcode-modal, #qrcode-overlay').fadeIn(500); }, - closeModal: function () { - $('#qrcode-modal, #qrcode-overlay').fadeOut(500); + + openModal: function (e) { + console.log("e=", e); + var el = $(e.currentTarget); + console.log("el=", el); + + if (el[0].classList.contains('import-db')) { + $('#importdb-modal, #importdb-overlay').fadeIn(500); + } + }, + + closeModal: function (e) { + var el = $(e.currentTarget); + + //console.log("el=", el.attr('id')); + if (el.attr('id').startsWith('qrcode-')) { + $('#qrcode-modal, #qrcode-overlay').fadeOut(500); + } else if (el.attr('id').startsWith('importdb-')) { + $('#importdb-modal, #importdb-overlay').fadeOut(500); + } }, showHelp: function () { diff --git a/src/app/styl/views/settings_container.styl b/src/app/styl/views/settings_container.styl index da84dd2593..0de7713379 100644 --- a/src/app/styl/views/settings_container.styl +++ b/src/app/styl/views/settings_container.styl @@ -67,7 +67,7 @@ font-size 12px /* overlay styles, all needed */ - #qrcode-overlay + .modal-overlay display none position fixed top 0 @@ -77,7 +77,7 @@ background-color rgba(0,0,0,0.5) z-index 99998 - #qrcode-modal + .modal-content display none position fixed top 35% @@ -88,7 +88,7 @@ border 1px solid #000 padding 30px 10px 0px z-index 99999 /* 1px higher than the overlay layer */ - #qrcode-close + .modal-close color #000 cursor pointer position absolute diff --git a/src/app/templates/settings-container.tpl b/src/app/templates/settings-container.tpl index 8ae62611e5..e6325eeacb 100644 --- a/src/app/templates/settings-container.tpl +++ b/src/app/templates/settings-container.tpl @@ -463,9 +463,9 @@ <%= i18n.__("Generate Pairing QR code") %> -

    -
    - + + + <% if (Settings.activateSeedbox) { %> +
    + <% } else { %>
    + <% } %>
    -
    Servers
    +
    <%= i18n.__("Server") %>

    <%= i18n.__("Custom API Server") %>

    - + + + + +
    +
    + +
    +

    <%= i18n.__("Proxy Server") %>

    + diff --git a/yarn.lock b/yarn.lock index 346c7d306a..00cce9aa8f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -74,6 +74,13 @@ adm-zip@0.4.13: resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== +agent-base@6: + version "6.0.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.0.tgz#5d0101f19bbfaed39980b22ae866de153b93f09a" + integrity sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw== + dependencies: + debug "4" + airplay-protocol@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/airplay-protocol/-/airplay-protocol-2.0.2.tgz#b5b2a7137331f5545acbe196ba5693c13238fc5e" @@ -1534,6 +1541,13 @@ debug@2.6.9, debug@2.x.x, debug@^2.1.2, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3 dependencies: ms "2.0.0" +debug@4: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -3180,7 +3194,7 @@ ip-set@^1.0.0: dependencies: ip "^1.1.3" -ip@^1.0.1, ip@^1.1.0, ip@^1.1.3: +ip@1.1.5, ip@^1.0.1, ip@^1.1.0, ip@^1.1.3: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -6150,6 +6164,11 @@ slumber@>=0.7.0: optionalDependencies: yamljs "0.2" +smart-buffer@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" + integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6180,6 +6199,23 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" +socks-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz#7c0f364e7b1cf4a7a437e71253bed72e9004be60" + integrity sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA== + dependencies: + agent-base "6" + debug "4" + socks "^2.3.3" + +socks@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.3.3.tgz#01129f0a5d534d2b897712ed8aceab7ee65d78e3" + integrity sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA== + dependencies: + ip "1.1.5" + smart-buffer "^4.1.0" + source-map-resolve@^0.5.0: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" @@ -6905,11 +6941,16 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= -underscore@>=1.8.3, underscore@>=1.x.x: +underscore@>=1.8.3: version "1.9.1" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +underscore@^1.8.3: + version "1.10.2" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.10.2.tgz#73d6aa3668f3188e4adb0f1943bd12cfd7efaaaf" + integrity sha512-N4P+Q/BuyuEKFJ43B9gYuOj4TQUHXX+j2FqguVOpjkssLUUrnJofCcBccJSCoeturDoZU6GorDTHSvUDlSQbTg== + underscore@~1.4.4: version "1.4.4" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" From 6c81ce19dfe7621a500c7a302d2500e3b7656fd1 Mon Sep 17 00:00:00 2001 From: Daniel Bayley Date: Thu, 16 Apr 2020 00:42:25 +0100 Subject: [PATCH 009/777] Update Homebrew Casks --- casks/popcorn-time-beta.rb | 4 ++-- casks/popcorn-time.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/casks/popcorn-time-beta.rb b/casks/popcorn-time-beta.rb index 75d8c64f71..11c7b69bcc 100644 --- a/casks/popcorn-time-beta.rb +++ b/casks/popcorn-time-beta.rb @@ -1,6 +1,6 @@ cask 'popcorn-time-beta' do - version '0.4.1,398' - sha256 '8e8eb36e439dd051bb491f55dc20657c770532965c1c75f89f2391f49fb8292f' + version '0.4.3,410' + sha256 '842d3eab8b4eca619f922ac3b7a9a699fe94fa33df38a86b312582e787b3c8ae' ci = 'https://ci.popcorntime.app/job/Popcorn-Time-Desktop' url "#{ci}/lastStableBuild/artifact/build/Popcorn-Time-#{version.before_comma}_osx64.zip" diff --git a/casks/popcorn-time.rb b/casks/popcorn-time.rb index 4d2dadd1ae..9240af1a40 100644 --- a/casks/popcorn-time.rb +++ b/casks/popcorn-time.rb @@ -1,6 +1,6 @@ cask 'popcorn-time' do - version '0.4.1' - sha256 'a43ab9de2d09fbd6c7ce4b7171ea6c3561840a57e36481c7408a2e0e6542e9f5' + version '0.4.4' + sha256 '02bcf7fe9f5a9bc38bd01c7d9107fb138bf49857c182691cd9439fa7a4e9859b' url "https://get.popcorntime.app/build/Popcorn-Time-#{version}.pkg" appcast 'https://github.com/popcorn-official/popcorn-desktop/releases.atom' From 47d625d8622e035011665e576be7f4fe2f7d60f9 Mon Sep 17 00:00:00 2001 From: Oliver Hattshire Date: Thu, 16 Apr 2020 00:42:28 +0000 Subject: [PATCH 010/777] Fix travis builds --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 2f5e72296f..6ac36a6432 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - yarn install --ignore-engines - yarn build install: - - yarn gulp compress + - yarn gulp prepareUpdater after_success: - ls -ltr ./build/ deploy: From 57eed71aac8bc7d0af7f8059c5f56373538b91fb Mon Sep 17 00:00:00 2001 From: OHattsh Date: Thu, 16 Apr 2020 07:07:00 +0000 Subject: [PATCH 011/777] Enforce project's string styling (JSHint saturation) --- src/app/app.js | 378 +++++++++---------- src/app/bootstrap.js | 32 +- src/app/global.js | 58 +-- src/app/lib/config.js | 286 +++++++------- src/app/lib/device/generic.js | 72 ++-- src/app/lib/providers/generic.js | 30 +- src/app/lib/providers/watchlist.js | 56 +-- src/app/lib/views/browser/filter_bar.js | 474 ++++++++++++------------ src/app/lib/views/main_window.js | 448 +++++++++++----------- src/app/lib/views/movie_detail.js | 230 ++++++------ src/app/lib/views/play_control.js | 184 ++++----- src/app/lib/views/player/loading.js | 282 +++++++------- src/app/lib/views/seedbox.js | 2 +- src/app/lib/views/show_detail.js | 6 +- src/app/lib/views/vpn.js | 176 ++++----- src/app/settings.js | 242 ++++++------ 16 files changed, 1478 insertions(+), 1478 deletions(-) diff --git a/src/app/app.js b/src/app/app.js index 9f8c1d2b8f..5f197b3d0c 100644 --- a/src/app/app.js +++ b/src/app/app.js @@ -3,67 +3,67 @@ win.log = console.log.bind(console); win.debug = function () { var params = Array.prototype.slice.call(arguments, 1); params.unshift( - "%c[%cDEBUG%c] %c" + arguments[0], - "color: black;", - "color: green;", - "color: black;", - "color: blue;" + '%c[%cDEBUG%c] %c' + arguments[0], + 'color: black;', + 'color: green;', + 'color: black;', + 'color: blue;' ); console.debug.apply(console, params); }; win.info = function () { var params = Array.prototype.slice.call(arguments, 1); - params.unshift("[%cINFO%c] " + arguments[0], "color: blue;", "color: black;"); + params.unshift('[%cINFO%c] ' + arguments[0], 'color: blue;', 'color: black;'); console.info.apply(console, params); }; win.warn = function () { var params = Array.prototype.slice.call(arguments, 1); params.unshift( - "[%cWARNING%c] " + arguments[0], - "color: orange;", - "color: black;" + '[%cWARNING%c] ' + arguments[0], + 'color: orange;', + 'color: black;' ); console.warn.apply(console, params); }; win.error = function () { var params = Array.prototype.slice.call(arguments, 1); params.unshift( - "%c[%cERROR%c] " + arguments[0], - "color: black;", - "color: red;", - "color: black;" + '%c[%cERROR%c] ' + arguments[0], + 'color: black;', + 'color: red;', + 'color: black;' ); console.error.apply(console, params); fs.appendFileSync( - path.join(data_path, "logs.txt"), - "\n\n" + (arguments[0].stack || arguments[0]) + path.join(data_path, 'logs.txt'), + '\n\n' + (arguments[0].stack || arguments[0]) ); // log errors; }; -if (nw.App.fullArgv.indexOf("--reset") !== -1) { +if (nw.App.fullArgv.indexOf('--reset') !== -1) { localStorage.clear(); - fs.unlinkSync(path.join(data_path, "data/watched.db"), function (err) { + fs.unlinkSync(path.join(data_path, 'data/watched.db'), function (err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, "data/movies.db"), function (err) { + fs.unlinkSync(path.join(data_path, 'data/movies.db'), function (err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, "data/bookmarks.db"), function (err) { + fs.unlinkSync(path.join(data_path, 'data/bookmarks.db'), function (err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, "data/shows.db"), function (err) { + fs.unlinkSync(path.join(data_path, 'data/shows.db'), function (err) { if (err) { throw err; } }); - fs.unlinkSync(path.join(data_path, "data/settings.db"), function (err) { + fs.unlinkSync(path.join(data_path, 'data/settings.db'), function (err) { if (err) { throw err; } @@ -72,7 +72,7 @@ if (nw.App.fullArgv.indexOf("--reset") !== -1) { // Global App skeleton for backbone var App = new Marionette.Application({ - region: ".main-window-region" + region: '.main-window-region' }); _.extend(App, { Controller: {}, @@ -85,7 +85,7 @@ _.extend(App, { }); // Create old v2 style vent -App.vent = Backbone.Radio.channel("v2-vent"); +App.vent = Backbone.Radio.channel('v2-vent'); // set database App.db = Database; @@ -101,16 +101,16 @@ App.WebTorrent = new WebTorrent({ dht: true }); -fs.readFile("./.git.json", "utf8", function (err, json) { +fs.readFile('./.git.json', 'utf8', function (err, json) { if (!err) { App.git = JSON.parse(json); } }); // Menu for mac -if (os.platform() === "darwin") { +if (os.platform() === 'darwin') { var nativeMenuBar = new nw.Menu({ - type: "menubar" + type: 'menubar' }); nativeMenuBar.createMacBuiltin(Settings.projectName, { hideEdit: false, @@ -148,25 +148,25 @@ App.onBeforeStart = function (options) { // reset app width when the width is bigger than the available width if (screen.availWidth < width) { - win.info("Window too big, resetting width"); + win.info('Window too big, resetting width'); width = screen.availWidth; } // reset app height when the width is bigger than the available height if (screen.availHeight < height) { - win.info("Window too big, resetting height"); + win.info('Window too big, resetting height'); height = screen.availHeight; } // reset x when the screen width is smaller than the window x-position + the window width if (x < 0 || x + width > screen.width) { - win.info("Window out of view, recentering x-pos"); + win.info('Window out of view, recentering x-pos'); x = Math.round((screen.availWidth - width) / 2); } // reset y when the screen height is smaller than the window y-position + the window height if (y < 0 || y + height > screen.height) { - win.info("Window out of view, recentering y-pos"); + win.info('Window out of view, recentering y-pos'); y = Math.round((screen.availHeight - height) / 2); } @@ -198,7 +198,7 @@ var initApp = function () { try { App.showView(mainWindow); } catch (e) { - console.error("Couldn't start app: ", e, e.stack); + console.error('Couldn\'t start app: ', e, e.stack); } }; @@ -214,7 +214,7 @@ var deleteFolder = function (path) { var deleteCookies = function () { function removeCookie(cookie) { var lurl = - "http" + (cookie.secure ? "s" : "") + "://" + cookie.domain + cookie.path; + 'http' + (cookie.secure ? 's' : '') + '://' + cookie.domain + cookie.path; win.cookies.remove( { url: lurl, @@ -225,9 +225,9 @@ var deleteCookies = function () { if (!result.name) { result = result[0]; } - win.debug("cookie removed: " + result.name + " " + result.url); + win.debug('cookie removed: ' + result.name + ' ' + result.url); } else { - win.error("cookie removal failed"); + win.error('cookie removal failed'); } } ); @@ -235,7 +235,7 @@ var deleteCookies = function () { win.cookies.getAll({}, function (cookies) { if (cookies.length > 0) { - win.debug("Removing " + cookies.length + " cookies..."); + win.debug('Removing ' + cookies.length + ' cookies...'); for (var i = 0; i < cookies.length; i++) { removeCookie(cookies[i]); } @@ -244,22 +244,22 @@ var deleteCookies = function () { }; var delCache = function () { - window.indexedDB.deleteDatabase("cache"); + window.indexedDB.deleteDatabase('cache'); win.close(true); }; -win.on("resize", function (width, height) { +win.on('resize', function (width, height) { localStorage.width = Math.round(width); localStorage.height = Math.round(height); }); -win.on("move", function (x, y) { +win.on('move', function (x, y) { localStorage.posX = Math.round(x); localStorage.posY = Math.round(y); }); -win.on("enter-fullscreen", function () { - App.vent.trigger("window:focus"); +win.on('enter-fullscreen', function () { + App.vent.trigger('window:focus'); }); // Now this function is used via global keys (cmd+q and alt+f4) @@ -267,8 +267,8 @@ function close() { if (App.settings.deleteTmpOnClose) { deleteFolder(App.settings.tmpLocation); } - if (fs.existsSync(path.join(data_path, "logs.txt"))) { - fs.unlinkSync(path.join(data_path, "logs.txt")); + if (fs.existsSync(path.join(data_path, 'logs.txt'))) { + fs.unlinkSync(path.join(data_path, 'logs.txt')); } try { delCache(); @@ -278,7 +278,7 @@ function close() { } // Wipe the tmpFolder when closing the app (this frees up disk space) -win.on("close", function () { +win.on('close', function () { close(); }); @@ -296,103 +296,103 @@ String.prototype.endsWith = function (suffix) { return this.indexOf(suffix, this.length - suffix.length) !== -1; }; // Correct closing of the window using 'CMD+Q' on macOS -Mousetrap.bindGlobal(["alt+f4", "command+q"], function (e) { +Mousetrap.bindGlobal(['alt+f4', 'command+q'], function (e) { close(); }); // Developer Shortcuts -Mousetrap.bindGlobal(["shift+f12", "f12", "command+0"], function (e) { +Mousetrap.bindGlobal(['shift+f12', 'f12', 'command+0'], function (e) { win.showDevTools(); }); -Mousetrap.bindGlobal(["shift+f10", "f10", "command+9"], function (e) { - win.debug("Opening: " + App.settings.tmpLocation); +Mousetrap.bindGlobal(['shift+f10', 'f10', 'command+9'], function (e) { + win.debug('Opening: ' + App.settings.tmpLocation); nw.Shell.openItem(App.settings.tmpLocation); }); -Mousetrap.bind("mod+,", function (e) { - App.vent.trigger("about:close"); - App.vent.trigger("settings:show"); +Mousetrap.bind('mod+,', function (e) { + App.vent.trigger('about:close'); + App.vent.trigger('settings:show'); }); -Mousetrap.bindGlobal("f11", function (e) { +Mousetrap.bindGlobal('f11', function (e) { Settings.deleteTmpOnClose = false; - App.vent.trigger("restartButter"); + App.vent.trigger('restartButter'); }); -Mousetrap.bind(["?", "/", "'"], function (e) { +Mousetrap.bind(['?', '/', '\''], function (e) { e.preventDefault(); - App.vent.trigger("keyboard:toggle"); + App.vent.trigger('keyboard:toggle'); }); Mousetrap.bind( - "shift+up shift+up shift+down shift+down shift+left shift+right shift+left shift+right shift+b shift+a", + 'shift+up shift+up shift+down shift+down shift+left shift+right shift+left shift+right shift+b shift+a', function () { - var body = $("body"); + var body = $('body'); - if (body.hasClass("knm")) { - body.removeClass("knm"); + if (body.hasClass('knm')) { + body.removeClass('knm'); } else { - body.addClass("knm"); + body.addClass('knm'); } }, - "keydown" + 'keydown' ); Mousetrap.bindGlobal( - ["command+ctrl+f", "ctrl+alt+f"], + ['command+ctrl+f', 'ctrl+alt+f'], function (e) { e.preventDefault(); win.toggleFullscreen(); }, - "keydown" + 'keydown' ); Mousetrap.bind( - "shift+b", + 'shift+b', function (e) { if (!ScreenResolution.SD) { if (App.settings.bigPicture) { win.zoomLevel = Settings.noBigPicture || 0; - AdvSettings.set("bigPicture", false); + AdvSettings.set('bigPicture', false); } else { win.maximize(); - AdvSettings.set("noBigPicture", win.zoomLevel); - AdvSettings.set("bigPicture", true); + AdvSettings.set('noBigPicture', win.zoomLevel); + AdvSettings.set('bigPicture', true); var zoom = ScreenResolution.HD ? 2 : 3; win.zoomLevel = zoom; } } else { App.vent.trigger( - "notification:show", + 'notification:show', new App.Model.Notification({ - title: i18n.__("Big Picture Mode"), + title: i18n.__('Big Picture Mode'), body: i18n.__( - "Big Picture Mode is unavailable on your current screen resolution" + 'Big Picture Mode is unavailable on your current screen resolution' ), showRestart: false, - type: "error", + type: 'error', autoclose: true }) ); } }, - "keydown" + 'keydown' ); // Drag n' Drop Torrent Onto PT Window to start playing (ALPHA) window.ondragenter = function (e) { - $("#drop-mask").show(); + $('#drop-mask').show(); var showDrag = true; var timeout = -1; - $("#drop-mask").on("dragenter", function (e) { - $(".drop-indicator").show(); - win.debug("Drag init"); + $('#drop-mask').on('dragenter', function (e) { + $('.drop-indicator').show(); + win.debug('Drag init'); }); - $("#drop-mask").on("dragover", function (e) { + $('#drop-mask').on('dragover', function (e) { var showDrag = true; }); - $("#drop-mask").on("dragleave", function (e) { + $('#drop-mask').on('dragleave', function (e) { var showDrag = false; clearTimeout(timeout); timeout = setTimeout(function () { if (!showDrag) { - win.debug("Drag aborted"); - $(".drop-indicator").hide(); - $("#drop-mask").hide(); + win.debug('Drag aborted'); + $('.drop-indicator').hide(); + $('#drop-mask').hide(); } }, 100); }); @@ -404,7 +404,7 @@ var minimizeToTray = function () { var tray = new nw.Tray({ title: Settings.projectName, - icon: "src/app/images/icon.png" + icon: 'src/app/images/icon.png' }); var openFromTray = function () { @@ -418,8 +418,8 @@ var minimizeToTray = function () { var menu = new nw.Menu(); menu.append( new nw.MenuItem({ - type: "normal", - label: i18n.__("Restore"), + type: 'normal', + label: i18n.__('Restore'), click: function () { openFromTray(); } @@ -427,8 +427,8 @@ var minimizeToTray = function () { ); menu.append( new nw.MenuItem({ - type: "normal", - label: i18n.__("Close"), + type: 'normal', + label: i18n.__('Close'), click: function () { win.close(); } @@ -437,11 +437,11 @@ var minimizeToTray = function () { tray.menu = menu; - tray.on("click", function () { + tray.on('click', function () { openFromTray(); }); - nw.App.on("open", function (cmd) { + nw.App.on('open', function (cmd) { openFromTray(); }); }; @@ -449,11 +449,11 @@ var minimizeToTray = function () { var isVideo = function (file) { var ext = path.extname(file).toLowerCase(); switch (ext) { - case ".mp4": - case ".avi": - case ".mov": - case ".mkv": - case ".wmv": + case '.mp4': + case '.avi': + case '.mov': + case '.mkv': + case '.wmv': return true; default: return false; @@ -461,12 +461,12 @@ var isVideo = function (file) { }; var handleVideoFile = function (file) { - $(".spinner").show(); + $('.spinner').show(); // look for local subtitles var checkSubs = function () { var _ext = path.extname(file.name); - var toFind = file.path.replace(_ext, ".srt"); + var toFind = file.path.replace(_ext, '.srt'); if (fs.existsSync(path.join(toFind))) { return { @@ -480,33 +480,33 @@ var handleVideoFile = function (file) { // get subtitles from provider var getSubtitles = function (subdata) { return Q.Promise(function (resolve, reject) { - win.debug("Subtitles data request:", subdata); + win.debug('Subtitles data request:', subdata); - var subtitleProvider = App.Config.getProviderForType("subtitle"); + var subtitleProvider = App.Config.getProviderForType('subtitle'); subtitleProvider .fetch(subdata) .then(function (subs) { if (subs && Object.keys(subs).length > 0) { - win.info(Object.keys(subs).length + " subtitles found"); + win.info(Object.keys(subs).length + ' subtitles found'); resolve(subs); } else { - win.warn("No subtitles returned"); - if (Settings.subtitle_language !== "none") { + win.warn('No subtitles returned'); + if (Settings.subtitle_language !== 'none') { App.vent.trigger( - "notification:show", + 'notification:show', new App.Model.Notification({ - title: i18n.__("No subtitles found"), + title: i18n.__('No subtitles found'), body: i18n.__( - "Try again later or drop a subtitle in the player" + 'Try again later or drop a subtitle in the player' ), showRestart: false, - type: "warning", + type: 'warning', autoclose: true }) ); } - reject(new Error("No subtitles returned")); + reject(new Error('No subtitles returned')); } }) .catch(function (err) { @@ -523,8 +523,8 @@ var handleVideoFile = function (file) { return new Promise(function (resolve, reject) { // init our objects var playObj = { - src: "file://" + path.join(file.path), - type: "video/mp4" + src: 'file://' + path.join(file.path), + type: 'video/mp4' }; var sub_data = { filename: path.basename(file.path), @@ -538,19 +538,19 @@ var handleVideoFile = function (file) { .then(function (res) { return App.Trakt.client.images.get(res[res.type]).then(function (img) { switch (res.quality) { - case "SD": - res.quality = "480p"; + case 'SD': + res.quality = '480p'; break; - case "HD": - res.quality = "720p"; + case 'HD': + res.quality = '720p'; break; - case "FHD": - res.quality = "1080p"; + case 'FHD': + res.quality = '1080p'; break; default: } switch (res.type) { - case "movie": + case 'movie': playObj.title = res.movie.title; playObj.quality = res.quality; playObj.imdb_id = res.movie.ids.imdb; @@ -560,14 +560,14 @@ var handleVideoFile = function (file) { sub_data.imdbid = res.movie.ids.imdb; break; - case "episode": + case 'episode': playObj.title = res.show.title + - " - " + - i18n.__("Season %s", res.episode.season) + - ", " + - i18n.__("Episode %s", res.episode.number) + - " - " + + ' - ' + + i18n.__('Season %s', res.episode.season) + + ', ' + + i18n.__('Episode %s', res.episode.number) + + ' - ' + res.episode.title; playObj.quality = res.quality; playObj.season = res.episode.season; @@ -583,7 +583,7 @@ var handleVideoFile = function (file) { sub_data.episode = res.episode.number; break; default: - throw new Error("trakt.matcher.match failed"); + throw new Error('trakt.matcher.match failed'); } playObj.metadataCheckRequired = true; @@ -601,19 +601,19 @@ var handleVideoFile = function (file) { playObj.subtitle = subtitles; if (localsub !== null) { - playObj.defaultSubtitle = "local"; + playObj.defaultSubtitle = 'local'; } else { - playObj.defaultSubtitle = "none"; + playObj.defaultSubtitle = 'none'; } resolve(playObj); }) .catch(function (err) { - win.warn("trakt.matcher.match error:", err); + win.warn('trakt.matcher.match error:', err); var localsub = checkSubs(); if (localsub !== null) { - playObj.defaultSubtitle = "local"; + playObj.defaultSubtitle = 'local'; } else { - playObj.defaultSubtitle = "none"; + playObj.defaultSubtitle = 'none'; } if (!playObj.title) { @@ -626,22 +626,22 @@ var handleVideoFile = function (file) { resolve(playObj); }); }).then(function (play) { - $(".spinner").hide(); + $('.spinner').hide(); var localVideo = new Backbone.Model(play); // streamer model console.debug( - "Trying to play local file", - localVideo.get("src"), + 'Trying to play local file', + localVideo.get('src'), localVideo.attributes ); var tmpPlayer = App.Device.Collection.selected.attributes.id; - App.Device.Collection.setDevice("local"); - App.vent.trigger("stream:ready", localVideo); // start stream + App.Device.Collection.setDevice('local'); + App.vent.trigger('stream:ready', localVideo); // start stream App.Device.Collection.setDevice(tmpPlayer); - $(".eye-info-player").hide(); - $(".vjs-load-progress").css("width", "100%"); + $('.eye-info-player').hide(); + $('.vjs-load-progress').css('width', '100%'); }); }; @@ -651,24 +651,24 @@ var handleTorrent = function (torrent) { } catch (err) { // The player wasn't running } - App.Config.getProviderForType("torrentCache").resolve(torrent); + App.Config.getProviderForType('torrentCache').resolve(torrent); }; window.ondrop = function (e) { e.preventDefault(); - $("#drop-mask").hide(); - console.debug("Drag completed"); - $(".drop-indicator").hide(); + $('#drop-mask').hide(); + console.debug('Drag completed'); + $('.drop-indicator').hide(); var file = e.dataTransfer.files[0]; - var ext = path.extname((file || {}).name || "").toLowerCase(); + var ext = path.extname((file || {}).name || '').toLowerCase(); // TODO: Make a function 'isSubtitleFile' to avoid having many || everywhere if ( - (file != null && ext === ".torrent") || - ext === ".srt" || - ext === ".smi" || - ext === ".sami" + (file != null && ext === '.torrent') || + ext === '.srt' || + ext === '.smi' || + ext === '.sami' ) { fs.writeFile( path.join(App.settings.tmpLocation, file.name), @@ -676,14 +676,14 @@ window.ondrop = function (e) { function (err) { if (err) { App.PlayerView.closePlayer(); - window.alert(i18n.__("Error Loading File") + ": " + err); + window.alert(i18n.__('Error Loading File') + ': ' + err); } else { - if (file.name.indexOf(".torrent") !== -1) { + if (file.name.indexOf('.torrent') !== -1) { Settings.droppedTorrent = file.name; handleTorrent(path.join(App.settings.tmpLocation, file.name)); - } else if (ext === ".srt" || ext === ".smi" || ext === ".sami") { + } else if (ext === '.srt' || ext === '.smi' || ext === '.sami') { Settings.droppedSub = file.name; - App.vent.trigger("videojs:drop_sub"); + App.vent.trigger('videojs:drop_sub'); } } } @@ -691,7 +691,7 @@ window.ondrop = function (e) { } else if (file != null && isVideo(file.name)) { handleVideoFile(file); } else { - var data = e.dataTransfer.getData("text/plain"); + var data = e.dataTransfer.getData('text/plain'); Settings.droppedMagnet = data; handleTorrent(data); } @@ -700,12 +700,12 @@ window.ondrop = function (e) { }; // Paste Magnet Link to start stream -$(document).on("paste", function (e) { - if (e.target.nodeName === "INPUT" || e.target.nodeName === "TEXTAREA") { +$(document).on('paste', function (e) { + if (e.target.nodeName === 'INPUT' || e.target.nodeName === 'TEXTAREA') { return; } - var data = (e.originalEvent || e).clipboardData.getData("text/plain"); + var data = (e.originalEvent || e).clipboardData.getData('text/plain'); e.preventDefault(); Settings.droppedMagnet = data; @@ -714,7 +714,7 @@ $(document).on("paste", function (e) { }); // nwjs sdk flavor has an invasive context menu -$(document).on("contextmenu", function (e) { +$(document).on('contextmenu', function (e) { e.preventDefault(); }); @@ -723,18 +723,18 @@ var last_arg = nw.App.argv.pop(); if ( last_arg && - (last_arg.substring(0, 8) === "magnet:?" || - last_arg.substring(0, 7) === "http://" || - last_arg.endsWith(".torrent")) + (last_arg.substring(0, 8) === 'magnet:?' || + last_arg.substring(0, 7) === 'http://' || + last_arg.endsWith('.torrent')) ) { - App.vent.on("app:started", function () { + App.vent.on('app:started', function () { handleTorrent(last_arg); }); } // Play local files if (last_arg && isVideo(last_arg)) { - App.vent.on("app:started", function () { + App.vent.on('app:started', function () { var fileModel = { path: last_arg, name: /([^\\]+)$/.exec(last_arg)[1] @@ -753,16 +753,16 @@ const subscribeEvents = () => { try { const vpnStatus = VPNht.status(); - vpnStatus.on("connected", () => { - App.vent.trigger("vpn:connected"); + vpnStatus.on('connected', () => { + App.vent.trigger('vpn:connected'); }); - vpnStatus.on("disconnected", () => { - App.vent.trigger("vpn:disconnected"); + vpnStatus.on('disconnected', () => { + App.vent.trigger('vpn:disconnected'); }); - vpnStatus.on("error", error => { - console.log("ERROR", error); + vpnStatus.on('error', error => { + console.log('ERROR', error); }); subscribed = true; @@ -782,7 +782,7 @@ const checkVPNStatus = () => { VPNht.isConnected().then(isConnected => { console.log(isConnected); if (isConnected) { - App.vent.trigger("vpn:connected"); + App.vent.trigger('vpn:connected'); } }); } catch (error) { @@ -790,16 +790,16 @@ const checkVPNStatus = () => { } }; -App.vent.on("app:started", function () { +App.vent.on('app:started', function () { subscribeEvents(); checkVPNStatus(); }); -App.vent.on("vpn:open", function () { +App.vent.on('vpn:open', function () { try { const appInstalled = VPNht.isInstalled(); if (!appInstalled) { - App.vent.trigger("vpn:show"); + App.vent.trigger('vpn:show'); } else { VPNht.open(); subscribeEvents(); @@ -809,27 +809,27 @@ App.vent.on("vpn:open", function () { } }); -App.vent.on("vpn:install", function () { +App.vent.on('vpn:install', function () { try { const appInstalled = VPNht.isInstalled(); if (!appInstalled) { VPNht.install().then(installer => { - installer.on("download", data => { + installer.on('download', data => { if (data && data.percent) { - App.vent.trigger("vpn:installProgress", data.percent); + App.vent.trigger('vpn:installProgress', data.percent); } }); - installer.on("downloaded", () => { - App.vent.trigger("vpn:downloaded"); + installer.on('downloaded', () => { + App.vent.trigger('vpn:downloaded'); }); - installer.on("installed", () => { + installer.on('installed', () => { VPNht.open(); subscribeEvents(); }); - installer.on("error", data => { + installer.on('error', data => { console.log(data); }); }); @@ -842,19 +842,19 @@ App.vent.on("vpn:install", function () { } }); -nw.App.on("open", function (cmd) { +nw.App.on('open', function (cmd) { var file; - if (os.platform() === "win32") { + if (os.platform() === 'win32') { file = cmd.split('"'); file = file[file.length - 2]; } else { - file = cmd.split(" /"); + file = cmd.split(' /'); file = file[file.length - 1]; - file = "/" + file; + file = '/' + file; } if (file) { - win.debug("File loaded:", file); + win.debug('File loaded:', file); if (isVideo(file)) { var fileModel = { @@ -862,42 +862,42 @@ nw.App.on("open", function (cmd) { name: /([^\\]+)$/.exec(file)[1] }; handleVideoFile(fileModel); - } else if (file.endsWith(".torrent")) { + } else if (file.endsWith('.torrent')) { handleTorrent(file); } } }); // When win.focus() doesn't do it's job right, play dirty. -App.vent.on("window:focus", function () { +App.vent.on('window:focus', function () { win.setAlwaysOnTop(true); win.focus(); win.setAlwaysOnTop(Settings.alwaysOnTop); }); // -f argument to open in fullscreen -if (nw.App.fullArgv.indexOf("-f") !== -1) { +if (nw.App.fullArgv.indexOf('-f') !== -1) { win.enterFullscreen(); } // -m argument to open minimized to tray -if (nw.App.fullArgv.indexOf("-m") !== -1) { - App.vent.on("app:started", function () { +if (nw.App.fullArgv.indexOf('-m') !== -1) { + App.vent.on('app:started', function () { minimizeToTray(); }); } // On uncaught exceptions, log to console. -process.on("uncaughtException", function (err) { +process.on('uncaughtException', function (err) { try { - if (err.message.indexOf("[sprintf]") !== -1) { + if (err.message.indexOf('[sprintf]') !== -1) { var currentLocale = App.Localization.langcodes[i18n.getLocale()].nativeName; - AdvSettings.set("language", "en"); - i18n.setLocale("en"); - App.vent.trigger("movies:list"); - $(".notification_alert") + AdvSettings.set('language', 'en'); + i18n.setLocale('en'); + App.vent.trigger('movies:list'); + $('.notification_alert') .show() - .html("An error occured with the localization in " + currentLocale) + .html('An error occured with the localization in ' + currentLocale) .delay(4000) .fadeOut(400); } diff --git a/src/app/bootstrap.js b/src/app/bootstrap.js index 1e850f524e..aae47cfa22 100644 --- a/src/app/bootstrap.js +++ b/src/app/bootstrap.js @@ -1,14 +1,14 @@ (function(App) { - "use strict"; + 'use strict'; App.start(); /* load all the things ! */ - var Q = require("q"); - var fs = require("fs"); + var Q = require('q'); + var fs = require('fs'); function loadLocalProviders() { - var appPath = ""; - var providerPath = "./src/app/lib/providers/"; + var appPath = ''; + var providerPath = './src/app/lib/providers/'; var files = fs.readdirSync(providerPath); @@ -22,18 +22,18 @@ return null; } - win.info("loading local provider", file); + win.info('loading local provider', file); var q = Q.defer(); - var head = document.getElementsByTagName("head")[0]; - var script = document.createElement("script"); + var head = document.getElementsByTagName('head')[0]; + var script = document.createElement('script'); - script.type = "text/javascript"; - script.src = "lib/providers/" + file; + script.type = 'text/javascript'; + script.src = 'lib/providers/' + file; script.onload = function() { - win.info("loaded", file); + win.info('loaded', file); q.resolve(file); }; @@ -47,10 +47,10 @@ } function loadProvidersJSON(fn) { - App.Npm = require("../../package.json"); + App.Npm = require('../../package.json'); return App.Npm.providers.map(function(providerPath) { - win.info("loading npm", providerPath); + win.info('loading npm', providerPath); return loadFromNPM(`./${providerPath}`, fn); }); } @@ -61,14 +61,14 @@ } function loadFromPackageJSON(regex, fn) { - App.Npm = require("../../package.json"); + App.Npm = require('../../package.json'); var packages = Object.keys(App.Npm.dependencies).filter(function(p) { return p.match(regex); }); return packages.map(function(name) { - win.info("loading npm", regex, name); + win.info('loading npm', regex, name); return loadFromNPM(name, fn); }); } @@ -127,6 +127,6 @@ return providers; }) .then(function(providers) { - win.info("loaded", providers); + win.info('loaded', providers); }); })(window.App); diff --git a/src/app/global.js b/src/app/global.js index a2ecb44c89..ec4c89f2e0 100644 --- a/src/app/global.js +++ b/src/app/global.js @@ -1,42 +1,42 @@ /** Global variables **/ -var _ = require("underscore"), - async = require("async"), - inherits = require("util").inherits, - Q = require("q"), +var _ = require('underscore'), + async = require('async'), + inherits = require('util').inherits, + Q = require('q'), // Machine readable - os = require("os"), - moment = require("moment"), - crypt = require("crypto"), - semver = require("semver"), + os = require('os'), + moment = require('moment'), + crypt = require('crypto'), + semver = require('semver'), // Files - fs = require("fs"), - path = require("path"), - mkdirp = require("mkdirp"), - rimraf = require("rimraf"), + fs = require('fs'), + path = require('path'), + mkdirp = require('mkdirp'), + rimraf = require('rimraf'), // Compression - tar = require("tar"), - AdmZip = require("adm-zip"), - zlib = require("zlib"), + tar = require('tar'), + AdmZip = require('adm-zip'), + zlib = require('zlib'), // Encoding/Decoding - charsetDetect = require("jschardet"), - iconv = require("iconv-lite"), + charsetDetect = require('jschardet'), + iconv = require('iconv-lite'), // GUI win = nw.Window.get(), data_path = nw.App.dataPath, - i18n = require("i18n"), + i18n = require('i18n'), // Connectivity - url = require("url"), - tls = require("tls"), - http = require("http"), - request = require("request"), + url = require('url'), + tls = require('tls'), + http = require('http'), + request = require('request'), // Web - querystring = require("querystring"), - URI = require("urijs"), - Trakt = require("trakt.tv"), + querystring = require('querystring'), + URI = require('urijs'), + Trakt = require('trakt.tv'), // Torrent engines - WebTorrent = require("webtorrent"), - torrentCollection = require("torrentcollection2"), + WebTorrent = require('webtorrent'), + torrentCollection = require('torrentcollection2'), // VPN - VPNht = require("@vpnht/sdk"), + VPNht = require('@vpnht/sdk'), // NodeJS - child = require("child_process"); + child = require('child_process'); diff --git a/src/app/lib/config.js b/src/app/lib/config.js index e4c1bb2cd8..ce68a37a86 100644 --- a/src/app/lib/config.js +++ b/src/app/lib/config.js @@ -1,170 +1,170 @@ (function(App) { - "use strict"; + 'use strict'; var Config = { title: Settings.projectName, platform: process.platform, genres: [ - "All", - "Action", - "Adventure", - "Animation", - "Biography", - "Comedy", - "Crime", - "Documentary", - "Drama", - "Family", - "Fantasy", - "Film-Noir", - "History", - "Horror", - "Music", - "Musical", - "Mystery", - "Romance", - "Sci-Fi", - "Short", - "Sport", - "Thriller", - "War", - "Western" + 'All', + 'Action', + 'Adventure', + 'Animation', + 'Biography', + 'Comedy', + 'Crime', + 'Documentary', + 'Drama', + 'Family', + 'Fantasy', + 'Film-Noir', + 'History', + 'Horror', + 'Music', + 'Musical', + 'Mystery', + 'Romance', + 'Sci-Fi', + 'Short', + 'Sport', + 'Thriller', + 'War', + 'Western' ], sorters: [ - "trending", - "popularity", - "last added", - "year", - "title", - "rating" + 'trending', + 'popularity', + 'last added', + 'year', + 'title', + 'rating' ], - sorters_tv: ["trending", "popularity", "updated", "year", "name", "rating"], + sorters_tv: ['trending', 'popularity', 'updated', 'year', 'name', 'rating'], - sorters_fav: ["watched items", "year", "title", "rating"], + sorters_fav: ['watched items', 'year', 'title', 'rating'], - sorters_anime: ["popularity", "name", "year"], + sorters_anime: ['popularity', 'name', 'year'], - types_anime: ["All", "Movies", "TV", "OVA", "ONA"], + types_anime: ['All', 'Movies', 'TV', 'OVA', 'ONA'], - types_fav: ["All", "Movies", "TV", "Anime"], + types_fav: ['All', 'Movies', 'TV', 'Anime'], genres_anime: [ - "All", - "Action", - "Adventure", - "Cars", - "Comedy", - "Dementia", - "Demons", - "Drama", - "Ecchi", - "Fantasy", - "Game", - "Harem", - "Historical", - "Horror", - "Josei", - "Kids", - "Magic", - "Martial Arts", - "Mecha", - "Military", - "Music", - "Mystery", - "Parody", - "Police", - "Psychological", - "Romance", - "Samurai", - "School", - "Sci-Fi", - "Seinen", - "Shoujo", - "Shoujo Ai", - "Shounen", - "Shounen Ai", - "Slice of Life", - "Space", - "Sports", - "Super Power", - "Supernatural", - "Thriller", - "Vampire" + 'All', + 'Action', + 'Adventure', + 'Cars', + 'Comedy', + 'Dementia', + 'Demons', + 'Drama', + 'Ecchi', + 'Fantasy', + 'Game', + 'Harem', + 'Historical', + 'Horror', + 'Josei', + 'Kids', + 'Magic', + 'Martial Arts', + 'Mecha', + 'Military', + 'Music', + 'Mystery', + 'Parody', + 'Police', + 'Psychological', + 'Romance', + 'Samurai', + 'School', + 'Sci-Fi', + 'Seinen', + 'Shoujo', + 'Shoujo Ai', + 'Shounen', + 'Shounen Ai', + 'Slice of Life', + 'Space', + 'Sports', + 'Super Power', + 'Supernatural', + 'Thriller', + 'Vampire' ], genres_tv: [ - "All", - "Action", - "Adventure", - "Animation", - "Children", - "Comedy", - "Crime", - "Documentary", - "Drama", - "Family", - "Fantasy", - "Game Show", - "Home and Garden", - "Horror", - "Mini Series", - "Mystery", - "News", - "Reality", - "Romance", - "Science Fiction", - "Soap", - "Special Interest", - "Sport", - "Suspense", - "Talk Show", - "Thriller", - "Western" + 'All', + 'Action', + 'Adventure', + 'Animation', + 'Children', + 'Comedy', + 'Crime', + 'Documentary', + 'Drama', + 'Family', + 'Fantasy', + 'Game Show', + 'Home and Garden', + 'Horror', + 'Mini Series', + 'Mystery', + 'News', + 'Reality', + 'Romance', + 'Science Fiction', + 'Soap', + 'Special Interest', + 'Sport', + 'Suspense', + 'Talk Show', + 'Thriller', + 'Western' ], genres_indie: [ - "All", - "Action", - "Adventure", - "Animation", - "Biography", - "Comedy", - "Crime", - "Documentary", - "Drama", - "Family", - "Fantasy", - "Film-Noir", - "History", - "Horror", - "Music", - "Musical", - "Mystery", - "Romance", - "Sci-Fi", - "Short", - "Sport", - "Thriller", - "War", - "Western" + 'All', + 'Action', + 'Adventure', + 'Animation', + 'Biography', + 'Comedy', + 'Crime', + 'Documentary', + 'Drama', + 'Family', + 'Fantasy', + 'Film-Noir', + 'History', + 'Horror', + 'Music', + 'Musical', + 'Mystery', + 'Romance', + 'Sci-Fi', + 'Short', + 'Sport', + 'Thriller', + 'War', + 'Western' ], - sorters_indie: ["popularity", "updated", "year", "alphabet", "rating"], + sorters_indie: ['popularity', 'updated', 'year', 'alphabet', 'rating'], types_indie: [], cache: { - name: "cachedb", - version: "1.7", - tables: ["subtitle"], - desc: "Cache database", + name: 'cachedb', + version: '1.7', + tables: ['subtitle'], + desc: 'Cache database', size: 10 * 1024 * 1024 }, cachev2: { - name: "cache", + name: 'cache', version: 5, - tables: ["metadata"] + tables: ['metadata'] }, getTabTypes: function() { @@ -179,8 +179,8 @@ }), function(p) { if ( - (p.name === "Anime" && Settings.animeTabDisable) || - p.name === "Indie" + (p.name === 'Anime' && Settings.animeTabDisable) || + p.name === 'Indie' ) { return false; } @@ -188,17 +188,17 @@ return p.name; } ), - "order" + 'order' ); }, getProviderForType: function(type) { - if (type === "indie") { + if (type === 'indie') { return null; } var provider = Settings.providers[type]; - if (typeof provider !== "string") { + if (typeof provider !== 'string') { if (provider && provider.uri) { provider = provider.uri; } @@ -206,11 +206,11 @@ if (!provider) { win.warn( - "Provider type: '%s' isn't defined in App.Config.providers", + 'Provider type: "%s" isn\'t defined in App.Config.providers', type ); return; - } else if (provider instanceof Array || typeof provider === "object") { + } else if (provider instanceof Array || typeof provider === 'object') { return _.map(provider, function(t) { return App.Providers.get(t); }); @@ -232,7 +232,7 @@ }); return _.map(ret, function(v, k) { - return k.concat(v > 1 ? ":" + v : ""); + return k.concat(v > 1 ? ':' + v : ''); }); } }; diff --git a/src/app/lib/device/generic.js b/src/app/lib/device/generic.js index 2f836caa57..55968e1ecf 100644 --- a/src/app/lib/device/generic.js +++ b/src/app/lib/device/generic.js @@ -1,11 +1,11 @@ (function(App) { - "use strict"; + 'use strict'; var self; // Supports both IPv4 and IPv6 comparison var _sequentialPartsInCommon = function(ip1, ip2) { - var separator = ip1.indexOf(".") > -1 ? "." : ":"; + var separator = ip1.indexOf('.') > -1 ? '.' : ':'; var ip2Parts = ip2.split(separator), partsCount = 0; ip1.split(separator).every(function(ip1Part, idx) { @@ -26,13 +26,13 @@ var Device = Backbone.Model.extend({ defaults: { - id: "local", - type: "local", - typeFamily: "internal", - name: "Popcorn Time" + id: 'local', + type: 'local', + typeFamily: 'internal', + name: 'Popcorn Time' }, play: function(streamModel) { - App.vent.trigger("stream:local", streamModel); + App.vent.trigger('stream:local', streamModel); }, getID: function() { return this.id; @@ -40,23 +40,23 @@ }); var DeviceCollection = Backbone.Collection.extend({ - selected: "local", + selected: 'local', initialize: function() { - App.vent.on("device:list", this.list); - App.vent.on("device:pause", this.pause); - App.vent.on("device:unpause", this.unpause); - App.vent.on("device:stop", this.stop); - App.vent.on("device:forward", this.forward); - App.vent.on("device:backward", this.backward); - App.vent.on("device:seek", this.seek); - App.vent.on("device:seekTo", this.seekTo); - App.vent.on("device:seekPercentage", this.seekPercentage); - App.vent.on("device:status:update", this.updateStatus); + App.vent.on('device:list', this.list); + App.vent.on('device:pause', this.pause); + App.vent.on('device:unpause', this.unpause); + App.vent.on('device:stop', this.stop); + App.vent.on('device:forward', this.forward); + App.vent.on('device:backward', this.backward); + App.vent.on('device:seek', this.seek); + App.vent.on('device:seekTo', this.seekTo); + App.vent.on('device:seekPercentage', this.seekPercentage); + App.vent.on('device:status:update', this.updateStatus); self = this; }, list: function() { _.each(self.models, function(device) { - App.vent.trigger("device:add", device); + App.vent.trigger('device:add', device); }); }, pause: function() { @@ -95,7 +95,7 @@ * If the device is external we correct src IP to the * best matching IP among all network adapters. Supports IPv4 and IPv6. */ - if (this.selected.get("typeFamily") === "external") { + if (this.selected.get('typeFamily') === 'external') { //console.warn('External Device ', this.selected); var ips = [], ifaces = os.networkInterfaces(); @@ -106,13 +106,13 @@ } }); } - var deviceIp = this.selected.get("address"); - win.info("Device IP: " + deviceIp); - win.info("Available IPs: " + JSON.stringify(ips)); + var deviceIp = this.selected.get('address'); + win.info('Device IP: ' + deviceIp); + win.info('Available IPs: ' + JSON.stringify(ips)); var srcIp = _getClosestIP(ips, deviceIp); - win.info("%s picked for external playback", srcIp); + win.info('%s picked for external playback', srcIp); streamModel.attributes.src = streamModel.attributes.src.replace( - "127.0.0.1", + '127.0.0.1', srcIp ); } @@ -127,16 +127,16 @@ }); var collection = new DeviceCollection(new Device()); - collection.setDevice("local"); + collection.setDevice('local'); var ChooserView = Marionette.View.extend({ - template: "#player-chooser-tpl", + template: '#player-chooser-tpl', events: { - "click .playerchoicemenu li a": "selectPlayer" + 'click .playerchoicemenu li a': 'selectPlayer' }, onRender: function() { - var id = this.collection.selected.get("id").replace("'", "\\'"); - var el = $(".playerchoicemenu li#player-" + id + " a"); + var id = this.collection.selected.get('id').replace('\'', '\\\''); + var el = $('.playerchoicemenu li#player-' + id + ' a'); this._selectPlayer(el); }, selectPlayer: function(e) { @@ -144,13 +144,13 @@ }, _selectPlayer: function(el) { var player = el - .parent("li") - .attr("id") - .replace("player-", ""); + .parent('li') + .attr('id') + .replace('player-', ''); collection.setDevice(player); - $(".playerchoicemenu li a.active").removeClass("active"); - el.addClass("active"); - $(".imgplayerchoice").attr("src", el.children("img").attr("src")); + $('.playerchoicemenu li a.active').removeClass('active'); + el.addClass('active'); + $('.imgplayerchoice').attr('src', el.children('img').attr('src')); } }); diff --git a/src/app/lib/providers/generic.js b/src/app/lib/providers/generic.js index c2044435e7..f1e030c140 100644 --- a/src/app/lib/providers/generic.js +++ b/src/app/lib/providers/generic.js @@ -1,10 +1,10 @@ (function(App) { - "use strict"; - var fs = require("fs"); + 'use strict'; + var fs = require('fs'); var cache = (App.Providers._cache = {}); var registry = (App.Providers._registry = {}); - App.Providers.Generic = require("butter-provider"); + App.Providers.Generic = require('butter-provider'); function updateProviderConnection (server, proxy) { for (let provider in cache) { @@ -17,7 +17,7 @@ function delProvider(name) { if (cache[name]) { - win.info("Delete provider cache", name); + win.info('Delete provider cache', name); return delete cache[name]; } } @@ -26,21 +26,21 @@ var name = PO.prototype.config ? PO.prototype.config.name : null; if (!name) { - return win.error(PO, PO.prototype.config, "doesnt have a name"); + return win.error(PO, PO.prototype.config, 'doesn\'t have a name'); } if (registry[name]) { return win.error( - "double definition of", + 'double definition of', name, PO, PO.prototype.config, - "is the same as", + 'is the same as', registry[name] ); } - win.debug("added", name, "to provider registry"); + win.debug('added', name, 'to provider registry'); registry[name] = PO; return name; @@ -55,7 +55,7 @@ /* XXX(xaiki): this is for debug purposes, will it bite us later ? */ /* XXX(vankasteelj): it did. */ win.error( - "asked for an empty provider, this should never happen, dumping provider cache and registry", + 'asked for an empty provider, this should never happen, dumping provider cache and registry', cache, registry ); @@ -65,27 +65,27 @@ var config = App.Providers.Generic.parseArgs(name); if (cache[name]) { - win.info("Returning cached provider", name); + win.info('Returning cached provider', name); return cache[name]; } var provider = getProviderFromRegistry(config.name); if (!provider) { - if (installProvider(require("butter-provider-" + config.name))) { + if (installProvider(require('butter-provider-' + config.name))) { win.warn( - "I loaded", + 'I loaded', config.name, - "from npm but you didn't add it to your package.json" + 'from npm but you didn\'t add it to your package.json' ); provider = getProviderFromRegistry(config.name); } else { - win.error("couldn't find provider", config.name); + win.error('couldn\'t find provider', config.name); return null; } } - win.info("Spawning new provider", name, config); + win.info('Spawning new provider', name, config); var p = (cache[name] = new provider(config)); //HACK(xaiki): set the provider name in the returned object. diff --git a/src/app/lib/providers/watchlist.js b/src/app/lib/providers/watchlist.js index 1e3c38db52..de9ea79aa8 100644 --- a/src/app/lib/providers/watchlist.js +++ b/src/app/lib/providers/watchlist.js @@ -1,7 +1,7 @@ /* globals moment*/ (function(App) { - "use strict"; - var memoize = require("memoizee"); + 'use strict'; + var memoize = require('memoizee'); var Watchlist = function() { this.fetch = memoize(this._fetch.bind(this), { maxAge: 30 * 1000, // 30sec @@ -11,7 +11,7 @@ }; Watchlist.prototype.constructor = Watchlist; Watchlist.prototype.config = { - name: "Watchlist" + name: 'Watchlist' }; var rearrange = function(items) { @@ -64,19 +64,19 @@ if ( moment(item.next_episode.first_aired) .fromNow() - .indexOf("in") !== -1 + .indexOf('in') !== -1 ) { console.log( '"%s" is not released yet, not showing', item.show.title + - " " + + ' ' + item.next_episode.season + - "x" + + 'x' + item.next_episode.number ); } else { var show = item.show; - show.type = "show"; + show.type = 'show'; show.episode = item.next_episode.number; show.season = item.next_episode.season; show.episode_title = item.next_episode.title; @@ -96,7 +96,7 @@ if ( moment(item.movie.released) .fromNow() - .indexOf("in") !== -1 + .indexOf('in') !== -1 ) { console.log( '"%s" is not released yet, not showing', @@ -104,7 +104,7 @@ ); } else { var movie = item.movie; - movie.type = "movie"; + movie.type = 'movie'; movie.listed_at = item.listed_at; movie.imdb_id = item.movie.ids.imdb; movie.rating = item.movie.rating; @@ -152,8 +152,8 @@ watchlist = watchlist.concat(tv.shows); return App.Trakt.client.sync.watchlist.get({ - extended: "full", - type: "movies" + extended: 'full', + type: 'movies' }); }) .then(function(movies) { @@ -217,7 +217,7 @@ }; Watchlist.prototype.extractIds = function(items) { - return _.pluck(items, "imdb_id"); + return _.pluck(items, 'imdb_id'); }; Watchlist.prototype.detail = function(id, data) { @@ -226,13 +226,13 @@ synopsis: data.overview }; - if (data.type === "movie") { + if (data.type === 'movie') { return Database.getMovie(data.imdb_id).then(details => { return Object.assign({}, data, details); }); } - var tvShowProvider = App.Config.getProviderForType("tvshow"); + var tvShowProvider = App.Config.getProviderForType('tvshow'); return tvShowProvider[0].detail(data.imdb_id, data).then(details => { return Object.assign({}, data, details); }); @@ -242,23 +242,23 @@ return new Promise(function(resolve, reject) { if ( filters && - typeof filters !== "function" && + typeof filters !== 'function' && (filters.force || filters.update) ) { if (filters.update && localStorage.watchlist_update_shows) { - console.log("Watchlist - update one item"); + console.log('Watchlist - update one item'); return update(filters.update) .then(resolve) .catch(reject); } else { if (filters.force) { - console.log("Watchlist - force reload"); + console.log('Watchlist - force reload'); return load() .then(resolve) .catch(reject); } else { - console.log("Watchlist - this should not be called", filters); - reject("SHOULDNT BE CALLED"); + console.log('Watchlist - this should not be called', filters); + reject('SHOULDNT BE CALLED'); } } } else { @@ -267,17 +267,17 @@ !localStorage.watchlist_cached || parseInt(localStorage.watchlist_fetched_time) + 14400000 < Date.now() ) { - console.log("Watchlist - no watchlist cached or cache expired"); + console.log('Watchlist - no watchlist cached or cache expired'); if (App.Trakt.authenticated) { - return App.Providers.get("Watchlist") + return App.Providers.get('Watchlist') .fetch({ force: true }) .then(resolve) .catch(reject); } else { - reject("Trakt not authenticated"); + reject('Trakt not authenticated'); } } else { - console.log("Watchlist - return cached"); + console.log('Watchlist - return cached'); resolve({ results: JSON.parse(localStorage.watchlist_cached), hasMore: false @@ -288,22 +288,22 @@ }; function onShowWatched(show, channel) { - if (channel === "database") { + if (channel === 'database') { setTimeout(function() { - App.Providers.get("Watchlist") + App.Providers.get('Watchlist') .fetch({ update: show.imdb_id }) .then(function() { - if (App.currentview === "Watchlist") { - App.vent.trigger("watchlist:list"); + if (App.currentview === 'Watchlist') { + App.vent.trigger('watchlist:list'); } }); }, 3000); } } - App.vent.on("show:watched", onShowWatched); + App.vent.on('show:watched', onShowWatched); App.Providers.install(Watchlist); })(window.App); diff --git a/src/app/lib/views/browser/filter_bar.js b/src/app/lib/views/browser/filter_bar.js index e5bf4a9ab3..68c5048eea 100644 --- a/src/app/lib/views/browser/filter_bar.js +++ b/src/app/lib/views/browser/filter_bar.js @@ -1,69 +1,69 @@ (function(App) { - "use strict"; + 'use strict'; var clipboard = nw.Clipboard.get(); App.View.FilterBar = Marionette.View.extend({ - className: "filter-bar", + className: 'filter-bar', ui: { - searchForm: ".search form", - searchInput: ".search input", - search: ".search", - searchClear: ".search .clear", - sorterValue: ".sorters .value", - typeValue: ".types .value", - genreValue: ".genres .value" + searchForm: '.search form', + searchInput: '.search input', + search: '.search', + searchClear: '.search .clear', + sorterValue: '.sorters .value', + typeValue: '.types .value', + genreValue: '.genres .value' }, events: { - "hover @ui.searchInput": "focus", - "submit @ui.searchForm": "search", - "contextmenu @ui.searchInput": "rightclick_search", - "click @ui.searchClear": "clearSearch", - "click @ui.search": "focusSearch", - "click .sorters .dropdown-menu a": "sortBy", - "click .genres .dropdown-menu a": "changeGenre", - "click .types .dropdown-menu a": "changeType", - "click #filterbar-settings": "settings", - "click #filterbar-about": "about", - "click #filterbar-vpn": "vpn", - "click .movieTabShow": "movieTabShow", - "click .tvshowTabShow": "tvshowTabShow", - "click .animeTabShow": "animeTabShow", - "click #filterbar-favorites": "showFavorites", - "click #filterbar-watchlist": "showWatchlist", - "click #filterbar-torrent-collection": "showTorrentCollection", - "click .triggerUpdate": "updateDB", - "click #filterbar-seedbox": "showSeedbox" + 'hover @ui.searchInput': 'focus', + 'submit @ui.searchForm': 'search', + 'contextmenu @ui.searchInput': 'rightclick_search', + 'click @ui.searchClear': 'clearSearch', + 'click @ui.search': 'focusSearch', + 'click .sorters .dropdown-menu a': 'sortBy', + 'click .genres .dropdown-menu a': 'changeGenre', + 'click .types .dropdown-menu a': 'changeType', + 'click #filterbar-settings': 'settings', + 'click #filterbar-about': 'about', + 'click #filterbar-vpn': 'vpn', + 'click .movieTabShow': 'movieTabShow', + 'click .tvshowTabShow': 'tvshowTabShow', + 'click .animeTabShow': 'animeTabShow', + 'click #filterbar-favorites': 'showFavorites', + 'click #filterbar-watchlist': 'showWatchlist', + 'click #filterbar-torrent-collection': 'showTorrentCollection', + 'click .triggerUpdate': 'updateDB', + 'click #filterbar-seedbox': 'showSeedbox' }, initialize: function(e) { - App.vent.on("filter-bar:render", this.render); + App.vent.on('filter-bar:render', this.render); if (VPNht.isInstalled()) { VPNht.isConnected().then(isConnected => { if (isConnected) { - $("#filterbar-vpn") - .addClass("vpn-connected") - .addClass("fa-lock") - .removeClass("vpn-disconnected") - .removeClass("fa-unlock"); + $('#filterbar-vpn') + .addClass('vpn-connected') + .addClass('fa-lock') + .removeClass('vpn-disconnected') + .removeClass('fa-unlock'); } }); } - App.vent.on("vpn:connected", function() { - $("#filterbar-vpn") - .addClass("vpn-connected") - .addClass("fa-lock") - .removeClass("vpn-disconnected") - .removeClass("fa-unlock"); + App.vent.on('vpn:connected', function() { + $('#filterbar-vpn') + .addClass('vpn-connected') + .addClass('fa-lock') + .removeClass('vpn-disconnected') + .removeClass('fa-unlock'); }); - App.vent.on("vpn:disconnected", function() { - $("#filterbar-vpn") - .addClass("vpn-disconnected") - .addClass("fa-unlock") - .removeClass("vpn-connected") - .removeClass("fa-lock"); + App.vent.on('vpn:disconnected', function() { + $('#filterbar-vpn') + .addClass('vpn-disconnected') + .addClass('fa-unlock') + .removeClass('vpn-connected') + .removeClass('fa-lock'); }); }, @@ -71,44 +71,44 @@ e.focus(); }, setactive: function(set) { - if (Settings.startScreen === "Last Open") { - AdvSettings.set("lastTab", set); + if (Settings.startScreen === 'Last Open') { + AdvSettings.set('lastTab', set); } - $(".right .search").show(); - $("#filterbar-random").hide(); - $(".filter-bar") - .find(".active") - .removeClass("active"); + $('.right .search').show(); + $('#filterbar-random').hide(); + $('.filter-bar') + .find('.active') + .removeClass('active'); switch (set) { - case "TV Series": - case "shows": - $(".source.tvshowTabShow").addClass("active"); + case 'TV Series': + case 'shows': + $('.source.tvshowTabShow').addClass('active'); break; - case "Movies": - case "movies": - $("#filterbar-random").show(); - $(".source.movieTabShow").addClass("active"); + case 'Movies': + case 'movies': + $('#filterbar-random').show(); + $('.source.movieTabShow').addClass('active'); break; - case "Anime": - case "anime": - $(".source.animeTabShow").addClass("active"); + case 'Anime': + case 'anime': + $('.source.animeTabShow').addClass('active'); break; - case "Favorites": - case "favorites": - $("#filterbar-favorites").addClass("active"); + case 'Favorites': + case 'favorites': + $('#filterbar-favorites').addClass('active'); break; - case "Watchlist": - case "watchlist": - $(".right .search").hide(); - $("#filterbar-watchlist").addClass("active"); + case 'Watchlist': + case 'watchlist': + $('.right .search').hide(); + $('#filterbar-watchlist').addClass('active'); break; - case "Torrent-collection": - $(".right .search").hide(); - $("#filterbar-torrent-collection").addClass("active"); + case 'Torrent-collection': + $('.right .search').hide(); + $('#filterbar-torrent-collection').addClass('active'); break; - case "Seedbox": - $(".right .search").hide(); - $("#filterbar-seedbox").addClass("active"); + case 'Seedbox': + $('.right .search').hide(); + $('#filterbar-seedbox').addClass('active'); break; } @@ -117,17 +117,17 @@ this.fixFilter(); } catch (e) {} } else { - $(".sorters .dropdown-menu a:nth(0)").addClass("active"); - $(".genres .dropdown-menu a:nth(0)").addClass("active"); - $(".types .dropdown-menu a:nth(0)").addClass("active"); + $('.sorters .dropdown-menu a:nth(0)').addClass('active'); + $('.genres .dropdown-menu a:nth(0)').addClass('active'); + $('.types .dropdown-menu a:nth(0)').addClass('active'); } }, rightclick_search: function(e) { e.stopPropagation(); var search_menu = new this.context_Menu( - i18n.__("Cut"), - i18n.__("Copy"), - i18n.__("Paste") + i18n.__('Cut'), + i18n.__('Copy'), + i18n.__('Paste') ); search_menu.popup(e.originalEvent.x, e.originalEvent.y); }, @@ -135,22 +135,22 @@ context_Menu: function(cutLabel, copyLabel, pasteLabel) { var menu = new nw.Menu(), cut = new nw.MenuItem({ - label: cutLabel || "Cut", + label: cutLabel || 'Cut', click: function() { - document.execCommand("cut"); + document.execCommand('cut'); } }), copy = new nw.MenuItem({ - label: copyLabel || "Copy", + label: copyLabel || 'Copy', click: function() { - document.execCommand("copy"); + document.execCommand('copy'); } }), paste = new nw.MenuItem({ - label: pasteLabel || "Paste", + label: pasteLabel || 'Paste', click: function() { - var text = clipboard.get("text"); - $("#searchbox").val(text); + var text = clipboard.get('text'); + $('#searchbox').val(text); } }); @@ -163,52 +163,52 @@ onAttach: function() { var activetab; - if (AdvSettings.get("startScreen") === "Last Open") { - activetab = AdvSettings.get("lastTab"); + if (AdvSettings.get('startScreen') === 'Last Open') { + activetab = AdvSettings.get('lastTab'); } else { - activetab = AdvSettings.get("startScreen"); + activetab = AdvSettings.get('startScreen'); } - if (typeof App.currentview === "undefined") { + if (typeof App.currentview === 'undefined') { switch (activetab) { - case "TV Series": - App.currentview = "shows"; + case 'TV Series': + App.currentview = 'shows'; break; - case "Movies": - App.currentview = "movies"; + case 'Movies': + App.currentview = 'movies'; break; - case "Anime": - App.currentview = "anime"; + case 'Anime': + App.currentview = 'anime'; break; - case "Favorites": - App.currentview = "Favorites"; - App.previousview = "movies"; + case 'Favorites': + App.currentview = 'Favorites'; + App.previousview = 'movies'; break; - case "Watchlist": - App.currentview = "Watchlist"; - App.previousview = "movies"; + case 'Watchlist': + App.currentview = 'Watchlist'; + App.previousview = 'movies'; break; - case "Torrent-collection": - App.currentview = "Torrent-collection"; - App.previousview = "movies"; + case 'Torrent-collection': + App.currentview = 'Torrent-collection'; + App.previousview = 'movies'; break; - case "Seedbox": - App.currentview = "Seedbox"; - App.previousview = "movies"; + case 'Seedbox': + App.currentview = 'Seedbox'; + App.previousview = 'movies'; break; default: - App.currentview = "movies"; + App.currentview = 'movies'; } this.setactive(App.currentview); } - this.$(".tooltipped").tooltip({ + this.$('.tooltipped').tooltip({ delay: { show: 800, hide: 100 } }); - this.$(".providerinfo").tooltip({ + this.$('.providerinfo').tooltip({ delay: { show: 50, hide: 50 @@ -223,232 +223,232 @@ }, focusSearch: function() { - this.$(".search input").focus(); + this.$('.search input').focus(); }, fixFilter: function() { - $(".genres .active").removeClass("active"); - $(".sorters .active").removeClass("active"); - $(".types .active").removeClass("active"); + $('.genres .active').removeClass('active'); + $('.sorters .active').removeClass('active'); + $('.types .active').removeClass('active'); - var genre = $(".genres .value").data("value"); - var sorter = $(".sorters .value").data("value"); - var type = $(".types .value").data("value"); + var genre = $('.genres .value').data('value'); + var sorter = $('.sorters .value').data('value'); + var type = $('.types .value').data('value'); - $(".genres li") + $('.genres li') .find('[data-value="' + genre + '"]') - .addClass("active"); + .addClass('active'); $(".sorters li") .find('[data-value="' + sorter + '"]') - .addClass("active"); + .addClass('active'); $(".types li") .find('[data-value="' + type + '"]') - .addClass("active"); + .addClass('active'); }, search: function(e) { - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("movie:closeDetail"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('movie:closeDetail'); e.preventDefault(); var searchvalue = this.ui.searchInput.val(); this.model.set({ keywords: this.ui.searchInput.val(), - genre: "" + genre: '' }); - this.$(".genres .active").removeClass("active"); + this.$('.genres .active').removeClass('active'); - $($(".genres li a")[0]).addClass("active"); - this.ui.genreValue.text(i18n.__("All")); + $($('.genres li a')[0]).addClass('active'); + this.ui.genreValue.text(i18n.__('All')); this.ui.searchInput.blur(); - if (searchvalue === "") { - this.ui.searchForm.removeClass("edited"); + if (searchvalue === '') { + this.ui.searchForm.removeClass('edited'); } else { - this.ui.searchForm.addClass("edited"); + this.ui.searchForm.addClass('edited'); } }, clearSearch: function(e) { this.ui.searchInput.focus(); - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("movie:closeDetail"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('movie:closeDetail'); e.preventDefault(); this.model.set({ - keywords: "", - genre: "" + keywords: '', + genre: '' }); - this.$(".genres .active").removeClass("active"); - $($(".genres li a")[0]).addClass("active"); - this.ui.genreValue.text(i18n.__("All")); + this.$('.genres .active').removeClass('active'); + $($('.genres li a')[0]).addClass('active'); + this.ui.genreValue.text(i18n.__('All')); - this.ui.searchInput.val(""); - this.ui.searchForm.removeClass("edited"); + this.ui.searchInput.val(''); + this.ui.searchForm.removeClass('edited'); }, sortBy: function(e) { - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - this.$(".sorters .active").removeClass("active"); - $(e.target).addClass("active"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + this.$('.sorters .active').removeClass('active'); + $(e.target).addClass('active'); - var sorter = $(e.target).attr("data-value"); + var sorter = $(e.target).attr('data-value'); if (this.previousSort === sorter) { - this.model.set("order", this.model.get("order") * -1); - } else if (this.previousSort !== sorter && sorter === "title") { - this.model.set("order", this.model.get("order") * -1); + this.model.set('order', this.model.get('order') * -1); + } else if (this.previousSort !== sorter && sorter === 'title') { + this.model.set('order', this.model.get('order') * -1); } else { - this.model.set("order", -1); + this.model.set('order', -1); } this.ui.sorterValue.text(i18n.__(sorter.capitalizeEach())); this.model.set({ - keyword: "", + keyword: '', sorter: sorter }); this.previousSort = sorter; }, changeType: function(e) { - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - this.$(".types .active").removeClass("active"); - $(e.target).addClass("active"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + this.$('.types .active').removeClass('active'); + $(e.target).addClass('active'); - var type = $(e.target).attr("data-value"); + var type = $(e.target).attr('data-value'); this.ui.typeValue.text(i18n.__(type)); this.model.set({ - keyword: "", + keyword: '', type: type }); }, changeGenre: function(e) { - App.vent.trigger("about:close"); - this.$(".genres .active").removeClass("active"); - $(e.target).addClass("active"); + App.vent.trigger('about:close'); + this.$('.genres .active').removeClass('active'); + $(e.target).addClass('active'); - var genre = $(e.target).attr("data-value"); + var genre = $(e.target).attr('data-value'); this.ui.genreValue.text(i18n.__(genre.capitalizeEach())); this.model.set({ - keyword: "", + keyword: '', genre: genre }); }, settings: function(e) { - App.vent.trigger("about:close"); - App.vent.trigger("settings:show"); + App.vent.trigger('about:close'); + App.vent.trigger('settings:show'); }, about: function(e) { - App.vent.trigger("about:show"); + App.vent.trigger('about:show'); }, vpn: function(e) { - App.vent.trigger("vpn:open"); + App.vent.trigger('vpn:open'); }, showTorrentCollection: function(e) { e.preventDefault(); - if (App.currentview !== "Torrent-collection") { + if (App.currentview !== 'Torrent-collection') { App.previousview = App.currentview; - App.currentview = "Torrent-collection"; - App.vent.trigger("about:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("torrentCollection:show"); - this.setactive("Torrent-collection"); + App.currentview = 'Torrent-collection'; + App.vent.trigger('about:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('torrentCollection:show'); + this.setactive('Torrent-collection'); } else { App.currentview = App.previousview; - App.vent.trigger("torrentCollection:close"); + App.vent.trigger('torrentCollection:close'); this.setactive(App.currentview); } }, showSeedbox: function(e) { e.preventDefault(); - if (App.currentview !== "Seedbox") { + if (App.currentview !== 'Seedbox') { App.previousview = App.currentview; - App.currentview = "Seedbox"; - App.vent.trigger("about:close"); - App.vent.trigger("seedbox:show"); - this.setactive("Seedbox"); + App.currentview = 'Seedbox'; + App.vent.trigger('about:close'); + App.vent.trigger('seedbox:show'); + this.setactive('Seedbox'); } else { App.currentview = App.previousview; - App.vent.trigger("seedbox:close"); + App.vent.trigger('seedbox:close'); this.setactive(App.currentview); } }, tvshowTabShow: function(e) { e.preventDefault(); - App.currentview = "shows"; - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("shows:list", []); - this.setactive("TV Series"); + App.currentview = 'shows'; + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('shows:list', []); + this.setactive('TV Series'); }, animeTabShow: function(e) { e.preventDefault(); - App.currentview = "anime"; - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("anime:list", []); - this.setactive("Anime"); + App.currentview = 'anime'; + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('anime:list', []); + this.setactive('Anime'); }, movieTabShow: function(e) { e.preventDefault(); - App.currentview = "movies"; - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("movies:list", []); - this.setactive("Movies"); + App.currentview = 'movies'; + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('movies:list', []); + this.setactive('Movies'); }, showFavorites: function(e) { e.preventDefault(); - if (App.currentview !== "Favorites") { + if (App.currentview !== 'Favorites') { App.previousview = App.currentview; - App.currentview = "Favorites"; - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("favorites:list", []); - this.setactive("Favorites"); + App.currentview = 'Favorites'; + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('favorites:list', []); + this.setactive('Favorites'); } else { if ( - $("#movie-detail").html().length === 0 && - $("#about-container").html().length === 0 + $('#movie-detail').html().length === 0 && + $('#about-container').html().length === 0 ) { App.currentview = App.previousview; - App.vent.trigger(App.previousview.toLowerCase() + ":list", []); + App.vent.trigger(App.previousview.toLowerCase() + ':list', []); this.setactive(App.currentview); } else { - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("favorites:list", []); - this.setactive("Favorites"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('favorites:list', []); + this.setactive('Favorites'); } } }, @@ -456,28 +456,28 @@ showWatchlist: function(e) { e.preventDefault(); - if (App.currentview !== "Watchlist") { + if (App.currentview !== 'Watchlist') { App.previousview = App.currentview; - App.currentview = "Watchlist"; - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("watchlist:list", []); - this.setactive("Watchlist"); + App.currentview = 'Watchlist'; + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('watchlist:list', []); + this.setactive('Watchlist'); } else { if ( - $("#movie-detail").html().length === 0 && - $("#about-container").html().length === 0 + $('#movie-detail').html().length === 0 && + $('#about-container').html().length === 0 ) { App.currentview = App.previousview; - App.vent.trigger(App.previousview.toLowerCase() + ":list", []); + App.vent.trigger(App.previousview.toLowerCase() + ':list', []); this.setactive(App.currentview); } else { - App.vent.trigger("about:close"); - App.vent.trigger("torrentCollection:close"); - App.vent.trigger("seedbox:close"); - App.vent.trigger("watchlist:list", []); - this.setactive("Watchlist"); + App.vent.trigger('about:close'); + App.vent.trigger('torrentCollection:close'); + App.vent.trigger('seedbox:close'); + App.vent.trigger('watchlist:list', []); + this.setactive('Watchlist'); } } return false; @@ -485,13 +485,13 @@ updateDB: function(e) { e.preventDefault(); - App.vent.trigger(this.type + ":update", []); + App.vent.trigger(this.type + ':update', []); }, randomMovie: function() {} }); App.View.FilterBar = App.View.FilterBar.extend({ - template: "#filter-bar-tpl" + template: '#filter-bar-tpl' }); })(window.App); diff --git a/src/app/lib/views/main_window.js b/src/app/lib/views/main_window.js index 6278475fc3..d18a26d52e 100644 --- a/src/app/lib/views/main_window.js +++ b/src/app/lib/views/main_window.js @@ -1,207 +1,207 @@ (function(App) { - "use strict"; + 'use strict'; var _this; var MainWindow = Marionette.View.extend({ - template: "#main-window-tpl", + template: '#main-window-tpl', - id: "main-window", + id: 'main-window', regions: { - Header: "#header", - Content: "#content", - MovieDetail: "#movie-detail", - FileSelector: "#file-selector-container", - Player: "#player", - Settings: "#settings-container", - InitModal: "#initializing", - Disclaimer: "#disclaimer-container", - About: "#about-container", - VPN: "#vpn-container", - Keyboard: "#keyboard-container", - Help: "#help-container", - TorrentCollection: "#torrent-collection-container", - Issue: "#issue-container", - Notification: "#notification", - Seedbox: "#seedbox-container" + Header: '#header', + Content: '#content', + MovieDetail: '#movie-detail', + FileSelector: '#file-selector-container', + Player: '#player', + Settings: '#settings-container', + InitModal: '#initializing', + Disclaimer: '#disclaimer-container', + About: '#about-container', + VPN: '#vpn-container', + Keyboard: '#keyboard-container', + Help: '#help-container', + TorrentCollection: '#torrent-collection-container', + Issue: '#issue-container', + Notification: '#notification', + Seedbox: '#seedbox-container' }, ui: { - posterswidth_alert: ".notification_alert" + posterswidth_alert: '.notification_alert' }, events: { - dragover: "preventDefault", - drop: "preventDefault", - dragstart: "preventDefault", - "click .links": "links" + dragover: 'preventDefault', + drop: 'preventDefault', + dragstart: 'preventDefault', + 'click .links': 'links' }, initialize: function() { _this = this; _.each(_this.getRegions(), function(element, index) { - element.on("before:show", function(region, view) { + element.on('before:show', function(region, view) { if (view.className && App.ViewStack[0] !== view.className) { App.ViewStack.push(view.className); } - App.vent.trigger("viewstack:push", view.className); + App.vent.trigger('viewstack:push', view.className); }); - element.on("empty", function(region, view) { + element.on('empty', function(region, view) { var viewName = - typeof view !== "undefined" ? view.className : "unknown"; + typeof view !== 'undefined' ? view.className : 'unknown'; App.ViewStack.pop(); - App.vent.trigger("viewstack:pop", viewName); + App.vent.trigger('viewstack:pop', viewName); if (!App.ViewStack[0]) { - App.ViewStack = ["main-browser"]; + App.ViewStack = ['main-browser']; } }); }); // Application events - App.vent.on("movies:list", _.bind(this.movieTabShow, this)); - App.vent.on("shows:list", _.bind(this.tvshowTabShow, this)); - App.vent.on("anime:list", _.bind(this.animeTabShow, this)); - App.vent.on("favorites:list", _.bind(this.showFavorites, this)); - App.vent.on("favorites:render", _.bind(this.renderFavorites, this)); - App.vent.on("watchlist:list", _.bind(this.showWatchlist, this)); - App.vent.on("shows:update", _.bind(this.updateShows, this)); - App.vent.on("shows:init", _.bind(this.initShows, this)); + App.vent.on('movies:list', _.bind(this.movieTabShow, this)); + App.vent.on('shows:list', _.bind(this.tvshowTabShow, this)); + App.vent.on('anime:list', _.bind(this.animeTabShow, this)); + App.vent.on('favorites:list', _.bind(this.showFavorites, this)); + App.vent.on('favorites:render', _.bind(this.renderFavorites, this)); + App.vent.on('watchlist:list', _.bind(this.showWatchlist, this)); + App.vent.on('shows:update', _.bind(this.updateShows, this)); + App.vent.on('shows:init', _.bind(this.initShows, this)); // Add event to show disclaimer - App.vent.on("disclaimer:show", _.bind(this.showDisclaimer, this)); + App.vent.on('disclaimer:show', _.bind(this.showDisclaimer, this)); App.vent.on( - "disclaimer:close", - _.bind(this.getRegion("Disclaimer").empty, this.getRegion("Disclaimer")) + 'disclaimer:close', + _.bind(this.getRegion('Disclaimer').empty, this.getRegion('Disclaimer')) ); // Add event to show about - App.vent.on("about:show", _.bind(this.showAbout, this)); + App.vent.on('about:show', _.bind(this.showAbout, this)); App.vent.on( - "about:close", - _.bind(this.getRegion("About").empty, this.getRegion("About")) + 'about:close', + _.bind(this.getRegion('About').empty, this.getRegion('About')) ); // Add event to show VPN installer - App.vent.on("vpn:show", _.bind(this.showVPN, this)); + App.vent.on('vpn:show', _.bind(this.showVPN, this)); App.vent.on( - "vpn:close", - _.bind(this.getRegion("VPN").empty, this.getRegion("VPN")) + 'vpn:close', + _.bind(this.getRegion('VPN').empty, this.getRegion('VPN')) ); // Keyboard - App.vent.on("keyboard:show", _.bind(this.showKeyboard, this)); + App.vent.on('keyboard:show', _.bind(this.showKeyboard, this)); App.vent.on( - "keyboard:close", - _.bind(this.getRegion("Keyboard").empty, this.getRegion("Keyboard")) + 'keyboard:close', + _.bind(this.getRegion('Keyboard').empty, this.getRegion('Keyboard')) ); - App.vent.on("keyboard:toggle", _.bind(this.toggleKeyboard, this)); + App.vent.on('keyboard:toggle', _.bind(this.toggleKeyboard, this)); // Help - App.vent.on("help:show", _.bind(this.showHelp, this)); + App.vent.on('help:show', _.bind(this.showHelp, this)); App.vent.on( - "help:close", - _.bind(this.getRegion("Help").empty, this.getRegion("Help")) + 'help:close', + _.bind(this.getRegion('Help').empty, this.getRegion('Help')) ); - App.vent.on("help:toggle", _.bind(this.toggleHelp, this)); + App.vent.on('help:toggle', _.bind(this.toggleHelp, this)); // Issue - App.vent.on("issue:new", _.bind(this.showIssue, this)); + App.vent.on('issue:new', _.bind(this.showIssue, this)); App.vent.on( - "issue:close", - _.bind(this.getRegion("Issue").empty, this.getRegion("Issue")) + 'issue:close', + _.bind(this.getRegion('Issue').empty, this.getRegion('Issue')) ); // Movies - App.vent.on("movie:showDetail", _.bind(this.showMovieDetail, this)); + App.vent.on('movie:showDetail', _.bind(this.showMovieDetail, this)); App.vent.on( - "movie:closeDetail", - _.bind(this.closeMovieDetail, this.getRegion("MovieDetail")) + 'movie:closeDetail', + _.bind(this.closeMovieDetail, this.getRegion('MovieDetail')) ); // Torrent collection App.vent.on( - "torrentCollection:show", + 'torrentCollection:show', _.bind(this.showTorrentCollection, this) ); App.vent.on( - "torrentCollection:close", + 'torrentCollection:close', _.bind( - this.getRegion("TorrentCollection").empty, - this.getRegion("TorrentCollection") + this.getRegion('TorrentCollection').empty, + this.getRegion('TorrentCollection') ) ); // Seedbox collection App.vent.on( - "seedbox:show", + 'seedbox:show', _.bind(this.showSeedbox, this) ); App.vent.on( - "seedbox:close", + 'seedbox:close', _.bind( - this.getRegion("Seedbox").empty, - this.getRegion("Seedbox") + this.getRegion('Seedbox').empty, + this.getRegion('Seedbox') ) ); // Tv Shows - App.vent.on("show:showDetail", _.bind(this.showShowDetail, this)); + App.vent.on('show:showDetail', _.bind(this.showShowDetail, this)); App.vent.on( - "show:closeDetail", - _.bind(this.closeShowDetail, this.getRegion("MovieDetail")) + 'show:closeDetail', + _.bind(this.closeShowDetail, this.getRegion('MovieDetail')) ); // Settings events - App.vent.on("settings:show", _.bind(this.showSettings, this)); + App.vent.on('settings:show', _.bind(this.showSettings, this)); App.vent.on( - "settings:close", - _.bind(this.getRegion("Settings").empty, this.getRegion("Settings")) + 'settings:close', + _.bind(this.getRegion('Settings').empty, this.getRegion('Settings')) ); - App.vent.on("notification:show", _.bind(this.showNotification, this)); - App.vent.on("notification:close", _.bind(this.closeNotification, this)); + App.vent.on('notification:show', _.bind(this.showNotification, this)); + App.vent.on('notification:close', _.bind(this.closeNotification, this)); App.vent.on( - "system:openFileSelector", + 'system:openFileSelector', _.bind(this.showFileSelector, this) ); App.vent.on( - "system:closeFileSelector", + 'system:closeFileSelector', _.bind( - this.getRegion("FileSelector").empty, - this.getRegion("FileSelector") + this.getRegion('FileSelector').empty, + this.getRegion('FileSelector') ) ); App.vent.on( - "system:tvstAuthenticated", + 'system:tvstAuthenticated', _.bind(this.tvstAuthenticated, this) ); // Stream events - App.vent.on("stream:started", _.bind(this.streamStarted, this)); - App.vent.on("stream:ready", _.bind(this.streamReady, this)); - App.vent.on("stream:local", _.bind(this.showPlayer, this)); - App.vent.on("player:close", _.bind(this.showViews, this)); + App.vent.on('stream:started', _.bind(this.streamStarted, this)); + App.vent.on('stream:ready', _.bind(this.streamReady, this)); + App.vent.on('stream:local', _.bind(this.showPlayer, this)); + App.vent.on('player:close', _.bind(this.showViews, this)); App.vent.on( - "player:close", - _.bind(this.getRegion("Player").empty, this.getRegion("Player")) + 'player:close', + _.bind(this.getRegion('Player').empty, this.getRegion('Player')) ); - App.vent.on("restartButter", _.bind(this.restartButter, this)); + App.vent.on('restartButter', _.bind(this.restartButter, this)); App.vent.on( - "updatePostersSizeStylesheet", + 'updatePostersSizeStylesheet', _.bind(this.updatePostersSizeStylesheet, this) ); }, showSubtitles: function(model) { - win.debug("Show subtitles", model); + win.debug('Show subtitles', model); var s = new App.View.Subtitles({ model: model }); @@ -209,18 +209,18 @@ }, onAttach: function() { - this.showChildView("Header", new App.View.TitleBar()); + this.showChildView('Header', new App.View.TitleBar()); // Set the app title (for Windows mostly) win.title = App.Config.title; var status = new Backbone.Model({ - status: i18n.__("Init Database"), + status: i18n.__('Init Database'), done: 0.05 }); // Show loading modal on startup var that = this; this.showChildView( - "Content", + 'Content', new App.View.InitModal({ model: status }) @@ -228,14 +228,14 @@ App.db.initialize(status).then(function() { status.set({ - status: i18n.__("Create Temp Folder"), + status: i18n.__('Create Temp Folder'), done: 0.25 }); // Create the System Temp Folder. This is used to store temporary data like movie files. if (!fs.existsSync(Settings.tmpLocation)) { fs.mkdir(Settings.tmpLocation, function(err) { - if (!err || err.errno === "-4075") { + if (!err || err.errno === '-4075') { //success } else { Settings.tmpLocation = path.join( @@ -248,51 +248,51 @@ } status.set({ - status: i18n.__("Set System Theme"), + status: i18n.__('Set System Theme'), done: 0.3 }); try { - fs.statSync("src/app/themes/" + Settings.theme + ".css"); + fs.statSync('src/app/themes/' + Settings.theme + '.css'); } catch (e) { - Settings.theme = "Official_-_Dark_theme"; - AdvSettings.set("theme", "Official_-_Dark_theme"); + Settings.theme = 'Official_-_Dark_theme'; + AdvSettings.set('theme', 'Official_-_Dark_theme'); } - $("link#theme").attr("href", "themes/" + Settings.theme + ".css"); + $('link#theme').attr('href', 'themes/' + Settings.theme + '.css'); // focus win. also handles AlwaysOnTop - App.vent.trigger("window:focus"); + App.vent.trigger('window:focus'); status.set({ - status: i18n.__("Disclaimer"), + status: i18n.__('Disclaimer'), done: 0.5 }); // we check if the disclaimer is accepted - if (!AdvSettings.get("disclaimerAccepted")) { + if (!AdvSettings.get('disclaimerAccepted')) { that.showDisclaimer(); } status.set({ - status: i18n.__("Done"), + status: i18n.__('Done'), done: 1 }); - that.getRegion("InitModal").empty(); + that.getRegion('InitModal').empty(); - var openScreen = Settings.startScreen === "Last Open" ? Settings.lastTab : Settings.startScreen; + var openScreen = Settings.startScreen === 'Last Open' ? Settings.lastTab : Settings.startScreen; switch (openScreen) { - case "Watchlist": that.showWatchlist(); break; - case "Favorites": that.showFavorites(); break; - case "TV Series": that.tvshowTabShow(); break; - case "Anime": that.animeTabShow(); break; - case "Torrent-collection": + case 'Watchlist': that.showWatchlist(); break; + case 'Favorites': that.showFavorites(); break; + case 'TV Series': that.tvshowTabShow(); break; + case 'Anime': that.animeTabShow(); break; + case 'Torrent-collection': that.movieTabShow(); //needed because Torrentcollection isnt a real collection that.showTorrentCollection(); break; - case "Seedbox": + case 'Seedbox': that.showSeedbox(); break; default: @@ -300,15 +300,15 @@ } // do we celebrate events? - if (AdvSettings.get("events")) { - $(".events").css("display", "block"); + if (AdvSettings.get('events')) { + $('.events').css('display', 'block'); } // set player from settings var players = App.Device.Collection.models; for (var i in players) { - if (players[i].id === AdvSettings.get("chosenPlayer")) { - App.Device.Collection.setDevice(AdvSettings.get("chosenPlayer")); + if (players[i].id === AdvSettings.get('chosenPlayer')) { + App.Device.Collection.setDevice(AdvSettings.get('chosenPlayer')); } } @@ -317,41 +317,41 @@ }); // Cancel all new windows (Middle clicks / New Tab) - win.on("new-win-policy", function(frame, url, policy) { + win.on('new-win-policy', function(frame, url, policy) { policy.ignore(); }); - App.vent.trigger("updatePostersSizeStylesheet"); - App.vent.trigger("main:ready"); + App.vent.trigger('updatePostersSizeStylesheet'); + App.vent.trigger('main:ready'); }, movieTabShow: function(e) { - this.getRegion("Settings").empty(); - this.getRegion("MovieDetail").empty(); + this.getRegion('Settings').empty(); + this.getRegion('MovieDetail').empty(); - this.showChildView("Content", new App.View.MovieBrowser()); + this.showChildView('Content', new App.View.MovieBrowser()); }, tvshowTabShow: function(e) { - this.getRegion("Settings").empty(); - this.getRegion("MovieDetail").empty(); + this.getRegion('Settings').empty(); + this.getRegion('MovieDetail').empty(); - this.showChildView("Content", new App.View.ShowBrowser()); + this.showChildView('Content', new App.View.ShowBrowser()); }, animeTabShow: function(e) { - this.getRegion("Settings").empty(); - this.getRegion("MovieDetail").empty(); + this.getRegion('Settings').empty(); + this.getRegion('MovieDetail').empty(); - this.showChildView("Content", new App.View.AnimeBrowser()); + this.showChildView('Content', new App.View.AnimeBrowser()); }, updateShows: function(e) { var that = this; - App.vent.trigger("show:closeDetail"); - this.showChildView("Content", new App.View.InitModal()); + App.vent.trigger('show:closeDetail'); + this.showChildView('Content', new App.View.InitModal()); App.db.syncDB(function() { - that.getRegion("InitModal").empty(); + that.getRegion('InitModal').empty(); that.tvshowTabShow(); // Focus the window when the app opens win.focus(); @@ -361,96 +361,96 @@ // used in app to re-triger a api resync initShows: function(e) { var that = this; - App.vent.trigger("settings:close"); - this.showChildView("Content", new App.View.InitModal()); + App.vent.trigger('settings:close'); + this.showChildView('Content', new App.View.InitModal()); App.db.initDB(function(err, data) { - that.getRegion("InitModal").empty(); + that.getRegion('InitModal').empty(); if (!err) { // we write our new update time - AdvSettings.set("tvshow_last_sync", +new Date()); + AdvSettings.set('tvshow_last_sync', +new Date()); } - App.vent.trigger("shows:list"); + App.vent.trigger('shows:list'); // Focus the window when the app opens win.focus(); }); }, showFavorites: function(e) { - this.getRegion("Settings").empty(); - this.getRegion("MovieDetail").empty(); + this.getRegion('Settings').empty(); + this.getRegion('MovieDetail').empty(); - this.showChildView("Content", new App.View.FavoriteBrowser()); + this.showChildView('Content', new App.View.FavoriteBrowser()); }, renderFavorites: function(e) { - this.showChildView("Content", new App.View.FavoriteBrowser()); - App.currentview = "Favorites"; - $(".right .search").hide(); - $(".filter-bar") - .find(".active") - .removeClass("active"); - $("#filterbar-favorites").addClass("active"); + this.showChildView('Content', new App.View.FavoriteBrowser()); + App.currentview = 'Favorites'; + $('.right .search').hide(); + $('.filter-bar') + .find('.active') + .removeClass('active'); + $('#filterbar-favorites').addClass('active'); }, showWatchlist: function(e) { - this.getRegion("Settings").empty(); - this.getRegion("MovieDetail").empty(); + this.getRegion('Settings').empty(); + this.getRegion('MovieDetail').empty(); var that = this; - $("#nav-filters, .search, .items").hide(); - $(".spinner").show(); + $('#nav-filters, .search, .items').hide(); + $('.spinner').show(); - this.showChildView("Content", new App.View.WatchlistBrowser()); + this.showChildView('Content', new App.View.WatchlistBrowser()); }, showDisclaimer: function(e) { - this.showChildView("Disclaimer", new App.View.DisclaimerModal()); + this.showChildView('Disclaimer', new App.View.DisclaimerModal()); }, showAbout: function(e) { - this.showChildView("About", new App.View.About()); + this.showChildView('About', new App.View.About()); }, showVPN: function(e) { - this.showChildView("VPN", new App.View.VPN()); + this.showChildView('VPN', new App.View.VPN()); }, showTorrentCollection: function(e) { - this.showChildView("TorrentCollection", new App.View.TorrentCollection()); + this.showChildView('TorrentCollection', new App.View.TorrentCollection()); }, showSeedbox: function(e) { - this.showChildView("Seedbox", new App.View.Seedbox()); + this.showChildView('Seedbox', new App.View.Seedbox()); }, showKeyboard: function(e) { - this.showChildView("Keyboard", new App.View.Keyboard()); + this.showChildView('Keyboard', new App.View.Keyboard()); }, toggleKeyboard: function(e) { - if ($(".keyboard-container").length > 0) { - App.vent.trigger("keyboard:close"); + if ($('.keyboard-container').length > 0) { + App.vent.trigger('keyboard:close'); } else { this.showKeyboard(); } }, showHelp: function(e) { - this.showChildView("Help", new App.View.Help()); + this.showChildView('Help', new App.View.Help()); }, toggleHelp: function(e) { - if ($(".help-container").length > 0) { - App.vent.trigger("help:close"); + if ($('.help-container').length > 0) { + App.vent.trigger('help:close'); } else { this.showHelp(); } }, showIssue: function(e) { - this.showChildView("Issue", new App.View.Issue()); + this.showChildView('Issue', new App.View.Issue()); }, preventDefault: function(e) { @@ -459,7 +459,7 @@ showMovieDetail: function(movieModel) { this.showChildView( - "MovieDetail", + 'MovieDetail', new App.View.MovieDetail({ model: movieModel }) @@ -467,13 +467,13 @@ }, closeMovieDetail: function(movieModel) { - _this.getRegion("MovieDetail").empty(); - App.vent.trigger("shortcuts:list"); + _this.getRegion('MovieDetail').empty(); + App.vent.trigger('shortcuts:list'); }, showNotification: function(notificationModel) { this.showChildView( - "Notification", + 'Notification', new App.View.Notification({ model: notificationModel }) @@ -481,12 +481,12 @@ }, closeNotification: function() { - this.getRegion("Notification").empty(); + this.getRegion('Notification').empty(); }, showShowDetail: function(showModel) { this.showChildView( - "MovieDetail", + 'MovieDetail', new App.View.ShowDetail({ model: showModel }) @@ -494,16 +494,16 @@ }, closeShowDetail: function(showModel) { - _this.getRegion("MovieDetail").empty(); - App.vent.trigger("shortcuts:list"); + _this.getRegion('MovieDetail').empty(); + App.vent.trigger('shortcuts:list'); }, showFileSelector: function(fileModel) { - App.vent.trigger("about:close"); - App.vent.trigger("stream:stop"); - App.vent.trigger("player:close"); + App.vent.trigger('about:close'); + App.vent.trigger('stream:stop'); + App.vent.trigger('player:close'); this.showChildView( - "FileSelector", + 'FileSelector', new App.View.FileSelector({ model: fileModel }) @@ -512,7 +512,7 @@ showSettings: function(settingsModel) { this.showChildView( - "Settings", + 'Settings', new App.View.Settings({ model: settingsModel }) @@ -520,7 +520,7 @@ }, tvstAuthenticated: function() { - win.info("TVShow Time: authenticated"); + win.info('TVShow Time: authenticated'); }, streamStarted: function(stateModel) { @@ -533,7 +533,7 @@ // uncomment previous line to close it this.showChildView( - "Player", + 'Player', new App.View.Loading({ model: stateModel }) @@ -546,40 +546,40 @@ showPlayer: function(streamModel) { this.showChildView( - "Player", + 'Player', new App.View.Player({ model: streamModel }) ); - this.getRegion("Content").$el.hide(); - if (this.getRegion("MovieDetail").$el !== undefined) { - this.getRegion("MovieDetail").$el.hide(); + this.getRegion('Content').$el.hide(); + if (this.getRegion('MovieDetail').$el !== undefined) { + this.getRegion('MovieDetail').$el.hide(); } }, showViews: function(streamModel) { - this.getRegion("Content").$el.show(); + this.getRegion('Content').$el.show(); try { - this.getRegion("MovieDetail").$el.show(); + this.getRegion('MovieDetail').$el.show(); - var detailWin = this.getRegion("MovieDetail").el.firstElementChild + var detailWin = this.getRegion('MovieDetail').el.firstElementChild .classList[0]; - if (detailWin === "shows-container-contain") { - App.vent.trigger("shortcuts:shows"); + if (detailWin === 'shows-container-contain') { + App.vent.trigger('shortcuts:shows'); App.ViewStack = [ - "main-browser", - "shows-container-contain", - "app-overlay" + 'main-browser', + 'shows-container-contain', + 'app-overlay' ]; } else { - App.vent.trigger("shortcuts:movies"); - App.ViewStack = ["main-browser", "movie-detail", "app-overlay"]; + App.vent.trigger('shortcuts:movies'); + App.ViewStack = ['main-browser', 'movie-detail', 'app-overlay']; } } catch (err) { - App.ViewStack = ["main-browser", "app-overlay"]; + App.ViewStack = ['main-browser', 'app-overlay']; } - $(window).trigger("resize"); + $(window).trigger('resize'); }, updatePostersSizeStylesheet: function() { @@ -587,7 +587,7 @@ App.db .getSetting({ - key: "postersWidth" + key: 'postersWidth' }) .then(function(doc) { var postersWidth = doc.value; @@ -605,64 +605,64 @@ Settings.postersMinFontSize; var stylesheetContents = [ - ".list .items .item {", - "width:", + '.list .items .item {', + 'width:', postersWidth, - "px;", - "}", + 'px;', + '}', - ".list .items .item .cover,", - ".load-more {", - "background-size: cover;", - "width: ", + '.list .items .item .cover,', + '.load-more {', + 'background-size: cover;', + 'width: ', postersWidth, - "px;", - "height: ", + 'px;', + 'height: ', postersHeight, - "px;", - "}", + 'px;', + '}', - ".item {", - "font-size: " + fontSize + "em;", - "}" - ].join(""); + '.item {', + 'font-size: ' + fontSize + 'em;', + '}' + ].join(''); - $("#postersSizeStylesheet").remove(); + $('#postersSizeStylesheet').remove(); - $(" + + + + + + + + + + + + + diff --git a/src/app/images/flags/norwegian.png b/src/app/images/flags/norwegian.png deleted file mode 100644 index adb05e656a88bc3488e0d46013954f37f8c24291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 808 zcmV+@1K0eCP)4dO$|HTdpiSXta^m9EQvjF z<2elceBLFD+m83$v2_R7LS}4q>dDk~>e0L6LtvEt$tN;Se?RvEz!n{#2Zlnx=H^%= zv6geJB@uu8^KT1O3DeV6k4x3NPNKEN7JvYH9R`BHd+=d&fjBrC^WIS0QLN(wNJOeL zkhF=OwVOB$+lZk54O%r&%HE$ZqYc>}5G7gwC&tJY} zsp4O4zZ*-7^Vk16H`OJ?TSz{D0jA2wAxQ6G(dWd7!Svo~X8bu-jHNWpmJiXFQ8R>= z+)C-FB;uPX8B1x2%sOLc78eNMTD3QII%`_410pa*D(5%R z*C)%e75NgS5N{!Au~lO@he-^yq660`N((sW8ug>J6rX`cZlU-LAO>2SZb}`SZ8Al- zZ6un(0-aUJsJbwJ_>C=xN-amfy@WcCe z+qQ0baR2^>_3Q86xxI45itE>}Em^$i;>8R7Vw#77l8^Z&oOO@6>=l2_JMn~b#AVm$ z>mG3jykpNfM_hM}IqVS9CZc}AI^e8z&_#!^>rRn-T*41n2VArcx@r@0%`WVak>?3B z-#THHopynHOgt}``dzaK+-l>0K->Aaf%_Rl&#T5h*G&B`7qQ_JzV zw(~(XyE7V27qwll=(=w+@z||meO%4{g1XZcO_wqur4k{STpsCU(mzE8> zsn4WlMv5i(mHzrSfA+q3-|RDogWhD%er%%q^McXbq`cDgf#Gvx_xa7{n{Iq%Hj_bR zMw1J3!gJLw&K)s1zw4w8G8?|;Y}-~FT}!F&FT5;f=z1O zI}N_~tO|v$zt%dmH~ev^{rpdR&&ow|aSPl2?>(^HW&U?t4oB`MpseHR>gTe~DWM4f DCuqn` diff --git a/src/app/images/flags/portuguese.png b/src/app/images/flags/portuguese.png deleted file mode 100755 index 14181a2e4820207911d967da637dab3015121e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1625 zcmV-f2B!ImP)hb4?X&N)~TS8FNn^aZVm^?D|}one_k$iSu%lP zG<#nfLNV@Tc3nohCf}Kf?lA8Vv$Eo`4S-frMg%qEUno8H*4bjk&0gp-YdcWRRVKk*~>=5ge79fR>*? zmcXx(;qL>m`v0_J=CO`)iOcWIY!oqMb@c1 z*1tK|BQw{oW7tJf*h*E{kviEaIoZQ*+Jsu#o_E@=bKH1B+=gh}z>VD_G~F*g-91a) zU1;56SlwrA-M?MmI7i<@QQ%Qt;BjH#ky+uNY2nRK;v_WUHAUi6MB^+x<8yuFMpWdf zkmRskQP?m-aYFkH|r}r>o`a2JxuFCQ0qie>tAc@keKWvH0&rj>?}O& zE^e#8Wo+z`X6+?6?LboPYj*9bu>iPQm|NsAbE%O8b000JbQchC<1Pl-)FdFAXg#h)nHf)K@(pd0Jng`&6?!KE9) zWfrc)r5i!obr4*LxR5SdkWyM3BBmyp874ECxifci=bZ2JPMi55QOMFop9dcMKQN}u zQ6KT&)|}z(9=RCDp|2QH1{6H(0jIt&&d?Ha86%!!`Y^i(_tZGFD}ZGzaEyZr{0%q| z4?@InhmN0g|g(8GckRppUr$6V!%RBQI&^g-*4^4^V_#JgZv~% zplw$L3lf4nGWE&U;@Y)$?_Ij|%b(dbosg!f(oXZSz_f_P)e6@WK4YHoFs7eWt@~8*m_^JXAfmQM`5I^ZFKF>#60YDkHlv zmC@=!WZi5ZvE;H>E~K{)lB*YYZ|t94J{`?7(t$=)bG_P~$VO%98x_q}S8D#sJM&VK zroG*Ku3R{jkwA|Gs&^cqh($3pe}4Y%_4TJ#ADHu5SR!Gl0=>AUCIJUN1S1wDVzd3y z#zwsI#_mqz)n$enJh8`g4cdSMMJ&NUfXa_cSK@5FP`HXR=I827C?#Y#AVV}#j0$l7 zKA!^0NFAuN&`cR{XuvxY03{bemm)(c6f<%=(Dwq40S}4=3;|-4p%~~wAg0ZL1H51{ z2v{W-Gu9xNk!zEJ;s5~wYZL(sDPu8IV4oJG3^<@rz(F4n=tCP%5&A#?4mdD9i+4#M zaA;J-IBdZZfr+41wj7X4$W6C_2Kyvn0}icl$S`2|mI;BJXT(@*I5`!Q;(P+ Xkw>w4!X36?00000NkvXXu0mjf#SHO{ diff --git a/src/app/images/flags/question.svg b/src/app/images/flags/question.svg new file mode 100644 index 0000000000..9d4badfbb5 --- /dev/null +++ b/src/app/images/flags/question.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + diff --git a/src/app/images/flags/romanian.png b/src/app/images/flags/romanian.png deleted file mode 100644 index 85ad1da03aa06ba94ed982e680eb19766e3d9773..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1363 zcmV-Z1+4msP)AIEMgb!OBO?oga`ta>4Y)e}G(`^hmHvZly@vNMv9bVZ4hDw*3{x5+0lb(8 zt~1FEgg9p{R(@F%a>q2I5c?&LkfWQCapKM6p4`N3B=Ml^X30HxQAJ3P)F_MwJ?K6qf ziU0oV-vGZ_ffdZx-`??XE+in5h=7P~gd4qsGKVXbyY@;QqUz{kK0nPdTVesQaQKEy-j<;2K z6a2uFaQDbH0x-tj)(d2?AQNoLz)WCBNNxfq!ks!T>YGSdJP9gp!Vm!NIBdeguzQ1< zfW$_iAkst#h$(J!8&4!q;;ooGV3}w&#H@f#NsJPuAZ)<1iQf#@6A9Ei33yjQfI)Ti zfG)wCDigV9;zS_0ji(Xt8x`XO!ir5`h3uON%Ise*3I+@cV-xj$tn^qD^*7i zRPB9WQZ}bK$h$9QWQeCAONZ09AusFP#7uP1QKI15#KjoJC@>}xG7NjrGl?0`Q$~Gb zq@MF131j4>YGL?R3Jq}{Tkv5hVk)0;dp2?r@pJ;1dBN7a-*06s1{racLg!H%2?b#Y z852ZkQXxCom?OX~)RQ{#kpZ65stN!Tb_p{XIh#Q?4_ZU%q9|+L(NS%Ao&1&1W2XGVn2nAv?v1bopY@qj&PynYD`HDbQ z^*}d`(_#972v0sppr3ihY1F+=w=dB>p}$6K3LGvpvZ;#-Cf%nVb1&Gva9NraRuLa* z02?SVpMD?st^jitn(o9pHnNsT1_F1w?55q*$dfPHE7$|abns0i1&0*EtV{B{-<m~UoMDiC|q9&iSYL#a=S=jaA7u;5mgDe|tcq_Nr4oX=-f2))&`QZ1qUx>l!|L{zV!0=3r z+7$r?6TGLw1EeK@7)TE(@CArpfII-6BLK(7&;oye_y;IHhBO}H9vJn&s0T(p003;I VSuX5+q{ILK002ovPDHLkV1m|oX$k-U diff --git a/src/app/images/flags/russian.png b/src/app/images/flags/russian.png deleted file mode 100755 index a57c19239f83864e6f714e2953ecf31ecb28a2e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 896 zcmV-`1AqL9P)?ja%fA|m@EBl0CB_9iCbCMNDCCix~N z`Y9>%Dk|qIEA}fZ`YkQ*E-v{lF8VMq*f22XF){QqGWRkv_%k!`G&J)xH1st!<2N_k zJ3ID0J^MX9|35$8KR^FKK<`3A_d`SdLqq>YM*l}g@k&bSP*CfF004ym0EhqpivR$P z0055w0F?j$n*adC#l_6b%+Vwy(I+R-(b3f)Al4@**4Eb78yncz*x4;D+Z7eu3=G{I z9N!TU-y$O5G&JD|2;(Fq>OMZ}3JUD(?Cld1 z?(XjIA0O}U@9-KL@IyoK3JUQQ6!Y`*^c5BK9v<{ZNA(E_^$!pB_V)K29QYL#`1ttw z5fSK_jS3h<NByG!1c++_xfDf>{KEF4|dv!`XUQ}MhkoF>l+nW1ah$A+6h_LPBDLn_mc z<4Cf9GeXT@T6Gg?ki0A0Rid>-@u5zLnd&BzE_q)#9g|SS+P3PHkUSCshdiim)}@o2 zl5Yh;IjU2|wv~0DAo*6H%QjP};@E78tVa|r^J1iv=SBGL34Z|0 W!rMQ^n~aqJ0000 diff --git a/src/app/images/flags/serbian.png b/src/app/images/flags/serbian.png deleted file mode 100755 index 8de725e46b53cc6dc53434fd99ae61bc3dd6800b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1655 zcmV--28j8IP)grx`rcPp-Ph*+pU}Z{Qng0I%`T6-oT9)tc@8jd+ zKv$IB-rn5Y+|<<6j*gD*?(gO0<=NTU^RTkzWoq{J_SV+cU2vsXYoShIm)&l1=3{8+ z=;+|!;PS1oOkkHrTa-Xnkv~+Ajg5_pii$r|iiU=U-+zRGfr06Ie&%g*@$vEP?d|OB z?DDIvTyCLQYM$$jklc2A^ZNQ#Xq@Vpo0XN7NnMmiT9HazkVIFFgM)+QXl>FMd` z=jY<$;`Z3uW_F@raiZ>>pW}>=O<#{nTZ`m`h}?2^=5Ti8Z*%8tap7!n+H7#d*^j~;ec}HXl&bMYa1?P>(W&9|Nr#i+ws)Y=h4#c(9Y+}$L7VfuuIs9-*Q2TEprg@$luTcgPhgT#Vv*pPkl~Js*@BAdv4!A>fq;O3-+6u3cY4og zcIR<*dMgAtFq{;uI$sG+?t&2wvtq2k?ygMJ5PtwdW7nWeCdaE&tG%ghHd7*Xx?~J+;&Xj zL`mX7M`egeEdT%j26R$RQveV!3dz;O&qX;5LH z$58|Uf*}xSMXbVsf(8guK+MYA=E_;l)ZAu!@4ffld-sXDpM!FBw7l|NFZ}U>1JC`x z?(>kQ{2xNYCMA?a4m;72ot<6cbhf6ar!NOfgV3*Z(CREHDS@Gm6Jcah$aYt0smGI< znK^p`aP0Avmb$iwK%lwo_4cj-bN&jQ_IkaSH7MAmmu{=7s=PL9Lf0y*sn??ey zRy%Xlz|22_krFjjSSZLPIVTCo{|%@w{n>)_x##Czz? z%~vWtuME3`((m6A~V>x%yB+;PNWU2)NFJkUvWI+;87+ZQj#H z8$$x~Sy_Rg^R)TYG7uYk+-`5{InwjmZa*4Jgw9WyPj_yFU}I;Q*|-A4#2n4bYwtOx zY0t}h5ks^L&W+}>w|H>IY%&>*3gc|52l+sl4&g{ToXNzV!#%IwfiTfTuc-U-s{_w%$1K~kY zQA{S4LZS09L2|+d6!5so0xXr4LP?~SKl%R5!2kB7|F?NS4Fqfs9;}4`R-~d8iRF#1 z109Y1PiF+71~$-Hsax0_Q6Na*umxMv_$hP>mAWsp(o+~db{++3C|ElZ6bN7i9z=!1 zGyxPS;A2T_E*|W{gM9oJ6e@GHScE?Cjc-WA?_3ZJ;1YtQG#0Et0X`mp9`OLZksz5X z+66&81e^kPK9+{AO=Us=g7Xl-f)w;d9IhxH0tF8h_zpfK(7>7~xGWP;(S^~Cv3xYo zQ$V0}I2=3?YG4c8ghhvH1f5P#VewP3Bmp~_o4|88ln_`}U%Ip!SS)I_TB%ej6pHvD z_yK>ZfyIJm)FCAD^l6hYolFWPhfD%Flr-fZ`~o92Leek42N(bV002ovPDHLkV1ngT BS^fY3 diff --git a/src/app/images/flags/slovak.png b/src/app/images/flags/slovak.png deleted file mode 100755 index aafc98186bbd56f0801f864123668923bf9f4a1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1360 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_VB!t%32_B-85kLF+_(WGuV26Z z_3PJf-@g6$@#FXJ-+%u6`TO_pzkmP!|Njq^y>jKs=g*(ty?b~5{P{Cy&Ky5}{O88a zpA*x6ELigA`pv_K4}XeF`TO9}xAPY{tg6BrHV0O3^sd?ATeH)zZkJ#Eo*!#Be2Pl= zb?}H+#b)=)9p1IOK1Ia+xq6MmqRgdqi);Bd*NPoKR;~RQ9Qipj?@LLgd(}?YlJ#Hf znr!mdv6~gR7c6neS!|iH#5!m7`vr?%y8FExRWSuS*T`~$px6Z?%S*Z@4-72c zIC$Kgv*Kyrw6`WUr!4JnXc^woHh!pU`c&8SrJmVqL(6wwfo}~hy9Go~>ziFr(|xOF zcEZ@|tfs*gRoy3AMlZFEUuzq`)i!Ap5WT6QeNR>IiJIO^4THBDhG$fDF3PK4SJ1et zsQE}q>zT67OJ$w6$~x~fHsXP^9c8>=F(NHef*e7W$_RF8luo-%xn zE*DCbxwy!k-p*=Q#SAM|)-{FND}CDgKY#mItLau*OU~?x z5y(Bm&hyMD(tQnYo7J{6w<=Xy1J=)4GLPkB#*tZ8C2zBeH%X`KiKiy@6ea-Tf`5r7sJ39ni zDvTaIUc7I=NyQ=AM$wzwHp?te+GO6hciRo+q8}HIzi!`d8*4r3qL8;Beon|#HnO8S=cgv-Mqi@t0$gX$Qz`b=@7^I&Sv(N9adi_ zC{@}2N_=0K&od>ghnZI=p+En`@e|jNyH_oIG52xu(R6=q!Nv+co7ofiQ%{M{n{?Jy zQ|&yv!puZxCXOlz1%>&Vze9KAzG2uYAIN)m_usYu?=)*a
    Nntv@&lR5W_J`njxg HN@xNAi3;2e diff --git a/src/app/images/flags/slovenian.png b/src/app/images/flags/slovenian.png deleted file mode 100755 index b40485eacf06ba17401308f2799b470a1dcd33b8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1359 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_U=j}S32_B-85kLF+_(WGuV26Z z?c28>KYslB_3QWV-+%x9{rB(R|NsAiQdh2A`TY6wg$oznzkmPn;pF`)|Mhu2^v}sQ*aP%q?Y$S4B+OpTFeHi4!LlPu~zbeMi8A zgYi=j9XWDj{rv5|J^S}8+v(Q1cgw}+3~n_6om)KGwm7wJcW&S1*0HCtY3ZGppSyP6 z46Rwq;98Yev9NpMCg+Yl_N}`d8#ggHm)kUKwQb&U?A*O6oy)B2HhQ&eSaR~w`ZJIE zmK?Ed*~Q>k>{zwTymYBy@iOCzwI)>?Y)e+Y{O~C@f3|MXa^2E3h863Ksy5b^&$20B z!eE=NTee=WVxwm6BIUg0nnkO$O4n+aZ7?mGuar4oDSNSM;VQM_b!sK+4f5tFY}nJ~Fj=W@h`+)aJE?{Z$LQenHWbw$AtTO&=JTJu|j^ zV`6>M((b&z>17T5+d9Ti^h}=Xo4qo$cw=bMB_MiTL;s<+(Mw&^H+p7gHTBP`YTwl~ zc&cUiQrqaYw(%Ps<5mHY6ULTT6g6%rY2H=QeyFVdR89AlhW=|!!#5fR7v$BRC~3V^ z)_$w1ds5%@j)M9dWvwQDk$YASckEo6`9g9jaC-7cC*yE6>XAyBP zq7rKOge&=k%K3z<_=Fnyg@F+bL{~R|W(1~+jU_>T!3-?_d4MSZ3SM~)s+GdHz~1%t__>dq?dP8b+_K~CXOHR=30}JjBjh*7RX4QEWZ1g z+wv7AQ>Qpy{wi4e)`wHLmrEt&XzRUaKR6fd*RE^0VQpi%$NbTSSzg9$vOLq(ekrFXTPeevgtA<9bT}uOEk;t#3hR>!sjN*+^{-%NyqiS zPY;XYrlMs&nx>~~_8HBdc+2nl)`>UQot8OVQk1%EndZjb8(ww2ShH0rbLp9wn(ZeX zbE{7-;>peSc>2bTKXczEkK0;bY?tOAOON-8c6+OTYN>s)!)0-SzneGq=&=a42xQNe zm|6Dx_}zcSrjO>R3eFPd-595QR$;sG7p-S6Zp@OL#WwlA^JSjRx;JMA-~Rc|Du1hm zp{ab;L7qMXgEcbMDm9y;?(D6f8&zw2d9nHt{ak_i8KRoT^0msl^{y@xl$*XPxNl~? z^+(Z$*K^+8FhBYvbNVBnbNdT;&-ou&vY&18hxw~N*!~N@ZR7gxN*kzT^mO%eS?83{ F1OSCJ+hhO$ diff --git a/src/app/images/flags/spanish.png b/src/app/images/flags/spanish.png deleted file mode 100755 index 410cc4bbb23a73978b11b6c7a65f0a4d72426bcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1577 zcmV+^2G;qBP)czlFVeT;gKUQU#4 zIGJ_;n|A=4nP8oH0GziM7I$lw;L+AD>}G3N4Q@vxPmpftXH{aF1e2Yx)mn6d2G8IEW0K(ygp03YCODf zQN0o*y>Uan7bw0SF25r)zb`(&nTfy?CBQ>Z!5AvRlmNk$cfq8q!L7Z)vy8$WF2aXo z!xSdNCpW`IQp6i9#UeAslW)coCB_&k#v3ih9x%p7RK~%B#}p>VmaoT|0LT?6$Qdfg z94*KnFvy5c$x2tswZqGtV9ZTf%)x%moL0_GTh35j&U-b^!k^G+bJ1gN(pzWJo>J1L zSkqr?(`|Rtb$`>eH`Js*)wDg_c6aoe>v+tQ%iZh72+irsH|-K{I#u|eIoQr);c-OGvI zkeJ@E8s54>-=({HAxEATeO6sGk>ZYygx*Y1hFY3x!>#4Bo$WiRQA?~~v z?!qnZ!!z#7R`0+b@4zMR$3XART=Bv`@x(9j#WV827xKd?^2$Z?!y)s{O!UY!^vOE( z%tiFiQuV?Z^~W*x#3lB{Aoj*A_{A9b$tC#7F8Ina_{}`{&`9{vPWi_h`N=E!&qDgg zAo|HB`pPT%$}alN8~eu?`^X#n$RPX4BKy-&{Kpvl&^`RsP5shD{nb7F)lmM@KK|57 z{?$(Y+C%@+J^#}`|I|bO)JFf-M*r4I|JF|b*HI09iE97=00wkYPE!B`3=kwR8s}`2 z0008mNkl10L7{KxWx%atu?%bJ)DYT&}Y9SUxsHLb|K@nUD23&OS*3Td= z`~a?s8~Xv=xo}a%(xn@rXhHD>EDEA+)0t%M+d21~^EgRR^3n-$=c2zKJn?^E%(MI# zzln(-iXAW#1TcW`4-Y8d@qrFI@b4QjZ2O@_L0Hbi9A<(M`iDB5pg_Vh5vZ7BdIYpb znNt#2t^s;75O79Z#xQb{qNNw_6hV=Y1UxCr1p-Ns9s~#kP&_9IKrkS@y*VCFa>ksj za?Go0dPCTihPKL%j_QA>ZQxd zF&>av1cZe?0}X$E0(`@J&!;@j4hxSE9$8zBV|M4eYrlU4TzmbiwW}P~llF|KYApzR zrf0wS?8-xvY!uJj`(X2hoFjUeRzQtV|K;j!wl-e=<9fF~SiO1iwT)jn%0XwF#?BGu z9<~N~5N501PZ(63XNBUqi~|b5LR;erRx#;t&7|YJEMUwCh8)vEP1Vu3 z+5J|CKuQBEE_Y=H=8X3(~)cF>gISjbs$>}#;JL~9ZdG(uTGi7z~n0GZN*Apt`#VMOHI zR^gkd2x=5l7h)KVC`wXD4ZAe35E{C=qX}J&QA{c*U|2AK;TQ#!ecmLA;q)|`1x`Yq!0iA00wkYPE!C7Fbo7FuNbfc0005K zNklL5c)8?J!AG0dbo4`+c`efZGm}G>snt9swY# z1oYQSE1=YFK&c8G))H{Io~@K3@Tyd1+xGXsMp>rRD}yY9s1jhWhZ%#nQEyCpPYiPWOn6=b)BF2JgmeJ zYg7kAbe@D^J_$+?qU4+!0+49$34|38;g!Hd|7#KOFo= z0HhWW;Q>TV0I?Bxyf48l2!cuOQwhaiiNSwe;#Z3Bl7bn)7+^}>O7iKdqKu+51{jVB z+)3l27j9N-EYSu)-~0E2_H?bQcYcuG)&AO{4-R&HEG?0j;{X5v07*qoM6N<$f`)-H A9RL6T diff --git a/src/app/images/flags/thai.png b/src/app/images/flags/thai.png deleted file mode 100755 index c50bca06c2fcf21cca382be54718121ffad12df4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 913 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBgK_VDt^}32_B-_wb1@FfzWGIp^i% zX>X@Y|2Tiq=cOw?uUZ2X+`%jIthMt^Yv;SRuKN`=_X|p%gvF-U~lhxMBJb?bX} z8~IK!@|&#X)}!q)LCs(q81OP`WMkDPU*yluOJefNwRGp=2` zcKi122M-=Refsq0&!3YgPp;+U+pDR6Kw9aDsLV+*+4Ev@SH$ISNXXxjR=OvpRL#k| zPhID(xcm_<{Zo1-moyEoDQVtTP`|CBeM8IeqOoN;2k#yu^F8{e2hD7b+d7?d_PFZl zciTVYUQk2{2TvgfPd*0^Fsy*6DE-_~V1VYA1o;Is{O19B9|!~>6irDL1B++;zQ8zb z@pN$vsbGA2W&2DScL|mY;kJ8=Zv-dKspM!XH0C(4r${ct)wMJ%&}(miq8waOsbr$(2?tU(Qled%Z;E_w*wu384+Eq61zF+Zlf0vxq zS=QMJrM8E+a#bI`SIT5~gpu(!SKiEHwLyo^$1GagshXa8tK?ACMPcD-PkU}`*=_Ks z<>VaZgWCdS!`y|N1?__$Kl=FnrJ*N#-?q04=9)StY+b7{ei&BOQMIDoi0-Qd}fK5nl4A8@uxKw=X^LMQQ$@Z+_R5A5~{Pzi@kb zToyy#*A0(VpLlcW+C+xu2^-JZ2)w`r3A%lkxrMRPxEzN*UY=6CNd zckU24VcQTCQoi@ex@EOZLH9miD}Q%Gc*V~`P6mFPglPL?I|}#qi--TXFVDAOP6~5e S>}Ft6VDNPHb6Mw<&;$UuyxOb) diff --git a/src/app/images/flags/turkish.png b/src/app/images/flags/turkish.png deleted file mode 100755 index fdac0e6dc2575dcc82cc0135d0929037b20eec78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1420 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 Date: Fri, 7 Aug 2020 03:36:00 +0200 Subject: [PATCH 139/777] Some UI/themes fixes/improvements Changes: Official Dark Theme: --- Fullscreen button is grey now Movie details view: --- Languages Dropdown: labels (subtitles and audio) are now white for all themes since the background is always dark. --- Quality selector texts: inactive text are now white for all themes since the background is always dark Show details view: --- Donwload button: Remove white text color and instead use the color definde for the button (which is often white :) ) --- src/app/styl/Official_-_Dark_theme.styl | 4 ++-- src/app/styl/views/dropdowns.styl | 2 +- src/app/styl/views/movie_detail.styl | 2 +- src/app/styl/views/show_detail.styl | 1 - 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/app/styl/Official_-_Dark_theme.styl b/src/app/styl/Official_-_Dark_theme.styl index cdd7cab083..8e514da48d 100644 --- a/src/app/styl/Official_-_Dark_theme.styl +++ b/src/app/styl/Official_-_Dark_theme.styl @@ -6,7 +6,7 @@ $MainFontBold = 'Open Sans Bold' $AlternateFont = sans-serif $ButtonFont = 'Open Sans Semibold' - + //Main app $BgColor1 = #17181b $BgColor2 = #212225 @@ -30,7 +30,7 @@ //Top Bar $TitleBarBg = #17181b $TitleBarText = #fff - $FullScreenButton = #000 + $FullScreenButton = #999 $FullScreenButtonHover = #b2b2b2 $FilterBarBg = #17181b diff --git a/src/app/styl/views/dropdowns.styl b/src/app/styl/views/dropdowns.styl index 42ac4a3a64..3a83e1618e 100644 --- a/src/app/styl/views/dropdowns.styl +++ b/src/app/styl/views/dropdowns.styl @@ -5,7 +5,7 @@ height: 35px margin-right: 15px padding: 0 15px - color: $ButtonText + color: #fff font-family: $MainFont font-smoothing: antialiased text-align: center diff --git a/src/app/styl/views/movie_detail.styl b/src/app/styl/views/movie_detail.styl index ef8fc5c2ae..62dd3246a9 100644 --- a/src/app/styl/views/movie_detail.styl +++ b/src/app/styl/views/movie_detail.styl @@ -440,7 +440,7 @@ font-family: $MainFont; -webkit-font-smoothing: antialiased; font-size: 11px - color: $ShowText1 + color: #fff transition: all .2s ease-in padding: 4px margin-right: 6px diff --git a/src/app/styl/views/show_detail.styl b/src/app/styl/views/show_detail.styl index 78424d1a15..a5c9e3ccd8 100644 --- a/src/app/styl/views/show_detail.styl +++ b/src/app/styl/views/show_detail.styl @@ -468,7 +468,6 @@ padding: 10px 0 .play-selector - color: $ShowText1 position: relative float: right margin-top: 6px From b1115cde1123609afdfb1faba1e2674420637722 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 7 Aug 2020 08:18:06 +0300 Subject: [PATCH 140/777] Lang dropdown margins fix --- src/app/styl/views/dropdowns.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styl/views/dropdowns.styl b/src/app/styl/views/dropdowns.styl index d1a6f6f599..af88204379 100644 --- a/src/app/styl/views/dropdowns.styl +++ b/src/app/styl/views/dropdowns.styl @@ -3,7 +3,6 @@ align-items: center cursor: pointer height: 35px - margin-right: 15px padding: 0 15px color: #fff font-family: $MainFont @@ -25,6 +24,7 @@ display: flex flex-wrap: wrap max-width: 100% + margin-left: 5px .flag margin: 3px From 9d2960f15bec1f9b8761dbc5d94785f080818047 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 7 Aug 2020 08:19:19 +0300 Subject: [PATCH 141/777] Lang dropdown margins fix --- src/app/styl/views/movie_detail.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styl/views/movie_detail.styl b/src/app/styl/views/movie_detail.styl index 62dd3246a9..1750645563 100644 --- a/src/app/styl/views/movie_detail.styl +++ b/src/app/styl/views/movie_detail.styl @@ -251,7 +251,7 @@ height: 70px line-height: 35px - margin: 10px 10px 6px 16px + margin: 10px 25px 6px 16px .setup-container display: flex From 311aa2c83460e8fb348b4158e3384a757afeb1da Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 7 Aug 2020 10:44:09 +0300 Subject: [PATCH 142/777] Fix item title tooltip --- src/app/lib/views/browser/item.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/lib/views/browser/item.js b/src/app/lib/views/browser/item.js index db7032ef6b..c2f48373b2 100644 --- a/src/app/lib/views/browser/item.js +++ b/src/app/lib/views/browser/item.js @@ -39,6 +39,13 @@ this.loadImage(); this.setCoverStates(); this.setTooltips(); + + this.$('.tooltipped').tooltip({ + delay: { + 'show': 800, + 'hide': 100 + } + }); }, hoverItem: function (e) { From 3e63e444eec1a1e6a668b8aabd116de278656d8a Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 7 Aug 2020 10:44:53 +0300 Subject: [PATCH 143/777] Fix item title tooltip --- src/app/templates/browser/item.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/browser/item.tpl b/src/app/templates/browser/item.tpl index bdb535f298..15202d1861 100644 --- a/src/app/templates/browser/item.tpl +++ b/src/app/templates/browser/item.tpl @@ -30,7 +30,7 @@
    -

    <%= title %>

    +

    20){ %> title="<%= title %>" data-toggle="tooltip" data-placement="auto bottom" <% } %> ><%= title %>

    <% if (typeof year !== 'undefined') {%> <%= year %> From 3baf2121e8975cd5d534e3639cb490eedd998516 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Fri, 7 Aug 2020 11:51:04 +0300 Subject: [PATCH 144/777] Fix item title tooltip --- src/app/lib/views/browser/item.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/lib/views/browser/item.js b/src/app/lib/views/browser/item.js index c2f48373b2..02f8f78f94 100644 --- a/src/app/lib/views/browser/item.js +++ b/src/app/lib/views/browser/item.js @@ -40,7 +40,7 @@ this.setCoverStates(); this.setTooltips(); - this.$('.tooltipped').tooltip({ + $('.tooltipped').tooltip({ delay: { 'show': 800, 'hide': 100 From 7155c0d7efd208d1db5211a142298bbcdf99a1b8 Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:01:29 +0200 Subject: [PATCH 145/777] gulp dist. Add another example and fix typo --- gulpfile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index a3fdd9d72e..393e63a830 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -162,7 +162,8 @@ gulp.task('default', (done) => { '\nAvailable options:', ' --platforms=', '\tArguments: ' + availablePlatforms + ',all', - '\tExample: `gulp build --platforms=all`', + '\tExample 1: `gulp dist --platforms=all`', + '\tExample 2: `gulp dist --platforms=win64,linux64`', '\nUse `gulp --tasks` to show the task dependency tree of gulpfile.js\n' ].join('\n') ); From 9b0eb0c2641af22ba8a5153f1541428df9a3e9bf Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:04:23 +0200 Subject: [PATCH 146/777] Add yarn commands: yarn css, yarn dist --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 46580ef3fb..629cc05cec 100644 --- a/package.json +++ b/package.json @@ -14,9 +14,11 @@ "version": "0.4.4", "releaseName": "Love in the Time of Corona", "scripts": { - "start": "gulp run", "build": "gulp build", "clean": "gulp clean", + "css": "gulp css", + "dist": "gulp dist", + "start": "gulp run", "test": "gulp test" }, "chromium-args": "--remote-debugging-port=9222 --enable-node-worker", From ec5b546d17bb712c547883cb93f419467ab84ca3 Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:18:59 +0200 Subject: [PATCH 147/777] Update README: instructions for building redistributable packages --- README.md | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cc22a4c106..68b5790a77 100644 --- a/README.md +++ b/README.md @@ -27,21 +27,21 @@ tap repo, "https://github.com/#{repo}.git" cask 'popcorn-time' ~~~ -#### Linux - Debian/Ubuntu based distros (tested on ubuntu 18.04): +#### Linux - Debian/Ubuntu based distros (tested on ubuntu 18.04): -* Install unzip && dependencies (they should not be always required but some users needed them to make Popcorn Time working) : +* Install unzip && dependencies (they should not be always required but some users needed them to make Popcorn Time working) : `sudo apt update && sudo apt install unzip libcanberra-gtk-module libgconf-2-4 libatomic1` -* Create popcorn-time folder in /opt/ : +* Create popcorn-time folder in /opt/ : `sudo mkdir /opt/popcorn-time` -* Download Popcorn Time archive : +* Download Popcorn Time archive : `wget https://get.popcorntime.app/repo/build/Popcorn-Time-0.4.4-linux64.zip` -* Extract the zip in /opt/popcorn-time : +* Extract the zip in /opt/popcorn-time : `sudo unzip Popcorn-Time-0.4.4-linux64.zip -d /opt/popcorn-time` -* Create symlink of Popcorn-Time in /usr/bin : +* Create symlink of Popcorn-Time in /usr/bin : `sudo ln -sf /opt/popcorn-time/Popcorn-Time /usr/bin/popcorn-time` -* Create .desktop file (so the launcher) : +* Create .desktop file (so the launcher) : `sudo nano /usr/share/applications/popcorntime.desktop` -* and copy paste the following text in the editor and save +* and copy paste the following text in the editor and save ```desktop [Desktop Entry] @@ -80,6 +80,26 @@ Optionally, you may simply run `./make_popcorn.sh` if you are on a linux or mac Full instructions & troubleshooting tips can be found in the [Contributing Guide](CONTRIBUTING.md#contributing-to-popcorn-time). + +#### Building redistribuable packages/installers: + +1. `yarn config set yarn-offline-mirror ./node_modules/` +2. `yarn install --ignore-engines` +2. `yarn dist --platforms=` + +`` can be one or more of the folowing values (separated by a comma `,`): + +- `win64` +- `win32` +- `linux64` +- `linux32` +- `osx64` +- `all` + + +Redistribuable packages are saved into `/build` subfolder. + + ## Community From 8b3f4a1ac98ffb0e5ef695ec35755189d93cdf4b Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:20:33 +0200 Subject: [PATCH 148/777] yarn.lock updating it due to flag-icon-css addition --- yarn.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/yarn.lock b/yarn.lock index f075fabc8f..9364fe30ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2400,6 +2400,11 @@ first-chunk-stream@^1.0.0: resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= +flag-icon-css@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/flag-icon-css/-/flag-icon-css-3.5.0.tgz#430747d5cb91e60babf85494de99173c16dc7cf2" + integrity sha512-pgJnJLrtb0tcDgU1fzGaQXmR8h++nXvILJ+r5SmOXaaL/2pocunQo2a8TAXhjQnBpRLPtZ1KCz/TYpqeNuE2ew== + flagged-respawn@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" From 95429d3a00696dba88c89ba820491ece189a3511 Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:28:57 +0200 Subject: [PATCH 149/777] Readme: fix formatting --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 68b5790a77..55346a28d4 100644 --- a/README.md +++ b/README.md @@ -31,17 +31,17 @@ cask 'popcorn-time' * Install unzip && dependencies (they should not be always required but some users needed them to make Popcorn Time working) : `sudo apt update && sudo apt install unzip libcanberra-gtk-module libgconf-2-4 libatomic1` -* Create popcorn-time folder in /opt/ : +* Create popcorn-time folder in /opt/ : `sudo mkdir /opt/popcorn-time` -* Download Popcorn Time archive : +* Download Popcorn Time archive : `wget https://get.popcorntime.app/repo/build/Popcorn-Time-0.4.4-linux64.zip` -* Extract the zip in /opt/popcorn-time : +* Extract the zip in /opt/popcorn-time : `sudo unzip Popcorn-Time-0.4.4-linux64.zip -d /opt/popcorn-time` -* Create symlink of Popcorn-Time in /usr/bin : +* Create symlink of Popcorn-Time in /usr/bin : `sudo ln -sf /opt/popcorn-time/Popcorn-Time /usr/bin/popcorn-time` -* Create .desktop file (so the launcher) : +* Create .desktop file (so the launcher) : `sudo nano /usr/share/applications/popcorntime.desktop` -* and copy paste the following text in the editor and save +* and copy paste the following text in the editor and save ```desktop [Desktop Entry] @@ -69,7 +69,7 @@ The [master](https://github.com/popcorn-official/popcorn-desktop) branch which c 1. `yarn start` -If you encounter trouble with the above method, you can try: +If you encounter trouble with the above method, you can try: 1. `yarn config set yarn-offline-mirror ./node_modules/` 2. `yarn install --ignore-engines` From 824925770937272a47d527ea6feb62cf60d6b50e Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:28:57 +0200 Subject: [PATCH 150/777] Readme: fix formatting --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 68b5790a77..effe8e82e9 100644 --- a/README.md +++ b/README.md @@ -29,19 +29,19 @@ cask 'popcorn-time' #### Linux - Debian/Ubuntu based distros (tested on ubuntu 18.04): -* Install unzip && dependencies (they should not be always required but some users needed them to make Popcorn Time working) : +* Install unzip && dependencies (they should not be always required but some users needed them to make Popcorn Time working) : `sudo apt update && sudo apt install unzip libcanberra-gtk-module libgconf-2-4 libatomic1` -* Create popcorn-time folder in /opt/ : +* Create popcorn-time folder in /opt/ : `sudo mkdir /opt/popcorn-time` -* Download Popcorn Time archive : +* Download Popcorn Time archive : `wget https://get.popcorntime.app/repo/build/Popcorn-Time-0.4.4-linux64.zip` -* Extract the zip in /opt/popcorn-time : +* Extract the zip in /opt/popcorn-time : `sudo unzip Popcorn-Time-0.4.4-linux64.zip -d /opt/popcorn-time` -* Create symlink of Popcorn-Time in /usr/bin : +* Create symlink of Popcorn-Time in /usr/bin : `sudo ln -sf /opt/popcorn-time/Popcorn-Time /usr/bin/popcorn-time` -* Create .desktop file (so the launcher) : +* Create .desktop file (so the launcher) : `sudo nano /usr/share/applications/popcorntime.desktop` -* and copy paste the following text in the editor and save +* and copy paste the following text in the editor and save ```desktop [Desktop Entry] @@ -69,7 +69,7 @@ The [master](https://github.com/popcorn-official/popcorn-desktop) branch which c 1. `yarn start` -If you encounter trouble with the above method, you can try: +If you encounter trouble with the above method, you can try: 1. `yarn config set yarn-offline-mirror ./node_modules/` 2. `yarn install --ignore-engines` From 77a7f06570d11e2e425a0c183f6f8f6bac764949 Mon Sep 17 00:00:00 2001 From: Persei08 Date: Fri, 7 Aug 2020 17:36:46 +0200 Subject: [PATCH 151/777] Readme: typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index effe8e82e9..794e074e2d 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Full instructions & troubleshooting tips can be found in the [Contributing Guide - `all` -Redistribuable packages are saved into `/build` subfolder. +Redistribuable packages are saved into `build/` subfolder. From d0e94a4eadb349f8fa1e69b3099b01e5c926cadb Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 04:46:41 +0300 Subject: [PATCH 152/777] Lang dropdown flag hover fix --- src/app/styl/views/dropdowns.styl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/styl/views/dropdowns.styl b/src/app/styl/views/dropdowns.styl index af88204379..ec20743d11 100644 --- a/src/app/styl/views/dropdowns.styl +++ b/src/app/styl/views/dropdowns.styl @@ -26,6 +26,10 @@ max-width: 100% margin-left: 5px + .flag + &:hover + -webkit-filter: drop-shadow(0px 0px 2px #fff) brightness(1.4) + .flag margin: 3px background-image: url("../images/flags/question.svg") From 4040848955338e8f8a61d704b9e616ab0f03f42f Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 05:11:42 +0300 Subject: [PATCH 153/777] Lang dropdown flag size fix --- src/app/styl/views/dropdowns.styl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/styl/views/dropdowns.styl b/src/app/styl/views/dropdowns.styl index ec20743d11..0a1e2c3788 100644 --- a/src/app/styl/views/dropdowns.styl +++ b/src/app/styl/views/dropdowns.styl @@ -31,13 +31,13 @@ -webkit-filter: drop-shadow(0px 0px 2px #fff) brightness(1.4) .flag - margin: 3px + margin: 6px 4px background-image: url("../images/flags/question.svg") background-size: 24px 24px background-position: center cursor: pointer - width: 24px - height: 22px + width: 22px + height: 16px &.none background-image: url("../images/flags/none.svg") &.toggle From 045a71f87d0947edf2d512e9fc44c1734755a278 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 07:43:45 +0300 Subject: [PATCH 154/777] Fix anime detail view poster & backdrop --- src/app/butter-provider/anime.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/app/butter-provider/anime.js b/src/app/butter-provider/anime.js index 82b906ef50..8e9aabf7f8 100644 --- a/src/app/butter-provider/anime.js +++ b/src/app/butter-provider/anime.js @@ -31,10 +31,8 @@ AnimeApi.prototype.config = { function formatFetch(animes) { var results = _.map(animes, function(anime) { return { - images: { - poster: 'https://media.kitsu.io/anime/poster_images/' + anime._id + '/large.jpg', - fanart: 'https://media.kitsu.io/anime/cover_images/' + anime._id + '/original.jpg', - }, + poster: 'https://media.kitsu.io/anime/poster_images/' + anime._id + '/large.jpg', + backdrop: 'https://media.kitsu.io/anime/cover_images/' + anime._id + '/original.jpg', mal_id: anime._id, haru_id: anime._id, tvdb_id: 'mal-' + anime._id, @@ -69,12 +67,8 @@ function formatDetail(anime) { synopsis: anime.synopsis, network: [], //FIXME rating: anime.rating, - images: { - poster: 'https://media.kitsu.io/anime/poster_images/' + anime._id + '/large.jpg', - fanart: 'https://media.kitsu.io/anime/cover_images/' + anime._id + '/original.jpg', - }, - backdrop: anime.images.fanart, - poster: anime.images.poster, + poster: 'https://media.kitsu.io/anime/poster_images/' + anime._id + '/large.jpg', + backdrop: 'https://media.kitsu.io/anime/cover_images/' + anime._id + '/original.jpg', year: anime.year, type: anime.type }; From 91a32a237ebdce3b601996456bb94d38c5a6a151 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:07:21 +0300 Subject: [PATCH 155/777] Replace Butter logo with Popcorn Time logo --- src/app/templates/about.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/about.tpl b/src/app/templates/about.tpl index e1b0406417..988f88e8af 100644 --- a/src/app/templates/about.tpl +++ b/src/app/templates/about.tpl @@ -2,7 +2,7 @@

    - +
    From f9a77e51d445d2ff8ad708d286ec2470f8ea38d1 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:07:58 +0300 Subject: [PATCH 156/777] Replace Butter logo with Popcorn Time logo --- src/app/templates/initializing.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/initializing.tpl b/src/app/templates/initializing.tpl index a8e9ca8d81..53b5af8d1b 100644 --- a/src/app/templates/initializing.tpl +++ b/src/app/templates/initializing.tpl @@ -1,5 +1,5 @@ - +
    <%= i18n.__("Made with") %> <%= i18n.__("by a bunch of geeks from All Around The World") %>
    From 5d5cfee732049c95d0112b820f911ab665d229e3 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:08:22 +0300 Subject: [PATCH 157/777] Replace Butter logo with Popcorn Time logo --- src/app/images/popcorn-time-logo.svg | 104 +++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/app/images/popcorn-time-logo.svg diff --git a/src/app/images/popcorn-time-logo.svg b/src/app/images/popcorn-time-logo.svg new file mode 100644 index 0000000000..bb96d992df --- /dev/null +++ b/src/app/images/popcorn-time-logo.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + From ff315ef407d5065edc0164df1a8b6044ea1d6380 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:17:00 +0300 Subject: [PATCH 158/777] Small Seedbox fix --- src/app/lib/views/seedbox.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/lib/views/seedbox.js b/src/app/lib/views/seedbox.js index aaf9300a94..3f15d3f382 100644 --- a/src/app/lib/views/seedbox.js +++ b/src/app/lib/views/seedbox.js @@ -161,7 +161,9 @@ const onTorrentReady = () => { // We may have set the name to "Unknown torrent" but we have the name now that it's ready - document.getElementById(`title-${torrent.infoHash}`).innerText = torrent.name; + if (document.getElementById(`title-${torrent.infoHash}`)) { + document.getElementById(`title-${torrent.infoHash}`).innerText = torrent.name; + } let metricsLastUpdated = Date.now(); const timeBetweenMetricsUpdatesInMs = 1000; From bf060324456f4f57016c6f0de73d30ca2e08783e Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:58:22 +0300 Subject: [PATCH 159/777] Update about.tpl --- src/app/templates/about.tpl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app/templates/about.tpl b/src/app/templates/about.tpl index 988f88e8af..ce456e6bcc 100644 --- a/src/app/templates/about.tpl +++ b/src/app/templates/about.tpl @@ -12,10 +12,6 @@ <% } %>
    - -
    <%= i18n.__("%s is the result of many developers and designers putting a bunch of APIs together to make the experience of watching torrent movies as simple as possible.", Settings.projectName) %>
    @@ -23,6 +19,10 @@
    + +
    From 0442582baffa971e5ef0a07454c903f8c6a521c1 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 08:59:24 +0300 Subject: [PATCH 160/777] Update about.styl --- src/app/styl/views/about.styl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/styl/views/about.styl b/src/app/styl/views/about.styl index 4f19cf8973..422ee54166 100644 --- a/src/app/styl/views/about.styl +++ b/src/app/styl/views/about.styl @@ -57,7 +57,7 @@ line-height 1.2em text-align: justify text-align-last: center - margin 0 auto + margin 40px auto max-width 42em font-size 1em From 931f0725933814d838fafb95e6eb7dbe1626c605 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 09:19:05 +0300 Subject: [PATCH 161/777] Update about.tpl --- src/app/templates/about.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/about.tpl b/src/app/templates/about.tpl index ce456e6bcc..474fd5dbe0 100644 --- a/src/app/templates/about.tpl +++ b/src/app/templates/about.tpl @@ -20,7 +20,7 @@
    From e35512449ffe9ff031b65101c24ca8a1706835d2 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 09:24:57 +0300 Subject: [PATCH 162/777] Update about.styl --- src/app/styl/views/about.styl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/app/styl/views/about.styl b/src/app/styl/views/about.styl index 422ee54166..5dac242ab8 100644 --- a/src/app/styl/views/about.styl +++ b/src/app/styl/views/about.styl @@ -37,6 +37,17 @@ font-size 17px text-align center + .title-issue + a + color #fff + font-family $AlternateFont + font-size 15px + text-decoration none + + &:hover + color $ButtonBgHover + text-decoration none + .title-big font-size 2.4em position absolute From 8fe1412c5e9036db79edc2bcc042c2156d7320ce Mon Sep 17 00:00:00 2001 From: pcenta Date: Sat, 8 Aug 2020 11:56:42 +0200 Subject: [PATCH 163/777] Remove duplicate code from videojshooks.js --- src/app/vendor/videojshooks.js | 44 ---------------------------------- 1 file changed, 44 deletions(-) diff --git a/src/app/vendor/videojshooks.js b/src/app/vendor/videojshooks.js index da766bdf78..2799766a82 100644 --- a/src/app/vendor/videojshooks.js +++ b/src/app/vendor/videojshooks.js @@ -458,51 +458,7 @@ var suggestedExternal = function () { } catch (e) {} return link; }; -vjs.ErrorDisplay.prototype.update = function () { - if (this.player().error()) { - $('.vjs-error-display').dblclick(function (event) { - App.PlayerView.toggleFullscreen(); - event.preventDefault(); - }); - if (this.player().error().message === 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support.' || this.player().error().message === 'The video could not be loaded, either because the server or network failed or because the format is not supported.') { - this.contentEl_.innerHTML = i18n.__('The video playback encountered an issue. Please try an external player like %s to view this content.', suggestedExternal()); - } else { - this.contentEl_.innerHTML = this.localize(this.player().error().message); - } - } -}; - -/** - * The custom progressbar we create. Updated in player.js - * - * @constructor - */ -vjs.LoadProgressBar = vjs.Component.extend({ - init: function (player, options) { - vjs.Component.call(this, player, options); - this.on(player, 'progress', this.update); - } -}); -vjs.LoadProgressBar.prototype.createEl = function () { - return vjs.Component.prototype.createEl.call(this, 'div', { - className: 'vjs-load-progress', - innerHTML: 'Loaded: 0%' - }); -}; -vjs.LoadProgressBar.prototype.update = function () { - return; -}; -//Display our own error -var suggestedExternal = function () { - var link = 'VLC'; - try { - App.Device.Collection.models.forEach(function (player) { - link = (player.id === 'VLC') ? player.id : link; - }); - } catch (e) {} - return link; -}; vjs.ErrorDisplay.prototype.update = function () { if (this.player().error()) { if (this.player().error().message === 'The video playback was aborted due to a corruption problem or because the video used features your browser did not support.') { From 05332818e6e768f7e8a1b543f592316caebac82f Mon Sep 17 00:00:00 2001 From: pcenta Date: Sat, 8 Aug 2020 12:01:01 +0200 Subject: [PATCH 164/777] Duplicate jQuery selector fix for videojshooks.js --- src/app/vendor/videojshooks.js | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/app/vendor/videojshooks.js b/src/app/vendor/videojshooks.js index 2799766a82..9148b48d75 100644 --- a/src/app/vendor/videojshooks.js +++ b/src/app/vendor/videojshooks.js @@ -86,24 +86,27 @@ vjs.TextTrack.prototype.load = function () { this.readyState_ = 1; var subsParams = function () { - $('#video_player .vjs-text-track').css('display', 'inline-block').drags(); - $('#video_player .vjs-text-track-display').css('font-size', Settings.subtitle_size); + var subtitles = $('.vjs-subtitles'); + var vjsTextTrack = $('.vjs-text-track'); + + vjsTextTrack.css('display', 'inline-block').drags(); + vjsTextTrack.css('font-size', Settings.subtitle_size); if (win.isFullscreen) { - $('.vjs-text-track').css('font-size', '140%'); + vjsTextTrack.css('font-size', '140%'); } - $('.vjs-subtitles').css('color', Settings.subtitle_color); - $('.vjs-subtitles').css('font-family', Settings.subtitle_font); + subtitles.css('color', Settings.subtitle_color); + subtitles.css('font-family', Settings.subtitle_font); if (Settings.subtitle_decoration === 'None') { - $('.vjs-text-track').css('text-shadow', 'none'); + vjsTextTrack.css('text-shadow', 'none'); } else if (Settings.subtitle_decoration === 'Opaque Background') { - $('.vjs-text-track').css('background', '#000'); + vjsTextTrack.css('background', '#000'); } else if (Settings.subtitle_decoration === 'See-through Background') { - $('.vjs-text-track').css('background', 'rgba(0,0,0,.5)'); + vjsTextTrack.css('background', 'rgba(0,0,0,.5)'); } if (Settings.subtitles_bold) { - $('.vjs-text-track').css('font-weight', 'bold'); + vjsTextTrack.css('font-weight', 'bold'); } - $('.vjs-text-track').css('z-index', 'auto').css('position', 'relative').css('top', AdvSettings.get('playerSubPosition')); + vjsTextTrack.css('z-index', 'auto').css('position', 'relative').css('top', AdvSettings.get('playerSubPosition')); }; // Fetches a raw subtitle, locally or remotely From 0058eef2e924428dd2e829ddb9064a5efef54f84 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 14:57:42 +0300 Subject: [PATCH 165/777] Style lang dropdown tooltip --- src/app/templates/lang-dropdown.tpl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/templates/lang-dropdown.tpl b/src/app/templates/lang-dropdown.tpl index 653e51b922..7e147ffdec 100644 --- a/src/app/templates/lang-dropdown.tpl +++ b/src/app/templates/lang-dropdown.tpl @@ -8,7 +8,7 @@
    <% for(var lang in values){ %> <% if(lang.indexOf('|')!==-1) continue; %> -
    +
    <% } %>
    From 45af311fb5fcc8bc17ce9fede684baf16db9dbfc Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sat, 8 Aug 2020 14:58:28 +0300 Subject: [PATCH 166/777] Style lang dropdown tooltip --- src/app/lib/views/lang_dropdown.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/lib/views/lang_dropdown.js b/src/app/lib/views/lang_dropdown.js index a2ea369432..3c933c53f2 100644 --- a/src/app/lib/views/lang_dropdown.js +++ b/src/app/lib/views/lang_dropdown.js @@ -42,6 +42,13 @@ this.model.set('values', newLangs); this.values = newLangs; this.render(); + + $('.tooltipped').tooltip({ + delay: { + 'show': 800, + 'hide': 100 + } + }); }, setLang: function (value) { From 36152c494b856b55bbb09b4e66ffd5377a09cb11 Mon Sep 17 00:00:00 2001 From: kiriles90 <38388670+kiriles90@users.noreply.github.com> Date: Sun, 9 Aug 2020 05:24:54 +0300 Subject: [PATCH 167/777] Automatically select the default subtitle language --- src/app/lib/views/lang_dropdown.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/app/lib/views/lang_dropdown.js b/src/app/lib/views/lang_dropdown.js index 3c933c53f2..047520c963 100644 --- a/src/app/lib/views/lang_dropdown.js +++ b/src/app/lib/views/lang_dropdown.js @@ -43,6 +43,10 @@ this.values = newLangs; this.render(); + if ((Settings.subtitle_language !== 'none') && (Settings.subtitle_language in newLangs)) { + this.setLang(Settings.subtitle_language); + } + $('.tooltipped').tooltip({ delay: { 'show': 800, From 64397d9ce25be6d12c6ee125a95f43f5fc7c3b1c Mon Sep 17 00:00:00 2001 From: pcenta Date: Sat, 8 Aug 2020 18:23:27 +0200 Subject: [PATCH 168/777] Remove unneeded tooltip that is same as actual shown text --- src/app/lib/views/browser/filter_bar.js | 6 ------ src/app/templates/browser/filter-bar.tpl | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/app/lib/views/browser/filter_bar.js b/src/app/lib/views/browser/filter_bar.js index e49317bac8..64174ab993 100644 --- a/src/app/lib/views/browser/filter_bar.js +++ b/src/app/lib/views/browser/filter_bar.js @@ -212,12 +212,6 @@ hide: 100 } }); - this.$('.providerinfo').tooltip({ - delay: { - show: 50, - hide: 50 - } - }); if (Settings.rememberFilters) { try { diff --git a/src/app/templates/browser/filter-bar.tpl b/src/app/templates/browser/filter-bar.tpl index ff2eb3ce7a..c95c142ea7 100644 --- a/src/app/templates/browser/filter-bar.tpl +++ b/src/app/templates/browser/filter-bar.tpl @@ -1,8 +1,8 @@