import enigma2-plugin-extensions-mediaportal 2019112401 v2019112401
authorChristian Weiske <cweiske@cweiske.de>
Mon, 25 Nov 2019 00:15:27 +0000 (01:15 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Mon, 25 Nov 2019 00:15:27 +0000 (01:15 +0100)
46 files changed:
usr/lib/enigma2/python/Components/Converter/MPServiceInfo.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/additions.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/twitch.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/bild.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/camhub.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/chaturbate.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/cliphunter.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/elladies.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/eroprofile.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porngo.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornhat.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornhub.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornicom.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornid.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornrabbit.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornxio.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/slutload.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/updatetube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xhamster.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xnxx.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xpaja.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/youjizz.py [moved from usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/hypnotube.py with 57% similarity]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/live.png [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.mo
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.po
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/plugin.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/decrypt.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/bitshare.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/fembed.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/hosters.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/kissmovies.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mangovideo.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mixdrop.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/onlystream.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/openload.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/rapidvideocom.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/smartshare.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamango.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamcloud.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/vcdn.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/verystream.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/videobin.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/vidup.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_globals.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mpscreen.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/streams.py

index 6a4b0d0..0088e6f 100644 (file)
@@ -117,7 +117,7 @@ class MPServiceInfo(Converter, object):
                                if not progressive:
                                        frame_rate *= 2
                                frame_rate = (frame_rate+500)/1000
-                               if frame_rate > 0:
+                               if frame_rate > 0 and xres > 0 and yres > 0:
                                        xres = str(xres)
                                        yres = str(yres)
                                        x = "x"
index 63e4630..ab45eaf 100644 (file)
@@ -78,6 +78,7 @@
                <plugin type="mod" modfile="porn.porncom" confopt="showporncom" default="False" confcat="porn" gz="0" name="Porn.com" icon="porncom" filter="Porn" screen="porncomGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="porncomFilmScreen" searchparam=", True"/>
                <plugin type="mod" modfile="porn.xvideos" confopt="showxvideos" default="False" confcat="porn" gz="0" name="XVideos" icon="xvideos" filter="Porn" screen="xvideosGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="xvideosFilmScreen" searchparam=", True"/>
                <plugin type="mod" modfile="porn.xnxx" confopt="showxnxx" default="False" confcat="porn" gz="0" name="XNXX" icon="xnxx" filter="Porn" screen="xnxxGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="xnxxFilmScreen" searchparam=""/>
+               <plugin type="mod" modfile="porn.youjizz" confopt="showyoujizz" default="False" confcat="porn" gz="0" name="YouJizz" icon="youjizz" filter="Porn" screen="youjizzGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="youjizzFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.spankbang" confopt="showspankbang" default="False" confcat="porn" gz="0" name="SpankBang" icon="spankbang" filter="Porn" screen="spankbangGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="spankbangFilmScreen" searchparam=", True, True"/>
                <plugin type="mod" modfile="porn.redtube" confopt="showredtube" default="False" confcat="porn" gz="0" name="RedTube" icon="redtube" filter="Porn" screen="redtubeGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="redtubeFilmScreen" searchparam=", True"/>
                <plugin type="mod" modfile="porn.youporn" confopt="showyouporn" default="False" confcat="porn" gz="0" name="YouPorn" icon="youporn" filter="Porn" screen="youpornGenreScreen" param1="" param2="" search="1" delim="+" searchurl="https://www.youporn.com/search/?query=%s&amp;page=" searchscreen="youpornFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.xhamster" confopt="showxhamster" default="False" confcat="porn" gz="0" name="xHamster" icon="xhamster" filter="Porn" screen="xhamsterGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="xhamsterFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.porndoe" confopt="showporndoe" default="False" confcat="porn" gz="0" name="Porndoe" icon="porndoe" filter="Porn" screen="porndoeGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="porndoeFilmScreen" searchparam=", False"/>
                <plugin type="mod" modfile="porn.porngo" confopt="showporngo" default="False" confcat="porn" gz="0" name="PornGO" icon="porngo" filter="Porn" screen="porngoGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="porngoFilmScreen" searchparam=""/>
+               <plugin type="mod" modfile="porn.pornxio" confopt="showpornxio" default="False" confcat="porn" gz="0" name="PornXio" icon="pornxio" filter="Porn" screen="pornxioGenreScreen" param1="pornxio" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornxioFilmScreen" searchparam=", &quot;PornXio.com&quot;, &quot;https://pornxio.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornxio" confopt="showhandjobhub" default="False" confcat="porn" gz="0" name="HandjobHub" icon="handjobhub" filter="Porn" screen="pornxioGenreScreen" param1="handjobhub" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornxioFilmScreen" searchparam=", &quot;HandjobHub.com&quot;, &quot;https://handjobhub.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornxio" confopt="showswipexxx" default="False" confcat="porn" gz="0" name="SWIPE.XXX" icon="swipexxx" filter="Porn" screen="pornxioGenreScreen" param1="swipexxx" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornxioFilmScreen" searchparam=", &quot;SWIPE.XXX&quot;, &quot;https://swipe.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.pornxio" confopt="showhypnotube" default="False" confcat="porn" gz="0" name="hypnotube" icon="hypnotube" filter="Porn" screen="pornxioGenreScreen" param1="hypnotube" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornxioFilmScreen" searchparam=", &quot;hypnotube.com&quot;, &quot;https://hypnotube.com&quot;"/>
+               <plugin type="mod" modfile="porn.camhub" confopt="showcamhub" default="False" confcat="porn" gz="0" name="Camhub" icon="camhub" filter="Porn" screen="camhubGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="camhubFilmScreen" searchparam=""/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showslutload" default="False" confcat="porn" gz="0" name="Slutload" icon="slutload" filter="Porn" screen="slutloadGenreScreen" param1="slutload" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;Slutload.com&quot;, &quot;https://www.slutload.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showmadthumbs" default="False" confcat="porn" gz="0" name="MadThumbs" icon="madthumbs" filter="Porn" screen="slutloadGenreScreen" param1="madthumbs" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;MadThumbs.com&quot;, &quot;http://www.madthumbs.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showfapster" default="False" confcat="porn" gz="0" name="Fapster" icon="fapster" filter="Porn" screen="slutloadGenreScreen" param1="fapster" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;Fapster.xxx&quot;, &quot;https://fapster.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showvqtube" default="False" confcat="porn" gz="0" name="VQTube" icon="vqtube" filter="Porn" screen="slutloadGenreScreen" param1="vqtube" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;VQTube.com&quot;, &quot;https://vqtube.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showpornicom" default="False" confcat="porn" gz="0" name="Pornicom" icon="pornicom" filter="Porn" screen="pornicomGenreScreen" param1="pornicom" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;Pornicom.com&quot;, &quot;https://www.pornicom.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showvikiporn" default="False" confcat="porn" gz="0" name="VikiPorn" icon="vikiporn" filter="Porn" screen="pornicomGenreScreen" param1="vikiporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;VikiPorn.com&quot;, &quot;https://www.vikiporn.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showsleazyneasy" default="False" confcat="porn" gz="0" name="SleazyNEasy" icon="sleazyneasy" filter="Porn" screen="pornicomGenreScreen" param1="sleazyneasy" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;SleazyNEasy.com&quot;, &quot;https://www.sleazyneasy.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showkatestube" default="False" confcat="porn" gz="0" name="KatesTube" icon="katestube" filter="Porn" screen="pornicomGenreScreen" param1="katestube" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;KatesTube.com&quot;, &quot;https://www.katestube.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showpervclips" default="False" confcat="porn" gz="0" name="PervClips" icon="pervclips" filter="Porn" screen="pornicomGenreScreen" param1="pervclips" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;PervClips.com&quot;, &quot;https://www.pervclips.com/tube&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showwankoz" default="False" confcat="porn" gz="0" name="Wankoz" icon="wankoz" filter="Porn" screen="pornicomGenreScreen" param1="wankoz" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;Wankoz.com&quot;, &quot;https://www.wankoz.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornicom" confopt="showpornwhite" default="False" confcat="porn" gz="0" name="PornWhite" icon="pornwhite" filter="Porn" screen="pornicomGenreScreen" param1="pornwhite" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;PornWhite.com&quot;, &quot;https://www.pornwhite.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornid" confopt="showpornid" default="False" confcat="porn" gz="0" name="PornID" icon="pornid" filter="Porn" screen="pornidGenreScreen" param1="pornid" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornidFilmScreen" searchparam=", &quot;PornID.xxx&quot;, &quot;https://www.pornid.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.pornid" confopt="showsexvid" default="False" confcat="porn" gz="0" name="SexVid" icon="sexvid" filter="Porn" screen="pornidGenreScreen" param1="sexvid" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornidFilmScreen" searchparam=", &quot;SexVid.xxx&quot;, &quot;https://www.sexvid.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.pornid" confopt="showhdtube" default="False" confcat="porn" gz="0" name="HDtube" icon="hdtube" filter="Porn" screen="pornidGenreScreen" param1="hdtube" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornidFilmScreen" searchparam=", &quot;HDtube.porn&quot;, &quot;https://www.hdtube.porn&quot;"/>
+               <plugin type="mod" modfile="porn.pornid" confopt="showzbporn" default="False" confcat="porn" gz="0" name="ZBPorn" icon="zbporn" filter="Porn" screen="pornidGenreScreen" param1="zbporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornidFilmScreen" searchparam=", &quot;ZBPorn.com&quot;, &quot;https://www.zbporn.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornhat" confopt="showpornhat" default="False" confcat="porn" gz="0" name="PornHat" icon="pornhat" filter="Porn" screen="pornhatGenreScreen" param1="pornhat" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornhatFilmScreen" searchparam=", &quot;PornHat.com&quot;, &quot;https://www.pornhat.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornhat" confopt="showokxxx" default="False" confcat="porn" gz="0" name="OK.XXX" icon="okxxx" filter="Porn" screen="pornhatGenreScreen" param1="okxxx" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornhatFilmScreen" searchparam=", &quot;OK.XXX&quot;, &quot;https://www.ok.xxx&quot;"/>
                <plugin type="mod" modfile="porn.tnaflix" confopt="showtnaflix" default="False" confcat="porn" gz="0" name="TnAflix" icon="tnaflix" filter="Porn" screen="TnAflixGenreScreen" param1="tnaflix" param2="" search="1" delim="%20" searchurl="%s" searchscreen="TnAflixFilmScreen" searchparam=", &quot;TnAflix.com&quot;, &quot;https://www.tnaflix.com&quot;"/>
                <plugin type="mod" modfile="porn.tnaflix" confopt="showempflix" default="False" confcat="porn" gz="0" name="Empflix" icon="empflix" filter="Porn" screen="TnAflixGenreScreen" param1="empflix" param2="" search="1" delim="%20" searchurl="%s" searchscreen="TnAflixFilmScreen" searchparam=", &quot;Empflix.com&quot;, &quot;https://www.empflix.com&quot;"/>
                <plugin type="mod" modfile="porn.txxx" confopt="showtxxx" default="False" confcat="porn" gz="0" name="TXXX" icon="txxx" filter="Porn" screen="txxxGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="txxxFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.anyporn" confopt="showbravoporn" default="False" confcat="porn" gz="0" name="BravoPorn" icon="bravoporn" filter="Porn" screen="anypornGenreScreen" param1="bravoporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="anypornListScreen" searchparam=", &quot;BravoPorn.com&quot;, &quot;https://www.bravoporn.com&quot;"/>
                <plugin type="mod" modfile="porn.anyporn" confopt="showbravoteens" default="False" confcat="porn" gz="0" name="BravoTeens" icon="bravoteens" filter="Porn" screen="anypornGenreScreen" param1="bravoteens" param2="" search="1" delim="+" searchurl="%s" searchscreen="anypornListScreen" searchparam=", &quot;BravoTeens.com&quot;, &quot;https://www.bravoteens.com&quot;"/>
                <plugin type="mod" modfile="porn.anyporn" confopt="showxbabe" default="False" confcat="porn" gz="0" name="XBabe" icon="xbabe" filter="Porn" screen="anypornGenreScreen" param1="xbabe" param2="" search="1" delim="-" searchurl="%s" searchscreen="anypornListScreen" searchparam=", &quot;XBabe.com&quot;, &quot;https://xbabe.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornrabbit" confopt="showpornrabbit" default="False" confcat="porn" gz="0" name="PornRabbit" icon="pornrabbit" filter="Porn" screen="pornrabbitGenreScreen" param1="pornrabbit" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornrabbitFilmScreen" searchparam=", &quot;PornRabbit.com&quot;, &quot;https://www.pornrabbit.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornrabbit" confopt="showpornwatchers" default="False" confcat="porn" gz="0" name="PornWatchers" icon="pornwatchers" filter="Porn" screen="pornrabbitGenreScreen" param1="pornwatchers" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornrabbitFilmScreen" searchparam=", &quot;PornWatchers.com&quot;, &quot;https://www.pornwatchers.com&quot;"/>
+               <plugin type="mod" modfile="porn.pornrabbit" confopt="showstileproject" default="False" confcat="porn" gz="0" name="StileProject" icon="stileproject" filter="Porn" screen="pornrabbitGenreScreen" param1="stileproject" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornrabbitFilmScreen" searchparam=", &quot;StileProject.com&quot;, &quot;https://www.stileproject.com&quot;"/>
                <plugin type="mod" modfile="porn.pornoxo" confopt="showpornoxo" default="False" confcat="porn" gz="0" name="PornoXO" icon="pornoxo" filter="Porn" screen="pornoxoGenreScreen" param1="pornoxo" param2="" search="1" delim="_" searchurl="%s" searchscreen="pornoxoFilmScreen" searchparam=", &quot;PornoXO.com&quot;, &quot;https://www.pornoxo.com&quot;"/>
                <plugin type="mod" modfile="porn.pornoxo" confopt="showashemaletube" default="False" confcat="porn" gz="0" name="aShemaletube" icon="ashemaletube" filter="Porn" screen="pornoxoGenreScreen" param1="ashemaletube" param2="" search="1" delim="_" searchurl="%s" searchscreen="pornoxoFilmScreen" searchparam=", &quot;aShemaletube.com&quot;, &quot;https://www.ashemaletube.com&quot;"/>
                <plugin type="mod" modfile="porn.pornoxo" confopt="showfetishpapa" default="False" confcat="porn" gz="0" name="Fetishpapa" icon="fetishpapa" filter="Porn" screen="pornoxoGenreScreen" param1="fetishpapa" param2="" search="1" delim="_" searchurl="%s" searchscreen="pornoxoFilmScreen" searchparam=", &quot;Fetishpapa.com&quot;, &quot;https://www.fetishpapa.com&quot;"/>
-               <plugin type="mod" modfile="porn.hypnotube" confopt="showhypnotube" default="False" confcat="porn" gz="0" name="hypnotube" icon="hypnotube" filter="Porn" screen="hypnotubeGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="hypnotubeFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.fetishshrine" confopt="showfetishshrine" default="False" confcat="porn" gz="0" name="FetishShrine" icon="fetishshrine" filter="Porn" screen="fetishshrineGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="fetishshrineFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.shesfreaky" confopt="showshesfreaky" default="False" confcat="porn" gz="0" name="ShesFreaky" icon="shesfreaky" filter="Porn" screen="shesfreakyGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="shesfreakyFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.spankwire" confopt="showspankwire" default="False" confcat="porn" gz="0" name="Spankwire" icon="spankwire" filter="Porn" screen="spankwireGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="spankwireFilmScreen" searchparam=", ''"/>
                <plugin type="mod" modfile="porn.sunporno" confopt="showsunporno" default="False" confcat="porn" gz="0" name="SunPorno" icon="sunporno" filter="Porn" screen="sunpornoGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="sunpornoFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.ahme" confopt="showahme" default="False" confcat="porn" gz="0" name="Ah-Me" icon="ahme" filter="Porn" screen="ahmeGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="ahmeFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.moviefap" confopt="showmoviefap" default="False" confcat="porn" gz="0" name="MovieFap" icon="moviefap" filter="Porn" screen="moviefapGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="moviefapFilmScreen" searchparam=""/>
-               <plugin type="mod" modfile="porn.befuck" confopt="showbefuck" default="False" confcat="porn" gz="0" name="BeFuck" icon="befuck" filter="Porn" screen="befuckGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="befuckListScreen" searchparam=""/>
-               <plugin type="mod" modfile="porn.pornrabbit" confopt="showpornrabbit" default="False" confcat="porn" gz="0" name="PornRabbit" icon="pornrabbit" filter="Porn" screen="pornrabbitGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="/search/%s/" searchscreen="pornrabbitFilmScreen" searchparam=""/>
                <!--<plugin type="mod" modfile="porn.hdporn" confopt="showhdporn" default="False" confcat="porn" gz="0" name="HDPorn" icon="hdporn" filter="Porn" screen="hdpornGenreScreen" param1="" param2=""/>-->
+               <plugin type="mod" modfile="porn.befuck" confopt="showbefuck" default="False" confcat="porn" gz="0" name="BeFuck" icon="befuck" filter="Porn" screen="befuckGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="befuckListScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.updatetube" confopt="showupdatetube" default="False" confcat="porn" gz="0" name="UpdateTube" icon="updatetube" filter="Porn" screen="updatetubeGenreScreen" param1="updatetube" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;UpdateTube.com&quot;, &quot;www.updatetube.com&quot;"/>
                <plugin type="mod" modfile="porn.updatetube" confopt="showthenewporn" default="False" confcat="porn" gz="0" name="TheNewPorn" icon="thenewporn" filter="Porn" screen="updatetubeGenreScreen" param1="thenewporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;TheNewPorn.com&quot;, &quot;www.thenewporn.com&quot;"/>
                <plugin type="mod" modfile="porn.updatetube" confopt="showpinkrod" default="False" confcat="porn" gz="0" name="Pinkrod" icon="pinkrod" filter="Porn" screen="updatetubeGenreScreen" param1="pinkrod" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;Pinkrod.com&quot;, &quot;www.pinkrod.com&quot;"/>
index c28a1d4..0b2c561 100644 (file)
@@ -41,6 +41,7 @@ from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
 default_cover = "file://%s/twitch.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"
 headers = {'Accept': 'application/vnd.twitchtv.v5+json', 'Client-ID': '6r2dhbo9ek6mm1gab2snj0navo4sgqy'}
+headers_stream = {'Accept': 'application/vnd.twitchtv.v5+json', 'Client-ID': 'kimne78kx3ncx6brgo4mv6wki5h1ko'}
 limit = 25
 
 class twitchMainScreen(MPScreen):
@@ -173,7 +174,22 @@ class twitchGames(MPScreen):
                if self.ID != "favorites":
                        twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
                else:
-                       self.parseData('')
+                       if not fileExists(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites"):
+                               open(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites","w").close()
+                       if fileExists(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites"):
+                               path = config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites"
+                       if fileExists(path):
+                               user_id = ""
+                               read = open(path,"r")
+                               for rawData in read.readlines():
+                                       data = re.findall('"(.*?)" "(.*?)" "(.*?)"', rawData, re.S)
+                                       if data:
+                                               (Title, Name, Id) = data[0]
+                                               user_id += "&user_id=" + Id
+                               read.close()
+                               url_tmp = "https://api.twitch.tv/helix/streams" + user_id
+                               url = url_tmp.replace('streams&', 'streams?')
+                       twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
 
        def parseData(self, data):
                if self.ID != "favorites":
@@ -196,6 +212,10 @@ class twitchGames(MPScreen):
                        self.lastpage = 1
                        self['page'].setText('1 / 1')
                if self.ID == "favorites":
+                       jsondata = json.loads(data)
+                       self.live = []
+                       for node in jsondata["data"]:
+                               self.live.append(str(node["user_id"]))
                        if not fileExists(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites"):
                                open(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites","w").close()
                        if fileExists(config_mp.mediaportal.watchlistpath.value+"mp_twitch_favorites"):
@@ -206,14 +226,17 @@ class twitchGames(MPScreen):
                                        data = re.findall('"(.*?)" "(.*?)" "(.*?)"', rawData, re.S)
                                        if data:
                                                (Title, Name, Id) = data[0]
-                                               self.gameList.append((Title, '', default_cover, Name, '', Title, Id))
+                                               if Id in self.live:
+                                                       self.gameList.append((Title, '', default_cover, Name, '', Title, Id, 'Live'))
+                                               else:
+                                                       self.gameList.append((Title, '', default_cover, Name, '', Title, Id, 'Offline'))
                                self.gameList.sort()
                                read.close()
                        if len(self.gameList) == 0:
                                self.gameList.append((_('No entries found!'), None, default_cover))
                                self.ml.setList(map(self._defaultlistleft, self.gameList))
                        else:
-                               self.ml.setList(map(self._defaultlistleft, self.gameList))
+                               self.ml.setList(map(self._defaultlistleftmarked, self.gameList))
                                self.keyLocked = False
                elif self.ID == "searchgames":
                        try:
@@ -338,13 +361,13 @@ class twitchGames(MPScreen):
                        self.gameName = self['liste'].getCurrent()[0][4]
                        self.displayName = self['liste'].getCurrent()[0][5]
                        url = "https://api.twitch.tv/api/channels/" + self.channelName + "/access_token"
-                       twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.parseAccessToken).addErrback(self.dataError)
+                       twAgentGetPage(url, agent=agent, headers=headers_stream).addCallback(self.parseAccessToken).addErrback(self.dataError)
                if (self.ID == "videos" or self.ID == "channelvideos"):
                        self.vodid = self['liste'].getCurrent()[0][3]
                        self.gameName = self['liste'].getCurrent()[0][4]
                        self.displayName = self['liste'].getCurrent()[0][5]
                        url = "https://api.twitch.tv/api/vods/" + self.vodid + "/access_token"
-                       twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.parseAccessToken).addErrback(self.dataError)
+                       twAgentGetPage(url, agent=agent, headers=headers_stream).addCallback(self.parseAccessToken).addErrback(self.dataError)
                elif (self.ID == "topgames" or self.ID == "searchgames"):
                        Game = self['liste'].getCurrent()[0][0].replace(' ', '%20')
                        self.session.open(twitchGames, '', "Streams", "streams", Game, '')
index a4df988..adb1883 100644 (file)
@@ -173,7 +173,7 @@ class bildSecondScreen(MPScreen):
                twAgentGetPage(jsonurl).addCallback(self.showInfos2).addErrback(self.dataError)
 
        def showInfos2(self, data):
-               parse = re.findall('description":\s"(.*?)",.*?"durationSec":(\d+),.*?poster":\s"(.*?)".*?src":"(.*?.mp4)"', data, re.S)
+               parse = re.findall('description":\s"(.*?)",.*?"durationSec":(\d+),.*?poster":\s"(.*?)".*?src":"([A-Za-z0-9:.,-=\/]+\.mp4)"', data, re.S)
                if parse:
                        Handlung = parse[0][0]
                        m, s = divmod(int(parse[0][1]), 60)
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/camhub.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/camhub.py
new file mode 100644 (file)
index 0000000..2932799
--- /dev/null
@@ -0,0 +1,217 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+default_cover = "file://%s/camhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+class camhubGenreScreen(MPScreen):
+
+       def __init__(self, session):
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel
+               }, -1)
+
+               self['title'] = Label("Camhub.cc")
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.filmliste = []
+               self.keyLocked = True
+               url = "http://www.camhub.cc/categories/"
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               Cats = re.findall('class="item" href="(.*?)" title="(.*?)"', data, re.S)
+               if Cats:
+                       for (Url, Title) in Cats:
+                               self.filmliste.append((upperString(Title), Url))
+                       self.filmliste.sort()
+               self.filmliste.insert(0, ("Top Rated", "http://www.camhub.cc/top-rated/"))
+               self.filmliste.insert(0, ("Most Viewed", "http://www.camhub.cc/most-popular/"))
+               self.filmliste.insert(0, ("Newest", "http://www.camhub.cc/latest-updates/"))
+               self.filmliste.insert(0, ("--- Search ---", "callSuchen"))
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       self.session.open(camhubFilmScreen, Link, Name)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '-')
+                       self.session.open(camhubFilmScreen, Link, Name)
+
+class camhubFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name):
+               self.Link = Link
+               self.Name = Name
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label("Camhub.cc")
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       url = "http://www.camhub.cc/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=%s&category_ids=&sort_by=post_date&from_videos=%s&from_albums=%s" % (self.Link, self.Link.replace('-','+'), str(self.page), str(self.page))
+               else:
+                       if "categories" in self.Link:
+                               url = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date&from=%s" % (self.Link, str(self.page))
+                       elif "latest-updates" in self.Link:
+                               url = "%s?mode=async&function=get_block&block_id=list_videos_latest_videos_list&sort_by=post_date&from=%s" % (self.Link, str(self.page))
+                       elif "top-rated" in self.Link:
+                               url = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=rating&from=%s" % (self.Link, str(self.page))
+                       elif "most-popular" in self.Link:
+                               url = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=video_viewed&from=%s" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, 'lass="pagination"(.*?)>Last<', '.*[from:|>](\d+)["|<]')
+               Movies = re.findall('class="item\s{0,3}".*?href="(.*?)" title="(.*?)".*?data-original="(.*?)".*?class="dur">(.*?)</span>.*?class="views">((?:\d+\s|)\d+) views</div>', data, re.S)
+               if Movies:
+                       for (Url, Title, Image, Runtime, Views) in Movies:
+                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views.replace(' ','')))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               views = self['liste'].getCurrent()[0][4]
+               self['name'].setText(title)
+               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               if "Embed Player Error" in data:
+                       message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
+               else:
+                       Title = self['liste'].getCurrent()[0][0]
+                       mp_globals.player_agent = agent
+                       license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+                       url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
+                       if not url:
+                               url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'', data, re.S)
+                       if license and url:
+                               try:
+                                       max = 0
+                                       for vid in url:
+                                               if int(vid[1]) > max:
+                                                       max = int(vid[1])
+                                                       url = vid[0]
+                               except:
+                                       url = url[-1]
+                               if 'function/0/' in url:
+                                       url = decrypturl(url, license[0])
+                               self['name'].setText('')
+                               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='camhub')
+                       else:
+                               fetch = re.findall('<iframe.*?src="(http://(?:webcamsdolls.com|www.camhub.world)/embed/\d+)', data, re.S)
+                               if fetch:
+                                       twAgentGetPage(fetch[0], agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+                               else:
+                                       message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
\ No newline at end of file
index ecc4527..f67f7ba 100644 (file)
@@ -211,7 +211,7 @@ class chaturbateFilmScreen(MPScreen, ThumbsHelper):
                self.ml.moveToIndex(0)
                self.getLastPage(data, 'class="paging">(.*?)</ul>')
                preparse = re.search('id="room_list"(.*?)class="banner">', data, re.S)
-               Movies = re.findall('<li class="room_list_room.*?>.<a\shref="(.*?)".*?<img\ssrc=".*?".*?gender(\w)">(\d+)</span>.*?<li\stitle(?:="(.*?)"|)>.*?location.*?>(.*?)</li>.*?class="cams">(.*?)</li>.*?</div>.*?</li>', preparse.group(1), re.S)
+               Movies = re.findall('<li class="room_list_room.*?>.<a\shref="(.*?)".*?<img\ssrc=".*?".*?gender(\w)">(\d+)</span>.*?<li\stitle(?:="(.*?)"|)>.*?class="location".*?>(.*?)</li>.*?class="cams">(.*?)</li>.*?</div>.*?</li>', preparse.group(1), re.S)
                if Movies:
                        for (Url, Gender, Age, Description, Location, Viewers) in Movies:
                                if not Description:
@@ -264,7 +264,7 @@ class chaturbateFilmScreen(MPScreen, ThumbsHelper):
        def getplaylist(self, data):
                url = re.findall('(http[s]?://edge.*?.stream.highwebmedia.com.*?m3u8)', data)
                if url:
-                       getPage(url[0]).addCallback(self.loadplaylist, url[0]).addErrback(self.dataError)
+                       getPage(decodeHtml(url[0])).addCallback(self.loadplaylist, decodeHtml(url[0])).addErrback(self.dataError)
                else:
                        self.session.open(MessageBoxExt, _("Cam is currently offline."), MessageBoxExt.TYPE_INFO)
 
index d5e4582..cb55b8f 100644 (file)
@@ -262,7 +262,7 @@ class cliphunterFilmScreen(MPScreen, ThumbsHelper):
 
        def loadData(self, data):
                self.getLastPage(data, '', 'maxPages="(.*?)"')
-               Movies = re.findall('class="t"\shref="(/w/\d+/(.*?))".*?class="i"\ssrc="(.*?)".*?class="tr">(.*?)</div>.*?class="vttl.*?">(.*?)</a>', data, re.S)
+               Movies = re.findall(' <li mId="\d+".*?href="(/w/\d+/(.*?))".*?class="i(?: pop-execute|)"\ssrc="(.*?)".*?class="tr(?: pop-execute|)">(.*?)</div>.*?class="vttl.*?">(.*?)</a>', data, re.S)
                if Movies:
                        for (Url, TitleUrl, Image, Runtime, Title) in Movies:
                                Url = "http://www.cliphunter.com" + Url
index 7251533..dfddb35 100644 (file)
@@ -197,23 +197,13 @@ class elladiesFilmScreen(MPScreen, ThumbsHelper):
                if self.keyLocked:
                        return
                Title = self['liste'].getCurrent()[0][0]
-               if Title == "--- Search ---":
-                       self.suchen()
-               else:
-                       url = self['liste'].getCurrent()[0][1]
-                       self.keyLocked = True
-                       url = 'http://just.eroprofile.com/play/' + url
-                       getPage(url).addCallback(self.getVideoPage).addErrback(self.dataError)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = urllib.quote(callback).replace(' ', '+')
-                       self.SearchString = self.suchString
-                       self.loadPage()
+               url = self['liste'].getCurrent()[0][1]
+               self.keyLocked = True
+               url = 'http://just.eroprofile.com/play/' + url
+               getPage(url).addCallback(self.getVideoPage).addErrback(self.dataError)
 
        def getVideoPage(self, data):
                videoPage = re.findall(',file:\'(.*?)\'', data, re.S)
                if videoPage:
-                       for url in videoPage:
-                               self.keyLocked = False
-                               self.session.open(SimplePlayer, [(self.playtitle, url)], showPlaylist=False, ltype='elladies')
\ No newline at end of file
+                       self.keyLocked = False
+                       self.session.open(SimplePlayer, [(self.playtitle, videoPage[0])], showPlaylist=False, ltype='elladies')
\ No newline at end of file
index 88fd444..4934844 100644 (file)
@@ -202,6 +202,8 @@ class eroprofileFilmScreen(MPScreen, ThumbsHelper):
                videoPage = re.findall('source src="(.*?)"', data, re.S)
                if videoPage:
                        url = videoPage[0].replace('&amp;','&')
+                       if url.startswith('//'):
+                               url = "http:" + url
                        self.keyLocked = False
                        Title = self['liste'].getCurrent()[0][0]
                        self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='eroprofile')
\ No newline at end of file
index 2398fa6..643ed47 100644 (file)
@@ -223,8 +223,8 @@ class porngoFilmScreen(MPScreen, ThumbsHelper):
                twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               self.getLastPage(data, 'class="pagination">(.*?)id="clck_ntv"', '.*(?:\/|">)(\d+)')
-               Movies = re.findall('class="thumb item">.*?href="(.*?)".*?<img\ssrc="(.*?)".*?duration">(.*?)</span>.*?class="thumb__title">(.*?)</div.*?class="thumb__text">(\d+.)\sviews</span>', data, re.S)
+               self.getLastPage(data, 'class="pagination">(.*?)<!-- Composite Start', '.*(?:\/|">)(\d+)')
+               Movies = re.findall('class="thumb item\s{0,1}">.*?href="(.*?)".*?<img\ssrc="(.*?)".*?duration">(.*?)</span>.*?class="thumb__title">(.*?)</div.*?class="thumb__text">(\d+.)\sviews</span>', data, re.S)
                if Movies:
                        for (Url, Image, Runtime, Title, Views) in Movies:
                                Title = stripAllTags(Title).strip()
@@ -256,7 +256,7 @@ class porngoFilmScreen(MPScreen, ThumbsHelper):
 
        def parseVideo(self, data):
                url = None
-               streams = re.findall('class="video-links__link"\shref="(https://www.porngo.com/get_file.*?)".*?>(\d+k{0,1})', data, re.S)
+               streams = re.findall('class="video-links__link"\shref="(http[s]?://(?:www.|)porngo.com/get_file.*?)".*?>(\d+k{0,1})', data, re.S)
                if streams:
                        import requests
                        max = 0
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornhat.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornhat.py
new file mode 100644 (file)
index 0000000..a61dce2
--- /dev/null
@@ -0,0 +1,249 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+
+class pornhatGenreScreen(MPScreen):
+
+       def __init__(self, session, mode, genre='tags'):
+               self.mode = mode
+               self.genre = genre
+
+               global default_cover
+               if self.mode == "pornhat":
+                       self.portal = "PornHat.com"
+                       self.baseurl = "https://www.pornhat.com"
+                       default_cover = "file://%s/pornhat.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "okxxx":
+                       self.portal = "OK.XXX"
+                       self.baseurl = "http://www.ok.xxx"
+                       default_cover = "file://%s/okxxx.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.filmliste = []
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               url = "%s/%s/" % (self.baseurl, self.genre)
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               Cats = re.findall('<a class="item" href="(.*?)"><i class="fa fa-tag"></i>(.*?)</a>', data, re.S)
+               if Cats:
+                       for (Url, Title) in Cats:
+                               Url = self.baseurl + Url
+                               Title = Title.strip()
+                               if (Title[0].isalpha() or Title[0].isdigit()):
+                                       self.filmliste.append((upperString(Title), Url, default_cover))
+                       self.filmliste.sort()
+               else:
+                       Cats = re.findall('class="thumb-bl">.*?title="(.*?)"\shref="(.*?)".*?img\s(?:class="thumb" |)src="(.*?)".*?play"></i>(.*?)</div>', data, re.S)
+                       if Cats:
+                               for (Title, Url, Image, Count) in Cats:
+                                       Url = self.baseurl + Url
+                                       Count = int(Count.strip())
+                                       if Count > 0:
+                                               self.filmliste.append((upperString(Title), Url, Image))
+                               self.filmliste.sort()
+               if self.genre == "tags":
+                       self.filmliste.insert(0, ("Channels", "channels", default_cover))
+                       self.filmliste.insert(0, ("Trending", "%s/trending/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Popular", "%s/popular/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/newest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+               self.showInfos()
+
+       def showInfos(self):
+               self['name'].setText('')
+               cover = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(cover)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       if Link.startswith('http'):
+                               self.session.open(pornhatFilmScreen, Link, Name, self.portal, self.baseurl)
+                       else:
+                               self.session.open(pornhatGenreScreen, self.mode, Link)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '-')
+                       self.session.open(pornhatFilmScreen, Link, Name, self.portal, self.baseurl)
+
+class pornhatFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name, portal, baseurl):
+               self.Link = Link
+               self.Name = Name
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "PornHat.com":
+                       default_cover = "file://%s/pornhat.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "OK.XXX":
+                       default_cover = "file://%s/okxxx.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       url = "%s/search/%s/%s/" % (self.baseurl, self.Link, str(self.page))
+               else:
+                       url = "%s%s/" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, 'class="pagination">(.*?)</ul>', '.*>(\d+)<')
+               Movies = re.findall('class="thumb">.*?href="(.*?)"\stitle="(.*?)".*?<img.*?data-original="(.*?)"', data, re.S)
+               if Movies:
+                       for (Url, Title, Image) in Movies:
+                               if Url.startswith('/'):
+                                       Url = self.baseurl + Url
+                               self.filmliste.append((decodeHtml(Title), Url, Image))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               self['name'].setText(title)
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               mp_globals.player_agent = agent
+               license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+               url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
+               if not url:
+                       url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'', data, re.S)
+               if license and url:
+                       try:
+                               max = 0
+                               for vid in url:
+                                       if int(vid[1]) > max:
+                                               max = int(vid[1])
+                                               url = vid[0]
+                       except:
+                               url = url[-1]
+                       if 'function/0/' in url:
+                               url = decrypturl(url, license[0])
+                       self['name'].setText('')
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornhat')
\ No newline at end of file
index 6ba9bf5..9924dca 100644 (file)
@@ -209,7 +209,7 @@ class pornhubGenreScreen(MPScreen, LoginFunc):
                        return
                Name = self['liste'].getCurrent()[0][0]
                if Name == "--- Search ---":
-                       self.suchen()
+                       self.suchen(suggest_func=self.getSuggestions)
                elif re.match(".*Subscriptions", Name):
                        Link = self['liste'].getCurrent()[0][1]
                        self.session.open(pornhubSubscriptionsScreen, Link, Name)
@@ -234,6 +234,26 @@ class pornhubGenreScreen(MPScreen, LoginFunc):
                        Link = base_url + '/video/search?search=%s&page=' % urllib.quote(self.suchString).replace(' ', '+')
                        self.session.open(pornhubFilmScreen, Link, Name)
 
+       def getSuggestions(self, text, max_res):
+               url = "https://www.pornhub.com/video/search_autocomplete?pornstars=true&orientation=straight&q=%s" % urllib.quote_plus(text)
+               d = twAgentGetPage(url, agent=phAgent, headers=json_headers, timeout=5)
+               d.addCallback(self.gotSuggestions, max_res)
+               d.addErrback(self.gotSuggestions, max_res, err=True)
+               return d
+
+       def gotSuggestions(self, suggestions, max_res, err=False):
+               list = []
+               if not err and type(suggestions) in (str, buffer):
+                       suggestions = json.loads(suggestions)
+                       for item in suggestions["queries"]:
+                               li = item
+                               list.append(str(li))
+                               max_res -= 1
+                               if not max_res: break
+               elif err:
+                       printl(str(suggestions),self,'E')
+               return list
+
        def keySetup(self):
                if mp_globals.isDreamOS:
                        self.session.openWithCallback(self.setupCallback, pornhubSetupScreen, is_dialog=True)
@@ -1207,17 +1227,17 @@ class pornhubFilmScreen(MPScreen, ThumbsHelper, LoginFunc):
                        js = re.findall('type="text/javascript">.*?(var\sflashvars.*?)loadScriptUniqueId', data, re.S)
                        if js:
                                js = js[0]
-                               if "media_0" in js:
+                               if "media_0=" in js:
                                        js = js + "console.log(media_0+'\\n');"
-                               if "media_1" in js:
+                               if "media_1=" in js:
                                        js = js + "console.log(media_1+'\\n');"
-                               if "media_2" in js:
+                               if "media_2=" in js:
                                        js = js + "console.log(media_2+'\\n');"
-                               if "media_3" in js:
+                               if "media_3=" in js:
                                        js = js + "console.log(media_3+'\\n');"
-                               if "media_4" in js:
+                               if "media_4=" in js:
                                        js = js + "console.log(media_4+'\\n');"
-                               if "media_5" in js:
+                               if "media_5=" in js:
                                        js = js + "console.log(media_5+'\\n');"
                                try:
                                        urls = subprocess.check_output(["node", "-e", js]).strip()
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornicom.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornicom.py
new file mode 100644 (file)
index 0000000..92dd08f
--- /dev/null
@@ -0,0 +1,286 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+
+class pornicomGenreScreen(MPScreen):
+
+       def __init__(self, session, mode):
+               self.mode = mode
+
+               global default_cover
+               if self.mode == "pornicom":
+                       self.portal = "Pornicom.com"
+                       self.baseurl = "https://www.pornicom.com"
+                       default_cover = "file://%s/pornicom.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "vikiporn":
+                       self.portal = "VikiPorn.com"
+                       self.baseurl = "http://www.vikiporn.com"
+                       default_cover = "file://%s/vikiporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "sleazyneasy":
+                       self.portal = "SleazyNEasy.com"
+                       self.baseurl = "https://www.sleazyneasy.com"
+                       default_cover = "file://%s/sleazyneasy.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "katestube":
+                       self.portal = "KatesTube.com"
+                       self.baseurl = "https://www.katestube.com"
+                       default_cover = "file://%s/katestube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "pervclips":
+                       self.portal = "PervClips.com"
+                       self.baseurl = "https://www.pervclips.com/tube"
+                       default_cover = "file://%s/pervclips.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "wankoz":
+                       self.portal = "Wankoz.com"
+                       self.baseurl = "https://www.wankoz.com"
+                       default_cover = "file://%s/wankoz.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "pornwhite":
+                       self.portal = "PornWhite.com"
+                       self.baseurl = "https://www.pornwhite.com"
+                       default_cover = "file://%s/pornwhite.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.filmliste = []
+               self.keyLocked = True
+               url = "%s/categories/" % self.baseurl
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               parse = re.search('(?:class="thumbs-holder"|class="categories-thumbs"|class="thumbs-list")(.*?)(?:class="thumb_spots|class="bottom-banners")', data, re.S)
+               if parse:
+                       Cats = re.findall('class="(?:item|thumb)">.*?href="(.*?)".*?(?:data-original|src)="([A-Za-z0-9_:.,-=\/\s]+)".*?alt="(.*?)"', parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Image, Title) in Cats:
+                                       self.filmliste.append((upperString(Title), Url, Image.replace(' ','%20')))
+                               self.filmliste.sort()
+               self.filmliste.insert(0, ("Top Rated", "%s/top-rated/" % self.baseurl, default_cover))
+               self.filmliste.insert(0, ("Most Popular", "%s/most-popular/" % self.baseurl, default_cover))
+               self.filmliste.insert(0, ("Newest", "%s/latest-updates/" % self.baseurl, default_cover))
+               self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+               self.showInfos()
+
+       def showInfos(self):
+               cover = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(cover)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       self.session.open(pornicomFilmScreen, Link, Name, self.portal, self.baseurl)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '+')
+                       self.session.open(pornicomFilmScreen, Link, Name, self.portal, self.baseurl)
+
+class pornicomFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name, portal, baseurl):
+               self.Link = Link
+               self.Name = Name
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "Pornicom.com":
+                       default_cover = "file://%s/pornicom.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "VikiPorn.com":
+                       default_cover = "file://%s/vikiporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "SleazyNEasy.com":
+                       default_cover = "file://%s/sleazyneasy.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "KatesTube.com":
+                       default_cover = "file://%s/katestube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PervClips.com":
+                       default_cover = "file://%s/pervclips.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Wankoz.com":
+                       default_cover = "file://%s/wankoz.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PornWhite.com":
+                       default_cover = "file://%s/pornwhite.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       url = "%s/search/%s/?q=%s" % (self.baseurl, str(self.page), self.Link)
+               else:
+                       url = "%s%s/" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, '(?:class="pagination"|class="pager"|class="paging-area")(.*?)</ul>', '.*>(\d+)<')
+               parse = re.search('(?:class="thumbs-holder"|class="thumbs-list")(.*?)(?:class="thumb_spots|class="bottom-banners")', data, re.S)
+               if parse:
+                       data = parse.group(1)
+                       if 'class="item video-thumb' in data:
+                               data = data.split('class="item video-thumb')
+                       elif 'class="item thumb' in data:
+                               data = data.split('class="item thumb')
+                       elif 'class="thumb"' in data:
+                               data = data.split('class="thumb"')
+                       for item in data:
+                               Url = re.findall("href=[\'\"]([^\"\']+?)[\'\"]", item, re.S)
+                               Url = Url[0] if Url else ''
+                               Title = re.findall("alt=[\'\"](.*?)[\'\"](?:\s|>)", item, re.S)
+                               Title = Title[0] if Title else ''
+                               Image = re.findall("<img.*?(?:src|data-original)=[\'\"]([A-Za-z0-9_:.,-=\/\?]+[^placeholder]\.(?:jpg|png))['\"\?]", item, re.S)
+                               Image = Image[0] if Image else ''
+                               Runtime = re.findall('"duration"(?:\scontent=|\sclass="length"|)[\'\">]([^\"\']+?)(?:</i|</span|</div|\'|\")', item, re.S)
+                               Runtime = stripAllTags(Runtime[0]).strip() if Runtime else ''
+                               Views = re.findall('class="(?:icon-eye|views)"(?:>Views|).*?>(.*?)</span', item, re.S)
+                               Views = stripAllTags(Views[0]).strip() if Views else ''
+                               Rating = re.findall('class="(?:icon-like|item-rating)"(?:>Porn Rating|>Porn rating|).*?(?:<span|)>(.*?)</span', item, re.S)
+                               Rating = stripAllTags(Rating[0]).strip() if Rating else ''
+                               if Url and Title and Image:
+                                       self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, Rating))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               runtime = "Runtime: %s\n" % runtime if runtime else ''
+               views = self['liste'].getCurrent()[0][4]
+               views = "Views: %s\n" % views if views else ''
+               rated = self['liste'].getCurrent()[0][5]
+               rated = "Rating: %s\n" % rated if rated else ''
+               self['name'].setText(title)
+               self['handlung'].setText("%s%s%s" % (runtime, views, rated))
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               mp_globals.player_agent = agent
+               license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+               url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
+               if not url:
+                       url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'', data, re.S)
+               if license and url:
+                       try:
+                               max = 0
+                               for vid in url:
+                                       if int(vid[1]) > max:
+                                               max = int(vid[1])
+                                               url = vid[0]
+                       except:
+                               url = url[-1]
+                       if 'function/0/' in url:
+                               url = decrypturl(url, license[0])
+                       self['name'].setText('')
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornicom')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornid.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornid.py
new file mode 100644 (file)
index 0000000..8093f0e
--- /dev/null
@@ -0,0 +1,310 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+
+class pornidGenreScreen(MPScreen):
+
+       def __init__(self, session, mode):
+               self.mode = mode
+
+               global default_cover
+               if self.mode == "pornid":
+                       self.portal = "PornID.xxx"
+                       self.baseurl = "https://www.pornid.xxx"
+                       default_cover = "file://%s/pornid.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "sexvid":
+                       self.portal = "SexVid.xxx"
+                       self.baseurl = "http://www.sexvid.xxx"
+                       default_cover = "file://%s/sexvid.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "hdtube":
+                       self.portal = "HDtube.porn"
+                       self.baseurl = "https://www.hdtube.porn"
+                       default_cover = "file://%s/hdtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "zbporn":
+                       self.portal = "ZBPorn.com"
+                       self.baseurl = "https://www.zbporn.com"
+                       default_cover = "file://%s/zbporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.filmliste = []
+               self.keyLocked = True
+               url = "%s/categories/" % self.baseurl
+               if self.mode == "sexvid":
+                       url = url.replace('categories','c')
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               parse = re.search('(?:class="categories-content"|class="title">Categories|class="thumbs_holder"|class="cards")(.*?)(?:class="information-bottom"|class="bottom_spots"|class="page__footer"|class="footer")', data, re.S)
+               if parse:
+                       Cats = re.findall('(?:class="thumb">|class="cards__item item">|).*?href="(.*?)".*?(?:data-original|src)="(?!data:image)([A-Za-z0-9_:.,-=\/\s]+)".*?class="(?:name-ctg|title_cat|card__title capitalize|th-model)">(.*?)(?:</span>|</p>|</div>)', parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Image, Title) in Cats:
+                                       if self.mode == "zbporn":
+                                               Image = default_cover
+                                       Url = Url.strip('/') + '/'
+                                       self.filmliste.append((upperString(Title), Url, Image))
+                               self.filmliste.sort()
+               if self.mode == "pornid":
+                       self.filmliste.insert(0, ("Longest", "%s/longest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Top Rated", "%s/top-rated/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Viewed", "%s/most-viewed/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/latest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               elif self.mode == "sexvid":
+                       self.filmliste.insert(0, ("Longest", "%s/p/duration/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Commented", "%s/p/most-commented/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Favorited", "%s/p/most-favourited/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Top Rated", "%s/p/rating/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Viewed", "%s/p/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/p/date/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               elif self.mode == "hdtube":
+                       self.filmliste.insert(0, ("Longest", "%s/videos/longest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Top Rated", "%s/videos/top-rated/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Popular", "%s/videos/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/videos/latest-updates/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               elif self.mode == "zbporn":
+                       self.filmliste.insert(0, ("Longest", "%s/longest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Top Rated", "%s/top-rated/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Popular", "%s/most-popular/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/latest-updates/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+               self.showInfos()
+
+       def showInfos(self):
+               cover = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(cover)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       self.session.open(pornidFilmScreen, Link, Name, self.portal, self.baseurl)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '+')
+                       self.session.open(pornidFilmScreen, Link, Name, self.portal, self.baseurl)
+
+class pornidFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name, portal, baseurl):
+               self.Link = Link
+               self.Name = Name
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "PornID.xxx":
+                       default_cover = "file://%s/pornid.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "SexVid.xxx":
+                       default_cover = "file://%s/sexvid.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "HDtube.porn":
+                       default_cover = "file://%s/hdtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "ZBPorn.com":
+                       default_cover = "file://%s/zbporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       if self.portal == "SexVid.xxx":
+                               url = "%s/s/%s/%s/"  % (self.baseurl, self.Link, str(self.page))
+                       elif self.portal == "PornID.xxx" or self.portal == "HDtube.porn":
+                               url = "%s/search/%s/%s/"  % (self.baseurl, self.Link, str(self.page))
+                       elif self.portal == "ZBPorn.com":
+                               url = "%s/search/%s/?q=%s"  % (self.baseurl, str(self.page), self.Link)
+               else:
+                       url = "%s%s/" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, 'class="pagination(.*?)(?:>Last<|Page last|</ul>|</div>)', '.*[>|\/](\d+)[<|\/]')
+               parse = re.search('(?:class="thumbs thumbs-expandable"|class="thumbs videos"|class="thumbs_holder"|class="cards__list)(.*?)(?:class="thumb_spots|class="bottom-banners"|class="pagination)', data, re.S)
+               if parse:
+                       data = parse.group(1)
+                       fix = ''
+                       if 'class="thumb"' in data:
+                               data = data.split('class="thumb"')
+                       elif 'class="th">' in data:
+                               data = data.split('class="th">')
+                       elif 'class="item cards__item"' in data:
+                               data = data.split('class="item cards__item"')
+                       elif '<a href=' in data:
+                               fix = "<a href="
+                               data = data.split('<a href=')
+                       for item in data:
+                               if fix:
+                                       item = fix + item
+                               Url = re.findall("href=[\'\"]([^\"\']+?)[\'\"]", item, re.S)
+                               Url = Url[0] if Url else ''
+                               Title = re.findall("alt=[\'\"](.*?)[\'\"](?:\s|>)", item, re.S)
+                               Title = Title[0] if Title else ''
+                               Image = re.findall("<img.*?(?:src|data-original)=[\'\"]([A-Za-z0-9_:.,-=\/\?]+[^placeholder]\.(?:jpg|png))['\"\?]", item, re.S)
+                               Image = Image[0] if Image else ''
+                               Runtime = re.findall('class="(?:icon-time|duration|th-time|card__flag)"[\'\">]([^\"\']+?)(?:</span|\'|\")', item, re.S)
+                               Runtime = stripAllTags(Runtime[0]).strip() if Runtime else ''
+                               Added = re.findall('class="(?:date|added)"[\'\">]([^\"\']+?)(?:</span|\'|\")', item, re.S)
+                               Added = stripAllTags(Added[0]).strip() if Added else ''
+                               Views = re.findall('class="icon-eye.{0,1}"[\'\">]([^\"\']+?)(?:</span|\'|\")', item, re.S)
+                               Views = stripAllTags(Views[0]).strip() if Views else ''
+                               Rating = re.findall('class="icon-thumbs-up"[\'\">]([^\"\']+?)(?:</span|\'|\")', item, re.S)
+                               Rating = stripAllTags(Rating[0]).strip() if Rating else ''
+                               if Url and Title and Image:
+                                       self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, Rating, Added))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', '', '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               runtime = "Runtime: %s\n" % runtime if runtime else ''
+               added = self['liste'].getCurrent()[0][6]
+               added = "Added: %s\n" % added if added else ''
+               views = self['liste'].getCurrent()[0][4]
+               views = "Views: %s\n" % views if views else ''
+               rated = self['liste'].getCurrent()[0][5]
+               rated = "Rating: %s" % rated if rated else ''
+               self['name'].setText(title)
+               self['handlung'].setText("%s%s%s%s" % (runtime, added, views, rated))
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               mp_globals.player_agent = agent
+               license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+               url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
+               if not url:
+                       url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'', data, re.S)
+               if license and url:
+                       try:
+                               max = 0
+                               for vid in url:
+                                       if int(vid[1]) > max:
+                                               max = int(vid[1])
+                                               url = vid[0]
+                       except:
+                               url = url[-1]
+                       if 'function/0/' in url:
+                               url = decrypturl(url, license[0])
+                       self['name'].setText('')
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornid')
\ No newline at end of file
index 327fc2c..fe12521 100644 (file)
 
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.aes_crypt import aes_decrypt_text
 
-default_cover = "file://%s/pornrabbit.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
 
 class pornrabbitGenreScreen(MPScreen):
 
-       def __init__(self, session):
+       def __init__(self, session, mode):
+               self.mode = mode
+
+               global default_cover
+               if self.mode == "pornrabbit":
+                       self.portal = "PornRabbit.com"
+                       self.baseurl = "https://www.pornrabbit.com"
+                       default_cover = "file://%s/pornrabbit.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "pornwatchers":
+                       self.portal = "PornWatchers.com"
+                       self.baseurl = "https://www.pornwatchers.com"
+                       default_cover = "file://%s/pornwatchers.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "stileproject":
+                       self.portal = "StileProject.com"
+                       self.baseurl = "https://www.stileproject.com"
+                       default_cover = "file://%s/stileproject.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
                self["actions"] = ActionMap(["MP_Actions"], {
@@ -55,7 +70,7 @@ class pornrabbitGenreScreen(MPScreen):
                        "left" : self.keyLeft
                }, -1)
 
-               self['title'] = Label("PornRabbit.com")
+               self['title'] = Label(self.portal)
                self['ContentTitle'] = Label("Genre:")
 
                self.keyLocked = True
@@ -69,22 +84,38 @@ class pornrabbitGenreScreen(MPScreen):
 
        def layoutFinished(self):
                self.keyLocked = True
-               url = "http://www.pornrabbit.com/page/categories/"
-               getPage(url).addCallback(self.genreData).addErrback(self.dataError)
+               url = "%s/videos/" % self.baseurl
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               Cats = re.findall('class="cat">.*?<a\shref="(.*?)".*?<h2>(.*?)<small>.*?(\d+,?\d+).*?<img\ssrc="(.*?)"', data, re.S)
-               if Cats:
-                       for (Url, Title, Count, Image) in Cats:
-                               Image = "http://www.pornrabbit.com" + Image
-                               self.genreliste.append((Title, Url, Image, Count.replace(',','')))
-                       self.genreliste.sort()
-                       self.genreliste.insert(0, ("Most Recent", "/videos/", default_cover, None))
-                       self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover, None))
-                       self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-                       self.ml.moveToIndex(0)
-                       self.keyLocked = False
-                       self.showInfos()
+               parse = re.search('class="categories-list-scroll">(.*?)</ul>', data, re.S)
+               if parse:
+                       Cats = re.findall('<li><a href="(.*?)" title="(.*?)">', parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Title) in Cats:
+                                       if not Url.endswith('/'):
+                                               Url = Url + "/"
+                                       self.genreliste.append((Title, Url.lower(), default_cover))
+               parse = re.search('class="top-keywords">(.*?)class="see-all"', data, re.S)
+               if parse:
+                       Cats = re.findall('<li><a href="(.*?)" title="(.*?)">', parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Title) in Cats:
+                                       if not Url.endswith('/'):
+                                               Url = Url + "/"
+                                       Title = Title.replace('Porn Videos','').strip()
+                                       self.genreliste.append((Title, Url.lower(), default_cover))
+               # remove duplicates
+               self.genreliste = list(set(self.genreliste))
+               self.genreliste.sort()
+               self.genreliste.insert(0, ("Most Viewed", "%s/most-viewed/" % self.baseurl, default_cover))
+               self.genreliste.insert(0, ("Top Rated", "%s/top-rated/" % self.baseurl, default_cover))
+               self.genreliste.insert(0, ("Most Recent", "%s/videos/" % self.baseurl, default_cover))
+               self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.showInfos()
 
        def showInfos(self):
                Image = self['liste'].getCurrent()[0][2]
@@ -98,23 +129,31 @@ class pornrabbitGenreScreen(MPScreen):
                        self.suchen()
                else:
                        Link = self['liste'].getCurrent()[0][1]
-                       count = self['liste'].getCurrent()[0][3]
-                       self.session.open(pornrabbitFilmScreen, Link, Name, count)
+                       self.session.open(pornrabbitFilmScreen, Link, Name, self.portal, self.baseurl)
 
        def SuchenCallback(self, callback = None):
                if callback is not None and len(callback):
-                       self.suchString = urllib.quote(callback).replace(' ', '%20')
                        Name = "--- Search ---"
-                       Link = '/search/%s/' % (self.suchString)
-                       count = None
-                       self.session.open(pornrabbitFilmScreen, Link, Name, count)
+                       self.suchString = callback
+                       Link = '%s' % urllib.quote(self.suchString).replace(' ', '-')
+                       self.session.open(pornrabbitFilmScreen, Link, Name, self.portal, self.baseurl)
 
 class pornrabbitFilmScreen(MPScreen, ThumbsHelper):
 
-       def __init__(self, session, Link, Name, Count=None):
+       def __init__(self, session, Link, Name, portal, baseurl):
                self.Link = Link
                self.Name = Name
-               self.Count = Count
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "PornRabbit.com":
+                       default_cover = "file://%s/pornrabbit.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PornWatchers.com":
+                       default_cover = "file://%s/pornwatchers.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "StileProject.com":
+                       default_cover = "file://%s/stileproject.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
 
@@ -132,7 +171,7 @@ class pornrabbitFilmScreen(MPScreen, ThumbsHelper):
                        "green" : self.keyPageNumber
                }, -1)
 
-               self['title'] = Label("PornRabbit.com")
+               self['title'] = Label(self.portal)
                self['ContentTitle'] = Label("Genre: %s" % self.Name)
                self['F2'] = Label(_("Page"))
 
@@ -151,86 +190,46 @@ class pornrabbitFilmScreen(MPScreen, ThumbsHelper):
                self.keyLocked = True
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
-               url = "http://www.pornrabbit.com%s%s/" % (self.Link, str(self.page))
-               getPage(url).addCallback(self.loadData).addErrback(self.dataError)
+               if re.match(".*?Search", self.Name):
+                       url = "%s/%s/page%s.html" % (self.baseurl, self.Link, str(self.page))
+               else:
+                       url = "%spage%s.html" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
-               if self.Count:
-                       self.lastpage = int(round((float(self.Count) / 33) + 0.5))
-                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
-               else:
-                       self.lastpage = 999
-                       self['page'].setText(str(self.page))
-               Movies = re.findall('class="video">.*?<a href="(.*?)" title="(.*?)".*?<img.*?src="(.*?)".*?views: <b>(.*?)</b>.*?runtime: <b>(.*?)</b>', data, re.S)
-               if Movies:
-                       for (Url, Title, Image, Views, Runtime) in Movies:
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views))
-                       self.ml.setList(map(self._defaultlistleft, self.filmliste))
-                       self.ml.moveToIndex(0)
-                       self.keyLocked = False
-                       self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, 999, mode=1)
-                       self.showInfos()
+               self.getLastPage(data, 'class="pagination-col(.*?)</nav>')
+               parse = re.search('class="main-col">(.*?)$', data, re.S)
+               if parse:
+                       Movies = re.findall('class="item-col col".*?href="(.*?)"\stitle="(.*?)".*?src="(.*?)".*?class="icon i-clock">.*?class="sub-desc">(.*?)</span>', parse.group(1), re.S)
+                       if Movies:
+                               for (Url, Title, Image, Runtime) in Movies:
+                                       self.filmliste.append((decodeHtml(Title), Url, Image, Runtime))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No movies found!'), None, None, ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
 
        def showInfos(self):
                title = self['liste'].getCurrent()[0][0]
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
-               views = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
+               self['handlung'].setText("Runtime: %s" % runtime)
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keyOK(self):
                if self.keyLocked:
                        return
                Link = self['liste'].getCurrent()[0][1]
-               if not Link == None:
-                       url = 'http://www.pornrabbit.com%s' % Link
-                       self.keyLocked = True
-                       getPage(url).addCallback(self.getVideoPage).addErrback(self.dataError)
+               if Link:
+                       twAgentGetPage(Link, agent=agent).addCallback(self.getVideoPage).addErrback(self.dataError)
 
        def getVideoPage(self, data):
-               self.keyLocked = False
-               videoPage = re.findall('jwplayer.*?file: \'(.*?)\'', data, re.S)
+               videoPage = re.findall('<source src="(.*?)" type=\'video/mp4\'>', data, re.S)
                if videoPage:
                        Title = self['liste'].getCurrent()[0][0]
-                       self.session.open(SimplePlayer, [(Title, videoPage[0])], showPlaylist=False, ltype='pornrabbit')
-                       return
-               else:
-                       videoPage = re.findall('videoplay.*?src=["|\'](.*?)["|\']', data, re.S)
-                       if videoPage:
-                               if re.search('//xhamster.com/', videoPage[0]):
-                                       self.keyLocked = True
-                                       getPage(videoPage[0]).addCallback(self.getxhamsterLink).addErrback(self.errWorker).addErrback(self.dataError)
-                                       return
-                               elif re.search('//www.youporn.com/', videoPage[0]):
-                                       self.keyLocked = True
-                                       getPage(videoPage[0], headers={'Cookie': 'age_verified=1', 'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.getyoupornLink).addErrback(self.errWorker).addErrback(self.dataError)
-                                       return
-               message = self.session.open(MessageBoxExt, _("No supported streams found!"), MessageBoxExt.TYPE_INFO, timeout=3)
-
-       def errWorker(self, error):
-               self.keyLocked = False
-               message = self.session.open(MessageBoxExt, _("No link found!"), MessageBoxExt.TYPE_INFO, timeout=3)
-               myerror = error.getErrorMessage()
-               if myerror:
-                       raise error
-
-       def getxhamsterLink(self, data):
-               self.keyLocked = False
-               videoPage = re.findall('videoUrls.*?(http.*?)%22', data)
-               if videoPage:
-                       Title = self['liste'].getCurrent()[0][0]
-                       self.session.open(SimplePlayer, [(Title, urllib.unquote(videoPage[0]).replace('\/', '/'))], showPlaylist=False, ltype='pornrabbit')
-               else:
-                       message = self.session.open(MessageBoxExt, _("No link found!"), MessageBoxExt.TYPE_INFO, timeout=3)
-
-       def getyoupornLink(self, data):
-               self.keyLocked = False
-               videoPage = re.findall('video_url\':\s\'(.*?)\'', data)
-               if videoPage:
-                       Title = self['liste'].getCurrent()[0][0]
-                       videoLink = aes_decrypt_text(videoPage[0], Title, 32)
-                       self.session.open(SimplePlayer, [(Title, videoLink)], showPlaylist=False, ltype='pornrabbit')
-               else:
-                       message = self.session.open(MessageBoxExt, _("No link found!"), MessageBoxExt.TYPE_INFO, timeout=3)
\ No newline at end of file
+                       mp_globals.player_agent = agent
+                       self.session.open(SimplePlayer, [(Title, videoPage[0])], showPlaylist=False, ltype='pornrabbit')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornxio.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornxio.py
new file mode 100644 (file)
index 0000000..a930b96
--- /dev/null
@@ -0,0 +1,257 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+default_cover = "file://%s/pornxio.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+class pornxioGenreScreen(MPScreen):
+
+       def __init__(self, session, mode, genre='category'):
+               self.mode = mode
+               self.genre = genre
+
+               global default_cover
+               if self.mode == "pornxio":
+                       self.portal = "PornXio.com"
+                       self.baseurl = "https://pornxio.com"
+                       default_cover = "file://%s/pornxio.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "handjobhub":
+                       self.portal = "HandjobHub.com"
+                       self.baseurl = "https://handjobhub.com"
+                       default_cover = "file://%s/handjobhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "swipexxx":
+                       if self.genre == "category":
+                               self.genre = "channels"
+                       self.portal = "SWIPE.XXX"
+                       self.baseurl = "https://swipe.xxx"
+                       default_cover = "file://%s/swipexxx.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "hypnotube":
+                       if self.genre == "category":
+                               self.genre = "channels"
+                       self.portal = "hypnotube.com"
+                       self.baseurl = "https://hypnotube.com"
+                       default_cover = "file://%s/hypnotube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.filmliste = []
+               self.keyLocked = True
+               url = "%s/%s/" % (self.baseurl, self.genre)
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               parse = re.search('<h1>(?:Porn Channels|Categories|List of Handjob Categories|Browse HD Porn Sites)(.*?)$', data, re.S)
+               if parse:
+                       Cats = re.findall('class="item-col item--(?:channel|paysite).*?href="(.*?)"\stitle="(.*?)".*?img.*?(?:src|data-opts-original)="(\w.*?)"', parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Title, Image) in Cats:
+                                       if "4K" in Title:
+                                               if mp_globals.model in ["one","two"]:
+                                                       self.filmliste.append((upperString(decodeHtml(Title)), Url, Image))
+                                       else:
+                                               self.filmliste.append((upperString(decodeHtml(Title)), Url, Image))
+                               self.filmliste.sort()
+               if (self.genre == "category" or self.genre == "channels"):
+                       if self.mode == "pornxio":
+                               self.filmliste.insert(0, ("Studios", "studios", default_cover))
+                       elif self.mode == "handjobhub":
+                               self.filmliste.insert(0, ("Paysites", "paysites", default_cover))
+                       self.filmliste.insert(0, ("Longest", "%s/longest/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Discussed", "%s/most-discussed/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Top Rated", "%s/top-rated/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Most Viewed", "%s/most-viewed/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("Newest", "%s/videos/" % self.baseurl, default_cover))
+                       self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+               self.showInfos()
+
+       def showInfos(self):
+               cover = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(cover, headers={'Referer':self.baseurl})
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       if Link.startswith('http'):
+                               self.session.open(pornxioFilmScreen, Link, Name, self.portal, self.baseurl)
+                       else:
+                               self.session.open(pornxioGenreScreen, self.mode, Link)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '-')
+                       self.session.open(pornxioFilmScreen, Link, Name, self.portal, self.baseurl)
+
+class pornxioFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name, portal, baseurl):
+               self.Link = Link
+               self.Name = Name
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "PornXio.com":
+                       default_cover = "file://%s/pornxio.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "HandjobHub.com":
+                       default_cover = "file://%s/handjobhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "SWIPE.XXX":
+                       default_cover = "file://%s/swipexxx.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "hypnotube.com":
+                       default_cover = "file://%s/hypnotube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       url = "%s/search/videos/%s/page%s.html" % (self.baseurl, self.Link, str(self.page))
+               else:
+                       url = "%s/page%s.html" % (self.Link, str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, 'class="pagination(.*?)(?:rel=\'next\'|</nav>)', '.*(?:page|<span>)(\d+)(?:\.html|</span>)')
+               if "<!-- // TOPLIST TEMPLATE // -->" in data:
+                       parse = re.search('^(.*?)<!-- // TOPLIST TEMPLATE // -->', data, re.S)
+                       if parse:
+                               data = parse.group(1)
+               Movies = re.findall('class="item-col col\s{0,1}"\s{0,1}(?: id="content-\d+"|\s{0,1})>.*?href="(.*?)"\stitle="(.*?)".*?(?:src|data-opts-original)="(?!data:image/)(\w.*?)".*?class="time">(.*?)</span>.*?i-thumbs-up".*?sub-desc">(.*?)</span>.*?class="icon i-eye">.*?class="sub-desc">(.*?)</span>', data, re.S)
+               if Movies:
+                       for (Url, Title, Image, Runtime, Rating, Views) in Movies:
+                               if not "Photos" in Runtime:
+                                       self.filmliste.append((decodeHtml(Title).strip(), Url, Image.replace(' ','%20'), Runtime, Rating, Views))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               rating = self['liste'].getCurrent()[0][4]
+               views = self['liste'].getCurrent()[0][5]
+               self['name'].setText(title)
+               self['handlung'].setText("Runtime: %s\nRating: %s\nViews: %s" % (runtime, rating, views))
+               CoverHelper(self['coverArt']).getCover(pic, headers={'Referer':self.baseurl})
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               mp_globals.player_agent = agent
+               url = re.findall('file:\s{0,1}["|\'](.*?)["|\'],', data, re.S)
+               if not url:
+                       url = re.findall('<source\ssrc=["|\'](.*?)["|\']', data, re.S)
+               if url:
+                       self.session.open(SimplePlayer, [(Title, url[0])], showPlaylist=False, ltype='pornxio')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/slutload.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/slutload.py
new file mode 100644 (file)
index 0000000..2f14c99
--- /dev/null
@@ -0,0 +1,262 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+
+class slutloadGenreScreen(MPScreen):
+
+       def __init__(self, session, mode):
+               self.mode = mode
+
+               global default_cover
+               if self.mode == "slutload":
+                       self.portal = "Slutload.com"
+                       self.baseurl = "https://www.slutload.com"
+                       default_cover = "file://%s/slutload.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "madthumbs":
+                       self.portal = "MadThumbs.com"
+                       self.baseurl = "http://www.madthumbs.com"
+                       default_cover = "file://%s/madthumbs.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "fapster":
+                       self.portal = "Fapster.xxx"
+                       self.baseurl = "https://fapster.xxx"
+                       default_cover = "file://%s/fapster.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "vqtube":
+                       self.portal = "VQTube.com"
+                       self.baseurl = "https://vqtube.com"
+                       default_cover = "file://%s/vqtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre:")
+               self.keyLocked = True
+
+               self.suchString = ''
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.extcat = []
+               self.maincat = []
+               self.maincat.insert(0, ("Longest", "duration"))
+               self.maincat.insert(0, ("Most Favorited", "most_favourited"))
+               self.maincat.insert(0, ("Most Commented", "most_commented"))
+               self.maincat.insert(0, ("Top Rated", "rating"))
+               self.maincat.insert(0, ("Most Viewed", "video_viewed"))
+               self.maincat.insert(0, ("Newest", "post_date"))
+               self.maincat.insert(0, ("--- Search ---", "callSuchen"))
+               self.keyLocked = True
+               url = "%s/categories/" % self.baseurl
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+               if self.mode == "vqtube":
+                       twAgentGetPage(url+'2/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'3/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'4/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'5/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'6/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'7/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'8/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'9/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'10/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               Cats = re.findall('class="item" href="(.*?)" title="(.*?)"', data, re.S)
+               if Cats:
+                       for (Url, Title) in Cats:
+                               self.extcat.append((upperString(Title), Url.strip('/')))
+                       self.extcat.sort()
+               self.filmliste = []
+               self.filmliste.extend(self.maincat)
+               self.filmliste.extend(self.extcat)
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.keyLocked = False
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               if Name == "--- Search ---":
+                       self.suchen()
+               elif Link:
+                       self.session.open(slutloadFilmScreen, Link, Name, self.portal, self.baseurl)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '-')
+                       self.session.open(slutloadFilmScreen, Link, Name, self.portal, self.baseurl)
+
+class slutloadFilmScreen(MPScreen, ThumbsHelper):
+
+       def __init__(self, session, Link, Name, portal, baseurl):
+               self.Link = Link
+               self.Name = Name
+               self.portal = portal
+               self.baseurl = baseurl
+
+               global default_cover
+               if self.portal == "Slutload.com":
+                       default_cover = "file://%s/slutload.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "MadThumbs.com":
+                       default_cover = "file://%s/madthumbs.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Fapster.xxx":
+                       default_cover = "file://%s/fapster.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "VQTube.com":
+                       default_cover = "file://%s/vqtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+               ThumbsHelper.__init__(self)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok" : self.keyOK,
+                       "0" : self.closeAll,
+                       "cancel" : self.keyCancel,
+                       "5" : self.keyShowThumb,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
+               }, -1)
+
+               self['title'] = Label(self.portal)
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 1
+               self.lastpage = 1
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+
+       def loadPage(self):
+               self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
+               self.filmliste = []
+               if re.match(".*Search", self.Name):
+                       url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=%s&category_ids=&sort_by=&from_videos=%s&from_albums=%s" % (self.baseurl, self.Link, self.Link.replace('-','+'), str(self.page), str(self.page))
+               else:
+                       if self.Link.startswith('http'):
+                               if self.Link.split('/')[-1].isdigit():
+                                       fix = '1'
+                               else:
+                                       fix = ''
+                               url = "%s/%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date" % (self.Link, fix)
+                               if self.page > 1:
+                                       url = url + "&from=%s" % str(self.page)
+                       else:
+                               url = "%s/?mode=async&function=get_block&block_id=list_videos_most_recent_videos&sort_by=%s" % (self.baseurl, self.Link)
+                               if self.page > 1:
+                                       url = url + "&from=%s" % str(self.page)
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               self.getLastPage(data, 'class="pagination"(.*?)>Last<', '.*[from:|>](\d+)["|<]')
+               Movies = re.findall('class="item\s{0,3}".*?href="(.*?)" title="(.*?)".*?data-original="(.*?)".*?class="duration">(.*?)</div>.*?class="added"><em>(.*?)</em></div>.*?class="views">(.*?)</div>', data, re.S)
+               if Movies:
+                       for (Url, Title, Image, Runtime, Added, Views) in Movies:
+                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views.replace(' ',''), stripAllTags(Added)))
+               if len(self.filmliste) == 0:
+                       self.filmliste.append((_('No videos found!'), None, None, '', ''))
+               self.ml.setList(map(self._defaultlistleft, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.keyLocked = False
+               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               url = self['liste'].getCurrent()[0][1]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               views = self['liste'].getCurrent()[0][4]
+               added = self['liste'].getCurrent()[0][5]
+               self['name'].setText(title)
+               self['handlung'].setText("Runtime: %s\nAdded: %s\nViews: %s" % (runtime, added, views))
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Link = self['liste'].getCurrent()[0][1]
+               if Link:
+                       self['name'].setText(_('Please wait...'))
+                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+
+       def parseVideo(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               mp_globals.player_agent = agent
+               license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+               url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
+               if not url:
+                       url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'', data, re.S)
+               if license and url:
+                       try:
+                               max = 0
+                               for vid in url:
+                                       if int(vid[1]) > max:
+                                               max = int(vid[1])
+                                               url = vid[0]
+                       except:
+                               url = url[-1]
+                       if 'function/0/' in url:
+                               url = decrypturl(url, license[0])
+                       self['name'].setText('')
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='slutload')
\ No newline at end of file
index 4ebfe77..6cc152f 100644 (file)
@@ -49,7 +49,7 @@ class updatetubeGenreScreen(MPScreen):
                        default_cover = "file://%s/updatetube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                if self.mode == "pinkrod":
                        self.portal = "Pinkrod.com"
-                       self.baseurl = "www.pinkrod.com"
+                       self.baseurl = "pinkrod.com"
                        default_cover = "file://%s/pinkrod.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                if self.mode == "hotshame":
                        self.portal = "hotshame.com"
@@ -57,7 +57,7 @@ class updatetubeGenreScreen(MPScreen):
                        default_cover = "file://%s/hotshame.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                if self.mode == "thenewporn":
                        self.portal = "TheNewPorn.com"
-                       self.baseurl = "www.thenewporn.com"
+                       self.baseurl = "thenewporn.com"
                        default_cover = "file://%s/thenewporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                if self.mode == "pornsharing":
                        self.portal = "PornSharing.com"
@@ -91,7 +91,7 @@ class updatetubeGenreScreen(MPScreen):
        def layoutFinished(self):
                self['name'].setText(_('Please wait...'))
                self.keyLocked = True
-               url = "http://%s/categories/" % self.baseurl
+               url = "https://%s/categories/" % self.baseurl
                getPage(url).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
@@ -108,9 +108,9 @@ class updatetubeGenreScreen(MPScreen):
                else:
                        most = "most-popular"
                        rated = "top-rated"
-               self.genreliste.insert(0, ("Most Popular", "http://%s/%s" % (self.baseurl, most), default_cover))
-               self.genreliste.insert(0, ("Top Rated", "http://%s/%s" % (self.baseurl, rated), default_cover))
-               self.genreliste.insert(0, ("Newest", "http://%s" % self.baseurl, default_cover))
+               self.genreliste.insert(0, ("Most Popular", "https://%s/%s" % (self.baseurl, most), default_cover))
+               self.genreliste.insert(0, ("Top Rated", "https://%s/%s" % (self.baseurl, rated), default_cover))
+               self.genreliste.insert(0, ("Newest", "https://%s" % self.baseurl, default_cover))
                self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
                self.ml.setList(map(self._defaultlistcenter, self.genreliste))
                self.ml.moveToIndex(0)
@@ -199,7 +199,7 @@ class updatetubeFilmScreen(MPScreen, ThumbsHelper):
                self.filmliste = []
                cat = self.Link
                if re.match(".*?Search", self.Name):
-                       url = 'http://%s/search/%s/%s' % (self.baseurl, self.Link, str(self.page))
+                       url = 'https://%s/search/%s/%s' % (self.baseurl, self.Link, str(self.page))
                elif self.page == 1:
                        url = "%s" % (self.Link)
                else:
index 6691d11..f5848ad 100644 (file)
@@ -750,7 +750,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
 
        def getRelated(self, data):
                self.keyLocked = False
-               parse = re.findall('&amp;q&#x3D;(.*?)">\s+Show all', data, re.S)
+               parse = re.findall('(?:&amp;|\?)q&#x3D;(.*?)">\s+Show all', data, re.S)
                RelatedUrl = 'https://xhamster.com/search?q=%s&p=' % parse[0]
                self.session.open(xhamsterFilmScreen, RelatedUrl, "Related")
 
index 77cff95..38d3d74 100644 (file)
@@ -103,7 +103,7 @@ class xnxxGenreScreen(MPScreen):
 
        def layoutFinished2(self, data):
                self.filmliste = []
-               if self.scopeval[self.scope] == '':
+               if self.scope == 0:
                        orientation = "straight"
                else:
                        orientation = self.scopeval[self.scope]
@@ -114,8 +114,11 @@ class xnxxGenreScreen(MPScreen):
                if self.Link:
                        self.url = self.Link
                else:
-                       self.genreData(data)
-                       return
+                       if self.scope == 0:
+                               self.url = "https://www.xnxx.com/tags/"
+                       else:
+                               self.genreData(data)
+                               return
                twAgentGetPage(self.url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
@@ -140,6 +143,18 @@ class xnxxGenreScreen(MPScreen):
                                        Url = "https://www.xnxx.com" + Url + "/$$PAGE$$"
                                        self.filmliste.append((Title, Url, default_cover, False))
                else:
+                       if self.scope == 0:
+                               parse = re.search('id="tags">(.*?)$', data, re.S)
+                               if parse:
+                                       Cats = re.findall('<li><a href="(/search/.*?)">(.*?)</a><strong>(.*?)</strong></li>', parse.group(1), re.S)
+                                       if Cats:
+                                               for (Url, Title, Count) in Cats:
+                                                       Count = int(Count.replace(',',''))
+                                                       if Count > 250:
+                                                               if not "gay" in Title:
+                                                                       Url = Url.replace('tags','search')
+                                                                       Url = "https://www.xnxx.com" + Url + "/$$PAGE$$/"
+                                                                       self.filmliste.append((upperString(Title), Url, default_cover, False))
                        catsdata = re.search('("categories":.*?]),"more_links', data, re.S)
                        if catsdata:
                                cats = json.loads('{'+catsdata.group(1)+'}')
@@ -154,6 +169,8 @@ class xnxxGenreScreen(MPScreen):
                                                        self.filmliste.append((upperString(str(cat["label"])), Url, default_cover, False))
                                        except:
                                                continue
+                       # remove duplicates
+                       self.filmliste = list(set(self.filmliste))
                        self.filmliste.sort()
                        if self.scope == 0:
                                self.filmliste.insert(0, ("Best Of", "https://www.xnxx.com/best", default_cover, False))
@@ -175,6 +192,7 @@ class xnxxGenreScreen(MPScreen):
                self.showInfos()
 
        def showInfos(self):
+               self['name'].setText('')
                cover = self['liste'].getCurrent()[0][2]
                CoverHelper(self['coverArt']).getCover(cover)
 
@@ -183,7 +201,7 @@ class xnxxGenreScreen(MPScreen):
                        return
                Name = self['liste'].getCurrent()[0][0]
                Link = self['liste'].getCurrent()[0][1]
-               Filter =         self['liste'].getCurrent()[0][3]
+               Filter = self['liste'].getCurrent()[0][3]
                if Name == "--- Search ---":
                        self.suchen(suggest_func=self.getSuggestions)
                elif Name == "Best Of":
index b4a5039..6d2996b 100644 (file)
@@ -171,7 +171,7 @@ class xpajaFilmScreen(MPScreen, ThumbsHelper):
 
        def loadData(self, data):
                self.getLastPage(data, 'class="pagination">(.*?)</ul>', '.*[\/|>](\d+)[\"|<]')
-               Movies = re.findall('class="preload".*?thumb-post"\ssrc="(.*?)"\salt="(.*?)".*?amount">(.*?)</div.*?href="(.*?)".*?post-inf">(.*?)\sVis', data, re.S)
+               Movies = re.findall('class="preload".*?thumb-post"\ssrc="(.*?)"\s{0,25}alt="(.*?)".*?amount">(.*?)</div.*?href="(.*?)".*?post-inf">(.*?)\sVis', data, re.S)
                if Movies:
                        for (Image, Title, Runtime, Url, Views) in Movies:
                                Url = "https://www.xpaja.net/" + Url
@@ -38,10 +38,16 @@ from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 
 agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
-default_cover = "file://%s/hypnotube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-cookies = CookieJar()
+json_headers = {
+       'Accept':'application/json',
+       'Accept-Language':'de,en-US;q=0.7,en;q=0.3',
+       'X-Requested-With':'XMLHttpRequest',
+       'Content-Type':'application/x-www-form-urlencoded',
+       }
+default_cover = "file://%s/youjizz.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+cookies=CookieJar()
 
-class hypnotubeGenreScreen(MPScreen):
+class youjizzGenreScreen(MPScreen):
 
        def __init__(self, session):
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
@@ -56,7 +62,7 @@ class hypnotubeGenreScreen(MPScreen):
                        "left" : self.keyLeft
                }, -1)
 
-               self['title'] = Label("hypnotube.com")
+               self['title'] = Label("YouJizz.com")
                self['ContentTitle'] = Label("Genre:")
                self.keyLocked = True
                self.suchString = ''
@@ -68,24 +74,28 @@ class hypnotubeGenreScreen(MPScreen):
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
-               self.keyLocked = True
-               url = "https://hypnotube.com/channels/"
+               url = "https://www.youjizz.com/tags"
                twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               parse = re.search('<h1>Categories\s{0,1}</h1>(.*?)$', data, re.S)
+               parse = re.search('class="tags-wrapper(.*?)</ul>', data, re.S)
                if parse:
-                       Cats = re.findall('class="item-col.*?href="(.*?)"\stitle="(.*?)".*?img\ssrc="(.*?)"', parse.group(1), re.S)
+                       Cats = re.findall('href="(.*?)(?:1.html|)">(.*?)</a>.*?class="tag-count">\s{0,1}\((\d+)\)', parse.group(1), re.S)
                        if Cats:
-                               for (Url, Title, Image) in Cats:
-                                       if not Title in ["Images","Gifs"]:
-                                               self.filmliste.append((Title, Url, Image))
+                               for (Url, Title, Count) in Cats:
+                                       Url = "https://www.youjizz.com" + Url
+                                       Count = int(Count.replace(',',''))
+                                       if Count > 250:
+                                               self.filmliste.append((upperString(Title), Url, default_cover))
+               # remove duplicates
+               self.filmliste = list(set(self.filmliste))
                self.filmliste.sort()
-               self.filmliste.insert(0, ("Longest", "https://hypnotube.com/longest/", default_cover))
-               self.filmliste.insert(0, ("Most Discussed", "https://hypnotube.com/most-discussed/", default_cover))
-               self.filmliste.insert(0, ("Top Rated", "https://hypnotube.com/top-rated/", default_cover))
-               self.filmliste.insert(0, ("Most Viewed", "https://hypnotube.com/most-viewed/", default_cover))
-               self.filmliste.insert(0, ("Newest", "https://hypnotube.com/videos/", default_cover))
+               self.filmliste.insert(0, ("HD", "https://www.youjizz.com/highdefinition/", default_cover))
+               self.filmliste.insert(0, ("Top Rated (All Time)", "https://www.youjizz.com/top-rated/", default_cover))
+               self.filmliste.insert(0, ("Top Rated (Monthly)", "https://www.youjizz.com/top-rated-month/", default_cover))
+               self.filmliste.insert(0, ("Top Rated (Weekly)", "https://www.youjizz.com/top-rated-week/", default_cover))
+               self.filmliste.insert(0, ("Most Popular", "https://www.youjizz.com/most-popular/", default_cover))
+               self.filmliste.insert(0, ("Most Recent", "https://www.youjizz.com/newest-clips/", default_cover))
                self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
                self.ml.setList(map(self._defaultlistcenter, self.filmliste))
                self.ml.moveToIndex(0)
@@ -93,8 +103,9 @@ class hypnotubeGenreScreen(MPScreen):
                self.showInfos()
 
        def showInfos(self):
+               self['name'].setText('')
                cover = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(cover, agent=agent, cookieJar=cookies, headers={'Referer':'https://hypnotube.com/'})
+               CoverHelper(self['coverArt']).getCover(cover)
 
        def keyOK(self):
                if self.keyLocked:
@@ -102,18 +113,38 @@ class hypnotubeGenreScreen(MPScreen):
                Name = self['liste'].getCurrent()[0][0]
                Link = self['liste'].getCurrent()[0][1]
                if Name == "--- Search ---":
-                       self.suchen()
+                       self.suchen(suggest_func=self.getSuggestions)
                else:
-                       self.session.open(hypnotubeFilmScreen, Link, Name)
+                       self.session.open(youjizzFilmScreen, Link, Name)
 
        def SuchenCallback(self, callback = None):
                if callback is not None and len(callback):
                        Name = "--- Search ---"
                        self.suchString = callback
                        Link = urllib.quote(self.suchString).replace(' ', '-')
-                       self.session.open(hypnotubeFilmScreen, Link, Name)
-
-class hypnotubeFilmScreen(MPScreen, ThumbsHelper):
+                       self.session.open(youjizzFilmScreen, Link, Name)
+
+       def getSuggestions(self, text, max_res):
+               url = "https://www.youjizz.com/searchWords?q=%s" % urllib.quote_plus(text)
+               d = twAgentGetPage(url, agent=agent, headers=json_headers, timeout=5)
+               d.addCallback(self.gotSuggestions, max_res)
+               d.addErrback(self.gotSuggestions, max_res, err=True)
+               return d
+
+       def gotSuggestions(self, suggestions, max_res, err=False):
+               list = []
+               if not err and type(suggestions) in (str, buffer):
+                       suggestions = json.loads(suggestions)
+                       for item in suggestions:
+                               li = item
+                               list.append(str(li))
+                               max_res -= 1
+                               if not max_res: break
+               elif err:
+                       printl(str(suggestions),self,'E')
+               return list
+
+class youjizzFilmScreen(MPScreen, ThumbsHelper):
 
        def __init__(self, session, Link, Name):
                self.Link = Link
@@ -135,7 +166,7 @@ class hypnotubeFilmScreen(MPScreen, ThumbsHelper):
                        "green" : self.keyPageNumber
                }, -1)
 
-               self['title'] = Label("hypnotube.com")
+               self['title'] = Label("YouJizz.com")
                self['ContentTitle'] = Label("Genre: %s" % self.Name)
                self['F2'] = Label(_("Page"))
 
@@ -143,6 +174,7 @@ class hypnotubeFilmScreen(MPScreen, ThumbsHelper):
                self.keyLocked = True
                self.page = 1
                self.lastpage = 1
+               self.keywords = False
 
                self.filmliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
@@ -155,22 +187,25 @@ class hypnotubeFilmScreen(MPScreen, ThumbsHelper):
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                if re.match(".*Search", self.Name):
-                       url = "https://hypnotube.com/search/videos/%s/page%s.html" % (self.Link, str(self.page))
+                       url = "https://www.youjizz.com/search/%s-%s.html" % (self.Link, str(self.page))
                else:
-                       url = "%spage%s.html" % (self.Link, str(self.page))
+                       url = self.Link + str(self.page) + ".html"
                twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               self.getLastPage(data, 'class="pagination-col(.*?)</div>')
-               parse = re.search('class="content-col(.*?)$', data, re.S)
-               if parse:
-                       Movies = re.findall('class="item-col.*?href="(.*?)"\stitle="(.*?)".*?<img.*?src="(.*?)".*?class="time">(.*?)</span>.*?i-thumbs-up".*?sub-desc">(.*?)</span>.*?i-eye".*?sub-desc">(.*?)</span>', parse.group(1), re.S)
-                       if Movies:
-                               for (Url, Title, Image, Runtime, Rating, Views) in Movies:
-                                       if not "Photos" in Runtime:
-                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Rating, Views))
+               self.data = data
+               self.getLastPage(data, 'class="pagination(.*?)</div>')
+               Movies = re.findall('class="video-thumb".*?href="(.*?)".*?<img.*?src="(.*?)".*?class="video-title">.*?>(.*?)</a.*?class="time">(.*?)</span>.*?format-views">(\d+)</span>', data, re.S)
+               if Movies:
+                       for (Url, Image, Title, Runtime, Views) in Movies:
+                               Url = "https://www.youjizz.com" + Url
+                               if Image.startswith('//'):
+                                       Image = "https:" + Image
+                               if not Title:
+                                       Title = urllib.unquote_plus(re.sub('\d+.html', '', Url.split('/videos/')[1].replace('-',' ').strip()))
+                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views))
                if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
+                       self.filmliste.append((_('No movies found!'), "", None, None, None))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
                self.ml.moveToIndex(0)
                self.keyLocked = False
@@ -179,24 +214,25 @@ class hypnotubeFilmScreen(MPScreen, ThumbsHelper):
 
        def showInfos(self):
                title = self['liste'].getCurrent()[0][0]
-               url = self['liste'].getCurrent()[0][1]
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
-               rating = self['liste'].getCurrent()[0][4]
-               views = self['liste'].getCurrent()[0][5]
+               views = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               self['handlung'].setText("Runtime: %s\nRating: %s\nViews: %s" % (runtime, rating, views))
-               CoverHelper(self['coverArt']).getCover(pic, agent=agent, cookieJar=cookies, headers={'Referer':url})
+               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
+               CoverHelper(self['coverArt']).getCover(pic)
 
        def keyOK(self):
                if self.keyLocked:
                        return
+               Name = self['liste'].getCurrent()[0][0]
                Link = self['liste'].getCurrent()[0][1]
                if Link:
-                       twAgentGetPage(Link, cookieJar=cookies, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.parseData).addErrback(self.dataError)
 
-       def parseVideo(self, data):
-               streams = re.findall('<source src="(.*?)"', data, re.S)
-               if streams:
+       def parseData(self, data):
+               match = re.findall('"quality":(?:"\d+"|false),(?:"name":"play",|)"filename":"(.{0,4}cdn.*?)"', data, re.S)
+               if match:
+                       url = "http:" + match[-1].replace('\/','/')
                        Title = self['liste'].getCurrent()[0][0]
-                       self.session.open(SimplePlayer, [(Title, streams[-1])], showPlaylist=False, ltype='hypnotube')
\ No newline at end of file
+                       mp_globals.player_agent = agent
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='youjizz')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/live.png b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/live.png
new file mode 100644 (file)
index 0000000..5eb52b3
Binary files /dev/null and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/live.png differ
index a3524c1..d6b1656 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.mo and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.mo differ
index 0b86b26..26245cb 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: MediaPortal\n"
-"POT-Creation-Date: 2019-10-21 21:47+0200\n"
-"PO-Revision-Date: 2019-10-21 21:48+0200\n"
+"POT-Creation-Date: 2019-11-02 18:22+0100\n"
+"PO-Revision-Date: 2019-11-02 18:22+0100\n"
 "Last-Translator: dhwz <dhwz@gmx.net>\n"
 "Language-Team: MediaPortal Team\n"
 "Language: de_DE\n"
@@ -45,7 +45,7 @@ msgstr ""
 #: mpgz/src/additions/porn/yourpornsexy.py:274
 #: mpgz/src/additions/useradditions/flimmerstube.py:80
 #: mpgz/src/additions/useradditions/movie4k.py:351
-#: mpgz/src/additions/useradditions/movie4k.py:844
+#: mpgz/src/additions/useradditions/movie4k.py:840
 #: src/additions/fun/failto.py:65 src/additions/fun/retrotv.py:68
 #: src/additions/fun/twitch.py:134 src/additions/mediatheken/srg.py:181
 #: src/additions/music/radio.py:298 src/additions/porn/ahme.py:186
@@ -68,25 +68,25 @@ msgstr ""
 #: src/additions/porn/homemoviestube.py:166 src/additions/porn/hotmovs.py:166
 #: src/additions/porn/hotscope.py:148 src/additions/porn/hypnotube.py:140
 #: src/additions/porn/julesjordan.py:145 src/additions/porn/julesjordan.py:216
-#: src/additions/porn/kink.py:147 src/additions/porn/mofos.py:136
-#: src/additions/porn/mofos.py:212 src/additions/porn/moviefap.py:134
-#: src/additions/porn/naughtyamerica.py:152
+#: src/additions/porn/kink.py:147 src/additions/porn/lovehomeporn.py:143
+#: src/additions/porn/mofos.py:136 src/additions/porn/mofos.py:212
+#: src/additions/porn/moviefap.py:134 src/additions/porn/naughtyamerica.py:152
 #: src/additions/porn/nubilefilms.py:132 src/additions/porn/nubilefilms.py:206
 #: src/additions/porn/nudez.py:165 src/additions/porn/pinflix.py:232
-#: src/additions/porn/pinflix.py:367 src/additions/porn/porncom.py:192
-#: src/additions/porn/porncom.py:331 src/additions/porn/porncom.py:469
-#: src/additions/porn/porncom.py:607 src/additions/porn/porndoe.py:147
+#: src/additions/porn/pinflix.py:367 src/additions/porn/porncom.py:191
+#: src/additions/porn/porncom.py:330 src/additions/porn/porncom.py:468
+#: src/additions/porn/porncom.py:606 src/additions/porn/porndoe.py:147
 #: src/additions/porn/porngo.py:72 src/additions/porn/porngo.py:202
-#: src/additions/porn/pornhub.py:311 src/additions/porn/pornhub.py:467
-#: src/additions/porn/pornhub.py:625 src/additions/porn/pornhub.py:759
-#: src/additions/porn/pornhub.py:887 src/additions/porn/pornoxo.py:182
-#: src/additions/porn/pornrabbit.py:137 src/additions/porn/porntv.py:292
+#: src/additions/porn/pornhub.py:331 src/additions/porn/pornhub.py:487
+#: src/additions/porn/pornhub.py:645 src/additions/porn/pornhub.py:779
+#: src/additions/porn/pornhub.py:907 src/additions/porn/pornoxo.py:182
+#: src/additions/porn/pornrabbit.py:176 src/additions/porn/porntv.py:292
 #: src/additions/porn/realgfporn.py:160 src/additions/porn/realitykings.py:156
 #: src/additions/porn/redtube.py:181 src/additions/porn/sexu.py:130
 #: src/additions/porn/shemalez.py:165 src/additions/porn/shesfreaky.py:139
 #: src/additions/porn/spankbang.py:167 src/additions/porn/spankwire.py:204
 #: src/additions/porn/sunporno.py:192 src/additions/porn/teamskeet.py:145
-#: src/additions/porn/tnaflix.py:153 src/additions/porn/tube8.py:200
+#: src/additions/porn/tnaflix.py:153 src/additions/porn/tube8.py:208
 #: src/additions/porn/tubepornclassic.py:159 src/additions/porn/tubewolf.py:162
 #: src/additions/porn/txxx.py:166 src/additions/porn/updatetube.py:183
 #: src/additions/porn/upornia.py:166 src/additions/porn/vintagetube.py:243
@@ -95,11 +95,12 @@ msgstr ""
 #: src/additions/porn/wicked.py:129 src/additions/porn/wicked.py:211
 #: src/additions/porn/x4tube.py:245 src/additions/porn/x4tube.py:373
 #: src/additions/porn/xhamster.py:495 src/additions/porn/xhamster.py:620
-#: src/additions/porn/xnxx.py:199 src/additions/porn/xpaja.py:148
-#: src/additions/porn/xvideos.py:275 src/additions/porn/xvideos.py:471
-#: src/additions/porn/xxxdan.py:166 src/additions/porn/youporn.py:316
-#: src/additions/porn/youporn.py:383 src/plugin.py:2142 src/plugin.py:2394
-#: src/plugin.py:3192 src/plugin.py:3211 src/resources/showAsThumb.py:247
+#: src/additions/porn/xnxx.py:301 src/additions/porn/xpaja.py:148
+#: src/additions/porn/xvideos.py:291 src/additions/porn/xvideos.py:487
+#: src/additions/porn/xxxdan.py:166 src/additions/porn/youjizz.py:171
+#: src/additions/porn/youporn.py:316 src/additions/porn/youporn.py:383
+#: src/plugin.py:2142 src/plugin.py:2394 src/plugin.py:3192 src/plugin.py:3211
+#: src/resources/showAsThumb.py:247
 msgid "Page"
 msgstr "Seite"
 
@@ -136,7 +137,7 @@ msgstr "Seite"
 #: mpgz/src/additions/useradditions/flimmerstube.py:82
 #: mpgz/src/additions/useradditions/kinoxto.py:425
 #: mpgz/src/additions/useradditions/movie4k.py:395
-#: mpgz/src/additions/useradditions/movie4k.py:843
+#: mpgz/src/additions/useradditions/movie4k.py:839
 #: src/additions/fun/failto.py:67 src/additions/fun/forplayers.py:80
 #: src/additions/fun/forplayers.py:259
 #: src/additions/fun/funnyvideoclips_de.py:80
@@ -177,25 +178,25 @@ msgstr "Seite"
 #: src/additions/porn/homemoviestube.py:170 src/additions/porn/hotmovs.py:168
 #: src/additions/porn/hotscope.py:150 src/additions/porn/hypnotube.py:142
 #: src/additions/porn/julesjordan.py:147 src/additions/porn/julesjordan.py:218
-#: src/additions/porn/kink.py:149 src/additions/porn/mofos.py:138
-#: src/additions/porn/mofos.py:214 src/additions/porn/moviefap.py:136
-#: src/additions/porn/naughtyamerica.py:154
+#: src/additions/porn/kink.py:149 src/additions/porn/lovehomeporn.py:145
+#: src/additions/porn/mofos.py:138 src/additions/porn/mofos.py:214
+#: src/additions/porn/moviefap.py:136 src/additions/porn/naughtyamerica.py:154
 #: src/additions/porn/nubilefilms.py:134 src/additions/porn/nubilefilms.py:208
 #: src/additions/porn/nudez.py:167 src/additions/porn/pinflix.py:235
-#: src/additions/porn/pinflix.py:370 src/additions/porn/porncom.py:194
-#: src/additions/porn/porncom.py:334 src/additions/porn/porncom.py:472
-#: src/additions/porn/porncom.py:613 src/additions/porn/porndoe.py:151
+#: src/additions/porn/pinflix.py:370 src/additions/porn/porncom.py:193
+#: src/additions/porn/porncom.py:333 src/additions/porn/porncom.py:471
+#: src/additions/porn/porncom.py:612 src/additions/porn/porndoe.py:151
 #: src/additions/porn/porngo.py:73 src/additions/porn/porngo.py:204
-#: src/additions/porn/pornhub.py:314 src/additions/porn/pornhub.py:470
-#: src/additions/porn/pornhub.py:628 src/additions/porn/pornhub.py:762
-#: src/additions/porn/pornhub.py:889 src/additions/porn/pornoxo.py:184
-#: src/additions/porn/pornrabbit.py:139 src/additions/porn/porntv.py:294
+#: src/additions/porn/pornhub.py:334 src/additions/porn/pornhub.py:490
+#: src/additions/porn/pornhub.py:648 src/additions/porn/pornhub.py:782
+#: src/additions/porn/pornhub.py:909 src/additions/porn/pornoxo.py:184
+#: src/additions/porn/pornrabbit.py:178 src/additions/porn/porntv.py:294
 #: src/additions/porn/realgfporn.py:162 src/additions/porn/realitykings.py:158
 #: src/additions/porn/redtube.py:185 src/additions/porn/sexu.py:132
 #: src/additions/porn/shemalez.py:167 src/additions/porn/shesfreaky.py:141
 #: src/additions/porn/spankbang.py:173 src/additions/porn/spankwire.py:233
 #: src/additions/porn/sunporno.py:194 src/additions/porn/teamskeet.py:147
-#: src/additions/porn/tnaflix.py:155 src/additions/porn/tube8.py:204
+#: src/additions/porn/tnaflix.py:155 src/additions/porn/tube8.py:212
 #: src/additions/porn/tubepornclassic.py:161 src/additions/porn/tubewolf.py:164
 #: src/additions/porn/txxx.py:168 src/additions/porn/updatetube.py:185
 #: src/additions/porn/upornia.py:168 src/additions/porn/vintagetube.py:191
@@ -204,10 +205,10 @@ msgstr "Seite"
 #: src/additions/porn/wetplace.py:139 src/additions/porn/wicked.py:131
 #: src/additions/porn/wicked.py:213 src/additions/porn/x4tube.py:248
 #: src/additions/porn/x4tube.py:377 src/additions/porn/xhamster.py:497
-#: src/additions/porn/xnxx.py:204 src/additions/porn/xpaja.py:150
-#: src/additions/porn/xvideos.py:278 src/additions/porn/xvideos.py:480
-#: src/additions/porn/xxxdan.py:170 src/additions/porn/youporn.py:318
-#: src/additions/porn/youporn.py:385
+#: src/additions/porn/xnxx.py:306 src/additions/porn/xpaja.py:150
+#: src/additions/porn/xvideos.py:294 src/additions/porn/xvideos.py:496
+#: src/additions/porn/xxxdan.py:170 src/additions/porn/youjizz.py:173
+#: src/additions/porn/youporn.py:318 src/additions/porn/youporn.py:385
 msgid "Page:"
 msgstr "Seite:"
 
@@ -262,7 +263,7 @@ msgstr "Seite:"
 #: mpgz/src/additions/useradditions/movie4k.py:475
 #: mpgz/src/additions/useradditions/movie4k.py:545
 #: mpgz/src/additions/useradditions/movie4k.py:612
-#: mpgz/src/additions/useradditions/movie4k.py:857
+#: mpgz/src/additions/useradditions/movie4k.py:853
 #: mpgz/src/additions/useradditions/serienstream.py:94
 #: mpgz/src/additions/useradditions/watchseries.py:278
 #: src/additions/fun/chefkoch.py:60 src/additions/fun/chefkoch.py:113
@@ -327,17 +328,18 @@ msgstr "Seite:"
 #: src/additions/porn/hotscope.py:163 src/additions/porn/hotscope.py:216
 #: src/additions/porn/hypnotube.py:155 src/additions/porn/julesjordan.py:72
 #: src/additions/porn/julesjordan.py:160 src/additions/porn/julesjordan.py:231
-#: src/additions/porn/kink.py:162 src/additions/porn/mofos.py:72
-#: src/additions/porn/mofos.py:151 src/additions/porn/mofos.py:227
-#: src/additions/porn/moviefap.py:149 src/additions/porn/naughtyamerica.py:167
+#: src/additions/porn/kink.py:162 src/additions/porn/lovehomeporn.py:157
+#: src/additions/porn/mofos.py:72 src/additions/porn/mofos.py:151
+#: src/additions/porn/mofos.py:227 src/additions/porn/moviefap.py:149
+#: src/additions/porn/naughtyamerica.py:167
 #: src/additions/porn/nubilefilms.py:71 src/additions/porn/nubilefilms.py:147
 #: src/additions/porn/nubilefilms.py:221 src/additions/porn/nudez.py:180
 #: src/additions/porn/pinflix.py:253 src/additions/porn/pinflix.py:392
-#: src/additions/porn/porncom.py:211 src/additions/porn/porncom.py:351
-#: src/additions/porn/porncom.py:489 src/additions/porn/porncom.py:634
+#: src/additions/porn/porncom.py:210 src/additions/porn/porncom.py:350
+#: src/additions/porn/porncom.py:488 src/additions/porn/porncom.py:633
 #: src/additions/porn/porndoe.py:169 src/additions/porn/porngo.py:217
-#: src/additions/porn/pornhub.py:924 src/additions/porn/pornhub.py:1127
-#: src/additions/porn/pornoxo.py:197 src/additions/porn/pornrabbit.py:152
+#: src/additions/porn/pornhub.py:944 src/additions/porn/pornhub.py:1147
+#: src/additions/porn/pornoxo.py:197 src/additions/porn/pornrabbit.py:191
 #: src/additions/porn/porntv.py:163 src/additions/porn/porntv.py:307
 #: src/additions/porn/realgfporn.py:175 src/additions/porn/realitykings.py:73
 #: src/additions/porn/realitykings.py:171 src/additions/porn/redtube.py:206
@@ -347,7 +349,7 @@ msgstr "Seite:"
 #: src/additions/porn/spankwire.py:87 src/additions/porn/spankwire.py:218
 #: src/additions/porn/sunporno.py:86 src/additions/porn/sunporno.py:207
 #: src/additions/porn/teamskeet.py:73 src/additions/porn/teamskeet.py:160
-#: src/additions/porn/tnaflix.py:168 src/additions/porn/tube8.py:228
+#: src/additions/porn/tnaflix.py:168 src/additions/porn/tube8.py:236
 #: src/additions/porn/tubepornclassic.py:174 src/additions/porn/tubewolf.py:87
 #: src/additions/porn/tubewolf.py:161 src/additions/porn/txxx.py:181
 #: src/additions/porn/updatetube.py:92 src/additions/porn/updatetube.py:198
@@ -358,15 +360,16 @@ msgstr "Seite:"
 #: src/additions/porn/vporn.py:307 src/additions/porn/wetplace.py:152
 #: src/additions/porn/wicked.py:144 src/additions/porn/wicked.py:226
 #: src/additions/porn/x4tube.py:264 src/additions/porn/x4tube.py:392
-#: src/additions/porn/xhamster.py:521 src/additions/porn/xnxx.py:227
-#: src/additions/porn/xpaja.py:164 src/additions/porn/xvideos.py:298
-#: src/additions/porn/xvideos.py:504 src/additions/porn/xxxdan.py:189
-#: src/additions/porn/youporn.py:400 src/additions/sport/pokerstars.py:59
-#: src/additions/sport/pokerstars.py:118 src/additions/sport/pokerstars.py:168
-#: src/additions/sport/pokerstars.py:200 src/additions/sport/sporttotal.py:59
-#: src/additions/sport/sporttotal.py:130 src/resources/menuhelper.py:62
-#: src/resources/mpscreen.py:324 src/resources/simplelist.py:362
-#: src/resources/simplelist.py:540
+#: src/additions/porn/xhamster.py:521 src/additions/porn/xnxx.py:101
+#: src/additions/porn/xnxx.py:329 src/additions/porn/xpaja.py:164
+#: src/additions/porn/xvideos.py:101 src/additions/porn/xvideos.py:314
+#: src/additions/porn/xvideos.py:520 src/additions/porn/xxxdan.py:189
+#: src/additions/porn/youjizz.py:187 src/additions/porn/youporn.py:400
+#: src/additions/sport/pokerstars.py:59 src/additions/sport/pokerstars.py:118
+#: src/additions/sport/pokerstars.py:168 src/additions/sport/pokerstars.py:200
+#: src/additions/sport/sporttotal.py:59 src/additions/sport/sporttotal.py:130
+#: src/resources/menuhelper.py:62 src/resources/mpscreen.py:324
+#: src/resources/simplelist.py:362 src/resources/simplelist.py:540
 msgid "Please wait..."
 msgstr "Bitte warten..."
 
@@ -383,7 +386,7 @@ msgstr "Bitte warten..."
 #: src/additions/fun/gaskrank_tv.py:134 src/additions/fun/gaskrank_tv.py:158
 #: src/additions/fun/germanytv.py:181 src/additions/fun/lachschon_de.py:223
 #: src/additions/fun/liveleak.py:122 src/additions/fun/liveleak.py:154
-#: src/additions/fun/twitch.py:286 src/additions/fun/twitch.py:304
+#: src/additions/fun/twitch.py:308 src/additions/fun/twitch.py:326
 #: src/additions/mediatheken/arte.py:368 src/additions/mediatheken/atv.py:150
 #: src/additions/mediatheken/brf.py:145
 #: src/additions/mediatheken/dreisat.py:382
@@ -402,8 +405,9 @@ msgstr "Bitte warten..."
 #: src/additions/porn/hdzog.py:203 src/additions/porn/homemoviestube.py:211
 #: src/additions/porn/hotmovs.py:209 src/additions/porn/hotscope.py:182
 #: src/additions/porn/hypnotube.py:173 src/additions/porn/julesjordan.py:251
-#: src/additions/porn/kink.py:180 src/additions/porn/mofos.py:244
-#: src/additions/porn/moviefap.py:164 src/additions/porn/naughtyamerica.py:186
+#: src/additions/porn/kink.py:180 src/additions/porn/lovehomeporn.py:175
+#: src/additions/porn/mofos.py:244 src/additions/porn/moviefap.py:164
+#: src/additions/porn/naughtyamerica.py:186
 #: src/additions/porn/nubilefilms.py:242 src/additions/porn/porndoe.py:193
 #: src/additions/porn/porngo.py:233 src/additions/porn/realitykings.py:190
 #: src/additions/porn/redtube.py:252 src/additions/porn/shemalez.py:202
@@ -451,16 +455,17 @@ msgstr ""
 #: mpgz/src/additions/useradditions/movie4k.py:415
 #: mpgz/src/additions/useradditions/movie4k.py:487
 #: mpgz/src/additions/useradditions/movie4k.py:559
-#: mpgz/src/additions/useradditions/movie4k.py:757
-#: mpgz/src/additions/useradditions/movie4k.py:893
+#: mpgz/src/additions/useradditions/movie4k.py:753
+#: mpgz/src/additions/useradditions/movie4k.py:889
 #: src/additions/porn/dachix.py:193 src/additions/porn/fetishshrine.py:180
 #: src/additions/porn/freeones.py:192 src/additions/porn/nudez.py:195
-#: src/additions/porn/porncom.py:700 src/additions/porn/pornhub.py:1006
-#: src/additions/porn/pornhub.py:1031 src/additions/porn/pornoxo.py:215
-#: src/additions/porn/porntv.py:349 src/additions/porn/sexu.py:165
-#: src/additions/porn/shesfreaky.py:175 src/additions/porn/spankbang.py:225
-#: src/additions/porn/tube8.py:271 src/additions/porn/xnxx.py:277
-#: src/additions/porn/xpaja.py:182 src/additions/porn/xvideos.py:621
+#: src/additions/porn/porncom.py:699 src/additions/porn/pornhub.py:1026
+#: src/additions/porn/pornhub.py:1051 src/additions/porn/pornoxo.py:215
+#: src/additions/porn/pornrabbit.py:208 src/additions/porn/porntv.py:349
+#: src/additions/porn/sexu.py:165 src/additions/porn/shesfreaky.py:175
+#: src/additions/porn/spankbang.py:225 src/additions/porn/tube8.py:291
+#: src/additions/porn/xnxx.py:384 src/additions/porn/xpaja.py:182
+#: src/additions/porn/xvideos.py:637 src/additions/porn/youjizz.py:208
 msgid "No movies found!"
 msgstr "Keine Filme gefunden!"
 
@@ -484,15 +489,14 @@ msgstr "Keine Filme gefunden!"
 #: mpgz/src/additions/useradditions/kinoxto.py:944
 #: mpgz/src/additions/useradditions/serienstream.py:822
 #: mpgz/src/additions/useradditions/watchseries.py:296
-#: src/additions/porn/pornrabbit.py:210
 msgid "No supported streams found!"
 msgstr "Keine unterstützten Streams gefunden!"
 
 #: mpgz/src/additions/porn/amateuremdh.py:91
 #: mpgz/src/additions/porn/mydirtyhobby.py:92
-#: mpgz/src/additions/porn/streammdh.py:129 src/additions/porn/pornhub.py:1060
+#: mpgz/src/additions/porn/streammdh.py:129 src/additions/porn/pornhub.py:1080
 #: src/additions/porn/xhamster.py:496 src/additions/porn/xhamster.py:621
-#: src/additions/porn/xnxx.py:202 src/additions/porn/xvideos.py:478
+#: src/additions/porn/xnxx.py:304 src/additions/porn/xvideos.py:494
 msgid "Show Related"
 msgstr "Ähnliche anzeigen"
 
@@ -501,10 +505,10 @@ msgstr "Ähnliche anzeigen"
 #: mpgz/src/additions/porn/mydirtyhobby.py:125
 #: src/additions/porn/badoinkvr.py:159 src/additions/porn/ddfnetwork.py:195
 #: src/additions/porn/julesjordan.py:172 src/additions/porn/mofos.py:168
-#: src/additions/porn/nubilefilms.py:162 src/additions/porn/porncom.py:244
-#: src/additions/porn/pornhub.py:657 src/additions/porn/wicked.py:159
+#: src/additions/porn/nubilefilms.py:162 src/additions/porn/porncom.py:243
+#: src/additions/porn/pornhub.py:677 src/additions/porn/wicked.py:159
 #: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:391
-#: src/additions/porn/xvideos.py:340
+#: src/additions/porn/xvideos.py:356
 msgid "No pornstars found!"
 msgstr "Keine Pornstars gefunden!"
 
@@ -533,7 +537,7 @@ msgstr ""
 #: mpgz/src/additions/porn/pornfromczech.py:266
 #: mpgz/src/additions/porn/pornfromczech.py:277
 #: mpgz/src/additions/porn/streammdh.py:67 src/additions/porn/hotscope.py:240
-#: src/additions/porn/pornhub.py:1226 src/resources/hosters/streamango.py:22
+#: src/additions/porn/pornhub.py:1246
 msgid "This plugin requires package nodejs."
 msgstr "Dieses Plugin benötigt das Paket nodejs."
 
@@ -541,40 +545,40 @@ msgstr "Dieses Plugin benötigt das Paket nodejs."
 #: mpgz/src/additions/porn/pornfromczech.py:268
 #: mpgz/src/additions/porn/pornfromczech.py:279
 #: mpgz/src/additions/porn/streammdh.py:69 src/additions/porn/hotscope.py:242
-#: src/additions/porn/pornhub.py:1228 src/resources/hosters/streamango.py:24
+#: src/additions/porn/pornhub.py:1248
 msgid "Error executing Javascript, please report to the developers."
 msgstr "Fehler beim Ausführen von Javascript, bitte an die Entwickler melden."
 
 #: mpgz/src/additions/porn/paradisehill.py:103
 #: src/additions/mediatheken/ard.py:460 src/additions/music/shoutcast.py:203
 #: src/additions/porn/homemoviestube.py:168 src/additions/porn/pinflix.py:233
-#: src/additions/porn/pinflix.py:368 src/additions/porn/porncom.py:193
-#: src/additions/porn/porncom.py:332 src/additions/porn/porncom.py:470
-#: src/additions/porn/porncom.py:609 src/additions/porn/porndoe.py:149
-#: src/additions/porn/pornhub.py:312 src/additions/porn/pornhub.py:468
-#: src/additions/porn/pornhub.py:626 src/additions/porn/pornhub.py:760
+#: src/additions/porn/pinflix.py:368 src/additions/porn/porncom.py:192
+#: src/additions/porn/porncom.py:331 src/additions/porn/porncom.py:469
+#: src/additions/porn/porncom.py:608 src/additions/porn/porndoe.py:149
+#: src/additions/porn/pornhub.py:332 src/additions/porn/pornhub.py:488
+#: src/additions/porn/pornhub.py:646 src/additions/porn/pornhub.py:780
 #: src/additions/porn/redtube.py:183 src/additions/porn/spankbang.py:169
-#: src/additions/porn/tube8.py:201 src/additions/porn/vporn.py:290
+#: src/additions/porn/tube8.py:209 src/additions/porn/vporn.py:290
 #: src/additions/porn/x4tube.py:246 src/additions/porn/x4tube.py:374
-#: src/additions/porn/xvideos.py:473 src/plugin.py:1771 src/plugin.py:2796
+#: src/additions/porn/xvideos.py:489 src/plugin.py:1771 src/plugin.py:2796
 msgid "Sort"
 msgstr "Sortieren"
 
 #: mpgz/src/additions/porn/paradisehill.py:105
 #: src/additions/porn/cumlouder.py:436 src/additions/porn/cumlouder.py:508
-#: src/additions/porn/porncom.py:265 src/additions/porn/porncom.py:294
-#: src/additions/porn/porncom.py:333 src/additions/porn/porncom.py:403
-#: src/additions/porn/porncom.py:432 src/additions/porn/porncom.py:471
-#: src/additions/porn/porncom.py:541 src/additions/porn/porncom.py:570
-#: src/additions/porn/porncom.py:611 src/additions/porn/porncom.py:724
-#: src/additions/porn/porncom.py:756 src/additions/porn/spankbang.py:171
-#: src/additions/porn/spankbang.py:270 src/additions/porn/tube8.py:202
-#: src/additions/porn/tube8.py:312 src/additions/porn/x4tube.py:375
-#: src/additions/porn/x4tube.py:445 src/additions/porn/xnxx.py:201
-#: src/additions/porn/xnxx.py:321 src/additions/porn/xvideos.py:277
-#: src/additions/porn/xvideos.py:422 src/additions/porn/xvideos.py:427
-#: src/additions/porn/xvideos.py:474 src/additions/porn/xvideos.py:476
-#: src/additions/porn/xvideos.py:685 src/additions/porn/xxxdan.py:168
+#: src/additions/porn/porncom.py:264 src/additions/porn/porncom.py:293
+#: src/additions/porn/porncom.py:332 src/additions/porn/porncom.py:402
+#: src/additions/porn/porncom.py:431 src/additions/porn/porncom.py:470
+#: src/additions/porn/porncom.py:540 src/additions/porn/porncom.py:569
+#: src/additions/porn/porncom.py:610 src/additions/porn/porncom.py:722
+#: src/additions/porn/porncom.py:757 src/additions/porn/spankbang.py:171
+#: src/additions/porn/spankbang.py:270 src/additions/porn/tube8.py:210
+#: src/additions/porn/tube8.py:332 src/additions/porn/x4tube.py:375
+#: src/additions/porn/x4tube.py:445 src/additions/porn/xnxx.py:303
+#: src/additions/porn/xnxx.py:431 src/additions/porn/xvideos.py:293
+#: src/additions/porn/xvideos.py:438 src/additions/porn/xvideos.py:443
+#: src/additions/porn/xvideos.py:490 src/additions/porn/xvideos.py:492
+#: src/additions/porn/xvideos.py:701 src/additions/porn/xxxdan.py:168
 #: src/additions/porn/xxxdan.py:227
 msgid "Filter"
 msgstr "Filter"
@@ -584,23 +588,23 @@ msgstr "Filter"
 #: src/additions/mediatheken/ard.py:631 src/additions/music/shoutcast.py:269
 #: src/additions/porn/cumlouder.py:531 src/additions/porn/homemoviestube.py:243
 #: src/additions/porn/naughtyamerica.py:121 src/additions/porn/pinflix.py:306
-#: src/additions/porn/pinflix.py:476 src/additions/porn/porncom.py:257
-#: src/additions/porn/porncom.py:277 src/additions/porn/porncom.py:395
-#: src/additions/porn/porncom.py:415 src/additions/porn/porncom.py:533
-#: src/additions/porn/porncom.py:553 src/additions/porn/porncom.py:716
-#: src/additions/porn/porncom.py:738 src/additions/porn/porndoe.py:215
-#: src/additions/porn/pornhub.py:400 src/additions/porn/pornhub.py:568
-#: src/additions/porn/pornhub.py:695 src/additions/porn/pornhub.py:826
+#: src/additions/porn/pinflix.py:476 src/additions/porn/porncom.py:256
+#: src/additions/porn/porncom.py:276 src/additions/porn/porncom.py:394
+#: src/additions/porn/porncom.py:414 src/additions/porn/porncom.py:532
+#: src/additions/porn/porncom.py:552 src/additions/porn/porncom.py:714
+#: src/additions/porn/porncom.py:739 src/additions/porn/porndoe.py:215
+#: src/additions/porn/pornhub.py:420 src/additions/porn/pornhub.py:588
+#: src/additions/porn/pornhub.py:715 src/additions/porn/pornhub.py:846
 #: src/additions/porn/redtube.py:277 src/additions/porn/spankbang.py:237
 #: src/additions/porn/spankbang.py:240 src/additions/porn/spankbang.py:254
-#: src/additions/porn/tube8.py:284 src/additions/porn/tube8.py:297
+#: src/additions/porn/tube8.py:304 src/additions/porn/tube8.py:317
 #: src/additions/porn/vporn.py:360 src/additions/porn/wicked.py:178
 #: src/additions/porn/x4tube.py:312 src/additions/porn/x4tube.py:452
 #: src/additions/porn/x4tube.py:463 src/additions/porn/xhamster.py:684
-#: src/additions/porn/xnxx.py:305 src/additions/porn/xvideos.py:354
-#: src/additions/porn/xvideos.py:366 src/additions/porn/xvideos.py:633
-#: src/additions/porn/xvideos.py:648 src/additions/porn/xvideos.py:670
-#: src/additions/porn/xvideos.py:702 src/additions/porn/xxxdan.py:237
+#: src/additions/porn/xnxx.py:415 src/additions/porn/xvideos.py:370
+#: src/additions/porn/xvideos.py:382 src/additions/porn/xvideos.py:649
+#: src/additions/porn/xvideos.py:664 src/additions/porn/xvideos.py:686
+#: src/additions/porn/xvideos.py:718 src/additions/porn/xxxdan.py:237
 msgid "Select Action"
 msgstr "Wähle Aktion"
 
@@ -625,8 +629,8 @@ msgstr "Nichts gefunden!"
 #: src/additions/music/radio.py:92 src/additions/music/radio.py:151
 #: src/additions/music/radio.py:153 src/additions/music/shoutcast.py:73
 #: src/additions/music/shoutcast.py:155 src/additions/music/shoutcast.py:157
-#: src/additions/porn/pornhub.py:138 src/additions/porn/pornhub.py:260
-#: src/additions/porn/pornhub.py:262 src/additions/porn/vporn.py:223
+#: src/additions/porn/pornhub.py:138 src/additions/porn/pornhub.py:280
+#: src/additions/porn/pornhub.py:282 src/additions/porn/vporn.py:223
 #: src/additions/porn/vporn.py:225 src/additions/porn/youporn.py:77
 #: src/additions/porn/youporn.py:221 src/additions/porn/youporn.py:223
 #: src/plugin.py:525 src/resources/simpleplayer.py:2307
@@ -635,7 +639,7 @@ msgstr "Einstellungen"
 
 #: mpgz/src/additions/porn/porntrex.py:159
 #: mpgz/src/additions/porn/porntrex.py:162
-#: mpgz/src/additions/porn/porntrex.py:165 src/additions/porn/pornhub.py:267
+#: mpgz/src/additions/porn/porntrex.py:165 src/additions/porn/pornhub.py:287
 #: src/additions/porn/vporn.py:230 src/additions/porn/youporn.py:228
 msgid "Username:"
 msgstr "Username:"
@@ -644,7 +648,7 @@ msgstr "Username:"
 #: mpgz/src/additions/porn/porntrex.py:163
 #: mpgz/src/additions/porn/porntrex.py:166
 #: mpgz/src/additions/useradditions/serienstream.py:164
-#: src/additions/porn/pornhub.py:268 src/additions/porn/vporn.py:231
+#: src/additions/porn/pornhub.py:288 src/additions/porn/vporn.py:231
 #: src/additions/porn/youporn.py:229
 msgid "Password:"
 msgstr "Passwort:"
@@ -691,7 +695,7 @@ msgstr "Genre Auswahl"
 
 #: mpgz/src/additions/useradditions/filmpalast.py:193
 #: mpgz/src/additions/useradditions/serienstream.py:238
-#: src/additions/mediatheken/myspass.py:87
+#: src/additions/mediatheken/myspass.py:88
 msgid "No shows found!"
 msgstr "Keine Serien gefunden!"
 
@@ -785,7 +789,7 @@ msgid "Watchlist is currently empty"
 msgstr "Watchlist ist derzeit leer"
 
 #: mpgz/src/additions/useradditions/kinoxto.py:909
-#: mpgz/src/additions/useradditions/movie4k.py:740
+#: mpgz/src/additions/useradditions/movie4k.py:736
 msgid "Parts Selection"
 msgstr "Part Auswahl"
 
@@ -799,11 +803,11 @@ msgstr "Bitte die korrekte PIN eingeben"
 msgid "Enter PIN"
 msgstr "PIN eingeben"
 
+#: mpgz/src/additions/useradditions/movie4k.py:714
 #: mpgz/src/additions/useradditions/movie4k.py:718
-#: mpgz/src/additions/useradditions/movie4k.py:722
+#: mpgz/src/additions/useradditions/movie4k.py:806
 #: mpgz/src/additions/useradditions/movie4k.py:810
-#: mpgz/src/additions/useradditions/movie4k.py:814
-#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:749
+#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:688
 msgid "Stream not found, try another Stream Hoster."
 msgstr "Stream nicht gefunden, versuche einen anderen Stream Hoster."
 
@@ -828,7 +832,7 @@ msgid "Season"
 msgstr "Staffel"
 
 #: mpgz/src/additions/useradditions/serienstream.py:580
-#: src/additions/mediatheken/myspass.py:151
+#: src/additions/mediatheken/myspass.py:152
 msgid "No seasons found!"
 msgstr "Keine Staffeln gefunden!"
 
@@ -912,8 +916,8 @@ msgid "Movie Selection"
 msgstr "Film Auswahl"
 
 #: src/additions/fun/twitch.py:100 src/additions/fun/twitch.py:106
-#: src/additions/fun/twitch.py:139 src/additions/fun/twitch.py:354
-#: src/additions/fun/twitch.py:372 src/additions/fun/twitch.py:374
+#: src/additions/fun/twitch.py:139 src/additions/fun/twitch.py:376
+#: src/additions/fun/twitch.py:394 src/additions/fun/twitch.py:396
 msgid "any"
 msgstr "alle"
 
@@ -930,45 +934,45 @@ msgstr "Zu Favoriten hinzufügen"
 msgid "Videos"
 msgstr "Videos"
 
-#: src/additions/fun/twitch.py:142 src/additions/fun/twitch.py:378
+#: src/additions/fun/twitch.py:142 src/additions/fun/twitch.py:400
 #: src/additions/mediatheken/youtube.py:134
 #: src/additions/mediatheken/youtube.py:429 src/additions/music/radio.py:207
 msgid "Language"
 msgstr "Sprache"
 
-#: src/additions/fun/twitch.py:213 src/additions/music/radio.py:456
+#: src/additions/fun/twitch.py:235 src/additions/music/radio.py:456
 #: src/additions/music/shoutcast.py:353 src/resources/simplelist.py:186
 #: src/resources/simplelist.py:339 src/resources/simplelist.py:611
 msgid "No entries found!"
 msgstr "Keine Einträge gefunden!"
 
-#: src/additions/fun/twitch.py:227 src/additions/fun/twitch.py:268
+#: src/additions/fun/twitch.py:249 src/additions/fun/twitch.py:290
 msgid "No games found!"
 msgstr "Keine Spiele gefunden!"
 
-#: src/additions/fun/twitch.py:242 src/additions/fun/twitch.py:257
+#: src/additions/fun/twitch.py:264 src/additions/fun/twitch.py:279
 msgid "No streams found!"
 msgstr "Keine Streams gefunden!"
 
-#: src/additions/fun/twitch.py:319 src/additions/mediatheken/youtube.py:389
+#: src/additions/fun/twitch.py:341 src/additions/mediatheken/youtube.py:389
 #: src/additions/mediatheken/youtube.py:405
 #: src/additions/mediatheken/youtube.py:970
 #: src/additions/mediatheken/youtube_user.py:76
-#: src/additions/porn/cumlouder.py:315 src/additions/porn/porncom.py:382
-#: src/additions/porn/pornhub.py:793 src/additions/porn/xvideos.py:337
+#: src/additions/porn/cumlouder.py:315 src/additions/porn/porncom.py:381
+#: src/additions/porn/pornhub.py:813 src/additions/porn/xvideos.py:353
 msgid "No channels found!"
 msgstr "Keine Kanäle gefunden!"
 
-#: src/additions/fun/twitch.py:355
+#: src/additions/fun/twitch.py:377
 msgid "Select language"
 msgstr "Wähle Sprache"
 
-#: src/additions/fun/twitch.py:395 src/additions/music/radio.py:407
+#: src/additions/fun/twitch.py:417 src/additions/music/radio.py:407
 #: src/additions/music/shoutcast.py:304
 msgid "Selection was added to the favorites."
 msgstr "Auswahl wurde zu den Favoriten hinzugefügt."
 
-#: src/additions/fun/twitch.py:434
+#: src/additions/fun/twitch.py:456
 msgid "There is currently no live stream available on this channel."
 msgstr "Derzeit ist kein Live-Stream auf diesem Kanal verfügbar."
 
@@ -1648,7 +1652,8 @@ msgid "Topic"
 msgstr "Thema"
 
 #: src/additions/music/radio.py:205 src/additions/music/radio.py:384
-#: src/additions/music/radio.py:494 src/additions/porn/xvideos.py:124
+#: src/additions/music/radio.py:494 src/additions/porn/xnxx.py:135
+#: src/additions/porn/xvideos.py:135
 msgid "Country"
 msgstr "Land"
 
@@ -1717,9 +1722,9 @@ msgid "%s only works with enabled MP premiumize.me option (MP Setup)!"
 msgstr ""
 "%s funktioniert nur mit aktivierter premiumize.me Einstellung (MP Setup)!"
 
-#: src/additions/porn/beeg.py:238 src/additions/porn/porncom.py:775
-#: src/additions/porn/tube8.py:328 src/additions/porn/xnxx.py:352
-#: src/additions/porn/xvideos.py:734
+#: src/additions/porn/beeg.py:238 src/additions/porn/porncom.py:776
+#: src/additions/porn/tube8.py:348 src/additions/porn/xnxx.py:462
+#: src/additions/porn/xvideos.py:750
 msgid "Stream not found"
 msgstr "Stream nicht gefunden"
 
@@ -1751,76 +1756,71 @@ msgid "Mode"
 msgstr "Modus"
 
 #: src/additions/porn/pinflix.py:317 src/additions/porn/pinflix.py:460
-#: src/additions/porn/porncom.py:294 src/additions/porn/porncom.py:432
-#: src/additions/porn/porncom.py:570 src/additions/porn/porncom.py:756
-#: src/additions/porn/porndoe.py:206 src/additions/porn/pornhub.py:374
-#: src/additions/porn/pornhub.py:386 src/additions/porn/pornhub.py:549
-#: src/additions/porn/pornhub.py:668 src/additions/porn/pornhub.py:683
-#: src/additions/porn/pornhub.py:813 src/additions/porn/redtube.py:265
-#: src/additions/porn/spankbang.py:274 src/additions/porn/tube8.py:312
+#: src/additions/porn/porncom.py:293 src/additions/porn/porncom.py:431
+#: src/additions/porn/porncom.py:569 src/additions/porn/porncom.py:757
+#: src/additions/porn/porndoe.py:206 src/additions/porn/pornhub.py:394
+#: src/additions/porn/pornhub.py:406 src/additions/porn/pornhub.py:569
+#: src/additions/porn/pornhub.py:688 src/additions/porn/pornhub.py:703
+#: src/additions/porn/pornhub.py:833 src/additions/porn/redtube.py:265
+#: src/additions/porn/spankbang.py:274 src/additions/porn/tube8.py:332
 #: src/additions/porn/x4tube.py:322 src/additions/porn/x4tube.py:445
-#: src/additions/porn/xvideos.py:689
+#: src/additions/porn/xvideos.py:705
 msgid "Sort order"
 msgstr "Sortierreihenfolge"
 
-#: src/additions/porn/porncom.py:520 src/additions/porn/pornhub.py:352
+#: src/additions/porn/porncom.py:519 src/additions/porn/pornhub.py:372
 msgid "No playlists found!"
 msgstr "Keine Playlist gefunden!"
 
-#: src/additions/porn/pornhub.py:269
+#: src/additions/porn/pornhub.py:289
 msgid "CDN fix (please don't use this option as default):"
 msgstr ""
 
-#: src/additions/porn/pornhub.py:368 src/additions/porn/pornhub.py:381
-#: src/additions/porn/pornhub.py:1112 src/additions/porn/xhamster.py:614
+#: src/additions/porn/pornhub.py:388 src/additions/porn/pornhub.py:401
+#: src/additions/porn/pornhub.py:1132 src/additions/porn/xhamster.py:614
 #: src/additions/porn/xhamster.py:654
 msgid "Remove Favourite"
 msgstr "Favorit entfernen"
 
-#: src/additions/porn/pornhub.py:384 src/additions/porn/pornhub.py:1115
+#: src/additions/porn/pornhub.py:404 src/additions/porn/pornhub.py:1135
 #: src/additions/porn/xhamster.py:658
 msgid "Add Favourite"
 msgstr "Favorit hinzufügen"
 
-#: src/additions/porn/pornhub.py:434
+#: src/additions/porn/pornhub.py:454
 msgid ""
 "You have reached the maximum allowed number of favorite playlists. Please "
 "delete some of your current favorite playlists before adding new ones."
 msgstr ""
 
-#: src/additions/porn/pornhub.py:466 src/additions/porn/pornhub.py:679
-#: src/additions/porn/pornhub.py:809 src/additions/porn/pornhub.py:1100
+#: src/additions/porn/pornhub.py:486 src/additions/porn/pornhub.py:699
+#: src/additions/porn/pornhub.py:829 src/additions/porn/pornhub.py:1120
 #: src/additions/porn/xhamster.py:277 src/additions/porn/xhamster.py:302
 #: src/additions/porn/xhamster.py:419 src/additions/porn/xhamster.py:638
 msgid "Unsubscribe"
 msgstr "Abmelden"
 
-#: src/additions/porn/pornhub.py:538 src/additions/porn/xhamster.py:253
+#: src/additions/porn/pornhub.py:558 src/additions/porn/xhamster.py:253
 msgid "No subscriptions found!"
 msgstr "Keine Abonnements gefunden!"
 
-#: src/additions/porn/pornhub.py:597 src/additions/porn/pornhub.py:731
-#: src/additions/porn/pornhub.py:856 src/additions/porn/pornhub.py:1197
+#: src/additions/porn/pornhub.py:617 src/additions/porn/pornhub.py:751
+#: src/additions/porn/pornhub.py:876 src/additions/porn/pornhub.py:1217
 msgid "Unknown error."
 msgstr "Unbekannter Fehler."
 
-#: src/additions/porn/pornhub.py:682 src/additions/porn/pornhub.py:812
-#: src/additions/porn/pornhub.py:1103 src/additions/porn/xhamster.py:307
+#: src/additions/porn/pornhub.py:702 src/additions/porn/pornhub.py:832
+#: src/additions/porn/pornhub.py:1123 src/additions/porn/xhamster.py:307
 #: src/additions/porn/xhamster.py:426 src/additions/porn/xhamster.py:644
 msgid "Subscribe"
 msgstr "Abonnieren"
 
-#: src/additions/porn/pornhub.py:1257
+#: src/additions/porn/pornhub.py:1277
 msgid ""
 "You have reached the maximum allowed number of favorite videos. Please "
 "delete some of your current favorite videos before adding new ones."
 msgstr ""
 
-#: src/additions/porn/pornrabbit.py:214 src/additions/porn/pornrabbit.py:226
-#: src/additions/porn/pornrabbit.py:236
-msgid "No link found!"
-msgstr "Kein Link gefunden!"
-
 #: src/additions/porn/x2search4porn.py:81
 msgid "Add"
 msgstr "Hinzufügen"
@@ -1838,15 +1838,15 @@ msgstr "Suche eingeben"
 msgid "No websites found!"
 msgstr "Keine Websites gefunden!"
 
-#: src/additions/porn/xvideos.py:212
+#: src/additions/porn/xnxx.py:235 src/additions/porn/xvideos.py:228
 msgid "Select Country"
 msgstr "Wähle Land"
 
-#: src/additions/porn/xvideos.py:276 src/additions/porn/xvideos.py:422
+#: src/additions/porn/xvideos.py:292 src/additions/porn/xvideos.py:438
 msgid "Region"
 msgstr "Region"
 
-#: src/additions/porn/xvideos.py:554
+#: src/additions/porn/xvideos.py:570
 msgid "Keywords"
 msgstr "Keywords"
 
@@ -2441,47 +2441,6 @@ msgstr "Eingabe"
 msgid "Really close without saving settings?"
 msgstr "Wirklich schließen ohne die Einstellungen zu speichern?"
 
-#: src/resources/hosters/bitshare.py:11
-msgid "Stream starts in 6 sec."
-msgstr "Stream startet in 6 Sek."
-
-#: src/resources/hosters/openload.py:41
-msgid ""
-"youtube-dl: unable to extract URL. This error occasionally occurs, please "
-"try again.\n"
-"If this error persists a youtube-dl upgrade may be needed.\n"
-"\n"
-"Alternatively you may visit https://olpair.com to pair your IP."
-msgstr ""
-"youtube-dl: URL konnte nicht extrahiert werden. Dieser Fehler tritt "
-"gelegentlich auf.\n"
-"Bitte versuchen Sie es erneut. Wenn dieser Fehler weiterhin auftritt ist "
-"möglicherweise\n"
-"ein youtube-dl Upgrade erforderlich.\n"
-"\n"
-"Alternativ können Sie https://olpair.com besuchen, um Ihre IP zu koppeln."
-
-#: src/resources/hosters/openload.py:48
-msgid ""
-"IP address not authorized. Visit https://olpair.com to pair your IP.\n"
-"\n"
-"Alternatively you may install youtube-dl and phantomjs to extend resolver "
-"functionality."
-msgstr ""
-"IP-Adresse nicht autorisiert. Besuchen Sie https://olpair.com um Ihre IP zu "
-"koppeln.\n"
-"\n"
-"Alternativ können Sie youtube-dl und phantomjs installieren, um die Resolver-"
-"Funktionalität zu erweitern."
-
-#: src/resources/hosters/streamcloud.py:13
-msgid "Stream starts in 10 sec."
-msgstr "Stream startet in 10 sek."
-
-#: src/resources/hosters/streamcloud.py:29
-msgid "This video is encoding now. Please check back later."
-msgstr "Das Video wird gerade encoded. Bitte später nochmal versuchen."
-
 #: src/resources/hosters/vidup.py:23
 #, python-format
 msgid "IP address not authorized. Visit %s/pair to pair your IP."
@@ -3106,19 +3065,19 @@ msgstr ""
 "Der Verzeichnispfad beginnt nicht mit '/':\n"
 "%s"
 
-#: src/resources/streams.py:742
+#: src/resources/streams.py:681
 msgid "No supported Stream Hoster, try another one!"
 msgstr "Kein unterstützter Stream Hoster, versuche einen anderen!"
 
-#: src/resources/streams.py:744
+#: src/resources/streams.py:683
 msgid "Invalid Stream link, try another Stream Hoster!"
 msgstr "Ungültiger Stream Link, versuche eine anderen Stream Hoster!"
 
-#: src/resources/streams.py:753
+#: src/resources/streams.py:692
 msgid "This hoster is only working with enabled Premium support."
 msgstr "Dieser Hoster funktioniert nur mit aktivierter Premium-Unterstützung."
 
-#: src/resources/streams.py:755
+#: src/resources/streams.py:694
 msgid ""
 "This Stream link is currently not available via Premium, try another Stream "
 "Hoster."
@@ -3126,7 +3085,7 @@ msgstr ""
 "Dieser Stream ist aktuell nicht über Premium verfügbar, versuche einen "
 "anderen Stream Hoster."
 
-#: src/resources/streams.py:759
+#: src/resources/streams.py:698
 msgid "Unknown error, check MP logfile."
 msgstr "Unbekannter Fehler, MP Logfile überprüfen."
 
index e63777f..1a83cd2 100644 (file)
@@ -155,8 +155,8 @@ config.mediaportal = ConfigSubsection()
 config_mp.mediaportal.fake_entry = NoSave(ConfigNothing())
 
 # Allgemein
-config_mp.mediaportal.version = NoSave(ConfigText(default="2019102701"))
-config.mediaportal.version = NoSave(ConfigText(default="2019102701"))
+config_mp.mediaportal.version = NoSave(ConfigText(default="2019112401"))
+config.mediaportal.version = NoSave(ConfigText(default="2019112401"))
 config_mp.mediaportal.autoupdate = ConfigYesNo(default = True)
 config.mediaportal.autoupdate = NoSave(ConfigYesNo(default = True))
 
index f207003..21ebb13 100644 (file)
@@ -136,7 +136,7 @@ def encrypt(plaintext, password, nBits):
        now = datetime.datetime.now()
        nonce = mktime( now.timetuple() )*1000 + now.microsecond//1000
        nonceSec = int(nonce // 1000)
-       nonceMs  = int(nonce % 1000)
+       nonceMs = int(nonce % 1000)
 
        for i in range(4): counterBlock[i] = urs(nonceSec, i*8) & 0xff
        for i in range(4): counterBlock[i+4] = nonceMs & 0xff
@@ -216,4 +216,39 @@ def urs(a, b):
                a = a >> (b-1)
        else:
                a = (a >> b)
-       return a
\ No newline at end of file
+       return a
+
+def decrypturl(url, lic, length=16):
+       url = url.split('/')
+       del url[0:2]
+       hash = url[5][:2 * length]
+       nchash = url[5][2 * length:]
+       seed = ''
+       f = lic.replace('$', '').replace('0', '1')
+       i = int(length / 2 + 2)
+       j = int(len(f) / 2)
+       e = 4 * abs(int(f[j:]) - int(f[:len(f)-j]))
+       for g in range(0, j + 1):
+               for h in range(1, 5):
+                       a = int(lic[g + h]) + int(str(e)[g])
+                       if a >= i:
+                               a -= i
+                       seed = seed + str(a)
+       if seed and hash:
+               for k in range(len(hash) - 1, -1, -1):
+                       l = k
+                       for m in range(k, len(hash)):
+                               l += int(seed[m])
+                       l = l % len(hash)
+                       n = ''
+                       for o in range(0, len(hash)):
+                               if o == k:
+                                       n = n + hash[l]
+                               elif o == l:
+                                       n = n + hash[k]
+                               else:
+                                       n = n + hash[o]
+                       hash = n
+       url[5] = hash + nchash
+       result = '/'.join(url)
+       return result
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/bitshare.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/bitshare.py
deleted file mode 100644 (file)
index 3d24f8b..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.messageboxext import MessageBoxExt
-
-def bitshare(self, data):
-       stream_url = re.findall('(url: |src=)\'(.*?.avi|.*?.mp4)\'', data)
-       if stream_url:
-               link = stream_url[0][1]
-               reactor.callLater(6, self.bitshare_start, link)
-               self.session.open(MessageBoxExt, _("Stream starts in 6 sec."), MessageBoxExt.TYPE_INFO, timeout=6)
-       else:
-               self.stream_not_found()
-
-def bitshare_start(self, url):
-       self._callback(url)
\ No newline at end of file
index 98189f7..149f312 100644 (file)
@@ -2,12 +2,12 @@
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 
-def fembed(self, data):
+def fembed(self, data, baseurl):
        stream_url = re.findall('[\'|\"]file[\'|\"]:\s{0,1}[\'|\"](.*?)[\'|\"]', data, re.S)
        if stream_url:
                url = str(stream_url[-1]).replace('\/','/')
                if url.startswith('/api'):
-                       url = "https://www.fembed.com" + url
+                       url = baseurl + url
                self._callback(url)
        else:
                self.stream_not_found()
\ No newline at end of file
index 8b9148e..299910f 100644 (file)
@@ -1,4 +1,3 @@
-<name>Streamcloud</name><hoster>streamcloud</hoster><regex>streamcloud\.eu</regex><premium>p</premium>
 <name>FlashX</name><hoster>flashx</hoster><regex>flashx\.co</regex><premium>pr</premium>
 <name>Youwatch</name><hoster>youwatch</hoster><regex>youwatch\.org</regex>
 <name>Rapidgator</name><hoster>rapidgator</hoster><regex>rapidgator\.net|rg\.to</regex><premium>r</premium>
@@ -15,7 +14,6 @@
 <name>Filerio</name><hoster>filerio</hoster><regex>filerio\.(?:com|in)</regex><premium>r</premium>
 <name>filer_dot_net</name><hoster>filer\.net</hoster><regex>filer\.net</regex><premium>p</premium>
 <name>FileFactory</name><hoster>filefactory</hoster><regex>filefactory\.com</regex><premium>pr</premium>
-<name>BitShare</name><hoster>bitshare</hoster><regex>bitshare\.com</regex>
 <name>BitPorno</name><hoster>bitporno</hoster><regex>bitporno\.com</regex>
 <name>VK</name><hoster>vk\.com</hoster><regex>vk\.(?:com|me)</regex>
 <name>mp4upload</name><hoster>mp4upload</hoster><regex>mp4upload\.com</regex>
 <name>Vidto_dot_me</name><hoster>vidto\.me</hoster><regex>vidto\.me</regex><premium>p</premium>
 <name>Vidspot</name><hoster>vidspot</hoster><regex>vidspot\.net</regex>
 <name>Google</name><hoster>docs\.google\.com</hoster><regex>(?:docs|drive)\.google\.com|googleusercontent\.com</regex>
-<name>RapidVideo_dot_com</name><hoster>rapidvideo</hoster><regex>rapidvideo\.com</regex><premium>pr</premium>
 <name>Vidoza</name><hoster>vidoza</hoster><regex>vidoza\.net</regex><premium>pr</premium>
-<name>Openload</name><hoster>openload</hoster><regex>openload\.(?:co|io|link|pw)|oload\.(?:tv|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|pw|live|space|services)|oladblock\.(?:services|xyz|me)|openloed\.co</regex><premium>pr</premium>
-<name>Fembed</name><hoster>fembed</hoster><regex>fembed\.com</regex>
-<name>Kissmovies</name><hoster>kissmovies</hoster><regex>kissmovies\.cc</regex>
-<name>Vcdn</name><hoster>vcdn\.io</hoster><regex>vcdn\.io</regex>
-<name>Smartshare</name><hoster>smartshare</hoster><regex>smartshare\.tv</regex>
+<name>Fembed</name><hoster>fembed</hoster><regex>fembed\.com|kissmovies\.cc|vcdn\.io|mm9841\.com|smartshare\.tv</regex>
 <name>YouTube</name><hoster>youtube</hoster><regex>youtube\.com</regex><premium>pr</premium>
 <name>Vidzi</name><hoster>vidzi</hoster><regex>vidzi\.tv</regex>
 <name>Vidfast</name><hoster>vidfast</hoster><regex>vidfast\.co</regex>
 <name>Mail_dot_ru</name><hoster>mail\.ru</hoster><regex>mail\.ru</regex>
 <name>Vidlox</name><hoster>vidlox</hoster><regex>vidlox\.(?:tv|me)</regex><premium>pr</premium>
 <name>Vidcloud</name><hoster>vidcloud</hoster><regex>vidcloud\.co</regex>
-<name>Streamango</name><hoster>streamango</hoster><regex>streamango\.com</regex>
-<name>Streamcherry</name><hoster>streamcherry</hoster><regex>streamcherry\.com</regex>
 <name>Vshare_dot_eu</name><hoster>vshare\.eu</hoster><regex>vshare\.eu</regex>
 <name>Vidup</name><hoster>vidup\.tv</hoster><regex>vidup\.(?:tv|io)</regex>
 <name>Vevio</name><hoster>vev\.io</hoster><regex>vev\.io</regex>
 <name>Clipwatching</name><hoster>clipwatching</hoster><regex>clipwatching\.com</regex>
-<name>Verystream</name><hoster>verystream</hoster><regex>verystream\.com</regex>
+<name>Mangovideo</name><hoster>mangovideo</hoster><regex>mangovideo\.pw</regex>
+<name>Onlystream</name><hoster>onlystream</hoster><regex>onlystream\.tv</regex>
+<name>Videobin</name><hoster>videobin</hoster><regex>videobin\.co</regex>
+<name>Mixdrop</name><hoster>mixdrop</hoster><regex>mixdrop\.co</regex>
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/kissmovies.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/kissmovies.py
deleted file mode 100644 (file)
index 791fd9f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-def kissmovies(self, data):
-       stream_url = re.findall('[\'|\"]file[\'|\"]:\s{0,1}[\'|\"](.*?)[\'|\"]', data, re.S)
-       if stream_url:
-               url = str(stream_url[-1]).replace('\/','/')
-               if url.startswith('/api'):
-                       url = "https://kissmovies.cc" + url
-               self._callback(url)
-       else:
-               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mangovideo.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mangovideo.py
new file mode 100644 (file)
index 0000000..cf847c4
--- /dev/null
@@ -0,0 +1,16 @@
+# -*- coding: utf-8 -*-
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.decrypt import decrypturl
+
+def mangovideo(self, data):
+       license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
+       url = re.findall('video_url:\s\'(.*?)\',', data, re.S)
+       if license and url:
+               if 'function/0/' in url[0]:
+                       url = decrypturl(url[0], license[0])
+                       self._callback(url)
+               else:
+                       self._callback(url[0])
+       else:
+               self.stream_not_found()
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mixdrop.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mixdrop.py
new file mode 100644 (file)
index 0000000..0fecacf
--- /dev/null
@@ -0,0 +1,26 @@
+# -*- coding: utf-8 -*-
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.packer import unpack, detect
+
+def mixdrop(self, data):
+       if 'id="videojs"' in data:
+               get_packedjava = re.findall("(eval.function.*?)</script>", data, re.S)
+               if get_packedjava and detect(get_packedjava[0]):
+                       sJavascript = get_packedjava[0]
+                       sUnpacked = unpack(sJavascript)
+                       if sUnpacked:
+                               stream_url = re.search('MDCore.vsrc="(.*?)";', sUnpacked, re.S)
+                               if stream_url:
+                                       url = stream_url.group(1)
+                                       if url .startswith('//'):
+                                               url = "https:" + url
+                                       self._callback(url)
+                               else:
+                                       self.stream_not_found()
+                       else:
+                               self.stream_not_found()
+               else:
+                       self.stream_not_found()
+       else:
+               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/onlystream.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/onlystream.py
new file mode 100644 (file)
index 0000000..bd9cc3c
--- /dev/null
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+import requests
+
+def onlystream(self, data, ck):
+       kekse = requests.utils.dict_from_cookiejar(ck)
+       stream_url = re.findall('player.updateSrc\(\[\{src:\s{0,1}"(.*?)",', data, re.S)
+       if not stream_url:
+               stream_url = re.findall('file:"(.*?)",label', data, re.S)
+       if stream_url:
+               url = stream_url[-1]
+               headers = '&Cookie=%s' % ','.join(['%s=%s' % (key, urllib.quote_plus(kekse[key])) for key in kekse])
+               url = url + '#User-Agent='+mp_globals.player_agent+headers
+               self._callback(url)
+       else:
+               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/openload.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/openload.py
deleted file mode 100644 (file)
index 296907d..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.messageboxext import MessageBoxExt
-import requests
-
-try:
-       from youtube_dl import YoutubeDL
-       youtubedl = True
-except:
-       youtubedl = False
-
-if os.path.exists("/usr/bin/phantomjs"):
-       phantomjs = True
-else:
-       phantomjs = False
-
-def openload(self, data, link, count=0):
-
-       stream_url = re.findall('"url":"(.*?)"', data)
-       if stream_url:
-               self._callback(stream_url[0].replace('\\',''))
-       elif mp_globals.isDreamOS and youtubedl and phantomjs:
-               result = None
-               try:
-                       os.environ["QT_QPA_PLATFORM"] = "phantom"
-                       ytdl = YoutubeDL({'nocheckcertificate':True, 'restrictfilenames':True, 'no_warnings':True})
-                       result = ytdl.extract_info(link, ie_key="Openload", download=False, process=True)
-                       os.environ["QT_QPA_PLATFORM"] = ""
-               except Exception as e:
-                       os.environ["QT_QPA_PLATFORM"] = ""
-                       if re.search('File not found', str(e), re.S):
-                               self.stream_not_found()
-                       else:
-                               printl("[openload]: %s" % e,'',"E")
-                               if count < 3:
-                                       printl("[openload]: retry",'',"E")
-                                       count += 1
-                                       self.openload("", link, count)
-                               else:
-                                       self.session.open(MessageBoxExt, _("youtube-dl: unable to extract URL. This error occasionally occurs, please try again.\nIf this error persists a youtube-dl upgrade may be needed.\n\nAlternatively you may visit https://olpair.com to pair your IP."), MessageBoxExt.TYPE_INFO, timeout=5)
-               else:
-                       if result:
-                               self._callback(str(result['url']).replace('https','http'))
-                       else:
-                               self.stream_not_found()
-       elif re.search('IP address not authorized', data):
-               message = self.session.open(MessageBoxExt, _("IP address not authorized. Visit https://olpair.com to pair your IP.\n\nAlternatively you may install youtube-dl and phantomjs to extend resolver functionality."), MessageBoxExt.TYPE_ERROR)
-       else:
-               self.stream_not_found()
-
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/rapidvideocom.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/rapidvideocom.py
deleted file mode 100644 (file)
index c4d4ff7..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-def rapidvideocom(self, data):
-       url = re.findall('source\ssrc="(.*?)"', data, re.S)
-       if url:
-               self._callback(url[-1])
-               return
-       self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/smartshare.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/smartshare.py
deleted file mode 100644 (file)
index d0eed34..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-def smartshare(self, data):
-       stream_url = re.findall('[\'|\"]file[\'|\"]:\s{0,1}[\'|\"](.*?)[\'|\"]', data, re.S)
-       if stream_url:
-               url = str(stream_url[-1]).replace('\/','/')
-               if url.startswith('/api'):
-                       url = "https://smartshare.tv" + url
-               self._callback(url)
-       else:
-               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamango.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamango.py
deleted file mode 100644 (file)
index e812d07..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.messageboxext import MessageBoxExt
-from Plugins.Extensions.MediaPortal.resources.packer import unpack, detect
-import subprocess
-
-def streamango(self, data):
-       get_packedjava = re.findall("mango.js.*?(eval.function.*?\{\}\)\))", data, re.S)
-       if get_packedjava and detect(get_packedjava[0]):
-               sJavascript = get_packedjava[0]
-               sUnpacked = unpack(sJavascript)
-               if sUnpacked:
-                       url = None
-                       js = sUnpacked.decode('string_escape').replace('window.d=function','d=function')
-                       dec = re.findall('video\/mp4\",src:(.*?\)),', data, re.S)
-                       js = js + ';\nvidurl = ' + dec[0] + ';\nconsole.log(vidurl);'
-                       try:
-                               url = subprocess.check_output(["node", "-e", js]).strip()
-                       except OSError as e:
-                               if e.errno == 2:
-                                       self.session.open(MessageBoxExt, _("This plugin requires package nodejs."), MessageBoxExt.TYPE_INFO)
-                       except Exception:
-                               self.session.open(MessageBoxExt, _("Error executing Javascript, please report to the developers."), MessageBoxExt.TYPE_INFO)
-                       if url:
-                               if url.startswith('//'):
-                                       url = 'https:' + url
-                               self._callback(url)
-                       else:
-                               self.stream_not_found()
-               else:
-                       self.stream_not_found()
-       else:
-               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamcloud.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/streamcloud.py
deleted file mode 100644 (file)
index 1212702..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.messageboxext import MessageBoxExt
-
-def streamcloud(self, data):
-       id = re.findall('<input type="hidden" name="id".*?value="(.*?)">', data)
-       fname = re.findall('<input type="hidden" name="fname".*?alue="(.*?)">', data)
-       if id and fname:
-               url = "http://streamcloud.eu/%s" % id[0]
-               post_data = urllib.urlencode({'op': 'download1', 'usr_login': '', 'id': id[0], 'fname': fname[0], 'referer': url, 'hash': '', 'imhuman':'Weiter zum Video'})
-               reactor.callLater(10, self.streamcloud_getpage, url, post_data)
-               message = self.session.open(MessageBoxExt, _("Stream starts in 10 sec."), MessageBoxExt.TYPE_INFO, timeout=10)
-       else:
-               self.stream_not_found()
-
-def streamcloud_getpage(self, url, post_data):
-       spezialagent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-       getPage(url, method='POST', cookies=self.ck, agent=spezialagent, postdata=post_data, headers={'Content-Type':'application/x-www-form-urlencoded', 'Referer': url, 'Origin':'http://streamcloud.eu'}).addCallback(self.streamcloud_data, url).addErrback(self.errorload)
-
-def streamcloud_data(self, data, url):
-       stream_url = re.findall('file:\s"(.*?)",', data)
-       if stream_url:
-               mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-               headers = '&Referer=' + url
-               stream = stream_url[0] + '#User-Agent='+mp_globals.player_agent+headers
-               self._callback(stream)
-       elif re.search('This video is encoding now', data, re.S):
-               self.session.open(MessageBoxExt, _("This video is encoding now. Please check back later."), MessageBoxExt.TYPE_INFO, timeout=10)
-       else:
-               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/vcdn.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/vcdn.py
deleted file mode 100644 (file)
index ede434a..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-def vcdn(self, data):
-       stream_url = re.findall('[\'|\"]file[\'|\"]:\s{0,1}[\'|\"](.*?)[\'|\"]', data, re.S)
-       if stream_url:
-               url = str(stream_url[-1]).replace('\/','/')
-               if url.startswith('/api'):
-                       url = "https://vcdn.io" + url
-               self._callback(url)
-       else:
-               self.stream_not_found()
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/verystream.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/verystream.py
deleted file mode 100644 (file)
index ae9dcb3..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-def verystream(self, data, id, link):
-       videolink = re.search('(%s~[~._:a-zA-Z0-9]+)' % id, data)
-       if videolink:
-               url = "https://verystream.com/gettoken/%s?mime=true" % videolink.group(1)
-               tw_agent_hlp = TwAgentHelper()
-               tw_agent_hlp.getRedirectedUrl(url).addCallback(self.verystreamUrl, id, link).addErrback(self.errorload)
-       else:
-               self.stream_not_found()
-
-def verystreamUrl(self, url, id, link):
-       if url.startswith('https://verystream.com/gettoken'):
-               if self.retry <=3:
-                       self.retry += 1
-                       twAgentGetPage(link, agent=self.agent, headers={'referer':self.referer}).addCallback(self.verystream, id, link).addErrback(self.errorload)
-               else:
-                       self.stream_not_found()
-       else:
-               mp_globals.veryref = ""
-               self._callback(url)
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/videobin.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/videobin.py
new file mode 100644 (file)
index 0000000..a329702
--- /dev/null
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+
+def videobin(self, data):
+       stream_url = re.findall('Clappr.Player.*?,"(.*?.mp4)"', data, re.S)
+       if stream_url:
+               self._callback(stream_url[-1])
+       else:
+               self.stream_not_found()
\ No newline at end of file
index 589017f..fe7bd3b 100644 (file)
@@ -4,7 +4,10 @@ from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.messageboxext import MessageBoxExt
 
 def vidup(self, data, host, id):
+       print data
        stream_url = re.findall('"\d+p":"(.*?)"', data, re.S)
+       if not stream_url:
+               stream_url = re.findall('"size":\[\d+,\d+\],"fps":\d+,"src":"(.*?)"', data, re.S)
        if stream_url:
                self._callback(stream_url[-1])
        else:
@@ -16,6 +19,8 @@ def vidup(self, data, host, id):
 
 def vidup_pair(self, data, host):
        stream_url = re.findall('"\d+p":"(.*?)"', data, re.S)
+       if not stream_url:
+               stream_url = re.findall('"size":\[\d+,\d+\],"fps":\d+,"src":"(.*?)"', data, re.S)
        if stream_url:
                self._callback(stream_url[-1])
        else:
index 6326140..55aea07 100644 (file)
@@ -33,7 +33,7 @@ ThumbViewTextBackground = '#20000000'
 bsp = None
 bdmt = None
 nav_suburi = ""
-veryref = ""
+special_referer = ""
 sa = False
 
 std_headers = {
index 66172e1..15668a1 100644 (file)
@@ -589,13 +589,26 @@ class MPScreen(Screen, HelpableScreen):
                        path = "%s/%s/images/watched.png" % (skin_path, mp_globals.skinFallback)
                        if not fileExists(path):
                                path = "/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/watched.png"
-
                watched = LoadPixmap(path)
-               pwidth = watched.size().width()
-               pheight = watched.size().height()
-               vpos = round(float((height-pheight)/2))
-               if entry[2]:
-                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 25, vpos, pwidth, pheight, watched))
+               pwidth1 = watched.size().width()
+               pheight1 = watched.size().height()
+               vpos1 = round(float((height-pheight1)/2))
+
+               path = "%s/%s/images/live.png" % (skin_path, mp_globals.currentskin)
+               if not fileExists(path):
+                       path = "%s/%s/images/live.png" % (skin_path, mp_globals.skinFallback)
+                       if not fileExists(path):
+                               path = "/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/live.png"
+               live = LoadPixmap(path)
+               pwidth2 = watched.size().width()
+               pheight2 = watched.size().height()
+               vpos2 = round(float((height-pheight2)/2))
+
+               if len(entry)>7 and entry[7]:
+                       if entry[7] == 'Live':
+                               res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 25, vpos2, pwidth2, pheight2, live))
+               elif entry[2]:
+                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 25, vpos1, pwidth1, pheight1, watched))
 
                try:
                        if entry[3]:
@@ -641,23 +654,23 @@ class MPScreen(Screen, HelpableScreen):
                                        lwidth = int(lheight * lratio)
                                vpos = round(float((height-lheight)/2))
                                if mp_globals.isDreamOS:
-                                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, pwidth+50, vpos, lwidth, lheight, llang))
+                                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, pwidth1+50, vpos, lwidth, lheight, llang))
                                else:
                                        scale = AVSwitch().getFramebufferScale()
                                        picload = ePicLoad()
                                        picload.setPara((lwidth, lheight, scale[0], scale[1], True, 1, "#FF000000"))
                                        picload.startDecode(path, 0, 0, False)
                                        lang = picload.getData()
-                                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, pwidth+50, vpos, lwidth, lheight, lang))
+                                       res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, pwidth1+50, vpos, lwidth, lheight, lang))
                                self.langoffset = lwidth+25
                except:
                        pass
 
                if (config_mp.mediaportal.premiumize_use.value and re.search(mp_globals.premium_hosters_prz[0], entry[0], re.S|re.I)) or (config_mp.mediaportal.realdebrid_use.value and re.search(mp_globals.premium_hosters_rdb[0], entry[0], re.S|re.I)):
                        premiumFarbe = int(config_mp.mediaportal.premium_color.value, 0)
-                       res.append((eListboxPythonMultiContent.TYPE_TEXT, pwidth+50+self.langoffset, 0, width, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0], premiumFarbe))
+                       res.append((eListboxPythonMultiContent.TYPE_TEXT, pwidth1+50+self.langoffset, 0, width, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0], premiumFarbe))
                else:
-                       res.append((eListboxPythonMultiContent.TYPE_TEXT, pwidth+50+self.langoffset, 0, width, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0]))
+                       res.append((eListboxPythonMultiContent.TYPE_TEXT, pwidth1+50+self.langoffset, 0, width, height, 0, RT_HALIGN_LEFT | RT_VALIGN_CENTER, entry[0]))
 
                return res
 
index 72b7d0f..2579d43 100644 (file)
@@ -81,7 +81,6 @@ class get_stream_link:
 
        # hosters
        from hosters.bitporno import bitporno
-       from hosters.bitshare import bitshare, bitshare_start
        from hosters.clipwatching import clipwatching
        from hosters.datoporn import datoporn
        from hosters.fembed import fembed
@@ -89,19 +88,15 @@ class get_stream_link:
        from hosters.flyflv import flyflv, flyflvData
        from hosters.google import google
        from hosters.gounlimited import gounlimited
-       from hosters.kissmovies import kissmovies
        from hosters.mailru import mailru
+       from hosters.mangovideo import mangovideo
+       from hosters.mixdrop import mixdrop
        from hosters.mp4upload import mp4upload
        from hosters.okru import okru
-       from hosters.openload import openload
-       from hosters.rapidvideocom import rapidvideocom
-       from hosters.smartshare import smartshare
-       from hosters.streamcloud import streamcloud, streamcloud_getpage, streamcloud_data
-       from hosters.streamango import streamango
+       from hosters.onlystream import onlystream
        from hosters.uptostream import uptostream
-       from hosters.vcdn import vcdn
-       from hosters.verystream import verystream, verystreamUrl
        from hosters.vidcloud import vidcloud
+       from hosters.videobin import videobin
        from hosters.videowood import videowood
        from hosters.vidfast import vidfast
        from hosters.vidlox import vidlox
@@ -193,21 +188,7 @@ class get_stream_link:
                self._callback = got_link
                self.link = data
                if data:
-                       if re.search("http://streamcloud.eu/", data, re.S):
-                               link = data
-                               if config_mp.mediaportal.premiumize_use.value and not self.fallback:
-                                       link = re.search("(http://streamcloud.eu/\w+)", data, re.S)
-                                       if link:
-                                               link = link.group(1)
-                                       self.rdb = 0
-                                       self.prz = 1
-                                       self.callPremium(link)
-                               else:
-                                       spezialagent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
-                                       self.ck = {}
-                                       getPage(link, cookies=self.ck, agent=spezialagent).addCallback(self.streamcloud).addErrback(self.errorload)
-
-                       elif re.search('rapidgator.net|rg.to', data, re.S):
+                       if re.search('rapidgator.net|rg.to', data, re.S):
                                link = data
                                if (config_mp.mediaportal.premiumize_use.value or config_mp.mediaportal.realdebrid_use.value) and not self.fallback:
                                        self.rdb = 1
@@ -261,15 +242,6 @@ class get_stream_link:
                                else:
                                        self.only_premium()
 
-                       elif re.search('extmatrix.com', data, re.S):
-                               link = data
-                               if config_mp.mediaportal.realdebrid_use.value and not self.fallback:
-                                       self.rdb = 1
-                                       self.prz = 0
-                                       self.callPremium(link)
-                               else:
-                                       self.only_premium()
-
                        elif re.search('mediafire.com', data, re.S):
                                link = data
                                if (config_mp.mediaportal.premiumize_use.value or config_mp.mediaportal.realdebrid_use.value) and not self.fallback:
@@ -462,10 +434,6 @@ class get_stream_link:
                                else:
                                        self.only_premium()
 
-                       elif re.search('http://.*?bitshare.com', data, re.S):
-                               link = data
-                               getPage(link).addCallback(self.bitshare).addErrback(self.errorload)
-
                        elif re.search('clipwatching.com', data, re.S):
                                link = data
                                twAgentGetPage(link).addCallback(self.clipwatching).addErrback(self.errorload)
@@ -475,8 +443,12 @@ class get_stream_link:
                                host = link[0]
                                id = link[1]
                                link = host + '/api/serve/video/' + id
+                               if not mp_globals.special_referer:
+                                       self.referer = 'https://pandamovies.pw/'
+                               else:
+                                       self.referer = mp_globals.special_referer
                                mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
-                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.vidup, host, id).addErrback(self.errorload)
+                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded','referer':self.referer}).addCallback(self.vidup, host, id).addErrback(self.errorload)
 
                        elif re.search('bitporno.com', data, re.S):
                                if "/e/" in data:
@@ -487,27 +459,21 @@ class get_stream_link:
                                mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
                                twAgentGetPage(link, agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', timeout=60).addCallback(self.bitporno).addErrback(self.errorload)
 
-                       elif re.search('fembed.com', data, re.S):
-                               link = 'http://www.fembed.com/api/source/' + data.split('/v/')[-1]
-                               mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.fembed).addErrback(self.errorload)
-
-                       elif re.search('smartshare.tv', data, re.S):
-                               link = 'https://smartshare.tv/api/source/' + data.split('/v/')[-1]
+                       elif re.search('onlystream.tv', data, re.S):
+                               link = data
                                mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.smartshare).addErrback(self.errorload)
+                               kekse = CookieJar()
+                               twAgentGetPage(link, agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', cookieJar=kekse).addCallback(self.onlystream, kekse).addErrback(self.errorload)
 
-                       elif re.search('kissmovies.cc', data, re.S):
-                               link = 'https://kissmovies.cc/api/source/' + data.split('/v/')[-1]
-                               print link
+                       elif re.search('videobin.co', data, re.S):
+                               link = data
                                mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.kissmovies).addErrback(self.errorload)
+                               twAgentGetPage(link, agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36').addCallback(self.videobin).addErrback(self.errorload)
 
-                       elif re.search('vcdn.io', data, re.S):
-                               link = 'https://vcdn.io/api/source/' + data.split('/v/')[-1]
-                               print link
+                       elif re.search('fembed\.com|smartshare\.tv|kissmovies\.cc|vcdn\.io|mm9841\.com', data, re.S):
+                               link = data.split('/v/')[0] + '/api/source/' + data.split('/v/')[-1]
                                mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.vcdn).addErrback(self.errorload)
+                               twAgentGetPage(link, method='POST', agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36', headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.fembed, data.split('/v/')[0]).addErrback(self.errorload)
 
                        elif re.search('flashx.tv|flashx.pw|flashx.co|flashx.to', data, re.S):
                                link = data
@@ -639,31 +605,6 @@ class get_stream_link:
                                else:
                                        getPage(link, agent=mp_globals.player_agent, cookies=self.google_ck).addCallback(self.google).addErrback(self.errorload)
 
-                       elif re.search('rapidvideo\.com', data, re.S):
-                               link = data.replace('rapidvideo.com/v/', 'rapidvideo.com/e/').replace('rapidvideo.com/embed/', 'rapidvideo.com/e/').replace('http:', 'https:')
-                               if (config_mp.mediaportal.premiumize_use.value or config_mp.mediaportal.realdebrid_use.value) and not self.fallback:
-                                       self.rdb = 1
-                                       self.prz = 1
-                                       self.callPremium(link)
-                               else:
-                                       id = re.findall('rapidvideo\.com/(?:v|e|embed)/(.*?)$', link)
-                                       if id:
-                                               link = "https://rapidvideo.com/e/%s" % id[0]
-                                       twAgentGetPage(link).addCallback(self.rapidvideocom).addErrback(self.errorload)
-
-                       elif re.search('openload\.(?:co|io|link|pw)|oload\.(?:tv|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|pw|live|space|services)|oladblock\.(?:services|xyz|me)|openloed\.co', data, re.S):
-                               link = data
-                               id = re.search('http[s]?://(?:openload\.(?:co|io|link|pw)|oload\.(?:tv|stream|site|xyz|win|download|cloud|cc|icu|fun|club|info|pw|live|space|services)|oladblock\.(?:services|xyz|me)|openloed\.co)\/[^/]+\/(.*?)(?:\/.*?)?$', link, re.S)
-                               if id:
-                                       link = 'https://openload.co/embed/' + id.group(1)
-                               if (config_mp.mediaportal.premiumize_use.value or config_mp.mediaportal.realdebrid_use.value) and not self.fallback:
-                                       self.rdb = 1
-                                       self.prz = 1
-                                       self.callPremium(link)
-                               else:
-                                       url = "https://api.openload.co/1/streaming/get?file=" + id.group(1)
-                                       getPage(url).addCallback(self.openload, link).addErrback(self.errorload)
-
                        elif re.search('ok\.ru', data, re.S):
                                id = data.split('/')[-1]
                                url = "http://www.ok.ru/dk"
@@ -682,6 +623,12 @@ class get_stream_link:
                                else:
                                        self.stream_not_found()
 
+                       elif re.search('mangovideo\.pw', data, re.S):
+                               link = data
+                               spezialagent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
+                               mp_globals.player_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
+                               getPage(link, agent=spezialagent).addCallback(self.mangovideo).addErrback(self.errorload)
+
                        elif re.search('vidzi\.tv/', data, re.S):
                                link = data
                                getPage(link, cookies=ck).addCallback(self.vidzi).addErrback(self.errorload)
@@ -692,22 +639,15 @@ class get_stream_link:
                                mp_globals.player_agent = agent
                                twAgentGetPage(link, agent=agent).addCallback(self.vidfast).addErrback(self.errorload)
 
-                       elif re.search('verystream\.com', data, re.S):
-                               vid = re.search('.*?/(?:stream|e)/(.*?)(?:/|$)', data, re.S)
-                               if vid:
-                                       link = "https://verystream.com/e/" + vid.group(1)
-                               else:
-                                       self.stream_not_found()
-                                       return
-                               id = link.strip('/').rsplit('/')[-1]
-                               self.agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'
-                               mp_globals.player_agent = self.agent
-                               if not mp_globals.veryref:
-                                       self.referer = 'https://filmpalast.to'
+                       elif re.search('mixdrop\.co/', data, re.S):
+                               link = data
+                               if not mp_globals.special_referer:
+                                       self.referer = 'https://filmpalast.to/'
                                else:
-                                       self.referer = mp_globals.veryref
-                               self.retry = 0
-                               twAgentGetPage(link, agent=self.agent, headers={'referer':self.referer}).addCallback(self.verystream, id, link).addErrback(self.errorload)
+                                       self.referer = mp_globals.special_referer
+                               agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'
+                               mp_globals.player_agent = agent
+                               twAgentGetPage(link, agent=agent, headers={'referer':self.referer}).addCallback(self.mixdrop).addErrback(self.errorload)
 
                        elif re.search('vidlox(\.tv|\.me)', data, re.S):
                                if re.search('vidlox(\.tv|\.me)/embed-', data, re.S):
@@ -733,11 +673,6 @@ class get_stream_link:
                                else:
                                        self.stream_not_found()
 
-                       elif re.search('streamango\.com|streamcherry\.com', data, re.S):
-                               link = data
-                               spezialagent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
-                               twAgentGetPage(link, agent=spezialagent).addCallback(self.streamango).addErrback(self.errorload)
-
                        else:
                                message = self.session.open(MessageBoxExt, _("No supported Stream Hoster, try another one!"), MessageBoxExt.TYPE_INFO, timeout=5)
                else:
@@ -745,7 +680,7 @@ class get_stream_link:
                self.fallback = False
 
        def stream_not_found(self):
-               mp_globals.veryref = ""
+               mp_globals.special_referer = ""
                message = self.session.open(MessageBoxExt, _("Stream not found, try another Stream Hoster."), MessageBoxExt.TYPE_INFO, timeout=5)
 
        def only_premium(self):