import enigma2-plugin-extensions-mediaportal 2019120501 v2019120501
authorChristian Weiske <cweiske@cweiske.de>
Fri, 6 Dec 2019 00:15:24 +0000 (01:15 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Fri, 6 Dec 2019 00:15:24 +0000 (01:15 +0100)
25 files changed:
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/mediatheken/netflix.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/netzkino.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/redbull.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/seventv.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/videogold_de.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/urknall.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/hdporn.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porn7.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornxio.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/slutload.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/txxx.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/vporn.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/sport/sporttotal.py [deleted file]
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/cfscrape/LICENSE [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/__init__.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/user_agents.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/LICENSE [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/__init__.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/simpleplayer.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/yt_url.py

index ab45eaf..82e0a5f 100644 (file)
@@ -2,7 +2,6 @@
 <plugins>
        <set name="additions">
                <!--sport section-->
-               <!--<plugin type="mod" modfile="sport.sporttotal" confopt="showsporttotal" default="True" confcat="sport" gz="0" name="sporttotal.tv" icon="sporttotal" filter="Sport" screen="sporttotalGenreScreen" param1="" param2=""/>-->
                <plugin type="mod" modfile="sport.pokerstars" confopt="showpokerstars" default="True" confcat="sport" gz="0" name="Pokerstars.tv" icon="pokerstars" filter="Sport" screen="pokerGenreScreen" param1="" param2=""/>
                <!--music section-->
                <plugin type="mod" modfile="music.mtvdecharts" confopt="showMTVdeCharts" default="True" confcat="music" gz="0" name="MTV Charts" icon="mtvdecharts" filter="Music" screen="MTVdeChartsGenreScreen" param1="" param2=""/>
@@ -33,6 +32,7 @@
                <plugin type="mod" modfile="fun.chefkoch" confopt="showChefkoch" default="True" confcat="fun" gz="0" name="Chefkoch.de" icon="chefkoch" filter="Fun" screen="chefkochGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="fun.germanytv" confopt="showgermanytv" default="True" confcat="fun" gz="0" name="Germany-TV" icon="germanytv" filter="Fun" screen="germanytvChannelScreen" param1="" param2=""/>
                <!--mediatheken section-->
+               <plugin type="mod" modfile="mediatheken.netflix" confopt="shownetflix" default="True" confcat="mediatheken" gz="0" name="Netflix" icon="netflix" filter="Mediathek" screen="netflixScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.dreisat" confopt="showDreisat" default="True" confcat="mediatheken" gz="0" name="3sat Mediathek" icon="3sat" filter="Mediathek" screen="dreisatGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.ard" confopt="showARD" default="True" confcat="mediatheken" gz="0" name="ARD Mediathek" icon="ard" filter="Mediathek" screen="ARDGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.arte" confopt="showArte" default="True" confcat="mediatheken" gz="0" name="arte Mediathek" icon="arte" filter="Mediathek" screen="arteFirstScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.kindertube" confopt="showkindertube" default="True" confcat="mediatheken" gz="0" name="KinderTube" icon="kindertube" filter="Mediathek" screen="kindertubeMain" param1="" param2="" kids="1"/>
                <plugin type="mod" modfile="mediatheken.myspass" confopt="showmyspass" default="True" confcat="mediatheken" gz="0" name="MySpass" icon="myspass" filter="Mediathek" screen="myspassGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.netzkino" confopt="showNetzKino" default="True" confcat="mediatheken" gz="0" name="Netzkino" icon="netzkino" filter="Mediathek" screen="netzKinoGenreScreen" param1="" param2=""/>
-               <!--<plugin type="mod" modfile="mediatheken.redbull" confopt="showRedBullTV" default="True" confcat="mediatheken" gz="0" name="Red Bull TV" icon="redbull" filter="Mediathek/Sport" screen="RBtvGenreScreen" param1="" param2=""/>-->
                <plugin type="mod" modfile="mediatheken.servustv" confopt="showServusTV" default="True" confcat="mediatheken" gz="0" name="ServusTV" icon="servustv" filter="Mediathek" screen="sTVGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.southpark" confopt="showsouthpark" default="True" confcat="mediatheken" gz="0" name="Southpark.de" icon="southpark" filter="Mediathek" screen="SouthparkGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.srg" confopt="showSRG" default="True" confcat="mediatheken" gz="0" name="SRG Play" icon="srg" filter="Mediathek" screen="SRGGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.tvnow" confopt="showtvnow" default="True" confcat="mediatheken" gz="0" name="TVNOW" icon="tvnow" filter="Mediathek" screen="tvnowFirstScreen" param1="" param2=""/>
-               <!--<plugin type="mod" modfile="mediatheken.seventv" confopt="showseventv" default="True" confcat="mediatheken" gz="0" name="7TV" icon="seventv" filter="Mediathek" screen="sevenFirstScreen" param1="" param2=""/>-->
                <plugin type="mod" modfile="mediatheken.orf" confopt="showORF" default="True" confcat="mediatheken" gz="0" name="ORF TVthek" icon="orf" filter="Mediathek" screen="ORFGenreScreen" param1="" param2=""/>
-               <!--<plugin type="mod" modfile="mediatheken.videogold_de" confopt="showVideoGold" default="True" confcat="mediatheken" gz="0" name="VideoGold.de" icon="videogold_de" filter="Mediathek" screen="show_VGDE_Genre" param1="" param2=""/>-->
                <plugin type="mod" modfile="mediatheken.youtube" confopt="showyoutube" default="True" confcat="mediatheken" gz="0" name="YouTube" icon="youtube" filter="Mediathek/Music/Sport" screen="youtubeGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.youtube_user" confopt="showyoutubeuser" default="True" confcat="mediatheken" gz="0" name="YouTube Channels" icon="userchannels" filter="Mediathek" screen="show_USER_Genre" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.zdf" confopt="showZDF" default="True" confcat="mediatheken" gz="0" name="ZDF Mediathek" icon="zdf" filter="Mediathek" screen="ZDFGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="porn.bongacams" confopt="showbongacams" default="False" confcat="porn" gz="0" name="BongaCams" icon="bongacams" filter="Porn" screen="bongacamsGenreScreen" param1="" param2="" />
                <plugin type="mod" modfile="porn.camsoda" confopt="showcamsoda" default="False" confcat="porn" gz="0" name="CamSoda" icon="camsoda" filter="Porn" screen="camsodaGenreScreen" param1="" param2="" />
                <plugin type="mod" modfile="porn.x2search4porn" confopt="show2search4porn" default="True" confcat="porn" gz="0" name="2Search4Porn" icon="2search4porn" filter="Porn" screen="toSearchForPorn" param1="" param2=""/>
-               <plugin type="mod" modfile="porn.badoinkvr" confopt="showbadoinkvr" default="False" confcat="porn" gz="0" name="BaDoinkVR.com" icon="badoinkvr" filter="Porn" screen="badoinkvrGenreScreen" param1="" param2="" search="0" delim="" searchurl="" searchscreen="" searchparam=""/>
-               <plugin type="mod" modfile="porn.bangbros" confopt="showbangbroscom" default="False" confcat="porn" gz="0" name="Bangbros.com" icon="bangbros" filter="Porn" screen="bangbrosGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="bangbrosFilmScreen" searchparam=""/>
+               <!--<plugin type="mod" modfile="porn.badoinkvr" confopt="showbadoinkvr" default="False" confcat="porn" gz="0" name="BaDoinkVR.com" icon="badoinkvr" filter="Porn" screen="badoinkvrGenreScreen" param1="" param2="" search="0" delim="" searchurl="" searchscreen="" searchparam=""/>-->
+               <!--<plugin type="mod" modfile="porn.bangbros" confopt="showbangbroscom" default="False" confcat="porn" gz="0" name="Bangbros.com" icon="bangbros" filter="Porn" screen="bangbrosGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="bangbrosFilmScreen" searchparam=""/>-->
                <plugin type="mod" modfile="porn.brazzers" confopt="showbrazzerscom" default="False" confcat="porn" gz="0" name="Brazzers.com" icon="brazzers" filter="Porn" screen="brazzersGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="brazzersFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.ddfnetwork" confopt="showddfnetworkcom" default="False" confcat="porn" gz="0" name="DDFNetwork.com" icon="ddfnetwork" filter="Porn" screen="ddfnetworkGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="ddfnetworkFilmScreen" searchparam=""/>
                <!--<plugin type="mod" modfile="porn.digitalplayground" confopt="showdigitalplaygroundcom" default="False" confcat="porn" gz="0" name="DigitalPlayground.com" icon="digitalplayground" filter="Porn" screen="digitalplaygroundGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="digitalplaygroundFilmScreen" searchparam=""/>-->
-               <plugin type="mod" modfile="porn.julesjordan" confopt="showjulesjordancom" default="False" confcat="porn" gz="0" name="JulesJordan.com" icon="julesjordan" filter="Porn" screen="julesjordanGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="julesjordanFilmScreen" searchparam=""/>
+               <!--<plugin type="mod" modfile="porn.julesjordan" confopt="showjulesjordancom" default="False" confcat="porn" gz="0" name="JulesJordan.com" icon="julesjordan" filter="Porn" screen="julesjordanGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="julesjordanFilmScreen" searchparam=""/>-->
                <plugin type="mod" modfile="porn.kink" confopt="showkinkcom" default="False" confcat="porn" gz="0" name="Kink.com" icon="kink" filter="Porn" screen="kinkGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="kinkFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.mofos" confopt="showmofoscom" default="False" confcat="porn" gz="0" name="Mofos.com" icon="mofos" filter="Porn" screen="mofosGenreScreen" param1="" param2="" search="0" delim="" searchurl="" searchscreen="" searchparam=""/>
                <!--<plugin type="mod" modfile="porn.naughtyamerica" confopt="shownaughtyamericacom" default="False" confcat="porn" gz="0" name="NaughtyAmerica.com" icon="naughtyamerica" filter="Porn" screen="naughtyamericaGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="naughtyamericaFilmScreen" searchparam=""/>-->
                <plugin type="mod" modfile="porn.nubilefilms" confopt="shownubilefilms" default="False" confcat="porn" gz="0" name="Nubilefilms.com" icon="nubilefilms" filter="Porn" screen="nubilefilmsGenreScreen" param1="" param2="" search="0" delim="" searchurl="" searchscreen="" searchparam=""/>
                <!--<plugin type="mod" modfile="porn.realitykings" confopt="showrealitykingscom" default="False" confcat="porn" gz="0" name="RealityKings.com" icon="realitykings" filter="Porn" screen="realitykingsGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="realitykingsFilmScreen" searchparam=""/>-->
                <plugin type="mod" modfile="porn.teamskeet" confopt="showteamskeetcom" default="False" confcat="porn" gz="0" name="TeamSkeet.com" icon="teamskeet" filter="Porn" screen="teamskeetGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="teamskeetFilmScreen" searchparam=""/>
-               <plugin type="mod" modfile="porn.wicked" confopt="showwickedcom" default="False" confcat="porn" gz="0" name="WickedPictures.com" icon="wickedpictures" filter="Porn" screen="wickedGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="wickedFilmScreen" searchparam=""/>
+               <!--<plugin type="mod" modfile="porn.wicked" confopt="showwickedcom" default="False" confcat="porn" gz="0" name="WickedPictures.com" icon="wickedpictures" filter="Porn" screen="wickedGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="wickedFilmScreen" searchparam=""/>-->
                <plugin type="mod" modfile="porn.cumlouder" confopt="showcumlouder" default="False" confcat="porn" gz="0" name="Cumlouder" icon="cumlouder" filter="Porn" screen="cumlouderGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="cumlouderFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.pornhub" confopt="showpornhub" default="False" confcat="porn" gz="0" name="Pornhub" icon="pornhub" filter="Porn" screen="pornhubGenreScreen" param1="" param2="" search="1" delim="+" searchurl="https://www.pornhub.com/video/search?search=%s&amp;page=" searchscreen="pornhubFilmScreen" searchparam=""/>
                <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"/>
@@ -90,6 +87,7 @@
                <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.pornxio" confopt="showlaidhub" default="False" confcat="porn" gz="0" name="LaidHub" icon="laidhub" filter="Porn" screen="pornxioGenreScreen" param1="laidhub" param2="" search="1" delim="-" searchurl="%s" searchscreen="pornxioFilmScreen" searchparam=", &quot;LaidHub.com&quot;, &quot;https://www.laidhub.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.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.porn7" confopt="showporn7" default="False" confcat="porn" gz="0" name="Porn7" icon="porn7" filter="Porn" screen="porn7GenreScreen" param1="porn7" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;Porn7.xxx&quot;, &quot;https://www.porn7.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showadultcartoons" default="False" confcat="porn" gz="0" name="AdultCartoons" icon="adultcartoons" filter="Porn" screen="porn7GenreScreen" param1="adultcartoons" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;AdultCartoons.com&quot;, &quot;https://www.adultcartoons.com&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showmoviesand" default="False" confcat="porn" gz="0" name="Moviesand" icon="moviesand" filter="Porn" screen="porn7GenreScreen" param1="moviesand" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;Moviesand.com&quot;, &quot;https://www.moviesand.com&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showbabestube" default="False" confcat="porn" gz="0" name="Babestube" icon="babestube" filter="Porn" screen="porn7GenreScreen" param1="babestube" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;Babestube.com&quot;, &quot;https://www.babestube.com&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showinterracial" default="False" confcat="porn" gz="0" name="Interracial" icon="interracial" filter="Porn" screen="porn7GenreScreen" param1="interracial" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;Interracial.com&quot;, &quot;https://www.interracial.com&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showdeviants" default="False" confcat="porn" gz="0" name="Deviants" icon="deviants" filter="Porn" screen="porn7GenreScreen" param1="deviants" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;Deviants.com&quot;, &quot;https://www.deviants.com&quot;"/>
+               <plugin type="mod" modfile="porn.porn7" confopt="showvoyeurporno" default="False" confcat="porn" gz="0" name="VoyeurPorno" icon="voyeurporno" filter="Porn" screen="porn7GenreScreen" param1="voyeurporno" param2="" search="1" delim="-" searchurl="%s" searchscreen="porn7FilmScreen" searchparam=", &quot;VoyeurPorno.com&quot;, &quot;https://www.voyeurporno.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.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.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;"/>
index 0b2c561..f9eb2a5 100644 (file)
@@ -430,7 +430,7 @@ class twitchGames(MPScreen):
                                f1 = open(fn, 'w')
                                while j < l:
                                        if j != i:
-                                               (Title, x1, x2, Name, x3, x4, Id) = self.gameList[j]
+                                               (Title, x1, x2, Name, x3, x4, Id, Status) = self.gameList[j]
                                                f1.write('"%s" "%s" "%s"\n' % (Title, Name, Id))
                                        j += 1
                                f1.close()
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/netflix.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/netflix.py
new file mode 100644 (file)
index 0000000..20d8e21
--- /dev/null
@@ -0,0 +1,125 @@
+# -*- 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 *
+
+try:
+    from Plugins.GP4.geminibrowser.gbrowserWidget import gMoviePlayer
+    GeminiPlayerFound = True
+except:
+    GeminiPlayerFound = False
+
+default_cover = "file://%s/netflix.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+
+class netflixScreen(MPScreen):
+
+       def __init__(self, session):
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "0"             : self.closeAll,
+                       "ok"    : self.keyOK,
+                       "cancel": self.keyCancel
+               }, -1)
+
+               self['title'] = Label("Netflix")
+
+               self.filmliste = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+               self.StartTimer = eTimer()
+               self.keyLocked = True
+
+               self.onLayoutFinish.append(self.start)
+
+       def start(self):
+               self.filmliste.append(("",))
+               if mp_globals.model in ["one","two"]:
+                       try:
+                               self.player_org = config.vod.netflix.player.value
+                       except:
+                               pass
+                       try:
+                               username = config.vod.netflix.username.value
+                               password = config.vod.netflix.password.value
+                       except:
+                               username = ''
+                               password = ''
+                       if username != '' and password != '':
+                               self.StartTimer_conn = self.StartTimer.timeout.connect(self.keyOK)
+                               self.StartTimer.start(1000, False)
+                               self.filmliste.append((_("Please wait while we launch Netflix..."),))
+                               self.keyLocked = False
+                       else:
+                               self.filmliste.append((_("Please configure your login data first!"),))
+                               self['handlung'].setText(_("Please configure your login data first via VideoOnDemand plugin in extensions menu.")+"\n\n"+_("Note: Your login data has to be stored else this plugin will not work."))
+               else:
+                       self.filmliste.append((_("This plugin is only available for Dreambox One and Two!"),))
+                       self['handlung'].setText('')
+               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self.ml.moveToIndex(0)
+               self.ml.selectionEnabled(False)
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               self.StartTimer.stop()
+               try:
+                       from Plugins.Extensions.VOD.plugin import Plugins
+                       config.vod.netflix.tmpdir = ConfigDirectory('/tmp')
+                       config.vod.netflix.lastsearch = ConfigText(default='', fixed_size=False)
+                       config.vod.netflix.remove_tmpdir = ConfigOnOff(default=True)
+                       config.vod.netflix.player = ConfigSelection(default='SIMPLE_PL', choices=[('SIMPLE_PL', 'MediaPortal')])
+                       from Plugins.Extensions.NetflixVod.netflixmain import NetflixMain
+                       from Plugins.Extensions.MediaPortal.plugin import _stylemanager
+                       _stylemanager(0)
+                       self.session.openWithCallback(self.netflixClose, NetflixMain)
+               except:
+                       self.session.openWithCallback(self.netflixClose, MessageBoxExt, _("Launching Netflix failed!"), MessageBoxExt.TYPE_ERROR, timeout=5)
+
+       def netflixClose(self):
+               from Plugins.Extensions.MediaPortal.plugin import _stylemanager
+               _stylemanager(1)
+               menu = [('DREAMOS_PL', 'Dreamos'), ('SIMPLE_PL', 'Mediaportal')]
+               if GeminiPlayerFound:
+                       menu.append(('GEMINI_PL', 'Gemini'))
+               config.vod.netflix.player = ConfigSelection(default='DREAMOS_PL', choices=menu)
+               try:
+                       config.vod.netflix.player.value = self.player_org
+               except:
+                       pass
+               self.keyCancel()
\ No newline at end of file
index 1bd3caa..a4e7bc5 100644 (file)
@@ -73,7 +73,7 @@ class netzKinoGenreScreen(MPScreen):
                self.genreliste.append(('Letzte Chance - Nur noch kurze Zeit verfügbar', 'letzte-chance'))
                self.genreliste.append(('Top 20', 'top-20-frontpage'))
                self.genreliste.append(('Beliebte Animes', 'beliebte-animes'))
-               self.genreliste.append(('Kurzfilme', 'frontpage-kurzfilme'))
+               #self.genreliste.append(('Kurzfilme', 'frontpage-kurzfilme'))
                self.genreliste.append(('Starkino', 'starkino-frontpage'))
                self.genreliste.append(('Themenkino', 'themenkino-frontpage'))
                self.genreliste.append(('HD-Kino', 'hdkino'))
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/redbull.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/redbull.py
deleted file mode 100644 (file)
index c2b05af..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-# -*- 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 *
-
-default_cover = "file://%s/redbull.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-base_url ="https://api.redbull.tv/v3/"
-rb_token = None
-
-def _header():
-       header = {}
-       header['Accept'] = 'application/json, text/plain, */*'
-       header['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'
-       header['Accept-Encoding'] = 'deflate'
-       header['Referer'] = 'https://www.redbull.tv/'
-       header['Origin'] = 'https://www.redbull.tv'
-       header['Host'] = 'api.redbull.tv'
-       if rb_token:
-               header['Authorization'] = rb_token
-       return header
-
-class RBtvGenreScreen(MPScreen):
-
-       def __init__(self, session, name="", url=None, level=0, image=None):
-               self.name = name
-               self.url = url
-               self.level = level
-               self.image = image
-
-               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("Red Bull TV")
-               self['ContentTitle'] = Label("Genre: %s" % self.name)
-               self.keyLocked = True
-               self.offset = 0
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-
-               self.onLayoutFinish.append(self.getToken)
-
-       def getToken(self):
-               self['name'].setText(_("Please wait..."))
-               if rb_token and self.url:
-                       url = self.url  + "?offset=%s&limit=20" % self.offset
-                       getPage(url, headers=_header()).addCallback(self.getGenre).addErrback(self.dataError)
-               else:
-                       url = base_url + "session?category=personal_computer&os_family=http"
-                       getPage(url, headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}).addCallback(self.parseToken).addErrback(self.dataError)
-
-       def parseToken(self, data):
-               global rb_token
-               rb_token = re.findall('token":"(.*?)"', data, re.S)[0]
-               url = base_url + "products/channels"
-               getPage(url, headers=_header()).addCallback(self.getGenre).addErrback(self.dataError)
-
-       def getGenre(self, data):
-               json_data = json.loads(data)
-               if json_data.has_key('collections'):
-                       if len(json_data["collections"]) > 0:
-                               if self.level > 2:
-                                       title = str(json_data["title"])
-                                       if json_data.has_key('duration'):
-                                               duration = str(json_data["duration"])
-                                       else:
-                                               duration = None
-                                       if json_data.has_key('long_description'):
-                                               descr = str(json_data["long_description"])
-                                       elif json_data.has_key('short_description'):
-                                               descr = str(json_data["short_description"])
-                                       else:
-                                               descr = ""
-                                       if json_data.has_key('subheading'):
-                                               subtitle = str(json_data["subheading"])
-                                               title = title + " - " + subtitle
-                                       if "/video/" in str(json_data["share_url"]):
-                                               url = str(json_data["share_url"])
-                                       else:
-                                               url = "https://www.redbull.tv/video/%s" % str(json_data["links"][0]["id"])
-                                       image = "https://resources.redbull.tv/%s/rbtv_display_art_landscape/im:i:w_500,q_70" % str(json_data["id"])
-                                       self.genreliste.append((title, url, image, 5, True, descr, duration))
-                               for item in json_data["collections"]:
-                                       if self.level == 0:
-                                               title = str(item["label"])
-                                               url = base_url + "collections/" + str(item["id"])
-                                               if title != "Featured Channels":
-                                                       self.genreliste.append((title, url, default_cover, 1, False, "", None))
-                                       elif self.level == 2:
-                                               title = str(item["label"])
-                                               url = base_url + "collections/" + str(item["id"])
-                                               if title != "Related Channels":
-                                                       if title != "Upcoming Live Events":
-                                                               self.genreliste.append((title, url, self.image, 3, False, "", None))
-                                       else:
-                                               title = str(item["label"])
-                                               url = base_url + "collections/" + str(item["id"])
-                                               self.genreliste.append((title, url, default_cover, 5, False, "", None))
-                       else:
-                               title = str(json_data["title"])
-                               if json_data.has_key('duration'):
-                                       duration = str(json_data["duration"])
-                               else:
-                                       duration = None
-                               if json_data.has_key('long_description'):
-                                       descr = str(json_data["long_description"])
-                               elif json_data.has_key('short_description'):
-                                       descr = str(json_data["short_description"])
-                               else:
-                                       descr = ""
-                               if json_data.has_key('subheading'):
-                                       subtitle = str(json_data["subheading"])
-                                       title = title + " - " + subtitle
-                               if "/video/" in str(json_data["share_url"]):
-                                       url = str(json_data["share_url"])
-                               else:
-                                       url = "https://www.redbull.tv/video/%s" % str(json_data["links"][0]["id"])
-                               image = "https://resources.redbull.tv/%s/rbtv_display_art_landscape/im:i:w_500,q_70" % str(json_data["id"])
-                               self.genreliste.append((title, url, image, 5, True, descr, duration))
-               elif json_data.has_key('items'):
-                       if self.level == 1:
-                               for item in json_data["items"]:
-                                       title = str(item["title"])
-                                       if self.name == "Formats":
-                                               img = "background"
-                                       else:
-                                               img = "display_art"
-                                       url = base_url + "products/" + str(item["id"])
-                                       image = "https://resources.redbull.tv/%s/rbtv_%s_landscape/im:i:w_400,q_70" % (str(item["id"]), img)
-                                       self.genreliste.append((title, url, image, 2, False, "", None))
-                       else:
-                               for item in json_data["items"]:
-                                       title = str(item["title"])
-                                       if item.has_key('duration'):
-                                               duration = str(item["duration"])
-                                       else:
-                                               duration = None
-                                       if item.has_key('long_description'):
-                                               descr = str(item["long_description"])
-                                       elif item.has_key('short_description'):
-                                               descr = str(item["short_description"])
-                                       else:
-                                               descr = ""
-                                       if item.has_key('subheading'):
-                                               subtitle = str(item["subheading"])
-                                               title = title + " - " + subtitle
-                                       if "/video/" in str(item["share_url"]):
-                                               url = str(item["share_url"])
-                                               play = True
-                                       else:
-                                               if str(json_data["item_type"]) == "video":
-                                                       play = True
-                                                       url = "https://www.redbull.tv/video/%s" % str(item["id"])
-                                               else:
-                                                       url = base_url + "products/" + str(item["id"])
-                                                       play = False
-                                       image = "https://resources.redbull.tv/%s/rbtv_display_art_landscape/im:i:w_500,q_70" % str(item["id"])
-                                       self.genreliste.append((title, url, image, 4, play, descr, duration))
-               if json_data.has_key('meta'):
-                       total = json_data["meta"]["total"]
-                       offset = json_data["meta"]["offset"]
-                       if total > offset:
-                               self.offset += 20
-                               self.getToken()
-                       else:
-                               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-                               self.keyLocked = False
-                               self.showInfos()
-               else:
-                       self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-                       self.keyLocked = False
-                       self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               descr = self['liste'].getCurrent()[0][5]
-               runtime = self['liste'].getCurrent()[0][6]
-               if runtime:
-                       m, s = divmod(int(runtime)/1000, 60)
-                       h, m = divmod(m, 60)
-                       runtime = _("Runtime:") + " %02d:%02d:%02d\n\n" % (h, m, s)
-               else:
-                       runtime = ""
-               self['name'].setText(title)
-               self['handlung'].setText(runtime+descr)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               name = self['liste'].getCurrent()[0][0]
-               url = self['liste'].getCurrent()[0][1]
-               image = self['liste'].getCurrent()[0][2]
-               level = self['liste'].getCurrent()[0][3]
-               play = self['liste'].getCurrent()[0][4]
-               if play:
-                       self['name'].setText(_('Please wait...'))
-                       getPage(url).addCallback(self.loadm3u8).addErrback(self.dataError)
-               else:
-                       self.session.open(RBtvGenreScreen, name, url, level, image)
-
-       def loadm3u8(self, data):
-               self.keyLocked = True
-               url = re.findall('video_product":{"url":"(.*?)"', data, re.S)
-               if not url:
-                       self.session.open(MessageBoxExt, _("This event is not yet available."), MessageBoxExt.TYPE_INFO, timeout=3)
-                       self.keyLocked = False
-               else:
-                       getPage(url[0]).addCallback(self.loadplaylist).addErrback(self.dataError)
-
-       def loadplaylist(self, data):
-               self.bandwith_list = []
-               match_sec_m3u8=re.findall('BANDWIDTH=(.*?),.*?RESOLUTION=(.*?),.*?(https://.*?m3u8)', data, re.S)
-               max = 0
-               for x in match_sec_m3u8:
-                       if int(x[0]) > max:
-                               max = int(x[0])
-               videoPrio = int(config_mp.mediaportal.videoquali_others.value)
-               if videoPrio == 2:
-                       bw = max
-               elif videoPrio == 1:
-                       bw = max/2
-               else:
-                       bw = max/3
-               for each in match_sec_m3u8:
-                       bandwith,resolution,url = each
-                       self.bandwith_list.append((int(bandwith),url))
-               _x, best = min((abs(int(x[0]) - bw), x) for x in self.bandwith_list)
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               self.keyLocked = False
-               self.session.open(SimplePlayer, [(title, best[1])], showPlaylist=False, ltype='redbulltv')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/seventv.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/seventv.py
deleted file mode 100644 (file)
index 86f4d80..0000000
+++ /dev/null
@@ -1,403 +0,0 @@
-# -*- 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 _, grabpage, downloadPage
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.twagenthelper import twAgentGetPage
-
-BASE_URL = "http://www.7tv.de"
-sevenAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-sevenCookies = CookieJar()
-default_cover = "file://%s/seventv.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class sevenFirstScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session):
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "5" : self.keyShowThumb,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("7TV")
-               self['ContentTitle'] = Label(_("Stations:"))
-               self['name'] = Label(_("Selection:"))
-
-               self.keyLocked = True
-               self.senderliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               twAgentGetPage(BASE_URL, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               stations = re.findall('<li class="brandgrid-item"><a class="brandgrid-link brandgrid-[A-Za-z0-9\s]+" title="[A-Za-z0-9\s]+" href="/[A-Za-z0-9\s]+">(.*?)</a></li>', data, re.S)
-               self.senderliste.append(("ProSieben", "ProSieben"))
-               self.senderliste.append(("SAT.1", "SAT.1"))
-               self.senderliste.append(("kabel eins", "kabel%20eins"))
-               self.senderliste.append(("sixx", "sixx"))
-               self.senderliste.append(("ProSieben MAXX", "ProSieben%20MAXX"))
-               self.senderliste.append(("SAT.1 Gold", "SAT.1%20Gold"))
-               self.senderliste.append(("kabel eins Doku", "kabel%20eins%20Doku"))
-               if "DMAX" in stations:
-                       self.senderliste.append(("DMAX", "DMAX"))
-               if "TLC" in stations:
-                       self.senderliste.append(("TLC", "TLC"))
-               if "Eurosport" in stations:
-                       self.senderliste.append(("Eurosport", "Eurosport"))
-               self.ml.setList(map(self._defaultlistcenter, self.senderliste))
-               self.keyLocked = False
-               self.th_ThumbsQuery(self.senderliste, 0, 1, 2, None, None, 1, 1, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               CoverHelper(self['coverArt']).getCover(default_cover)
-               Name = self['liste'].getCurrent()[0][0]
-               self['name'].setText(_("Selection:") + " " + Name)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(sevenGenreScreen, Link, Name)
-
-class sevenGenreScreen(MPScreen):
-
-       def __init__(self, session, Link, Name):
-               self.Link = Link
-               self.Name = Name
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("7TV")
-               self['ContentTitle'] = Label(_("Selection:"))
-               self['name'] = Label(_("Selection:") + " " + self.Name)
-
-               self.genreliste = []
-               self.keyLocked = True
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               url = BASE_URL + "/queue/format/(brand)/" + self.Link
-               twAgentGetPage(url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData).addErrback(self.dataError)
-
-       def parseData(self, data):
-               json_data = json.loads(data)
-               for node in json_data["facet"]:
-                       self.genreliste.append((str(node).upper(), str(node).upper().replace('#','0-9')))
-               self.genreliste.sort(key=lambda t : t[0].lower())
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               Name = self['liste'].getCurrent()[0][0]
-               self['name'].setText(_("Selection:") + " " + self.Name + ":" + Name)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(sevenSubGenreScreen, Link, Name, self.Link)
-
-class sevenSubGenreScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, Link, Name, TopLink):
-               self.Link = Link
-               self.Name = Name
-               self.TopLink = TopLink
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "5" : self.keyShowThumb,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("7TV")
-               self['ContentTitle'] = Label(_("Selection:"))
-               self['name'] = Label(_("Selection:") + " " + self.Name)
-
-               self.keyLocked = True
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               url = BASE_URL + "/queue/format/(brand)/" + self.TopLink + "/(letter)/" + self.Link
-               twAgentGetPage(url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData).addErrback(self.dataError)
-
-       def parseData(self, data):
-               sevendata = json.loads(data.replace('\u0096','-'))
-               for node in sevendata["entries"]:
-                       url = BASE_URL + "/" + str(node["url"])
-                       title = str(node["title"])
-                       if title == "17 Meter":
-                               image = str(node["images"][0]["url"])
-                       else:
-                               image = str(node["images"][0]["url"]).replace('300x160','940x528')
-                       self.filmliste.append((title, url, image))
-               self.filmliste.sort(key=lambda t : t[0].lower())
-               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
-               self.keyLocked = False
-               self.th_ThumbsQuery(self.filmliste, 0, 1, 2, None, None, 1, 1, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               Image = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(Image)
-               Name = self['liste'].getCurrent()[0][0]
-               self['name'].setText(_("Selection:") + " " + self.Name + ":" + Name)
-
-       def keyOK(self):
-               exist = self['liste'].getCurrent()
-               if self.keyLocked or exist == None:
-                       return
-               Name = self.Name + ":" + self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               Image = self['liste'].getCurrent()[0][2]
-               if Link:
-                       self.session.open(sevenStreamScreen, Link, Name, Image)
-
-class sevenStreamScreen(MPScreen):
-
-       def __init__(self, session, Link, Name, Image):
-               self.Link = Link
-               self.Name = Name
-               self.Image = Image
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("7TV")
-               self['name'] = Label(_("Selection:") + " " + self.Name)
-
-               self.keyLocked = True
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self, x=0, ajax=None):
-               if x == 0:
-                       if ajax:
-                               url = ajax
-                       else:
-                               url = self.Link + "/ganze-folgen"
-                       self['ContentTitle'].setText(_("Episodes:"))
-               else:
-                       if ajax:
-                               url = ajax
-                       else:
-                               url = self.Link + "/alle-clips"
-                       self['ContentTitle'].setText(_("Clips:"))
-               twAgentGetPage(url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData, x).addErrback(self.dataError)
-
-       def parseData(self, data, x):
-               articles = re.findall("<article class(.*?)</article>", data, re.S)
-               ajax = re.findall('data-ajax-more="(.*?)"', data, re.S)
-               if articles:
-                       for node in articles:
-                               episodes = re.findall('href="(.*?)".*?data-src="(.*?)".*?teaser-title">(.*?)</h5>', node, re.S)
-                               if episodes:
-                                       for (url, img, title) in episodes:
-                                               if not url.startswith('http'):
-                                                       url = BASE_URL + url
-                                               img = img.replace('300x160','940x528')
-                                               self.filmliste.append((title, url, img))
-               if ajax:
-                       url = BASE_URL + ajax[0]
-                       self.loadPage(x, url)
-                       return
-               if len(self.filmliste) == 0:
-                       if x == 1:
-                               CoverHelper(self['coverArt']).getCover(self.Image)
-                               self.filmliste.append((_('Currently no episodes/clips available!'), None, None))
-                               self.ml.setList(map(self._defaultlistleft, self.filmliste))
-                       else:
-                               self.loadPage(1)
-               else:
-                       self.ml.setList(map(self._defaultlistleft, self.filmliste))
-                       self.keyLocked = False
-                       self.showInfos()
-
-       def showInfos(self):
-               self['handlung'].setText("")
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               Cover = self['liste'].getCurrent()[0][2]
-               self['name'].setText(_("Selection:") + " " + self.Name + ":" + Name)
-               CoverHelper(self['coverArt']).getCover(Cover)
-               if Link:
-                       twAgentGetPage(Link, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseInfos).addErrback(self.dataError)
-
-       def parseInfos(self, data):
-               resources = re.findall('contentResources =\s\[(.*?}}})(?:\]|,{"tvShowTitle|,{"sourceCompany)', data, re.S)
-               if resources:
-                       json_data = json.loads(resources[0])
-                       descr = "\n" + str(json_data["teaser"]["description"])
-               else:
-                       descr = ""
-               duration = re.findall('name="video_duration" content="(.*?)">', data, re.S)
-               date = re.findall('name="date" content="(.*?)">', data, re.S)
-               season = re.findall('property="video:series_number" content="(.*?)">', data, re.S)
-               episode = re.findall('property="video:episode_number" content="(.*?)">', data, re.S)
-
-               if duration:
-                       runtime = "Laufzeit: " + duration[0] + "\n"
-               else:
-                       runtime = ""
-
-               if date:
-                       date = re.findall('(\d{4})-(\d{2})-(\d{2})T(.*?)\+', date[0])
-                       date = date[0][2] + "." + date[0][1] + "." + date[0][0] + ", " + date[0][3]
-                       date = "Datum: " + date + "\n"
-               else:
-                       date = ""
-
-               if season and episode:
-                       epi = "Staffel: " + season[0] + "\nEpisode: " + episode[0] + "\n"
-               else:
-                       epi = ""
-
-               self['handlung'].setText(date+runtime+epi+descr)
-
-       def keyOK(self):
-               exist = self['liste'].getCurrent()
-               if self.keyLocked or exist == None:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               if Link:
-                       twAgentGetPage(Link, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData2, Link).addErrback(self.dataError)
-
-       def parseData2(self, data, client_location, web=False):
-               self.client_location = client_location
-               cid = re.findall('"cid":(\d+),', data, re.S)
-               if cid:
-                       self.video_id = cid[0]
-                       if web: # fallback sources website
-                               self.access_token = 'seventv-web'
-                               self.client_name = ''
-                               self.salt = '01!8d8F_)r9]4s[qeuXfP%'
-                       else: # HD sources hbbtv
-                               self.access_token = 'hbbtv'
-                               self.client_name = 'hbbtv'
-                               self.salt = '01ree6eLeiwiumie7ieV8pahgeiTui3B'
-                       json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s?access_token=%s&client_location=%s&client_name=%s' % (self.video_id, self.access_token, client_location, self.client_name)
-                       twAgentGetPage(json_url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData3).addErrback(self.dataError)
-
-       def parseData3(self, data):
-               json_data = json.loads(data)
-               self.source_id = 0
-               if json_data["is_protected"]:
-                       message = self.session.open(MessageBoxExt, _("This episode/clip can't be played it's protected with DRM."), MessageBoxExt.TYPE_INFO, timeout=5)
-                       return
-               else:
-                       for stream in json_data['sources']:
-                               if stream['mimetype'] == 'video/mp4':
-                                       if int(self.source_id) < int(stream['id']):
-                                               self.source_id = stream['id']
-               client_id_1 = self.salt[:2] + hashlib.sha1(''.join([str(self.video_id), self.salt, self.access_token, self.client_location, self.salt, self.client_name]).encode('utf-8')).hexdigest()
-               json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources?access_token=%s&client_location=%s&client_name=%s&client_id=%s' % (self.video_id, self.access_token, self.client_location, self.client_name, client_id_1)
-               twAgentGetPage(json_url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData4).addErrback(self.dataError)
-
-       def parseData4(self, data):
-               json_data = json.loads(data)
-               server_id = json_data['server_id']
-               client_id = self.salt[:2] + hashlib.sha1(''.join([self.salt, self.video_id, self.access_token, server_id, self.client_location, str(self.source_id), self.salt, self.client_name]).encode('utf-8')).hexdigest()
-               json_url = 'http://vas.sim-technik.de/vas/live/v2/videos/%s/sources/url?%s' % (self.video_id, urllib.urlencode({'access_token': self.access_token, 'client_id': client_id, 'client_location': self.client_location, 'client_name': self.client_name, 'server_id': server_id, 'source_ids': str(self.source_id),}))
-               twAgentGetPage(json_url, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData5).addErrback(self.dataError)
-
-       def parseData5(self, data):
-               json_data = json.loads(data)
-               if int(json_data["status_code"]) == 14:
-                       Link = self['liste'].getCurrent()[0][1]
-                       twAgentGetPage(Link, agent=sevenAgent, cookieJar=sevenCookies).addCallback(self.parseData2, Link, web=True).addErrback(self.dataError)
-               else:
-                       max_bw = -1
-                       stream_url = ''
-                       for stream in json_data["sources"]:
-                               url = stream["url"]
-                               bw = int(stream["bitrate"])
-                               if max_bw < bw:
-                                       max_bw = bw
-                                       stream_url = str(url)
-                       if stream_url:
-                               mp_globals.player_agent = sevenAgent
-                               Name = self['liste'].getCurrent()[0][0]
-                               self.session.open(SimplePlayer, [(Name, stream_url)], showPlaylist=False, ltype='7tv')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/videogold_de.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/videogold_de.py
deleted file mode 100644 (file)
index c859917..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-# -*- 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.youtubeplayer import YoutubePlayer
-from Plugins.Extensions.MediaPortal.resources.menuhelper import MenuHelper
-from Plugins.Extensions.MediaPortal.additions.mediatheken.youtube import YT_ListScreen
-from Plugins.Extensions.MediaPortal.resources.twagenthelper import twAgentGetPage
-
-default_cover = "file://%s/videogold_de.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class show_VGDE_Genre(MenuHelper):
-
-       def __init__(self, session):
-               baseUrl = "https://videogold.de"
-               MenuHelper.__init__(self, session, 0, None, baseUrl, "", self._defaultlistcenter, default_cover=default_cover)
-
-               self['title'] = Label("VideoGold.de")
-               self['ContentTitle'] = Label("Genres")
-
-               self.onLayoutFinish.append(self.mh_initMenu)
-
-       def mh_parseCategorys(self, data):
-               themes = ['Nach Format','Nach Thema']
-               menu_marker = 'class="menu"'
-               excludes = ['/livestreams','/videos-eintragen','/wp-login']
-               menu=self.scanMenu(data,menu_marker,themes=themes,base_url=self.mh_baseUrl,url_ex=excludes)
-               self.mh_genMenu2(menu)
-
-       def mh_callGenreListScreen(self):
-               genreurl = self.mh_genreUrl[self.mh_menuLevel].replace('&#038;','&')
-               if not genreurl.startswith('https'):
-                       genreurl = self.mh_baseUrl+genreurl
-               self.session.open(VGDE_FilmListeScreen, genreurl, self.mh_genreTitle)
-
-class VGDE_FilmListeScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, genreLink, genreName):
-               self.genreLink = genreLink
-               self.genreName = genreName
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "5" : self.keyShowThumb,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown,
-                       "0" : self.closeAll
-               }, -1)
-
-               self['title'] = Label("VideoGold.de")
-               self['ContentTitle'] = Label(genreName)
-               self['Page'] = Label(_("Page:"))
-
-               self.keyLocked = True
-               self.dokusListe = []
-               self.page = 1
-               self.lastpage = 1
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-               if '/?' in self.genreLink:
-                       self.genreLink = self.genreLink.replace('/?', '/seite/%d/?', 1)
-               else:
-                       self.genreLink += "/seite/%d/"
-
-       def loadPage(self):
-               self['name'].setText(_('Please wait...'))
-               self.dokusListe = []
-               self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-               url = self.genreLink % max(self.page,1)
-               twAgentGetPage(url, timeout=60).addCallback(self.loadPageData).addErrback(self.dataError)
-
-       def loadPageData(self, data):
-               for m in re.finditer('<article id=(.*?)</article>', data, re.S):
-                       m2 = re.search('<a href="(.*?)" title="(.*?)">.*?data-lazy-src="(.*?)".*?<p>(.*?)</p>', m.group(1), re.S)
-                       if m2:
-                               url, nm, img, desc = m2.groups()
-                               self.dokusListe.append((decodeHtml(nm), url, img, decodeHtml(desc)))
-               if self.dokusListe:
-                       self.getLastPage(data, "class='wp-pagenavi'(.*?)</div>")
-
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       self['liste'].moveToIndex(0)
-                       self.th_ThumbsQuery(self.dokusListe,0,1,2,None,None, self.page, self.lastpage, mode=1)
-                       self.showInfos()
-               else:
-                       self.dokusListe.append((_("No dokus found!"),"","",""))
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       self['liste'].moveToIndex(0)
-                       self.showInfos()
-
-       def showInfos(self):
-               streamName = self['liste'].getCurrent()[0][0]
-               self['name'].setText(streamName)
-               desc = self['liste'].getCurrent()[0][3]
-               self['handlung'].setText(desc)
-               streamPic = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt'], self.ShowCoverFileExit).getCover(streamPic)
-
-       def parseYTStream(self, data):
-               m2 = re.search('//www.youtube.*?com/(embed|v|p)/(.*?)(\?|" |&amp)', data)
-               url = None
-               if m2:
-                       dhVideoId = m2.group(2)
-                       if 'p' == m2.group(1):
-                               url = 'gdata.youtube.com/feeds/api/playlists/PL'+dhVideoId+'?'
-               else:
-                       m2 = re.search('//youtu.be/(.*?)"', data)
-                       if m2:
-                               dhVideoId = m2.group(1)
-               if m2:
-                       dhTitle = self['liste'].getCurrent()[0][0]
-                       if url:
-                               url = 'gdata.youtube.com/feeds/api/playlists/PL'+dhVideoId+'?'
-                               self.session.open(YT_ListScreen, url, dhTitle, title="videogold")
-                       else:
-                               self.session.open(YoutubePlayer, [(dhTitle, dhVideoId, None)], showPlaylist=False)
-
-       def keyOK(self):
-               if (self.keyLocked|self.eventL.is_set()):
-                       return
-               streamLink = self['liste'].getCurrent()[0][1]
-               twAgentGetPage(streamLink, timeout=60).addCallback(self.parseYTStream).addErrback(self.dataError)
\ No newline at end of file
index 0565df4..07b9769 100644 (file)
@@ -40,6 +40,8 @@ from Plugins.Extensions.MediaPortal.resources.youtubeplayer import YoutubePlayer
 
 default_cover = "file://%s/urknall.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
+agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
+
 class UrknallFilmListeScreen(MPScreen, ThumbsHelper):
 
        def __init__(self, session):
@@ -72,7 +74,7 @@ class UrknallFilmListeScreen(MPScreen, ThumbsHelper):
                self.keyLocked = True
                self['name'].setText(_('Please wait...'))
                url = "https://www.urknall-weltall-leben.de/media/com_jamegafilter/de_de/1.json"
-               getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(url, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
                from collections import OrderedDict
@@ -105,7 +107,7 @@ class UrknallFilmListeScreen(MPScreen, ThumbsHelper):
                CoverHelper(self['coverArt']).getCover(pic)
                url = self['liste'].getCurrent()[0][1]
                self['handlung'].setText('Länge: %s min\nSchwierigkeit: %s' % (length,severity))
-               getPage(url).addCallback(self.showInfos2).addErrback(self.dataError)
+               getPage(url, agent=agent).addCallback(self.showInfos2).addErrback(self.dataError)
 
        def showInfos2(self, data):
                parse = re.search('class="itemIntroText">(.*?)</div>', data, re.S)
@@ -121,7 +123,7 @@ class UrknallFilmListeScreen(MPScreen, ThumbsHelper):
                url = self['liste'].getCurrent()[0][1]
                if url:
                        self.keyLocked = True
-                       getPage(url).addCallback(self.getlink).addErrback(self.dataError)
+                       getPage(url, agent=agent).addCallback(self.getlink).addErrback(self.dataError)
 
        def getlink(self, data):
                parse = re.findall('www.*?(?:-nocookie|-gdprlock|)(?:.com|)/(v|embed)/(.*?)"', data, re.S)
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/hdporn.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/hdporn.py
deleted file mode 100644 (file)
index 443177f..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-# -*- 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 *
-
-default_cover = "file://%s/hdporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class hdpornGenreScreen(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,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("HDPorn.net")
-               self['ContentTitle'] = Label("Genre:")
-
-               self.keyLocked = True
-               self.suchString = ''
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.keyLocked = True
-               url = "http://www.hdporn.net/channels/"
-               getPage(url).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('class="content">.*?href="(.*?)".*?src="(.*?)".*?alt="(.*?)"', data, re.S)
-               if Cats:
-                       for (Url, Image, Title) in Cats:
-                               self.genreliste.append((Title, Url, Image))
-                       self.genreliste.sort()
-                       self.genreliste.insert(0, ("Top Rated", "/top-rated/", default_cover))
-                       #self.genreliste.insert(0, ("Most Popular", "/most-viewed/", default_cover))
-                       self.genreliste.insert(0, ("Newest", "/", 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]
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(hdpornFilmScreen, Link, Name)
-
-class hdpornFilmScreen(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("HDPorn.net")
-               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 = []
-               url = "http://www.hdporn.net%s/page%s.html" % (self.Link, str(self.page))
-               getPage(url).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'id="pagination">(.*?)</div>')
-               Movies = re.findall('class="content.*?<a\s+href="(.*?)"\stitle="(.*?)".*?class="img-responsive.*?src="(.*?)".*?TIME:\s\s(.*?)</div>', data, re.S)
-               if Movies:
-                       for (Url, Title, Image, Runtime) in Movies:
-                               Url = "http://www.hdporn.net%s" % Url
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_("No videos found!"), "", "", ""))
-               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]
-               self['name'].setText(title)
-               self['handlung'].setText("Runtime: %s" % (runtime))
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               self.keyLocked = True
-               getPage(Link).addCallback(self.getVideoPage).addErrback(self.dataError)
-
-       def getVideoPage(self, data):
-               videoPage = re.findall('<source\ssrc="(.*?)"', data, re.S)
-               if videoPage:
-                       for url in videoPage:
-                               self.keyLocked = False
-                               Title = self['liste'].getCurrent()[0][0]
-                               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='hdporn')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porn7.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porn7.py
new file mode 100644 (file)
index 0000000..0892301
--- /dev/null
@@ -0,0 +1,307 @@
+# -*- 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 porn7GenreScreen(MPScreen):
+
+       def __init__(self, session, mode):
+               self.mode = mode
+
+               global default_cover
+               if self.mode == "porn7":
+                       self.portal = "Porn7.xxx"
+                       self.baseurl = "https://www.porn7.xxx"
+                       default_cover = "file://%s/porn7.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "adultcartoons":
+                       self.portal = "AdultCartoons.com"
+                       self.baseurl = "https://www.adultcartoons.com"
+                       default_cover = "file://%s/adultcartoons.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "moviesand":
+                       self.portal = "Moviesand.com"
+                       self.baseurl = "https://www.moviesand.com"
+                       default_cover = "file://%s/moviesand.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "babestube":
+                       self.portal = "Babestube.com"
+                       self.baseurl = "https://www.babestube.com"
+                       default_cover = "file://%s/babestube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "interracial":
+                       self.portal = "Interracial.com"
+                       self.baseurl = "https://www.interracial.com"
+                       default_cover = "file://%s/interracial.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "deviants":
+                       self.portal = "Deviants.com"
+                       self.baseurl = "https://www.deviants.com"
+                       default_cover = "file://%s/deviants.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "voyeurporno":
+                       self.portal = "VoyeurPorno.com"
+                       self.baseurl = "https://www.voyeurporno.com"
+                       default_cover = "file://%s/voyeurporno.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.extcat = []
+               self.maincat = []
+               if self.mode == "porn7":
+                       self.maincat.insert(0, ("Longest", "longest#duration", default_cover))
+                       self.maincat.insert(0, ("Most Favorited", "new#most_favourited", default_cover))
+                       self.maincat.insert(0, ("Most Commented", "new#most_commented", default_cover))
+                       self.maincat.insert(0, ("Featured", "featured#ctr", default_cover))
+                       self.maincat.insert(0, ("Top Rated", "rated#rating", default_cover))
+                       self.maincat.insert(0, ("Most Viewed", "popular#video_viewed", default_cover))
+                       self.maincat.insert(0, ("Newest", "new#post_date", default_cover))
+                       self.maincat.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               else:
+                       self.maincat.insert(0, ("Longest", "longest#duration", default_cover))
+                       self.maincat.insert(0, ("Most Favorited", "latest-updates#most_favourited", default_cover))
+                       self.maincat.insert(0, ("Most Commented", "latest-updates#most_commented", default_cover))
+                       self.maincat.insert(0, ("Featured", "new#ctr", default_cover))
+                       self.maincat.insert(0, ("Top Rated", "top-rated#rating", default_cover))
+                       self.maincat.insert(0, ("Most Viewed", "most-popular#video_viewed", default_cover))
+                       self.maincat.insert(0, ("Newest", "latest-updates#post_date", default_cover))
+                       self.maincat.insert(0, ("--- Search ---", "callSuchen", default_cover))
+               self.keyLocked = True
+               url = "%s/categories/?mode=async&function=get_block&block_id=list_categories_categories_list&sort_by=total_videos" % self.baseurl
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+               if self.mode == "porn7":
+                       twAgentGetPage(url+'&from=02', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=03', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=04', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=05', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=06', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=07', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=08', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url+'&from=09', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               if self.mode == "porn7":
+                       Cats = re.findall('class="item".*?href="(.*?)".*?"thumb\s{0,2}"\ssrc="(.*?)".*?class="title"><u>(.*?)</u>', data, re.S)
+               else:
+                       Cats = re.findall('class="thumb grid item".*?href="(.*?)".*?<img src="(.*?)"\salt="(.*?)"', data, re.S)
+               if Cats:
+                       for (Url, Image, Title) in Cats:
+                               self.extcat.append((upperString(stripAllTags(Title)), Url.strip('/'), Image))
+                       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
+               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(porn7FilmScreen, 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(porn7FilmScreen, Link, Name, self.portal, self.baseurl)
+
+class porn7FilmScreen(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 == "Porn7.xxx":
+                       default_cover = "file://%s/porn7.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "AdultCartoons.com":
+                       default_cover = "file://%s/adultcartoons.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Moviesand.com":
+                       default_cover = "file://%s/moviesand.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Babestube.com":
+                       default_cover = "file://%s/babestube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Interracial.com":
+                       default_cover = "file://%s/interracial.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Deviants.com":
+                       default_cover = "file://%s/deviants.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "VoyeurPorno.com":
+                       default_cover = "file://%s/voyeurporno.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 == "Porn7.xxx":
+                               url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&sort_by=&from2=%s" % (self.baseurl, self.Link, str(self.page))
+                       else:
+                               url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&sort_by=post_date&from_videos=%s&from_albums=%s" % (self.baseurl, self.Link, str(self.page), str(self.page))
+               else:
+                       if self.Link.startswith('http'):
+                               url = "%s/?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date&from=%s&ipp=40" % (self.Link, str(self.page))
+                       else:
+                               if self.Name in ["Newest", "Most Commented", "Most Favorited"] and self.portal == "Porn7.xxx":
+                                       blockid = "list_videos_latest_videos_list"
+                               else:
+                                       blockid = "list_videos_common_videos_list"
+                               url = "%s/%s/?mode=async&function=get_block&block_id=%s&sort_by=%s&from=%s&ipp=40" % (self.baseurl, self.Link.split('#')[0], blockid, self.Link.split('#')[-1], str(self.page))
+               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               if re.match(".*Search", self.Name):
+                       self.getLastPage(data, 'class="pagination"(.*?)(?:class="next"|</ul>)', '.*(?:from2:|from_albums:|<span>)(\d{2,5})(?:</span>|\")')
+               else:
+                       if 'class="link_show_more"' in data or 'class="show_more"' in data:
+                               self.lastpage = self.page + 1
+                       if self.lastpage > 1:
+                               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       else:
+                               self['page'].setText('1 / 1')
+               Movies = re.findall('class="item\s{0,3}(?:thumb|)".*?href="(.*?)"\s+title="(.*?)".*?(?:src|data-original)="(?!data:image)(.*?)".*?class="(?:duration|time)">(.*?)</div>', data, 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 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]
+               self['name'].setText(title)
+               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 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='porn7')
\ No newline at end of file
index a930b96..79f9ac3 100644 (file)
@@ -67,6 +67,12 @@ class pornxioGenreScreen(MPScreen):
                        self.portal = "hypnotube.com"
                        self.baseurl = "https://hypnotube.com"
                        default_cover = "file://%s/hypnotube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "laidhub":
+                       if self.genre == "category":
+                               self.genre = "porn-categories"
+                       self.portal = "LaidHub.com"
+                       self.baseurl = "https://www.laidhub.com"
+                       default_cover = "file://%s/laidhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
@@ -99,21 +105,22 @@ class pornxioGenreScreen(MPScreen):
                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)
+               parse = re.search('<h1>\s{0,70}(?:Porn Channels|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)
+                       Cats = re.findall('class="item-col item--(?:channel|paysite).*?href="(.*?)".*?img.*?(?:src|data-opts-original)="(\w.*?)".*?alt="(.*?)"', parse.group(1), re.S)
                        if Cats:
-                               for (Url, Title, Image) in Cats:
+                               for (Url, Image, Title) 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))
+                                               if not "Premium VOD" in Title:
+                                                       self.filmliste.append((upperString(decodeHtml(Title)), Url, Image))
                                self.filmliste.sort()
-               if (self.genre == "category" or self.genre == "channels"):
+               if (self.genre == "category" or self.genre == "channels" or self.genre == "porn-categories"):
                        if self.mode == "pornxio":
                                self.filmliste.insert(0, ("Studios", "studios", default_cover))
-                       elif self.mode == "handjobhub":
+                       elif self.mode == "handjobhub" or self.mode == "laidhub":
                                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))
@@ -127,7 +134,11 @@ class pornxioGenreScreen(MPScreen):
 
        def showInfos(self):
                cover = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(cover, headers={'Referer':self.baseurl})
+               if self.mode == "laidhub":
+                       headers = {}
+               else:
+                       headers = {'Referer':self.baseurl}
+               CoverHelper(self['coverArt']).getCover(cover, headers=headers)
 
        def keyOK(self):
                if self.keyLocked:
@@ -166,6 +177,8 @@ class pornxioFilmScreen(MPScreen, ThumbsHelper):
                        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")
+               elif self.portal == "LaidHub.com":
+                       default_cover = "file://%s/laidhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
@@ -215,9 +228,9 @@ class pornxioFilmScreen(MPScreen, ThumbsHelper):
                        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)
+               Movies = re.findall('class="item-col col\s{0,1}"\s{0,1}(?:\sid="content-\d+"|\s{0,1}|data-video=".*?")>.*?href="(.*?)".*?(?:src|data-opts-original)="(?!data:image/)(\w.*?)".*?alt="(.*?)".*?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:
+                       for (Url, Image, Title, 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:
@@ -237,7 +250,11 @@ class pornxioFilmScreen(MPScreen, ThumbsHelper):
                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})
+               if self.portal == "LaidHub.com":
+                       headers = {}
+               else:
+                       headers = {'Referer':self.baseurl}
+               CoverHelper(self['coverArt']).getCover(pic, headers=headers)
 
        def keyOK(self):
                if self.keyLocked:
@@ -254,4 +271,7 @@ class pornxioFilmScreen(MPScreen, ThumbsHelper):
                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
+                       url = url[0]
+                       if "laidhub" in url:
+                               url = url.replace('https','http')
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornxio')
\ No newline at end of file
index 2f14c99..43069ba 100644 (file)
@@ -214,7 +214,7 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                        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.filmliste.append((_('No videos found!'), None, None, '', '', ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
                self.ml.moveToIndex(0)
                self.keyLocked = False
index a7f19b6..7302974 100644 (file)
@@ -38,7 +38,7 @@ from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 import base64
 
-agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
 json_headers = {
        'Accept':'application/json',
        'Accept-Language':'de,en-US;q=0.7,en;q=0.3',
@@ -47,11 +47,11 @@ json_headers = {
        }
 default_cover = "file://%s/txxx.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 cookies = CookieJar()
-ctarget = None
 
 class txxxGenreScreen(MPScreen):
 
-       def __init__(self, session):
+       def __init__(self, session, cat="categories", scope=0):
+               self.cat = cat
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
                self["actions"] = ActionMap(["MP_Actions"], {
@@ -61,12 +61,27 @@ class txxxGenreScreen(MPScreen):
                        "up" : self.keyUp,
                        "down" : self.keyDown,
                        "right" : self.keyRight,
-                       "left" : self.keyLeft
+                       "left" : self.keyLeft,
+                       "nextBouquet" : self.keyPageUp,
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber_,
+                       "yellow" : self.keyScope
                }, -1)
 
+               self.scope = scope
+               self.scopeText = ['Straight', 'Shemale', 'Gay']
+               self.scopeval = ['str', 'she', 'gay']
+
                self['title'] = Label("TXXX.com")
                self['ContentTitle'] = Label("Genre:")
+               if self.cat in ["pornstars", "channels", "playlists"]:
+                       self['F2'] = Label(_("Page"))
+                       self['Page'] = Label(_("Page:"))
+               if self.cat == "categories":
+                       self['F3'] = Label(self.scopeText[self.scope])
 
+               self.page = 1
+               self.lastpage = 1
                self.keyLocked = True
                self.suchString = ''
 
@@ -74,29 +89,94 @@ class txxxGenreScreen(MPScreen):
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
                self['liste'] = self.ml
 
-               self.onLayoutFinish.append(self.layoutFinished)
+               self.onLayoutFinish.append(self.loadPage)
 
-       def layoutFinished(self):
+       def loadPage(self):
                self.keyLocked = True
-               url = "https://txxx.com/categories/"
+               self.genreliste = []
+               if self.cat == "categories":
+                       self['F3'].setText(self.scopeText[self.scope])
+                       url = "https://txxx.com/api/json/categories/14400/%s.all.json" % self.scopeval[self.scope]
+               elif self.cat == "pornstars":
+                       url = "https://txxx.com/api/json/models/86400/%s/filt........../most-popular/19/%s.json" % (self.scopeval[self.scope], str(self.page))
+               elif self.cat == "channels":
+                       url = "https://txxx.com/api/json/channels/86400/%s/latest-updates/19/..%s.json" % (self.scopeval[self.scope], str(self.page))
+               elif self.cat == "playlists":
+                       url = "https://txxx.com/api/json/playlists/86400/latest-updates/19/all.%s.%s..json" % (str(self.page), self.scopeval[self.scope])
+               elif self.cat == "popular_in":
+                       self.genreData('')
+                       return
                twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               Cats = re.findall(' class="categories-list__item" data-name=".*?href="(.*?)".*?data-title=.*?span>(.*?)</', data, re.S)
-               if Cats:
-                       for (Url, Title) in Cats:
-                               Url = "https://txxx.com" + Url
+               if self.cat != "popular_in":
+                       json_data = json.loads(data)
+               if self.cat == "categories":
+                       for item in json_data["categories"]:
+                               Title = str(item["title"])
+                               Url = "cat#%s" % str(item["dir"])
                                self.genreliste.append((Title, Url, default_cover))
-                       self.genreliste.sort()
-                       self.genreliste.insert(0, ("Longest", "https://txxx.com/longest/", default_cover))
-                       self.genreliste.insert(0, ("Most Popular", "https://txxx.com/most-popular/", default_cover))
-                       self.genreliste.insert(0, ("Top Rated", "https://txxx.com/top-rated/", default_cover))
-                       self.genreliste.insert(0, ("Newest", "https://txxx.com/latest-updates/", default_cover))
+                               self.genreliste.sort()
+                       self.genreliste.insert(0, (400 * "—", None, default_cover))
+                       self.genreliste.insert(0, ("Playlists", "playlists", default_cover))
+                       self.genreliste.insert(0, ("Channels", "channels", default_cover))
+                       self.genreliste.insert(0, ("Pornstars", "pornstars", default_cover))
+                       self.genreliste.insert(0, (400 * "—", None, default_cover))
+                       self.genreliste.insert(0, ("Popular in...", "popular_in", default_cover))
+                       self.genreliste.insert(0, ("Longest", "main#longest", default_cover))
+                       self.genreliste.insert(0, ("Most Commented", "main#most-commented", default_cover))
+                       self.genreliste.insert(0, ("Most Popular", "main#most-popular", default_cover))
+                       self.genreliste.insert(0, ("Top Rated", "main#top-rated", default_cover))
+                       self.genreliste.insert(0, ("Newest", "main#latest-updates", 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()
+               elif self.cat == "pornstars":
+                       if json_data.has_key("total_count"):
+                               count = int(json_data["total_count"])
+                               lastp = round((count / 19) + 0.5)
+                               self.lastpage = int(lastp)
+                               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       for item in json_data["models"]:
+                               Title = str(item["title"])
+                               Url = "pornstar#%s" % str(item["dir"])
+                               Image = str(item["img"])
+                               self.genreliste.append((Title, Url, Image))
+               elif self.cat == "channels":
+                       if json_data.has_key("total_count"):
+                               count = int(json_data["total_count"])
+                               lastp = round((count / 19) + 0.5)
+                               self.lastpage = int(lastp)
+                               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       for item in json_data["channels"]:
+                               Title = str(item["title"])
+                               Url = "channel#%s" % str(item["dir"])
+                               Image = str(item["img"])
+                               self.genreliste.append((Title, Url, Image))
+               elif self.cat == "playlists":
+                       if json_data.has_key("total_count"):
+                               count = int(json_data["total_count"])
+                               lastp = round((count / 19) + 0.5)
+                               self.lastpage = int(lastp)
+                               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       else:
+                               self.lastpage = 430
+                               self['page'].setText(str(self.page))
+                       for item in json_data["playlists"]:
+                               Title = str(item["title"])
+                               Url = "playlist#%s" % str(item["playlist_id"])
+                               Image = str(item["thumbs"][0])
+                               self.genreliste.append((Title, Url, Image))
+               elif self.cat == "popular_in":
+                       cc = ["us","de","in","ru","fr","jp","kr","gb","es","pl","it","ca","nl","sg","ua","tw","mx","be","th","br","au","dz","eg","gr","cz","hu","ph","ch","ro","at","vn","se","eu","pk","hk","ar","il","dk","lk","iq","my","bg","fi","co","id","rs","no","za","sk","pt","by","pe","mn","ie","cl","hr","nz","cn","ma","jo","az","md","lt","si","lb","ba","lv","lu","tn","ec","mm","ee","ge","kh","bo","cr","sy","do","am","pa","mk","kg","pr","cw","cy","gt","ng","uy","sv","uz","ps","hn","ke","al","mo","mu","tt","ni","ve"]
+                       names = {"ad":"Andorra","ae":"United Arab Emirates","af":"Afghanistan","ag":"Antigua and Barbuda","ai":"Anguilla","al":"Albania","am":"Armenia","ao":"Angola","aq":"Antarctica","ar":"Argentina","as":"American Samoa","at":"Austria","au":"Australia","aw":"Aruba","ax":"Aland Islands","az":"Azerbaijan","ba":"Bosnia and Herzegovina","bb":"Barbados","bd":"Bangladesh","be":"Belgium","bf":"Burkina Faso","bg":"Bulgaria","bh":"Bahrain","bi":"Burundi","bj":"Benin","bl":"Saint Barthelemy","bm":"Bermuda","bn":"Brunei Darussalam","bo":"Bolivia","br":"Brazil","bs":"Bahamas","bt":"Bhutan","bw":"Botswana","by":"Belarus","bz":"Belize","ca":"Canada","cc":"Cocos Islands","cd":"Congo, Democratic Republic","cf":"Central African Republic","cg":"Congo","ch":"Switzerland","ci":"Côte D\'ivoire","ck":"Cook Islands ","cl":"Chile","cm":"Cameroon","cn":"China","co":"Colombia","cr":"Costa Rica","cu":"Cuba","cv":"Guinea-Bissau","cw":"Curacao","cx":"Christmas Island","cy":"Cyprus","cz":"Czech Republic","de":"Germany","dj":"Djibouti","dk":"Denmark","dm":"Dominica","do":"Dominican Republic","dz":"Algeria","ec":"Ecuador","ee":"Estonia","eg":"Egypt","eh":"Western Sahara","er":"Eritrea","es":"Spain","et":"Ethiopia","eu":"Europe","fi":"Finland","fj":"Fiji","fk":"Falkland Islands","fm":"Micronesia","fo":"Faroe Islands","fr":"France","ga":"Gabon","gb":"United Kingdom","gd":"Grenada","ge":"Georgia","gf":"French Guiana","gh":"Ghana","gi":"Gibraltar","gl":"Greenland","gm":"Gambia","gn":"Guinea","gp":"Guadeloupe","gq":"Equatorial Guinea","gr":"Greece","gs":"South Georgia and the South sandwich Islands","gt":"Guatemala","gu":"GUAM","gw":"Guinea-Bissau","gy":"Guyana","hk":"Hong Kong","hm":"The heard island and MacDonald island","hn":"Honduras","hr":"Croatia","ht":"Haiti","hu":"Hungary","id":"Indonesia","ie":"Ireland","il":"Israel","in":"India","io":"British Indian Ocean Territory ","iq":"Iraq","ir":"Iran","is":"Iceland","it":"Italy","jm":"Jamaica","jo":"Jordan","jp":"Japan","ke":"Kenya","kg":"Kyrgyzstan","kh":"Cambodia","ki":"Kiribati","km":"Comoros","kn":"Saint Kitts and Nevis","kp":"The DPRK","kr":"The Republic Of Korea","kw":"Kuwait","ky":"Cayman Islands","kz":"Kazakhstan","la":"Loss","lb":"Lebanon","lc":"Saint Lucia","li":"Liechtenstein","lk":"Sri Lanka","lr":"Liberia","ls":"Lesotho","lt":"Lithuania","lu":"Luxembourg","lv":"Latvia","ly":"Libya","ma":"Morocco","mc":"Monaco","md":"Moldova, Republic Of","me":"Montenegro","mg":"Madagascar","mh":"Marshall Islands","mk":"Macedonia","ml":"Mali","mm":"Myanmar","mn":"Mongolia","mo":"Macau","mp":"Northern Mariana Islands","mq":"Martinique","mr":"Mauritania","ms":"Montserrat","mt":"Malta","mu":"Mauritius","mv":"The Maldives","mw":"Malawi","mx":"Mexico","my":"Malaysia","mz":"Mozambique","na":"Namibia","nc":"New Caledonia","ne":"Niger","nf":"Norfolk Island ","ng":"Nigeria","ni":"Nicaragua","nl":"Netherlands","no":"Norway","np":"Nepal","nr":"Nauru","nu":"Niue","nz":"New Zealand","om":"Oman","pa":"Panama","pe":"Peru","pf":"French Polynesia","pg":"Papua New Guinea","ph":"Philippines","pk":"Pakistan","pl":"Poland","pm":"Saint Pierre and Miquelon","pn":"Pitcairn","pr":"Puerto Rico","ps":"Palestinian Territory, Occupied","pt":"Portugal","pw":"Palau","py":"Paraguay","qa":"Qatar","re":"Reunion","ro":"Romania","rs":"Serbia","ru":"Russia","rw":"Rwanda","sa":"Saudi Arabia","sb":"Solomon Islands","sc":"Seychelles","sd":"Sudan","se":"Sweden","sg":"Singapore","sh":"Helena","si":"Slovenia","sj":"Svalbard and Jan Mayen","sk":"Slovakia","sl":"Sierra Leone","sm":"San Marino","sn":"Senegal","so":"Somalia","sr":"Suriname","ss":"South Sudan","st":"Sao Tome and Principe","sv":"Salvador","sy":"Syrian Arab Republic","sz":"Swaziland","tc":"Turks and Caicos Islands","td":"Chad","tf":"French Southern Territories","tg":"That","th":"Thailand","tj":"Tajikistan","tk":"Tokelau","tl":"East Timor","tm":"Turkmenistan","tn":"Tunisia","to":"Tonga","tr":"Turkey","tt":"Trinidad and Tobago","tv":"Tuvalu","tw":"Taiwan, province of China","tz":"Tanzania","ua":"Ukraine","ug":"Uganda","um":"Minor outlying Islands USA","us":"USA","uy":"Uruguay","uz":"Uzbekistan","va":"The Vatican","vc":"Saint Vincent and the Grenadines","ve":"Venezuela","vg":"Virgin Islands, British","vi":"Virgin Islands, USA","vn":"Vietnam","vu":"Vanuatu","wf":"Wallis and Futuna","ws":"Samoa","ye":"Yemen","yt":"Mayotte","za":"South Africa","zm":"Zambia","zw":"Zimbabwe"}
+                       for item in cc:
+                               Title = names[item]
+                               Url = "country#%s" % item
+                               Image = "https://txxx.com/static/images/flags/%s.svg" % item
+                               self.genreliste.append((Title, Url, Image))
+               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]
@@ -108,19 +188,46 @@ class txxxGenreScreen(MPScreen):
                Name = self['liste'].getCurrent()[0][0]
                if Name == "--- Search ---":
                        self.suchen(suggest_func=self.getSuggestions)
+               elif Name == "Pornstars":
+                       self.session.open(txxxGenreScreen, cat="pornstars", scope=self.scope)
+               elif Name == "Channels":
+                       self.session.open(txxxGenreScreen, cat="channels", scope=self.scope)
+               elif Name == "Playlists":
+                       self.session.open(txxxGenreScreen, cat="playlists", scope=self.scope)
+               elif Name == "Popular in...":
+                       self.session.open(txxxGenreScreen, cat="popular_in", scope=self.scope)
                else:
                        Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(txxxFilmScreen, Link, Name)
+                       if Link:
+                               self.session.open(txxxFilmScreen, Link, Name, self.scopeval[self.scope])
+
+       def keyScope(self):
+               if self.cat != "categories":
+                       return
+               if self.keyLocked:
+                       return
+               self.genreliste = []
+               if self.scope == 0:
+                       self.scope = 1
+               elif self.scope == 1:
+                       self.scope = 2
+               else:
+                       self.scope = 0
+               self.loadPage()
+
+       def keyPageNumber_(self):
+               if self.cat in ["pornstars", "channels", "playlists"]:
+                       self.keyPageNumber()
 
        def SuchenCallback(self, callback = None):
                if callback is not None and len(callback):
                        Name = "--- Search ---"
                        self.suchString = callback
-                       Link = '%s' + urllib.quote(self.suchString).replace(' ', '+')
-                       self.session.open(txxxFilmScreen, Link, Name)
+                       Link = urllib.quote(self.suchString).replace(' ', '+')
+                       self.session.open(txxxFilmScreen, Link, Name, self.scopeval[self.scope])
 
        def getSuggestions(self, text, max_res):
-               url = "https://txxx.com/cloudsearch/suggesters.php?char=%s" % urllib.quote_plus(text)
+               url = "https://txxx.com/api/suggester.php?c=%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)
@@ -130,7 +237,7 @@ class txxxGenreScreen(MPScreen):
                list = []
                if not err and type(suggestions) in (str, buffer):
                        suggestions = json.loads(suggestions)
-                       for item in suggestions:
+                       for item in suggestions["keywords"]:
                                li = item
                                list.append(str(li))
                                max_res -= 1
@@ -141,9 +248,10 @@ class txxxGenreScreen(MPScreen):
 
 class txxxFilmScreen(MPScreen, ThumbsHelper):
 
-       def __init__(self, session, Link, Name):
+       def __init__(self, session, Link, Name, scope='str'):
                self.Link = Link
                self.Name = Name
+               self.scope = scope
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
 
@@ -181,24 +289,40 @@ class txxxFilmScreen(MPScreen, ThumbsHelper):
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                if re.match(".*Search", self.Name):
-                       url = "https://txxx.com/search/%s/?s=%s" % (str(self.page), self.Link)
+                       url = "https://txxx.com/api/videos.php?params=86400/%s/relevance/60/search..%s.all..day&s=%s" % (self.scope, str(self.page), self.Link)
                else:
-                       if self.page == 1:
-                               url = self.Link
-                       else:
-                               url = "%s%s/" % (self.Link, str(self.page))
+                       if self.Link.split('#')[0] == "main":
+                               url = "https://txxx.com/api/json/videos/86400/%s/%s/60/..%s.all..all.json" % (self.scope, self.Link.split('#')[-1], str(self.page))
+                       elif self.Link.split('#')[0] == "cat":
+                               url = "https://txxx.com/api/json/videos/86400/%s/latest-updates/60/categories.%s.%s.all..day.json" % (self.scope, self.Link.split('#')[-1], str(self.page))
+                       elif self.Link.split('#')[0] == "country":
+                               url = "https://txxx.com/api/json/videos/86400/%s/latest-updates/60/top-country.%s.%s.all..day.json" % (self.scope, self.Link.split('#')[-1], str(self.page))
+                       elif self.Link.split('#')[0] == "pornstar":
+                               url = "https://txxx.com/api/json/videos/86400/%s/latest-updates/60/model.%s.%s.all...json" % (self.scope, self.Link.split('#')[-1], str(self.page))
+                       elif self.Link.split('#')[0] == "channel":
+                               url = "https://txxx.com/api/json/videos/86400/%s/latest-updates/60/channel.%s.%s.all...json" % (self.scope, self.Link.split('#')[-1], str(self.page))
+                       elif self.Link.split('#')[0] == "playlist":
+                               url = "https://txxx.com/api/json/videos/86400/%s/latest-updates/60/playlist.%s.%s.all...json" % (self.scope, self.Link.split('#')[-1], str(self.page))
                twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
-               self.getLastPage(data, 'class="paginator\s{0,5}(.*?)</div>', '.*from:\d+">((?:\d+.|)\d+)<')
-               Movies = re.findall('thumb item.*?image:url\(\'(.*?)\'\).*?class="thumb__duration">(.*?)</.*?href="(.*?)">(.*?)</a.*?class="viewed">(?:<i class="i i--size--xs i--color-gray"><svg><use xlink:href="#i--thumb-eye"></use></svg></i>|)(.*?)</span>', data, re.S)
-               if Movies:
-                       for (Image, Runtime, Url, Title, Views) in Movies:
-                               if not Url.startswith('https'):
-                                       Url = 'https://txxx.com' + Url
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views.replace('Just added','0')))
+               json_data = json.loads(data)
+               if json_data.has_key("total_count"):
+                       count = int(json_data["total_count"])
+                       lastp = round((count / 60) + 0.5)
+                       self.lastpage = int(lastp)
+                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+               if json_data.has_key("videos"):
+                       for item in json_data["videos"]:
+                               title = str(item["title"])
+                               url = "https://txxx.com/api/videofile.php?video_id=%s&lifetime=8640000" % str(item["video_id"])
+                               image = str(item["scr"])
+                               duration = str(item["duration"])
+                               added = str(item["post_date"])
+                               views = str(item["video_viewed"])
+                               self.filmliste.append((title, url, image, duration, views, added))
                if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), None, None, '', ''))
+                       self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
                self.ml.moveToIndex(0)
                self.keyLocked = False
@@ -210,8 +334,9 @@ class txxxFilmScreen(MPScreen, ThumbsHelper):
                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\nViews: %s" % (runtime, views))
+               self['handlung'].setText("Runtime: %s\nViews: %s\nAdded: %s" % (runtime, views, added))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keyOK(self):
@@ -220,29 +345,10 @@ class txxxFilmScreen(MPScreen, ThumbsHelper):
                Link = self['liste'].getCurrent()[0][1]
                if Link:
                        self.keyLocked = True
-                       twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.getVideoPage, Link).addErrback(self.dataError)
-
-       def getVideoPage(self, data, Link):
-               global ctarget
-               if not ctarget:
-                       playerlib = re.findall('<script src="(/assets/playerlib.*?\.js)"', data, re.S)
-                       url = "https://txxx.com" + playerlib[0]
-                       twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.fetchctarget, Link).addErrback(self.dataError)
-               else:
-                       pC3 = re.findall("pC3:'(.*?)',", data, re.S)
-                       video_id = re.findall('(?:\"|\'|)video_id(?:\"|\'|): (\d+),', data, re.S)
-                       if pC3 and video_id:
-                               postdata = {'param': video_id[0]+','+pC3[0]}
-                               twAgentGetPage(ctarget, method='POST', postdata=urlencode(postdata), agent=agent, cookieJar=cookies, headers={'Content-Type':'application/x-www-form-urlencoded','Referer':Link}).addCallback(self.playVideo).addErrback(self.dataError)
-
-       def fetchctarget(self, data, Link):
-               curl = re.findall(';c.action="(.*?)";', data, re.S)
-               global ctarget
-               ctarget = "https://txxx.com" + curl[0]
-               twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.getVideoPage, Link).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies, headers={'Referer':'https://txxx.com'}).addCallback(self.playVideo).addErrback(self.dataError)
 
        def playVideo(self, data):
-               video = re.findall('\[\{"video_url":"(.*?)",', data, re.S)
+               video = re.findall('"video_url":"(.*?)",', data, re.S)
                self.keyLocked = False
                if video:
                        url = video[0]
@@ -250,6 +356,10 @@ class txxxFilmScreen(MPScreen, ThumbsHelper):
                        for i in chr:
                                url = url.replace(chr[i], i)
                        url = base64.b64decode(url)
+                       if url.startswith('//'):
+                               url = 'https:' + url
+                       if url.startswith('/'):
+                               url = 'https://txxx.com' + url
                        Title = self['liste'].getCurrent()[0][0]
                        mp_globals.player_agent = agent
                        self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='txxx')
\ No newline at end of file
index 21505d3..84c3088 100644 (file)
 
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.configlistext import ConfigListScreenExt
-from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
 from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
 
-config_mp.mediaportal.vporn_username = ConfigText(default="vpornUserName", fixed_size=False)
-config_mp.mediaportal.vporn_password = ConfigPassword(default="vpornPassword", fixed_size=False)
 config_mp.mediaportal.vporn_hd = ConfigText(default="SD/HD", fixed_size=False)
 config_mp.mediaportal.vporn_date = ConfigText(default="all time", fixed_size=False)
 
 vpagent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
-vpck = {}
+vpck = CookieJar()
 json_headers = {
        'Accept':'application/json',
        'Accept-Language':'en,en-US;q=0.7,en;q=0.3',
@@ -70,52 +66,31 @@ class vpornGenreScreen(MPScreen):
                        "right" : self.keyRight,
                        "left" : self.keyLeft,
                        "green" : self.keyHD,
-                       "yellow": self.keyDate,
-                       "blue": self.keySetup
+                       "yellow": self.keyDate
                }, -1)
 
                self.hd = config_mp.mediaportal.vporn_hd.value
                self.date = config_mp.mediaportal.vporn_date.value
-               self.username = str(config_mp.mediaportal.vporn_username.value)
-               self.password = str(config_mp.mediaportal.vporn_password.value)
 
                self['title'] = Label("VPORN.com")
                self['ContentTitle'] = Label("Genre:")
                self['F2'] = Label(self.hd)
                self['F3'] = Label(self.date)
-               #self['F4'] = Label(_("Setup"))
                self.keyLocked = True
-               self.loggedin = False
                self.suchString = ''
 
                self.genreliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
                self['liste'] = self.ml
 
-               #if self.username != "vpornUserName" and self.password != "vpornPassword":
-               #       self.onLayoutFinish.append(self.Login)
-               #else:
                self.onLayoutFinish.append(self.layoutFinished)
 
-       def Login(self):
-               self['name'].setText(_('Please wait...'))
-               loginUrl = "https://www.vporn.com/login"
-               loginData = {'backto': "", 'password': self.password, 'sub': 1, 'username': self.username}
-               getPage(loginUrl, agent=vpagent, method='POST', postdata=urlencode(loginData), cookies=vpck, timeout=30, headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.Login2).addErrback(self.dataError)
-
-       def Login2(self, data):
-               if 'href="/logout/"' in data:
-                       self.loggedin = True
-               self.layoutFinished()
-
        def layoutFinished(self):
                self.keyLocked = True
                url = "https://www.vporn.com/categories/"
-               getPage(url, agent=vpagent, cookies=vpck, timeout=30).addCallback(self.genreData).addErrback(self.dataError)
+               twAgentGetPage(url, agent=vpagent, cookieJar=vpck, timeout=30).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               #if not self.loggedin:
-               #       message = self.session.open(MessageBoxExt, _("Login data is required for HD video playback!"), MessageBoxExt.TYPE_INFO, timeout=5)
                parse = re.search('>All Categories<(.*?)</div>', data, re.S)
                Cats = re.findall('<li.*?<a\shref="(?!search)(.*?)".*?categoryName">(.*?)</span', parse.group(1), re.S)
                if Cats:
@@ -175,16 +150,6 @@ class vpornGenreScreen(MPScreen):
                        printl(str(suggestions),self,'E')
                return list
 
-       def keySetup(self):
-               pass
-               #if mp_globals.isDreamOS:
-               #       self.session.openWithCallback(self.setupCallback, vpornSetupScreen, is_dialog=True)
-               #else:
-               #       self.session.openWithCallback(self.setupCallback, vpornSetupScreen)
-
-       def setupCallback(self):
-               pass
-
        def keyHD(self):
                if self.hd == "SD/HD":
                        self.hd = "HD"
@@ -215,38 +180,6 @@ class vpornGenreScreen(MPScreen):
                configfile_mp.save()
                self['F3'].setText(self.date)
 
-class vpornSetupScreen(MPSetupScreen, ConfigListScreenExt):
-
-       def __init__(self, session):
-               MPSetupScreen.__init__(self, session, skin='MP_PluginSetup')
-
-               self['title'] = Label("VPORN.com " + _("Setup"))
-               self['F4'] = Label('')
-               self.setTitle("VPORN.com " + _("Setup"))
-
-               self.list = []
-               ConfigListScreenExt.__init__(self, self.list)
-
-               self.list.append(getConfigListEntry(_("Username:"), config_mp.mediaportal.vporn_username))
-               self.list.append(getConfigListEntry(_("Password:"), config_mp.mediaportal.vporn_password))
-
-               self["config"].setList(self.list)
-
-               self["setupActions"] = ActionMap(["SetupActions"],
-               {
-                       "ok":           self.saveConfig,
-                       "cancel":       self.exit
-               }, -1)
-
-       def saveConfig(self):
-               for x in self["config"].list:
-                       x[1].save()
-               configfile_mp.save()
-               self.close()
-
-       def exit(self):
-               self.close()
-
 class vpornFilmScreen(MPScreen, ThumbsHelper):
 
        def __init__(self, session, Link, Name, HD, Date, Main):
@@ -317,7 +250,7 @@ class vpornFilmScreen(MPScreen, ThumbsHelper):
                                url = "%s%s/%s%s" % (self.Link, sort , self.date, self.hd)
                        else:
                                url = "%s%s/%s%s%s" % (self.Link, sort , self.date, self.hd, str(self.page))
-               getPage(url, agent=vpagent, cookies=vpck, timeout=30).addCallback(self.loadData).addErrback(self.dataError)
+               twAgentGetPage(url, agent=vpagent, cookieJar=vpck, timeout=30).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
                self.getLastPage(data, 'class="pages">(.*?)</div>')
@@ -371,7 +304,7 @@ class vpornFilmScreen(MPScreen, ThumbsHelper):
                url = self['liste'].getCurrent()[0][1]
                if url:
                        self.keyLocked = True
-                       getPage(url, agent=vpagent, cookies=vpck, timeout=30).addCallback(self.getVideoPage).addErrback(self.dataError)
+                       twAgentGetPage(url, agent=vpagent, cookieJar=vpck, timeout=30).addCallback(self.getVideoPage).addErrback(self.dataError)
 
        def getVideoPage(self, data):
                url = None
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/sport/sporttotal.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/sport/sporttotal.py
deleted file mode 100644 (file)
index bc165d6..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-# -*- 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 *
-
-default_cover = "file://%s/sporttotal.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class sporttotalGenreScreen(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,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("sporttotal.tv")
-               self['ContentTitle'] = Label("Genre:")
-               self['name'] = Label(_("Please wait..."))
-
-               self.keyLocked = True
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.filmliste = []
-               url = "https://www.sporttotal.tv/live"
-               getPage(url).addCallback(self.parseData).addErrback(self.dataError)
-
-       def parseData(self, data):
-               preparse = re.search('<nav class="sport-selector">(.*?)</nav>', data, re.S)
-               raw = re.findall('a\shref="(.*?)">(.*?)</a>', preparse.group(1), re.S)
-               if raw:
-                       for (Url, Title) in raw:
-                               if "far fa-futbol" in Title:
-                                       Title = "Fußball"
-                               elif "volleyball" in Title:
-                                       Title = "Volleyball"
-                               elif "field-hockey" in Title:
-                                       Title = "Feldhockey"
-                               elif "hockey-sticks" in Title:
-                                       Title = "Eishockey"
-                               elif "football-ball" in Title:
-                                       Title = "American Football"
-                               elif "fal fa-futbol" in Title:
-                                       Title = "Futsal"
-                               elif "basketball" in Title:
-                                       Title = "Basketball"
-                               Url = "https://www.sporttotal.tv/live" + Url
-                               self.filmliste.append((decodeHtml(Title.strip()), Url))
-                       self.ml.setList(map(self._defaultlistcenter, self.filmliste))
-                       self.keyLocked = False
-               self['name'].setText('')
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(sporttotalSubGenreScreen, Link, Name)
-
-class sporttotalSubGenreScreen(MPScreen):
-
-       def __init__(self, session, Link, Name):
-               self.Link = Link
-               self.Name = Name
-
-               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.keyLocked = True
-               self['title'] = Label("sporttotal.tv")
-               self['ContentTitle'] = Label("%s Livespiele:" % self.Name)
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self['name'].setText(_('Please wait...'))
-               url = self.Link
-               getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
-
-       def loadPageData(self, data):
-               pre1 = re.findall('id="livegames" class="livegame-table">(.*?)class="pagination live-pagnation">', data, re.S)
-               pre2 = re.findall('id="upcoming-games" class="livegame-table">(.*?)class="pagination upcoming-pagnation">', data, re.S)
-               if pre1:
-                       info = re.findall('class="table-link".*?tableLink\(\'(.*?)\'.*?class="date-filter">(.*?)</.*?class="teams">(.*?)</.*?class="division">(.*?)</', pre1[0], re.S)
-                       if info:
-                               for (url, date, teams, season) in info:
-                                       match = "%s: %s, %s" % (season.strip(), date.strip(), stripAllTags(teams).strip())
-                                       url = 'https://www.sporttotal.tv' + url
-                                       self.genreliste.append((decodeHtml(match), url))
-               if pre2:
-                       info = re.findall('class="table-link".*?tableLink\(\'(.*?)\'.*?class="date-filter">(.*?)</.*?class="teams">(.*?)</.*?class="division">(.*?)</', pre2[0], re.S)
-                       if info:
-                               for (url, date, teams, season) in info:
-                                       match = "%s: %s, %s" % (season.strip(), date.strip(), stripAllTags(teams).strip())
-                                       url = 'https://www.sporttotal.tv' + url
-                                       self.genreliste.append((decodeHtml(match), url))
-               if not pre1 and not pre2:
-                       self.genreliste.append((_("Currently no streams available"), None))
-               self.ml.setList(map(self._defaultlistleft, self.genreliste))
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               self['name'].setText('')
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               url = self['liste'].getCurrent()[0][1]
-               if url:
-                       getPage(url).addCallback(self.getStream).addErrback(self.dataError)
-
-       def getStream(self, data):
-               streams = re.findall('file:\s"(.*?)",', data, re.S)
-               if not streams:
-                       streams = re.findall('<source\ssrc="(.*?)"\stype="', data, re.S)
-               if not streams:
-                       streams = re.findall('playerSource = decodeHtml\("(.*?)"\);', data, re.S)
-               if streams:
-                       url = streams[0]
-                       if "m3u8" in url:
-                               getPage(url).addCallback(self.loadplaylist, url).addErrback(self.dataError)
-                       else:
-                               Name = self['liste'].getCurrent()[0][0]
-                               self.session.open(SimplePlayer, [(Name, url)], showPlaylist=False, ltype='sporttotal')
-
-       def loadplaylist(self, data, baseurl):
-               self.bandwith_list = []
-               match_sec_m3u8=re.findall('#EXT-X-STREAM-INF:BANDWIDTH=(\d+).*?\n(.*?m3u8.*?)\n', data, re.S)
-               max = 0
-               for x in match_sec_m3u8:
-                       if int(x[0]) > max:
-                               max = int(x[0])
-               videoPrio = int(config_mp.mediaportal.videoquali_others.value)
-               if videoPrio == 2:
-                       bw = max
-               elif videoPrio == 1:
-                       bw = max/2
-               else:
-                       bw = max/3
-               for each in match_sec_m3u8:
-                       bandwith,url = each
-                       self.bandwith_list.append((int(bandwith),url))
-               _x, best = min((abs(int(x[0]) - bw), x) for x in self.bandwith_list)
-               if '/RECORD' in baseurl:
-                       url = baseurl.split('/RECORD')[0] + best[1]
-               else:
-                       url = baseurl.split('index.m3u8')[0] + best[1]
-               Name = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(Name, url)], showPlaylist=False, ltype='sporttotal')
\ No newline at end of file
index d6b1656..07fd818 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 26245cb..410c1c4 100644 (file)
@@ -1,15 +1,15 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: MediaPortal\n"
-"POT-Creation-Date: 2019-11-02 18:22+0100\n"
-"PO-Revision-Date: 2019-11-02 18:22+0100\n"
+"POT-Creation-Date: 2019-12-05 17:49+0100\n"
+"PO-Revision-Date: 2019-12-05 17:50+0100\n"
 "Last-Translator: dhwz <dhwz@gmx.net>\n"
 "Language-Team: MediaPortal Team\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.3\n"
+"X-Generator: Poedit 2.2.4\n"
 "X-Poedit-Basepath: ../../../..\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
@@ -23,20 +23,21 @@ msgstr ""
 #: mpgz/src/additions/porn/datoporn.py:92
 #: mpgz/src/additions/porn/dirtymoviez.py:92
 #: mpgz/src/additions/porn/fapbraze.py:107
-#: mpgz/src/additions/porn/freeomovie.py:154
+#: mpgz/src/additions/porn/freeomovie.py:99
 #: mpgz/src/additions/porn/hqporner.py:144
 #: mpgz/src/additions/porn/incestflix.py:91
 #: mpgz/src/additions/porn/javbraze.py:181
-#: mpgz/src/additions/porn/javdos.py:166 mpgz/src/additions/porn/lfporn.py:89
+#: mpgz/src/additions/porn/javdos.py:109 mpgz/src/additions/porn/lfporn.py:89
 #: mpgz/src/additions/porn/mydirtyhobby.py:90
-#: mpgz/src/additions/porn/pandamovie.py:112
+#: mpgz/src/additions/porn/pandamovie.py:129
 #: mpgz/src/additions/porn/paradisehill.py:101
 #: mpgz/src/additions/porn/porn00.py:101
 #: mpgz/src/additions/porn/pornfreetv.py:155
-#: mpgz/src/additions/porn/pornfromczech.py:149
+#: mpgz/src/additions/porn/pornfromczech.py:95
 #: mpgz/src/additions/porn/pornrewind.py:99
 #: mpgz/src/additions/porn/pornstreams.py:110
 #: mpgz/src/additions/porn/porntrex.py:220
+#: mpgz/src/additions/porn/pornvex.py:90
 #: mpgz/src/additions/porn/pornvortexx.py:100
 #: mpgz/src/additions/porn/streammdh.py:128
 #: mpgz/src/additions/porn/streamxxx.py:153
@@ -44,63 +45,66 @@ msgstr ""
 #: mpgz/src/additions/porn/yourpornsexy.py:206
 #: 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:840
+#: mpgz/src/additions/useradditions/movie4k.py:285
+#: mpgz/src/additions/useradditions/movie4k.py:776
 #: 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/fun/twitch.py:135 src/additions/mediatheken/srg.py:181
 #: src/additions/music/radio.py:298 src/additions/porn/ahme.py:186
 #: src/additions/porn/anyporn.py:286 src/additions/porn/badoinkvr.py:130
 #: src/additions/porn/badoinkvr.py:204 src/additions/porn/bangbros.py:142
 #: src/additions/porn/beeg.py:141 src/additions/porn/befuck.py:140
 #: src/additions/porn/bongacams.py:132 src/additions/porn/brazzers.py:145
-#: src/additions/porn/cam4.py:171 src/additions/porn/chaturbate.py:181
-#: src/additions/porn/cliphunter.py:170 src/additions/porn/cliphunter.py:240
-#: src/additions/porn/cumlouder.py:285 src/additions/porn/cumlouder.py:359
-#: src/additions/porn/cumlouder.py:434 src/additions/porn/dachix.py:159
-#: src/additions/porn/ddfnetwork.py:163 src/additions/porn/ddfnetwork.py:239
+#: src/additions/porn/cam4.py:171 src/additions/porn/camhub.py:127
+#: src/additions/porn/chaturbate.py:181 src/additions/porn/cliphunter.py:170
+#: src/additions/porn/cliphunter.py:240 src/additions/porn/cumlouder.py:285
+#: src/additions/porn/cumlouder.py:359 src/additions/porn/cumlouder.py:434
+#: src/additions/porn/dachix.py:159 src/additions/porn/ddfnetwork.py:163
+#: src/additions/porn/ddfnetwork.py:239
 #: src/additions/porn/digitalplayground.py:154
 #: src/additions/porn/drtuber.py:192 src/additions/porn/elladies.py:132
 #: src/additions/porn/eporner.py:165 src/additions/porn/eroprofile.py:139
 #: src/additions/porn/extremetube.py:167 src/additions/porn/faapy.py:147
 #: src/additions/porn/faapy.py:213 src/additions/porn/fetishshrine.py:137
 #: src/additions/porn/freeones.py:161 src/additions/porn/hclips.py:163
-#: src/additions/porn/hdporn.py:123 src/additions/porn/hdzog.py:167
-#: 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/hdzog.py:167 src/additions/porn/homemoviestube.py:166
+#: src/additions/porn/hotmovs.py:166 src/additions/porn/hotscope.py:148
 #: src/additions/porn/julesjordan.py:145 src/additions/porn/julesjordan.py:216
 #: 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: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/pinflix.py:367 src/additions/porn/porn7.py:216
+#: 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/pornhat.py:176
 #: 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/pornhub.py:907 src/additions/porn/pornicom.py:188
+#: src/additions/porn/pornid.py:197 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/pornxio.py:202 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/slutload.py:176
 #: 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: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
-#: src/additions/porn/vjav.py:165 src/additions/porn/voyeurhit.py:167
-#: src/additions/porn/vporn.py:288 src/additions/porn/wetplace.py:137
-#: 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: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
+#: src/additions/porn/txxx.py:78 src/additions/porn/txxx.py:274
+#: src/additions/porn/updatetube.py:183 src/additions/porn/upornia.py:166
+#: src/additions/porn/vintagetube.py:243 src/additions/porn/vjav.py:165
+#: src/additions/porn/voyeurhit.py:167 src/additions/porn/vporn.py:221
+#: src/additions/porn/wetplace.py:137 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: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"
 
@@ -111,20 +115,21 @@ msgstr "Seite"
 #: mpgz/src/additions/porn/datoporn.py:94
 #: mpgz/src/additions/porn/dirtymoviez.py:94
 #: mpgz/src/additions/porn/fapbraze.py:109
-#: mpgz/src/additions/porn/freeomovie.py:156
+#: mpgz/src/additions/porn/freeomovie.py:101
 #: mpgz/src/additions/porn/hqporner.py:146
 #: mpgz/src/additions/porn/incestflix.py:93
 #: mpgz/src/additions/porn/javbraze.py:183
-#: mpgz/src/additions/porn/javdos.py:168 mpgz/src/additions/porn/lfporn.py:91
+#: mpgz/src/additions/porn/javdos.py:111 mpgz/src/additions/porn/lfporn.py:91
 #: mpgz/src/additions/porn/mydirtyhobby.py:94
-#: mpgz/src/additions/porn/pandamovie.py:114
+#: mpgz/src/additions/porn/pandamovie.py:131
 #: mpgz/src/additions/porn/paradisehill.py:107
 #: mpgz/src/additions/porn/porn00.py:103
 #: mpgz/src/additions/porn/pornfreetv.py:157
-#: mpgz/src/additions/porn/pornfromczech.py:151
+#: mpgz/src/additions/porn/pornfromczech.py:97
 #: mpgz/src/additions/porn/pornrewind.py:101
 #: mpgz/src/additions/porn/pornstreams.py:112
 #: mpgz/src/additions/porn/porntrex.py:222
+#: mpgz/src/additions/porn/pornvex.py:92
 #: mpgz/src/additions/porn/pornvortexx.py:102
 #: mpgz/src/additions/porn/streammdh.py:131
 #: mpgz/src/additions/porn/streamxxx.py:155
@@ -133,17 +138,17 @@ msgstr "Seite"
 #: mpgz/src/additions/porn/yourpornsexy.py:276
 #: mpgz/src/additions/sport/wrestlingnetwork.py:86
 #: mpgz/src/additions/useradditions/ddl_me.py:164
-#: mpgz/src/additions/useradditions/filmpalast.py:307
+#: mpgz/src/additions/useradditions/filmpalast.py:250
 #: 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:839
+#: mpgz/src/additions/useradditions/kinoxto.py:368
+#: mpgz/src/additions/useradditions/movie4k.py:329
+#: mpgz/src/additions/useradditions/movie4k.py:775
 #: 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
 #: src/additions/fun/gaskrank_tv.py:88 src/additions/fun/lachmeister_de.py:116
 #: src/additions/fun/lachschon_de.py:134 src/additions/fun/liveleak.py:99
-#: src/additions/fun/retrotv.py:70 src/additions/fun/twitch.py:144
+#: src/additions/fun/retrotv.py:70 src/additions/fun/twitch.py:145
 #: src/additions/mediatheken/ard.py:539 src/additions/mediatheken/arte.py:302
 #: src/additions/mediatheken/arte.py:351 src/additions/mediatheken/brf.py:117
 #: src/additions/mediatheken/dreisat.py:333
@@ -152,7 +157,6 @@ msgstr "Seite"
 #: src/additions/mediatheken/servustv.py:136
 #: src/additions/mediatheken/spiegeltv.py:154
 #: src/additions/mediatheken/srg.py:187
-#: src/additions/mediatheken/videogold_de.py:93
 #: src/additions/mediatheken/youtube.py:871
 #: src/additions/mediatheken/zdf.py:403 src/additions/music/radio.py:336
 #: src/additions/newsdoku/autobild.py:105 src/additions/newsdoku/bild.py:153
@@ -163,52 +167,55 @@ msgstr "Seite"
 #: src/additions/porn/bangbros.py:144 src/additions/porn/beeg.py:143
 #: src/additions/porn/befuck.py:142 src/additions/porn/bongacams.py:134
 #: src/additions/porn/brazzers.py:147 src/additions/porn/cam4.py:173
-#: src/additions/porn/chaturbate.py:183 src/additions/porn/cliphunter.py:172
-#: src/additions/porn/cliphunter.py:242 src/additions/porn/cumlouder.py:287
-#: src/additions/porn/cumlouder.py:361 src/additions/porn/cumlouder.py:438
-#: src/additions/porn/dachix.py:161 src/additions/porn/ddfnetwork.py:165
-#: src/additions/porn/ddfnetwork.py:241
+#: src/additions/porn/camhub.py:129 src/additions/porn/chaturbate.py:183
+#: src/additions/porn/cliphunter.py:172 src/additions/porn/cliphunter.py:242
+#: src/additions/porn/cumlouder.py:287 src/additions/porn/cumlouder.py:361
+#: src/additions/porn/cumlouder.py:438 src/additions/porn/dachix.py:161
+#: src/additions/porn/ddfnetwork.py:165 src/additions/porn/ddfnetwork.py:241
 #: src/additions/porn/digitalplayground.py:156
 #: src/additions/porn/drtuber.py:193 src/additions/porn/elladies.py:135
 #: src/additions/porn/eporner.py:167 src/additions/porn/eroprofile.py:141
 #: src/additions/porn/extremetube.py:195 src/additions/porn/faapy.py:148
 #: src/additions/porn/faapy.py:215 src/additions/porn/fetishshrine.py:139
 #: src/additions/porn/freeones.py:163 src/additions/porn/hclips.py:165
-#: src/additions/porn/hdporn.py:125 src/additions/porn/hdzog.py:169
-#: 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/hdzog.py:169 src/additions/porn/homemoviestube.py:170
+#: src/additions/porn/hotmovs.py:168 src/additions/porn/hotscope.py:150
 #: src/additions/porn/julesjordan.py:147 src/additions/porn/julesjordan.py:218
 #: 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: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/pinflix.py:370 src/additions/porn/porn7.py:218
+#: 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/pornhat.py:178
 #: 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/pornhub.py:909 src/additions/porn/pornicom.py:190
+#: src/additions/porn/pornid.py:199 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/pornxio.py:204 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/slutload.py:178
 #: 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: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
-#: src/additions/porn/vintagetube.py:274 src/additions/porn/vjav.py:167
-#: src/additions/porn/voyeurhit.py:169 src/additions/porn/vporn.py:292
-#: 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: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
+#: src/additions/porn/txxx.py:79 src/additions/porn/txxx.py:276
+#: src/additions/porn/updatetube.py:185 src/additions/porn/upornia.py:168
+#: src/additions/porn/vintagetube.py:191 src/additions/porn/vintagetube.py:274
+#: src/additions/porn/vjav.py:167 src/additions/porn/voyeurhit.py:169
+#: src/additions/porn/vporn.py:225 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: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:"
 
@@ -218,15 +225,15 @@ msgstr "Seite:"
 #: mpgz/src/additions/porn/datoporn.py:107
 #: mpgz/src/additions/porn/dirtymoviez.py:107
 #: mpgz/src/additions/porn/fapbraze.py:122
-#: mpgz/src/additions/porn/freeomovie.py:166
+#: mpgz/src/additions/porn/freeomovie.py:111
 #: mpgz/src/additions/porn/incestflix.py:106
-#: mpgz/src/additions/porn/javbraze.py:196 mpgz/src/additions/porn/javdos.py:61
-#: mpgz/src/additions/porn/javdos.py:181 mpgz/src/additions/porn/javdos.py:238
+#: mpgz/src/additions/porn/javbraze.py:196
+#: mpgz/src/additions/porn/javdos.py:124 mpgz/src/additions/porn/javdos.py:181
 #: mpgz/src/additions/porn/lfporn.py:104
 #: mpgz/src/additions/porn/mydirtyhobby.py:107
-#: mpgz/src/additions/porn/pandamovie.py:20
-#: mpgz/src/additions/porn/pandamovie.py:124
-#: mpgz/src/additions/porn/pandamovie.py:195
+#: mpgz/src/additions/porn/pandamovie.py:33
+#: mpgz/src/additions/porn/pandamovie.py:141
+#: mpgz/src/additions/porn/pandamovie.py:215
 #: mpgz/src/additions/porn/paradisehill.py:128
 #: mpgz/src/additions/porn/porn00.py:116
 #: mpgz/src/additions/porn/pornfreetv.py:34
@@ -234,12 +241,14 @@ msgstr "Seite:"
 #: mpgz/src/additions/porn/pornfreetv.py:154
 #: mpgz/src/additions/porn/pornfreetv.py:169
 #: mpgz/src/additions/porn/pornfreetv.py:248
-#: mpgz/src/additions/porn/pornfromczech.py:164
+#: mpgz/src/additions/porn/pornfromczech.py:110
 #: mpgz/src/additions/porn/pornrewind.py:114
 #: mpgz/src/additions/porn/pornstreams.py:125
 #: mpgz/src/additions/porn/porntrex.py:235
 #: mpgz/src/additions/porn/porntrex.py:316
+#: mpgz/src/additions/porn/pornvex.py:105
 #: mpgz/src/additions/porn/pornvortexx.py:117
+#: mpgz/src/additions/porn/redtraffic.py:33
 #: mpgz/src/additions/porn/streammdh.py:41
 #: mpgz/src/additions/porn/streammdh.py:144
 #: mpgz/src/additions/porn/streamxxx.py:95
@@ -251,21 +260,17 @@ msgstr "Seite:"
 #: mpgz/src/additions/porn/yourpornsexy.py:290
 #: mpgz/src/additions/sport/wrestlingnetwork.py:27
 #: mpgz/src/additions/useradditions/ddl_me.py:217
-#: mpgz/src/additions/useradditions/filmpalast.py:66
-#: mpgz/src/additions/useradditions/filmpalast.py:182
-#: mpgz/src/additions/useradditions/filmpalast.py:248
-#: mpgz/src/additions/useradditions/filmpalast.py:320
+#: mpgz/src/additions/useradditions/filmpalast.py:125
+#: mpgz/src/additions/useradditions/filmpalast.py:191
+#: mpgz/src/additions/useradditions/filmpalast.py:263
 #: mpgz/src/additions/useradditions/flimmerstube.py:95
-#: mpgz/src/additions/useradditions/kinoxto.py:64
-#: mpgz/src/additions/useradditions/movie4k.py:84
-#: mpgz/src/additions/useradditions/movie4k.py:285
-#: mpgz/src/additions/useradditions/movie4k.py:365
-#: 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:853
-#: mpgz/src/additions/useradditions/serienstream.py:94
-#: mpgz/src/additions/useradditions/watchseries.py:278
+#: mpgz/src/additions/useradditions/movie4k.py:219
+#: mpgz/src/additions/useradditions/movie4k.py:299
+#: mpgz/src/additions/useradditions/movie4k.py:409
+#: mpgz/src/additions/useradditions/movie4k.py:479
+#: mpgz/src/additions/useradditions/movie4k.py:546
+#: mpgz/src/additions/useradditions/movie4k.py:789
+#: mpgz/src/additions/useradditions/serienstream.py:69
 #: src/additions/fun/chefkoch.py:60 src/additions/fun/chefkoch.py:113
 #: src/additions/fun/failto.py:79 src/additions/fun/funnyvideoclips_de.py:119
 #: src/additions/fun/gaskrank_tv.py:126 src/additions/fun/lachmeister_de.py:150
@@ -283,13 +288,11 @@ msgstr "Seite:"
 #: src/additions/mediatheken/kindertube.py:182
 #: src/additions/mediatheken/netzkino.py:144
 #: src/additions/mediatheken/orf.py:123 src/additions/mediatheken/orf.py:180
-#: src/additions/mediatheken/orf.py:239 src/additions/mediatheken/redbull.py:89
-#: src/additions/mediatheken/redbull.py:243
+#: src/additions/mediatheken/orf.py:239
 #: src/additions/mediatheken/servustv.py:135
 #: src/additions/mediatheken/southpark.py:144
 #: src/additions/mediatheken/southpark.py:226
 #: src/additions/mediatheken/tvnow.py:288
-#: src/additions/mediatheken/videogold_de.py:110
 #: src/additions/mediatheken/youtube.py:923
 #: src/additions/mediatheken/youtube.py:974
 #: src/additions/mediatheken/zdf.py:156 src/additions/mediatheken/zdf.py:284
@@ -300,7 +303,7 @@ msgstr "Seite:"
 #: src/additions/newsdoku/doku_to.py:138
 #: src/additions/newsdoku/dokus4_me.py:164
 #: src/additions/newsdoku/dokustream.py:175 src/additions/newsdoku/focus.py:119
-#: src/additions/newsdoku/urknall.py:73 src/additions/porn/ahme.py:202
+#: src/additions/newsdoku/urknall.py:75 src/additions/porn/ahme.py:202
 #: src/additions/porn/anyporn.py:113 src/additions/porn/anyporn.py:285
 #: src/additions/porn/badoinkvr.py:71 src/additions/porn/badoinkvr.py:145
 #: src/additions/porn/badoinkvr.py:219 src/additions/porn/bangbros.py:157
@@ -309,6 +312,7 @@ msgstr "Seite:"
 #: src/additions/porn/bongacams.py:207 src/additions/porn/brazzers.py:72
 #: src/additions/porn/brazzers.py:160 src/additions/porn/cam4.py:79
 #: src/additions/porn/cam4.py:186 src/additions/porn/cam4.py:249
+#: src/additions/porn/camhub.py:142 src/additions/porn/camhub.py:186
 #: src/additions/porn/camsoda.py:125 src/additions/porn/camsoda.py:205
 #: src/additions/porn/chaturbate.py:196 src/additions/porn/chaturbate.py:260
 #: src/additions/porn/cliphunter.py:255 src/additions/porn/cumlouder.py:73
@@ -323,10 +327,9 @@ msgstr "Seite:"
 #: src/additions/porn/extremetube.py:181 src/additions/porn/faapy.py:154
 #: src/additions/porn/faapy.py:228 src/additions/porn/fetishshrine.py:152
 #: src/additions/porn/freeones.py:176 src/additions/porn/hclips.py:178
-#: src/additions/porn/hdporn.py:138 src/additions/porn/hdzog.py:182
-#: src/additions/porn/homemoviestube.py:185 src/additions/porn/hotmovs.py:181
-#: 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/hdzog.py:182 src/additions/porn/homemoviestube.py:185
+#: src/additions/porn/hotmovs.py:181 src/additions/porn/hotscope.py:163
+#: src/additions/porn/hotscope.py:216 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/lovehomeporn.py:157
 #: src/additions/porn/mofos.py:72 src/additions/porn/mofos.py:151
@@ -335,29 +338,35 @@ msgstr "Seite:"
 #: 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/porn7.py:231 src/additions/porn/porn7.py:285
 #: 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: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
-#: src/additions/porn/sexu.py:68 src/additions/porn/sexu.py:145
-#: src/additions/porn/shemalez.py:180 src/additions/porn/shesfreaky.py:72
-#: src/additions/porn/shesfreaky.py:154 src/additions/porn/spankbang.py:204
-#: 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: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
-#: src/additions/porn/upornia.py:181 src/additions/porn/vintagetube.py:87
-#: src/additions/porn/vintagetube.py:181 src/additions/porn/vintagetube.py:257
-#: src/additions/porn/vintagetube.py:317 src/additions/porn/vjav.py:180
-#: src/additions/porn/voyeurhit.py:182 src/additions/porn/vporn.py:101
-#: src/additions/porn/vporn.py:307 src/additions/porn/wetplace.py:152
+#: src/additions/porn/pornhat.py:86 src/additions/porn/pornhat.py:191
+#: src/additions/porn/pornhat.py:227 src/additions/porn/pornhub.py:944
+#: src/additions/porn/pornhub.py:1147 src/additions/porn/pornicom.py:203
+#: src/additions/porn/pornicom.py:264 src/additions/porn/pornid.py:212
+#: src/additions/porn/pornid.py:288 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/pornxio.py:217
+#: src/additions/porn/pornxio.py:264 src/additions/porn/realgfporn.py:175
+#: src/additions/porn/realitykings.py:73 src/additions/porn/realitykings.py:171
+#: src/additions/porn/redtube.py:206 src/additions/porn/sexu.py:68
+#: src/additions/porn/sexu.py:145 src/additions/porn/shemalez.py:180
+#: src/additions/porn/shesfreaky.py:72 src/additions/porn/shesfreaky.py:154
+#: src/additions/porn/slutload.py:191 src/additions/porn/slutload.py:240
+#: src/additions/porn/spankbang.py:204 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:236 src/additions/porn/tubepornclassic.py:174
+#: src/additions/porn/tubewolf.py:87 src/additions/porn/tubewolf.py:161
+#: src/additions/porn/txxx.py:289 src/additions/porn/updatetube.py:92
+#: src/additions/porn/updatetube.py:198 src/additions/porn/upornia.py:181
+#: src/additions/porn/vintagetube.py:87 src/additions/porn/vintagetube.py:181
+#: src/additions/porn/vintagetube.py:257 src/additions/porn/vintagetube.py:317
+#: src/additions/porn/vjav.py:180 src/additions/porn/voyeurhit.py:182
+#: src/additions/porn/vporn.py:240 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:101
@@ -367,7 +376,6 @@ msgstr "Seite:"
 #: 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..."
@@ -386,7 +394,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:308 src/additions/fun/twitch.py:326
+#: src/additions/fun/twitch.py:309 src/additions/fun/twitch.py:327
 #: src/additions/mediatheken/arte.py:368 src/additions/mediatheken/atv.py:150
 #: src/additions/mediatheken/brf.py:145
 #: src/additions/mediatheken/dreisat.py:382
@@ -396,27 +404,29 @@ msgstr "Bitte warten..."
 #: src/additions/porn/ahme.py:217 src/additions/porn/anyporn.py:358
 #: src/additions/porn/badoinkvr.py:239 src/additions/porn/bangbros.py:183
 #: src/additions/porn/beeg.py:191 src/additions/porn/brazzers.py:180
-#: src/additions/porn/cliphunter.py:271 src/additions/porn/cumlouder.py:494
-#: src/additions/porn/ddfnetwork.py:275
+#: src/additions/porn/camhub.py:164 src/additions/porn/cliphunter.py:271
+#: src/additions/porn/cumlouder.py:494 src/additions/porn/ddfnetwork.py:275
 #: src/additions/porn/digitalplayground.py:190
 #: src/additions/porn/drtuber.py:220 src/additions/porn/eroprofile.py:177
 #: src/additions/porn/extremetube.py:209 src/additions/porn/faapy.py:245
-#: src/additions/porn/hclips.py:194 src/additions/porn/hdporn.py:151
-#: 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/hclips.py:194 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/julesjordan.py:251
 #: 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
+#: src/additions/porn/nubilefilms.py:242 src/additions/porn/porn7.py:264
+#: src/additions/porn/porndoe.py:193 src/additions/porn/porngo.py:233
+#: src/additions/porn/pornhat.py:208 src/additions/porn/pornicom.py:238
+#: src/additions/porn/pornid.py:260 src/additions/porn/pornxio.py:237
+#: src/additions/porn/realitykings.py:190 src/additions/porn/redtube.py:252
+#: src/additions/porn/shemalez.py:202 src/additions/porn/slutload.py:217
 #: src/additions/porn/spankwire.py:247 src/additions/porn/sunporno.py:227
 #: src/additions/porn/teamskeet.py:184 src/additions/porn/tnaflix.py:183
 #: src/additions/porn/tubepornclassic.py:192 src/additions/porn/tubewolf.py:200
-#: src/additions/porn/txxx.py:201 src/additions/porn/upornia.py:212
+#: src/additions/porn/txxx.py:325 src/additions/porn/upornia.py:212
 #: src/additions/porn/vintagetube.py:300 src/additions/porn/vjav.py:205
-#: src/additions/porn/voyeurhit.py:198 src/additions/porn/vporn.py:333
+#: src/additions/porn/voyeurhit.py:198 src/additions/porn/vporn.py:266
 #: src/additions/porn/wicked.py:254 src/additions/porn/x4tube.py:433
 #: src/additions/porn/xhamster.py:576 src/additions/porn/xxxdan.py:213
 #: src/additions/porn/youporn.py:416
@@ -438,25 +448,26 @@ msgstr ""
 #: mpgz/src/additions/porn/fapbraze.py:146
 #: mpgz/src/additions/porn/hqporner.py:168
 #: mpgz/src/additions/porn/javbraze.py:242
-#: mpgz/src/additions/porn/javdos.py:210 mpgz/src/additions/porn/lfporn.py:122
-#: mpgz/src/additions/porn/pandamovie.py:159
+#: mpgz/src/additions/porn/javdos.py:153 mpgz/src/additions/porn/lfporn.py:122
+#: mpgz/src/additions/porn/pandamovie.py:178
 #: mpgz/src/additions/porn/paradisehill.py:149
 #: mpgz/src/additions/porn/porn00.py:133
 #: mpgz/src/additions/porn/pornfreetv.py:197
-#: mpgz/src/additions/porn/pornfromczech.py:179
+#: mpgz/src/additions/porn/pornfromczech.py:125
 #: mpgz/src/additions/porn/pornrewind.py:130
 #: mpgz/src/additions/porn/pornstreams.py:141
+#: mpgz/src/additions/porn/pornvex.py:119
 #: mpgz/src/additions/porn/pornvortexx.py:137
 #: mpgz/src/additions/porn/streamxxx.py:188
-#: mpgz/src/additions/useradditions/filmpalast.py:260
-#: mpgz/src/additions/useradditions/filmpalast.py:334
-#: mpgz/src/additions/useradditions/movie4k.py:297
-#: mpgz/src/additions/useradditions/movie4k.py:388
-#: 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:753
-#: mpgz/src/additions/useradditions/movie4k.py:889
+#: mpgz/src/additions/useradditions/filmpalast.py:203
+#: mpgz/src/additions/useradditions/filmpalast.py:277
+#: mpgz/src/additions/useradditions/movie4k.py:231
+#: mpgz/src/additions/useradditions/movie4k.py:322
+#: mpgz/src/additions/useradditions/movie4k.py:349
+#: mpgz/src/additions/useradditions/movie4k.py:421
+#: mpgz/src/additions/useradditions/movie4k.py:493
+#: mpgz/src/additions/useradditions/movie4k.py:689
+#: mpgz/src/additions/useradditions/movie4k.py:825
 #: 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:699 src/additions/porn/pornhub.py:1026
@@ -472,23 +483,25 @@ msgstr "Keine Filme gefunden!"
 #: mpgz/src/additions/porn/adultbay.py:233
 #: mpgz/src/additions/porn/hqporner.py:217
 #: mpgz/src/additions/porn/hqporner.py:231
-#: mpgz/src/additions/porn/javdos.py:272 mpgz/src/additions/porn/javdos.py:275
+#: mpgz/src/additions/porn/javbraze.py:296
+#: mpgz/src/additions/porn/javbraze.py:298
+#: mpgz/src/additions/porn/javbraze.py:306
+#: mpgz/src/additions/porn/javdos.py:215 mpgz/src/additions/porn/javdos.py:218
 #: mpgz/src/additions/porn/lfporn.py:184
-#: mpgz/src/additions/porn/pandamovie.py:220
+#: mpgz/src/additions/porn/pandamovie.py:240
 #: mpgz/src/additions/porn/pornfreetv.py:263
-#: mpgz/src/additions/porn/pornfromczech.py:242
+#: mpgz/src/additions/porn/pornfromczech.py:188
 #: mpgz/src/additions/porn/pornrewind.py:207
 #: mpgz/src/additions/porn/pornstreams.py:203
 #: mpgz/src/additions/porn/streamxxx.py:253
 #: mpgz/src/additions/useradditions/ddl_me.py:562
-#: mpgz/src/additions/useradditions/filmpalast.py:399
+#: mpgz/src/additions/useradditions/filmpalast.py:342
 #: mpgz/src/additions/useradditions/flimmerstube.py:173
 #: mpgz/src/additions/useradditions/flimmerstube.py:181
-#: mpgz/src/additions/useradditions/kinoxto.py:827
-#: mpgz/src/additions/useradditions/kinoxto.py:862
-#: mpgz/src/additions/useradditions/kinoxto.py:944
-#: mpgz/src/additions/useradditions/serienstream.py:822
-#: mpgz/src/additions/useradditions/watchseries.py:296
+#: mpgz/src/additions/useradditions/kinoxto.py:770
+#: mpgz/src/additions/useradditions/kinoxto.py:804
+#: mpgz/src/additions/useradditions/kinoxto.py:885
+#: mpgz/src/additions/useradditions/serienstream.py:771
 msgid "No supported streams found!"
 msgstr "Keine unterstützten Streams gefunden!"
 
@@ -516,34 +529,23 @@ msgstr "Keine Pornstars gefunden!"
 #: mpgz/src/additions/porn/dirtymoviez.py:162
 #: mpgz/src/additions/porn/mydirtyhobby.py:172
 msgid "Sorry this is a premium video which is not available."
-msgstr ""
+msgstr "Sorry, dies ist ein Premium-Video, welches nicht verfügbar ist."
 
 #: mpgz/src/additions/porn/bitporno.py:172
 msgid "No playable movies found, try next page!"
 msgstr "Keine abspielbaren Filme gefunden, nächste Seite probieren!"
 
-#: mpgz/src/additions/porn/freeomovie.py:88
-#: mpgz/src/additions/porn/javdos.py:89
-#: mpgz/src/additions/porn/pornfromczech.py:88
-#: mpgz/src/additions/useradditions/filmpalast.py:129
-#: mpgz/src/additions/useradditions/kinoxto.py:91
-#: mpgz/src/additions/useradditions/movie4k.py:121
-#: mpgz/src/additions/useradditions/serienstream.py:124
-msgid "Mandatory depends python-requests and/or nodejs are missing!"
-msgstr ""
-"Zwingend erforderliche Abhängigkeiten python-requests und/oder nodejs fehlen!"
-
-#: mpgz/src/additions/porn/javdos.py:266
-#: mpgz/src/additions/porn/pornfromczech.py:266
-#: mpgz/src/additions/porn/pornfromczech.py:277
+#: mpgz/src/additions/porn/javdos.py:209
+#: mpgz/src/additions/porn/pornfromczech.py:212
+#: mpgz/src/additions/porn/pornfromczech.py:223
 #: mpgz/src/additions/porn/streammdh.py:67 src/additions/porn/hotscope.py:240
 #: src/additions/porn/pornhub.py:1246
 msgid "This plugin requires package nodejs."
 msgstr "Dieses Plugin benötigt das Paket nodejs."
 
-#: mpgz/src/additions/porn/javdos.py:268
-#: mpgz/src/additions/porn/pornfromczech.py:268
-#: mpgz/src/additions/porn/pornfromczech.py:279
+#: mpgz/src/additions/porn/javdos.py:211
+#: mpgz/src/additions/porn/pornfromczech.py:214
+#: mpgz/src/additions/porn/pornfromczech.py:225
 #: mpgz/src/additions/porn/streammdh.py:69 src/additions/porn/hotscope.py:242
 #: src/additions/porn/pornhub.py:1248
 msgid "Error executing Javascript, please report to the developers."
@@ -558,7 +560,7 @@ msgstr "Fehler beim Ausführen von Javascript, bitte an die Entwickler melden."
 #: 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:209 src/additions/porn/vporn.py:290
+#: src/additions/porn/tube8.py:209 src/additions/porn/vporn.py:223
 #: src/additions/porn/x4tube.py:246 src/additions/porn/x4tube.py:374
 #: src/additions/porn/xvideos.py:489 src/plugin.py:1771 src/plugin.py:2796
 msgid "Sort"
@@ -598,7 +600,7 @@ msgstr "Filter"
 #: 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:304 src/additions/porn/tube8.py:317
-#: src/additions/porn/vporn.py:360 src/additions/porn/wicked.py:178
+#: src/additions/porn/vporn.py:293 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:415 src/additions/porn/xvideos.py:370
@@ -608,10 +610,10 @@ msgstr "Filter"
 msgid "Select Action"
 msgstr "Wähle Aktion"
 
-#: mpgz/src/additions/porn/porn00.py:256 mpgz/src/additions/porn/porn00.py:264
-#: mpgz/src/additions/porn/porn00.py:282
-#: mpgz/src/additions/useradditions/filmpalast.py:412
-#: mpgz/src/additions/useradditions/serienstream.py:863
+#: mpgz/src/additions/porn/porn00.py:255 mpgz/src/additions/porn/porn00.py:263
+#: mpgz/src/additions/porn/porn00.py:281
+#: mpgz/src/additions/useradditions/filmpalast.py:355
+#: mpgz/src/additions/useradditions/serienstream.py:813
 msgid "Broken URL parsing, please report to the developers."
 msgstr "Defektes URL Parsing, bitte an die Entwickler melden."
 
@@ -623,38 +625,36 @@ msgstr "Nichts gefunden!"
 #: mpgz/src/additions/porn/porntrex.py:62
 #: mpgz/src/additions/porn/porntrex.py:151
 #: mpgz/src/additions/porn/porntrex.py:153
-#: mpgz/src/additions/useradditions/serienstream.py:61
-#: mpgz/src/additions/useradditions/serienstream.py:156
-#: mpgz/src/additions/useradditions/serienstream.py:158
+#: mpgz/src/additions/useradditions/serienstream.py:37
+#: mpgz/src/additions/useradditions/serienstream.py:105
+#: mpgz/src/additions/useradditions/serienstream.py:107
 #: 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: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/pornhub.py:282 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
+#: src/plugin.py:525 src/resources/simpleplayer.py:2350
 msgid "Setup"
 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:287
-#: src/additions/porn/vporn.py:230 src/additions/porn/youporn.py:228
+#: src/additions/porn/youporn.py:228
 msgid "Username:"
 msgstr "Username:"
 
 #: mpgz/src/additions/porn/porntrex.py:160
 #: 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:288 src/additions/porn/vporn.py:231
-#: src/additions/porn/youporn.py:229
+#: mpgz/src/additions/useradditions/serienstream.py:113
+#: src/additions/porn/pornhub.py:288 src/additions/porn/youporn.py:229
 msgid "Password:"
 msgstr "Passwort:"
 
 #: mpgz/src/additions/porn/porntrex.py:328
-#: mpgz/src/additions/useradditions/serienstream.py:132
+#: mpgz/src/additions/useradditions/serienstream.py:81
 msgid "Login data is required for video playback!"
 msgstr "Logindaten sind erforderlich für Video-Wiedergabe!"
 
@@ -671,8 +671,8 @@ msgid "Link will added in few Hours!"
 msgstr "Link wird in einen Stunden hinzugefügt!"
 
 #: mpgz/src/additions/useradditions/ddl_me.py:112
-#: mpgz/src/additions/useradditions/kinoxto.py:135
-#: mpgz/src/additions/useradditions/movie4k.py:181
+#: mpgz/src/additions/useradditions/kinoxto.py:78
+#: mpgz/src/additions/useradditions/movie4k.py:115
 #: src/additions/mediatheken/ard.py:90 src/additions/mediatheken/youtube.py:525
 #: src/additions/mediatheken/zdf.py:103 src/additions/newsdoku/dokus4_me.py:74
 #: src/resources/mpscreen.py:399
@@ -687,47 +687,47 @@ msgstr "Sortierung"
 msgid "No movies/shows found!"
 msgstr "Keine Filme/Serien gefunden!"
 
-#: mpgz/src/additions/useradditions/filmpalast.py:53
-#: mpgz/src/additions/useradditions/kinoxto.py:52
+#: mpgz/src/additions/useradditions/filmpalast.py:29
+#: mpgz/src/additions/useradditions/kinoxto.py:28
 #: src/additions/mediatheken/kindertube.py:61
 msgid "Genre Selection"
 msgstr "Genre Auswahl"
 
-#: mpgz/src/additions/useradditions/filmpalast.py:193
-#: mpgz/src/additions/useradditions/serienstream.py:238
+#: mpgz/src/additions/useradditions/filmpalast.py:136
+#: mpgz/src/additions/useradditions/serienstream.py:187
 #: src/additions/mediatheken/myspass.py:88
 msgid "No shows found!"
 msgstr "Keine Serien gefunden!"
 
-#: mpgz/src/additions/useradditions/filmpalast.py:237
-#: mpgz/src/additions/useradditions/kinoxto.py:588
-#: mpgz/src/additions/useradditions/serienstream.py:626
+#: mpgz/src/additions/useradditions/filmpalast.py:180
+#: mpgz/src/additions/useradditions/kinoxto.py:531
+#: mpgz/src/additions/useradditions/serienstream.py:575
 msgid "Episode Selection"
 msgstr "Episoden Auswahl"
 
-#: mpgz/src/additions/useradditions/filmpalast.py:375
-#: mpgz/src/additions/useradditions/kinoxto.py:767
-#: mpgz/src/additions/useradditions/movie4k.py:601
-#: mpgz/src/additions/useradditions/serienstream.py:795
-#: mpgz/src/additions/useradditions/serienstream.py:796
+#: mpgz/src/additions/useradditions/filmpalast.py:318
+#: mpgz/src/additions/useradditions/kinoxto.py:710
+#: mpgz/src/additions/useradditions/movie4k.py:535
+#: mpgz/src/additions/useradditions/serienstream.py:744
+#: mpgz/src/additions/useradditions/serienstream.py:745
 msgid "Stream Selection"
 msgstr "Stream Auswahl"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:423
-#: mpgz/src/additions/useradditions/kinoxto.py:521
-#: mpgz/src/additions/useradditions/kinoxto.py:971
-#: mpgz/src/additions/useradditions/serienstream.py:210
+#: mpgz/src/additions/useradditions/kinoxto.py:366
+#: mpgz/src/additions/useradditions/kinoxto.py:464
+#: mpgz/src/additions/useradditions/kinoxto.py:912
+#: mpgz/src/additions/useradditions/serienstream.py:159
 msgid "Add to Watchlist"
 msgstr "Zur Watchlist hinzufügen"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:497
-#: mpgz/src/additions/useradditions/kinoxto.py:568
-#: mpgz/src/additions/useradditions/kinoxto.py:1038
-#: mpgz/src/additions/useradditions/serienstream.py:295
+#: mpgz/src/additions/useradditions/kinoxto.py:440
+#: mpgz/src/additions/useradditions/kinoxto.py:511
+#: mpgz/src/additions/useradditions/kinoxto.py:979
+#: mpgz/src/additions/useradditions/serienstream.py:244
 msgid "Selection was added to the watchlist."
 msgstr "Auswahl wurde zur Watchlist hinzugefügt."
 
-#: mpgz/src/additions/useradditions/kinoxto.py:519 src/additions/fun/ccc.py:26
+#: mpgz/src/additions/useradditions/kinoxto.py:462 src/additions/fun/ccc.py:26
 #: src/additions/fun/ccc.py:108 src/additions/fun/forplayers.py:25
 #: src/additions/fun/germanytv.py:57 src/additions/fun/germanytv.py:99
 #: src/additions/fun/itunestrailers.py:63 src/additions/mediatheken/ard.py:125
@@ -738,16 +738,7 @@ msgstr "Auswahl wurde zur Watchlist hinzugefügt."
 #: src/additions/mediatheken/funk.py:67 src/additions/mediatheken/funk.py:154
 #: src/additions/mediatheken/funk.py:256
 #: src/additions/mediatheken/netzkino.py:132
-#: src/additions/mediatheken/orf.py:228 src/additions/mediatheken/seventv.py:65
-#: src/additions/mediatheken/seventv.py:100
-#: src/additions/mediatheken/seventv.py:127
-#: src/additions/mediatheken/seventv.py:128
-#: src/additions/mediatheken/seventv.py:152
-#: src/additions/mediatheken/seventv.py:182
-#: src/additions/mediatheken/seventv.py:183
-#: src/additions/mediatheken/seventv.py:216
-#: src/additions/mediatheken/seventv.py:247
-#: src/additions/mediatheken/seventv.py:304
+#: src/additions/mediatheken/orf.py:228
 #: src/additions/mediatheken/spiegeltv.py:61
 #: src/additions/mediatheken/spiegeltv.py:117
 #: src/additions/mediatheken/tvnow.py:64 src/additions/mediatheken/tvnow.py:91
@@ -766,81 +757,80 @@ msgstr "Auswahl wurde zur Watchlist hinzugefügt."
 msgid "Selection:"
 msgstr "Auswahl:"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:660
-#: mpgz/src/additions/useradditions/serienstream.py:369
-#: mpgz/src/additions/useradditions/serienstream.py:685
-#: mpgz/src/additions/useradditions/watchseries.py:240
+#: mpgz/src/additions/useradditions/kinoxto.py:603
+#: mpgz/src/additions/useradditions/serienstream.py:318
+#: mpgz/src/additions/useradditions/serienstream.py:634
 #: src/additions/mediatheken/funk.py:333
 #: src/additions/mediatheken/southpark.py:173
 msgid "No episodes found!"
 msgstr "Keine Episoden gefunden!"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:699
-#: mpgz/src/additions/useradditions/serienstream.py:442
-#: src/additions/fun/twitch.py:133 src/additions/mediatheken/youtube.py:863
+#: mpgz/src/additions/useradditions/kinoxto.py:642
+#: mpgz/src/additions/useradditions/serienstream.py:391
+#: src/additions/fun/twitch.py:134 src/additions/mediatheken/youtube.py:863
 #: src/additions/music/radio.py:430 src/additions/music/shoutcast.py:327
-#: src/additions/porn/x2search4porn.py:80 src/resources/simpleplayer.py:707
+#: src/additions/porn/x2search4porn.py:80 src/resources/simpleplayer.py:710
 msgid "Delete"
 msgstr "Löschen"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:721
-#: mpgz/src/additions/useradditions/serienstream.py:474
+#: mpgz/src/additions/useradditions/kinoxto.py:664
+#: mpgz/src/additions/useradditions/serienstream.py:423
 msgid "Watchlist is currently empty"
 msgstr "Watchlist ist derzeit leer"
 
-#: mpgz/src/additions/useradditions/kinoxto.py:909
-#: mpgz/src/additions/useradditions/movie4k.py:736
+#: mpgz/src/additions/useradditions/kinoxto.py:851
+#: mpgz/src/additions/useradditions/movie4k.py:672
 msgid "Parts Selection"
 msgstr "Part Auswahl"
 
-#: mpgz/src/additions/useradditions/movie4k.py:191 src/plugin.py:1184
+#: mpgz/src/additions/useradditions/movie4k.py:125 src/plugin.py:1184
 #: src/plugin.py:1198 src/plugin.py:1328 src/plugin.py:2253 src/plugin.py:2431
 #: src/plugin.py:2499 src/plugin.py:3145 src/plugin.py:3291 src/plugin.py:3359
 msgid "Please enter the correct PIN"
 msgstr "Bitte die korrekte PIN eingeben"
 
-#: mpgz/src/additions/useradditions/movie4k.py:191
+#: mpgz/src/additions/useradditions/movie4k.py:125
 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:806
-#: mpgz/src/additions/useradditions/movie4k.py:810
-#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:688
+#: mpgz/src/additions/useradditions/movie4k.py:650
+#: mpgz/src/additions/useradditions/movie4k.py:654
+#: mpgz/src/additions/useradditions/movie4k.py:742
+#: mpgz/src/additions/useradditions/movie4k.py:746
+#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:684
 msgid "Stream not found, try another Stream Hoster."
 msgstr "Stream nicht gefunden, versuche einen anderen Stream Hoster."
 
-#: mpgz/src/additions/useradditions/serienstream.py:60
+#: mpgz/src/additions/useradditions/serienstream.py:36
 msgid "Selection"
 msgstr "Auswahl"
 
-#: mpgz/src/additions/useradditions/serienstream.py:163
+#: mpgz/src/additions/useradditions/serienstream.py:112
 msgid "Email:"
 msgstr "Email:"
 
-#: mpgz/src/additions/useradditions/serienstream.py:554
+#: mpgz/src/additions/useradditions/serienstream.py:503
 msgid "Season Selection"
 msgstr "Staffel Auswahl"
 
-#: mpgz/src/additions/useradditions/serienstream.py:576
+#: mpgz/src/additions/useradditions/serienstream.py:525
 msgid "Movies"
 msgstr "Filme"
 
-#: mpgz/src/additions/useradditions/serienstream.py:578
+#: mpgz/src/additions/useradditions/serienstream.py:527
 msgid "Season"
 msgstr "Staffel"
 
-#: mpgz/src/additions/useradditions/serienstream.py:580
+#: mpgz/src/additions/useradditions/serienstream.py:529
 #: src/additions/mediatheken/myspass.py:152
 msgid "No seasons found!"
 msgstr "Keine Staffeln gefunden!"
 
-#: mpgz/src/additions/useradditions/serienstream.py:628
+#: mpgz/src/additions/useradditions/serienstream.py:577
 msgid "Toggle"
-msgstr ""
+msgstr "Umschalten"
 
-#: mpgz/src/additions/useradditions/serienstream.py:857
+#: mpgz/src/additions/useradditions/serienstream.py:807
 msgid ""
 "Sorry this video is currently captcha protected, please try again later."
 msgstr ""
@@ -903,7 +893,7 @@ msgstr "Menü"
 #: src/additions/fun/germanytv.py:100 src/additions/fun/germanytv.py:160
 #: src/plugin.py:871 src/plugin.py:1775 src/plugin.py:2800
 #: src/resources/showAsThumb.py:246 src/resources/simplelist.py:118
-#: src/resources/simplelist.py:637 src/resources/simpleplayer.py:715
+#: src/resources/simplelist.py:637 src/resources/simpleplayer.py:718
 msgid "Exit"
 msgstr "Beenden"
 
@@ -915,18 +905,18 @@ msgstr "Keine Programmdaten gefunden!"
 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:376
-#: src/additions/fun/twitch.py:394 src/additions/fun/twitch.py:396
+#: src/additions/fun/twitch.py:101 src/additions/fun/twitch.py:107
+#: src/additions/fun/twitch.py:140 src/additions/fun/twitch.py:377
+#: src/additions/fun/twitch.py:395 src/additions/fun/twitch.py:397
 msgid "any"
 msgstr "alle"
 
-#: src/additions/fun/twitch.py:131 src/additions/music/radio.py:297
+#: src/additions/fun/twitch.py:132 src/additions/music/radio.py:297
 #: src/additions/music/shoutcast.py:202
 msgid "Add to Favorites"
 msgstr "Zu Favoriten hinzufügen"
 
-#: src/additions/fun/twitch.py:136 src/additions/mediatheken/youtube.py:145
+#: src/additions/fun/twitch.py:137 src/additions/mediatheken/youtube.py:145
 #: src/additions/mediatheken/youtube.py:151
 #: src/additions/mediatheken/youtube.py:155
 #: src/additions/mediatheken/youtube.py:165
@@ -934,27 +924,27 @@ msgstr "Zu Favoriten hinzufügen"
 msgid "Videos"
 msgstr "Videos"
 
-#: src/additions/fun/twitch.py:142 src/additions/fun/twitch.py:400
+#: src/additions/fun/twitch.py:143 src/additions/fun/twitch.py:401
 #: 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:235 src/additions/music/radio.py:456
+#: src/additions/fun/twitch.py:236 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:249 src/additions/fun/twitch.py:290
+#: src/additions/fun/twitch.py:250 src/additions/fun/twitch.py:291
 msgid "No games found!"
 msgstr "Keine Spiele gefunden!"
 
-#: src/additions/fun/twitch.py:264 src/additions/fun/twitch.py:279
+#: src/additions/fun/twitch.py:265 src/additions/fun/twitch.py:280
 msgid "No streams found!"
 msgstr "Keine Streams gefunden!"
 
-#: src/additions/fun/twitch.py:341 src/additions/mediatheken/youtube.py:389
+#: src/additions/fun/twitch.py:342 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
@@ -963,16 +953,16 @@ msgstr "Keine Streams gefunden!"
 msgid "No channels found!"
 msgstr "Keine Kanäle gefunden!"
 
-#: src/additions/fun/twitch.py:377
+#: src/additions/fun/twitch.py:378
 msgid "Select language"
 msgstr "Wähle Sprache"
 
-#: src/additions/fun/twitch.py:417 src/additions/music/radio.py:407
+#: src/additions/fun/twitch.py:418 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:456
+#: src/additions/fun/twitch.py:457
 msgid "There is currently no live stream available on this channel."
 msgstr "Derzeit ist kein Live-Stream auf diesem Kanal verfügbar."
 
@@ -989,7 +979,6 @@ msgstr "Genre:"
 #: src/additions/mediatheken/arte.py:277 src/additions/mediatheken/arte.py:279
 #: src/additions/mediatheken/arte.py:311 src/additions/mediatheken/arte.py:313
 #: src/additions/mediatheken/arte.py:360
-#: src/additions/mediatheken/redbull.py:227
 #: src/additions/mediatheken/spiegeltv.py:191
 #: src/additions/mediatheken/youtube.py:1257
 #: src/additions/mediatheken/youtube.py:1287 src/additions/newsdoku/bild.py:180
@@ -1001,7 +990,7 @@ msgstr "Laufzeit:"
 msgid "Date:"
 msgstr "Datum:"
 
-#: src/additions/mediatheken/arte.py:413 src/additions/newsdoku/urknall.py:132
+#: src/additions/mediatheken/arte.py:413 src/additions/newsdoku/urknall.py:134
 msgid "This video is not available."
 msgstr "Dieses Video ist nicht verfügbar."
 
@@ -1016,32 +1005,35 @@ msgstr "Keine Inhalte / Ergebnisse gefunden!"
 msgid "Parsing error!"
 msgstr "Parsing error!"
 
-#: src/additions/mediatheken/redbull.py:252
-msgid "This event is not yet available."
-msgstr "Dieses Event ist noch nicht verfügbar."
+#: src/additions/mediatheken/netflix.py:75
+msgid "Please wait while we launch Netflix..."
+msgstr "Bitte warten Sie, während wir Netflix starten..."
 
-#: src/additions/mediatheken/seventv.py:64
-#: src/additions/mediatheken/tvnow.py:63 src/additions/music/radio.py:296
-#: src/additions/music/shoutcast.py:201
-msgid "Stations:"
-msgstr "Sender:"
+#: src/additions/mediatheken/netflix.py:78
+msgid "Please configure your login data first!"
+msgstr "Bitte konfigurieren Sie zuerst Ihre Zugangsdaten!"
 
-#: src/additions/mediatheken/seventv.py:262
-#: src/additions/mediatheken/tvnow.py:276
-msgid "Episodes:"
-msgstr "Episoden:"
+#: src/additions/mediatheken/netflix.py:79
+msgid ""
+"Please configure your login data first via VideoOnDemand plugin in "
+"extensions menu."
+msgstr ""
+"Bitte konfigurieren Sie Ihre Zugangsdaten zunächst über das VideoOnDemand "
+"Plugin im Erweiterungsmenü."
 
-#: src/additions/mediatheken/seventv.py:268
-msgid "Clips:"
-msgstr "Clips:"
+#: src/additions/mediatheken/netflix.py:79
+msgid "Note: Your login data has to be stored else this plugin will not work."
+msgstr ""
+"Hinweis: Ihre Zugangsdaten müssen gespeichert werden, ansonsten funktioniert "
+"dieses Plugin nicht."
 
-#: src/additions/mediatheken/seventv.py:290
-msgid "Currently no episodes/clips available!"
-msgstr "Momentan sind keine Folgen/Clips verfügbar!"
+#: src/additions/mediatheken/netflix.py:81
+msgid "This plugin is only available for Dreambox One and Two!"
+msgstr "Dieses Plugin ist nur für Dreambox One und Two verfügbar!"
 
-#: src/additions/mediatheken/seventv.py:368
-msgid "This episode/clip can't be played it's protected with DRM."
-msgstr "Episode/Clip kann nicht abgespielt werden da DRM-geschützt."
+#: src/additions/mediatheken/netflix.py:102
+msgid "Launching Netflix failed!"
+msgstr "Der Start von Netflix ist fehlgeschlagen!"
 
 #: src/additions/mediatheken/southpark.py:200
 #: src/additions/mediatheken/southpark.py:286 src/resources/mtvdelink.py:28
@@ -1053,6 +1045,11 @@ msgstr ""
 "Dieses Video wurde nicht gefunden oder ist auf Grund von Datums oder "
 "Rechtebeschränkungen nicht länger verfügbar."
 
+#: src/additions/mediatheken/tvnow.py:63 src/additions/music/radio.py:296
+#: src/additions/music/shoutcast.py:201
+msgid "Stations:"
+msgstr "Sender:"
+
 #: src/additions/mediatheken/tvnow.py:193
 msgid "Seasons:"
 msgstr "Staffeln:"
@@ -1061,18 +1058,14 @@ msgstr "Staffeln:"
 msgid "Currently no seasons available!"
 msgstr "Momentan sind keine Staffeln verfügbar!"
 
+#: src/additions/mediatheken/tvnow.py:276
+msgid "Episodes:"
+msgstr "Episoden:"
+
 #: src/additions/mediatheken/tvnow.py:408
 msgid "Currently no playable/free episodes available!"
 msgstr "Momentan sind keine abspielbaren/kostenlosen Folgen verfügbar!"
 
-#: src/additions/mediatheken/videogold_de.py:130
-#: src/additions/newsdoku/dokus4_me.py:172
-#: src/additions/newsdoku/dokus4_me.py:196
-#: src/additions/newsdoku/dokustream.py:183
-#: src/additions/newsdoku/dokustream.py:209
-msgid "No dokus found!"
-msgstr "Keine Dokus gefunden!"
-
 #: src/additions/mediatheken/youtube.py:58
 #: src/additions/mediatheken/youtube.py:1634
 msgid "Date"
@@ -1503,6 +1496,7 @@ msgstr "Favorit"
 #: src/additions/mediatheken/youtube.py:953
 msgid "Playlist loading failed! Please try again."
 msgstr ""
+"Das Laden der Playlist ist fehlgeschlagen! Bitte versuchen Sie es erneut."
 
 #: src/additions/mediatheken/youtube.py:1127
 msgid "We switched to our API backup key, please try again!"
@@ -1710,6 +1704,13 @@ msgstr "Keine abspielbaren Dokus gefunden!"
 msgid "No streamlink found."
 msgstr "Kein Streamlink gefunden."
 
+#: src/additions/newsdoku/dokus4_me.py:172
+#: src/additions/newsdoku/dokus4_me.py:196
+#: src/additions/newsdoku/dokustream.py:183
+#: src/additions/newsdoku/dokustream.py:209
+msgid "No dokus found!"
+msgstr "Keine Dokus gefunden!"
+
 #: src/additions/porn/badoinkvr.py:95 src/additions/porn/bangbros.py:102
 #: src/additions/porn/brazzers.py:105 src/additions/porn/ddfnetwork.py:117
 #: src/additions/porn/digitalplayground.py:114
@@ -1722,7 +1723,8 @@ 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:776
+#: src/additions/porn/beeg.py:238 src/additions/porn/camhub.py:191
+#: src/additions/porn/camhub.py:217 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"
@@ -1850,10 +1852,6 @@ msgstr "Region"
 msgid "Keywords"
 msgstr "Keywords"
 
-#: src/additions/sport/sporttotal.py:152
-msgid "Currently no streams available"
-msgstr "Momentan sind keine Streams verfügbar"
-
 #: src/plugin.py:186
 msgid "Crossfade (fast)"
 msgstr "Überblenden (schnell)"
@@ -1945,7 +1943,7 @@ msgstr "Film am Ende pausieren"
 
 #: src/plugin.py:261 src/plugin.py:280 src/resources/simplelist.py:508
 #: src/resources/simplelist.py:683 src/resources/simplelist.py:707
-#: src/resources/simpleplayer.py:1792 src/resources/simpleplayer.py:1798
+#: src/resources/simpleplayer.py:1811 src/resources/simpleplayer.py:1817
 msgid "No"
 msgstr "Nein"
 
@@ -1987,15 +1985,15 @@ msgstr "Aus"
 
 #: src/plugin.py:267 src/plugin.py:269
 msgid "Mode 1"
-msgstr ""
+msgstr "Modus 1"
 
 #: src/plugin.py:267 src/plugin.py:269
 msgid "Mode 2"
-msgstr ""
+msgstr "Modus 2"
 
 #: src/plugin.py:267
 msgid "Mode 3"
-msgstr ""
+msgstr "Modus 3"
 
 #: src/plugin.py:270
 msgid "Ken Burns effect"
@@ -2033,7 +2031,7 @@ msgstr "Hellgrün"
 msgid "premiumize.me is not activated."
 msgstr "premiumize.me ist nicht aktiviert."
 
-#: src/plugin.py:559 src/resources/simpleplayer.py:2235
+#: src/plugin.py:559 src/resources/simpleplayer.py:2278
 msgid "GENERAL"
 msgstr "ALLGEMEIN"
 
@@ -2145,7 +2143,7 @@ msgstr "Temporäres Cacheverzeichnis:"
 msgid "Icon Cachepath:"
 msgstr "Icon Cacheverzeichnis:"
 
-#: src/plugin.py:599 src/resources/simpleplayer.py:2238
+#: src/plugin.py:599 src/resources/simpleplayer.py:2281
 msgid "Videoquality:"
 msgstr "Videoqualität:"
 
@@ -2153,35 +2151,35 @@ msgstr "Videoqualität:"
 msgid "Watchlist/Playlist/Userchan path:"
 msgstr "Watchlist/Playlist/Userchan Verzeichnis:"
 
-#: src/plugin.py:602 src/resources/simpleplayer.py:2249
+#: src/plugin.py:602 src/resources/simpleplayer.py:2292
 msgid "YOUTUBE"
 msgstr "YOUTUBE"
 
-#: src/plugin.py:603 src/resources/simpleplayer.py:2250
+#: src/plugin.py:603 src/resources/simpleplayer.py:2293
 msgid "Highest resolution for playback:"
 msgstr "Höchste Auflösung für die Wiedergabe:"
 
-#: src/plugin.py:604 src/resources/simpleplayer.py:2251
+#: src/plugin.py:604 src/resources/simpleplayer.py:2294
 msgid "Enable DASH format (no seeking possible):"
 msgstr "DASH Format aktivieren (kein Spulen möglich):"
 
-#: src/plugin.py:606 src/resources/simpleplayer.py:2253
+#: src/plugin.py:606 src/resources/simpleplayer.py:2296
 msgid "Use DASH format for 480p:"
 msgstr "DASH Format verwenden für 480p:"
 
-#: src/plugin.py:607 src/resources/simpleplayer.py:2254
+#: src/plugin.py:607 src/resources/simpleplayer.py:2297
 msgid "Use DASH format for 720p:"
 msgstr "DASH Format verwenden für 720p:"
 
-#: src/plugin.py:608 src/resources/simpleplayer.py:2255
+#: src/plugin.py:608 src/resources/simpleplayer.py:2298
 msgid "Enable VP9 codec (required for resolutions >1080p):"
 msgstr "VP9 Codec aktivieren (erforderlich für Auflösungen >1080p):"
 
-#: src/plugin.py:610 src/resources/simpleplayer.py:2257
+#: src/plugin.py:610 src/resources/simpleplayer.py:2300
 msgid "Enable VP9 HDR (only for resolutions 720p and higher):"
 msgstr "VP9 HDR aktivieren (nur für Auflösungen ab 720p):"
 
-#: src/plugin.py:612 src/resources/simpleplayer.py:2259
+#: src/plugin.py:612 src/resources/simpleplayer.py:2302
 msgid "Enable Opus codec:"
 msgstr "Opus Codec aktivieren:"
 
@@ -2215,7 +2213,7 @@ msgstr "premiumize.me aktivieren:"
 
 #: src/plugin.py:624
 msgid "API-Key:"
-msgstr ""
+msgstr "API-Key:"
 
 #: src/plugin.py:627
 msgid "Activate Real-Debrid.com:"
@@ -2441,7 +2439,7 @@ msgstr "Eingabe"
 msgid "Really close without saving settings?"
 msgstr "Wirklich schließen ohne die Einstellungen zu speichern?"
 
-#: src/resources/hosters/vidup.py:23
+#: src/resources/hosters/vidup.py:28
 #, python-format
 msgid "IP address not authorized. Visit %s/pair to pair your IP."
 msgstr ""
@@ -2548,7 +2546,7 @@ msgstr "A-Z Suche"
 #: src/resources/mpscreen.py:144 src/resources/mpscreen.py:248
 #, python-format
 msgid "Mandatory skin file %s is missing!"
-msgstr ""
+msgstr "Obligatorische Skin-Datei %s fehlt!"
 
 #: src/resources/mpscreen.py:197
 msgid "Show TMDb info"
@@ -2570,7 +2568,7 @@ msgstr "Seitennummer eingeben"
 msgid "Sorry, this video is not available in your region."
 msgstr "Dieses Video ist in ihrer Region nicht verfügbar."
 
-#: src/resources/mtvdelink.py:82 src/resources/simpleplayer.py:1528
+#: src/resources/mtvdelink.py:82 src/resources/simpleplayer.py:1545
 msgid "No URL found!"
 msgstr "Keine URL gefunden!"
 
@@ -2723,8 +2721,8 @@ msgstr ""
 "aktiviert werden"
 
 #: src/resources/simplelist.py:507 src/resources/simplelist.py:682
-#: src/resources/simplelist.py:706 src/resources/simpleplayer.py:1790
-#: src/resources/simpleplayer.py:1797
+#: src/resources/simplelist.py:706 src/resources/simpleplayer.py:1809
+#: src/resources/simpleplayer.py:1816
 msgid "Yes"
 msgstr "Ja"
 
@@ -2793,194 +2791,194 @@ msgstr "Globale Playlist-Nummer"
 msgid "Google coversupport"
 msgstr "Google Cover aktivieren"
 
-#: src/resources/simpleplayer.py:125
+#: src/resources/simpleplayer.py:128
 msgid "You've to check Your HLS-PLayer Cachepath-Setting in MP-Setup:\n"
 msgstr ""
 "Bitte die HLS-Player Cacheverzeichnis Einstellung im MP-Setup prüfen:\n"
 
-#: src/resources/simpleplayer.py:630
+#: src/resources/simpleplayer.py:633
 msgid "Resuming playback"
 msgstr "Fortsetzen der Wiedergabe"
 
-#: src/resources/simpleplayer.py:632
+#: src/resources/simpleplayer.py:635
 msgid "Do you want to resume this playback?"
 msgstr "Soll diese Wiedergabe fortgesetzt werden?"
 
-#: src/resources/simpleplayer.py:632
+#: src/resources/simpleplayer.py:635
 #, python-format
 msgid "Resume position at %s"
 msgstr "Wiederaufnahmeposition bei %s"
 
-#: src/resources/simpleplayer.py:711
+#: src/resources/simpleplayer.py:714
 msgid "to Player"
 msgstr "zum Player"
 
-#: src/resources/simpleplayer.py:714
+#: src/resources/simpleplayer.py:717
 msgid "Playmode"
 msgstr "Abspielmodus"
 
-#: src/resources/simpleplayer.py:1236
+#: src/resources/simpleplayer.py:1247
 msgid "Tuning..."
 msgstr "Tune..."
 
-#: src/resources/simpleplayer.py:1239
+#: src/resources/simpleplayer.py:1250
 msgid "Connecting..."
 msgstr "Verbinde..."
 
-#: src/resources/simpleplayer.py:1242
+#: src/resources/simpleplayer.py:1253
 msgid "Please wait!"
 msgstr "Bitte warten!"
 
-#: src/resources/simpleplayer.py:1245
+#: src/resources/simpleplayer.py:1256
 msgid "Reconnecting..."
 msgstr "Verbinde neu..."
 
-#: src/resources/simpleplayer.py:1414 src/resources/simpleplayer.py:1423
+#: src/resources/simpleplayer.py:1431 src/resources/simpleplayer.py:1440
 #, python-format
 msgid "This STB can't decode %s streams!"
 msgstr "Diese STB kann %s Streams nicht wiedergeben!"
 
-#: src/resources/simpleplayer.py:1443
+#: src/resources/simpleplayer.py:1460
 #, python-format
 msgid "Streaming error: %s"
 msgstr "Streaming Fehler: %s"
 
-#: src/resources/simpleplayer.py:1475
+#: src/resources/simpleplayer.py:1492
 msgid "Buffering..."
 msgstr "Puffern..."
 
-#: src/resources/simpleplayer.py:1791
+#: src/resources/simpleplayer.py:1810
 #, python-format
 msgid "Yes & Add Service to global Playlist-%02d"
 msgstr "Ja & Service zur globalen Playlist-%02d hinzufügen"
 
-#: src/resources/simpleplayer.py:1793 src/resources/simpleplayer.py:1799
+#: src/resources/simpleplayer.py:1812 src/resources/simpleplayer.py:1818
 msgid "No, but start over from the beginning"
 msgstr "Nein, aber von Anfang an neu beginnen"
 
-#: src/resources/simpleplayer.py:1802
+#: src/resources/simpleplayer.py:1821
 msgid "Stop playing this movie?"
 msgstr "Wiedergabe dieses Films stoppen?"
 
-#: src/resources/simpleplayer.py:1937
+#: src/resources/simpleplayer.py:1980
 msgid "No entries in the playlist available!"
 msgstr "Keine Einträge in der Playlist vorhanden!"
 
-#: src/resources/simpleplayer.py:2019
+#: src/resources/simpleplayer.py:2062
 msgid "Error: Service may be added only from the local playlist"
 msgstr "Fehler: Service darf nur von der lokalen Playlist hinzugefügt werden"
 
-#: src/resources/simpleplayer.py:2033
+#: src/resources/simpleplayer.py:2076
 msgid "Error: URL is not persistent!"
 msgstr "Fehler: URL ist nicht persistent!"
 
-#: src/resources/simpleplayer.py:2039
+#: src/resources/simpleplayer.py:2082
 msgid "Added entry"
 msgstr "Eintrag hinzugefügt"
 
-#: src/resources/simpleplayer.py:2041
+#: src/resources/simpleplayer.py:2084
 msgid "Entry already exists"
 msgstr "Eintrag schon vorhanden"
 
-#: src/resources/simpleplayer.py:2043
+#: src/resources/simpleplayer.py:2086
 msgid "Error!"
 msgstr "Fehler!"
 
-#: src/resources/simpleplayer.py:2217 src/resources/simpleplayer.py:2218
+#: src/resources/simpleplayer.py:2260 src/resources/simpleplayer.py:2261
 msgid "SimplePlayer Setup"
 msgstr "SimplePlayer Einstellungen"
 
-#: src/resources/simpleplayer.py:2236
+#: src/resources/simpleplayer.py:2279
 msgid "Global playlist number:"
 msgstr "Globale Playlist-Nummer:"
 
-#: src/resources/simpleplayer.py:2237
+#: src/resources/simpleplayer.py:2280
 msgid "Playmode:"
 msgstr "Abspielmodus:"
 
-#: src/resources/simpleplayer.py:2240
+#: src/resources/simpleplayer.py:2283
 msgid "Buffersize (in seconds):"
 msgstr "Puffergröße (in Sekunden):"
 
-#: src/resources/simpleplayer.py:2241
+#: src/resources/simpleplayer.py:2284
 msgid "Save resume cache in flash memory:"
 msgstr "Speichere Wiederaufnahme-Cache im Flashspeicher:"
 
-#: src/resources/simpleplayer.py:2242
+#: src/resources/simpleplayer.py:2285
 msgid "Behavior on movie start:"
 msgstr "Verhalten bei Filmstart:"
 
-#: src/resources/simpleplayer.py:2243
+#: src/resources/simpleplayer.py:2286
 msgid "Behavior on movie stop:"
 msgstr "Verhalten bei Filmstopp:"
 
-#: src/resources/simpleplayer.py:2244
+#: src/resources/simpleplayer.py:2287
 msgid "Behavior on movie end:"
 msgstr "Verhalten bei Filmende:"
 
-#: src/resources/simpleplayer.py:2245
+#: src/resources/simpleplayer.py:2288
 msgid "Seekbar sensibility:"
 msgstr "Suchleistenempfindlichkeit:"
 
-#: src/resources/simpleplayer.py:2246
+#: src/resources/simpleplayer.py:2289
 msgid "Infobar cover always off:"
 msgstr "Infobar-Coveranzeige immer aus:"
 
-#: src/resources/simpleplayer.py:2247
+#: src/resources/simpleplayer.py:2290
 msgid "Use SP number seek:"
 msgstr "Verwende SP Nummernsuche:"
 
-#: src/resources/simpleplayer.py:2261
+#: src/resources/simpleplayer.py:2304
 msgid "RADIO"
 msgstr "RADIO"
 
-#: src/resources/simpleplayer.py:2262
+#: src/resources/simpleplayer.py:2305
 msgid "Radio cover:"
 msgstr "Radio-Cover:"
 
-#: src/resources/simpleplayer.py:2263
+#: src/resources/simpleplayer.py:2306
 msgid "Radio visualization:"
 msgstr "Radio-Visualisierung:"
 
-#: src/resources/simpleplayer.py:2264
+#: src/resources/simpleplayer.py:2307
 msgid "Radio screensaver:"
 msgstr "Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2265
+#: src/resources/simpleplayer.py:2308
 msgid "Radio screensaver keywords:"
 msgstr "Schlüsselwörter für den Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2295 src/resources/simpleplayer.py:2296
+#: src/resources/simpleplayer.py:2338 src/resources/simpleplayer.py:2339
 msgid "SimplePlayer Menu"
 msgstr "SimplePlayer Menü"
 
-#: src/resources/simpleplayer.py:2310
+#: src/resources/simpleplayer.py:2353
 #, python-format
 msgid "Add service to global playlist-%02d"
 msgstr "Füge Service zu globaler Playlist-%02d hinzu"
 
-#: src/resources/simpleplayer.py:2312
+#: src/resources/simpleplayer.py:2355
 #, python-format
 msgid "Open global playlist-%02d"
 msgstr "Öffne globale Playlist-%02d"
 
-#: src/resources/simpleplayer.py:2314
+#: src/resources/simpleplayer.py:2357
 msgid "Open local playlist"
 msgstr "Öffne lokale Playlist"
 
-#: src/resources/simpleplayer.py:2316
+#: src/resources/simpleplayer.py:2359
 msgid "A/V Settings"
 msgstr "A/V Einstellungen"
 
-#: src/resources/simpleplayer.py:2318
+#: src/resources/simpleplayer.py:2361
 msgid "Advanced Audio Settings"
 msgstr "Erweiterte Audioeinstellungen"
 
-#: src/resources/simpleplayer.py:2319
+#: src/resources/simpleplayer.py:2362
 msgid "Mainmenu"
 msgstr "Hauptmenü"
 
-#: src/resources/simpleplayer.py:2387
+#: src/resources/simpleplayer.py:2430
 #, python-format
 msgid ""
 "The directory path does not end with '/':\n"
@@ -2989,7 +2987,7 @@ msgstr ""
 "Der Verzeichnispfad endet nicht mit '/':\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2388
+#: src/resources/simpleplayer.py:2431
 #, python-format
 msgid ""
 "File with the same name exists in the directory path:\n"
@@ -2998,7 +2996,7 @@ msgstr ""
 "Datei mit gleichen Namen im Verzeichnispfad vorhanden:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2389
+#: src/resources/simpleplayer.py:2432
 #, python-format
 msgid ""
 "The missing directory:\n"
@@ -3007,7 +3005,7 @@ msgstr ""
 "Das fehlende Verzeichnis:\n"
 "%s konnte nicht angelegt werden!"
 
-#: src/resources/simpleplayer.py:2390
+#: src/resources/simpleplayer.py:2433
 #, python-format
 msgid ""
 "The directory path:\n"
@@ -3016,7 +3014,7 @@ msgstr ""
 "Der Verzeichnispfad:\n"
 "%s ist nicht vorhanden!"
 
-#: src/resources/simpleplayer.py:2391
+#: src/resources/simpleplayer.py:2434
 #, python-format
 msgid ""
 "There exists already a directory with this name:\n"
@@ -3025,7 +3023,7 @@ msgstr ""
 "Es existiert schon ein Verzeichnis mit diesem Namen:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2392
+#: src/resources/simpleplayer.py:2435
 #, python-format
 msgid ""
 "The path is OK, the file name was not specified:\n"
@@ -3034,7 +3032,7 @@ msgstr ""
 "Der Pfad ist i.O., der Dateiname wurde nicht angegeben:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2393
+#: src/resources/simpleplayer.py:2436
 #, python-format
 msgid ""
 "The directory path and file name is OK:\n"
@@ -3043,11 +3041,11 @@ msgstr ""
 "Der Verzeichnispfad & Dateiname ist i.O.:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2394
+#: src/resources/simpleplayer.py:2437
 msgid "The directory path is not specified!"
 msgstr "Der Verzeichnispfad wurde nicht angegeben!"
 
-#: src/resources/simpleplayer.py:2395
+#: src/resources/simpleplayer.py:2438
 #, python-format
 msgid ""
 "Symbolic link with the same name in the directory path:\n"
@@ -3056,7 +3054,7 @@ msgstr ""
 "Symbolischer Link mit gleichen Namen im Verzeichnispfad:\n"
 "%s vorhanden!"
 
-#: src/resources/simpleplayer.py:2396
+#: src/resources/simpleplayer.py:2439
 #, python-format
 msgid ""
 "The directory path does not begin with '/':\n"
@@ -3065,19 +3063,19 @@ msgstr ""
 "Der Verzeichnispfad beginnt nicht mit '/':\n"
 "%s"
 
-#: src/resources/streams.py:681
+#: src/resources/streams.py:677
 msgid "No supported Stream Hoster, try another one!"
 msgstr "Kein unterstützter Stream Hoster, versuche einen anderen!"
 
-#: src/resources/streams.py:683
+#: src/resources/streams.py:679
 msgid "Invalid Stream link, try another Stream Hoster!"
 msgstr "Ungültiger Stream Link, versuche eine anderen Stream Hoster!"
 
-#: src/resources/streams.py:692
+#: src/resources/streams.py:688
 msgid "This hoster is only working with enabled Premium support."
 msgstr "Dieser Hoster funktioniert nur mit aktivierter Premium-Unterstützung."
 
-#: src/resources/streams.py:694
+#: src/resources/streams.py:690
 msgid ""
 "This Stream link is currently not available via Premium, try another Stream "
 "Hoster."
@@ -3085,7 +3083,7 @@ msgstr ""
 "Dieser Stream ist aktuell nicht über Premium verfügbar, versuche einen "
 "anderen Stream Hoster."
 
-#: src/resources/streams.py:698
+#: src/resources/streams.py:694
 msgid "Unknown error, check MP logfile."
 msgstr "Unbekannter Fehler, MP Logfile überprüfen."
 
@@ -3168,3 +3166,26 @@ msgstr ""
 #: src/resources/update.py:146
 msgid "MediaPortal update failed! Check the update log carefully!"
 msgstr "MediaPortal Update fehlgeschlagen! Überprüfe das Updatelog sorgfältig!"
+
+#~ msgid "Press OK to launch Netflix now!"
+#~ msgstr "Drücken Sie OK, um Netflix jetzt zu starten!"
+
+#~ msgid "Mandatory depends python-requests and/or nodejs are missing!"
+#~ msgstr ""
+#~ "Zwingend erforderliche Abhängigkeiten python-requests und/oder nodejs "
+#~ "fehlen!"
+
+#~ msgid "This event is not yet available."
+#~ msgstr "Dieses Event ist noch nicht verfügbar."
+
+#~ msgid "Clips:"
+#~ msgstr "Clips:"
+
+#~ msgid "Currently no episodes/clips available!"
+#~ msgstr "Momentan sind keine Folgen/Clips verfügbar!"
+
+#~ msgid "This episode/clip can't be played it's protected with DRM."
+#~ msgstr "Episode/Clip kann nicht abgespielt werden da DRM-geschützt."
+
+#~ msgid "Currently no streams available"
+#~ msgstr "Momentan sind keine Streams verfügbar"
index 1a83cd2..d9e0f8d 100644 (file)
@@ -155,8 +155,8 @@ config.mediaportal = ConfigSubsection()
 config_mp.mediaportal.fake_entry = NoSave(ConfigNothing())
 
 # Allgemein
-config_mp.mediaportal.version = NoSave(ConfigText(default="2019112401"))
-config.mediaportal.version = NoSave(ConfigText(default="2019112401"))
+config_mp.mediaportal.version = NoSave(ConfigText(default="2019120501"))
+config.mediaportal.version = NoSave(ConfigText(default="2019120501"))
 config_mp.mediaportal.autoupdate = ConfigYesNo(default = True)
 config.mediaportal.autoupdate = NoSave(ConfigYesNo(default = True))
 
@@ -263,7 +263,7 @@ config_mp.mediaportal.sp_on_movie_start = ConfigSelectionExt(default = "start",
 config_mp.mediaportal.sp_save_resumecache = ConfigYesNo(default = False)
 config_mp.mediaportal.sp_radio_cover = ConfigSelectionExt(default = "large", choices = [("large", _("large")), ("small", _("small")), ("off", _("off"))])
 config_mp.mediaportal.sp_buffersize = ConfigSelectionFloat(default = 0.0, stepwidth = 0.5, min = 0.0, max = 30.0)
-if mp_globals.model in ["dm900","dm920"]:
+if mp_globals.model in ["dm900","dm920","one","two"]:
        config_mp.mediaportal.sp_radio_visualization = ConfigSelectionExt(default = "1", choices = [("0", _("Off")), ("1", _("Mode 1")), ("2", _("Mode 2")), ("3", _("Mode 3"))])
 else:
        config_mp.mediaportal.sp_radio_visualization = ConfigSelectionExt(default = "1", choices = [("0", _("Off")), ("1", _("Mode 1")), ("2", _("Mode 2"))])
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/LICENSE b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/LICENSE
deleted file mode 100644 (file)
index 5bf0e96..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Anorov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/__init__.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/__init__.py
deleted file mode 100644 (file)
index a90c31c..0000000
+++ /dev/null
@@ -1,372 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import logging
-import random
-import re
-import ssl
-import subprocess
-import copy
-import time
-import os
-from base64 import b64encode
-from collections import OrderedDict
-
-from requests.sessions import Session
-from requests.adapters import HTTPAdapter
-from requests.compat import urlparse, urlunparse
-from requests.exceptions import RequestException
-
-from urllib3.util.ssl_ import create_urllib3_context, DEFAULT_CIPHERS
-
-from .user_agents import USER_AGENTS
-
-__version__ = "2.0.8"
-
-DEFAULT_USER_AGENT = random.choice(USER_AGENTS)
-
-DEFAULT_HEADERS = OrderedDict(
-    (
-        ("Host", None),
-        ("Connection", "keep-alive"),
-        ("Upgrade-Insecure-Requests", "1"),
-        ("User-Agent", DEFAULT_USER_AGENT),
-        (
-            "Accept",
-            "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
-        ),
-        ("Accept-Language", "en-US,en;q=0.9"),
-        ("Accept-Encoding", "gzip, deflate"),
-    )
-)
-
-BUG_REPORT = """\
-Cloudflare may have changed their technique, or there may be a bug in the script.
-
-Please read https://github.com/Anorov/cloudflare-scrape#updates, then file a \
-bug report at https://github.com/Anorov/cloudflare-scrape/issues."\
-"""
-
-ANSWER_ACCEPT_ERROR = """\
-The challenge answer was not properly accepted by Cloudflare. This can occur if \
-the target website is under heavy load, or if Cloudflare is experiencing issues. You can
-potentially resolve this by increasing the challenge answer delay (default: 8 seconds). \
-For example: cfscrape.create_scraper(delay=15)
-
-If increasing the delay does not help, please open a GitHub issue at \
-https://github.com/Anorov/cloudflare-scrape/issues\
-"""
-
-# Remove a few problematic TLSv1.0 ciphers from the defaults
-DEFAULT_CIPHERS += ":!ECDHE+SHA:!AES128-SHA:!AESCCM:!DHE:!ARIA"
-
-
-class CloudflareAdapter(HTTPAdapter):
-    """ HTTPS adapter that creates a SSL context with custom ciphers """
-
-    def get_connection(self, *args, **kwargs):
-        conn = super(CloudflareAdapter, self).get_connection(*args, **kwargs)
-
-        if conn.conn_kw.get("ssl_context"):
-            conn.conn_kw["ssl_context"].set_ciphers(DEFAULT_CIPHERS)
-        else:
-            context = create_urllib3_context(ciphers=DEFAULT_CIPHERS)
-            conn.conn_kw["ssl_context"] = context
-
-        return conn
-
-
-class CloudflareError(RequestException):
-    pass
-
-
-class CloudflareCaptchaError(CloudflareError):
-    pass
-
-
-class CloudflareScraper(Session):
-    def __init__(self, *args, **kwargs):
-        self.delay = kwargs.pop("delay", None)
-        # Use headers with a random User-Agent if no custom headers have been set
-        headers = OrderedDict(kwargs.pop("headers", DEFAULT_HEADERS))
-
-        # Set the User-Agent header if it was not provided
-        headers.setdefault("User-Agent", DEFAULT_USER_AGENT)
-
-        super(CloudflareScraper, self).__init__(*args, **kwargs)
-
-        # Define headers to force using an OrderedDict and preserve header order
-        self.headers = headers
-
-        self.mount("https://", CloudflareAdapter())
-
-    @staticmethod
-    def is_cloudflare_iuam_challenge(resp):
-        return (
-            resp.status_code in (503, 429)
-            and resp.headers.get("Server", "").startswith("cloudflare")
-            and b"jschl_vc" in resp.content
-            and b"jschl_answer" in resp.content
-        )
-
-    @staticmethod
-    def is_cloudflare_captcha_challenge(resp):
-        return (
-            resp.status_code == 403
-            and resp.headers.get("Server", "").startswith("cloudflare")
-            and b"/cdn-cgi/l/chk_captcha" in resp.content
-        )
-
-    def request(self, method, url, *args, **kwargs):
-        resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs)
-
-        # Check if Cloudflare captcha challenge is presented
-        if self.is_cloudflare_captcha_challenge(resp):
-            self.handle_captcha_challenge(resp, url)
-
-        # Check if Cloudflare anti-bot "I'm Under Attack Mode" is enabled
-        if self.is_cloudflare_iuam_challenge(resp):
-            resp = self.solve_cf_challenge(resp, **kwargs)
-
-        return resp
-
-    def cloudflare_is_bypassed(self, url, resp=None):
-        cookie_domain = ".{}".format(urlparse(url).netloc)
-        return (
-            self.cookies.get("cf_clearance", None, domain=cookie_domain) or
-            (resp and resp.cookies.get("cf_clearance", None, domain=cookie_domain))
-        )
-
-    def handle_captcha_challenge(self, resp, url):
-        error = (
-            "Cloudflare captcha challenge presented for %s (cfscrape cannot solve captchas)"
-            % urlparse(url).netloc
-        )
-        if ssl.OPENSSL_VERSION_NUMBER < 0x10101000:
-            error += ". Your OpenSSL version is lower than 1.1.1. Please upgrade your OpenSSL library and recompile Python."
-
-        logging.error(error)
-
-    def solve_cf_challenge(self, resp, **original_kwargs):
-        start_time = time.time()
-
-        body = resp.text
-        parsed_url = urlparse(resp.url)
-        domain = parsed_url.netloc
-        submit_url = "%s://%s/cdn-cgi/l/chk_jschl" % (parsed_url.scheme, domain)
-
-        cloudflare_kwargs = copy.deepcopy(original_kwargs)
-
-        headers = cloudflare_kwargs.setdefault("headers", {})
-        headers["Referer"] = resp.url
-
-        try:
-            params = cloudflare_kwargs["params"] = OrderedDict(
-                re.findall(r'name="(s|jschl_vc|pass)"(?: [^<>]*)? value="(.+?)"', body)
-            )
-
-            for k in ("jschl_vc", "pass"):
-                if k not in params:
-                    logging.error("%s is missing from challenge form" % k)
-        except Exception as e:
-            # Something is wrong with the page.
-            # This may indicate Cloudflare has changed their anti-bot
-            # technique. If you see this and are running the latest version,
-            # please open a GitHub issue so I can update the code accordingly.
-            logging.error(
-                "Unable to parse Cloudflare anti-bot IUAM page: %s %s"
-                % (e.message, BUG_REPORT)
-            )
-
-        # Solve the Javascript challenge
-        answer, delay = self.solve_challenge(body, domain)
-        params["jschl_answer"] = answer
-
-        # Requests transforms any request into a GET after a redirect,
-        # so the redirect has to be handled manually here to allow for
-        # performing other types of requests even as the first request.
-        method = resp.request.method
-        cloudflare_kwargs["allow_redirects"] = False
-
-        # Cloudflare requires a delay before solving the challenge
-        time.sleep(max(delay - (time.time() - start_time), 0))
-
-        # Send the challenge response and handle the redirect manually
-        redirect = self.request(method, submit_url, **cloudflare_kwargs)
-        redirect_location = urlparse(redirect.headers["Location"])
-
-        if not redirect_location.netloc:
-            redirect_url = urlunparse(
-                (
-                    parsed_url.scheme,
-                    domain,
-                    redirect_location.path,
-                    redirect_location.params,
-                    redirect_location.query,
-                    redirect_location.fragment,
-                )
-            )
-            return self.request(method, redirect_url, **original_kwargs)
-        return self.request(method, redirect.headers["Location"], **original_kwargs)
-
-    def solve_challenge(self, body, domain):
-        try:
-            challenge, ms = re.search(
-                r"setTimeout\(function\(\){\s*(var "
-                r"s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value\s*=.+?)\r?\n"
-                r"(?:[^{<>]*},\s*(\d{4,}))?",
-                body,
-            ).groups()
-
-            # The challenge requires `document.getElementById` to get this content.
-            # Future proofing would require escaping newlines and double quotes
-            innerHTML = re.search(r"<div(?: [^<>]*)? id=\"cf-dn.*?\">([^<>]*)", body)
-            innerHTML = innerHTML.group(1) if innerHTML else ""
-
-            # Prefix the challenge with a fake document object.
-            # Interpolate the domain, div contents, and JS challenge.
-            # The `a.value` to be returned is tacked onto the end.
-            challenge = """
-                var document = {
-                    createElement: function () {
-                      return { firstChild: { href: "http://%s/" } }
-                    },
-                    getElementById: function () {
-                      return {"innerHTML": "%s"};
-                    }
-                  };
-
-                %s; a.value
-            """ % (
-                domain,
-                innerHTML,
-                challenge,
-            )
-            # Encode the challenge for security while preserving quotes and spacing.
-            challenge = b64encode(challenge.encode("utf-8")).decode("ascii")
-            # Use the provided delay, parsed delay, or default to 8 secs
-            delay = self.delay or (float(ms) / float(1000) if ms else 8)
-        except Exception:
-            logging.error(
-                "Unable to identify Cloudflare IUAM Javascript on website. %s"
-                % BUG_REPORT
-            )
-
-        # Use vm.runInNewContext to safely evaluate code
-        # The sandboxed code cannot use the Node.js standard library
-        js = (
-            """\
-            var atob = Object.setPrototypeOf(function (str) {\
-                try {\
-                    return Buffer.from("" + str, "base64").toString("binary");\
-                } catch (e) {}\
-            }, null);\
-            var challenge = atob("%s");\
-            var context = Object.setPrototypeOf({ atob: atob }, null);\
-            var options = {\
-                filename: "iuam-challenge.js",\
-                contextOrigin: "cloudflare:iuam-challenge.js",\
-                contextCodeGeneration: { strings: true, wasm: false },\
-                timeout: 5000\
-            };\
-            process.stdout.write(String(\
-                require("vm").runInNewContext(challenge, context, options)\
-            ));\
-        """
-            % challenge
-        )
-
-        try:
-            result = subprocess.check_output(
-                ["node", "-e", js], stdin=subprocess.PIPE, stderr=subprocess.PIPE
-            )
-        except OSError as e:
-            if e.errno == 2:
-                logging.error(
-                    "Missing Node.js runtime. Node is required and must be in the PATH (check with `node -v`). Your Node binary may be called `nodejs` rather than `node`, in which case you may need to run `apt-get install nodejs-legacy` on some Debian-based systems. (Please read the cfscrape"
-                    " README's Dependencies section: https://github.com/Anorov/cloudflare-scrape#dependencies."
-                )
-        except Exception:
-            logging.error("Error executing Cloudflare IUAM Javascript. %s" % BUG_REPORT)
-
-        try:
-            float(result)
-        except Exception:
-            logging.error(
-                "Cloudflare IUAM challenge returned unexpected answer. %s" % BUG_REPORT
-            )
-
-        return result, delay
-
-    @classmethod
-    def create_scraper(cls, sess=None, **kwargs):
-        """
-        Convenience function for creating a ready-to-go CloudflareScraper object.
-        """
-        scraper = cls(**kwargs)
-
-        if sess:
-            attrs = [
-                "auth",
-                "cert",
-                "cookies",
-                "headers",
-                "hooks",
-                "params",
-                "proxies",
-                "data",
-            ]
-            for attr in attrs:
-                val = getattr(sess, attr, None)
-                if val:
-                    setattr(scraper, attr, val)
-
-        return scraper
-
-    # Functions for integrating cloudflare-scrape with other applications and scripts
-
-    @classmethod
-    def get_tokens(cls, url, user_agent=None, **kwargs):
-        scraper = cls.create_scraper()
-        if user_agent:
-            scraper.headers["User-Agent"] = user_agent
-
-        try:
-            resp = scraper.get(url, **kwargs)
-            resp.raise_for_status()
-        except Exception:
-            logging.error("'%s' returned an error. Could not collect tokens." % url)
-
-        domain = urlparse(resp.url).netloc
-        cookie_domain = None
-
-        for d in scraper.cookies.list_domains():
-            if d.startswith(".") and d in ("." + domain):
-                cookie_domain = d
-                break
-        else:
-            logging.error(
-                'Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM ("I\'m Under Attack Mode") enabled?'
-            )
-
-        return (
-            {
-                "__cfduid": scraper.cookies.get("__cfduid", "", domain=cookie_domain),
-                "cf_clearance": scraper.cookies.get(
-                    "cf_clearance", "", domain=cookie_domain
-                ),
-            },
-            scraper.headers["User-Agent"],
-        )
-
-    @classmethod
-    def get_cookie_string(cls, url, user_agent=None, **kwargs):
-        """
-        Convenience function for building a Cookie HTTP header value.
-        """
-        tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, **kwargs)
-        return "; ".join("=".join(pair) for pair in tokens.items()), user_agent
-
-
-create_scraper = CloudflareScraper.create_scraper
-get_tokens = CloudflareScraper.get_tokens
-get_cookie_string = CloudflareScraper.get_cookie_string
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/user_agents.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/user_agents.py
deleted file mode 100644 (file)
index 1f04bcb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-USER_AGENTS = [
-    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36"
-]
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/LICENSE b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/LICENSE
deleted file mode 100644 (file)
index 5bf0e96..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Anorov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/__init__.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape_old/__init__.py
deleted file mode 100644 (file)
index fef2f5c..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-import logging
-import random
-import re
-import subprocess
-import copy
-import time
-
-from requests.sessions import Session
-
-from collections import OrderedDict
-
-try:
-    from urlparse import urlparse
-    from urlparse import urlunparse
-except ImportError:
-    from urllib.parse import urlparse
-    from urllib.parse import urlunparse
-
-__version__ = "1.9.7"
-
-DEFAULT_USER_AGENTS = [
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36",
-    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36",
-    "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.137 Mobile Safari/537.36",
-    "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53",
-    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0",
-    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0",
-    "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0"
-]
-
-BUG_REPORT = """\
-Cloudflare may have changed their technique, or there may be a bug in the script.
-
-Please read https://github.com/Anorov/cloudflare-scrape#updates, then file a \
-bug report at https://github.com/Anorov/cloudflare-scrape/issues."\
-"""
-
-ANSWER_ACCEPT_ERROR = """\
-The challenge answer was not properly accepted by Cloudflare. This can occur if \
-the target website is under heavy load, or if Cloudflare is experiencing issues. You can
-potentially resolve this by increasing the challenge answer delay (default: 8 seconds). \
-For example: cfscrape.create_scraper(delay=15)
-
-If increasing the delay does not help, please open a GitHub issue at \
-https://github.com/Anorov/cloudflare-scrape/issues\
-"""
-
-class CloudflareScraper(Session):
-    def __init__(self, *args, **kwargs):
-        self.default_delay = 8
-        self.delay =  kwargs.pop("delay", self.default_delay)
-        super(CloudflareScraper, self).__init__(*args, **kwargs)
-
-        if "requests" in self.headers["User-Agent"]:
-            # Set a random User-Agent if no custom User-Agent has been set
-            self.headers["User-Agent"] = random.choice(DEFAULT_USER_AGENTS)
-
-    def is_cloudflare_challenge(self, resp):
-        return (
-            resp.status_code == 503
-            and resp.headers.get("Server", "").startswith("cloudflare")
-            and b"jschl_vc" in resp.content
-            and b"jschl_answer" in resp.content
-        )
-
-    def request(self, method, url, *args, **kwargs):
-        self.headers = (
-            OrderedDict(
-                [
-                    ('User-Agent', self.headers['User-Agent']),
-                    ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
-                    ('Accept-Language', 'en-US,en;q=0.5'),
-                    ('Accept-Encoding', 'gzip, deflate'),
-                    ('Connection',  'close'),
-                    ('Upgrade-Insecure-Requests', '1')
-                ]
-            )
-        )
-
-        resp = super(CloudflareScraper, self).request(method, url, *args, **kwargs)
-
-        # Check if Cloudflare anti-bot is on
-        if self.is_cloudflare_challenge(resp):
-            resp = self.solve_cf_challenge(resp, **kwargs)
-
-        return resp
-
-    def solve_cf_challenge(self, resp, **original_kwargs):
-        start_time = time.time()
-
-        body = resp.text
-        parsed_url = urlparse(resp.url)
-        domain = parsed_url.netloc
-        submit_url = "%s://%s/cdn-cgi/l/chk_jschl" % (parsed_url.scheme, domain)
-
-        cloudflare_kwargs = copy.deepcopy(original_kwargs)
-        params = cloudflare_kwargs.setdefault("params", {})
-        headers = cloudflare_kwargs.setdefault("headers", {})
-        headers["Referer"] = resp.url
-
-        try:
-            params["s"] = re.search(r'name="s"\svalue="(?P<s_value>[^"]+)', body).group('s_value')
-            params["jschl_vc"] = re.search(r'name="jschl_vc" value="(\w+)"', body).group(1)
-            params["pass"] = re.search(r'name="pass" value="(.+?)"', body).group(1)
-        except Exception as e:
-            # Something is wrong with the page.
-            # This may indicate Cloudflare has changed their anti-bot
-            # technique. If you see this and are running the latest version,
-            # please open a GitHub issue so I can update the code accordingly.
-            logging.error("Unable to parse Cloudflare anti-bots page: %s %s" % (e.message, BUG_REPORT))
-
-        # Solve the Javascript challenge
-        params["jschl_answer"] = self.solve_challenge(body, domain)
-
-        # Check if the default delay has been overridden. If not, use the delay required by
-        # cloudflare.
-        if self.delay == self.default_delay:
-            try:
-                self.delay = float(re.search(r"submit\(\);\r?\n\s*},\s*([0-9]+)", body).group(1)) / float(1000)
-            except:
-                pass
-
-        # Requests transforms any request into a GET after a redirect,
-        # so the redirect has to be handled manually here to allow for
-        # performing other types of requests even as the first request.
-        method = resp.request.method
-        cloudflare_kwargs["allow_redirects"] = False
-
-        end_time = time.time()
-         # Cloudflare requires a delay before solving the challenge
-        time.sleep(self.delay - (end_time - start_time))
-
-        redirect = self.request(method, submit_url, **cloudflare_kwargs)
-        redirect_location = urlparse(redirect.headers["Location"])
-        if not redirect_location.netloc:
-            redirect_url = urlunparse((parsed_url.scheme, domain, redirect_location.path, redirect_location.params, redirect_location.query, redirect_location.fragment))
-            return self.request(method, redirect_url, **original_kwargs)
-        return self.request(method, redirect.headers["Location"], **original_kwargs)
-
-    def solve_challenge(self, body, domain):
-        try:
-            js = re.search(r"setTimeout\(function\(\){\s+(var "
-                        "s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n", body).group(1)
-        except Exception:
-            logging.error("Unable to identify Cloudflare IUAM Javascript on website. %s" % BUG_REPORT)
-
-        js = re.sub(r"a\.value = (.+\.toFixed\(10\);).+", r"\1", js)
-        # Match code that accesses the DOM and remove it, but without stripping too much.
-        try:
-            solution_name = re.search("s,t,o,p,b,r,e,a,k,i,n,g,f,\s*(.+)\s*=", js).groups(1)
-            match = re.search("(.*};)\n\s*(t\s*=(.+))\n\s*(;%s.*)" % (solution_name), js, re.M | re.I | re.DOTALL).groups()
-            js = match[0] + match[-1]
-        except Exception:
-            logging.error("Error parsing Cloudflare IUAM Javascript challenge. %s" % BUG_REPORT)
-        js = js.replace("t.length", str(len(domain)))
-
-        # Strip characters that could be used to exit the string context
-        # These characters are not currently used in Cloudflare's arithmetic snippet
-        js = re.sub(r"[\n\\']", "", js)
-
-        if "toFixed" not in js:
-            logging.error("Error parsing Cloudflare IUAM Javascript challenge. %s" % BUG_REPORT)
-
-        # 2019-03-20: Cloudflare sometimes stores part of the challenge in a div which is later
-        # added using document.getElementById(x).innerHTML, so it is necessary to simulate that
-        # method and value.
-        try:
-            # Find the id of the div in the javascript code.
-            k = re.search(r"k\s+=\s+'([^']+)';", body).group(1)
-            # Find the div with that id and store its content.
-            val = re.search(r'<div(.*)id="%s"(.*)>(.*)</div>' % (k), body).group(3)
-        except Exception:
-            # If not available, either the code has been modified again, or the old
-            # style challenge is used.
-            k = ''
-            val = ''
-
-        # Use vm.runInNewContext to safely evaluate code
-        # The sandboxed code cannot use the Node.js standard library
-        # Add the atob method which is now used by Cloudflares code, but is not available in all node versions.
-        simulate_document_js = 'var document= {getElementById: function(x) { return {innerHTML:"%s"};}}' % (val)
-        atob_js = 'var atob = function(str) {return Buffer.from(str, "base64").toString("binary");}'
-        # t is not defined, so we have to define it and set it to the domain name.
-        js = '%s;%s;var t="%s";%s' % (simulate_document_js,atob_js,domain,js)
-        buffer_js = "var Buffer = require('buffer').Buffer"
-        # Pass Buffer into the new context, so it is available for atob.
-        js = "%s;console.log(require('vm').runInNewContext('%s', {'Buffer':Buffer,'g':String.fromCharCode}, {timeout: 5000}));" % (buffer_js, js)
-
-        try:
-            result = subprocess.check_output(["node", "-e", js]).strip()
-        except OSError as e:
-            if e.errno == 2:
-                logging.error("Missing Node.js runtime. Node is required and must be in the PATH (check with `node -v`). Your Node binary may be called `nodejs` rather than `node`, in which case you may need to run `apt-get install nodejs-legacy` on some Debian-based systems. (Please read the cfscrape"
-                    " README's Dependencies section: https://github.com/Anorov/cloudflare-scrape#dependencies.")
-        except Exception:
-            logging.error("Error executing Cloudflare IUAM Javascript. %s" % BUG_REPORT)
-
-        try:
-            float(result)
-        except Exception:
-            logging.error("Cloudflare IUAM challenge returned unexpected answer. %s" % BUG_REPORT)
-
-        return result
-
-    @classmethod
-    def create_scraper(cls, sess=None, **kwargs):
-        """
-        Convenience function for creating a ready-to-go CloudflareScraper object.
-        """
-        scraper = cls(**kwargs)
-
-        if sess:
-            attrs = ["auth", "cert", "cookies", "headers", "hooks", "params", "proxies", "data"]
-            for attr in attrs:
-                val = getattr(sess, attr, None)
-                if val:
-                    setattr(scraper, attr, val)
-
-        return scraper
-
-
-    ## Functions for integrating cloudflare-scrape with other applications and scripts
-
-    @classmethod
-    def get_tokens(cls, url, user_agent=None, **kwargs):
-        scraper = cls.create_scraper()
-        if user_agent:
-            scraper.headers["User-Agent"] = user_agent
-
-        try:
-            resp = scraper.get(url, **kwargs)
-            resp.raise_for_status()
-        except Exception as e:
-            logging.error("'%s' returned an error. Could not collect tokens." % url)
-
-        domain = urlparse(resp.url).netloc
-        cookie_domain = None
-
-        for d in scraper.cookies.list_domains():
-            if d.startswith(".") and d in ("." + domain):
-                cookie_domain = d
-                break
-        else:
-            logging.error("Unable to find Cloudflare cookies. Does the site actually have Cloudflare IUAM (\"I'm Under Attack Mode\") enabled?")
-
-        return ({
-                    "__cfduid": scraper.cookies.get("__cfduid", "", domain=cookie_domain),
-                    "cf_clearance": scraper.cookies.get("cf_clearance", "", domain=cookie_domain)
-                },
-                scraper.headers["User-Agent"]
-               )
-
-    @classmethod
-    def get_cookie_string(cls, url, user_agent=None, **kwargs):
-        """
-        Convenience function for building a Cookie HTTP header value.
-        """
-        tokens, user_agent = cls.get_tokens(url, user_agent=user_agent, **kwargs)
-        return "; ".join("=".join(pair) for pair in tokens.items()), user_agent
-
-create_scraper = CloudflareScraper.create_scraper
-get_tokens = CloudflareScraper.get_tokens
-get_cookie_string = CloudflareScraper.get_cookie_string
index a449698..f48d4e2 100644 (file)
@@ -78,6 +78,9 @@ def clearTmpBuffer():
        if os.path.exists(path):
                for fn in next(os.walk(path))[2]:
                        BgFileEraser.erase(os.path.join(path,fn))
+       for dash_file in os.listdir("/tmp"):
+               if dash_file.startswith("yt_") and dash_file.endswith("_dash.mpd"):
+                       BgFileEraser.erase(os.path.join('/tmp',dash_file))
 
 class SimpleEvent:
        def __init__(self):
@@ -843,19 +846,23 @@ class RadioBackground(Screen):
                                        self.skin += '''<widget name="coverGL" position="0,0" size="1920,1080" transparent="0" backgroundColor="#00000000" mode="visGLRandom" noCoverAvailablePic="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png"/>'''
                                else:
                                        self.skin += '''<widget alphatest="blend" name="cover" position="735,270" size="450,450" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png" zPosition="13" />
-                                       <widget name="rms0" channel="0" backgroundColor="#404040" zPosition="13" position="650,251" size="70,495" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_90x60_h9.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="15" maxValue="40" fadeOutTime="500" smoothing="0.9" />
-                                       <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="1200,251" size="70,495" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_90x60_h9.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="15" maxValue="40" fadeOutTime="500" smoothing="0.9" />'''
+                                       <widget name="rms0" channel="0" backgroundColor="#404040" zPosition="13" position="650,247" size="70,495" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_90x60_h9.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="15" maxValue="40" fadeOutTime="0" smoothing="0.5" />
+                                       <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="1200,247" size="70,495" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_90x60_h9.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="15" maxValue="40" fadeOutTime="0" smoothing="0.5" />'''
 
                                if config_mp.mediaportal.sp_radio_visualization.value == "1":
-                                       if mp_globals.model in ["dm900","dm920","one","two"]:
-                                               self.skin += '''<widget name="visu" position="0,741" size="1920,339" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
+                                       if mp_globals.model in ["one","two"]:
+                                               self.skin += '''<widget name="visu" position="0,720" size="1920,360" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="3" blendColor="#fcc000" smoothing="0.4" />'''
+                                       elif mp_globals.model in ["dm900","dm920"]:
+                                               self.skin += '''<widget name="visu" position="0,720" size="1920,360" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
                                        else:
-                                               self.skin += '''<widget name="visu" position="0,741" size="1920,339" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="0" blendColor="#fcc000" smoothing="0.4" />'''
+                                               self.skin += '''<widget name="visu" position="0,720" size="1920,360" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="0" blendColor="#fcc000" smoothing="0.4" />'''
                                if config_mp.mediaportal.sp_radio_visualization.value == "2":
-                                       if mp_globals.model in ["dm900","dm920","one","two"]:
-                                               self.skin += '''<widget name="visu" position="0,930" size="1920,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="20" fadeOutTime="0" internalSize="2" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
+                                       if mp_globals.model in ["one","two"]:
+                                               self.skin += '''<widget name="visu" position="0,760" size="1920,320" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="40" fadeOutTime="0" internalSize="3" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
+                                       elif mp_globals.model in ["dm900","dm920"]:
+                                               self.skin += '''<widget name="visu" position="0,920" size="1920,160" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="20" fadeOutTime="0" internalSize="2" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                                        else:
-                                               self.skin += '''<widget name="visu" position="0,930" size="1920,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
+                                               self.skin += '''<widget name="visu" position="0,960" size="1920,120" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                        else:
                                self.skin += '''<widget alphatest="blend" name="cover" position="735,270" size="450,450" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png" zPosition="13" />'''
 
@@ -872,19 +879,23 @@ class RadioBackground(Screen):
                                        self.skin += '''<widget name="coverGL" position="0,0" size="1280,720" transparent="0" backgroundColor="#00000000" mode="visGLRandom" noCoverAvailablePic="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png"/>'''
                                else:
                                        self.skin += '''<widget alphatest="blend" name="cover" position="490,180" size="300,300" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png" zPosition="13" />
-                                       <widget name="rms0" channel="0" backgroundColor="#404040" zPosition="13" position="420,167" size="60,330" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_60x40_h6.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="10" maxValue="40" fadeOutTime="500" smoothing="0.9" />
-                                       <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="800,167" size="60,330" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_60x40_h6.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="10" maxValue="40" fadeOutTime="500" smoothing="0.9" />'''
+                                       <widget name="rms0" channel="0" backgroundColor="#404040" zPosition="13" position="420,165" size="60,330" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_60x40_h6.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="10" maxValue="40" fadeOutTime="0" smoothing="0.5" />
+                                       <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="800,165" size="60,330" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_60x40_h6.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="10" maxValue="40" fadeOutTime="0" smoothing="0.5" />'''
 
                                if config_mp.mediaportal.sp_radio_visualization.value == "1":
-                                       if mp_globals.model in ["dm900","dm920","one","two"]:
-                                               self.skin += '''<widget name="visu" position="0,494" size="1280,226" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
+                                       if mp_globals.model in ["one","two"]:
+                                               self.skin += '''<widget name="visu" position="0,480" size="1280,240" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="3" blendColor="#fcc000" smoothing="0.4" />'''
+                                       elif mp_globals.model in ["dm900","dm920"]:
+                                               self.skin += '''<widget name="visu" position="0,480" size="1280,240" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
                                        else:
-                                               self.skin += '''<widget name="visu" position="0,494" size="1280,226" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="1" blendColor="#fcc000" smoothing="0.4" />'''
+                                               self.skin += '''<widget name="visu" position="0,480" size="1280,240" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="1" blendColor="#fcc000" smoothing="0.4" />'''
                                if config_mp.mediaportal.sp_radio_visualization.value == "2":
-                                       if mp_globals.model in ["dm900","dm920","one","two"]:
+                                       if mp_globals.model in ["one","two"]:
+                                               self.skin += '''<widget name="visu" position="0,520" size="1280,200" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="40" fadeOutTime="0" internalSize="3" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
+                                       elif mp_globals.model in ["dm900","dm920"]:
                                                self.skin += '''<widget name="visu" position="0,620" size="1280,100" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="20" fadeOutTime="0" internalSize="2" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                                        else:
-                                               self.skin += '''<widget name="visu" position="0,570" size="1280,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
+                                               self.skin += '''<widget name="visu" position="0,645" size="1280,75" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                        else:
                                self.skin += '''<widget alphatest="blend" name="cover" position="490,180" size="300,300" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png" zPosition="13" />'''
 
@@ -1318,7 +1329,10 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                self.cover2 = False
                self.searchTitle = None
                self.forceGST = forceGST
-               self.eServiceStream = eServiceStream
+               if self.ltype == 'youtube' and mp_globals.model in ["one","two"]:
+                       self.eServiceStream = True
+               else:
+                       self.eServiceStream = eServiceStream
                self.embeddedCoverArt = embeddedCoverArt
                self.hasEmbeddedCoverArt = False
                self.lru_key = None
@@ -1374,6 +1388,9 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                                                iPlayableService.evUpdatedInfo: self.__evUpdatedInfo
                                        })
 
+                       from Plugins.Extensions.MediaPortal.plugin import _stylemanager
+                       _stylemanager(1)
+
        def cleanTitleRadio(self, sTitle):
                if " - " in sTitle:
                        if " | " in sTitle:
@@ -1638,20 +1655,22 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                                                if mp_globals.isDreamOS:
                                                        if self.playerMode == 'RADIO' and config_mp.mediaportal.sp_radio_visualization.value != "0" and MerlinMusicPlayerPresent:
                                                                sref = eServiceReference(0x1019, 0, url)
-                                                       elif self.eServiceStream and ('.m3u8' in url or 'm3u8-aapl' in url or '.mpd' in url) and mp_globals.model in ["one","two"]:
+                                                       elif self.eServiceStream and ('.m3u8' in url or 'm3u8-aapl' in url or '.mpd' in url or 'http://127.0.0.1:1337/manifest?id=' in url) and mp_globals.model in ["one","two"]:
                                                                sref = eServiceReference(0x2223, 0, url)
+                                                               if suburi:
+                                                                       sref.setSuburi(suburi)
                                                        else:
                                                                sref = eServiceReference(0x1001, 0, url)
-                                                       if suburi:
-                                                               try:
-                                                                       if suburi not in ["yt_dash_audio"]:
-                                                                               sref.setSuburi(suburi)
-                                                                               mp_globals.nav_suburi = suburi
-                                                                       self.dash = True
-                                                               except:
-                                                                       pass
-                                                       else:
-                                                               mp_globals.nav_suburi = ""
+                                                               if suburi:
+                                                                       try:
+                                                                               if suburi not in ["yt_dash_audio"]:
+                                                                                       sref.setSuburi(suburi)
+                                                                                       mp_globals.nav_suburi = suburi
+                                                                               self.dash = True
+                                                                       except:
+                                                                               pass
+                                                               else:
+                                                                       mp_globals.nav_suburi = ""
                                                else:
                                                        if suburi:
                                                                if suburi not in ["yt_dash_audio"]:
@@ -1881,6 +1900,10 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                if self.downloader != None:
                        self.downloader.stop()
                reactor.callLater(1, clearTmpBuffer)
+               
+               if self.ltype == 'netflix':
+                       from Plugins.Extensions.MediaPortal.plugin import _stylemanager
+                       _stylemanager(0)
 
        def restoreLastService(self):
                if config_mp.mediaportal.restorelastservice.value == "1" and not config_mp.mediaportal.backgroundtv.value:
@@ -1895,9 +1918,29 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                l = len(entry)
                if l >= 3:
                        iurl = entry[2]
+               if l >= 4:
+                       if entry[3] == "drm":
+                               iurl = ''
+                               suburi = entry[2]
+                       else:
+                               iurl = ''
+                               suburi =''
+               if l >= 5:
+                       if entry[4] == "drm":
+                               iurl = entry[3]
+                               suburi = entry[2]
+                       else:
+                               iurl = ''
+                               suburi =''
                else:
                        iurl = ''
-               self.playStream(title, url, imgurl=iurl)
+                       suburi =''
+               if suburi and iurl:
+                       self.playStream(title, url, suburi=suburi, imgurl=iurl)
+               elif suburi:
+                       self.playStream(title, url, suburi=suburi)
+               else:
+                       self.playStream(title, url, imgurl=iurl)
 
        def getVideo2(self):
                if self.playLen > 0:
index dfb7c59..87120f7 100644 (file)
@@ -323,7 +323,97 @@ class youtubeUrl(object):
                                self.video_url = self.audio_url
                                self.audio_url = "yt_dash_audio"
 
-                       self.callBack(self.video_url, self.audio_url)
+                       if self.audio_url and self.audio_url != "yt_dash_audio" and mp_globals.model in ["one"]:
+                               info_url = 'https://www.youtube.com/get_video_info'
+                               params = {'hl': 'en', 'gl': 'US', 'ssl_stream': '1', 'html5': '1'}
+                               params['video_id'] = self.video_id
+                               params['eurl'] = 'https://youtube.googleapis.com/v/' + self.video_id
+                               params['sts'] = ''
+                               params['c'] = 'WEB'
+                               params['cver'] = '1.20170712'
+                               params['cplayer'] = 'UNIPLAYER'
+                               params['cbr'] = 'Chrome'
+                               params['cbrver'] = '53.0.2785.143'
+                               params['cos'] = 'Windows'
+                               params['cosver'] = '10.0'
+                               data = self.grabpage(info_url, params)
+                               params = dict(urlparse.parse_qsl(data))
+                               duration = None
+                               fmts_list = params.get('adaptive_fmts').split(',')
+                               data = {}
+                               for item in fmts_list:
+                                       stream_map = dict(urlparse.parse_qsl(item))
+                                       print stream_map
+                                       t = stream_map.get('type')
+                                       t = urllib.unquote(t).decode('utf8')
+                                       t = t.split(';')
+                                       mime = t[0]
+                                       i = stream_map.get('itag')
+                                       baseurl = None
+                                       for link in links.values():
+                                               if re.match('.*itag='+str(i)+'&', link):
+                                                       baseurl = link.replace("&", "&amp;").encode('utf-8')
+                                               else:
+                                                       continue
+                                       if not baseurl:
+                                               for link in audio.values():
+                                                       if re.match('.*itag='+str(i)+'&', link):
+                                                               baseurl = link.replace("&", "&amp;").encode('utf-8')
+                                                       else:
+                                                               continue
+                                       if baseurl:
+                                               if not data.has_key(mime):
+                                                       data[mime] = {}
+                                               data[mime][i] = {}
+                                               data[mime][i]['baseUrl'] = baseurl
+                                               data[mime][i]['codecs'] = t[1][1:]
+                                               data[mime][i]['id'] = i
+                                               s = stream_map.get('size')
+                                               if s:
+                                                       s=s.split('x')
+                                                       data[mime][i]['width'] = s[0]
+                                                       data[mime][i]['height'] = s[1]
+                                               data[mime][i]['bandwidth'] = stream_map.get('bitrate')
+                                               data[mime][i]['frameRate'] = stream_map.get('fps')
+                                               data[mime][i]['indexRange'] = stream_map.get('index')
+                                               data[mime][i]['init'] = stream_map.get('init')
+                                               dur = re.search('dur=(\d+(?:\.\d+|))&', baseurl, re.S)
+                                               if dur:
+                                                       duration = str(dur.group(1))
+                                       else:
+                                               continue
+
+                               out = '<?xml version="1.0" encoding="UTF-8"?>\n'
+                               out += '<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:mpeg:dash:schema:mpd:2011" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="urn:mpeg:dash:schema:mpd:2011 http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd" minBufferTime="PT1.5S" mediaPresentationDuration="PT' + duration +'S" type="static" availabilityStartTime="2001-12-17T09:40:57Z" profiles="urn:mpeg:dash:profile:isoff-main:2011">'
+                               out += '<Period start="PT0S" duration="PT' + duration +'S">\n'
+                               n = 0
+                               for mime in data:
+                                       if len(data[mime]) > 0:
+                                               out += '<AdaptationSet id="' + str(n) + '" mimeType="' + mime + '" subsegmentAlignment="true" subsegmentStartsWithSAP="1" bitstreamSwitching="true">\n'
+                                               out += '<Role schemeIdUri="urn:mpeg:DASH:role:2011" value="main"/>\n'
+                                               for i in data[mime]:
+                                                       if data[mime][i]['baseUrl']:
+                                                               if 'audio' in mime:
+                                                                       out += '<Representation id="' + i + '" ' + data[mime][i]['codecs'] + ' bandwidth="' + data[mime][i]['bandwidth'] + '">\n'
+                                                                       out += '<AudioChannelConfiguration schemeIdUri="urn:mpeg:dash:23003:3:audio_channel_configuration:2011" value="2"/>\n'
+                                                               else:
+                                                                       out += '<Representation id="' + i + '" ' + data[mime][i]['codecs'] + ' startWithSAP="1" bandwidth="' + data[mime][i]['bandwidth'] + '" width="' + data[mime][i]['width'] + '" height="' + data[mime][i]['height'] + '" frameRate="' + data[mime][i]['frameRate'] + '">\n'
+                                                               out += '<BaseURL>' + data[mime][i]['baseUrl'] + '</BaseURL>\n'
+                                                               out += '<SegmentBase indexRange="' + data[mime][i]['indexRange'] + '">\n'
+                                                               out += '<Initialization range="' + data[mime][i]['init'] + '" />\n'
+                                                               out += '</SegmentBase>\n'
+                                                               out += '</Representation>\n'
+                                               out += '</AdaptationSet>\n'
+                                               n = n + 1
+                               out += '</Period></MPD>\n'
+
+                               dash_file = '/tmp/yt_%s_dash.mpd' % self.video_id
+                               with open(dash_file, 'w') as dash_mpd:
+                                       dash_mpd.write(out)
+                                       dash_mpd.close()
+                               self.callBack('file://'+dash_file)
+                       else:
+                               self.callBack(self.video_url, self.audio_url)
                except (KeyError,IndexError):
                        self.error = "[YoutubeURL] Error: no video url found"
                        self.errReturn(self.video_url)
@@ -463,6 +553,8 @@ class youtubeUrl(object):
   def callBack(self, url, suburi=None):
        if suburi and not '.m3u8' in url:
                self.__callBack(url, suburi=suburi)
+       elif url.startswith('file://'):
+               self.__callBack(url, None)
        elif url.startswith('http') and not '.m3u8' in url:
                self.error = '[YoutubeURL] Playback error:'
                try:
@@ -498,4 +590,18 @@ class youtubeUrl(object):
                else:
                        self.dataError(redir_url)
        else:
-               self.__callBack(url)
\ No newline at end of file
+               self.__callBack(url)
+
+  def grabpage(self, url, params):
+        headers = {'Host': 'www.youtube.com',
+                   'Connection': 'keep-alive',
+                   'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36',
+                   'Accept': '*/*',
+                   'DNT': '1',
+                   'Referer': 'https://www.youtube.com/tv',
+                   'Accept-Encoding': 'gzip, deflate',
+                   'Accept-Language': 'en-US,en;q=0.8,de;q=0.6'}
+
+       s = requests.session()
+       page = s.get(url, params=params, headers=headers, allow_redirects=True)
+       return page.content
\ No newline at end of file