From de5a65d77a6341349f585f9588b0f1bafe009de3 Mon Sep 17 00:00:00 2001
From: marco <10120390+mac12m99@users.noreply.github.com>
Date: Thu, 17 Dec 2020 18:41:54 +0100
Subject: [PATCH] KoD 1.5.1
- corretta e migliorata la nuova ricerca globale\n- salvataggio punto di visione basato sull'id tmdb (disponibile su qualunque canale / server anche senza salvare in videoteca)\n- alcuni fix e migliore\n
---
addon.xml | 9 +-
channels.json | 100 ++--
channels/animeunity.py | 5 +-
channels/cinemalibero.py | 2 +-
channels/filmpertutti.py | 8 +-
channels/paramount.py | 5 +-
channels/raiplay.py | 4 +-
channels/streamingcommunity.py | 24 +-
channels/vvvvid.py | 11 +-
core/autoplay.py | 3 +-
core/httptools.py | 2 +-
core/scraper.py | 7 +-
core/support.py | 13 +-
platformcode/launcher.py | 24 +-
platformcode/platformtools.py | 157 +++---
platformcode/xbmc_videolibrary.py | 40 +-
resources/settings.xml | 1 +
resources/skins/Default/720p/GlobalSearch.xml | 230 +++++----
.../skins/Default/720p/NextDialogExtended.xml | 1 +
.../skins/Default/720p/ResumePlayback.xml | 28 +-
resources/skins/Default/media/valid.png | Bin 0 -> 16687 bytes
servers/akvideo.json | 2 +-
servers/anavids.json | 2 +-
servers/animeid.json | 2 +-
servers/anonfile.json | 2 +-
servers/archiveorg.json | 2 +-
servers/backin.json | 2 +-
servers/badshare.json | 2 +-
servers/bdupload.json | 2 +-
servers/cinemaupload.json | 2 +-
servers/clicknupload.json | 2 +-
servers/clipwatching.json | 2 +-
servers/cloudvideo.json | 2 +-
servers/crunchyroll.json | 2 +-
servers/dailymotion.json | 2 +-
servers/deltabit.json | 2 +-
servers/directo.json | 2 +-
servers/doodstream.json | 2 +-
servers/dostream.json | 2 +-
servers/downace.json | 2 +-
servers/facebook.json | 2 +-
servers/fastplay.json | 2 +-
servers/fembed.json | 2 +-
servers/fex.json | 2 +-
servers/filefactory.json | 2 +-
servers/filepup.json | 2 +-
servers/filescdn.json | 2 +-
servers/filesmonster.json | 2 +-
servers/flashx.json | 2 +-
servers/fourshared.json | 2 +-
servers/gamovideo.json | 2 +-
servers/gigasize.json | 2 +-
servers/googlevideo.json | 2 +-
servers/gounlimited.json | 2 +-
servers/gvideo.json | 2 +-
servers/hdload.json | 2 +-
servers/hdmario.json | 2 +-
servers/hugefiles.json | 2 +-
servers/idtbox.json | 2 +-
servers/jawcloud.json | 2 +-
servers/jetload.json | 2 +-
servers/mailru.json | 2 +-
servers/mediafire.json | 2 +-
servers/mega.json | 2 +-
servers/mixdrop.json | 2 +-
servers/mp4upload.json | 2 +-
servers/mydaddy.json | 2 +-
servers/mystream.json | 4 +-
servers/myupload.json | 2 +-
servers/netutv.json | 2 +-
servers/nowvideo.json | 2 +-
servers/okru.json | 2 +-
servers/onefichier.json | 2 +-
servers/onlystream.json | 2 +-
servers/rapidgator.json | 2 +-
servers/rcdnme.json | 2 +-
servers/rutube.json | 2 +-
servers/samaup.json | 2 +-
servers/sendvid.json | 2 +-
servers/speedvideo.json | 2 +-
servers/streamtape.json | 2 +-
servers/streamz.json | 2 +-
servers/supervideo.json | 2 +-
servers/thevid.json | 2 +-
servers/thevideobee.json | 2 +-
servers/torrent.json | 2 +-
servers/turbobit.json | 2 +-
servers/turbovid.json | 2 +-
servers/tusfiles.json | 2 +-
servers/unsupported.json | 2 +-
servers/uploadedto.json | 2 +-
servers/uppom.json | 2 +-
servers/upstream.json | 2 +-
servers/uptobox.json | 2 +-
servers/upvid.json | 2 +-
servers/uqload.json | 2 +-
servers/userscloud.json | 2 +-
servers/vevio.json | 2 +-
servers/vidcloud.json | 2 +-
servers/videobin.json | 2 +-
servers/videomega.json | 2 +-
servers/vidfast.json | 2 +-
servers/vidlox.json | 2 +-
servers/vidmoly.json | 2 +-
servers/vidoza.json | 2 +-
servers/vidtodo.json | 2 +-
servers/vidtome.json | 2 +-
servers/vidup.json | 2 +-
servers/vimeo.json | 2 +-
servers/vimpleru.json | 2 +-
servers/vivo.json | 2 +-
servers/vk.json | 2 +-
servers/vshare.json | 2 +-
servers/vudeo.json | 2 +-
servers/vupplayer.json | 2 +-
servers/vupplayer.py | 2 +-
servers/vvvvid.json | 2 +-
servers/watchanimestream.json | 2 +-
servers/watchvideo.json | 2 +-
servers/wstream.json | 2 +-
servers/youdbox.json | 2 +-
servers/yourupload.json | 2 +-
servers/youtube.json | 2 +-
servers/youwatch.json | 2 +-
servers/zippyshare.json | 2 +-
service.py | 31 +-
{platformcode => specials}/globalsearch.py | 458 ++++++++++++------
specials/search.py | 22 +-
specials/setting.py | 9 +-
specials/videolibrary.py | 2 +-
130 files changed, 853 insertions(+), 553 deletions(-)
create mode 100644 resources/skins/Default/media/valid.png
rename {platformcode => specials}/globalsearch.py (55%)
diff --git a/addon.xml b/addon.xml
index 309038d7..d83941d5 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,4 +1,4 @@
-
BNnHy zd34C9;6ML~&mFZS5|y`IND$%N%Ea^qoX5h?Zw2Ax%fWL$9*3^Xr>FB$dDB%yn8nOt zE*q<(DzNYc;Y~W=UE#MgXUCnQv&xp@;)i?)-81$9ex` F)=aVH ySPLBZJS((KI4%;U$8Z{NO6@y55jdbJ;q#~(g? zSWr+qdFwj}{H0E94OegZT%@_daQ^%_JnHiFLr-7d*^=7z;EB)Z9^Srl$GGt(xwLe4 z=xw~#^}V~<*lb;0Pv9E+jZI9_LVm)r!&7;uy}$; }Ye%&TKUi0K4J^(K zuFOw9_n+KL zsXbUM!AWALp !t@uXG^0E+gBr%`2%OTj<=@TEBQAH4@+9mVUcY`V zSh58`i*?x2@L*${3B$z|b EU06=oZz9PwQ-x_u(Uu6i!Y}=Ykv2JOxewi z>zmV>7h6F9ySXB)O-oCA?b uNaqKQGbrU(3rIeMTIA`0!zVxL@;4el2#9Q{)9& zT|R(FGBQsgaseu&Sj;({J^SmkecamOU|gUsojC#Fl8}~OTb*rltf9CD1ua21uYt&r zB %m22Uc)H``@OnE z563HyB~uS zp65S4d?oyH+k@ibpV2&FmHv~KUS5y%4C%M9aNWIi%h=RZ6Gz7Z8&%ia8wR`J@9$4h zo7(|UaMv#1pFQ$a-pr!Q XGfMFQrZe;g^N^`3L)7g+I%o7L@wMBqo}}yn}=BM7E9$ z + zT0|5L?>t0_=J8x~{Y6hdbpxD9QR{ySj;GMPgawDE^z AQ*4w)ZYN04rjq`*;iCRzzOh+ *F-EY8y1tw*muIv&x z*P3i$X$g>vyBGjnLkuUZXgW)$wV}$IUtpjdky&kEFM KxHn@4m&B46%hVFm z+If3>@aE1XfDC!U7GJ%6tHUnLeE06%#g&z*?((fujFQS& #gJYv2+JF4xdkST)<(?EQc{q)@jHl<+$wIT4+SZWJ(6uDb z7ghF+ED-M?XtwU&vxgOjPuQ4BN=xJ6-YTw)B|i?G>(E;53p#0IQ|sKp_pq-Jf#|}? z$(f}UH&RUtuI1aeZ?!8w6{x&t)i4| F8}00V6`xks)4<{tS2>+@xv>O?JS~o+>Twpx13}armb2%F0UY?%j|? z8ZqpkPo Y~bsje!Vfk-#-wvqMhz3}^k`OF>J3^*bp z*42vu1}JJj&yTd+Q{<5n+VYb|vhtG+Nl8Q`27m19{iLMCBd4PlR<`ED2Ub8*@>W|k zEnrFb7^W(MeGde#dX^k;Ex$in5mtQWIeVKm^ZAYSwez2fbKrTq1Pn|IKTw3QEcCXg zARDSqNx>1XK24GHJ`1Zx5h8cONeo*a6QE+ LyrQug`z=G|59=RR8{X`hqfN|KK41wGZ(Q%=ET`J=V3BfK`8w ze=0CRY`{cc1pjv3?8n>~!IHs6MMXtK5b~VsA!A*b{Hm2g6Id27Wv!gX2#F|satt!` z0@+%4Azd4poYYVGZVhI)m0cviurLdv-0;AFgexV#z$A}_N4e+AmnvA32M?N^)57K_ zzCb;qx3}K@?Af#S_P&eLc2r*G*S`;YOXipr@&j5oDYN_V;3RZM5lY_<(HOE#A6SO< z74pN(% Fn%;1MMAXLeSKVuq^uMe3YV=u*C`KOi~K*cW^jByc+W6 z&6}Ck&v}nv?_t#@hu T2Wg1HvV#F|6cN3LmZDGZUCKUl&uRcblGaqEmFH70 zr0U9ZD*D2b>ZRV~r3PQcU!uuC4vY*A?qXw8g>~9kY*cA}_pZR?<(XWAlxN_BAnTgn z*a1HQ&*`P$KX?^z*uzr_&59&{X#LpF%S&!sdEmI6p7-%sS6 k;wz(w#ErZ zW_sT3kYn_kg*6VS2yDY|UawA}i-?R=nyZp`7Qm8^LP6-9r>9}ccNwmA-#SJZl^5>i zR~>SAIIRIq_9dDd4f#e{`TRZf(Hn~5-7qaHhH3wuY`b?K!>R2jAe|gXo!N*HU%eLF zX!#9EI9ej&DS)w>^mr0Qa|0? -8i{bXnMNUW?NM6BBMsvY&PA8)7nI)9C~erikch6Rk@0$WwMi99M?PbYQGP z%OPo3$Eh(9kQ7II`@!*X-IUDRW`%EV)kes{18)VWy16|xE4=M`K4oZp9D=Gwiuyb> zmUd`jGw=^=_zVDmnVA{9?A5}t5`K4vq0vz%2M6sZ1+7w2QiIf%)49-k_ujoHa05?K zjIG6njqbA1>SpPun)CK@*Cg;`Rh^cg>Z0ZRp{FONkEHFTutq#EL5BQ;GuY_+{Os&( zRxEFbAlU$LnzFJoMaVKIC+Ey_|LgcjFFDv@W8zB)Vv9k%=}`SR#giL9T~cBK;Em!c zO}uIbKndo{e{HNJYn;rq>yV$1!s> @xzrdtvA9K1%YT$P!Dq|6xy2`b+MsNh3 zowx9ja}Gz>h+x&d!Q)5F%|Ere9ROrpP@wZbJLUCPX09jvNmHU}G&D5%{AGC3`UMvk zA$S_pDj_`<7jJKDY<&0b-M4RN3O_)#WMp{Q(a9+ =kRb& z2zfTqCd}fgn}w0lj$^7!O@7PcP|pLu?gUv^u;+ed< bzI-bA4@P-`>3k zTCys*p}s-=a19?BlYz`ZhNg+jIB9Hb?C5yVeM`Az4b*D@p>%)wQa(CWQCfPs%4Znh z;8NAqUT)^Q>oJcZG6EPiol=3+A~iW##4fd!aoe`+SYCTU1bk!&7{Iahz*x(o-ly(K z+}HSG_DZ{ced_KrhB)exQnYwN%cMxjtHKKmVg4HO>X;vGU0v~b^};mL`n~BcVwcU- zzF&a<1+TFXI_I2HQj_uwQf?jA5tu36*Sv#Sl>~@{vV+6^;e!WMaQmidy>G`#>PZZO zZp%^)%kz_8@2R8$BtLWJ$jQ5{{SLAT;OW-os+JEdKr>$kK~HD~^=$l-jDDS1Z;ITP z?cg5L1 i!^&lA$h}=n57Bb HO4(%9B2s33?adHYOVJf8LT?OTZvfxTb^)9sk%)OEe9g9`xU z_sM!_@63%~o*UD^sTD(~--mj`-zAFeo6W%=zq^hv!=*2dk)U+d+K2Dy?5ulBv^DTQ zj;`+8j*gpn8vBMC8n?2s5{(a-t7))@r1jY}h=M77ECQb{J|~VJ|3|Ov=`AgKgBNbx z%&U!^QBaK-BSCD2gyqB&p{&p~?wI%#qgVp63{`@P^70&mS9c$azP_nP!rA+i8M`*X zPCQ>M<(jJOgVMkDlN5s|rKM7`vUvvkbp?^o%Bre+XrQu%dM{u*@wq%U2qA-ha3>Tx zTp&y>EiD mrqEbJsnAZ1+ZZiwBDo?TqE$={vRTAp>qQ(*L+zkl5!b^9yuN`y~F!0y;qK5fV z|K-a)v_nq6?MQKMZR~zL(p4MZv?sHDz#%aKhb1e6mE`k_H{3m*CDDFIK6xGA>5t@+ zMmc}#e%_xvaqCGqO*?}CD~3X$aGWjefteIQ7dAVSv53I)Y{0d11O5G~xQi0?SY))z zCT|u;9uwP5i;MKbrqXw@!Z6VQ_s5b?bZ>7yyFBifODn#1@W4_cK?SmI$_@u6`gB&n z%T&e~PTRiIrRT1Tz(~W;j*b{GljF}AgMBUc4?V7b@ Gi2XD%(M!IJ6kL?P7hN%>^FhReeQK{MKi^LW+uz zckv{;o ?(dTm+qnI8(DM@>?U@8)23KdAM8n_j zx-5kyC&R2e(4w+hbB(Bi!s!S47c*vL);O6}TQ}$N^_;u=kq^00Tg&OjazL0&(^)=A z+4s-&(yyy8hN6{C*wV2FMHepu(m#24H!J 8#O +cDeKo_6le;-^3qB(6Wt5 z`iF&hX>> X zH=pOP1C#aQMJgPaEuR;T?tR}=<=cTt?k6ovc`)}wo&1lj#z93FY*pgi`SZd{GSJ}0 zn>nYbrJdA_%*;#pOCqSTyv65l>0W5Z3=K&_dSm?U>PMZwMiE_B_;~!i*9teDd?O}T zWiS`{he0x#+fQv{U|^_s=fbI~Tf?{(bw7vwb(@yAw*--{fn#=V?&y#C4$SdG&&S%f zZT$134+6=Ap0k#&E|VO|36h$hR<;reK{(e@EdaTr$$Pob^nr5dGI*wcteD{8!<|s> z61ofYVp>{Sh6+8-md+=6Jw}2=+7LbS44Oh^0g?ua5PC@CpzwYF{$46JMuMG-%PqoC zje#RUFHgl@L{RWD>Sa!vn-A*Pu7Oi9J$dpNIE4l%{9m6{`+?BjoSJhwzPhZ$A)t_j zZvN}Hp^Xq(kFSXMk%u6DbK3Xz_QLq 9%hH0>q;6VU07cjd)pl+gAu;du8~8Ir<^ z5#J|LXn-^XCyGuN7?FkXPi=S8F0 k1`e-@t z-nsMakfA1n-z}P46{(Ng87E);6_x;^8EH97156zx3F1{fn^6b=K|BGkE*$269Cf7y z+1U~CA*?Y$xJ82>h?3wru!>^D+|0}xt!GDC!K51BmI_4d`QDDfWoD1HY1ak@eE&N% zFT8{@JoNxMgSK1WuB#8wR%>f40GytQD9K2gb{+v)8i|Iw`g$f69B!JxoCMF`uMq`< ze$(b5s0El~cx1#FrohRmvk$>dBhAnvyrhR`@yqsMM*8&Hgaj;rLUj#|w>Ix$S)Akf z@@liPvSvJ$U!+kerc_4BD4O=Z4~6FPL0hXLBadyCul-)uVA1qD{*eBYM~~9cC97SV z-zQ2Fumy0Yq!gNT1FXTqPPAhJ(AeK|;R}bMLb_fCf{#oSAY2L$2ST^NL_CVcHby9T z`FUlf*DrSGhAu#afPm$FN45bb0CpNGIJpKLC#E-1LCi5Nt)zSRjPjg`%X2PN#$Qo1 zKN4X4!1$(Q?p6^P(d%a+%+EO~hQ2?#_d3}|+yx#7J9JP%Aqju1kW3~+HOM%xQvW3j zVRdfmLt$cVtqP!7C{RL?17OQ``gRLQyeK;?@7=%uYgYJ1ECEFhZ5-EPV`ZeJa|}AD zPzi+7%nA*4baW^?Jod@^93V!7Fm+=1^hga|vo 8vef?UKihUAI^W$N6w`G{eaTy7Tfk|^-9DM+p7km{v z4(ERMta?i3Nmvc=n?z<{rM1b0{5y&bI;XOmSlFDFrCMKD0u0RjlK^okU$~2}bB7cH zO^OUUWFm=VLKg|Bj?JvXLjk1_=ng^}$;;25_2|(J{2O;5Uno0%>Pp~vDS*>z7QbJE zsR@gSv@|uP8)QIQ<+A$gofv#KyRa}ie}F8MNvoN(j#l+X=SdA;ejYjxO u+^J)KykB2P$$ai5WpLz|bQyBvaN=i0s*qfO& zY(P{+MLf{qaewNg-o2PQgAJps<1_w?X?O3QGBJTnP#(?OuV2rByxk(1PCQmY_48QU zqQa_^)z7nN25W3(Wu>FT1ka
WOIQ@494vv+l#Zwh&pR~sH)4+%hlNsll* zPe33VAK96XWG~dSst~j)6QOt$GF79Ml1a;`pgIi}9 _tEH{GBEieq#vtPijVy)E0<3eV9=V{!YIjt(Ph6*>ui04yr@6F>?L zPP3^Me(>mf0j^Op1KGw0YbP&%4}WYQ1o70M5l$%N+eg4CoKSBtyVRr&xf!bGV0Ki; za5O`(1>fTiRVps)?;+yhoBg(Y`LeXJR=WYyb%#_dD>nU Q+O@&iVrltxw%6M} z0wBW!aos |W`sP&cjo zb|v9eHjs7{PVBpXt!2{n_F7T6UCV>vxhW*wg8)zq3&&rDGXPVYA6}MGSs4gLj8p4x zyu7y9s=j~!zNfc(qQC#q**DBo?DCBvMWkzk6$;`*zL1!`SQ^= Ia!`0hW9qMx3|K $K472#V;m6?feGtpb*wJ6 zk&4lhXC@G;;V=uR1_QO8!O|%M1P5r5(iDT9R96F+6AgMC&^$p5*g{7KWo~}fMFr1q z&wc~#F%B>+aZn|9=)#2y$}1C6r%#`z@-CFSf0bcL{7B&Lp?BCOBO?Pv5iVtijc6$L z0U3kRybK-jKpKNuhX;$LfbuXPU_r%z5o(KKHZPKsl0aN${Y!d_92mhWJOPek622*P zZGB}b>-hD$f!ZBVk9SyKUFuPGDFERJ>S33cgQ>hJjxH{oTwD|1zu!tuwnB-yXjF{> ztnjaeg*>1O& WqR2Kd_4+dYYY{MwtYldSKUHJqS6GV_YEP-hK4!YewK6 zj0pts;5p}>H5abREw%>$PeJ;)DU0BK-PP6g_U#xjHx#v(yk-wiN!ZoV0f{mL !|o0I)#-G}|K8CSvo#D(CxJRhr|wJ7=nVBJq)`1mrkzxcN4y?@~Qq z+Qt-^J^;1XIR^(@bJHlh`lup{(x|Ve*Egn7Rn*kRx)_o9F)Z99h*sJZXJdd7BHmz- zkdoR5^eDK^R@$MT_ncCJ;lF ozp6(jE5 z`_goi|Fos0my+rW_9K=kskR;ma0F^3OROrZswwJnf(Q-7XQ0W4H~Oki 0SwfFvw08+y#YwKPZoA<`!nGA#xm^)BS=_Si`ynY>le^(DhyOpIS zpmNL5P` tDl+Lcym~b-Jx~vlGN3pLA3gE{cISeqACzF1 ze}Ap?<{z!N_pRXJLpO-ssJuaqE>a4Sgx`2bs}jVkEI+ &TAzHRCwJ kd@_;b~UxPx8D@ (@k(ZK+^Qk zzh(#tSpgv(NDIU9mz6=gGY|X?kU1&%%c>BQ(W3!8B9(U;$n)+9rd_BaF&t?{7C{u6 zmXx$YF)@7mQ!`cKBS>*Tf&m6sE!QLmVdfrGDOHw#WC5WL`TQKUumozGMhut+0 l``H)Yd zP`j)wyERh)L@a=uIvX2DL7fFGUv_L38(0vqzXQ5rH4g6X`YFdq($dnv%{PXoS*c;B zb3ji9w2Y*rG5ge&=R9I!V#& W&jdW>a5EwRAR! z1lq}rM;&b(&w*%45HdNscRP^Vw9I51$nwCOK0#$(d C*;wQa>! zRq{uUpd<$ f^RHdg1>GlbFso~8K<5_>a#%rt_H9#&HdlX3^G7iS#CJhI&-R~S z& A+|v0&Cg>l`NhRAz+ZcK`~($hTbfGR?c2vzE)<-|q4w31yu7C2C{ZUTzkzBDG&*&P5kNpz zIHiToH{TYfsHM{qkY8Q3qzzbZ1ylx+k=Nn;Yj)Px*B4kAU==#My0(8~IDEUguTMo# zu<6sM3UCG>VuQq9`iDTXI!K3-<$Y1#7p~fvjyMPj3Oa*)_UY576tzVk(9l59cyx3W zl5 tG*YK(H^RU^7-S=0q}}D?{Berk|7gTF)psDh``}s*QpLPHC*WO& zo^xEg2qHh2pUT05k$6Tw5I+`gVdbs{H|D1reN szr-JT4Wj+Q}2JStTJ8J1Mw?PvG9Mt#EHZO)M=;T-TA3W&Tnk)}hYS2k)LiYU? z-Rv HHMT(c3am=do#a304uq_i;ZI7ZGeC~Z6E{&N?L%1~l zsif_`v@lBBG78#&-GF16DNB@0N3fZ|BUFv1Dxe8D8{tV;o}tP@k1r??&e|#=!_IDQ ztAIH|=6(#Ij2b=Gd8)Stu;L5iI6IN;21ss=KyVK^prwt?28gQ)P33B6U5?7gfUk-M z)lNg*Pv&qMLOPfe+{MBvN!RvJeH3(#;Qkz-E0|iaAmZ5E*0urKAC$jZU5IRLdiM?_ zK-Oq5ViRXvJ&}H@s;UYk$U55EpiA|+edC5Wk!reb^J;r=Jtz4V5J6mufseo|qvmZL z&X%3?!L gRv8) z9)!IEfD%;J7YCtM3c}8UQsfgLT~K$$RfI5urC$X<3)OZ@3ybYsa%=&Y>qzHaUAsZb zaqFP&P$iAj4+eT(wjwj2qwhjFjGa9ylCIwXQn?V&X+ZVydRl12B^ovZ5ZeQu2Bl0* zb#;CzvL}{HUJ{tMo=JXQEcr5Zd>mvqrVuvR+0WV8so@x!fDN_>IEF6hH|4YHn9IW8 zhm@6Hfb&7=APe$K;Ja)fN-GNSNs2Hrp?Yc%aC`gs!1+FIY-aWpq9ZU9QFunSdQRjK z$T?vecm;)(#l`+03CHs;E??l#LFr@0pTSlTX-89Nz@{foT!n!3V&{q5iHQq|wW|OS zkASKl9=KHysVsW*Xc{W%W}Avqkc?BjRV5)@t%9r$f=kSB)_?)D(uEo>ka^z+2VuhS zDHtTvg{?1*s;rF}s;o}a_KvVFygX)GS#tUEW$+jbbaVt%x1N&|`s=MgWgEj!26}{b z2M$*QdZSIzPCEvy9xOTz@^uy(D-F!cdMM^7gVGv~x39l{ZYvGz45YZ8U!FKZQU)m( zj5h$J?_v;G0UN(hmNzLfGjX~o<9zf!q<^k}#r{^{|Nlw(=Q7L+(YGJ~%ZrGsqVEHM za_S4veaEvhT4{cT(;#awB!F9?pv6IpG8Pf>DJg3o%xxxnYxdRt4(}x(yca=5(w3qi zd-N#Q^OpEgFq?#gGO$`SHx&V%7`dV6?EC|~8K|}4&6NC7K?3NF)z#~O ZOXL>j@&_BDYWc9*Q?KNL37)?tg{SGu{sAFJ34^@kmByzLAIY`fJF` zba>n20QggImVho!ojP^5rUr!bKLI?ft@Ldu!&+1KbrTS*K=29QvYq RhjU)iw+Mv;*j8ESm<<{&R`I>aIn(|Y^*!pjUvH8nL* z0`*Q+=yENGSOD^F5IP<^b_{CIt)Sx5)qNhe_H2hTRP+TA0wZL`z-|8q#|*+lz?cB| zVq;_B K;aEFcLb8pK?#;-^7-+5SeMSVe7>IGIfgXh>V1tl@gZAFt%`JPq zk^Tm<`C{E+D!f>xN=px~{=vH=2pM({K`yCd5QLHWf4}^nyCC@+tb!GN!t&i`8u}{T~>U0hIs% literal 0 HcmV?d00001 diff --git a/servers/akvideo.json b/servers/akvideo.json index c8305d65..fe7575a3 100644 --- a/servers/akvideo.json +++ b/servers/akvideo.json @@ -22,7 +22,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "$ADDON[plugin.video.kod 60654]", + "label": "$ADDON[plugin.video.kod 70708]", "type": "bool", "visible": true }, diff --git a/servers/anavids.json b/servers/anavids.json index bdc73b86..4b7fc58c 100644 --- a/servers/anavids.json +++ b/servers/anavids.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/animeid.json b/servers/animeid.json index 21086eba..dd665438 100644 --- a/servers/animeid.json +++ b/servers/animeid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/anonfile.json b/servers/anonfile.json index 5a7cd15a..ec27fd8b 100644 --- a/servers/anonfile.json +++ b/servers/anonfile.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/archiveorg.json b/servers/archiveorg.json index ef60d243..7f38cbb4 100644 --- a/servers/archiveorg.json +++ b/servers/archiveorg.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/backin.json b/servers/backin.json index 050a3e71..c751c943 100644 --- a/servers/backin.json +++ b/servers/backin.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/badshare.json b/servers/badshare.json index ae4265e9..079cab25 100644 --- a/servers/badshare.json +++ b/servers/badshare.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/bdupload.json b/servers/bdupload.json index c9708b6b..50eea6ce 100644 --- a/servers/bdupload.json +++ b/servers/bdupload.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/cinemaupload.json b/servers/cinemaupload.json index 448525a8..c7627a01 100644 --- a/servers/cinemaupload.json +++ b/servers/cinemaupload.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/clicknupload.json b/servers/clicknupload.json index 068bd3e5..2d2d8889 100644 --- a/servers/clicknupload.json +++ b/servers/clicknupload.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/clipwatching.json b/servers/clipwatching.json index 87c03421..d84e2fe8 100644 --- a/servers/clipwatching.json +++ b/servers/clipwatching.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/cloudvideo.json b/servers/cloudvideo.json index 6016fbdd..ee4c442d 100644 --- a/servers/cloudvideo.json +++ b/servers/cloudvideo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/crunchyroll.json b/servers/crunchyroll.json index 895e132e..1eee02ca 100644 --- a/servers/crunchyroll.json +++ b/servers/crunchyroll.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/dailymotion.json b/servers/dailymotion.json index 25e8b935..d454aeaa 100644 --- a/servers/dailymotion.json +++ b/servers/dailymotion.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/deltabit.json b/servers/deltabit.json index f392a7d1..ed0e8e07 100644 --- a/servers/deltabit.json +++ b/servers/deltabit.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/directo.json b/servers/directo.json index 7fb11746..0e74446c 100644 --- a/servers/directo.json +++ b/servers/directo.json @@ -50,7 +50,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/doodstream.json b/servers/doodstream.json index 165628c4..3743c7f5 100644 --- a/servers/doodstream.json +++ b/servers/doodstream.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/dostream.json b/servers/dostream.json index 4c9745bd..9435b1c2 100644 --- a/servers/dostream.json +++ b/servers/dostream.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/downace.json b/servers/downace.json index 721dd84e..decdc6d8 100644 --- a/servers/downace.json +++ b/servers/downace.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/facebook.json b/servers/facebook.json index 9a6f54f1..a37b6f6b 100644 --- a/servers/facebook.json +++ b/servers/facebook.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/fastplay.json b/servers/fastplay.json index 411c2f40..291307bb 100755 --- a/servers/fastplay.json +++ b/servers/fastplay.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/fembed.json b/servers/fembed.json index a5f53139..de73ab15 100644 --- a/servers/fembed.json +++ b/servers/fembed.json @@ -14,7 +14,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/fex.json b/servers/fex.json index a22348de..2ccc5997 100644 --- a/servers/fex.json +++ b/servers/fex.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/filefactory.json b/servers/filefactory.json index 99b7b565..ed63f53b 100644 --- a/servers/filefactory.json +++ b/servers/filefactory.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/filepup.json b/servers/filepup.json index 945f5994..d2c5c0f9 100644 --- a/servers/filepup.json +++ b/servers/filepup.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/filescdn.json b/servers/filescdn.json index c1810508..7448aebc 100644 --- a/servers/filescdn.json +++ b/servers/filescdn.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/filesmonster.json b/servers/filesmonster.json index 19408a7f..d2e4f40b 100644 --- a/servers/filesmonster.json +++ b/servers/filesmonster.json @@ -20,7 +20,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/flashx.json b/servers/flashx.json index b1a9e13d..231c65f7 100644 --- a/servers/flashx.json +++ b/servers/flashx.json @@ -24,7 +24,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/fourshared.json b/servers/fourshared.json index 4b60a6e5..1efd7f51 100644 --- a/servers/fourshared.json +++ b/servers/fourshared.json @@ -31,7 +31,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/gamovideo.json b/servers/gamovideo.json index 5432f2fc..eee03921 100755 --- a/servers/gamovideo.json +++ b/servers/gamovideo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/gigasize.json b/servers/gigasize.json index 0b2b0576..29a1c02a 100644 --- a/servers/gigasize.json +++ b/servers/gigasize.json @@ -25,7 +25,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/googlevideo.json b/servers/googlevideo.json index 8886b7d5..1ca06c9b 100644 --- a/servers/googlevideo.json +++ b/servers/googlevideo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/gounlimited.json b/servers/gounlimited.json index d2b5fec0..dfaad755 100644 --- a/servers/gounlimited.json +++ b/servers/gounlimited.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/gvideo.json b/servers/gvideo.json index 22fc4bb3..b2839bc7 100644 --- a/servers/gvideo.json +++ b/servers/gvideo.json @@ -37,7 +37,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/hdload.json b/servers/hdload.json index 167caf95..58635ef0 100644 --- a/servers/hdload.json +++ b/servers/hdload.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/hdmario.json b/servers/hdmario.json index bb80a103..649515b7 100644 --- a/servers/hdmario.json +++ b/servers/hdmario.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/hugefiles.json b/servers/hugefiles.json index 6be802b5..6fde0486 100644 --- a/servers/hugefiles.json +++ b/servers/hugefiles.json @@ -20,7 +20,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/idtbox.json b/servers/idtbox.json index 0dea7d55..6f143dd9 100644 --- a/servers/idtbox.json +++ b/servers/idtbox.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/jawcloud.json b/servers/jawcloud.json index 975bc12e..8fcef964 100644 --- a/servers/jawcloud.json +++ b/servers/jawcloud.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/jetload.json b/servers/jetload.json index 447cbe94..bc46f8c0 100644 --- a/servers/jetload.json +++ b/servers/jetload.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mailru.json b/servers/mailru.json index 624d731d..b3925c44 100644 --- a/servers/mailru.json +++ b/servers/mailru.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mediafire.json b/servers/mediafire.json index 8abc34ee..46ff6665 100644 --- a/servers/mediafire.json +++ b/servers/mediafire.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mega.json b/servers/mega.json index af59ebaf..c7f8c4c5 100644 --- a/servers/mega.json +++ b/servers/mega.json @@ -36,7 +36,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mixdrop.json b/servers/mixdrop.json index b63ebd24..dc33cd93 100644 --- a/servers/mixdrop.json +++ b/servers/mixdrop.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mp4upload.json b/servers/mp4upload.json index d46b4135..f2ced1e7 100644 --- a/servers/mp4upload.json +++ b/servers/mp4upload.json @@ -19,7 +19,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mydaddy.json b/servers/mydaddy.json index 671b9418..ca0becd0 100644 --- a/servers/mydaddy.json +++ b/servers/mydaddy.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/mystream.json b/servers/mystream.json index 46f8c4cf..2549ee09 100644 --- a/servers/mystream.json +++ b/servers/mystream.json @@ -1,7 +1,7 @@ { "active": true, "find_videos": { - "ignore_urls": [], + "ignore_urls": ["https://embed.mystream.to/span"], "patterns": [ { "pattern": "my?stream\\.(?:\\w+\\.)?[^/]+/(?:external|watch/|embed-)?([0-9a-zA-Z_]+)", @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/myupload.json b/servers/myupload.json index fdd2bcc8..3ddbf417 100644 --- a/servers/myupload.json +++ b/servers/myupload.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/netutv.json b/servers/netutv.json index c8124fc6..49cda818 100755 --- a/servers/netutv.json +++ b/servers/netutv.json @@ -36,7 +36,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/nowvideo.json b/servers/nowvideo.json index 5a39d41c..3beb9b3e 100644 --- a/servers/nowvideo.json +++ b/servers/nowvideo.json @@ -26,7 +26,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/okru.json b/servers/okru.json index dcc42f28..0ed2c3bd 100644 --- a/servers/okru.json +++ b/servers/okru.json @@ -22,7 +22,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/onefichier.json b/servers/onefichier.json index 1f0b14d2..f0dec829 100644 --- a/servers/onefichier.json +++ b/servers/onefichier.json @@ -26,7 +26,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/onlystream.json b/servers/onlystream.json index 4129e9cd..72fb3e77 100644 --- a/servers/onlystream.json +++ b/servers/onlystream.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/rapidgator.json b/servers/rapidgator.json index 3448d62f..a208a349 100644 --- a/servers/rapidgator.json +++ b/servers/rapidgator.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/rcdnme.json b/servers/rcdnme.json index 6f8f4771..5dd14287 100644 --- a/servers/rcdnme.json +++ b/servers/rcdnme.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/rutube.json b/servers/rutube.json index 1079f56a..496f6005 100644 --- a/servers/rutube.json +++ b/servers/rutube.json @@ -20,7 +20,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/samaup.json b/servers/samaup.json index d1c2187b..dfe9063d 100644 --- a/servers/samaup.json +++ b/servers/samaup.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/sendvid.json b/servers/sendvid.json index 5dff7072..e1e1ac64 100755 --- a/servers/sendvid.json +++ b/servers/sendvid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/speedvideo.json b/servers/speedvideo.json index c91a0a27..55bf2d00 100644 --- a/servers/speedvideo.json +++ b/servers/speedvideo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/streamtape.json b/servers/streamtape.json index 5e6cb39e..b735c997 100644 --- a/servers/streamtape.json +++ b/servers/streamtape.json @@ -14,7 +14,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/streamz.json b/servers/streamz.json index 5c1f3ed5..129f8d4d 100644 --- a/servers/streamz.json +++ b/servers/streamz.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/supervideo.json b/servers/supervideo.json index 0434ee84..fabccac0 100644 --- a/servers/supervideo.json +++ b/servers/supervideo.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/thevid.json b/servers/thevid.json index 0da109c9..e723747b 100644 --- a/servers/thevid.json +++ b/servers/thevid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/thevideobee.json b/servers/thevideobee.json index 45ccb4da..c6a24f4f 100644 --- a/servers/thevideobee.json +++ b/servers/thevideobee.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/torrent.json b/servers/torrent.json index 12b59037..7b0bb703 100644 --- a/servers/torrent.json +++ b/servers/torrent.json @@ -62,7 +62,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/turbobit.json b/servers/turbobit.json index 693b9a81..2e206895 100644 --- a/servers/turbobit.json +++ b/servers/turbobit.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/turbovid.json b/servers/turbovid.json index 54cc8057..564868e0 100644 --- a/servers/turbovid.json +++ b/servers/turbovid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/tusfiles.json b/servers/tusfiles.json index 0dcf9cd5..92c13339 100644 --- a/servers/tusfiles.json +++ b/servers/tusfiles.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/unsupported.json b/servers/unsupported.json index 066467c3..16cda209 100644 --- a/servers/unsupported.json +++ b/servers/unsupported.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": false }, diff --git a/servers/uploadedto.json b/servers/uploadedto.json index 5097d423..4934da71 100644 --- a/servers/uploadedto.json +++ b/servers/uploadedto.json @@ -34,7 +34,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/uppom.json b/servers/uppom.json index fe9b3bea..f7509b04 100644 --- a/servers/uppom.json +++ b/servers/uppom.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/upstream.json b/servers/upstream.json index 0172432b..8bd05840 100644 --- a/servers/upstream.json +++ b/servers/upstream.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/uptobox.json b/servers/uptobox.json index c30d430d..a54c62c2 100644 --- a/servers/uptobox.json +++ b/servers/uptobox.json @@ -25,7 +25,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/upvid.json b/servers/upvid.json index b5122e69..00aaf9c2 100644 --- a/servers/upvid.json +++ b/servers/upvid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/uqload.json b/servers/uqload.json index 505e4d85..9a361b42 100644 --- a/servers/uqload.json +++ b/servers/uqload.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/userscloud.json b/servers/userscloud.json index 3205bd9c..8a72bd45 100644 --- a/servers/userscloud.json +++ b/servers/userscloud.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vevio.json b/servers/vevio.json index d8bd1f45..9ad090be 100644 --- a/servers/vevio.json +++ b/servers/vevio.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidcloud.json b/servers/vidcloud.json index 3e974588..21882336 100644 --- a/servers/vidcloud.json +++ b/servers/vidcloud.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/videobin.json b/servers/videobin.json index 57209c51..f7ec3af0 100644 --- a/servers/videobin.json +++ b/servers/videobin.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/videomega.json b/servers/videomega.json index 5dd00bec..2f97d68a 100644 --- a/servers/videomega.json +++ b/servers/videomega.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidfast.json b/servers/vidfast.json index 9bfee90e..693b50ce 100644 --- a/servers/vidfast.json +++ b/servers/vidfast.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidlox.json b/servers/vidlox.json index d4f6a88d..f3b386eb 100644 --- a/servers/vidlox.json +++ b/servers/vidlox.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidmoly.json b/servers/vidmoly.json index c1b5c1c0..e8d4d984 100644 --- a/servers/vidmoly.json +++ b/servers/vidmoly.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidoza.json b/servers/vidoza.json index 05c1a3a8..997832ff 100644 --- a/servers/vidoza.json +++ b/servers/vidoza.json @@ -20,7 +20,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidtodo.json b/servers/vidtodo.json index 6ceeedf0..fa25c7cd 100755 --- a/servers/vidtodo.json +++ b/servers/vidtodo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidtome.json b/servers/vidtome.json index b404034a..82ff9685 100644 --- a/servers/vidtome.json +++ b/servers/vidtome.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vidup.json b/servers/vidup.json index e1297257..3a44c83c 100755 --- a/servers/vidup.json +++ b/servers/vidup.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vimeo.json b/servers/vimeo.json index 2b0d433a..04053b66 100644 --- a/servers/vimeo.json +++ b/servers/vimeo.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vimpleru.json b/servers/vimpleru.json index d89ce595..479ce5c7 100644 --- a/servers/vimpleru.json +++ b/servers/vimpleru.json @@ -22,7 +22,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vivo.json b/servers/vivo.json index 58ac6202..5f653935 100644 --- a/servers/vivo.json +++ b/servers/vivo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vk.json b/servers/vk.json index e50928ef..885ffc0d 100755 --- a/servers/vk.json +++ b/servers/vk.json @@ -39,7 +39,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vshare.json b/servers/vshare.json index e1488ee6..a4e2f676 100644 --- a/servers/vshare.json +++ b/servers/vshare.json @@ -26,7 +26,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vudeo.json b/servers/vudeo.json index 9a6b4731..6bf6630c 100644 --- a/servers/vudeo.json +++ b/servers/vudeo.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vupplayer.json b/servers/vupplayer.json index fe4e5c6f..6df012d8 100644 --- a/servers/vupplayer.json +++ b/servers/vupplayer.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/vupplayer.py b/servers/vupplayer.py index b1eaf15e..6df91c7f 100644 --- a/servers/vupplayer.py +++ b/servers/vupplayer.py @@ -10,7 +10,7 @@ def test_video_exists(page_url): global data data = page.data if page.code == 404 or 'File is no longer available' in data: - return False, config.get_localized_string(70449) + return False, config.get_localized_string(70449) % "VUP" return True, "" diff --git a/servers/vvvvid.json b/servers/vvvvid.json index 42be33e2..f20d6bd1 100644 --- a/servers/vvvvid.json +++ b/servers/vvvvid.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/watchanimestream.json b/servers/watchanimestream.json index 8fe58ba7..badc9617 100644 --- a/servers/watchanimestream.json +++ b/servers/watchanimestream.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/watchvideo.json b/servers/watchvideo.json index a6bc4c1b..c090e484 100644 --- a/servers/watchvideo.json +++ b/servers/watchvideo.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/wstream.json b/servers/wstream.json index f9668a6a..86f20526 100644 --- a/servers/wstream.json +++ b/servers/wstream.json @@ -26,7 +26,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "$ADDON[plugin.video.kod 60654]", + "label": "$ADDON[plugin.video.kod 70708]", "type": "bool", "visible": true }, diff --git a/servers/youdbox.json b/servers/youdbox.json index ab9e3263..aff46ba7 100644 --- a/servers/youdbox.json +++ b/servers/youdbox.json @@ -17,7 +17,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/yourupload.json b/servers/yourupload.json index 9c61f454..0d978bb1 100755 --- a/servers/yourupload.json +++ b/servers/yourupload.json @@ -27,7 +27,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/youtube.json b/servers/youtube.json index 34a81972..d8235284 100755 --- a/servers/youtube.json +++ b/servers/youtube.json @@ -25,7 +25,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/youwatch.json b/servers/youwatch.json index 1c4bc87a..ffea3ec2 100644 --- a/servers/youwatch.json +++ b/servers/youwatch.json @@ -20,7 +20,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/servers/zippyshare.json b/servers/zippyshare.json index 48df2b5a..4d136ce6 100644 --- a/servers/zippyshare.json +++ b/servers/zippyshare.json @@ -21,7 +21,7 @@ "default": false, "enabled": true, "id": "black_list", - "label": "@60654", + "label": "@70708", "type": "bool", "visible": true }, diff --git a/service.py b/service.py index 5ab5e931..1a69cbbc 100644 --- a/service.py +++ b/service.py @@ -8,6 +8,11 @@ import traceback import xbmc import xbmcgui from platformcode import config + +try: + from urllib.parse import urlsplit +except ImportError: + from urlparse import urlsplit # on kodi 18 its xbmc.translatePath, on 19 xbmcvfs.translatePath try: import xbmcvfs @@ -17,7 +22,7 @@ except: librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) sys.path.insert(0, librerias) -from core import videolibrarytools, filetools, channeltools +from core import videolibrarytools, filetools, channeltools, httptools, scrapertools from lib import schedule from platformcode import logger, platformtools, updater from specials import videolibrary @@ -38,6 +43,8 @@ def update(path, p_dialog, i, t, serie, overwrite): # logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) )) for channel, url in serie.library_urls.items(): serie.channel = channel + module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel]) + url = module.host + urlsplit(url).path serie.url = url ###### Redirección al canal NewPct1.py si es un clone, o a otro canal y url si ha intervención judicial @@ -297,6 +304,23 @@ def updaterCheck(): exit(0) +def get_ua_list(): + # https://github.com/alfa-addon/addon/blob/master/plugin.video.alfa/platformcode/updater.py#L273 + logger.info() + url = "http://omahaproxy.appspot.com/all?csv=1" + current_ver = config.get_setting("chrome_ua_version", default="").split(".") + data = httptools.downloadpage(url, alfa_s=True).data + new_ua_ver = scrapertools.find_single_match(data, "win64,stable,([^,]+),") + + if not current_ver: + config.set_setting("chrome_ua_version", new_ua_ver) + else: + for pos, val in enumerate(new_ua_ver.split('.')): + if int(val) > int(current_ver[pos]): + config.set_setting("chrome_ua_version", new_ua_ver) + break + + def run_threaded(job_func, args): job_thread = threading.Thread(target=job_func, args=args) job_thread.start() @@ -311,6 +335,7 @@ class AddonMonitor(xbmc.Monitor): self.update_hour = None self.scheduleScreenOnJobs() self.scheduleUpdater() + self.scheduleUA() # videolibrary wait update_wait = [0, 10000, 20000, 30000, 60000] @@ -383,6 +408,10 @@ class AddonMonitor(xbmc.Monitor): schedule.every(self.updaterPeriod).hours.do(updaterCheck).tag('updater') logger.debug('scheduled updater every ' + str(self.updaterPeriod) + ' hours') + def scheduleUA(self): + get_ua_list() + schedule.every(1).day.do(get_ua_list) + def scheduleVideolibrary(self): self.update_setting = config.get_setting("update", "videolibrary") # 2= daily 3=daily and when kodi starts diff --git a/platformcode/globalsearch.py b/specials/globalsearch.py similarity index 55% rename from platformcode/globalsearch.py rename to specials/globalsearch.py index a54f3bd6..75eaf0e4 100644 --- a/platformcode/globalsearch.py +++ b/specials/globalsearch.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -import xbmc, xbmcgui, sys, channelselector, time +import xbmc, xbmcgui, sys, channelselector, time, gc from core.support import dbg, typo, tmdb from core.item import Item from core import channeltools, servertools, scrapertools @@ -13,6 +13,7 @@ else: from concurrent_py2 import futures info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json def_lang = info_language[config.get_setting("info_language", "videolibrary")] +close_action = False def busy(state): @@ -23,10 +24,10 @@ def set_workers(): workers = config.get_setting('thread_number') if config.get_setting('thread_number') > 0 else None return workers -def Search(item): - xbmc.executebuiltin('Dialog.Close(all,true)') - SearchWindow('GlobalSearch.xml', config.get_runtime_path()).start(item) - xbmc.sleep(600) +def Search(*args): + w = SearchWindow('GlobalSearch.xml', config.get_runtime_path()) + w.start(*args) + del w # Actions LEFT = 1 @@ -38,6 +39,8 @@ EXIT = 10 BACKSPACE = 92 SWIPEUP = 531 CONTEXT = 117 +MOUSEMOVE = 107 +FULLSCREEN = 18 # Container SEARCH = 1 @@ -62,42 +65,71 @@ QUALITYTAG = 505 EPISODESLIST = 200 SERVERLIST = 300 -class SearchWindow(xbmcgui.WindowXML): - def start(self, item): +class SearchWindow(xbmcgui.WindowXMLDialog): + def start(self, item, moduleDict={}, searchActions=[]): logger.debug() self.exit = False self.item = item - self.lastSearch() - if not self.item.text: return self.type = self.item.mode self.channels = [] - self.find = [] self.persons = [] self.episodes = [] self.servers = [] self.results = {} - self.channelsList = self.get_channels() self.focus = SEARCH self.process = True self.page = 1 - self.moduleDict = {} - self.searchActions = [] + self.moduleDict = moduleDict + self.searchActions = searchActions self.thread = None + self.selected = False + self.items = [] + + if not searchActions: + self.thActions = Thread(target=self.getActions) + self.thActions.start() + else: + self.thActions = None + + self.lastSearch() + if not self.item.text: return + self.doModal() def lastSearch(self): logger.debug() if not self.item.text: - if config.get_setting('last_search'): last_search = channeltools.get_channel_setting('Last_searched', 'search', '') - else: last_search = '' - if not self.item.text: self.item.text = platformtools.dialog_input(default=last_search, heading='') - if self.item.text: channeltools.set_channel_setting('Last_searched', self.item.text, 'search') + if self.item.contentTitle: + self.item.text = self.item.contentTitle + elif self.item.contentSerieName: + self.item.text = self.item.contentSerieName + + if not self.item.text: + if config.get_setting('last_search'): last_search = channeltools.get_channel_setting('Last_searched', 'search', '') + else: last_search = '' + if not self.item.text: self.item.text = platformtools.dialog_input(default=last_search, heading='') + if self.item.text: + channeltools.set_channel_setting('Last_searched', self.item.text, 'search') + from specials.search import save_search + save_search(self.item.text) + + def getActions(self): + logger.debug() + count = 0 + self.channelsList = self.get_channels() + for channel in self.channelsList: + self.getModule(channel) + count += 1 + percent = (float(count) / len(self.channelsList)) * 100 + if self.thread or self.selected: # window started + self.PROGRESS.setPercent(percent) + self.COUNT.setText('%s/%s' % (count, len(self.channelsList))) def select(self): logger.debug() self.PROGRESS.setVisible(False) - items = [] - if self.persons: + self.items = [] + if self.item.mode == 'person_': tmdb_info = tmdb.discovery(self.item, dict_=self.item.discovery) results = tmdb_info.results.get('cast',[]) else: @@ -105,32 +137,50 @@ class SearchWindow(xbmcgui.WindowXML): results = tmdb_info.results for result in results: - logger.info(result) result = tmdb_info.get_infoLabels(result, origen=result) - movie = result.get('title','') - tvshow = result.get('name','') - title = tvshow if tvshow else movie - result['mode'] = 'tvshow' if tvshow else 'movie' - self.find.append(result) - thumb = 'Infoplus/' + result['mode'].replace('show','') + '.png' - it = xbmcgui.ListItem(title) - it.setProperty('thumb', result.get('thumbnail', thumb)) - it.setProperty('fanart', result.get('fanart','')) - it.setProperty('plot', result.get('overview', '')) - it.setProperty('search','search') - year = result.get('release_date','') - if year: it.setProperty('year','[' + year.split('/')[-1] + ']') + if self.item.mode == 'movie': + title = result['title'] + result['mode'] = 'movie' else: - year = result.get('first_air_date','') - if year: it.setProperty('year','[' + year.split('-')[0] + ']') - items.append(it) + title = result['name'] + result['mode'] = 'tvshow' - if items: + thumbnail = result.get('thumbnail', '') + noThumb = 'Infoplus/' + result['mode'].replace('show','') + '.png' + fanart = result.get('fanart', '') + year = result.get('release_date', '') + rating = str(result.get('vote_average', '')) + + new_item = Item(channel='search', + action=True, + title=title, + thumbnail=thumbnail, + fanart=fanart, + mode='search', + type=result['mode'], + contentType=result['mode'], + text=title, + infoLabels=result) + + if self.item.mode == 'movie': + new_item.contentTitle = result['title'] + else: + new_item.contentSerieName = result['name'] + + it = xbmcgui.ListItem(title) + it.setProperties({'thumb': result.get('thumbnail', noThumb), 'fanart': result.get('fanart', ''), 'rating': ' [' + rating + ']' if rating else '', + 'plot': result.get('overview', ''), 'search': 'search', 'release_date': '', 'item': new_item.tourl(), + 'year': ' [' + year.split('/')[-1] + ']' if year else ' [' + result.get('first_air_date','').split('-')[0] + ']'}) + self.items.append(it) + + if self.items: self.RESULTS.reset() - self.RESULTS.addItems(items) + self.RESULTS.addItems(self.items) self.setFocusId(RESULTS) else: + self.RESULTS.setVisible(False) self.NORESULTS.setVisible(True) + self.setFocusId(CLOSE) def actors(self): logger.debug() @@ -161,10 +211,15 @@ class SearchWindow(xbmcgui.WindowXML): discovery = {'url': 'person/%s/combined_credits' % cast_id, 'page': '1', 'sort_by': 'primary_release_date.desc', 'language': def_lang} self.persons.append(discovery) + + new_item = Item(channel='search', + action=True, + title=name, + thumbnail=thumb, + mode='search') + it = xbmcgui.ListItem(name) - it.setProperty('thumb', thumb) - it.setProperty('plot', plot) - it.setProperty('search','persons') + it.setProperties({'thumb': thumb, 'plot': plot, 'search': 'persons', 'item': new_item.tourl()}) items.append(it) if len(results) > 19: it = xbmcgui.ListItem(config.get_localized_string(70006)) @@ -182,7 +237,9 @@ class SearchWindow(xbmcgui.WindowXML): self.RESULTS.addItems(items) self.setFocusId(RESULTS) else: + self.RESULTS.setVisible(False) self.NORESULTS.setVisible(True) + self.setFocusId(CLOSE) def get_channels(self): logger.debug() @@ -203,7 +260,7 @@ class SearchWindow(xbmcgui.WindowXML): n = list_cat.index('anime') list_cat[n] = 'tvshow' - if self.item.mode == 'all' or self.item.type in list_cat: + if self.item.mode == 'all' or self.item.mode in list_cat or self.item.type in list_cat: if config.get_setting("include_in_global_search", channel) and ch_param.get("active", False): channels_list.append(channel) @@ -217,68 +274,50 @@ class SearchWindow(xbmcgui.WindowXML): module = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel]) mainlist = getattr(module, 'mainlist')(Item(channel=channel, global_search=True)) action = [elem for elem in mainlist if elem.action == "search" and (self.item.mode == 'all' or elem.contentType in [self.item.mode, 'undefined'])] - return module, action + self.moduleDict[channel] = module + self.searchActions += action except: import traceback logger.error('error importing/getting search items of ' + channel) logger.error(traceback.format_exc()) - return None, None + + def timer(self): + while self.searchActions: + self.COUNT.setText('%s/%s [%s"]' % (self.count, len(self.searchActions), int(time.time() - self.time) )) + time.sleep(1) def search(self): - count = 0 + logger.debug() self.count = 0 self.LOADING.setVisible(True) - with futures.ThreadPoolExecutor() as executor: - results = [] - for channel in self.channelsList: - if self.exit: return - results.append(executor.submit(self.getModule, channel)) - - for res in futures.as_completed(results): - if self.exit: return - module, action = res.result() - if module and action: - channel = action[0].channel - self.moduleDict[channel] = module - self.searchActions += action - count += 1 - percent = (float(count) / len(self.channelsList)) * 100 - self.PROGRESS.setPercent(percent) - self.COUNT.setText('%s/%s' % (count, len(self.channelsList))) - self.channelsList = [] + if self.thActions: + self.thActions.join() + Thread(target=self.timer).start() with futures.ThreadPoolExecutor(max_workers=set_workers()) as executor: for searchAction in self.searchActions: if self.exit: return - executor.submit(self.get_channel_results, self.item, self.moduleDict, searchAction) - self.moduleDict = {} - self.searchActions = [] + executor.submit(self.get_channel_results, searchAction) + logger.debug('end search for:', searchAction.channel) - def get_channel_results(self, item, module_dict, search_action): + def get_channel_results(self, searchAction): logger.debug() - channel = search_action.channel + channel = searchAction.channel results = [] valid = [] other = [] - module = module_dict[channel] - searched_id = item.infoLabels['tmdb_id'] try: - results.extend(module.search(search_action, item.text)) + results = self.moduleDict[channel].search(searchAction, self.item.text) if len(results) == 1: if not results[0].action or config.get_localized_string(70006).lower() in results[0].title.lower(): results = [] if self.item.mode != 'all': for elem in results: - if self.exit: - return - if not elem.infoLabels.get('year', ""): - elem.infoLabels['year'] = '-' - tmdb.set_infoLabels_item(elem) - if elem.infoLabels['tmdb_id'] == searched_id: + if elem.infoLabels['tmdb_id'] == self.item.infoLabels['tmdb_id']: elem.from_channel = channel - elem.verified ='ok.png' + elem.verified = 1 valid.append(elem) else: other.append(elem) @@ -286,60 +325,102 @@ class SearchWindow(xbmcgui.WindowXML): pass self.count += 1 - if self.item.mode == 'all': self.update(channel, results) - else: self.update(channel, valid + other) + return self.update(channel, valid, other if other else results) - def makeItem(self, item): - logger.debug() - thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace('show','') + 'png' + def makeItem(self, url): + item = Item().fromurl(url) + logger.debug(item) + channelParams = channeltools.get_channel_parameters(item.channel) + thumb = item.thumbnail if item.thumbnail else 'Infoplus/' + item.contentType.replace('show', '') + '.png' logger.info('THUMB', thumb) it = xbmcgui.ListItem(item.title) - it.setProperty('year', '[' + str(item.year if item.year else item.infoLabels.get('year','')) + ']') - it.setProperty('thumb', thumb) - it.setProperty('fanart', item.fanart) - it.setProperty('plot', item.plot) - it.setProperty('verified', item.verified) + year = str(item.year if item.year else item.infoLabels.get('year', '')) + rating = str(item.infoLabels.get('rating', '')) + it.setProperties({'thumb': thumb, 'fanart': item.fanart, 'plot': item.plot, + 'year': ' [' + year + ']' if year else '', 'rating':' [' + rating + ']' if rating else '', + 'item': url, 'verified': item.verified, 'channel':channelParams['title'], 'channelthumb': channelParams['thumbnail'] if item.verified else ''}) if item.server: color = scrapertools.find_single_match(item.alive, r'(FF[^\]]+)') - it.setProperty('channel', channeltools.get_channel_parameters(item.channel).get('title','')) - it.setProperty('thumb', "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower()) - it.setProperty('servername', servertools.get_server_parameters(item.server.lower()).get('name',item.server)) - it.setProperty('color', color if color else 'FF0082C2') + it.setProperties({'channel': channeltools.get_channel_parameters(item.channel).get('title', ''), + 'thumb': "https://raw.githubusercontent.com/kodiondemand/media/master/resources/servers/%s.png" % item.server.lower(), + 'servername': servertools.get_server_parameters(item.server.lower()).get('name', item.server), + 'color': color if color else 'FF0082C2'}) + return it - def update(self, channel, results): + def update(self, channel, valid, results): if self.exit: return logger.debug('Search on channel', channel) + if self.item.mode != 'all' and 'valid' not in self.results: + self.results['valid'] = 0 + item = xbmcgui.ListItem('valid') + item.setProperties({'thumb': 'valid.png', + 'position': '0', + 'results': '0'}) + self.channels.append(item) + pos = self.CHANNELS.getSelectedPosition() + self.CHANNELS.addItems(self.channels) + self.CHANNELS.selectItem(pos) + self.setFocusId(CHANNELS) + if valid: + item = self.CHANNELS.getListItem(0) + resultsList = item.getProperty('items') + for result in valid: + resultsList += result.tourl() + '|' + item.setProperty('items', resultsList) + self.channels[0].setProperty('results', str(len(resultsList.split('|')))) + if self.CHANNELS.getSelectedPosition() == 0: + items = [] + for result in valid: + if result: items.append(self.makeItem(result.tourl())) + pos = self.RESULTS.getSelectedPosition() + self.RESULTS.addItems(items) + self.RESULTS.selectItem(pos) if results: + resultsList = '' channelParams = channeltools.get_channel_parameters(channel) name = channelParams['title'] if name not in self.results: - self.results[name] = [results, len(self.channels)] item = xbmcgui.ListItem(name) - item.setProperty('thumb', channelParams['thumbnail']) - item.setProperty('position', '0') - item.setProperty('results', str(len(results))) - item.setProperty('verified', results[0].verified) + item.setProperties({'thumb': channelParams['thumbnail'], + 'position': '0', + 'results': str(len(results)) + }) + for result in results: + resultsList += result.tourl() + '|' + item.setProperty('items',resultsList) + self.results[name] = len(self.results) self.channels.append(item) else: - self.results[name].append([results, len(self.channels)]) - self.channels[int(self.results[name][1])].setProperty('results', str(len(results))) + item = self.CHANNELS.getListItem(self.results[name]) + resultsList = item.getProperty('items') + for result in results: + resultsList += result.tourl() + '|' + item.setProperty('items',resultsList) + self.channels[int(self.results[name])].setProperty('results', str(len(resultsList).split('|') - 1)) pos = self.CHANNELS.getSelectedPosition() self.CHANNELS.reset() self.CHANNELS.addItems(self.channels) self.CHANNELS.selectItem(pos) + if len(self.channels) == 1: self.setFocusId(CHANNELS) + channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|') items = [] - for result in self.results[name][0]: - items.append(self.makeItem(result)) + for result in channelResults: + if result: items.append(self.makeItem(result)) self.RESULTS.reset() self.RESULTS.addItems(items) + percent = (float(self.count) / len(self.searchActions)) * 100 self.LOADING.setVisible(False) self.PROGRESS.setPercent(percent) self.COUNT.setText('%s/%s [%s"]' % (self.count, len(self.searchActions), int(time.time() - self.time) )) + if percent == 100: + self.channels = [] + self.moduleDict = {} + self.searchActions = [] if percent == 100 and not self.results: self.PROGRESS.setVisible(False) self.NORESULTS.setVisible(True) @@ -353,7 +434,7 @@ class SearchWindow(xbmcgui.WindowXML): self.PROGRESS = self.getControl(PROGRESS) self.COUNT = self.getControl(COUNT) self.MAINTITLE = self.getControl(MAINTITLE) - self.MAINTITLE.setText(typo(config.get_localized_string(30993).replace('...','') % '"%s"' % self.item.text, 'bold')) + self.MAINTITLE.setText(typo(config.get_localized_string(30993).replace('...', '') % '"%s"' % self.item.text, 'bold')) self.SEARCH = self.getControl(SEARCH) self.EPISODES = self.getControl(EPISODES) self.EPISODESLIST = self.getControl(EPISODESLIST) @@ -372,7 +453,7 @@ class SearchWindow(xbmcgui.WindowXML): if self.item.type: self.item.mode = self.item.type self.thread = Thread(target=self.search) self.thread.start() - elif self.item.mode in ['movie', 'tvshow']: + elif self.item.mode in ['movie', 'tvshow', 'person_']: self.select() elif self.item.mode in ['person']: self.actors() @@ -395,8 +476,11 @@ class SearchWindow(xbmcgui.WindowXML): self.SERVERS.setVisible(True) def onAction(self, action): + global close_action action = action.getId() focus = self.getFocusId() + if action in [FULLSCREEN]: + self.playmonitor() if action in [CONTEXT] and focus in [RESULTS, EPISODESLIST, SERVERLIST]: self.context() @@ -405,12 +489,13 @@ class SearchWindow(xbmcgui.WindowXML): pos = self.CHANNELS.getSelectedPosition() self.CHANNELS.selectItem(pos) - elif action in [LEFT, RIGHT] and focus in [CHANNELS] and self.CHANNELS.isVisible(): + elif action in [LEFT, RIGHT, MOUSEMOVE] and focus in [CHANNELS] and self.CHANNELS.isVisible(): items = [] name = self.CHANNELS.getSelectedItem().getLabel() subpos = int(self.CHANNELS.getSelectedItem().getProperty('position')) - for result in self.results[name][0]: - items.append(self.makeItem(result)) + channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|') + for result in channelResults: + if result: items.append(self.makeItem(result)) self.RESULTS.reset() self.RESULTS.addItems(items) self.RESULTS.selectItem(subpos) @@ -418,7 +503,7 @@ class SearchWindow(xbmcgui.WindowXML): elif action in [DOWN] and focus in [BACK, CLOSE, MENU]: if self.SERVERS.isVisible(): self.setFocusId(SERVERLIST) elif self.EPISODES.isVisible(): self.setFocusId(EPISODESLIST) - else: self.setFocusId(RESULTS) + elif self.RESULTS.isVisible(): self.setFocusId(RESULTS) elif focus in [RESULTS] and self.item.mode == 'all': pos = self.RESULTS.getSelectedPosition() @@ -432,16 +517,20 @@ class SearchWindow(xbmcgui.WindowXML): elif action in [EXIT]: self.Close() + close_action = True def onClick(self, control_id): + global close_action + if self.RESULTS.getSelectedItem(): search = self.RESULTS.getSelectedItem().getProperty('search') else: search = None if control_id in [CHANNELS]: items = [] name = self.CHANNELS.getSelectedItem().getLabel() subpos = int(self.CHANNELS.getSelectedItem().getProperty('position')) - for result in self.results[name][0]: - items.append(self.makeItem(result)) + channelResults = self.CHANNELS.getListItem(self.results[name]).getProperty('items').split('|') + for result in channelResults: + if result: items.append(self.makeItem(result)) self.RESULTS.reset() self.RESULTS.addItems(items) self.RESULTS.selectItem(subpos) @@ -452,6 +541,7 @@ class SearchWindow(xbmcgui.WindowXML): elif control_id in [CLOSE]: self.Close() + close_action = True elif control_id in [MENU]: self.context() @@ -465,25 +555,50 @@ class SearchWindow(xbmcgui.WindowXML): self.page -= 1 self.actors() elif search == 'persons': - self.item.discovery = self.persons[pos] - self.select() + item = self.item.clone(mode='person_', discovery=self.persons[pos]) + self.close() + Search(item, self.moduleDict, self.searchActions) + if not close_action: + self.doModal() else: - result = self.find[pos] - name = self.RESULTS.getSelectedItem().getLabel() - item = Item(mode='search', type=result['mode'], contentType=result['mode'], infoLabels=result, selected = True, text=name) + item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) if self.item.mode == 'movie': item.contentTitle = self.RESULTS.getSelectedItem().getLabel() else: item.contentSerieName = self.RESULTS.getSelectedItem().getLabel() - return Search(item) + + self.RESULTS.reset() + self.RESULTS.setVisible(False) + self.PROGRESS.setVisible(True) + self.selected = True + self.thActions.join() + self.RESULTS.addItems(self.items) + self.RESULTS.setVisible(True) + self.PROGRESS.setVisible(False) + + self.close() + Search(item, self.moduleDict, self.searchActions) + if not close_action: + self.doModal() elif control_id in [RESULTS, EPISODESLIST]: busy(True) if control_id in [RESULTS]: name = self.CHANNELS.getSelectedItem().getLabel() self.pos = self.RESULTS.getSelectedPosition() - item = self.results[name][0][self.pos] + item = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) else: self.pos = self.EPISODESLIST.getSelectedPosition() - item = self.episodes[self.pos] + item_url = self.EPISODESLIST.getSelectedItem().getProperty('item') + if item_url: + item = Item().fromurl(item_url) + else: # no results item + busy(False) + return + + if item.action not in ['findvideos', 'episodios']: # special items (add to videolibrary, download ecc.) + xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item_url + ")") + busy(False) + return + try: self.channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel]) self.itemsResult = getattr(self.channel, item.action)(item) @@ -497,16 +612,17 @@ class SearchWindow(xbmcgui.WindowXML): if config.get_setting('checklinks') and not config.get_setting('autoplay'): self.itemsResult = servertools.check_list_links(self.itemsResult, config.get_setting('checklinks_number')) - self.servers = self.itemsResult + servers = self.itemsResult if self.itemsResult else [] self.itemsResult = [] uhd = [] fhd = [] hd = [] sd = [] unknown = [] - for i, item in enumerate(self.servers): + other = [] + for i, item in enumerate(servers): if item.server: - it = self.makeItem(item) + it = self.makeItem(item.tourl()) it.setProperty('index', str(i)) if item.quality in ['4k', '2160p', '2160', '4k2160p', '4k2160', '4k 2160p', '4k 2160', '2k']: it.setProperty('quality', 'uhd.png') @@ -525,7 +641,9 @@ class SearchWindow(xbmcgui.WindowXML): unknown.append(it) elif not item.action: self.getControl(QUALITYTAG).setText(item.fulltitle) - + else: + it = self.makeItem(item.tourl()) + other.append(it) uhd.sort(key=lambda it: it.getProperty('index')) fhd.sort(key=lambda it: it.getProperty('index')) @@ -533,34 +651,46 @@ class SearchWindow(xbmcgui.WindowXML): sd.sort(key=lambda it: it.getProperty('index')) unknown.sort(key=lambda it: it.getProperty('index')) - serverlist = uhd + fhd + hd + sd + unknown + serverlist = uhd + fhd + hd + sd + unknown + other + if not serverlist: + serverlist = [xbmcgui.ListItem(config.get_localized_string(60347))] + serverlist[0].setProperty('thumb', channelselector.get_thumb('nofolder.png')) self.Focus(SERVERS) self.SERVERLIST.reset() self.SERVERLIST.addItems(serverlist) self.setFocusId(SERVERLIST) + if config.get_setting('autoplay'): + busy(False) + self.playmonitor() + else: - self.episodes = self.itemsResult + episodes = self.itemsResult if self.itemsResult else [] self.itemsResult = [] - episodes = [] - for item in self.episodes: - if item.action == 'findvideos': - it = xbmcgui.ListItem(item.title) - episodes.append(it) + ep = [] + for item in episodes: + # if item.action == 'findvideos': + it = xbmcgui.ListItem(item.title) + it.setProperty('item', item.tourl()) + ep.append(it) + + if not ep: + ep = [xbmcgui.ListItem(config.get_localized_string(60347))] + ep[0].setProperty('thumb', channelselector.get_thumb('nofolder.png')) self.Focus(EPISODES) self.EPISODESLIST.reset() - self.EPISODESLIST.addItems(episodes) + self.EPISODESLIST.addItems(ep) self.setFocusId(EPISODESLIST) busy(False) elif control_id in [SERVERLIST]: - index = int(self.getControl(control_id).getSelectedItem().getProperty('index')) - server = self.servers[index] - server.player_mode = 0 - run(server) + server = Item().fromurl(self.getControl(control_id).getSelectedItem().getProperty('item')) + return self.playmonitor(server) + # server.globalsearch = True + # return run(server) def Back(self): self.getControl(QUALITYTAG).setText('') @@ -577,8 +707,7 @@ class SearchWindow(xbmcgui.WindowXML): self.Focus(SEARCH) self.setFocusId(RESULTS) self.RESULTS.selectItem(self.pos) - elif self.item.mode in ['person'] and self.find: - self.find = [] + elif self.item.mode in ['person']: self.actors() else: self.Close() @@ -592,30 +721,39 @@ class SearchWindow(xbmcgui.WindowXML): self.close() def context(self): - pos = self.RESULTS.getSelectedPosition() - name = self.CHANNELS.getSelectedItem().getLabel() - item = self.results[name][0][pos] - context = [config.get_localized_string(70739), config.get_localized_string(70557), config.get_localized_string(30155), config.get_localized_string(60359)] - context_commands = ["RunPlugin(%s?%s)" % (sys.argv[0], 'action=open_browser&url=' + item.url), - "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=kodfavorites&action=addFavourite&from_channel=' + item.channel + '&from_action=' + item.action), - "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=favorites&action=addFavourite&from_channel=' + item.channel + '&from_action=' + item.action), - "RunPlugin(%s?%s)" % (sys.argv[0], 'channel=trailertools&action=buscartrailer&contextual=True&search_title=' + item.contentTitle if item.contentTitle else item.fulltitle)] - if item.contentType == 'movie': - context += [config.get_localized_string(60353), config.get_localized_string(60354)] - context_commands += ["RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'action=add_pelicula_to_library&from_action=' + item.action), - "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' +item.action)] - + focus = self.getFocusId() + if focus == EPISODESLIST: # context on episode + item_url = self.EPISODESLIST.getSelectedItem().getProperty('item') + parent = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) + elif focus == SERVERLIST: + item_url = self.SERVERLIST.getSelectedItem().getProperty('item') + parent = Item().fromurl(self.RESULTS.getSelectedItem().getProperty('item')) else: - context += [config.get_localized_string(60352), config.get_localized_string(60355), config.get_localized_string(60357)] - context_commands += ["RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'action=add_serie_to_library&from_action=' + item.action), - "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action), - "RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel +'&from_action=' + item.action)] - - if self.EPISODES.isVisible() or self.SERVERS.isVisible(): - pos = self.EPISODESLIST.getSelectedPosition() - item = self.episodes[pos] - context += [config.get_localized_string(60356)] - context_commands += ["RunPlugin(%s?%s&%s)" % (sys.argv[0], item.tourl(), 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' +item.action)] + item_url = self.RESULTS.getSelectedItem().getProperty('item') + parent = self.item + item = Item().fromurl(item_url) + parent.noMainMenu = True + commands = platformtools.set_context_commands(item, item_url, parent) + context = [c[0] for c in commands] + context_commands = [c[1].replace('Container.Refresh', 'RunPlugin').replace('Container.Update', 'RunPlugin') for c in commands] index = xbmcgui.Dialog().contextmenu(context) - if index > 0: xbmc.executebuiltin(context_commands[index]) \ No newline at end of file + if index > 0: xbmc.executebuiltin(context_commands[index]) + + + def playmonitor(self, server=None): + if server: + server.globalsearch = True + run(server) + try: + while not xbmc.Player().getTime() > 0: + xbmc.sleep(500) + self.close() + while xbmcgui.getCurrentWindowId() in [12005, 12006]: + xbmc.sleep(500) + if platformtools.is_playing(): + xbmc.sleep(300) + xbmc.executebuiltin('Action(Fullscreen)') + self.doModal() + except: + return diff --git a/specials/search.py b/specials/search.py index 1968dc9b..79bb6d07 100644 --- a/specials/search.py +++ b/specials/search.py @@ -38,11 +38,18 @@ def_lang = info_language[config.get_setting("info_language", "videolibrary")] def mainlist(item): logger.debug() - itemlist = [Item(channel=item.channel, title=config.get_localized_string(70276), action='new_search', mode='all', thumbnail=get_thumb("search.png")), - Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30122), action='new_search', mode='movie', thumbnail=get_thumb("search_movie.png")), - Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30123), action='new_search', mode='tvshow', thumbnail=get_thumb("search_tvshow.png")), - Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(70314), action='new_search', page=1, mode='person', thumbnail=get_thumb("search_star.png")), - Item(channel=item.channel, title=config.get_localized_string(59995), action='saved_search', thumbnail=get_thumb('search.png')), + if config.get_setting('new_search'): + itemlist = [Item(channel='globalsearch', title=config.get_localized_string(70276), action='Search', mode='all', thumbnail=get_thumb("search.png"), folder=False), + Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(30122), action='Search', mode='movie', thumbnail=get_thumb("search_movie.png"),folder=False), + Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(30123), action='Search', mode='tvshow', thumbnail=get_thumb("search_tvshow.png"), folder=False), + Item(channel='globalsearch', title=config.get_localized_string(70741) % config.get_localized_string(70314), action='Search', page=1, mode='person', thumbnail=get_thumb("search_star.png"), folder=False)] + else: + itemlist = [Item(channel=item.channel, title=config.get_localized_string(70276), action='new_search', mode='all', thumbnail=get_thumb("search.png")), + Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30122), action='new_search', mode='movie', thumbnail=get_thumb("search_movie.png")), + Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(30123), action='new_search', mode='tvshow', thumbnail=get_thumb("search_tvshow.png")), + Item(channel=item.channel, title=config.get_localized_string(70741) % config.get_localized_string(70314), action='new_search', page=1, mode='person', thumbnail=get_thumb("search_star.png"))] + + itemlist += [Item(channel=item.channel, title=config.get_localized_string(59995), action='saved_search', thumbnail=get_thumb('search.png')), Item(channel=item.channel, title=config.get_localized_string(60420), action='sub_menu', thumbnail=get_thumb('search.png')), Item(channel="tvmoviedb", title=config.get_localized_string(70274), action="mainlist", thumbnail=get_thumb("search.png")), Item(channel=item.channel, title=typo(config.get_localized_string(59994), 'color kod bold'), action='setting_channel_new', thumbnail=get_thumb('setting_0.png')), @@ -79,10 +86,11 @@ def saved_search(item): for saved_search_text in saved_searches_list: itemlist.append( - Item(channel=item.channel, - action="new_search", + Item(channel=item.channel if not config.get_setting('new_search') else 'globalsearch', + action="new_search" if not config.get_setting('new_search') else 'Search', title=typo(saved_search_text.split('{}')[0], 'bold'), search_text=saved_search_text.split('{}')[0], + text=saved_search_text.split('{}')[0], mode='all', thumbnail=get_thumb('search.png'))) diff --git a/specials/setting.py b/specials/setting.py index 2de2882e..78755a20 100644 --- a/specials/setting.py +++ b/specials/setting.py @@ -241,6 +241,7 @@ def server_debrid_config(item): def servers_blacklist(item): server_list = servertools.get_servers_list() + black_list = config.get_setting("black_list", server='servers') blacklisted = [] list_controls = [] @@ -252,10 +253,10 @@ def servers_blacklist(item): control = server_parameters["name"] # control.setArt({'thumb:': server_parameters['thumb'] if 'thumb' in server_parameters else config.get_online_server_thumb(server)}) - if defaults.get("black_list", False) or config.get_setting("black_list", server=server): - blacklisted.append(i) - - list_controls.append(control) + if not config.get_setting("black_list", server=server): + list_controls.append(control) + if defaults.get("black_list", False) or server in black_list: + blacklisted.append(i) list_servers.append(server) ris = platformtools.dialog_multiselect(config.get_localized_string(60550), list_controls, preselect=blacklisted) if ris is not None: diff --git a/specials/videolibrary.py b/specials/videolibrary.py index b543b98e..d379f9dc 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -344,7 +344,7 @@ def get_episodes(item): head_nfo, epi = videolibrarytools.read_nfo(nfo_path) # Set the chapter title if possible - if epi.contentTitle: + if epi.contentTitle and epi.contentTitle != epi.fulltitle: title_episodie = epi.contentTitle.strip() else: title_episodie = config.get_localized_string(60031) % (epi.contentSeason, str(epi.contentEpisodeNumber).zfill(2))