import enigma2-plugin-extensions-mediaportal 2020010801 v2020010801
authorChristian Weiske <cweiske@cweiske.de>
Thu, 9 Jan 2020 00:15:23 +0000 (01:15 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Thu, 9 Jan 2020 00:15:23 +0000 (01:15 +0100)
38 files changed:
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/additions.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/funk.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/youtube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/mtvdecharts.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/focus.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/badoinkvr.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/bangbros.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/camhub.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/cliphunter.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/digitalplayground.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/faapy.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/julesjordan.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/naughtyamerica.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornxio.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/realitykings.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/redtube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/slutload.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/wicked.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xnxx.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xvideos.py
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/MPHLSPUriResolver.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/hosters/mixdrop.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_fetcher.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_httpplayer.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_m3u8.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_make_url.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_yt-oauth2 [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mpscreen.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/showAsThumb.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/simplelist.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/simpleplayer.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/streams.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/skins_1080/clean_fhd/MP_Plugin.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/skins_720/clean_hd/MP_Plugin.xml

index 5109ffe..f18c32a 100644 (file)
                <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.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.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.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"/>
                <plugin type="mod" modfile="porn.slutload" confopt="showmadthumbs" default="False" confcat="porn" gz="0" name="MadThumbs" icon="madthumbs" filter="Porn" screen="slutloadGenreScreen" param1="madthumbs" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;MadThumbs.com&quot;, &quot;http://www.madthumbs.com&quot;"/>
                <plugin type="mod" modfile="porn.slutload" confopt="showfapster" default="False" confcat="porn" gz="0" name="Fapster" icon="fapster" filter="Porn" screen="slutloadGenreScreen" param1="fapster" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;Fapster.xxx&quot;, &quot;https://fapster.xxx&quot;"/>
                <plugin type="mod" modfile="porn.slutload" confopt="showvqtube" default="False" confcat="porn" gz="0" name="VQTube" icon="vqtube" filter="Porn" screen="slutloadGenreScreen" param1="vqtube" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;VQTube.com&quot;, &quot;https://vqtube.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showporntube69" default="False" confcat="porn" gz="0" name="PornTube69" icon="porntube69" filter="Porn" screen="slutloadGenreScreen" param1="porntube69" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;PornTube69.net&quot;, &quot;https://www.porntube69.net&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showmegatube" default="False" confcat="porn" gz="0" name="MegaTube" icon="megatube" filter="Porn" screen="slutloadGenreScreen" param1="megatube" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;MegaTube.xxx&quot;, &quot;https://www.megatube.xxx&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showwatchmygf" default="False" confcat="porn" gz="0" name="WatchMyGF" icon="watchmygf" filter="Porn" screen="slutloadGenreScreen" param1="watchmygf" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;WatchMyGF.me&quot;, &quot;https://www.watchmygf.me&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showwatchmyexgf" default="False" confcat="porn" gz="0" name="WatchMyExGF" icon="watchmyexgf" filter="Porn" screen="slutloadGenreScreen" param1="watchmyexgf" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;WatchMyExGF.net&quot;, &quot;https://www.watchmyexgf.net&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showtropictube" default="False" confcat="porn" gz="0" name="TropicTube" icon="tropictube" filter="Porn" screen="slutloadGenreScreen" param1="tropictube" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;TropicTube.com&quot;, &quot;https://www.tropictube.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showpunishbang" default="False" confcat="porn" gz="0" name="PunishBang" icon="punishbang" filter="Porn" screen="slutloadGenreScreen" param1="punishbang" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;PunishBang.com&quot;, &quot;https://www.punishbang.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showpornfd" default="False" confcat="porn" gz="0" name="PornFD" icon="pornfd" filter="Porn" screen="slutloadGenreScreen" param1="pornfd" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;PornFD.com&quot;, &quot;https://www.pornfd.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showpornbimbo" default="False" confcat="porn" gz="0" name="PornBimbo" icon="pornbimbo" filter="Porn" screen="slutloadGenreScreen" param1="pornbimbo" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;PornBimbo.com&quot;, &quot;http://pornbimbo.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showboundhub" default="False" confcat="porn" gz="0" name="BoundHub" icon="boundhub" filter="Porn" screen="slutloadGenreScreen" param1="boundhub" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;BoundHub.com&quot;, &quot;https://www.boundhub.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showeroclips" default="False" confcat="porn" gz="0" name="EroClips" icon="eroclips" filter="Porn" screen="slutloadGenreScreen" param1="eroclips" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;EroClips.org&quot;, &quot;http://www.eroclips.org&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showcamvideos" default="False" confcat="porn" gz="0" name="CamVideos" icon="camvideos" filter="Porn" screen="slutloadGenreScreen" param1="camvideos" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;CamVideos.tv&quot;, &quot;http://www.camvideos.tv&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showanonv" default="False" confcat="porn" gz="0" name="Anon-V" icon="anonv" filter="Porn" screen="slutloadGenreScreen" param1="anonv" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;Anon-V.com&quot;, &quot;https://anon-v.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showmrdeepfakes" default="False" confcat="porn" gz="0" name="MrDeepFakes" icon="mrdeepfakes" filter="Porn" screen="slutloadGenreScreen" param1="mrdeepfakes" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;MrDeepFakes.com&quot;, &quot;https://mrdeepfakes.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showebony8" default="False" confcat="porn" gz="0" name="Ebony8" icon="ebony8" filter="Porn" screen="slutloadGenreScreen" param1="ebony8" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;Ebony8.com&quot;, &quot;https://www.ebony8.com&quot;"/>
+               <plugin type="mod" modfile="porn.slutload" confopt="showcamuploads" default="False" confcat="porn" gz="0" name="CamUploads" icon="camuploads" filter="Porn" screen="slutloadGenreScreen" param1="camuploads" param2="" search="1" delim="-" searchurl="%s" searchscreen="slutloadFilmScreen" searchparam=", &quot;CamUploads.com&quot;, &quot;https://www.camuploads.com&quot;"/>
                <plugin type="mod" modfile="porn.pornicom" confopt="showpornicom" default="False" confcat="porn" gz="0" name="Pornicom" icon="pornicom" filter="Porn" screen="pornicomGenreScreen" param1="pornicom" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;Pornicom.com&quot;, &quot;https://www.pornicom.com&quot;"/>
                <plugin type="mod" modfile="porn.pornicom" confopt="showvikiporn" default="False" confcat="porn" gz="0" name="VikiPorn" icon="vikiporn" filter="Porn" screen="pornicomGenreScreen" param1="vikiporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;VikiPorn.com&quot;, &quot;https://www.vikiporn.com&quot;"/>
                <plugin type="mod" modfile="porn.pornicom" confopt="showsleazyneasy" default="False" confcat="porn" gz="0" name="SleazyNEasy" icon="sleazyneasy" filter="Porn" screen="pornicomGenreScreen" param1="sleazyneasy" param2="" search="1" delim="+" searchurl="%s" searchscreen="pornicomFilmScreen" searchparam=", &quot;SleazyNEasy.com&quot;, &quot;https://www.sleazyneasy.com&quot;"/>
                <plugin type="mod" modfile="porn.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.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;"/>
index 50da025..3e5a408 100644 (file)
@@ -357,7 +357,4 @@ class funkEpisodesScreen(MPScreen):
                        from Plugins.Extensions.MediaPortal.resources import nexx
                        videourl = nexx.getVideoUrl(id, downld)
                if videourl:
-                       if "m3u8" in videourl:
-                               self.session.open(SimplePlayer, [(Title, videourl)], showPlaylist=False, ltype='funk', forceGST=False)
-                       else:
-                               self.session.open(SimplePlayer, [(Title, videourl)], showPlaylist=False, ltype='funk')
\ No newline at end of file
+                       self.session.open(SimplePlayer, [(Title, videourl)], showPlaylist=False, ltype='funk')
\ No newline at end of file
index 8cb6366..d9a24e1 100644 (file)
@@ -3,6 +3,7 @@
 import json
 import thread
 import base64
+from os.path import exists
 from Tools.BoundFunction import boundFunction
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
@@ -376,9 +377,16 @@ class youtubeGenreScreen(MenuHelper):
                        self.subCatSelectedChannels.append(self.subCatUserChannel)
 
                try:
+                       oauth2_file = config_mp.mediaportal.watchlistpath.value + "mp_yt-oauth2"
+                       fname = mp_globals.pluginPath + "/resources/mp_yt-oauth2"
+                       if not exists(oauth2_file):
+                               shutil.copyfile(fname, oauth2_file)
+               except:
+                       pass
+
+               try:
                        fname = mp_globals.pluginPath + "/resources/userchan.xml"
                        self.user_path = config_mp.mediaportal.watchlistpath.value + "mp_userchan.xml"
-                       from os.path import exists
                        if not exists(self.user_path):
                                shutil.copyfile(fname, self.user_path)
                        fp = open(self.user_path)
@@ -1904,8 +1912,8 @@ class YT_ListScreen(MPScreen, ThumbsHelper):
 
 class YT_Oauth2:
        OAUTH2_URL = 'https://accounts.google.com/o/oauth2'
-       CLIENT_ID = mp_globals.yt_i
-       CLIENT_SECRET = mp_globals.yt_s
+       CLIENT_ID = ''
+       CLIENT_SECRET = ''
        SCOPE = '&scope=https://www.googleapis.com/auth/youtube.readonly'
        GRANT_TYPE = '&grant_type=http://oauth.net/grant_type/device/1.0'
        TOKEN_PATH = '/etc/enigma2/mp_yt-access-tokens.json'
@@ -1921,6 +1929,23 @@ class YT_Oauth2:
                self.abortPoll = False
                self.waitingBox = None
                self.session = None
+               client_id = ''
+               client_secret = ''
+
+               try:
+                       oauth2_file = config_mp.mediaportal.watchlistpath.value + "mp_yt-oauth2"
+                       fp = open(oauth2_file)
+                       data = fp.read()
+                       fp.close()
+                       client_id = re.search('client_id=(.*?)\n', data).group(1)
+                       if client_id:
+                               self.CLIENT_ID = 'client_id='+client_id
+                       client_secret = re.search('client_secret=(.*?)\n', data).group(1)
+                       if client_secret:
+                               self.CLIENT_SECRET = '&client_secret='+client_secret
+               except:
+                       pass
+
                if not config_mp.mediaportal.yt_refresh_token.value:
                        self._recoverToken()
 
@@ -1935,8 +1960,11 @@ class YT_Oauth2:
 
        def requestDevCode(self, session):
                self.session = session
-               postData = self.CLIENT_ID + self.SCOPE
-               twAgentGetPage(self.OAUTH2_URL+'/device/code', method='POST', postdata=postData, headers={'Content-Type': 'application/x-www-form-urlencoded'}).addCallback(self._cb_requestDevCode, False).addErrback(self._cb_requestDevCode)
+               if self.CLIENT_ID and self.CLIENT_SECRET:
+                       postData = self.CLIENT_ID + self.SCOPE
+                       twAgentGetPage(self.OAUTH2_URL+'/device/code', method='POST', postdata=postData, headers={'Content-Type': 'application/x-www-form-urlencoded'}).addCallback(self._cb_requestDevCode, False).addErrback(self._cb_requestDevCode)
+               else:
+                       self.session.open(MessageBoxExt, _("Missing OAuth2 data, please fill the file 'mp_yt-oauth2' first and restart the Enigma2 GUI."), MessageBoxExt.TYPE_ERROR)
 
        def _cb_requestDevCode(self, data, error=True):
                if error:
@@ -1989,7 +2017,7 @@ class YT_Oauth2:
                                        f.write(json.dumps(tokenData))
                                        f.close()
                                        self.waitingBox.cancel()
-                                       self.session.open(MessageBoxExt, _('Access granted :)\nFor safety you should create backup\'s of enigma2 settings and \'/etc/enigma2/mp_yt-access-tokens.json\'.\nThe tokens are valid until they are revoked in Your Google Account.'), MessageBoxExt.TYPE_INFO)
+                                       self.session.open(MessageBoxExt, _('Access granted :)\nFor safety you should create backup\'s of enigma2 settings and \'mp_yt-access-tokens.json\'.\nThe tokens are valid until they are revoked in Your Google Account.'), MessageBoxExt.TYPE_INFO)
                                elif not self.abortPoll:
                                        print tokenData.get('error','').encode('utf-8')
                                        reactor.callLater(self._interval, self._pollOauth2Server)
index 1ea2170..d778dcc 100644 (file)
@@ -78,7 +78,7 @@ class MTVdeChartsGenreScreen(MPScreen):
                                ('MTV.de\tDeutschsprachige Single Charts Top15',"http://www.mtv.de/charts/jlyhaa/top-15-deutschsprachige-single-charts"),
                                ('MTV.de\tDownload Charts',"http://www.mtv.de/charts/pcbqpc/downloads-charts-single"),
                                ('MTV.de\tMost Watched Videos on MTV',"http://www.mtv.de/charts/n2aau3/most-watched-videos"),
-                               ('MTV.de\tTop100 Jahrescharts 2018',"http://www.mtv.de/charts/yrk67s/top-100-jahrescharts-2016"),
+                               ('MTV.de\tTop100 Jahrescharts 2019',"http://www.mtv.de/charts/yrk67s/top-100-jahrescharts-2016"),
                                ('MTV.de\tTop100 Jahrescharts 2017',"http://www.mtv.de/charts/czzmta/top-100-jahrescharts-2017"),
                                ('MTV.de\tTop100 Jahrescharts 2015',"http://www.mtv.de/charts/4z2jri/top-100-jahrescharts-2015"),
                                ('MTV.de\tTop100 Jahrescharts 2014',"http://www.mtv.de/charts/ns9mkd/top-100-jahrescharts-2014"),
@@ -93,10 +93,8 @@ class MTVdeChartsGenreScreen(MPScreen):
                                ('MTV.co.uk\tOfficial UK Audio Streaming Charts','http://www.mtv.co.uk/music/charts/the-official-uk-audio-streaming-chart-top-20'),
                                ('MTV.it\tEuro Top20 Charts','http://classifiche.mtv.it/euro-top-20/c22lpa'),
                                ('MTV.it\tHitlist Italia - Single','http://classifiche.mtv.it/hitlist-italia-classifica-singoli/cgmo2j'),
-                               #('MTV.it\tHitlist Italia - Album','http://classifiche.mtv.it/hitlist-italia-classifica-album/s8x0tp'),
                                ('MTV.it\tUK Charts','http://classifiche.mtv.it/classifica-musica-inglese/d901ei'),
                                ('MTV.it\tUSA Charts','http://classifiche.mtv.it/classifica-musica-americana/a6i0r1'),
-                               #('MTV.it\tMost Viewed Video Ranking','http://classifiche.mtv.it/mtv-it-classifica-mtv-video/4cadoe'),
                                ('MTV.it\tMost Beautiful Songs To Download','http://classifiche.mtv.it/imtv-chart/xrbmn1'),
                                ('MTV.it\tBest Summer Song Ever','http://classifiche.mtv.it/best-summer-song-ever-classifica-migliori-canzoni-estate-di-sempre/igfbtk'),
                                ('MTV.it\tSummer Hits 2019','http://classifiche.mtv.it/summer-hits-classifica-canzoni-estate-2019/n27py3'),
@@ -135,9 +133,7 @@ class MTVdeChartsGenreScreen(MPScreen):
                                ('MTV.it\tTop10 1997','http://classifiche.mtv.it/hit-parade-1997/otnog5'),
                                ('MTV.it\tTop10 1996','http://classifiche.mtv.it/hit-parade-1996/ske1sc'),
                                ('MTV.it\tTop50 90s','http://classifiche.mtv.it/classifica-musica-anni-90-mtv-classic/njr5z7'),
-                               ('MTV.it\tTop50 80s','http://classifiche.mtv.it/top-50-classifica-musica-anni-80-2012/p6stm9'),
-                               ('MTV.pl\tPoland Club Charts',"http://www.mtv.pl/notowania/254-mtv-club-chart"),
-                               ('MTV.no\tNorway Most Clicked',"http://www.mtv.no/charts/195-mtv-norway-most-clicked")]
+                               ('MTV.it\tTop50 80s','http://classifiche.mtv.it/top-50-classifica-musica-anni-80-2012/p6stm9')]
 
                self.ml.setList(map(self._defaultlistleft, self.genreliste))
                self.keyLocked = False
@@ -288,22 +284,6 @@ class MTVdeChartsSongListeScreen(MPScreen):
                                self.ml.setList(map(self._defaultlistleft, self.filmliste))
                                self.showInfos()
                                self.keyLocked = False
-               else:
-                       charts = re.findall('<div\sclass="chart-position">(.*?)</div>.*?data-object-id="(.*?)">', data, re.S)
-                       if charts:
-                               part = re.search('pagePlaylist(.*?)trackingParams', data, re.S)
-                               if part:
-                                       for (pos, id) in charts:
-                                               track = re.findall('"id":%s,"title":"(.*?)","subtitle":"(.*?)","video_type":"(.*?)","video_token":"(.*?)","riptide_image_id":(".*?"|null),' % id, part.group(1), re.S)
-                                               if track:
-                                                       for (artist,title,type,token,image_id) in track:
-                                                               image = "http://images.mtvnn.com/%s/306x172" % image_id.replace('"','')
-                                                               title = str(pos) + ". " + artist + " - " + title
-                                                               if len(token)>6:
-                                                                       self.filmliste.append((decodeHtml(title).replace('\\"','"').replace('\\\\','\\'),token,image))
-                       self.ml.setList(map(self._defaultlistleft, self.filmliste))
-                       self.showInfos()
-                       self.keyLocked = False
 
        def showInfos(self):
                title = self['liste'].getCurrent()[0][0]
index 8d4cfab..170cfcc 100644 (file)
@@ -37,6 +37,8 @@
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
+cookies = CookieJar()
 default_cover = "file://%s/focus.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
 class focusGenre(MPScreen):
@@ -117,7 +119,7 @@ class focus(MPScreen, ThumbsHelper):
                self.keyLocked = True
                self.streamList = []
                self['name'].setText(_('Please wait...'))
-               twAgentGetPage(self.streamGenreLink).addCallback(self.pageData).addErrback(self.dataError)
+               twAgentGetPage(self.streamGenreLink, agent=agent, cookieJar=cookies).addCallback(self.pageData).addErrback(self.dataError)
 
        def pageData(self, data):
                focusVideos = re.findall('<img.*?[rel|src]="(.*?[jpg|png])".*?<a\shref="(.*?)"\stitle="(.*?)".*?>(.*?)</a', data, re.S|re.I)
@@ -150,11 +152,18 @@ class focus(MPScreen, ThumbsHelper):
                if self.keyLocked:
                        return
                Link = self['liste'].getCurrent()[0][2]
-               twAgentGetPage(Link).addCallback(self.searchStream).addErrback(self.dataError)
+               twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.searchStream).addErrback(self.dataError)
 
        def searchStream(self, data):
                Title = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
                streamUrl = re.findall('"videoUrl":\s"(.*?)"', data, re.S)
                if streamUrl:
-                       streamUrl = streamUrl[0]
-                       self.session.open(SimplePlayer, [(Title, streamUrl)], showPlaylist=False, ltype='focus')
\ No newline at end of file
+                       url = streamUrl[0]
+                       import requests
+                       ck = requests.utils.dict_from_cookiejar(cookies)
+                       headers = '&Cookie=%s' % ','.join(['%s=%s' % (key, urllib.quote_plus(ck[key])) for key in ck])
+                       headers = headers + '&Referer=%s' % Link
+                       url = url + '#User-Agent='+agent+headers
+                       mp_globals.player_agent = agent
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='focus')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/badoinkvr.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/badoinkvr.py
deleted file mode 100644 (file)
index 9264908..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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 *
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "BaDoinkVR.com"
-default_cover = "file://%s/badoinkvr.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class badoinkvrGenreScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre:")
-               self.keyLocked = True
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               url = "https://badoinkvr.com/vrpornvideos"
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('href="(/category/.*?)"\s{0,1}>(.*?)</a>', data, re.S)
-               if Cats:
-                       for (Url, Title) in Cats:
-                               Url = "https://badoinkvr.com" + Url + "/%s"
-                               self.genreliste.append((decodeHtml(Title), Url, True))
-                       self.genreliste.sort()
-               self.genreliste.insert(0, ("Girls", 'https://badoinkvr.com/vr-pornstars/%s?order=name', True))
-               self.genreliste.insert(0, ("Most Viewed", 'https://badoinkvr.com/vrpornvideos/%s?order=most_viewed', True))
-               self.genreliste.insert(0, ("Top Rated", 'https://badoinkvr.com/vrpornvideos/%s?order=top_rated', True))
-               self.genreliste.insert(0, ("Newest", 'https://badoinkvr.com/vrpornvideos/%s?order=newest', True))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Pages = self['liste'].getCurrent()[0][2]
-               if Name == "Girls":
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(badoinkvrModelsScreen, Link, Name)
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(badoinkvrFilmScreen, Link, Name, Pages)
-
-class badoinkvrModelsScreen(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(BASE_NAME)
-               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 = self.Link % str(self.page)
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'pagination">(.*?)</ul>')
-               Movies = re.findall('class="girl-card-image" src="(.*?)".*?class="girl-card-name.*?href="(.*?)"\sitemprop="url".*?itemprop="name">(.*?)</span>', data, re.S)
-               if Movies:
-                       for (Image, Url, Title) in Movies:
-                               Image = Image.replace('&amp;','&')
-                               Url = "https://badoinkvr.com" + Url
-                               self.filmliste.append((decodeHtml(Title), Url, Image))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No pornstars 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, self.page, int(self.lastpage), 1, 1, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(badoinkvrFilmScreen, Link, Name, False)
-
-class badoinkvrFilmScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, Link, Name, Pages):
-               self.Link = Link
-               self.Name = Name
-               self.Pages = Pages
-               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(BASE_NAME)
-               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 self.Pages:
-                       url = self.Link % str(self.page)
-               else:
-                       url = self.Link
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'pagination">(.*?)</ul>')
-               Movies = re.findall('class="video-card-image" src="(.*?)".*?class="video-card-title.*?href="(.*?)"\s{1,5}title="(.*?)".*?itemprop="datePublished".*?>(.*?)</span.*?itemprop="duration".*?>(.*?)</span.*?itemprop="actor".*?>(.*?)</div>', data, re.S)
-               if Movies:
-                       for (Image, Url, Title, Date, Runtime, Models) in Movies:
-                               Image = Image.replace('&amp;','&')
-                               Url = "https://badoinkvr.com" + Url
-                               models = stripAllTags(Models)
-                               models = re.sub('\s+', ' ', models).strip().rstrip(',')
-                               Title =  models + " - " + Title
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Date, Runtime))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               runtime = self['liste'].getCurrent()[0][4]
-               self['handlung'].setText("Date: "+date+'\nRuntime: '+runtime)
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='badoinkvr')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/bangbros.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/bangbros.py
deleted file mode 100644 (file)
index 2660130..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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 *
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "Bangbros.com"
-default_cover = "file://%s/bangbros.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class bangbrosGenreScreen(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(BASE_NAME)
-               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://bangbros.com/category"
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('href="(/category/.*?)".*? class="thmb_pic"><img src="(.*?)".*?class="thmb_ttl">(.*?)</span', data, re.S)
-               if Cats:
-                       for (Url, Image, Title) in Cats:
-                               Url = 'http://bangbros.com%s' % Url
-                               Image = "http:" + Image
-                               self.genreliste.append((decodeHtml(Title), Url, Image))
-               self.genreliste.sort()
-               self.genreliste.insert(0, ("Most Viewed", 'http://bangbros.com/videos/views', default_cover))
-               self.genreliste.insert(0, ("Most Popular", 'http://bangbros.com/videos/popular', default_cover))
-               self.genreliste.insert(0, ("Newest", 'http://bangbros.com/videos', default_cover))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               Image = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               if Name == "--- Search ---":
-                       self.suchen()
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(bangbrosFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '-')
-                       self.session.open(bangbrosFilmScreen, Link, Name)
-
-class bangbrosFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 1
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "http://bangbros.com/search/videos/%s/%s" % (self.Link, str(self.page))
-               else:
-                       if self.page == 1:
-                               url = self.Link
-                       else:
-                               url = "%s/%s" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="pagi">(.*?)ePg_spn">Last', '.*\/(\d+)"')
-               parse = re.search('class="middle">(.*?)class="footer">', data, re.S)
-               Movies = re.findall('class="echThumb"><a(?: id="video-\w+\d+"|) title="(.*?)"\s{1,5}href="(.*?)" class="thmb_lnk\s{0,2}"><span(?: id="rollover-container-\w+\d+"|) class="thmb_pic hover-rollover"><b class="tTm">(.*?)</b.*?data-initial-image-url="(.*?)".*?class="cast-wrapper">(.*?)</div>.*?fa-bus.*?class="faTxt">(.*?)</span.*?fa-calendar.*?class="faTxt">(.*?)</span', parse.group(1), re.S)
-               if Movies:
-                       for (Title, Url, Runtime, Image, Pornstars, Collection, Date) in Movies:
-                               if Image.startswith('//'):
-                                       Image = 'http:' + Image
-                               Image = Image.replace('members/450x340','bangbros/big1')
-                               Url = "http://bangbrothers.net" + Url
-                               Date = Date.strip()
-                               if not Pornstars == '':
-                                       Title = stripAllTags(Pornstars.replace('</a><a',', </a><a')).strip() + " - " + Title
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Date, Collection, Runtime))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               coll = self['liste'].getCurrent()[0][4]
-               runtime = self['liste'].getCurrent()[0][5]
-               self['handlung'].setText("Date: "+date+'\nSeries: '+coll.strip()+'\nRuntime: '+runtime)
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='bangbros')
\ No newline at end of file
index 2c5f292..19e6c84 100644 (file)
@@ -39,6 +39,7 @@ 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'
+cookies = CookieJar()
 default_cover = "file://%s/camhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
 class camhubGenreScreen(MPScreen):
@@ -152,7 +153,7 @@ class camhubFilmScreen(MPScreen, ThumbsHelper):
                                url = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=rating&from=%s" % (self.Link, str(self.page))
                        elif "most-popular" in self.Link:
                                url = "%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=video_viewed&from=%s" % (self.Link, str(self.page))
-               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+               twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
                self.getLastPage(data, 'lass="pagination"(.*?)>Last<', '.*[from:|>](\d+)["|<]')
@@ -184,14 +185,12 @@ class camhubFilmScreen(MPScreen, ThumbsHelper):
                Link = self['liste'].getCurrent()[0][1]
                if Link:
                        self['name'].setText(_('Please wait...'))
-                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.parseVideo).addErrback(self.dataError)
 
-       def parseVideo(self, data):
+       def parseVideo(self, data, referer=''):
                if "Embed Player Error" in data:
                        message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
                else:
-                       Title = self['liste'].getCurrent()[0][0]
-                       mp_globals.player_agent = agent
                        license = re.findall('license_code:\s\'(.*?)\',', data, re.S)
                        url = re.findall('video_(?:alt_|)url\d{0,1}:\s\'(.*?)\'.*?video_(?:alt_|)url_text:\s\'(\d+)(?:p|)\',', data, re.S)
                        if not url:
@@ -207,11 +206,27 @@ class camhubFilmScreen(MPScreen, ThumbsHelper):
                                        url = url[-1]
                                if 'function/0/' in url:
                                        url = decrypturl(url, license[0])
-                               self['name'].setText('')
-                               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='camhub')
+                               if url:
+                                       tw_agent_hlp = TwAgentHelper(cookieJar=cookies)
+                                       tw_agent_hlp.getRedirectedUrl(url).addCallback(self.getStream, referer).addErrback(self.dataError)
                        else:
-                               fetch = re.findall('<iframe.*?src="(http://(?:webcamsdolls.com|www.camhub.world)/embed/\d+)', data, re.S)
+                               fetch = re.findall('<iframe.*?src="(http://(?:webcamsdolls.com|www.camhub.world|www.zzpornozz.xyz)/embed/\d+)', data, re.S)
                                if fetch:
-                                       twAgentGetPage(fetch[0], agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+                                       url = fetch[0]
+                                       twAgentGetPage(url, agent=agent).addCallback(self.parseVideo, url).addErrback(self.dataError)
                                else:
-                                       message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
\ No newline at end of file
+                                       message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
+
+       def getStream(self, url, referer):
+               self['name'].setText('')
+               Title = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               import requests
+               ck = requests.utils.dict_from_cookiejar(cookies)
+               headers = '&Cookie=%s' % ','.join(['%s=%s' % (key, urllib.quote_plus(ck[key])) for key in ck])
+               if referer == '':
+                       referer = Link
+               headers = headers + '&Referer=%s' % referer
+               url = url + '#User-Agent='+agent+headers
+               mp_globals.player_agent = agent
+               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='camhub')
\ No newline at end of file
index 30b6cb5..9a989ef 100644 (file)
@@ -262,13 +262,15 @@ class cliphunterFilmScreen(MPScreen, ThumbsHelper):
 
        def loadData(self, data):
                self.getLastPage(data, '', 'maxPages="(.*?)"')
-               Movies = re.findall(' <li mId="\d+".*?href="(/w/\d+/(.*?))".*?class="i(?: pop-execute|)"\ssrc="(.*?)".*?class="tr(?: pop-execute|)">(.*?)</div>.*?class="vttl.*?">(.*?)</a>', data, re.S)
+               Movies = re.findall('<li mId="\d+".*?href="(/w/\d+/(.*?))".*?class="i(?: pop-execute|)"\ssrc="(.*?)".*?class="tr(?: pop-execute|)">(.*?)</div>.*?class="info(?: long|)">(.*?)</div', data, re.S)
                if Movies:
-                       for (Url, TitleUrl, Image, Runtime, Title) in Movies:
+                       for (Url, Title, Image, Runtime, Views) in Movies:
                                Url = "http://www.cliphunter.com" + Url
-                               self.filmliste.append((TitleUrl.replace('_',' ').strip(), Url, Image, Runtime))
+                               Title = Title.replace('_',' ').strip()
+                               Views = Views.replace('views','').replace(',','').strip()
+                               self.filmliste.append((Title, Url, Image, Runtime, Views))
                if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', None, ''))
+                       self.filmliste.append((_('No videos found!'), '', None, '', ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
                self.ml.moveToIndex(0)
                self.keyLocked = False
@@ -280,7 +282,8 @@ class cliphunterFilmScreen(MPScreen, ThumbsHelper):
                url = self['liste'].getCurrent()[0][1]
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
-               self['handlung'].setText("Runtime: %s" % runtime)
+               views = self['liste'].getCurrent()[0][4]
+               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
                self['name'].setText(title)
                CoverHelper(self['coverArt']).getCover(pic)
 
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/digitalplayground.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/digitalplayground.py
deleted file mode 100644 (file)
index 7b340da..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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 *
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "DigitalPlayground.com"
-default_cover = "file://%s/digitalplayground.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class digitalplaygroundGenreScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre:")
-               self.keyLocked = True
-               self.suchString = ''
-
-               self.genreliste = []
-               self.cats = []
-               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.digitalplayground.com/tags/"
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('class="preview-image".*?<a\shref="(.*?)".*?title="(.*?)\svideos">.*?img\ssrc=".*?".*?data-srcset="(.*?)"', data, re.S)
-               if Cats:
-                       for (Url, Title, Image) in Cats:
-                               Url = 'http://www.digitalplayground.com%s' % Url
-                               self.cats.append(Title)
-                               if not Image.startswith('http'):
-                                       Image = 'http:' + Image
-                               self.genreliste.append((decodeHtml(Title), Url, Image))
-
-               parse = re.search('class="filter-options">(.*?)</section>', data, re.S)
-               if parse:
-                       Cats = re.findall('data-trackId.*?href="(.*?)">(.*?)</a>', parse.group(1), re.S)
-                       if Cats:
-                               for (Url, Title) in Cats:
-                                       Url = 'http://www.digitalplayground.com%s' % Url
-                                       if Title not in self.cats:
-                                               self.genreliste.append((decodeHtml(Title), Url, default_cover))
-                               self.genreliste.sort()
-               self.genreliste.insert(0, ("Most Viewed", 'http://www.digitalplayground.com/videos/all-videos/all-pornstars/all-categories/alltime/mostviewed/', default_cover))
-               self.genreliste.insert(0, ("Top Rated", 'http://www.digitalplayground.com/videos/all-videos/all-pornstars/all-categories/alltime/toprated/', default_cover))
-               self.genreliste.insert(0, ("Release Date", 'http://www.digitalplayground.com/videos/all-videos/all-pornstars/all-categories/alltime/bydate/', default_cover))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               Image = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               if Name == "--- Search ---":
-                       self.suchen()
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(digitalplaygroundFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '+')
-                       self.session.open(digitalplaygroundFilmScreen, Link, Name)
-
-class digitalplaygroundFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 1
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "http://www.digitalplayground.com/search/videos/%s/date/desc/%s/" % (self.Link, str(self.page))
-               else:
-                       if self.page == 1:
-                               url = self.Link
-                       else:
-                               url = "%s%s/" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="pagination(.*?)</nav>')
-               Movies = re.findall('box-card scene.*?<a\shref="(.*?)".*?img\ssrc=".*?".*?alt="(.*?)".*?data-srcset="(.*?)".*?class="subtitle">.*?">(.*?)</a>.*? <span class=""><span>(.*?)</span>.*?<span>(.*?)</span>.*?class="middle">(.*?)<', data, re.S)
-               if Movies:
-                       for (Url, Title, Image, Collection, Runtime, Date, Views) in Movies:
-                               Url = "http://www.digitalplayground.com" + Url
-                               if not Image.startswith('http'):
-                                       Image = 'http:' + Image
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Date, Collection, Runtime, Views))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               coll = self['liste'].getCurrent()[0][4]
-               runtime = self['liste'].getCurrent()[0][5]
-               views = self['liste'].getCurrent()[0][6]
-               self['handlung'].setText("Date: "+date+'\nSeries: '+coll.strip()+'\nViews: '+views+'\nRuntime: '+runtime)
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               Link = Link.replace('http:','https:')
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='digitalplayground')
\ No newline at end of file
index 153333b..66fa5e0 100644 (file)
@@ -177,7 +177,7 @@ class faapyChannelsScreen(MPScreen, ThumbsHelper):
                Title = self['liste'].getCurrent()[0][0]
                Image = self['liste'].getCurrent()[0][2]
                self['name'].setText(Title)
-               CoverHelper(self['coverArt']).getCover(Image)
+               CoverHelper(self['coverArt']).getCover(Image, headers={'Referer':'https://faapy.com'})
 
        def keyOK(self):
                if self.keyLocked:
@@ -255,7 +255,7 @@ class faapyFilmScreen(MPScreen, ThumbsHelper):
                views = self['liste'].getCurrent()[0][3]
                self['name'].setText(title)
                self['handlung'].setText("Views: %s\n" % views)
-               CoverHelper(self['coverArt']).getCover(pic)
+               CoverHelper(self['coverArt']).getCover(pic, headers={'Referer':'https://faapy.com'})
 
        def keyOK(self):
                if self.keyLocked:
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/julesjordan.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/julesjordan.py
deleted file mode 100644 (file)
index 29d403d..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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 *
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "JulesJordan.com"
-default_cover = "file://%s/julesjordan.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class julesjordanGenreScreen(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(BASE_NAME)
-               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
-               self['name'].setText(_('Please wait...'))
-               url = "https://www.julesjordan.com/trial/category.php?id=3"
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('<!--Title-->.*?href="(.*?).html">(.*?)</a>.*?src0_1x="(.*?)"', data, re.S)
-               if Cats:
-                       for (Url, Title, Image) in Cats:
-                               Url = Url + "_%s_d.html"
-                               self.genreliste.append((decodeHtml(Title), Url, Image))
-                       self.genreliste.sort()
-               self.genreliste.insert(0, ("Pornstars", 'https://www.julesjordan.com/trial/models/models_%s.html', default_cover))
-               self.genreliste.insert(0, ("Most Popular", 'https://www.julesjordan.com/trial/categories/movies_%s_p.html', default_cover))
-               self.genreliste.insert(0, ("Most Recent", 'https://www.julesjordan.com/trial/categories/movies_%s_d.html', default_cover))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               Image = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               if Name == "--- Search ---":
-                       self.suchen()
-               elif Name == "Pornstars":
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(julesjordanPornstarsScreen, Link, Name)
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(julesjordanFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '%20')
-                       self.session.open(julesjordanFilmScreen, Link, Name)
-
-class julesjordanPornstarsScreen(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(BASE_NAME)
-               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 = self.Link % str(self.page)
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="page_totals">(.*?)</div>', '.*of\s(\d+)')
-               Pornstars = re.findall('class="update_details">.*?\t<a\shref="(.*?)">(.*?)</a>.*?src0(?:_1x|)="(.*?)"', data, re.S)
-               if Pornstars:
-                       for (Url, Title, Image) in Pornstars:
-                               self.filmliste.append((decodeHtml(Title), Url, Image))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No pornstars 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, self.page, int(self.lastpage), 1, 1, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               self.session.open(julesjordanFilmScreen, Link, Name)
-
-class julesjordanFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 1
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "https://www.julesjordan.com/trial/search.php?query=%s&page=%s" % (self.Link, str(self.page))
-               else:
-                       if "%s" in self.Link:
-                               url = self.Link % str(self.page)
-                       else:
-                               url = self.Link
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="page_totals">(.*?)</div>', '.*of\s(\d+)')
-               Movies = re.findall('Thumbnail -->.*?href="(.*?)".*?src0(?:_1x|)="(.*?)".*?">(.*?)</a>.*?(\d+&nbsp;min).*?<!-- Date -->(.*?\d{4})', data, re.S)
-               if Movies:
-                       for (Url, Image, Title, Runtime, Date) in Movies:
-                               Date = Date.strip()
-                               Runtime = Runtime.replace('&nbsp;',' ')
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Date, Runtime))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               runtime = self['liste'].getCurrent()[0][4]
-               self['handlung'].setText("Date: "+date+"\nRuntime: "+runtime)
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='julesjordan')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/naughtyamerica.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/naughtyamerica.py
deleted file mode 100644 (file)
index 6c83872..0000000
+++ /dev/null
@@ -1,209 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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.choiceboxext import ChoiceBoxExt
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "NaughtyAmerica.com"
-default_cover = "file://%s/naughtyamerica.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class naughtyamericaGenreScreen(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,
-                       "yellow" : self.keyChangeCats
-               }, -1)
-
-               self['title'] = Label(BASE_NAME)
-               self['ContentTitle'] = Label("Genre:")
-               self['F3'] = Label(_("Mode"))
-               self.keyLocked = True
-               self.suchString = ''
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-               self.catmode = 'category'
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.genreliste = []
-               self.keyLocked = True
-               url = "https://tour.naughtyamerica.com/fantasy/%s" % self.catmode
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               parse = re.search('class="categories">(.*?)class="clear"', data, re.S)
-               Cats = re.findall('href="(.*?fantasy\/(.*?))(?:\?nats.*?)".*?>(.*?)</a', parse.group(1), re.S)
-               if Cats:
-                       for (Url, Title, TitleText) in Cats:
-                               if not "..." in TitleText:
-                                       Title = TitleText
-                               else:
-                                       Title = Title.replace('-porn-videos','').replace('-',' ').title()
-                               if not Title in ("VR Porn", "Virtual Reality"):
-                                       Url = Url + "?page="
-                                       self.genreliste.append((decodeHtml(Title), Url, None))
-                       self.genreliste.sort()
-               self.genreliste.insert(0, ("Newest", 'https://tour.naughtyamerica.com/new-porn-videos?page=', None))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", None))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               if Name == "--- Search ---":
-                       self.suchen()
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(naughtyamericaFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '+')
-                       self.session.open(naughtyamericaFilmScreen, Link, Name)
-
-       def keyChangeCats(self):
-               rangelist = [['Category', 'category'], ['Who', 'who'], ['Where', 'where']]
-               self.session.openWithCallback(self.ChangeCats, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
-
-       def ChangeCats(self, result):
-               if result:
-                       self.catmode = result[1]
-                       self.layoutFinished()
-
-class naughtyamericaFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 1
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "https://tour.naughtyamerica.com/search?term=%s&page=%s" % (self.Link, str(self.page))
-               else:
-                       url = "%s%s" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="pagination(.*?)</div>', '.*(?:\/|>)(\d+)')
-               parse = re.search('content-main(.*?)(id="fantasySideBar"|id="wrapper-footer)', data, re.S)
-               Movies = re.findall('a\shref="(https?://tour.naughtyamerica.com.*?)"\stitle="(.*?)".*?img.*?src="(.*?)"(.*?)class="entry-date">(.*?)</p', parse.group(1), re.S)
-               if Movies:
-                       for (Url, Title, Image, VrCheck, Date) in Movies:
-                               if not "vr-icon" in VrCheck:
-                                       if Image.startswith('//'):
-                                               Image = 'http:' + Image
-                                       self.filmliste.append((decodeHtml(Title), Url, Image, Date))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               self['handlung'].setText(date)
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='naughtyamerica')
\ No newline at end of file
index 7502edf..0104523 100644 (file)
@@ -169,7 +169,7 @@ class pornxioGenreScreen(MPScreen):
                                                                if not "GIFS" in Title:
                                                                        self.filmliste.append((upperString(decodeHtml(Title)), Url, Image))
                                        self.filmliste.sort()
-               if (self.genre == "category" or self.genre == "cat" or self.genre == "channels" or self.genre == "porn-categories" or self.genre == "tags"):
+               if (self.genre == "category" or self.genre == "categories" or self.genre == "cat" or self.genre == "channels" or self.genre == "porn-categories" or self.genre == "tags"):
                        if self.mode == "pornxio":
                                self.filmliste.insert(0, ("Studios", "studios", default_cover))
                        elif self.mode == "handjobhub" or self.mode == "laidhub":
@@ -301,13 +301,21 @@ class pornxioFilmScreen(MPScreen, ThumbsHelper):
                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, Image, Title, Runtime, Rating, Views) in Movies:
-                               if not "Photos" in Runtime:
+                               if Runtime and not "Photos" in Runtime:
+                                       if Title == '':
+                                               Title = Image.split('/')[-1]
+                                               if "." in Title:
+                                                       Title = Title.split('.')[0]
                                        self.filmliste.append((decodeHtml(Title).strip(), Url, Image.replace(' ','%20'), Runtime, Rating, Views))
                else:
                        Movies = re.findall('class="item col">.*?href="(.*?)".*?class="icon -thumb-up">.*?class="item__stat-label">(.*?)</span>.*?class="icon -eye">.*?class="item__stat-label">(.*?)</span>.*?class="icon -time">.*?class="item__stat-label">(.*?)</span>.*?(?:src|data-opts-original)="(?!data:image/)(\w.*?)".*?alt="(.*?)".*?', data, re.S)
                        if Movies:
                                for (Url, Rating, Views, Runtime, Image, Title) in Movies:
                                        if not "Photos" in Runtime:
+                                               if Title == '':
+                                                       Title = Image.split('/')[-1]
+                                                       if "." in Title:
+                                                               Title = Title.split('.')[0]
                                                self.filmliste.append((decodeHtml(Title).strip(), Url, Image.replace(' ','%20'), Runtime, Rating, Views))
                if len(self.filmliste) == 0:
                        self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/realitykings.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/realitykings.py
deleted file mode 100644 (file)
index 38db60e..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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 *
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "RealityKings.com"
-default_cover = "file://%s/realitykings.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class realitykingsGenreScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre:")
-               self.keyLocked = True
-               self.suchString = ''
-
-               self.genreliste = []
-               self.cats = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               url = "https://www.realitykings.com/tour/categories/"
-               getPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               Cats = re.findall('card-thumb.*?href="(.*?)".*?img\ssrc="(.*?)".*?alt="(.*?)\sPorn Videos"', data, re.S)
-               if Cats:
-                       for (Url, Image, Title) in Cats:
-                               Url = 'https://www.realitykings.com%s' % Url
-                               self.cats.append(Title)
-                               self.genreliste.append((decodeHtml(Title), Url, Image))
-               url = "https://www.realitykings.com/tour/category/view/75/anal/"
-               getPage(url, agent=myagent).addCallback(self.genreData2).addErrback(self.dataError)
-
-       def genreData2(self, data):
-               parse = re.search('class="filter-header">(.*?)</html>', data, re.S)
-               if parse:
-                       Cats = re.findall('<li><a\shref="(.*?)".*?title="(.*?)"', parse.group(1), re.S)
-                       if Cats:
-                               for (Url, Title) in Cats:
-                                       Url = 'https://www.realitykings.com%s' % Url
-                                       if Title not in self.cats:
-                                               self.genreliste.append((decodeHtml(Title), Url, default_cover))
-                               self.genreliste.sort()
-               self.genreliste.insert(0, ("Most Viewed", 'https://www.realitykings.com/tour/videos/all-sites/all-categories/all-time/most-viewed/', default_cover))
-               self.genreliste.insert(0, ("Top Rated", 'https://www.realitykings.com/tour/videos/all-sites/all-categories/all-time/top-rated/', default_cover))
-               self.genreliste.insert(0, ("Release Date", 'https://www.realitykings.com/tour/videos/all-sites/all-categories/all-time/recent/', default_cover))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               Image = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               if Name == "--- Search ---":
-                       self.suchen()
-               else:
-                       Link = self['liste'].getCurrent()[0][1]
-                       self.session.open(realitykingsFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '+')
-                       self.session.open(realitykingsFilmScreen, Link, Name)
-
-class realitykingsFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 1
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "https://www.realitykings.com/tour/search/videos/%s/%s/" % (self.Link, str(self.page))
-               else:
-                       if self.page == 1:
-                               url = self.Link
-                       else:
-                               url = "%s%s/" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, '<ul class="pagination">(.*?)</nav>', '.*[>|/](\d+)[<|/]')
-               Movies = re.findall('card--release".*?href="(.*?)"\s{1,15}title="(.*?)".*?srcMobile:.\'(.*?)\'.*?__meta.*?title="(.*?)".*?meta-date">(.*?)</span', data, re.S)
-               if Movies:
-                       for (Url, Title, Image, Collection, Date) in Movies:
-                               Url = "https://www.realitykings.com" + Url
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Date, Collection))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               date = self['liste'].getCurrent()[0][3]
-               coll = self['liste'].getCurrent()[0][4]
-               self['handlung'].setText("Date: "+date+'\nSite: '+coll.strip())
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url))], showPlaylist=False, ltype='realitykings')
\ No newline at end of file
index d7c445a..1e287aa 100644 (file)
@@ -262,7 +262,10 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
                runtime = self['liste'].getCurrent()[0][3]
                views = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               self['handlung'].setText("%s: %s\nRuntime: %s\nViews: %s" % (_("Sort order"),self.sorttext,runtime, views))
+               if not self.Sort:
+                       self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
+               else:
+                       self['handlung'].setText("%s: %s\nRuntime: %s\nViews: %s" % (_("Sort order"),self.sorttext,runtime, views))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keySort(self):
index f041811..947998f 100644 (file)
@@ -39,6 +39,7 @@ 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'
+cookies = CookieJar()
 
 class slutloadGenreScreen(MPScreen):
 
@@ -62,6 +63,66 @@ class slutloadGenreScreen(MPScreen):
                        self.portal = "VQTube.com"
                        self.baseurl = "https://vqtube.com"
                        default_cover = "file://%s/vqtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "porntube69":
+                       self.portal = "PornTube69.net"
+                       self.baseurl = "https://www.porntube69.net"
+                       default_cover = "file://%s/porntube69.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "megatube":
+                       self.portal = "MegaTube.xxx"
+                       self.baseurl = "https://www.megatube.xxx"
+                       default_cover = "file://%s/megatube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "watchmygf":
+                       self.portal = "WatchMyGF.me"
+                       self.baseurl = "https://www.watchmygf.me"
+                       default_cover = "file://%s/watchmygf.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "watchmyexgf":
+                       self.portal = "WatchMyExGF.net"
+                       self.baseurl = "https://www.watchmyexgf.net"
+                       default_cover = "file://%s/watchmyexgf.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "tropictube":
+                       self.portal = "TropicTube.com"
+                       self.baseurl = "https://www.tropictube.com"
+                       default_cover = "file://%s/tropictube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "pornfd":
+                       self.portal = "PornFD.com"
+                       self.baseurl = "https://www.pornfd.com"
+                       default_cover = "file://%s/pornfd.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "pornbimbo":
+                       self.portal = "PornBimbo.com"
+                       self.baseurl = "http://pornbimbo.com"
+                       default_cover = "file://%s/pornbimbo.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "boundhub":
+                       self.portal = "BoundHub.com"
+                       self.baseurl = "https://www.boundhub.com"
+                       default_cover = "file://%s/boundhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "eroclips":
+                       self.portal = "EroClips.org"
+                       self.baseurl = "http://www.eroclips.org"
+                       default_cover = "file://%s/eroclips.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "punishbang":
+                       self.portal = "PunishBang.com"
+                       self.baseurl = "https://www.punishbang.com"
+                       default_cover = "file://%s/punishbang.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "camvideos":
+                       self.portal = "CamVideos.tv"
+                       self.baseurl = "http://www.camvideos.tv"
+                       default_cover = "file://%s/camvideos.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "anonv":
+                       self.portal = "Anon-V.com"
+                       self.baseurl = "https://anon-v.com"
+                       default_cover = "file://%s/anonv.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "mrdeepfakes":
+                       self.portal = "MrDeepFakes.com"
+                       self.baseurl = "https://mrdeepfakes.com"
+                       default_cover = "file://%s/mrdeepfakes.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "ebony8":
+                       self.portal = "Ebony8.com"
+                       self.baseurl = "https://www.ebony8.com"
+                       default_cover = "file://%s/ebony8.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.mode == "camuploads":
+                       self.portal = "CamUploads.com"
+                       self.baseurl = "https://www.camuploads.com"
+                       default_cover = "file://%s/camuploads.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
@@ -84,17 +145,34 @@ class slutloadGenreScreen(MPScreen):
                self.onLayoutFinish.append(self.loadPage)
 
        def loadPage(self):
+               self['name'].setText(_('Please wait...'))
                self.extcat = []
                self.maincat = []
-               self.maincat.insert(0, ("Longest", "duration"))
-               self.maincat.insert(0, ("Most Favorited", "most_favourited"))
-               self.maincat.insert(0, ("Most Commented", "most_commented"))
-               self.maincat.insert(0, ("Top Rated", "rating"))
-               self.maincat.insert(0, ("Most Viewed", "video_viewed"))
-               self.maincat.insert(0, ("Newest", "post_date"))
-               self.maincat.insert(0, ("--- Search ---", "callSuchen"))
+               if self.mode == "watchmygf":
+                       self.maincat.insert(0, ("Longest", "longest#duration"))
+                       self.maincat.insert(0, ("Most Favorited", "new#most_favourited"))
+                       self.maincat.insert(0, ("Most Commented", "new#most_commented"))
+                       self.maincat.insert(0, ("Top Rated", "rated#rating"))
+                       self.maincat.insert(0, ("Most Viewed", "popular#video_viewed"))
+                       self.maincat.insert(0, ("Newest", "new#post_date"))
+                       self.maincat.insert(0, ("--- Search ---", "callSuchen"))
+               else:
+                       self.maincat.insert(0, ("Longest", "duration"))
+                       if self.mode == "punishbang":
+                               self.maincat.insert(0, ("Recently Featured", "last_time_view_date"))
+                       self.maincat.insert(0, ("Most Favorited", "most_favourited"))
+                       self.maincat.insert(0, ("Most Commented", "most_commented"))
+                       self.maincat.insert(0, ("Top Rated", "rating"))
+                       self.maincat.insert(0, ("Most Viewed", "video_viewed"))
+                       self.maincat.insert(0, ("Newest", "post_date"))
+                       self.maincat.insert(0, ("--- Search ---", "callSuchen"))
                self.keyLocked = True
-               url = "%s/categories/" % self.baseurl
+               if self.mode == "tropictube":
+                       url = "%s/c/" % self.baseurl
+               elif self.mode == "punishbang":
+                       url = "%s/categories/?mode=async&function=get_block&block_id=list_categories_categories_list&sort_by=title&from=" % self.baseurl
+               else:
+                       url = "%s/categories/" % self.baseurl
                twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
                if self.mode == "vqtube":
                        twAgentGetPage(url+'2/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
@@ -106,17 +184,42 @@ class slutloadGenreScreen(MPScreen):
                        twAgentGetPage(url+'8/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
                        twAgentGetPage(url+'9/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
                        twAgentGetPage(url+'10/', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+               elif self.mode == "punishbang":
+                       twAgentGetPage(url+'2', agent=agent).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               Cats = re.findall('class="item" href="(.*?)" title="(.*?)"', data, re.S)
+               Cats = re.findall('class="item".*?href="(.*?)" title="(.*?)"', data, re.S)
+               if not Cats:
+                       Cats = re.findall('class="thumb category".*?href="(.*?)" title="(.*?)"', data, re.S)
+                       if not Cats:
+                               Cats = re.findall('js-item".*?href="(.*?)".*?title="(.*?)"', data, re.S)
                if Cats:
                        for (Url, Title) in Cats:
-                               self.extcat.append((upperString(Title), Url.strip('/')))
-                       self.extcat.sort()
+                               if not "scat" in Title.lower() and not "toilet" in Title.lower() and not "pony" in Title.lower():
+                                       self.extcat.append((upperString(Title), Url.strip('/')))
+               if 'class="list-categories-tags">' in data:
+                       parse = re.search('class="list-categories-tags">(.*?)</div>', data, re.S)
+                       if parse:
+                               Cats = re.findall('<a href="(.*?)">(.*?)<em>\d+</em></a>', parse.group(1), re.S)
+                               if Cats:
+                                       for (Url, Title) in Cats:
+                                               self.extcat.append((upperString(Title.strip()), Url.strip('/')))
+
+               if 'class="categories-tags-holder">' in data:
+                       parse = re.search('class="categories-tags-holder">(.*?)class="content-footer"', data, re.S)
+                       if parse:
+                               Cats = re.findall('<a href="(.*?)".*?class="text">(.*?)</div.*?<span>\d+</span>', parse.group(1), re.S)
+                               if Cats:
+                                       for (Url, Title) in Cats:
+                                               self.extcat.append((upperString(Title.strip()), Url.strip('/')))
+               # remove duplicates
+               self.extcat = list(set(self.extcat))
+               self.extcat.sort()
                self.filmliste = []
                self.filmliste.extend(self.maincat)
                self.filmliste.extend(self.extcat)
                self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self['name'].setText('')
                self.keyLocked = False
 
        def keyOK(self):
@@ -137,6 +240,7 @@ class slutloadGenreScreen(MPScreen):
                        self.session.open(slutloadFilmScreen, Link, Name, self.portal, self.baseurl)
 
 class slutloadFilmScreen(MPScreen, ThumbsHelper):
+       blacklist = ['scat', 'poo', 'shit', 'toilet', 'meal', 'lunch', 'gaia', 'chinese femdom']
 
        def __init__(self, session, Link, Name, portal, baseurl):
                self.Link = Link
@@ -153,6 +257,36 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                        default_cover = "file://%s/fapster.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "VQTube.com":
                        default_cover = "file://%s/vqtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PornTube69.net":
+                       default_cover = "file://%s/porntube69.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "MegaTube.xxx":
+                       default_cover = "file://%s/megatube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "WatchMyGF.me":
+                       default_cover = "file://%s/watchmygf.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "WatchMyExGF.net":
+                       default_cover = "file://%s/watchmyexgf.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "TropicTube.com":
+                       default_cover = "file://%s/tropictube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PornFD.com":
+                       default_cover = "file://%s/pornfd.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PornBimbo.com":
+                       default_cover = "file://%s/pornbimbo.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "BoundHub.com":
+                       default_cover = "file://%s/boundhub.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "EroClips.org":
+                       default_cover = "file://%s/eroclips.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "PunishBang.com":
+                       default_cover = "file://%s/punishbang.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "CamVideos.tv":
+                       default_cover = "file://%s/camvideos.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Anon-V.com":
+                       default_cover = "file://%s/anonv.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "MrDeepFakes.com":
+                       default_cover = "file://%s/mrdeepfakes.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "Ebony8.com":
+                       default_cover = "file://%s/ebony8.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+               elif self.portal == "CamUploads.com":
+                       default_cover = "file://%s/camuploads.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
@@ -187,32 +321,141 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                self.onLayoutFinish.append(self.loadPage)
 
        def loadPage(self):
+               cookies.clear()
                self.keyLocked = True
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                if re.match(".*Search", self.Name):
-                       url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=%s&category_ids=&sort_by=&from_videos=%s&from_albums=%s" % (self.baseurl, self.Link, self.Link.replace('-','+'), str(self.page), str(self.page))
+                       if self.portal == "PunishBang.com":
+                               url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&category_ids=&sort_by=&from=%s" % (self.baseurl, self.Link, str(self.page))
+                       else:
+                               if self.portal == "PornFD.com":
+                                       stop = False
+                                       for x in self.blacklist:
+                                               if x.lower() in self.Link.lower():
+                                                       stop = True
+                                       if stop:
+                                               self.Link = ''
+                               url = "%s/search/%s/?mode=async&function=get_block&block_id=list_videos_videos_list_search_result&q=%s&category_ids=&sort_by=&from_videos=%s&from_albums=%s" % (self.baseurl, self.Link, self.Link.replace('-','+'), str(self.page), str(self.page))
                else:
                        if self.Link.startswith('http'):
                                if self.Link.split('/')[-1].isdigit():
                                        fix = '1'
                                else:
                                        fix = ''
-                               url = "%s/%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date" % (self.Link, fix)
+                               if self.portal in ["MegaTube.xxx", "WatchMyGF.me"] and not "/tag/" in self.Link:
+                                       delim = ''
+                               else:
+                                       delim = '/'
+                               url = "%s%s%s?mode=async&function=get_block&block_id=list_videos_common_videos_list&sort_by=post_date" % (self.Link, delim, fix)
                                if self.page > 1:
                                        url = url + "&from=%s" % str(self.page)
                        else:
-                               url = "%s/?mode=async&function=get_block&block_id=list_videos_most_recent_videos&sort_by=%s" % (self.baseurl, self.Link)
-                               if self.page > 1:
-                                       url = url + "&from=%s" % str(self.page)
-               twAgentGetPage(url, agent=agent).addCallback(self.genreData).addErrback(self.dataError)
+                               if self.portal == "WatchMyGF.me":
+                                       if self.Name in ["Newest"]:
+                                               blockid = "list_videos_common_videos_list"
+                                               url = "%s/%s/%s/?mode=async&function=get_block&block_id=%s&sort_by=%s&from=%s" % (self.baseurl, self.Link.split('#')[0], str(self.page), blockid, self.Link.split('#')[-1], str(self.page))
+                                       else:
+                                               blockid = "list_videos_common_videos_list"
+                                               url = "%s/%s/?mode=async&function=get_block&block_id=%s&sort_by=%s&from=%s" % (self.baseurl, self.Link.split('#')[0], blockid, self.Link.split('#')[-1], str(self.page))
+                               else:
+                                       if self.portal == "PunishBang.com":
+                                               blockid = "list_videos_popular_today_videos"
+                                       else:
+                                               blockid = "list_videos_most_recent_videos"
+                                       url = "%s/?mode=async&function=get_block&block_id=%s&sort_by=%s" % (self.baseurl, blockid, self.Link)
+                                       if self.page > 1:
+                                               url = url + "&from=%s" % str(self.page)
+               twAgentGetPage(url, agent=agent, cookieJar=cookies).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               self.getLastPage(data, 'class="pagination"(.*?)>Last<', '.*[from:|>](\d+)["|<]')
-               Movies = re.findall('class="item\s{0,3}".*?href="(.*?)" title="(.*?)".*?data-original="(.*?)".*?class="duration">(.*?)</div>.*?class="added"><em>(.*?)</em></div>.*?class="views">(.*?)</div>', data, re.S)
-               if Movies:
-                       for (Url, Title, Image, Runtime, Added, Views) in Movies:
-                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views.replace(' ',''), stripAllTags(Added)))
+               if self.portal in ["WatchMyGF.me", "TropicTube.com"]:
+                       self.getLastPage(data, 'class="pagination(.*?)(?:class="next"|</ul>)', '.*(?:from:|from_albums:|<span>)(\d{2,5})(?:</span>|\")')
+               elif self.portal == "PunishBang.com":
+                       self.getLastPage(data, 'class="pagination"(.*?)(?:item--next|</ul>)', '.*(?:from:|from_albums:|<span>)(\d{2,5})(?:</span>|\")')
+               elif self.portal == "WatchMyExGF.net":
+                       self.getLastPage(data, 'class="paginator(.*?)(?:class="next"|</ul>)', '.*(?:from:|from_albums:|<span>)(\d{2,5})(?:</span>|\")')
+               elif self.portal == "PornBimbo.com":
+                       if ">Load more...<" in data:
+                               self.lastpage = self.page + 1
+                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+               else:
+                       self.getLastPage(data, 'class="pagination"(.*?)>Last<', '.*[from:|>](\d+)["|<]')
+               data = data.replace('class="item private', 'class="item ')
+               if 'class="item   ' in data:
+                       data = data.split('class="item   "')
+               elif 'class="item  "' in data:
+                       data = data.split('class="item  "')
+               elif 'class="item "' in data:
+                       data = data.split('class="item "')
+               elif 'class="item"' in data:
+                       data = data.split('class="item"')
+               elif 'class="thumb item"' in data:
+                       data = data.split('class="thumb item"')
+               elif 'js-item">' in data:
+                       data = data.split('js-item">')
+               elif 'class="video-box-card item"' in data:
+                       data = data.split('class="video-box-card item"')
+               for item in data:
+                       if self.portal == "WatchMyGF.me":
+                               Movie = re.findall('href="(.*?)".*?class="time">(.*?)</div.*?alt="(.*?)".*?data-src="(.*?)".*?class="eye">(.*?)</span', item, re.S)
+                               if Movie:
+                                       for (Url, Runtime, Title, Image, Views) in Movie:
+                                               Runtime = Runtime.replace('h','').replace('m','').replace('s','')
+                                               Views = Views.replace(',','')
+                                               if Image.startswith('//'):
+                                                       Image = "http:" + Image
+                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, ''))
+                       elif self.portal == "WatchMyExGF.net":
+                               Movie = re.findall('href="(.*?)" title="(.*?)".*?data-original="(.*?)".*?class="far fa-clock">(.*?)</span.*?class="fas fa-eye">(.*?)</span', item, re.S)
+                               if Movie:
+                                       for (Url, Title, Image, Runtime, Views) in Movie:
+                                               Runtime = stripAllTags(Runtime.replace('h','').replace('m','').replace('s','')).strip()
+                                               Views = stripAllTags(Views.replace(' ','')).strip()
+                                               if Image.startswith('//'):
+                                                       Image = "http:" + Image
+                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, ''))
+                       elif self.portal == "TropicTube.com":
+                               Movie = re.findall('href="(.*?)" title="(.*?)".*?data-original="(.*?)".*?class="thumb_info">.*?<em>(.*?)</em>.*?<em>(.*?)</em>.*?<em>(.*?)</em>', item, re.S)
+                               if Movie:
+                                       for (Url, Title, Image, Runtime, Views, Added) in Movie:
+                                               Views = Views.replace(' ','').strip()
+                                               Runtime = Runtime.replace('h','').replace('m','').replace('s','').strip()
+                                               if Image.startswith('//'):
+                                                       Image = "http:" + Image
+                                               Added = Added.strip()
+                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, Added))
+                       elif self.portal == "PunishBang.com":
+                               Movie = re.findall('href="(.*?)".*?class="flag">(.*?)</span>.*?data-src="(.*?)".*?alt="(.*?)".*?icon--eye">.*?card__text">(.*?)</span>', item, re.S)
+                               if Movie:
+                                       for (Url, Runtime, Image, Title, Views) in Movie:
+                                               Views = Views.replace(' ','').strip()
+                                               Runtime = Runtime.replace('h','').replace('m','').replace('s','').strip()
+                                               if Image.startswith('//'):
+                                                       Image = "http:" + Image
+                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, ''))
+                       else:
+                               if not 'private' in item:
+                                       Movie = re.findall('href="(.*?)" title="(.*?)".*?(?:src|data-original)="(?!data:image/)(.*?)".*?(class="duration">(.*?)</div>.*?class="added">(?:<em>|)(.*?)(?:</em>|)</div>.*?$)', item, re.S)
+                                       if Movie:
+                                               for (Url, Title, Image, Meta, Runtime, Added) in Movie:
+                                                       if self.portal == "PornFD.com":
+                                                               stop = False
+                                                               for x in self.blacklist:
+                                                                       if x.lower() in Title.lower():
+                                                                               stop = True
+                                                               if stop:
+                                                                       continue
+                                                       Views = re.search('.*?class="views">(.*?)</div>', Meta)
+                                                       if Views:
+                                                               Views = stripAllTags(Views.group(1).replace(' ','').replace('views','')).strip()
+                                                       else:
+                                                               Views = ''
+                                                       Runtime = Runtime.replace('h','').replace('m','').replace('s','')
+                                                       if Image.startswith('//'):
+                                                               Image = "http:" + Image
+                                                       Added = stripAllTags(Added)
+                                                       self.filmliste.append((decodeHtml(Title), Url, Image, Runtime, Views, Added))
                if len(self.filmliste) == 0:
                        self.filmliste.append((_('No videos found!'), None, None, '', '', ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
@@ -229,7 +472,9 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                views = self['liste'].getCurrent()[0][4]
                added = self['liste'].getCurrent()[0][5]
                self['name'].setText(title)
-               self['handlung'].setText("Runtime: %s\nAdded: %s\nViews: %s" % (runtime, added, views))
+               if added:
+                       added = "\nAdded: %s" % added
+               self['handlung'].setText("Runtime: %s%s\nViews: %s" % (runtime, added, views))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keyOK(self):
@@ -238,7 +483,7 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                Link = self['liste'].getCurrent()[0][1]
                if Link:
                        self['name'].setText(_('Please wait...'))
-                       twAgentGetPage(Link, agent=agent).addCallback(self.parseVideo).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies).addCallback(self.parseVideo).addErrback(self.dataError)
 
        def parseVideo(self, data):
                Title = self['liste'].getCurrent()[0][0]
@@ -255,8 +500,28 @@ class slutloadFilmScreen(MPScreen, ThumbsHelper):
                                                max = int(vid[1])
                                                url = vid[0]
                        except:
-                               url = url[-1]
+                               if not "login" in url[-1]:
+                                       url = url[-1]
+                               else:
+                                       url = url[-2]
                        if 'function/0/' in url:
                                url = decrypturl(url, license[0])
-                       self['name'].setText('')
-                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='slutload')
\ No newline at end of file
+                       if url:
+                               tw_agent_hlp = TwAgentHelper(cookieJar=cookies)
+                               tw_agent_hlp.getRedirectedUrl(url).addCallback(self.getStream).addErrback(self.dataError)
+               else:
+                       message = self.session.open(MessageBoxExt, _("Stream not found"), MessageBoxExt.TYPE_INFO, timeout=5)
+
+       def getStream(self, url):
+               self['name'].setText('')
+               Title = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][1]
+               import requests
+               ck = requests.utils.dict_from_cookiejar(cookies)
+               headers = '&Cookie=%s' % ','.join(['%s=%s' % (key, urllib.quote_plus(ck[key])) for key in ck])
+               headers = headers + '&Referer=%s' % Link
+               if url.startswith('//'):
+                       url = 'https:' + url
+               url = url + '#User-Agent='+agent+headers
+               mp_globals.player_agent = agent
+               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='slutload')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/wicked.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/wicked.py
deleted file mode 100644 (file)
index 517012b..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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.choiceboxext import ChoiceBoxExt
-
-myagent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:40.0) Gecko/20100101 Firefox/40.0'
-BASE_NAME = "WickedPictures.com"
-default_cover = "file://%s/wickedpictures.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class wickedGenreScreen(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,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "cancel" : self.keyCancel
-               }, -1)
-
-               self['title'] = Label(BASE_NAME)
-               self['ContentTitle'] = Label("Genre:")
-
-               self.genreliste = []
-               self.suchString = ''
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.genreliste.insert(0, ("Exclusive Girls", 'http://www.wicked.com/tour/pornstars/exclusive/', None))
-               self.genreliste.insert(0, ("Most Active Girls", 'http://www.wicked.com/tour/pornstars/mostactive/', None))
-               self.genreliste.insert(0, ("Most Liked Girls", 'http://www.wicked.com/tour/pornstars/mostliked/', None))
-               self.genreliste.insert(0, ("Most Recent Girls", 'http://www.wicked.com/tour/pornstars/mostrecent/', None))
-               self.genreliste.insert(0, ("Most Viewed Movies", 'http://www.wicked.com/tour/movies/mostviewed/', None))
-               self.genreliste.insert(0, ("Top Rated Movies", 'http://www.wicked.com/tour/movies/toprated/', None))
-               self.genreliste.insert(0, ("Latest Movies", 'http://www.wicked.com/tour/movies/latest/', None))
-               self.genreliste.insert(0, ("Most Viewed Scenes", 'http://www.wicked.com/tour/videos/mostviewed/', None))
-               self.genreliste.insert(0, ("Top Rated Scenes", 'http://www.wicked.com/tour/videos/toprated/', None))
-               self.genreliste.insert(0, ("Latest Scenes", 'http://www.wicked.com/tour/videos/latest/', None))
-               self.genreliste.insert(0, ("--- Search ---", "callSuchen", None))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.showInfos()
-
-       def keyOK(self):
-               if not config_mp.mediaportal.premiumize_use.value:
-                       message = self.session.open(MessageBoxExt, _("%s only works with enabled MP premiumize.me option (MP Setup)!" % BASE_NAME), MessageBoxExt.TYPE_INFO, timeout=10)
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               Link = self['liste'].getCurrent()[0][1]
-               if Name == "--- Search ---":
-                       self.suchen()
-               elif re.match(".*?Girls", Name):
-                       self.session.open(wickedGirlsScreen, Link, Name)
-               else:
-                       self.session.open(wickedFilmScreen, Link, Name)
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       Name = "--- Search ---"
-                       Link = urllib.quote(self.suchString).replace(' ', '-')
-                       self.session.open(wickedFilmScreen, Link, Name)
-
-class wickedGirlsScreen(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(BASE_NAME)
-               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 = "%s%s/" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               self.getLastPage(data, 'class="paginationui-container(.*?)</ul>', '.*(?:\/|>)(\d+)')
-               parse = re.search('class="showcase-models(.*?)</section>', data, re.S)
-               Movies = re.findall('<a\shref="(.*?)"\sclass="showcase-models.*?img\ssrc="(.*?)"\stitle="(.*?)".*?scenes">(\d+)\sScenes', parse.group(1), re.S)
-               if Movies:
-                       for (Url, Image, Title, Scenes) in Movies:
-                               Url = "http://www.wicked.com" + Url
-                               Title = Title + " - %s Scenes" % Scenes
-                               self.filmliste.append((decodeHtml(Title), Url, Image))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No pornstars 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               if Link:
-                       rangelist = [['Scenes', 'videos/'], ['Movies', 'movies/']]
-                       self.session.openWithCallback(self.keyOK2, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
-
-       def keyOK2(self, result):
-               if result:
-                       Name = self['liste'].getCurrent()[0][0]
-                       Link = self['liste'].getCurrent()[0][1]
-                       Link = Link + result[1]
-                       self.session.open(wickedFilmScreen, Link, Name)
-
-class wickedFilmScreen(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(BASE_NAME)
-               self['ContentTitle'] = Label("Genre: %s" % self.Name)
-               self['F2'] = Label(_("Page"))
-
-               self['Page'] = Label(_("Page:"))
-               self.keyLocked = True
-               self.page = 1
-               self.lastpage = 9
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self['name'].setText(_('Please wait...'))
-               self.filmliste = []
-               if re.match(".*?Search", self.Name):
-                       url = "http://www.wicked.com/tour/search/videos/%s/%s/" % (self.Link, str(self.page))
-               else:
-                       url = "%s%s/" % (self.Link, str(self.page))
-               getPage(url, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
-
-       def loadData(self, data):
-               if re.match(".*?Search", self.Name):
-                       self.getLastPage(data, 'class="paginationui-container(.*?)</ul>', '.*(?:\/|>)(\d+)')
-               elif re.match(".*?/tour/pornstar", self.Link):
-                       self.getLastPage(data, 'class="paginationui-container(.*?)</ul>', '.*(?:\/|>)(\d+)')
-               else:
-                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
-               parse = re.search('lass="showcase-movies">(.*?)</section>', data, re.S)
-               if parse:
-                       Movies = re.findall('<a\shref="(.*?)"\sclass="showcase-movies.*?img\ssrc="(.*?)"\salt=".*?"\stitle="(.*?)"', parse.group(1), re.S)
-               else:
-                       parse = re.search('class="showcase-scenes">(.*?)</section>', data, re.S)
-                       if parse:
-                               Movies = re.findall('<a\shref="(.*?)"\sclass="showcase-scenes.*?img\ssrc="(.*?)"\stitle=".*?"\salt="(.*?)"', parse.group(1), re.S)
-               if Movies:
-                       for (Url, Image, Title) in Movies:
-                               Image = Image.replace('_2.jpg','_1.jpg')
-                               Url = "http://www.wicked.com" + Url
-                               self.filmliste.append((decodeHtml(Title), Url, Image))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), '', 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, int(self.lastpage), mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               title = self['liste'].getCurrent()[0][0]
-               pic = self['liste'].getCurrent()[0][2]
-               self['name'].setText(title)
-               CoverHelper(self['coverArt']).getCover(pic)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Link = self['liste'].getCurrent()[0][1]
-               get_stream_link(self.session).check_link(Link, self.play)
-
-       def play(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='wicked')
\ No newline at end of file
index fbb8625..bbca7d5 100644 (file)
@@ -485,7 +485,7 @@ class xnxxFilmScreen(MPScreen, ThumbsHelper):
                        f1 = open(playlist_path, 'w')
                        f1.write('#EXTM3U\n#EXT-X-STREAM-INF:PROGRAM-ID=1\n%s' % url)
                        f1.close()
-                       self.playVideo("file://%stmp.m3u8" % config_mp.mediaportal.storagepath.value)
+                       self.playVideo("file:///tmp/tmp.m3u8")
                else:
                        self.playVideo(url)
 
index 22df3ed..70b53f4 100644 (file)
@@ -773,7 +773,7 @@ class xvideosFilmScreen(MPScreen, ThumbsHelper):
                        f1 = open(playlist_path, 'w')
                        f1.write('#EXTM3U\n#EXT-X-STREAM-INF:PROGRAM-ID=1\n%s' % url)
                        f1.close()
-                       self.playVideo("file://%stmp.m3u8" % config_mp.mediaportal.storagepath.value)
+                       self.playVideo("file:///tmp/tmp.m3u8")
                else:
                        self.playVideo(url)
 
index 25c1059..9602843 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 df8aae9..d150f15 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: MediaPortal\n"
-"POT-Creation-Date: 2019-12-29 19:18+0100\n"
-"PO-Revision-Date: 2019-12-29 19:18+0100\n"
+"POT-Creation-Date: 2020-01-03 22:19+0100\n"
+"PO-Revision-Date: 2020-01-03 22:19+0100\n"
 "Last-Translator: dhwz <dhwz@gmx.net>\n"
 "Language-Team: MediaPortal Team\n"
 "Language: de_DE\n"
@@ -48,61 +48,56 @@ msgstr ""
 #: src/additions/fun/failto.py:65 src/additions/fun/retrotv.py:68
 #: 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/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/anyporn.py:286 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/camhub.py:127 src/additions/porn/chaturbate.py:181
+#: src/additions/porn/cliphunter.py:170 src/additions/porn/cliphunter.py:240
+#: src/additions/porn/crocotube.py:144 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/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/ddfnetwork.py:239 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/hdzog.py:167
+#: src/additions/porn/homemoviestube.py:166 src/additions/porn/hotmovs.py:166
+#: src/additions/porn/hotscope.py:148 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/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/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:488
-#: src/additions/porn/pornhub.py:649 src/additions/porn/pornhub.py:783
-#: src/additions/porn/pornhub.py:911 src/additions/porn/pornicom.py:194
-#: src/additions/porn/pornid.py:197 src/additions/porn/pornoxo.py:182
+#: src/additions/porn/pinflix.py:232 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:488 src/additions/porn/pornhub.py:649
+#: src/additions/porn/pornhub.py:783 src/additions/porn/pornhub.py:911
+#: src/additions/porn/pornicom.py:194 src/additions/porn/pornid.py:197
+#: src/additions/porn/pornoreino.py:128 src/additions/porn/pornoxo.py:182
 #: src/additions/porn/pornrabbit.py:176 src/additions/porn/porntv.py:292
-#: 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: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:2051 src/plugin.py:2301
-#: src/plugin.py:3073 src/plugin.py:3092 src/resources/showAsThumb.py:247
+#: src/additions/porn/pornxio.py:264 src/additions/porn/realgfporn.py:160
+#: src/additions/porn/redtube.py:181 src/additions/porn/sexu.py:131
+#: 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: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/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:2022 src/plugin.py:2272 src/plugin.py:3044 src/plugin.py:3063
+#: src/resources/showAsThumb.py:247
 msgid "Page"
 msgstr "Seite"
 
@@ -152,65 +147,59 @@ msgstr "Seite"
 #: src/additions/mediatheken/servustv.py:136
 #: src/additions/mediatheken/spiegeltv.py:154
 #: src/additions/mediatheken/srg.py:187
-#: src/additions/mediatheken/youtube.py:871
+#: src/additions/mediatheken/youtube.py:879
 #: src/additions/mediatheken/zdf.py:403 src/additions/music/radio.py:336
 #: src/additions/newsdoku/autobild.py:105 src/additions/newsdoku/bild.py:153
 #: src/additions/newsdoku/doku_to.py:94 src/additions/newsdoku/dokus4_me.py:129
 #: src/additions/newsdoku/wissen.py:64 src/additions/porn/ahme.py:188
-#: src/additions/porn/anyporn.py:288 src/additions/porn/badoinkvr.py:132
-#: src/additions/porn/badoinkvr.py:206 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/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/anyporn.py:288 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/camhub.py:129 src/additions/porn/chaturbate.py:183
+#: src/additions/porn/cliphunter.py:172 src/additions/porn/cliphunter.py:242
+#: src/additions/porn/crocotube.py:146 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/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/ddfnetwork.py:241 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/hdzog.py:169
+#: src/additions/porn/homemoviestube.py:170 src/additions/porn/hotmovs.py:168
+#: src/additions/porn/hotscope.py:150 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/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/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:491
-#: src/additions/porn/pornhub.py:652 src/additions/porn/pornhub.py:786
-#: src/additions/porn/pornhub.py:913 src/additions/porn/pornicom.py:196
-#: src/additions/porn/pornid.py:199 src/additions/porn/pornoxo.py:184
+#: src/additions/porn/pinflix.py:235 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:491 src/additions/porn/pornhub.py:652
+#: src/additions/porn/pornhub.py:786 src/additions/porn/pornhub.py:913
+#: src/additions/porn/pornicom.py:196 src/additions/porn/pornid.py:199
+#: src/additions/porn/pornoreino.py:130 src/additions/porn/pornoxo.py:184
 #: src/additions/porn/pornrabbit.py:178 src/additions/porn/porntv.py:294
-#: 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: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
+#: src/additions/porn/pornxio.py:266 src/additions/porn/realgfporn.py:162
+#: src/additions/porn/redtube.py:185 src/additions/porn/sexu.py:133
+#: 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: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/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:"
 
@@ -280,9 +269,9 @@ msgstr "Seite:"
 #: 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/youtube.py:923
-#: src/additions/mediatheken/youtube.py:974
+#: src/additions/mediatheken/tvnow.py:293
+#: src/additions/mediatheken/youtube.py:931
+#: src/additions/mediatheken/youtube.py:982
 #: src/additions/mediatheken/zdf.py:156 src/additions/mediatheken/zdf.py:284
 #: src/additions/mediatheken/zdf.py:293 src/additions/mediatheken/zdf.py:393
 #: src/additions/mediatheken/zdf.py:587 src/additions/music/mtvdecharts.py:195
@@ -292,8 +281,6 @@ msgstr "Seite:"
 #: src/additions/newsdoku/dokus4_me.py:164 src/additions/newsdoku/focus.py:119
 #: 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
 #: src/additions/porn/beeg.py:157 src/additions/porn/befuck.py:60
 #: src/additions/porn/befuck.py:139 src/additions/porn/bongacams.py:147
 #: src/additions/porn/bongacams.py:207 src/additions/porn/brazzers.py:72
@@ -302,13 +289,14 @@ msgstr "Seite:"
 #: 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:261
-#: src/additions/porn/cliphunter.py:255 src/additions/porn/cumlouder.py:73
+#: src/additions/porn/cliphunter.py:255 src/additions/porn/crocotube.py:75
+#: src/additions/porn/crocotube.py:143 src/additions/porn/crocotube.py:158
+#: src/additions/porn/crocotube.py:195 src/additions/porn/cumlouder.py:73
 #: src/additions/porn/cumlouder.py:162 src/additions/porn/cumlouder.py:229
 #: src/additions/porn/cumlouder.py:300 src/additions/porn/cumlouder.py:374
 #: src/additions/porn/cumlouder.py:460 src/additions/porn/dachix.py:71
 #: src/additions/porn/dachix.py:158 src/additions/porn/ddfnetwork.py:74
 #: src/additions/porn/ddfnetwork.py:178 src/additions/porn/ddfnetwork.py:254
-#: src/additions/porn/digitalplayground.py:169
 #: src/additions/porn/drtuber.py:206 src/additions/porn/elladies.py:150
 #: src/additions/porn/eporner.py:180 src/additions/porn/eroprofile.py:155
 #: src/additions/porn/extremetube.py:181 src/additions/porn/faapy.py:154
@@ -316,14 +304,11 @@ msgstr "Seite:"
 #: src/additions/porn/freeones.py:176 src/additions/porn/hclips.py:178
 #: 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
-#: src/additions/porn/mofos.py:227 src/additions/porn/moviefap.py:149
-#: src/additions/porn/naughtyamerica.py:167
-#: src/additions/porn/nubilefilms.py:71 src/additions/porn/nubilefilms.py:147
-#: src/additions/porn/nubilefilms.py:221 src/additions/porn/nudez.py:180
+#: src/additions/porn/hotscope.py:216 src/additions/porn/kink.py:162
+#: src/additions/porn/lovehomeporn.py:157 src/additions/porn/mofos.py:72
+#: src/additions/porn/mofos.py:151 src/additions/porn/mofos.py:227
+#: src/additions/porn/moviefap.py:149 src/additions/porn/nubilefilms.py:71
+#: src/additions/porn/nubilefilms.py:147 src/additions/porn/nubilefilms.py:221
 #: 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
@@ -333,13 +318,13 @@ msgstr "Seite:"
 #: src/additions/porn/pornhat.py:227 src/additions/porn/pornhub.py:948
 #: src/additions/porn/pornhub.py:1155 src/additions/porn/pornicom.py:209
 #: src/additions/porn/pornicom.py:270 src/additions/porn/pornid.py:212
-#: src/additions/porn/pornid.py:288 src/additions/porn/pornoxo.py:197
+#: src/additions/porn/pornid.py:288 src/additions/porn/pornoreino.py:143
+#: src/additions/porn/pornoreino.py:189 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/porntv.py:307 src/additions/porn/pornxio.py:279
+#: src/additions/porn/pornxio.py:340 src/additions/porn/realgfporn.py:175
+#: src/additions/porn/redtube.py:206 src/additions/porn/sexu.py:69
+#: src/additions/porn/sexu.py:146 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
@@ -354,7 +339,6 @@ msgstr "Seite:"
 #: 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
 #: src/additions/porn/xnxx.py:329 src/additions/porn/xpaja.py:164
@@ -364,7 +348,7 @@ msgstr "Seite:"
 #: 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/resources/menuhelper.py:62 src/resources/mpscreen.py:324
-#: src/resources/simplelist.py:363 src/resources/simplelist.py:541
+#: src/resources/simplelist.py:356 src/resources/simplelist.py:528
 msgid "Please wait..."
 msgstr "Bitte warten..."
 
@@ -386,26 +370,23 @@ msgstr "Bitte warten..."
 #: src/additions/mediatheken/dreisat.py:382
 #: src/additions/mediatheken/netzkino.py:179
 #: src/additions/mediatheken/spiegeltv.py:194
-#: src/additions/mediatheken/youtube.py:1614 src/additions/newsdoku/bild.py:162
+#: src/additions/mediatheken/youtube.py:1622 src/additions/newsdoku/bild.py:162
 #: 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/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/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/crocotube.py:175 src/additions/porn/cumlouder.py:494
+#: src/additions/porn/ddfnetwork.py:275 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/hdzog.py:203 src/additions/porn/homemoviestube.py:211
+#: src/additions/porn/hotmovs.py:209 src/additions/porn/hotscope.py:182
+#: src/additions/porn/kink.py:180 src/additions/porn/lovehomeporn.py:176
 #: 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/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:244
-#: 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/pornid.py:260 src/additions/porn/pornoreino.py:167
+#: src/additions/porn/pornxio.py:313 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
@@ -413,9 +394,8 @@ msgstr "Bitte warten..."
 #: 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: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
+#: src/additions/porn/x4tube.py:433 src/additions/porn/xhamster.py:576
+#: src/additions/porn/xxxdan.py:213 src/additions/porn/youporn.py:416
 msgid "No videos found!"
 msgstr "Keine Videos gefunden!"
 
@@ -453,14 +433,14 @@ msgstr ""
 #: 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:1034
-#: src/additions/porn/pornhub.py:1059 src/additions/porn/pornoxo.py:230
-#: src/additions/porn/pornrabbit.py:208 src/additions/porn/porntv.py:349
-#: src/additions/porn/sexu.py:165 src/additions/porn/shesfreaky.py:175
-#: src/additions/porn/spankbang.py:229 src/additions/porn/tube8.py:291
-#: src/additions/porn/xnxx.py:384 src/additions/porn/xpaja.py:182
-#: src/additions/porn/xvideos.py:637 src/additions/porn/youjizz.py:208
+#: src/additions/porn/freeones.py:192 src/additions/porn/porncom.py:699
+#: src/additions/porn/pornhub.py:1034 src/additions/porn/pornhub.py:1059
+#: src/additions/porn/pornoxo.py:230 src/additions/porn/pornrabbit.py:208
+#: src/additions/porn/porntv.py:349 src/additions/porn/sexu.py:166
+#: src/additions/porn/shesfreaky.py:175 src/additions/porn/spankbang.py:229
+#: src/additions/porn/tube8.py:291 src/additions/porn/xnxx.py:384
+#: src/additions/porn/xpaja.py:182 src/additions/porn/xvideos.py:637
+#: src/additions/porn/youjizz.py:208
 msgid "No movies found!"
 msgstr "Keine Filme gefunden!"
 
@@ -499,12 +479,10 @@ msgstr "Ähnliche anzeigen"
 #: mpgz/src/additions/porn/amateuremdh.py:126
 #: mpgz/src/additions/porn/dirtymoviez.py:127
 #: mpgz/src/additions/porn/mydirtyhobby.py:125
-#: src/additions/porn/badoinkvr.py:159 src/additions/porn/ddfnetwork.py:195
-#: src/additions/porn/julesjordan.py:172 src/additions/porn/mofos.py:168
+#: src/additions/porn/ddfnetwork.py:195 src/additions/porn/mofos.py:168
 #: src/additions/porn/nubilefilms.py:162 src/additions/porn/porncom.py:243
-#: src/additions/porn/pornhub.py:681 src/additions/porn/wicked.py:159
-#: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:391
-#: src/additions/porn/xvideos.py:356
+#: src/additions/porn/pornhub.py:681 src/additions/porn/x4tube.py:295
+#: src/additions/porn/xhamster.py:391 src/additions/porn/xvideos.py:356
 msgid "No pornstars found!"
 msgstr "Keine Pornstars gefunden!"
 
@@ -545,7 +523,7 @@ msgstr "Fehler beim Ausführen von Javascript, bitte an die Entwickler melden."
 #: src/additions/porn/redtube.py:183 src/additions/porn/spankbang.py:169
 #: 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:1758 src/plugin.py:2699
+#: src/additions/porn/xvideos.py:489 src/plugin.py:1729 src/plugin.py:2670
 msgid "Sort"
 msgstr "Sortieren"
 
@@ -572,18 +550,17 @@ msgstr "Filter"
 #: mpgz/src/additions/porn/paradisehill.py:183
 #: src/additions/mediatheken/ard.py:631 src/additions/music/shoutcast.py:269
 #: src/additions/porn/cumlouder.py:531 src/additions/porn/homemoviestube.py:243
-#: src/additions/porn/naughtyamerica.py:121 src/additions/porn/pinflix.py:306
-#: src/additions/porn/pinflix.py:476 src/additions/porn/porncom.py:256
-#: src/additions/porn/porncom.py:276 src/additions/porn/porncom.py:394
-#: src/additions/porn/porncom.py:414 src/additions/porn/porncom.py:532
-#: src/additions/porn/porncom.py:552 src/additions/porn/porncom.py:714
-#: src/additions/porn/porncom.py:739 src/additions/porn/porndoe.py:215
-#: src/additions/porn/pornhub.py:421 src/additions/porn/pornhub.py:592
-#: src/additions/porn/pornhub.py:719 src/additions/porn/pornhub.py:850
-#: src/additions/porn/redtube.py:277 src/additions/porn/spankbang.py:241
-#: src/additions/porn/spankbang.py:244 src/additions/porn/spankbang.py:258
-#: src/additions/porn/tube8.py:304 src/additions/porn/tube8.py:317
-#: src/additions/porn/vporn.py:293 src/additions/porn/wicked.py:178
+#: src/additions/porn/pinflix.py:306 src/additions/porn/pinflix.py:476
+#: src/additions/porn/porncom.py:256 src/additions/porn/porncom.py:276
+#: src/additions/porn/porncom.py:394 src/additions/porn/porncom.py:414
+#: src/additions/porn/porncom.py:532 src/additions/porn/porncom.py:552
+#: src/additions/porn/porncom.py:714 src/additions/porn/porncom.py:739
+#: src/additions/porn/porndoe.py:215 src/additions/porn/pornhub.py:421
+#: src/additions/porn/pornhub.py:592 src/additions/porn/pornhub.py:719
+#: src/additions/porn/pornhub.py:850 src/additions/porn/redtube.py:277
+#: src/additions/porn/spankbang.py:241 src/additions/porn/spankbang.py:244
+#: src/additions/porn/spankbang.py:258 src/additions/porn/tube8.py:304
+#: src/additions/porn/tube8.py:317 src/additions/porn/vporn.py:293
 #: 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
@@ -612,7 +589,7 @@ msgstr "Defektes URL Parsing, bitte an die Entwickler melden."
 #: src/additions/porn/pornhub.py:138 src/additions/porn/pornhub.py:280
 #: 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:520 src/resources/simpleplayer.py:2351
+#: src/plugin.py:500 src/resources/simpleplayer.py:2271
 msgid "Setup"
 msgstr "Einstellungen"
 
@@ -651,7 +628,7 @@ msgstr "Nichts gefunden!"
 #: mpgz/src/additions/useradditions/ddl_me.py:112
 #: 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/ard.py:90 src/additions/mediatheken/youtube.py:533
 #: src/additions/mediatheken/zdf.py:103 src/additions/newsdoku/dokus4_me.py:74
 #: src/resources/mpscreen.py:399
 msgid "Enter search criteria"
@@ -718,19 +695,19 @@ msgstr "Auswahl wurde zur Watchlist hinzugefügt."
 #: 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
-#: src/additions/mediatheken/tvnow.py:122
-#: src/additions/mediatheken/tvnow.py:123
-#: src/additions/mediatheken/tvnow.py:163
-#: src/additions/mediatheken/tvnow.py:194
-#: src/additions/mediatheken/tvnow.py:244
-#: src/additions/mediatheken/tvnow.py:277
-#: src/additions/mediatheken/tvnow.py:421
+#: src/additions/mediatheken/tvnow.py:66 src/additions/mediatheken/tvnow.py:93
+#: src/additions/mediatheken/tvnow.py:125
+#: src/additions/mediatheken/tvnow.py:126
+#: src/additions/mediatheken/tvnow.py:166
+#: src/additions/mediatheken/tvnow.py:198
+#: src/additions/mediatheken/tvnow.py:248
+#: src/additions/mediatheken/tvnow.py:282
+#: src/additions/mediatheken/tvnow.py:426
 #: src/additions/mediatheken/youtube_user.py:24
 #: src/additions/mediatheken/zdf.py:61 src/additions/mediatheken/zdf.py:146
 #: src/additions/mediatheken/zdf.py:283 src/additions/mediatheken/zdf.py:378
 #: src/additions/porn/x2search4porn.py:196 src/resources/menuhelper.py:35
-#: src/resources/menuhelper.py:355 src/resources/simplelist.py:75
+#: src/resources/menuhelper.py:355 src/resources/simplelist.py:71
 msgid "Selection:"
 msgstr "Auswahl:"
 
@@ -744,9 +721,9 @@ msgstr "Keine Episoden gefunden!"
 
 #: 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/fun/twitch.py:134 src/additions/mediatheken/youtube.py:871
 #: src/additions/music/radio.py:430 src/additions/music/shoutcast.py:327
-#: src/additions/porn/x2search4porn.py:80 src/resources/simpleplayer.py:710
+#: src/additions/porn/x2search4porn.py:80 src/resources/simpleplayer.py:634
 msgid "Delete"
 msgstr "Löschen"
 
@@ -760,9 +737,9 @@ msgstr "Watchlist ist derzeit leer"
 msgid "Parts Selection"
 msgstr "Part Auswahl"
 
-#: mpgz/src/additions/useradditions/movie4k.py:125 src/plugin.py:1184
-#: src/plugin.py:1198 src/plugin.py:1328 src/plugin.py:2162 src/plugin.py:2338
-#: src/plugin.py:2406 src/plugin.py:3026 src/plugin.py:3172 src/plugin.py:3240
+#: mpgz/src/additions/useradditions/movie4k.py:125 src/plugin.py:1155
+#: src/plugin.py:1169 src/plugin.py:1299 src/plugin.py:2133 src/plugin.py:2309
+#: src/plugin.py:2377 src/plugin.py:2997 src/plugin.py:3143 src/plugin.py:3211
 msgid "Please enter the correct PIN"
 msgstr "Bitte die korrekte PIN eingeben"
 
@@ -814,7 +791,7 @@ msgstr ""
 "Dieses Video ist aktuell durch ein Captcha geschützt, bitte später nochmal "
 "versuchen."
 
-#: mpgz/src/additions/useradditions/tvnowgz.py:185
+#: mpgz/src/additions/useradditions/tvnowpremium.py:186
 msgid "Currently no playable episodes available!"
 msgstr "Momentan sind keine abspielbaren Folgen verfügbar!"
 
@@ -877,23 +854,23 @@ msgstr "alle"
 msgid "Add to Favorites"
 msgstr "Zu Favoriten hinzufügen"
 
-#: 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
-#: src/additions/mediatheken/youtube.py:171
+#: src/additions/fun/twitch.py:137 src/additions/mediatheken/youtube.py:146
+#: src/additions/mediatheken/youtube.py:152
+#: src/additions/mediatheken/youtube.py:156
+#: src/additions/mediatheken/youtube.py:166
+#: src/additions/mediatheken/youtube.py:172
 msgid "Videos"
 msgstr "Videos"
 
 #: 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
+#: src/additions/mediatheken/youtube.py:135
+#: src/additions/mediatheken/youtube.py:437 src/additions/music/radio.py:207
 msgid "Language"
 msgstr "Sprache"
 
 #: src/additions/fun/twitch.py:236 src/additions/music/radio.py:456
-#: src/additions/music/shoutcast.py:353 src/resources/simplelist.py:184
-#: src/resources/simplelist.py:340 src/resources/simplelist.py:612
+#: src/additions/music/shoutcast.py:353 src/resources/simplelist.py:180
+#: src/resources/simplelist.py:333 src/resources/simplelist.py:599
 msgid "No entries found!"
 msgstr "Keine Einträge gefunden!"
 
@@ -905,9 +882,9 @@ msgstr "Keine Spiele gefunden!"
 msgid "No streams found!"
 msgstr "Keine Streams gefunden!"
 
-#: 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/fun/twitch.py:342 src/additions/mediatheken/youtube.py:397
+#: src/additions/mediatheken/youtube.py:413
+#: src/additions/mediatheken/youtube.py:978
 #: src/additions/mediatheken/youtube_user.py:76
 #: src/additions/porn/cumlouder.py:315 src/additions/porn/porncom.py:381
 #: src/additions/porn/pornhub.py:817 src/additions/porn/xvideos.py:353
@@ -941,8 +918,8 @@ msgstr "Genre:"
 #: src/additions/mediatheken/arte.py:311 src/additions/mediatheken/arte.py:313
 #: src/additions/mediatheken/arte.py:360
 #: src/additions/mediatheken/spiegeltv.py:191
-#: src/additions/mediatheken/youtube.py:1257
-#: src/additions/mediatheken/youtube.py:1287 src/additions/newsdoku/bild.py:180
+#: src/additions/mediatheken/youtube.py:1265
+#: src/additions/mediatheken/youtube.py:1295 src/additions/newsdoku/bild.py:180
 #: src/resources/tmdb.py:148
 msgid "Runtime:"
 msgstr "Laufzeit:"
@@ -956,8 +933,8 @@ msgid "This video is not available."
 msgstr "Dieses Video ist nicht verfügbar."
 
 #: src/additions/mediatheken/dreisat.py:272
-#: src/additions/mediatheken/youtube.py:1474
-#: src/additions/mediatheken/youtube.py:1492
+#: src/additions/mediatheken/youtube.py:1482
+#: src/additions/mediatheken/youtube.py:1500
 msgid "No contents / results found!"
 msgstr "Keine Inhalte / Ergebnisse gefunden!"
 
@@ -1009,510 +986,518 @@ 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/mediatheken/tvnow.py:65 src/additions/music/radio.py:296
 #: src/additions/music/shoutcast.py:201
 msgid "Stations:"
 msgstr "Sender:"
 
-#: src/additions/mediatheken/tvnow.py:193
+#: src/additions/mediatheken/tvnow.py:197
 msgid "Seasons:"
 msgstr "Staffeln:"
 
-#: src/additions/mediatheken/tvnow.py:234
+#: src/additions/mediatheken/tvnow.py:238
 msgid "Currently no seasons available!"
 msgstr "Momentan sind keine Staffeln verfügbar!"
 
-#: src/additions/mediatheken/tvnow.py:276
+#: src/additions/mediatheken/tvnow.py:281
 msgid "Episodes:"
 msgstr "Episoden:"
 
-#: src/additions/mediatheken/tvnow.py:408
+#: src/additions/mediatheken/tvnow.py:413
 msgid "Currently no playable/free episodes available!"
 msgstr "Momentan sind keine abspielbaren/kostenlosen Folgen verfügbar!"
 
-#: src/additions/mediatheken/youtube.py:58
-#: src/additions/mediatheken/youtube.py:1634
+#: src/additions/mediatheken/youtube.py:59
+#: src/additions/mediatheken/youtube.py:1642
 msgid "Date"
 msgstr "Datum"
 
-#: src/additions/mediatheken/youtube.py:59
-#: src/additions/mediatheken/youtube.py:1635
+#: src/additions/mediatheken/youtube.py:60
+#: src/additions/mediatheken/youtube.py:1643
 msgid "Rating"
 msgstr "Bewertung"
 
-#: src/additions/mediatheken/youtube.py:60
-#: src/additions/mediatheken/youtube.py:1636
+#: src/additions/mediatheken/youtube.py:61
+#: src/additions/mediatheken/youtube.py:1644
 msgid "Relevance"
 msgstr "Relevanz"
 
-#: src/additions/mediatheken/youtube.py:61
-#: src/additions/mediatheken/youtube.py:1637
+#: src/additions/mediatheken/youtube.py:62
+#: src/additions/mediatheken/youtube.py:1645
 msgid "Title"
 msgstr "Titel"
 
-#: src/additions/mediatheken/youtube.py:62
-#: src/additions/mediatheken/youtube.py:1638
+#: src/additions/mediatheken/youtube.py:63
+#: src/additions/mediatheken/youtube.py:1646
 msgid "Video count"
 msgstr "Anzahl der Videos"
 
-#: src/additions/mediatheken/youtube.py:63
-#: src/additions/mediatheken/youtube.py:1639
+#: src/additions/mediatheken/youtube.py:64
+#: src/additions/mediatheken/youtube.py:1647
 msgid "View count"
 msgstr "Anzahl der Aufrufe"
 
-#: src/additions/mediatheken/youtube.py:67
+#: src/additions/mediatheken/youtube.py:68
 msgid "English"
 msgstr "Englisch"
 
-#: src/additions/mediatheken/youtube.py:68
+#: src/additions/mediatheken/youtube.py:69
 msgid "German"
 msgstr "Deutsch"
 
-#: src/additions/mediatheken/youtube.py:69
+#: src/additions/mediatheken/youtube.py:70
 msgid "French"
 msgstr "Französisch"
 
-#: src/additions/mediatheken/youtube.py:70
+#: src/additions/mediatheken/youtube.py:71
 msgid "Italian"
 msgstr "Italienisch"
 
-#: src/additions/mediatheken/youtube.py:71
+#: src/additions/mediatheken/youtube.py:72
 msgid "Spanish"
 msgstr "Spanisch"
 
-#: src/additions/mediatheken/youtube.py:72
+#: src/additions/mediatheken/youtube.py:73
 msgid "Portuguese"
 msgstr "Portugiesisch"
 
-#: src/additions/mediatheken/youtube.py:73
+#: src/additions/mediatheken/youtube.py:74
 msgid "Polish"
 msgstr "Polnisch"
 
-#: src/additions/mediatheken/youtube.py:74
+#: src/additions/mediatheken/youtube.py:75
 msgid "Danish"
 msgstr "Dänisch"
 
-#: src/additions/mediatheken/youtube.py:75
+#: src/additions/mediatheken/youtube.py:76
 msgid "Norwegian"
 msgstr "Norwegisch"
 
-#: src/additions/mediatheken/youtube.py:76
+#: src/additions/mediatheken/youtube.py:77
 msgid "Swedish"
 msgstr "Schwedisch"
 
-#: src/additions/mediatheken/youtube.py:77
+#: src/additions/mediatheken/youtube.py:78
 msgid "Finnish"
 msgstr "Finnisch"
 
-#: src/additions/mediatheken/youtube.py:78
-#: src/additions/mediatheken/youtube.py:99
-#: src/additions/mediatheken/youtube.py:106
-#: src/additions/mediatheken/youtube.py:112
-#: src/additions/mediatheken/youtube.py:125
+#: src/additions/mediatheken/youtube.py:79
+#: src/additions/mediatheken/youtube.py:100
+#: src/additions/mediatheken/youtube.py:107
+#: src/additions/mediatheken/youtube.py:113
+#: src/additions/mediatheken/youtube.py:126
 msgid "Any"
 msgstr "Beliebig"
 
-#: src/additions/mediatheken/youtube.py:82
+#: src/additions/mediatheken/youtube.py:83
 msgid "Whole world"
 msgstr "Weltweit"
 
-#: src/additions/mediatheken/youtube.py:83
+#: src/additions/mediatheken/youtube.py:84
 msgid "Great Britain"
 msgstr "Großbritannien"
 
-#: src/additions/mediatheken/youtube.py:84
+#: src/additions/mediatheken/youtube.py:85
 msgid "Germany"
 msgstr "Deutschland"
 
-#: src/additions/mediatheken/youtube.py:85
+#: src/additions/mediatheken/youtube.py:86
 msgid "Austria"
 msgstr "Österreich"
 
-#: src/additions/mediatheken/youtube.py:86
+#: src/additions/mediatheken/youtube.py:87
 msgid "Switzerland"
 msgstr "Schweiz"
 
-#: src/additions/mediatheken/youtube.py:87
+#: src/additions/mediatheken/youtube.py:88
 msgid "France"
 msgstr "Frankreich"
 
-#: src/additions/mediatheken/youtube.py:88
+#: src/additions/mediatheken/youtube.py:89
 msgid "Italy"
 msgstr "Italien"
 
-#: src/additions/mediatheken/youtube.py:89
+#: src/additions/mediatheken/youtube.py:90
 msgid "Spain"
 msgstr "Spanien"
 
-#: src/additions/mediatheken/youtube.py:90
+#: src/additions/mediatheken/youtube.py:91
 msgid "Portugal"
 msgstr "Portugal"
 
-#: src/additions/mediatheken/youtube.py:91
+#: src/additions/mediatheken/youtube.py:92
 msgid "Poland"
 msgstr "Polen"
 
-#: src/additions/mediatheken/youtube.py:92
+#: src/additions/mediatheken/youtube.py:93
 msgid "Denmark"
 msgstr "Dänemark"
 
-#: src/additions/mediatheken/youtube.py:93
+#: src/additions/mediatheken/youtube.py:94
 msgid "Norway"
 msgstr "Norwegen"
 
-#: src/additions/mediatheken/youtube.py:94
+#: src/additions/mediatheken/youtube.py:95
 msgid "Sweden"
 msgstr "Schweden"
 
-#: src/additions/mediatheken/youtube.py:95
+#: src/additions/mediatheken/youtube.py:96
 msgid "Finland"
 msgstr "Finnland"
 
-#: src/additions/mediatheken/youtube.py:107
+#: src/additions/mediatheken/youtube.py:108
 msgid "2D"
 msgstr "2D"
 
-#: src/additions/mediatheken/youtube.py:108
+#: src/additions/mediatheken/youtube.py:109
 msgid "3D"
 msgstr "3D"
 
-#: src/additions/mediatheken/youtube.py:113 src/plugin.py:234
+#: src/additions/mediatheken/youtube.py:114 src/plugin.py:225
 msgid "High"
 msgstr "Hoch"
 
-#: src/additions/mediatheken/youtube.py:114 src/plugin.py:234
+#: src/additions/mediatheken/youtube.py:115 src/plugin.py:225
 msgid "Low"
 msgstr "Niedrig"
 
-#: src/additions/mediatheken/youtube.py:118
+#: src/additions/mediatheken/youtube.py:119
 msgid "None"
 msgstr "Keine"
 
-#: src/additions/mediatheken/youtube.py:119
+#: src/additions/mediatheken/youtube.py:120
 msgid "Completed"
 msgstr "Abgeschlossene"
 
-#: src/additions/mediatheken/youtube.py:120
-#: src/additions/mediatheken/youtube.py:209
+#: src/additions/mediatheken/youtube.py:121
+#: src/additions/mediatheken/youtube.py:210
 msgid "Live"
 msgstr "Live"
 
-#: src/additions/mediatheken/youtube.py:121
+#: src/additions/mediatheken/youtube.py:122
 msgid "Upcoming"
 msgstr "Bevorstehende"
 
-#: src/additions/mediatheken/youtube.py:126
+#: src/additions/mediatheken/youtube.py:127
 msgid "Episode"
 msgstr "Episode"
 
-#: src/additions/mediatheken/youtube.py:127 src/resources/tmdb.py:54
+#: src/additions/mediatheken/youtube.py:128 src/resources/tmdb.py:54
 msgid "Movie"
 msgstr "Film"
 
-#: src/additions/mediatheken/youtube.py:131
-#: src/additions/mediatheken/youtube.py:425
+#: src/additions/mediatheken/youtube.py:132
+#: src/additions/mediatheken/youtube.py:433
 msgid "Search request"
 msgstr "Suchanfrage"
 
-#: src/additions/mediatheken/youtube.py:132
-#: src/additions/mediatheken/youtube.py:435
+#: src/additions/mediatheken/youtube.py:133
+#: src/additions/mediatheken/youtube.py:443
 msgid "Event type"
 msgstr "Event Typ"
 
-#: src/additions/mediatheken/youtube.py:133
-#: src/additions/mediatheken/youtube.py:427
-#: src/additions/mediatheken/youtube.py:866
-#: src/additions/mediatheken/youtube.py:1641
+#: src/additions/mediatheken/youtube.py:134
+#: src/additions/mediatheken/youtube.py:435
+#: src/additions/mediatheken/youtube.py:874
+#: src/additions/mediatheken/youtube.py:1649
 msgid "Sort by"
 msgstr "Sortieren nach"
 
-#: src/additions/mediatheken/youtube.py:135
-#: src/additions/mediatheken/youtube.py:431
+#: src/additions/mediatheken/youtube.py:136
+#: src/additions/mediatheken/youtube.py:439
 msgid "Search region"
 msgstr "Suchregion"
 
-#: src/additions/mediatheken/youtube.py:136
-#: src/additions/mediatheken/youtube.py:433
+#: src/additions/mediatheken/youtube.py:137
+#: src/additions/mediatheken/youtube.py:441
 msgid "User name"
 msgstr "Username"
 
-#: src/additions/mediatheken/youtube.py:137
-#: src/additions/mediatheken/youtube.py:437
+#: src/additions/mediatheken/youtube.py:138
+#: src/additions/mediatheken/youtube.py:445
 msgid "3D Search"
 msgstr "3D Suche"
 
-#: src/additions/mediatheken/youtube.py:138
-#: src/additions/mediatheken/youtube.py:439
+#: src/additions/mediatheken/youtube.py:139
+#: src/additions/mediatheken/youtube.py:447
 msgid "Runtime"
 msgstr "Laufzeit"
 
-#: src/additions/mediatheken/youtube.py:139
-#: src/additions/mediatheken/youtube.py:441
+#: src/additions/mediatheken/youtube.py:140
+#: src/additions/mediatheken/youtube.py:449
 msgid "Video definition"
 msgstr "Videoauflösung"
 
-#: src/additions/mediatheken/youtube.py:140
-#: src/additions/mediatheken/youtube.py:443
+#: src/additions/mediatheken/youtube.py:141
+#: src/additions/mediatheken/youtube.py:451
 msgid "Video type"
 msgstr "Videotyp"
 
-#: src/additions/mediatheken/youtube.py:144
-#: src/additions/mediatheken/youtube.py:160
-#: src/additions/mediatheken/youtube.py:164
-#: src/additions/mediatheken/youtube.py:170
+#: src/additions/mediatheken/youtube.py:145
+#: src/additions/mediatheken/youtube.py:161
+#: src/additions/mediatheken/youtube.py:165
+#: src/additions/mediatheken/youtube.py:171
 msgid "Featured"
 msgstr "Empfohlen"
 
-#: src/additions/mediatheken/youtube.py:146
-#: src/additions/mediatheken/youtube.py:166
-#: src/additions/mediatheken/youtube.py:175
-#: src/additions/mediatheken/youtube.py:179
+#: src/additions/mediatheken/youtube.py:147
+#: src/additions/mediatheken/youtube.py:167
+#: src/additions/mediatheken/youtube.py:176
+#: src/additions/mediatheken/youtube.py:180
 msgid "Playlists"
 msgstr "Playlisten"
 
-#: src/additions/mediatheken/youtube.py:147
-#: src/additions/mediatheken/youtube.py:1352
+#: src/additions/mediatheken/youtube.py:148
+#: src/additions/mediatheken/youtube.py:1360
 msgid "Channels"
 msgstr "Kanäle"
 
-#: src/additions/mediatheken/youtube.py:156
+#: src/additions/mediatheken/youtube.py:157
 msgid "Full Playlist"
 msgstr "Vollständige Playlist"
 
-#: src/additions/mediatheken/youtube.py:180
+#: src/additions/mediatheken/youtube.py:181
 msgid "Uploads"
 msgstr "Uploads"
 
-#: src/additions/mediatheken/youtube.py:181
+#: src/additions/mediatheken/youtube.py:182
 msgid "Likes"
 msgstr "Likes"
 
-#: src/additions/mediatheken/youtube.py:182
+#: src/additions/mediatheken/youtube.py:183
 msgid "Subscriptions"
 msgstr "Abonnements"
 
-#: src/additions/mediatheken/youtube.py:186
+#: src/additions/mediatheken/youtube.py:187
 msgid "Video search"
 msgstr "Video Suche"
 
-#: src/additions/mediatheken/youtube.py:187
+#: src/additions/mediatheken/youtube.py:188
 msgid "Playlist search"
 msgstr "Playlisten Suche"
 
-#: src/additions/mediatheken/youtube.py:188
+#: src/additions/mediatheken/youtube.py:189
 msgid "Channel search"
 msgstr "Kanal Suche"
 
-#: src/additions/mediatheken/youtube.py:189
+#: src/additions/mediatheken/youtube.py:190
 msgid "Trends"
 msgstr "Trends"
 
-#: src/additions/mediatheken/youtube.py:191
-#: src/additions/mediatheken/youtube.py:749
+#: src/additions/mediatheken/youtube.py:192
+#: src/additions/mediatheken/youtube.py:757
 msgid "My channel"
 msgstr "Mein Kanal"
 
-#: src/additions/mediatheken/youtube.py:192
-#: src/additions/mediatheken/youtube.py:738
-#: src/additions/mediatheken/youtube.py:821 src/additions/music/radio.py:103
+#: src/additions/mediatheken/youtube.py:193
+#: src/additions/mediatheken/youtube.py:746
+#: src/additions/mediatheken/youtube.py:829 src/additions/music/radio.py:103
 #: src/additions/music/radio.py:124 src/additions/music/shoutcast.py:105
 msgid "Favorites"
 msgstr "Favoriten"
 
-#: src/additions/mediatheken/youtube.py:193
+#: src/additions/mediatheken/youtube.py:194
 #: src/additions/mediatheken/youtube_user.py:23
 msgid "User Channels"
 msgstr "Benutzer-Kanäle"
 
-#: src/additions/mediatheken/youtube.py:195
+#: src/additions/mediatheken/youtube.py:196
 msgid "YouTube Channels"
 msgstr "YouTube-Kanäle"
 
-#: src/additions/mediatheken/youtube.py:196
+#: src/additions/mediatheken/youtube.py:197
 msgid "Selected Channels"
 msgstr "Ausgewählte Kanäle"
 
-#: src/additions/mediatheken/youtube.py:197
+#: src/additions/mediatheken/youtube.py:198
 msgid "Music Channels"
 msgstr "Musik-Kanäle"
 
-#: src/additions/mediatheken/youtube.py:198
+#: src/additions/mediatheken/youtube.py:199
 msgid "Music Playlists"
 msgstr "Musik-Playlisten"
 
-#: src/additions/mediatheken/youtube.py:199
+#: src/additions/mediatheken/youtube.py:200
 msgid "Gaming Channels"
 msgstr "Gaming-Kanäle"
 
-#: src/additions/mediatheken/youtube.py:200
+#: src/additions/mediatheken/youtube.py:201
 msgid "Car & Vehicle Channels"
 msgstr "Auto- & Fahrzeug-Kanäle"
 
-#: src/additions/mediatheken/youtube.py:204
+#: src/additions/mediatheken/youtube.py:205
 msgid "Popular on YouTube"
 msgstr "Beliebt auf YouTube"
 
-#: src/additions/mediatheken/youtube.py:205
+#: src/additions/mediatheken/youtube.py:206
 msgid "News"
 msgstr "Nachrichten"
 
-#: src/additions/mediatheken/youtube.py:206
-#: src/additions/mediatheken/youtube.py:476 src/plugin.py:842
-#: src/plugin.py:1037 src/plugin.py:1375 src/plugin.py:1736 src/plugin.py:1862
-#: src/plugin.py:1893 src/plugin.py:2440 src/plugin.py:2677 src/plugin.py:2792
-#: src/plugin.py:2823 src/plugin.py:3274
+#: src/additions/mediatheken/youtube.py:207
+#: src/additions/mediatheken/youtube.py:484 src/plugin.py:813
+#: src/plugin.py:1008 src/plugin.py:1346 src/plugin.py:1707 src/plugin.py:1833
+#: src/plugin.py:1864 src/plugin.py:2411 src/plugin.py:2648 src/plugin.py:2763
+#: src/plugin.py:2794 src/plugin.py:3245
 msgid "Music"
 msgstr "Musik"
 
-#: src/additions/mediatheken/youtube.py:207
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:208
+#: src/additions/mediatheken/youtube.py:484
 msgid "Gaming"
 msgstr "Gaming"
 
-#: src/additions/mediatheken/youtube.py:208
-#: src/additions/mediatheken/youtube.py:476 src/plugin.py:843
-#: src/plugin.py:1039 src/plugin.py:1375 src/plugin.py:1737 src/plugin.py:1864
-#: src/plugin.py:1895 src/plugin.py:2440 src/plugin.py:2678 src/plugin.py:2794
-#: src/plugin.py:2825 src/plugin.py:3274
+#: src/additions/mediatheken/youtube.py:209
+#: src/additions/mediatheken/youtube.py:484 src/plugin.py:814
+#: src/plugin.py:1010 src/plugin.py:1346 src/plugin.py:1708 src/plugin.py:1835
+#: src/plugin.py:1866 src/plugin.py:2411 src/plugin.py:2649 src/plugin.py:2765
+#: src/plugin.py:2796 src/plugin.py:3245
 msgid "Sports"
 msgstr "Sport"
 
-#: src/additions/mediatheken/youtube.py:423
+#: src/additions/mediatheken/youtube.py:431
 msgid "Genres"
 msgstr "Genres"
 
-#: src/additions/mediatheken/youtube.py:449
-#: src/additions/mediatheken/youtube.py:668
-#: src/additions/mediatheken/youtube.py:691
+#: src/additions/mediatheken/youtube.py:457
+#: src/additions/mediatheken/youtube.py:676
+#: src/additions/mediatheken/youtube.py:699
 msgid "Edit Parameter"
 msgstr "Parameter Editieren"
 
-#: src/additions/mediatheken/youtube.py:450
+#: src/additions/mediatheken/youtube.py:458
 msgid "Request YT-Token"
 msgstr "YT-Token Anfordern"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Autos & Vehicles"
 msgstr "Autos & Fahrzeuge"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Comedy"
 msgstr "Komödie"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Education"
 msgstr "Bildung"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Entertainment"
 msgstr "Unterhaltung"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Film & Animation"
 msgstr "Film & Animation"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Howto & Style"
 msgstr "Praktische Tipps & Styling"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "News & Politics"
 msgstr "Nachrichten & Politik"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "People & Blogs"
 msgstr "Menschen & Blogs"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Pets & Animals"
 msgstr "Tiere"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Science & Technology"
 msgstr "Wissenschaft & Technik"
 
-#: src/additions/mediatheken/youtube.py:476
+#: src/additions/mediatheken/youtube.py:484
 msgid "Travel & Events"
 msgstr "Reisen & Events"
 
-#: src/additions/mediatheken/youtube.py:482
+#: src/additions/mediatheken/youtube.py:490
 msgid "No Category"
 msgstr "Keine Kategorie"
 
-#: src/additions/mediatheken/youtube.py:535
+#: src/additions/mediatheken/youtube.py:543
 msgid "Author"
 msgstr "Autor"
 
-#: src/additions/mediatheken/youtube.py:751
+#: src/additions/mediatheken/youtube.py:759
 msgid "You need to request a token to allow access to your YouTube account."
 msgstr ""
 "Es muss ein Token angefordert werden, um Zugang zu Ihrem YouTube-Konto zu "
 "ermöglichen."
 
-#: src/additions/mediatheken/youtube.py:759
+#: src/additions/mediatheken/youtube.py:767
 msgid "Did you revoke the access?"
 msgstr "Wurde der Zugriff widerrufen?"
 
-#: src/additions/mediatheken/youtube.py:861
+#: src/additions/mediatheken/youtube.py:869
 msgid "Favorite"
 msgstr "Favorit"
 
-#: src/additions/mediatheken/youtube.py:953
+#: src/additions/mediatheken/youtube.py:961
 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
+#: src/additions/mediatheken/youtube.py:1135
 msgid "We switched to our API backup key, please try again!"
 msgstr ""
 "Wir haben zu unserem API-Backup-Schlüssel gewechselt, bitte versuchen Sie es "
 "erneut!"
 
-#: src/additions/mediatheken/youtube.py:1129
+#: src/additions/mediatheken/youtube.py:1137
 msgid "Our YouTube API quota exceeded, try again tomorrow!"
 msgstr ""
 "Unser YouTube-API-Kontingent wurde überschritten. Versuche es morgen noch "
 "einmal!"
 
-#: src/additions/mediatheken/youtube.py:1256
-#: src/additions/mediatheken/youtube.py:1286
+#: src/additions/mediatheken/youtube.py:1264
+#: src/additions/mediatheken/youtube.py:1294
 msgid "Views:"
 msgstr "Aufrufe:"
 
-#: src/additions/mediatheken/youtube.py:1264
-#: src/additions/mediatheken/youtube.py:1294
+#: src/additions/mediatheken/youtube.py:1272
+#: src/additions/mediatheken/youtube.py:1302
 msgid "Published:"
 msgstr "Veröffentlicht:"
 
-#: src/additions/mediatheken/youtube.py:1268
-#: src/additions/mediatheken/youtube.py:1298
+#: src/additions/mediatheken/youtube.py:1276
+#: src/additions/mediatheken/youtube.py:1306
 msgid "Channel:"
 msgstr "Kanal:"
 
-#: src/additions/mediatheken/youtube.py:1514
+#: src/additions/mediatheken/youtube.py:1522
 msgid "Unfortunately, this video can not be played!\n"
 msgstr "Das Video kann leider nicht abgespielt werden!\n"
 
-#: src/additions/mediatheken/youtube.py:1545
-#: src/additions/mediatheken/youtube.py:1591
-#: src/additions/mediatheken/youtube.py:1629
+#: src/additions/mediatheken/youtube.py:1553
+#: src/additions/mediatheken/youtube.py:1599
+#: src/additions/mediatheken/youtube.py:1637
 msgid "Error!\n"
 msgstr "Fehler!\n"
 
-#: src/additions/mediatheken/youtube.py:1580
+#: src/additions/mediatheken/youtube.py:1588
 msgid "Favorite already exists"
 msgstr "Favorit schon vorhanden"
 
-#: src/additions/mediatheken/youtube.py:1586
+#: src/additions/mediatheken/youtube.py:1594
 msgid "Favorite added"
 msgstr "Favorit hinzugefügt"
 
-#: src/additions/mediatheken/youtube.py:1943
-#: src/additions/mediatheken/youtube.py:1944
+#: src/additions/mediatheken/youtube.py:1967
+msgid ""
+"Missing OAuth2 data, please fill the file 'mp_yt-oauth2' first and restart "
+"the Enigma2 GUI."
+msgstr ""
+"Fehlende OAuth2-Daten, bitte befüllen Sie die Datei 'mp_yt-oauth2' zuerst "
+"und starten Sie die Enigma2 GUI neu."
+
+#: src/additions/mediatheken/youtube.py:1971
+#: src/additions/mediatheken/youtube.py:1972
 msgid "Error: Unable to request the Device code"
 msgstr "Fehler: Kann den Gerätecode nicht anfordern"
 
-#: src/additions/mediatheken/youtube.py:1950
+#: src/additions/mediatheken/youtube.py:1978
 #, python-brace-format
 msgid ""
 "You've to visit:\n"
@@ -1525,7 +1510,7 @@ msgstr ""
 "und diesen Code eingeben: {code}\n"
 "Aktion abbrechen?"
 
-#: src/additions/mediatheken/youtube.py:1954
+#: src/additions/mediatheken/youtube.py:1982
 msgid ""
 "Waiting for response from the server.\n"
 "Cancel action?"
@@ -1533,25 +1518,25 @@ msgstr ""
 "Warten auf Antwort vom Server.\n"
 "Aktion abbrechen?"
 
-#: src/additions/mediatheken/youtube.py:1970
-#: src/additions/mediatheken/youtube.py:1971
-#: src/additions/mediatheken/youtube.py:1977
+#: src/additions/mediatheken/youtube.py:1998
+#: src/additions/mediatheken/youtube.py:1999
+#: src/additions/mediatheken/youtube.py:2005
 msgid "Error: Unable to get tokens!"
 msgstr "Fehler: Der Token konnte nicht angefordert werden!"
 
-#: src/additions/mediatheken/youtube.py:1992
+#: src/additions/mediatheken/youtube.py:2020
 msgid ""
 "Access granted :)\n"
-"For safety you should create backup's of enigma2 settings and '/etc/enigma2/"
-"mp_yt-access-tokens.json'.\n"
+"For safety you should create backup's of enigma2 settings and 'mp_yt-access-"
+"tokens.json'.\n"
 "The tokens are valid until they are revoked in Your Google Account."
 msgstr ""
 "Zugriff gewährt :)\n"
-"Aus Sicherheitsgründen sollten ein Backup der enigma2-Einstellungen und '/"
-"etc/enigma2/mp_yt-access-tokens.json' gemacht werden.\n"
+"Zur Sicherheit sollte ein Backup der enigma2-Einstellungen und 'mp_yt-access-"
+"tokens.json' gemacht werden.\n"
 "Die Token sind gültig, bis sie in Ihrem Google-Konto widerrufen werden."
 
-#: src/additions/mediatheken/youtube.py:2009
+#: src/additions/mediatheken/youtube.py:2037
 msgid "Error: Unable to refresh token!"
 msgstr "Fehler: Der Token konnte nicht aktualisert werden!"
 
@@ -1673,18 +1658,6 @@ msgstr "Kein Streamlink gefunden."
 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
-#: src/additions/porn/julesjordan.py:102 src/additions/porn/kink.py:107
-#: src/additions/porn/mofos.py:102 src/additions/porn/naughtyamerica.py:103
-#: src/additions/porn/nubilefilms.py:98 src/additions/porn/realitykings.py:116
-#: src/additions/porn/teamskeet.py:105 src/additions/porn/wicked.py:87
-#, python-format
-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/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
@@ -1703,6 +1676,14 @@ msgstr "Keine Livestreams gefunden!"
 msgid "Cam is currently offline."
 msgstr "Cam ist zur Zeit offline."
 
+#: src/additions/porn/brazzers.py:105 src/additions/porn/ddfnetwork.py:117
+#: src/additions/porn/kink.py:107 src/additions/porn/mofos.py:102
+#: src/additions/porn/nubilefilms.py:98 src/additions/porn/teamskeet.py:105
+#, python-format
+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/cumlouder.py:177
 msgid "No series found!"
 msgstr "Keine Serien gefunden!"
@@ -1715,10 +1696,6 @@ msgstr "Keine Websites gefunden!"
 msgid "No girls found!"
 msgstr "Keine Girls gefunden!"
 
-#: src/additions/porn/naughtyamerica.py:63
-msgid "Mode"
-msgstr "Modus"
-
 #: src/additions/porn/pinflix.py:317 src/additions/porn/pinflix.py:460
 #: src/additions/porn/porncom.py:293 src/additions/porn/porncom.py:431
 #: src/additions/porn/porncom.py:569 src/additions/porn/porncom.py:757
@@ -1814,402 +1791,382 @@ msgstr "Region"
 msgid "Keywords"
 msgstr "Keywords"
 
-#: src/plugin.py:186
+#: src/plugin.py:183
 msgid "Crossfade (fast)"
 msgstr "Überblenden (schnell)"
 
-#: src/plugin.py:186
+#: src/plugin.py:183
 msgid "Crossfade (slow)"
 msgstr "Überblenden (langsam)"
 
-#: src/plugin.py:212
+#: src/plugin.py:207
 msgid "Wall 2.0"
 msgstr "Wall 2.0"
 
-#: src/plugin.py:212 src/plugin.py:214 src/plugin.py:218
+#: src/plugin.py:207 src/plugin.py:209 src/plugin.py:213
 msgid "Wall"
 msgstr "Wall"
 
-#: src/plugin.py:212 src/plugin.py:214 src/plugin.py:216 src/plugin.py:218
+#: src/plugin.py:207 src/plugin.py:209 src/plugin.py:211 src/plugin.py:213
 msgid "List"
 msgstr "Liste"
 
-#: src/plugin.py:234
+#: src/plugin.py:225
 msgid "Medium"
 msgstr "Mittel"
 
-#: src/plugin.py:236
+#: src/plugin.py:227
 msgid "never"
 msgstr "niemals"
 
-#: src/plugin.py:236
+#: src/plugin.py:227
 msgid "5 minutes"
 msgstr "5 Minuten"
 
-#: src/plugin.py:236
+#: src/plugin.py:227
 msgid "15 minutes"
 msgstr "15 Minuten"
 
-#: src/plugin.py:236
+#: src/plugin.py:227
 msgid "30 minutes"
 msgstr "30 Minuten"
 
-#: src/plugin.py:236
+#: src/plugin.py:227
 msgid "60 minutes"
 msgstr "60 Minuten"
 
-#: src/plugin.py:244
+#: src/plugin.py:235
 msgid "after SimplePlayer quits"
 msgstr "nachdem der SimplePlayer beendet wird"
 
-#: src/plugin.py:244
+#: src/plugin.py:235
 msgid "after MediaPortal quits"
 msgstr "nachdem das MediaPortal beendet wird"
 
-#: src/plugin.py:249
+#: src/plugin.py:240
 msgid "Forward"
 msgstr "Vorwärts"
 
-#: src/plugin.py:249
+#: src/plugin.py:240
 msgid "Backward"
 msgstr "Rückwärts"
 
-#: src/plugin.py:249
+#: src/plugin.py:240
 msgid "Random"
 msgstr "Zufällig"
 
-#: src/plugin.py:249
+#: src/plugin.py:240
 msgid "Endless"
 msgstr "Endlos"
 
-#: src/plugin.py:250 src/plugin.py:251 src/plugin.py:257
+#: src/plugin.py:241 src/plugin.py:242 src/plugin.py:248
 msgid "Ask user"
 msgstr "Anwender fragen"
 
-#: src/plugin.py:250 src/plugin.py:251
+#: src/plugin.py:241 src/plugin.py:242
 msgid "Return to previous service"
 msgstr "Zum letzten Kanal zurückkehren"
 
-#: src/plugin.py:251
+#: src/plugin.py:242
 msgid "Pause movie at end"
 msgstr "Film am Ende pausieren"
 
-#: src/plugin.py:256 src/plugin.py:275 src/resources/simplelist.py:509
-#: src/resources/simplelist.py:684 src/resources/simplelist.py:708
-#: src/resources/simpleplayer.py:1810 src/resources/simpleplayer.py:1816
+#: src/plugin.py:247 src/resources/simplelist.py:496
+#: src/resources/simplelist.py:671 src/resources/simplelist.py:695
+#: src/resources/simpleplayer.py:1730 src/resources/simpleplayer.py:1736
 msgid "No"
 msgstr "Nein"
 
-#: src/plugin.py:256
+#: src/plugin.py:247
 msgid "with Premiumize"
 msgstr "mit Premiumize"
 
-#: src/plugin.py:256
+#: src/plugin.py:247
 msgid "with Real-Debrid"
 msgstr "mit Real-Debrid"
 
-#: src/plugin.py:256
+#: src/plugin.py:247
 msgid "with a HTTP Proxy"
 msgstr "mit einem HTTP-Proxy"
 
-#: src/plugin.py:257
+#: src/plugin.py:248
 msgid "Start from the beginning"
 msgstr "Starte vom Anfang"
 
-#: src/plugin.py:257
+#: src/plugin.py:248
 msgid "Resume from last position"
 msgstr "Von letzter Position fortsetzen"
 
-#: src/plugin.py:259
+#: src/plugin.py:250
 msgid "large"
 msgstr "Groß"
 
-#: src/plugin.py:259
+#: src/plugin.py:250
 msgid "small"
 msgstr "Klein"
 
-#: src/plugin.py:259
+#: src/plugin.py:250
 msgid "off"
 msgstr "Aus"
 
-#: src/plugin.py:262 src/plugin.py:264 src/plugin.py:265
+#: src/plugin.py:253 src/plugin.py:255 src/plugin.py:256
 msgid "Off"
 msgstr "Aus"
 
-#: src/plugin.py:262 src/plugin.py:264
+#: src/plugin.py:253 src/plugin.py:255
 msgid "Mode 1"
 msgstr "Modus 1"
 
-#: src/plugin.py:262 src/plugin.py:264
+#: src/plugin.py:253 src/plugin.py:255
 msgid "Mode 2"
 msgstr "Modus 2"
 
-#: src/plugin.py:262
+#: src/plugin.py:253
 msgid "Mode 3"
 msgstr "Modus 3"
 
-#: src/plugin.py:265
+#: src/plugin.py:256
 msgid "Ken Burns effect"
 msgstr "Ken Burns Effekt"
 
-#: src/plugin.py:265
+#: src/plugin.py:256
 msgid "Just photos"
 msgstr "Nur Fotos"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "Red"
 msgstr "Rot"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "Yellow"
 msgstr "Gelb"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "Green"
 msgstr "Grün"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "White"
 msgstr "Weiß"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "Light Blue"
 msgstr "Hellblau"
 
-#: src/plugin.py:289
+#: src/plugin.py:275
 msgid "Light Green"
 msgstr "Hellgrün"
 
-#: src/plugin.py:461
+#: src/plugin.py:441
 msgid "premiumize.me is not activated."
 msgstr "premiumize.me ist nicht aktiviert."
 
-#: src/plugin.py:554 src/resources/simpleplayer.py:2276
+#: src/plugin.py:534 src/resources/simpleplayer.py:2196
 msgid "GENERAL"
 msgstr "ALLGEMEIN"
 
-#: src/plugin.py:555
+#: src/plugin.py:535
 msgid "Automatic Update Check:"
 msgstr "Automatische Updateüberprüfung:"
 
-#: src/plugin.py:556
+#: src/plugin.py:536
 msgid "Mainview Style:"
 msgstr "Hauptansicht Stil:"
 
-#: src/plugin.py:558
+#: src/plugin.py:538
 msgid "Page Display Style:"
 msgstr "Seitenanzeigestil:"
 
-#: src/plugin.py:559
+#: src/plugin.py:539
 msgid "Skin:"
 msgstr "Skin:"
 
-#: src/plugin.py:561
+#: src/plugin.py:541
 msgid "Disable Background-TV:"
 msgstr "Background-TV deaktivieren:"
 
-#: src/plugin.py:563
+#: src/plugin.py:543
 msgid "Restore last service:"
 msgstr "Letzten Kanal wiederherstellen:"
 
-#: src/plugin.py:564
+#: src/plugin.py:544
 msgid "Disable Mini-TV:"
 msgstr "Mini-TV deaktivieren:"
 
-#: src/plugin.py:565
+#: src/plugin.py:545
 msgid "Enable search suggestions:"
 msgstr "Suchvorschläge aktivieren:"
 
-#: src/plugin.py:567
+#: src/plugin.py:547
 msgid "Label animation"
 msgstr "Label Animation"
 
-#: src/plugin.py:569
+#: src/plugin.py:549
 msgid "YOUTH PROTECTION"
 msgstr "JUGENDSCHUTZ"
 
-#: src/plugin.py:570
+#: src/plugin.py:550
 msgid "Setup PIN:"
 msgstr "Setup-PIN:"
 
-#: src/plugin.py:571
+#: src/plugin.py:551
 msgid "Setup PIN Query:"
 msgstr "Setup-PIN Abfrage:"
 
-#: src/plugin.py:572
+#: src/plugin.py:552
 msgid "Kids PIN Query:"
 msgstr "Kinder-PIN Abfrage:"
 
-#: src/plugin.py:573
+#: src/plugin.py:553
 msgid "Adult PIN:"
 msgstr "Erwachsenen-PIN:"
 
-#: src/plugin.py:574
+#: src/plugin.py:554
 msgid "Adult PIN Query:"
 msgstr "Erwachsenen-PIN Abfrage:"
 
-#: src/plugin.py:575
+#: src/plugin.py:555
 msgid "Remember Adult PIN:"
 msgstr "Erwachsenen-PIN merken:"
 
-#: src/plugin.py:576
+#: src/plugin.py:556
 msgid "Auto hide adult section on startup:"
 msgstr "Erwachsenenbereich beim Start automatisch ausblenden:"
 
-#: src/plugin.py:578
+#: src/plugin.py:558
 msgid "OTHER"
 msgstr "SONSTIGES"
 
-#: src/plugin.py:583
-msgid "Use HLS-Player Proxy:"
-msgstr "HLS-Player Proxy verwenden:"
-
-#: src/plugin.py:584
-msgid "HLSP-HTTP-Proxy Host or IP:"
-msgstr "HLSP-HTTP-Proxy Host oder IP:"
-
-#: src/plugin.py:585
-msgid "HLSP-Proxy Port:"
-msgstr "HLSP-Proxy Port:"
-
-#: src/plugin.py:586
-msgid "HLSP-Proxy username:"
-msgstr "HLSP-Proxy Username:"
-
-#: src/plugin.py:587
-msgid "HLSP-Proxy password:"
-msgstr "HLSP-Proxy Passwort:"
-
-#: src/plugin.py:588
+#: src/plugin.py:559
 msgid "Temporary Cachepath:"
 msgstr "Temporäres Cacheverzeichnis:"
 
-#: src/plugin.py:589
+#: src/plugin.py:560
 msgid "Icon Cachepath:"
 msgstr "Icon Cacheverzeichnis:"
 
-#: src/plugin.py:590 src/resources/simpleplayer.py:2279
+#: src/plugin.py:561 src/resources/simpleplayer.py:2199
 msgid "Videoquality:"
 msgstr "Videoqualität:"
 
-#: src/plugin.py:591
+#: src/plugin.py:562
 msgid "Watchlist/Playlist/Userchan path:"
 msgstr "Watchlist/Playlist/Userchan Verzeichnis:"
 
-#: src/plugin.py:593 src/resources/simpleplayer.py:2290
+#: src/plugin.py:564 src/resources/simpleplayer.py:2210
 msgid "YOUTUBE"
 msgstr "YOUTUBE"
 
-#: src/plugin.py:594 src/resources/simpleplayer.py:2291
+#: src/plugin.py:565 src/resources/simpleplayer.py:2211
 msgid "Highest resolution for playback:"
 msgstr "Höchste Auflösung für die Wiedergabe:"
 
-#: src/plugin.py:596 src/resources/simpleplayer.py:2293
+#: src/plugin.py:567 src/resources/simpleplayer.py:2213
 msgid "Enable DASH format:"
 msgstr "DASH Format aktivieren:"
 
-#: src/plugin.py:598 src/resources/simpleplayer.py:2295
+#: src/plugin.py:569 src/resources/simpleplayer.py:2215
 msgid "Enable DASH format (no seeking possible):"
 msgstr "DASH Format aktivieren (kein Spulen möglich):"
 
-#: src/plugin.py:600 src/resources/simpleplayer.py:2297
+#: src/plugin.py:571 src/resources/simpleplayer.py:2217
 msgid "Use DASH format for 480p:"
 msgstr "DASH Format verwenden für 480p:"
 
-#: src/plugin.py:601 src/resources/simpleplayer.py:2298
+#: src/plugin.py:572 src/resources/simpleplayer.py:2218
 msgid "Use DASH format for 720p:"
 msgstr "DASH Format verwenden für 720p:"
 
-#: src/plugin.py:602 src/resources/simpleplayer.py:2299
+#: src/plugin.py:573 src/resources/simpleplayer.py:2219
 msgid "Enable VP9 codec (required for resolutions >1080p):"
 msgstr "VP9 Codec aktivieren (erforderlich für Auflösungen >1080p):"
 
-#: src/plugin.py:604 src/resources/simpleplayer.py:2301
+#: src/plugin.py:575 src/resources/simpleplayer.py:2221
 msgid "Enable VP9 HDR (only for resolutions 720p and higher):"
 msgstr "VP9 HDR aktivieren (nur für Auflösungen ab 720p):"
 
-#: src/plugin.py:606 src/resources/simpleplayer.py:2303
+#: src/plugin.py:577 src/resources/simpleplayer.py:2223
 msgid "Enable Opus codec:"
 msgstr "Opus Codec aktivieren:"
 
-#: src/plugin.py:607
+#: src/plugin.py:578
 msgid "Show USER-Channels Help:"
 msgstr "Zeige Hilfe für Benutzer-Kanäle:"
 
-#: src/plugin.py:608
+#: src/plugin.py:579
 msgid "Use Proxy:"
 msgstr "Verwende Proxy:"
 
-#: src/plugin.py:610
+#: src/plugin.py:581
 msgid "HTTP-Proxy Host or IP:"
 msgstr "HTTP-Proxy Host oder IP:"
 
-#: src/plugin.py:611
+#: src/plugin.py:582
 msgid "HTTP-Proxy Port:"
 msgstr "HTTP-Proxy Port:"
 
-#: src/plugin.py:612
+#: src/plugin.py:583
 msgid "HTTP-Proxy username:"
 msgstr "HTTP-Proxy Username:"
 
-#: src/plugin.py:613
+#: src/plugin.py:584
 msgid "HTTP-Proxy password:"
 msgstr "HTTP-Proxy Passwort:"
 
-#: src/plugin.py:616
+#: src/plugin.py:587
 msgid "Activate premiumize.me:"
 msgstr "premiumize.me aktivieren:"
 
-#: src/plugin.py:618
+#: src/plugin.py:589
 msgid "API-Key:"
 msgstr "API-Key:"
 
-#: src/plugin.py:621
+#: src/plugin.py:592
 msgid "Activate Real-Debrid.com:"
 msgstr "Real-Debrid.com aktivieren:"
 
-#: src/plugin.py:625
+#: src/plugin.py:596
 msgid "Streammarkercolor:"
 msgstr "Streammarkerfarbe:"
 
-#: src/plugin.py:663
+#: src/plugin.py:634
 msgid "LIBRARIES"
 msgstr "MEDIATHEKEN"
 
-#: src/plugin.py:666 src/plugin.py:672 src/plugin.py:678 src/plugin.py:684
-#: src/plugin.py:690 src/plugin.py:697 src/plugin.py:707
+#: src/plugin.py:637 src/plugin.py:643 src/plugin.py:649 src/plugin.py:655
+#: src/plugin.py:661 src/plugin.py:668 src/plugin.py:678
 msgid "Show "
 msgstr "Zeige "
 
-#: src/plugin.py:669
+#: src/plugin.py:640
 msgid "NEWS & DOCUMENTARY"
 msgstr "NACHRICHTEN & DOKUS"
 
-#: src/plugin.py:675
+#: src/plugin.py:646
 msgid "TECH & FUN"
 msgstr "TECHNIK & SPASS"
 
-#: src/plugin.py:681
+#: src/plugin.py:652
 msgid "SPORTS"
 msgstr "SPORT"
 
-#: src/plugin.py:687
+#: src/plugin.py:658
 msgid "MUSIC"
 msgstr "MUSIK"
 
-#: src/plugin.py:694
+#: src/plugin.py:665
 msgid "PORN"
 msgstr "PORNO"
 
-#: src/plugin.py:704
+#: src/plugin.py:675
 msgid "USER-ADDITIONS"
 msgstr "USER-ERWEITERUNGEN"
 
-#: src/plugin.py:713
+#: src/plugin.py:684
 msgid "Activate User-additions:"
 msgstr "User-Erweiterungen aktivieren:"
 
-#: src/plugin.py:756
+#: src/plugin.py:727
 #, python-format
 msgid ""
 "Some of the plugins may not be legally used in your country!\n"
@@ -2225,103 +2182,103 @@ msgstr ""
 "\n"
 "%s"
 
-#: src/plugin.py:771
+#: src/plugin.py:742
 msgid "Real-Debrid.com is not activated."
 msgstr "Real-Debrid.com is not activated."
 
-#: src/plugin.py:779
+#: src/plugin.py:750
 msgid "Please enter the correct code"
 msgstr "Bitte den korrekten Code eingeben"
 
-#: src/plugin.py:779
+#: src/plugin.py:750
 msgid "Enter code"
 msgstr "Code eingeben"
 
-#: src/plugin.py:839 src/plugin.py:1027 src/plugin.py:1375 src/plugin.py:1733
-#: src/plugin.py:1852 src/plugin.py:1883 src/plugin.py:2440 src/plugin.py:2674
-#: src/plugin.py:2782 src/plugin.py:2813 src/plugin.py:3274
+#: src/plugin.py:810 src/plugin.py:998 src/plugin.py:1346 src/plugin.py:1704
+#: src/plugin.py:1823 src/plugin.py:1854 src/plugin.py:2411 src/plugin.py:2645
+#: src/plugin.py:2753 src/plugin.py:2784 src/plugin.py:3245
 msgid "ALL"
 msgstr "ALLE"
 
-#: src/plugin.py:840 src/plugin.py:1029 src/plugin.py:1375 src/plugin.py:1734
-#: src/plugin.py:1854 src/plugin.py:1885 src/plugin.py:2440 src/plugin.py:2675
-#: src/plugin.py:2784 src/plugin.py:2815 src/plugin.py:3274
+#: src/plugin.py:811 src/plugin.py:1000 src/plugin.py:1346 src/plugin.py:1705
+#: src/plugin.py:1825 src/plugin.py:1856 src/plugin.py:2411 src/plugin.py:2646
+#: src/plugin.py:2755 src/plugin.py:2786 src/plugin.py:3245
 msgid "Libraries"
 msgstr "Mediatheken"
 
-#: src/plugin.py:841 src/plugin.py:1033 src/plugin.py:1375 src/plugin.py:1735
-#: src/plugin.py:1858 src/plugin.py:1889 src/plugin.py:2440 src/plugin.py:2676
-#: src/plugin.py:2788 src/plugin.py:2819 src/plugin.py:3274
+#: src/plugin.py:812 src/plugin.py:1004 src/plugin.py:1346 src/plugin.py:1706
+#: src/plugin.py:1829 src/plugin.py:1860 src/plugin.py:2411 src/plugin.py:2647
+#: src/plugin.py:2759 src/plugin.py:2790 src/plugin.py:3245
 msgid "Tech & Fun"
 msgstr "Technik & Spaß"
 
-#: src/plugin.py:844 src/plugin.py:1035 src/plugin.py:1375 src/plugin.py:1738
-#: src/plugin.py:1860 src/plugin.py:1891 src/plugin.py:2440 src/plugin.py:2679
-#: src/plugin.py:2790 src/plugin.py:2821 src/plugin.py:3274
+#: src/plugin.py:815 src/plugin.py:1006 src/plugin.py:1346 src/plugin.py:1709
+#: src/plugin.py:1831 src/plugin.py:1862 src/plugin.py:2411 src/plugin.py:2650
+#: src/plugin.py:2761 src/plugin.py:2792 src/plugin.py:3245
 msgid "News & Documentary"
 msgstr "Nachrichten & Dokus"
 
-#: src/plugin.py:845 src/plugin.py:1041 src/plugin.py:1370 src/plugin.py:1739
-#: src/plugin.py:1866 src/plugin.py:1897 src/plugin.py:2435 src/plugin.py:2680
-#: src/plugin.py:2796 src/plugin.py:2827 src/plugin.py:3269
+#: src/plugin.py:816 src/plugin.py:1012 src/plugin.py:1341 src/plugin.py:1710
+#: src/plugin.py:1837 src/plugin.py:1868 src/plugin.py:2406 src/plugin.py:2651
+#: src/plugin.py:2767 src/plugin.py:2798 src/plugin.py:3240
 msgid "Porn"
 msgstr "Porno"
 
-#: src/plugin.py:846 src/plugin.py:1031 src/plugin.py:1374 src/plugin.py:1740
-#: src/plugin.py:1856 src/plugin.py:1887 src/plugin.py:2439 src/plugin.py:2681
-#: src/plugin.py:2786 src/plugin.py:2817 src/plugin.py:3273
+#: src/plugin.py:817 src/plugin.py:1002 src/plugin.py:1345 src/plugin.py:1711
+#: src/plugin.py:1827 src/plugin.py:1858 src/plugin.py:2410 src/plugin.py:2652
+#: src/plugin.py:2757 src/plugin.py:2788 src/plugin.py:3244
 msgid "User-additions"
 msgstr "User-Erweiterungen"
 
-#: src/plugin.py:849 src/plugin.py:1743 src/plugin.py:2684
+#: src/plugin.py:820 src/plugin.py:1714 src/plugin.py:2655
 msgid "Change filter"
 msgstr "Filter wechseln"
 
-#: src/plugin.py:850 src/plugin.py:1746 src/plugin.py:2687
+#: src/plugin.py:821 src/plugin.py:1717 src/plugin.py:2658
 msgid "Open SimpleList"
 msgstr "SimpleList öffnen"
 
-#: src/plugin.py:851 src/plugin.py:1747 src/plugin.py:2688
+#: src/plugin.py:822 src/plugin.py:1718 src/plugin.py:2659
 msgid "Open selected Plugin"
 msgstr "Ausgewähltes Plugin öffnen"
 
-#: src/plugin.py:852 src/plugin.py:1748 src/plugin.py:2689
+#: src/plugin.py:823 src/plugin.py:1719 src/plugin.py:2660
 msgid "Exit MediaPortal"
 msgstr "MediaPortal beenden"
 
-#: src/plugin.py:853 src/plugin.py:1751 src/plugin.py:2692
+#: src/plugin.py:824 src/plugin.py:1722 src/plugin.py:2663
 msgid "MediaPortal Setup"
 msgstr "MediaPortal Setup"
 
-#: src/plugin.py:865 src/plugin.py:1762 src/plugin.py:2703
-#: src/resources/showAsThumb.py:246 src/resources/simplelist.py:116
-#: src/resources/simplelist.py:638 src/resources/simpleplayer.py:718
+#: src/plugin.py:836 src/plugin.py:1733 src/plugin.py:2674
+#: src/resources/showAsThumb.py:246 src/resources/simplelist.py:112
+#: src/resources/simplelist.py:625 src/resources/simpleplayer.py:642
 msgid "Exit"
 msgstr "Beenden"
 
-#: src/plugin.py:866 src/plugin.py:1763 src/plugin.py:2704
+#: src/plugin.py:837 src/plugin.py:1734 src/plugin.py:2675
 msgid "Help"
 msgstr "Hilfe"
 
-#: src/plugin.py:867 src/plugin.py:1764 src/plugin.py:2705
+#: src/plugin.py:838 src/plugin.py:1735 src/plugin.py:2676
 msgid "Menu"
 msgstr "Menü"
 
-#: src/plugin.py:1184 src/plugin.py:1328 src/plugin.py:2162 src/plugin.py:2406
-#: src/plugin.py:3026 src/plugin.py:3240
+#: src/plugin.py:1155 src/plugin.py:1299 src/plugin.py:2133 src/plugin.py:2377
+#: src/plugin.py:2997 src/plugin.py:3211
 msgid "Enter adult PIN"
 msgstr "Erwachsenen-PIN eingeben"
 
-#: src/plugin.py:1198 src/plugin.py:2338 src/plugin.py:3172
+#: src/plugin.py:1169 src/plugin.py:2309 src/plugin.py:3143
 msgid "Enter setup PIN"
 msgstr "Setup-PIN eingeben"
 
-#: src/plugin.py:1238 src/plugin.py:2070 src/plugin.py:2931
+#: src/plugin.py:1209 src/plugin.py:2041 src/plugin.py:2902
 msgid "No connection to the Internet available."
 msgstr "Keine Verbindung zum Internet vorhanden."
 
-#: src/plugin.py:1265 src/plugin.py:1304 src/plugin.py:2099 src/plugin.py:2138
-#: src/plugin.py:2963 src/plugin.py:3002
+#: src/plugin.py:1236 src/plugin.py:1275 src/plugin.py:2070 src/plugin.py:2109
+#: src/plugin.py:2934 src/plugin.py:2973
 #, python-format
 msgid ""
 "This Plugin has been marked as \"not working\" by the developers.\n"
@@ -2340,8 +2297,8 @@ msgstr ""
 "Falls jemand anderes bereit ist einen Fix für dieses Plugin zur Verfügung zu "
 "stellen dann nehmt bitte Kontakt mit uns auf."
 
-#: src/plugin.py:1267 src/plugin.py:1306 src/plugin.py:2101 src/plugin.py:2140
-#: src/plugin.py:2965 src/plugin.py:3004
+#: src/plugin.py:1238 src/plugin.py:1277 src/plugin.py:2072 src/plugin.py:2111
+#: src/plugin.py:2936 src/plugin.py:2975
 #, python-format
 msgid ""
 "This Plugin has been marked as \"not working\" by the developers.\n"
@@ -2354,39 +2311,39 @@ msgstr ""
 "Aktueller Entwickler-Status dieses Plugins ist:\n"
 "\"%s\""
 
-#: src/plugin.py:1376 src/plugin.py:2441 src/plugin.py:3275
+#: src/plugin.py:1347 src/plugin.py:2412 src/plugin.py:3246
 msgid "Select Filter"
 msgstr "Wähle Filter"
 
-#: src/plugin.py:1428
+#: src/plugin.py:1399
 msgid "Userdefined Plugin sorting"
 msgstr "Benutzerdefinierte Plugin-Sortierung"
 
-#: src/plugin.py:1744 src/plugin.py:2685
+#: src/plugin.py:1715 src/plugin.py:2656
 msgid "Change sort order"
 msgstr "Sortierreihenfolge ändern"
 
-#: src/plugin.py:1745 src/plugin.py:2686
+#: src/plugin.py:1716 src/plugin.py:2657
 msgid "Manual sorting"
 msgstr "Manuelle Sortierung"
 
-#: src/plugin.py:1749 src/plugin.py:2690
+#: src/plugin.py:1720 src/plugin.py:2661
 msgid "Next page"
 msgstr "Nächste Seite"
 
-#: src/plugin.py:1750 src/plugin.py:2691
+#: src/plugin.py:1721 src/plugin.py:2662
 msgid "Previous page"
 msgstr "Vorherige Seite"
 
-#: src/plugin.py:1760 src/plugin.py:2701
+#: src/plugin.py:1731 src/plugin.py:2672
 msgid "CH+"
 msgstr "CH+"
 
-#: src/plugin.py:1761 src/plugin.py:2702
+#: src/plugin.py:1732 src/plugin.py:2673
 msgid "CH-"
 msgstr "CH-"
 
-#: src/plugin.py:1825 src/plugin.py:2754
+#: src/plugin.py:1796 src/plugin.py:2725
 msgid "Ordering is only possible with filter \"ALL\"."
 msgstr "Sortieren ist nur mit dem Filter \"ALLE\" möglich."
 
@@ -2527,7 +2484,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:1545
+#: src/resources/mtvdelink.py:82 src/resources/simpleplayer.py:1465
 msgid "No URL found!"
 msgstr "Keine URL gefunden!"
 
@@ -2626,318 +2583,309 @@ msgid "Page: %(page)s of %(pages)s  |  Section: %(section)s of %(sections)s"
 msgstr ""
 "Seite: %(page)s von %(pages)s  |  Abschnitt: %(section)s von %(sections)s"
 
-#: src/resources/simplelist.py:76
+#: src/resources/simplelist.py:72
 msgid "Update PL"
 msgstr "Update PL"
 
-#: src/resources/simplelist.py:78
+#: src/resources/simplelist.py:74
 msgid "IPTV Genre"
 msgstr "IPTV Genre"
 
-#: src/resources/simplelist.py:80
+#: src/resources/simplelist.py:76
 msgid "Delete PL"
 msgstr "Lösche PL"
 
-#: src/resources/simplelist.py:117 src/resources/simplelist.py:644
+#: src/resources/simplelist.py:113 src/resources/simplelist.py:631
 msgid "List overview"
 msgstr "Listen Übersicht"
 
-#: src/resources/simplelist.py:119
+#: src/resources/simplelist.py:115
 msgid "Video List"
 msgstr "Video Liste"
 
-#: src/resources/simplelist.py:193
+#: src/resources/simplelist.py:189
 msgid "No playlist found"
 msgstr "Keine Playlist gefunden"
 
-#: src/resources/simplelist.py:214
+#: src/resources/simplelist.py:210
 msgid "Show all channels"
 msgstr "Zeige alle Kanäle"
 
-#: src/resources/simplelist.py:266 src/resources/simplelist.py:289
+#: src/resources/simplelist.py:262 src/resources/simplelist.py:285
 #, python-brace-format
 msgid "Show \"{0}\" channels"
 msgstr "Zeige \"{0}\" Kanäle"
 
-#: src/resources/simplelist.py:449
+#: src/resources/simplelist.py:442
 msgid "Error: No valid option in playlist"
 msgstr "Fehler: Keine gültige Option in der Playlist"
 
-#: src/resources/simplelist.py:463
+#: src/resources/simplelist.py:456
 msgid "Error: No valid playlist"
 msgstr "Fehler: Keine gültige Playlist"
 
-#: src/resources/simplelist.py:467
+#: src/resources/simplelist.py:460
 msgid "Can't download playlist"
 msgstr "Kann Playlist nicht downloaden"
 
-#: src/resources/simplelist.py:487 src/resources/simplelist.py:491
-msgid ""
-"If you want to play this stream, you have to activate the HLS-Player in the "
-"MP-Setup"
-msgstr ""
-"Wenn dieser Stream abgespielt werden soll, muss der HLS-Player im MP-Setup "
-"aktiviert werden"
+#: src/resources/simplelist.py:478
+msgid "Stream not supported."
+msgstr "Stream wird nicht unterstützt."
 
-#: src/resources/simplelist.py:508 src/resources/simplelist.py:683
-#: src/resources/simplelist.py:707 src/resources/simpleplayer.py:1808
-#: src/resources/simpleplayer.py:1815
+#: src/resources/simplelist.py:495 src/resources/simplelist.py:670
+#: src/resources/simplelist.py:694 src/resources/simpleplayer.py:1728
+#: src/resources/simpleplayer.py:1735
 msgid "Yes"
 msgstr "Ja"
 
-#: src/resources/simplelist.py:511
+#: src/resources/simplelist.py:498
 #, python-brace-format
 msgid "OK to overwrite \"{0}\" playlist?"
 msgstr "OK um Playlist \"{0}\" zu überschreiben?"
 
-#: src/resources/simplelist.py:515
+#: src/resources/simplelist.py:502
 msgid "Return"
 msgstr "Zurück"
 
-#: src/resources/simplelist.py:570
+#: src/resources/simplelist.py:557
 #, python-brace-format
 msgid "Playlist \"{0}\" copied."
 msgstr "Playlist \"{0}\" kopiert."
 
-#: src/resources/simplelist.py:572
+#: src/resources/simplelist.py:559
 #, python-brace-format
 msgid "Can't copy \"{0}\" playlist"
 msgstr "Kann Playlist \"{0}\" nicht kopieren"
 
-#: src/resources/simplelist.py:668
+#: src/resources/simplelist.py:655
 msgid "IPTV Genre Selection"
 msgstr "IPTV Genre Auswahl"
 
-#: src/resources/simplelist.py:687
+#: src/resources/simplelist.py:674
 #, python-brace-format
 msgid "Overwrite \"{0}\" with the MP playlist?"
 msgstr "\"{0}\" mit der MP Playlist überschreiben?"
 
-#: src/resources/simplelist.py:689
+#: src/resources/simplelist.py:676
 #, python-brace-format
 msgid "No MP playlist \"{0}\" found"
 msgstr "Keine MP Playlist \"{0}\" gefunden"
 
-#: src/resources/simplelist.py:697
+#: src/resources/simplelist.py:684
 #, python-brace-format
 msgid "Playlist \"{0}\" successfully updated"
 msgstr "Playlist \"{0}\" erfolgreich aktualisiert"
 
-#: src/resources/simplelist.py:699
+#: src/resources/simplelist.py:686
 #, python-brace-format
 msgid "Can't update \"{0}\" playlist"
 msgstr "Kann Playlist \"{0}\" nicht aktualisieren"
 
-#: src/resources/simplelist.py:711
+#: src/resources/simplelist.py:698
 #, python-brace-format
 msgid "OK to delete \"{0}\" playlist?"
 msgstr "OK um Playlist \"{0}\" zu löschen?"
 
-#: src/resources/simplelist.py:723
+#: src/resources/simplelist.py:710
 #, python-brace-format
 msgid "Can't delete \"{0}\" playlist"
 msgstr "Kann Playlist \"{0}\" nicht löschen"
 
-#: src/resources/simplelist.py:732
+#: src/resources/simplelist.py:719
 msgid "SimpleList Configuration"
 msgstr "SimpleList Konfiguration"
 
-#: src/resources/simplelist.py:735
+#: src/resources/simplelist.py:722
 msgid "Global playlist number"
 msgstr "Globale Playlist-Nummer"
 
-#: src/resources/simplelist.py:736
+#: src/resources/simplelist.py:723
 msgid "Google coversupport"
 msgstr "Google Cover aktivieren"
 
-#: 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:633
+#: src/resources/simpleplayer.py:557
 msgid "Resuming playback"
 msgstr "Fortsetzen der Wiedergabe"
 
-#: src/resources/simpleplayer.py:635
+#: src/resources/simpleplayer.py:559
 msgid "Do you want to resume this playback?"
 msgstr "Soll diese Wiedergabe fortgesetzt werden?"
 
-#: src/resources/simpleplayer.py:635
+#: src/resources/simpleplayer.py:559
 #, python-format
 msgid "Resume position at %s"
 msgstr "Wiederaufnahmeposition bei %s"
 
-#: src/resources/simpleplayer.py:714
+#: src/resources/simpleplayer.py:638
 msgid "to Player"
 msgstr "zum Player"
 
-#: src/resources/simpleplayer.py:717
+#: src/resources/simpleplayer.py:641
 msgid "Playmode"
 msgstr "Abspielmodus"
 
-#: src/resources/simpleplayer.py:1247
+#: src/resources/simpleplayer.py:1167
 msgid "Tuning..."
 msgstr "Tune..."
 
-#: src/resources/simpleplayer.py:1250
+#: src/resources/simpleplayer.py:1170
 msgid "Connecting..."
 msgstr "Verbinde..."
 
-#: src/resources/simpleplayer.py:1253
+#: src/resources/simpleplayer.py:1173
 msgid "Please wait!"
 msgstr "Bitte warten!"
 
-#: src/resources/simpleplayer.py:1256
+#: src/resources/simpleplayer.py:1176
 msgid "Reconnecting..."
 msgstr "Verbinde neu..."
 
-#: src/resources/simpleplayer.py:1431 src/resources/simpleplayer.py:1440
+#: src/resources/simpleplayer.py:1351 src/resources/simpleplayer.py:1360
 #, python-format
 msgid "This STB can't decode %s streams!"
 msgstr "Diese STB kann %s Streams nicht wiedergeben!"
 
-#: src/resources/simpleplayer.py:1460
+#: src/resources/simpleplayer.py:1380
 #, python-format
 msgid "Streaming error: %s"
 msgstr "Streaming Fehler: %s"
 
-#: src/resources/simpleplayer.py:1492
+#: src/resources/simpleplayer.py:1412
 msgid "Buffering..."
 msgstr "Puffern..."
 
-#: src/resources/simpleplayer.py:1809
+#: src/resources/simpleplayer.py:1729
 #, python-format
 msgid "Yes & Add Service to global Playlist-%02d"
 msgstr "Ja & Service zur globalen Playlist-%02d hinzufügen"
 
-#: src/resources/simpleplayer.py:1811 src/resources/simpleplayer.py:1817
+#: src/resources/simpleplayer.py:1731 src/resources/simpleplayer.py:1737
 msgid "No, but start over from the beginning"
 msgstr "Nein, aber von Anfang an neu beginnen"
 
-#: src/resources/simpleplayer.py:1820
+#: src/resources/simpleplayer.py:1740
 msgid "Stop playing this movie?"
 msgstr "Wiedergabe dieses Films stoppen?"
 
-#: src/resources/simpleplayer.py:1978
+#: src/resources/simpleplayer.py:1898
 msgid "No entries in the playlist available!"
 msgstr "Keine Einträge in der Playlist vorhanden!"
 
-#: src/resources/simpleplayer.py:2060
+#: src/resources/simpleplayer.py:1980
 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:2074
+#: src/resources/simpleplayer.py:1994
 msgid "Error: URL is not persistent!"
 msgstr "Fehler: URL ist nicht persistent!"
 
-#: src/resources/simpleplayer.py:2080
+#: src/resources/simpleplayer.py:2000
 msgid "Added entry"
 msgstr "Eintrag hinzugefügt"
 
-#: src/resources/simpleplayer.py:2082
+#: src/resources/simpleplayer.py:2002
 msgid "Entry already exists"
 msgstr "Eintrag schon vorhanden"
 
-#: src/resources/simpleplayer.py:2084
+#: src/resources/simpleplayer.py:2004
 msgid "Error!"
 msgstr "Fehler!"
 
-#: src/resources/simpleplayer.py:2258 src/resources/simpleplayer.py:2259
+#: src/resources/simpleplayer.py:2178 src/resources/simpleplayer.py:2179
 msgid "SimplePlayer Setup"
 msgstr "SimplePlayer Einstellungen"
 
-#: src/resources/simpleplayer.py:2277
+#: src/resources/simpleplayer.py:2197
 msgid "Global playlist number:"
 msgstr "Globale Playlist-Nummer:"
 
-#: src/resources/simpleplayer.py:2278
+#: src/resources/simpleplayer.py:2198
 msgid "Playmode:"
 msgstr "Abspielmodus:"
 
-#: src/resources/simpleplayer.py:2281
+#: src/resources/simpleplayer.py:2201
 msgid "Buffersize (in seconds):"
 msgstr "Puffergröße (in Sekunden):"
 
-#: src/resources/simpleplayer.py:2282
+#: src/resources/simpleplayer.py:2202
 msgid "Save resume cache in flash memory:"
 msgstr "Speichere Wiederaufnahme-Cache im Flashspeicher:"
 
-#: src/resources/simpleplayer.py:2283
+#: src/resources/simpleplayer.py:2203
 msgid "Behavior on movie start:"
 msgstr "Verhalten bei Filmstart:"
 
-#: src/resources/simpleplayer.py:2284
+#: src/resources/simpleplayer.py:2204
 msgid "Behavior on movie stop:"
 msgstr "Verhalten bei Filmstopp:"
 
-#: src/resources/simpleplayer.py:2285
+#: src/resources/simpleplayer.py:2205
 msgid "Behavior on movie end:"
 msgstr "Verhalten bei Filmende:"
 
-#: src/resources/simpleplayer.py:2286
+#: src/resources/simpleplayer.py:2206
 msgid "Seekbar sensibility:"
 msgstr "Suchleistenempfindlichkeit:"
 
-#: src/resources/simpleplayer.py:2287
+#: src/resources/simpleplayer.py:2207
 msgid "Infobar cover always off:"
 msgstr "Infobar-Coveranzeige immer aus:"
 
-#: src/resources/simpleplayer.py:2288
+#: src/resources/simpleplayer.py:2208
 msgid "Use SP number seek:"
 msgstr "Verwende SP Nummernsuche:"
 
-#: src/resources/simpleplayer.py:2305
+#: src/resources/simpleplayer.py:2225
 msgid "RADIO"
 msgstr "RADIO"
 
-#: src/resources/simpleplayer.py:2306
+#: src/resources/simpleplayer.py:2226
 msgid "Radio cover:"
 msgstr "Radio-Cover:"
 
-#: src/resources/simpleplayer.py:2307
+#: src/resources/simpleplayer.py:2227
 msgid "Radio visualization:"
 msgstr "Radio-Visualisierung:"
 
-#: src/resources/simpleplayer.py:2308
+#: src/resources/simpleplayer.py:2228
 msgid "Radio screensaver:"
 msgstr "Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2309
+#: src/resources/simpleplayer.py:2229
 msgid "Radio screensaver keywords:"
 msgstr "Schlüsselwörter für den Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2339 src/resources/simpleplayer.py:2340
+#: src/resources/simpleplayer.py:2259 src/resources/simpleplayer.py:2260
 msgid "SimplePlayer Menu"
 msgstr "SimplePlayer Menü"
 
-#: src/resources/simpleplayer.py:2354
+#: src/resources/simpleplayer.py:2274
 #, python-format
 msgid "Add service to global playlist-%02d"
 msgstr "Füge Service zu globaler Playlist-%02d hinzu"
 
-#: src/resources/simpleplayer.py:2356
+#: src/resources/simpleplayer.py:2276
 #, python-format
 msgid "Open global playlist-%02d"
 msgstr "Öffne globale Playlist-%02d"
 
-#: src/resources/simpleplayer.py:2358
+#: src/resources/simpleplayer.py:2278
 msgid "Open local playlist"
 msgstr "Öffne lokale Playlist"
 
-#: src/resources/simpleplayer.py:2360
+#: src/resources/simpleplayer.py:2280
 msgid "A/V Settings"
 msgstr "A/V Einstellungen"
 
-#: src/resources/simpleplayer.py:2362
+#: src/resources/simpleplayer.py:2282
 msgid "Advanced Audio Settings"
 msgstr "Erweiterte Audioeinstellungen"
 
-#: src/resources/simpleplayer.py:2363
+#: src/resources/simpleplayer.py:2283
 msgid "Mainmenu"
 msgstr "Hauptmenü"
 
-#: src/resources/simpleplayer.py:2431
+#: src/resources/simpleplayer.py:2351
 #, python-format
 msgid ""
 "The directory path does not end with '/':\n"
@@ -2946,7 +2894,7 @@ msgstr ""
 "Der Verzeichnispfad endet nicht mit '/':\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2432
+#: src/resources/simpleplayer.py:2352
 #, python-format
 msgid ""
 "File with the same name exists in the directory path:\n"
@@ -2955,7 +2903,7 @@ msgstr ""
 "Datei mit gleichen Namen im Verzeichnispfad vorhanden:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2433
+#: src/resources/simpleplayer.py:2353
 #, python-format
 msgid ""
 "The missing directory:\n"
@@ -2964,7 +2912,7 @@ msgstr ""
 "Das fehlende Verzeichnis:\n"
 "%s konnte nicht angelegt werden!"
 
-#: src/resources/simpleplayer.py:2434
+#: src/resources/simpleplayer.py:2354
 #, python-format
 msgid ""
 "The directory path:\n"
@@ -2973,7 +2921,7 @@ msgstr ""
 "Der Verzeichnispfad:\n"
 "%s ist nicht vorhanden!"
 
-#: src/resources/simpleplayer.py:2435
+#: src/resources/simpleplayer.py:2355
 #, python-format
 msgid ""
 "There exists already a directory with this name:\n"
@@ -2982,7 +2930,7 @@ msgstr ""
 "Es existiert schon ein Verzeichnis mit diesem Namen:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2436
+#: src/resources/simpleplayer.py:2356
 #, python-format
 msgid ""
 "The path is OK, the file name was not specified:\n"
@@ -2991,7 +2939,7 @@ msgstr ""
 "Der Pfad ist i.O., der Dateiname wurde nicht angegeben:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2437
+#: src/resources/simpleplayer.py:2357
 #, python-format
 msgid ""
 "The directory path and file name is OK:\n"
@@ -3000,11 +2948,11 @@ msgstr ""
 "Der Verzeichnispfad & Dateiname ist i.O.:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2438
+#: src/resources/simpleplayer.py:2358
 msgid "The directory path is not specified!"
 msgstr "Der Verzeichnispfad wurde nicht angegeben!"
 
-#: src/resources/simpleplayer.py:2439
+#: src/resources/simpleplayer.py:2359
 #, python-format
 msgid ""
 "Symbolic link with the same name in the directory path:\n"
@@ -3013,7 +2961,7 @@ msgstr ""
 "Symbolischer Link mit gleichen Namen im Verzeichnispfad:\n"
 "%s vorhanden!"
 
-#: src/resources/simpleplayer.py:2440
+#: src/resources/simpleplayer.py:2360
 #, python-format
 msgid ""
 "The directory path does not begin with '/':\n"
index 0fcfbb9..2d722d2 100644 (file)
@@ -154,7 +154,7 @@ config_mp.mediaportal = ConfigSubsection()
 config_mp.mediaportal.fake_entry = NoSave(ConfigNothing())
 
 # Allgemein
-config_mp.mediaportal.version = NoSave(ConfigText(default="2020010101"))
+config_mp.mediaportal.version = NoSave(ConfigText(default="2020010801"))
 config_mp.mediaportal.autoupdate = ConfigYesNo(default = True)
 
 config_mp.mediaportal.skinfail = ConfigYesNo(default = False)
@@ -211,9 +211,6 @@ elif mp_globals.videomode == 2 and not mp_globals.isDreamOS:
        config_mp.mediaportal.ansicht = ConfigSelectionExt(default = "liste", choices = [("liste", _("List"))])
 else:
        config_mp.mediaportal.ansicht = ConfigSelectionExt(default = "wall", choices = [("wall", _("Wall")), ("liste", _("List"))])
-config_mp.mediaportal.hlsp_enable = ConfigYesNo(default = True)
-config_mp.mediaportal.hls_proxy_ip = ConfigIP(default = [127,0,0,1], auto_jump = True)
-config_mp.mediaportal.hls_proxy_port = ConfigInteger(default = 0, limits = (0,65535))
 config_mp.mediaportal.storagepath = ConfigText(default="/tmp/mediaportal/tmp/", fixed_size=False)
 config_mp.mediaportal.iconcachepath = ConfigText(default="/media/hdd/mediaportal/", fixed_size=False)
 config_mp.mediaportal.autoplayThreshold = ConfigInteger(default = 50, limits = (1,100))
@@ -262,11 +259,6 @@ config_mp.mediaportal.yt_proxy_username = ConfigText(default="user!", fixed_size
 config_mp.mediaportal.yt_proxy_password = ConfigPassword(default="pass!", fixed_size=False)
 config_mp.mediaportal.yt_proxy_host = ConfigText(default = "example_proxy.com!", fixed_size = False)
 config_mp.mediaportal.yt_proxy_port = ConfigInteger(default = 8080, limits = (0,65535))
-config_mp.mediaportal.hlsp_proxy_username = ConfigText(default="user!", fixed_size=False)
-config_mp.mediaportal.hlsp_proxy_password = ConfigPassword(default="pass!", fixed_size=False)
-config_mp.mediaportal.hlsp_proxy_host = ConfigText(default = "example_proxy.com!", fixed_size = False)
-config_mp.mediaportal.hlsp_proxy_port = ConfigInteger(default = 8080, limits = (0,65535))
-config_mp.mediaportal.sp_use_hlsp_with_proxy = ConfigSelectionExt(default = "no", choices = [("no", _("No")), ("always", "Use it always"), ("plset", "Set in the playlist")])
 
 # premiumize.me
 config_mp.mediaportal.premiumize_use = ConfigYesNo(default = False)
@@ -293,8 +285,6 @@ config_mp.mediaportal.is_radio = ConfigYesNo(default=False)
 
 mp_globals.yt_a_backup = bsdcd(bsdcd(bsdcd(decrypt('kj8yV97e3t4fDPdo3ca07O6kKsuY9oZkvUqpBPJPkvzRYyzeAuLofAra3HKWsJmhvQ8EsGMDfnziGjqj3047WS8bojGewMj+in3daO4hlTSA6GUSwft7LNFdibC0hxTppR1VLXaRvKs=', CONFIG, 256))))
 mp_globals.yt_a = bsdcd(bsdcd(bsdcd(decrypt('UZaWW4SEhITpj4ekRW9S5/qupnllwhRtf/E+k6BPucAMPts9j6xKJy3M1asKr3H0enK1QKFMvP03B4TW3vmWlKoZC9nKU1SY+rAHh+D/X3g0GyhgaRZKh0+mRaOrbnl8c7jfeYEHgU8=', CONFIG, 256))))
-mp_globals.yt_i = bsdcd(bsdcd(bsdcd(decrypt('9ZKWW7W1tbVrxwsoRtc68/x46WsllFgLly3gXAz9y30Kb3u8wQDv8IkMeEhBLq6qmIVUnRR4vDmhyKaEI+yXGKYbP6uSyF1VIml94KxsPWYbgZ1jjBY8poOZAJJlqevbmo5e+jhzSZD/yiSJZB++WB7Qu6w4uHyccvAROJJdugm+sNhmyMGn74pTzYVtvetM9qJBNd3ddSYS/8qagLVxmJa0ahrVsJxVDFEQf0JeQtjGq/+j21YpZUiF+LQ9BzT8dq8p1J5YGBlzXvrDXpBWpcFMorw=', CONFIG, 256))))
-mp_globals.yt_s = bsdcd(bsdcd(bsdcd(decrypt('9ZKWW8/Pz88jw+viDYpexb2691qucHXmNFnpAi7jmw0ElKgz8ecT5Xk4JEJlopqhHedBLa1g5g0DVl4ViAy14V+BLwjFRyHAmFnk29HqtedGRKgNZA2GT2cPGLhO8P/rtV+FQfqdaQA=', CONFIG, 256))))
 mp_globals.bdmt = bsdcd(bsdcd(bsdcd(decrypt('Q8fFWGdnZ2djFfvOea2AHqS5bqR9nO0b8bxJ433nOffxa5nD1ELvd/Nm9sdojTjgz0knJTFI2jl0RYrtf4c5YnqSS3hkiq+CjpnV3uQG4Kr5wZZ91zKE3A==', CONFIG, 256))))
 
 # Global variable
@@ -310,10 +300,6 @@ try:
        MPYoutubeUriResolver.instance = MPYoutubeUriResolver()
        eUriResolver.addResolver(MPYoutubeUriResolver.instance)
 
-       from resources.MPHLSPUriResolver import MPHLSPUriResolver
-       MPHLSPUriResolver.instance = MPHLSPUriResolver()
-       eUriResolver.addResolver(MPHLSPUriResolver.instance)
-
        from resources.MPEuronewsUriResolver import MPEuronewsUriResolver
        MPEuronewsUriResolver.instance = MPEuronewsUriResolver()
        eUriResolver.addResolver(MPEuronewsUriResolver.instance)
@@ -570,15 +556,6 @@ class MPSetup(Screen, CheckPremiumize, ConfigListScreenExt):
                self.configlist.append(getConfigListEntry(_("Auto hide adult section on startup:"), config_mp.mediaportal.hideporn_startup,False))
                self._spacer()
                self.configlist.append(getConfigListEntry(_("OTHER"), ))
-               #self.configlist.append(getConfigListEntry(_("Use HLS-Player:"), config_mp.mediaportal.hlsp_enable, True))
-               #if config_mp.mediaportal.hlsp_enable.value:
-               #self.configlist.append(getConfigListEntry(_("HLS-Player IP:"), config_mp.mediaportal.hls_proxy_ip, False))
-               #self.configlist.append(getConfigListEntry(_("HLS-Player Port:"), config_mp.mediaportal.hls_proxy_port, False))
-               self.configlist.append(getConfigListEntry(_('Use HLS-Player Proxy:'), config_mp.mediaportal.sp_use_hlsp_with_proxy, False))
-               self.configlist.append(getConfigListEntry(_("HLSP-HTTP-Proxy Host or IP:"), config_mp.mediaportal.hlsp_proxy_host, False))
-               self.configlist.append(getConfigListEntry(_("HLSP-Proxy Port:"), config_mp.mediaportal.hlsp_proxy_port, False))
-               self.configlist.append(getConfigListEntry(_("HLSP-Proxy username:"), config_mp.mediaportal.hlsp_proxy_username, False))
-               self.configlist.append(getConfigListEntry(_("HLSP-Proxy password:"), config_mp.mediaportal.hlsp_proxy_password, False))
                self.configlist.append(getConfigListEntry(_("Temporary Cachepath:"), config_mp.mediaportal.storagepath, False))
                self.configlist.append(getConfigListEntry(_("Icon Cachepath:"), config_mp.mediaportal.iconcachepath, False))
                self.configlist.append(getConfigListEntry(_("Videoquality:"), config_mp.mediaportal.videoquali_others, False))
@@ -3312,7 +3289,7 @@ class MPSummary(Screen):
 
                self["cover"] = Pixmap()
 
-               self.skin = '''<screen name="MPScreenSummary" backgroundColor="#00000000" position="''' + disp_pos + '''" size="''' + disp_size  + '''"''' + disp_id + '''>
+               self.skin = '''<screen name="MPSummary" backgroundColor="#00000000" position="''' + disp_pos + '''" size="''' + disp_size  + '''"''' + disp_id + '''>
                                <widget name="cover" position="center,center" size="''' + disp_size + '''" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png" transparent="1" alphatest="blend" />
                                </screen>'''
 
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/MPHLSPUriResolver.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/MPHLSPUriResolver.py
deleted file mode 100644 (file)
index 210b612..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  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.
-#
-#######################################################################################################
-
-try:
-       from enigma import eServiceReference, eUriResolver, StringList
-       from simpleplayer import M3U8Player
-       from imports import *
-       import mp_globals
-
-       from Tools.Log import Log
-
-       class MPHLSPUriResolver(eUriResolver, M3U8Player):
-
-               _schemas = ("mp_hlsproxy", "mp_hlsp")
-               instance = None
-
-               def __init__(self):
-                       eUriResolver.__init__(self, StringList(self._schemas))
-                       M3U8Player.__init__(self)
-                       Log.i(self._schemas)
-
-               def _getBandwidth(self):
-                       videoPrio = int(config_mp.mediaportal.videoquali_others.value)
-                       if videoPrio == 2:
-                               bw = 4000000
-                       elif videoPrio == 1:
-                               bw = 1000000
-                       else:
-                               bw = 250000
-                       return bw
-
-               def resolve(self, service, uri):
-                       Log.i(uri)
-                       uri = uri.replace('mp_hlsproxy://','').replace('mp_hlsp://','')
-                       def onUrlReady(uri):
-                               try:
-                                       if not service.ptrValid():
-                                               Log.w("Service became invalid!")
-                                               return
-                                       if uri:
-                                               self._bitrate = self._getBandwidth()
-                                               path = config_mp.mediaportal.storagepath.value
-                                               ip = "127.0.0.1" #".".join(str(x) for x in config_mp.mediaportal.hls_proxy_ip.value)
-                                               import uuid
-                                               uid = uuid.uuid1()
-                                               uri = 'http://%s:%d/?url=%s&bitrate=%d&path=%s&uid=%s' % (ip, mp_globals.hls_proxy_port, uri, self._bitrate, path, uid)
-                                               service.setResolvedUri(uri, eServiceReference.idGST)
-                                       else:
-                                               service.failedToResolveUri()
-                               except:
-                                       service.failedToResolveUri()
-
-                       onUrlReady(uri)
-
-                       return True
-
-except ImportError:
-       pass
\ No newline at end of file
index 0fecacf..7034fd4 100644 (file)
@@ -10,7 +10,7 @@ def mixdrop(self, data):
                        sJavascript = get_packedjava[0]
                        sUnpacked = unpack(sJavascript)
                        if sUnpacked:
-                               stream_url = re.search('MDCore.vsrc="(.*?)";', sUnpacked, re.S)
+                               stream_url = re.search('MDCore.vsrc\d{0,1}="(.*?)";', sUnpacked, re.S)
                                if stream_url:
                                        url = stream_url.group(1)
                                        if url .startswith('//'):
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp.py
deleted file mode 100644 (file)
index 3507508..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-# -*- coding: utf-8 -*-
-#    HLS-Player for MediaPortal
-#
-#    Copyright (c) 2015 Billy2011, MediaPortal Team
-#
-# Copyright (C) 2009-2010 Fluendo, S.L. (www.fluendo.com).
-# Copyright (C) 2009-2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
-# Copyright (C) 2010 Zaheer Abbas Merali  <zaheerabbas at merali dot org>
-# Copyright (C) 2010 Andoni Morales Alastruey <ylatuya@gmail.com>
-# Copyright (C) 2014 Juan Font Alonso <juanfontalonso@gmail.com>
-
-# This file may be distributed and/or modified under the terms of
-# the GNU General Public License version 2 as published by
-# the Free Software Foundation.
-# This file is distributed without any warranty; without even the implied
-# warranty of merchantability or fitness for a particular purpose.
-# See "LICENSE" in the source distribution for more information.
-
-import os
-import urllib
-
-from twisted.web import server, resource, version
-from twisted.web.server import NOT_DONE_YET
-from twisted.internet import reactor, defer
-from socket import has_ipv6
-from Tools.Directories import fileExists
-
-from enigma import eBackgroundFileEraser, eTimer
-
-import mp_globals
-from debuglog import printl
-from mp_hlsp_fetcher import HLSFetcher
-from mp_hlsp_httpplayer import GSTPlayer
-from twagenthelper import twAgentGetPage
-
-class HLSControler:
-
-       def __init__(self, fetcher=None):
-               self.fetcher = fetcher
-               self.player = None
-               self._check_playing = False
-
-               self._player_sequence = None
-               self._n_segments_keep = None
-               self.checkTimer = eTimer()
-               self.hangTimer = eTimer()
-               if mp_globals.isDreamOS:
-                       self.checkTimer_conn = self.checkTimer.timeout.connect(self.checkPlaying)
-                       self.hangTimer_conn = self.hangTimer.timeout.connect(self.hangcheck)
-               else:
-                       self.checkTimer.callback.append(self.checkPlaying)
-                       self.hangTimer.callback.append(self.hangcheck)
-
-       def set_player(self, player):
-               self.player = player
-               if player:
-                       self.player.connect_about_to_finish(self.on_player_about_to_finish)
-                       self.player.connect_about_to_play(self.on_player_about_to_play)
-                       self._n_segments_keep = self.fetcher.n_segments_keep
-
-       def _start(self, first_file):
-               (path, l, f) = first_file
-               self._player_sequence = f['sequence']
-               if self.player:
-                       self.player.set_uri((path, False))
-                       self.player.play()
-
-       def start(self):
-               self.hangTimer.start(1000, False)
-               if self.fetcher:
-                       d = self.fetcher.start()
-                       d.addCallback(self._start)
-
-       def _set_next_uri(self):
-               if self._n_segments_keep != -1:
-                       self.fetcher.delete_cache(lambda x:
-                               x <= self._player_sequence - self._n_segments_keep)
-               self._player_sequence += 1
-               d = self.fetcher.get_file(self._player_sequence)
-               d.addCallback(self.player.set_uri)
-
-       def on_player_about_to_finish(self):
-               reactor.callLater(0, self._set_next_uri)
-
-       def clientFinished(self, result, err=False):
-               self._check_playing = True
-               self.player.stop()
-               self.hangTimer.stop()
-               self.checkTimer.start(3000, True)
-
-       def on_player_about_to_play(self):
-               self._check_playing = False
-
-       def hangcheck(self):
-               twAgentGetPage('http://127.0.0.1', timeout=1)
-
-       def checkPlaying(self):
-               if self._check_playing:
-                       if self.player:
-                               if (not self.player._playing and not self.player._seeking) or not self.player._request:
-                                       self.fetcher.stop()
-                                       self.player.finishPlayer(self.player._request)
-                                       self.player = None
-                       elif self.fetcher:
-                               self.fetcher.stop()
-
-class HLSProxy(resource.Resource):
-       isLeaf = True
-       players = {}
-
-       def render_GET(self, request):
-               options = self.getOptions(request)
-               d = defer.succeed(request)
-               d.addCallback(self.getUrl, options)
-               if 'uid' in request.args:
-                       uuid = request.args['uid'][0]
-                       if len(uuid) != 36: uuid = None
-               else:
-                       uuid = None
-               d.addCallback(self.setupHLSPlayer, uuid, request, options)
-               d.addErrback(self.reqError, request)
-               return NOT_DONE_YET
-
-       def setupHLSPlayer(self, url, uuid, request, options):
-               if uuid and url:
-                       if not self.players.has_key(uuid):
-                               self.players.clear()
-                               c = HLSControler(HLSFetcher(url, **options))
-                               p = GSTPlayer(request, keep=options.get('keep',3))
-                               self.players[uuid] = p
-                               p_infos = {}
-                               p_infos['controller'] = c
-                               p_infos['seek_cache'] = []
-                               p.initProxyInfos(p_infos)
-                               request.notifyFinish().addCallback(c.clientFinished).addErrback(c.clientFinished, True)
-                               c.set_player(p)
-                               c.start()
-                       else:
-                               p = self.players[uuid]
-                               request.setHeader('Content-Type', 'video/MP4')
-                               request.notifyFinish().addCallback(p._proxy_infos['controller'].clientFinished).addErrback(p._proxy_infos['controller'].clientFinished, True)
-                               p.doSeek(request)
-               else:
-                       raise Exception("No HLS-URL or UID in request args!")
-
-       def getOptions(self, request):
-               options = {}
-               if 'bitrate' in request.args:
-                       options['bitrate'] = int(request.args['bitrate'][0])
-               if 'path' in request.args:
-                       options['path'] = request.args['path'][0]
-               if 'referer' in request.args:
-                       options['referer'] = request.args['referer'][0]
-               if 'keep' in request.args:
-                       options['keep'] = int(request.args['keep'][0])
-               if 'buffer' in request.args:
-                       options['buffer'] = int(request.args['buffer'][0])
-               if 'headers' in request.args:
-                       options['headers'] = eval(urllib.unquote(request.args['headers'][0]))
-               if 'purl' in request.args:
-                       options['purl'] = request.args['purl'][0]
-                       options['puser'] = request.args['puser'][0]
-                       options['ppass'] = request.args['ppass'][0]
-               return options
-
-       def getUrl(self, request, options):
-               try:
-                       url = request.args['url'][0]
-               except:
-                       raise Exception('No HLS-URL in request args!')
-               else:
-                       return url
-
-       def reqError(self, err, request):
-               printl('[HLSProxy] Error:\n'+str(err),self,'E')
-               if not request._disconnected:
-                       request.setResponseCode(400)
-                       request.write(str(err))
-                       request.finish()
-               return NOT_DONE_YET
-
-site = server.Site(HLSProxy())
-server_port = None
-
-def start_hls_proxy():
-       global server_port
-       if server_port == None:
-               port = 0
-               if has_ipv6 and fileExists('/proc/net/if_inet6') and version.major >= 12:
-                       server_port = reactor.listenTCP(port, site, interface='::')
-               else:
-                       server_port = reactor.listenTCP(port, site)
-               mp_globals.hls_proxy_port = server_port.getHost().port
-               print 'Started HLS-Proxy on port '+str(mp_globals.hls_proxy_port)
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_fetcher.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_fetcher.py
deleted file mode 100644 (file)
index 1eeb38e..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-#    Copyright (c) 2015 Billy2011, MediaPortal Team
-#
-# Copyright (C) 2009-2010 Fluendo, S.L. (www.fluendo.com).
-# Copyright (C) 2009-2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
-
-# This file may be distributed and/or modified under the terms of
-# the GNU General Public License version 2 as published by
-# the Free Software Foundation.
-# This file is distributed without any warranty; without even the implied
-# warranty of merchantability or fitness for a particular purpose.
-# See "LICENSE" in the source distribution for more information.
-
-from itertools import ifilter
-import logging
-import os, os.path
-import tempfile
-import urlparse
-from Crypto.Cipher import AES
-import struct
-from cookielib import CookieJar
-import urllib
-from time import time
-import math
-
-from twisted.python import log
-from twisted.internet import defer, reactor, task
-from twisted.internet.task import deferLater
-from twagenthelper import twAgentGetPage, TwHTTP11PoolHelper
-from imports import getUserAgent
-
-from enigma import eBackgroundFileEraser
-
-from mp_hlsp_m3u8 import M3U8
-from mp_hlsp_make_url import make_url
-
-class HLSFetcher(object):
-
-       def __init__(self, url, **options):
-
-               self.program = options.get('program',1)
-               self.hls_headers = options.get('headers',{})
-               self.path = options.get('path',None)
-               self.bitrate = options.get('bitrate',200000)
-               self.nbuffer = options.get('buffer',5)
-               self.n_segments_keep = options.get('keep',self.nbuffer+1)
-               url = urllib.unquote(url)
-               self.puser = options.get('puser')
-               self.ppass = options.get('ppass')
-               self.purl = options.get('purl')
-
-               us = url.split('|')
-               if len(us) > 1:
-                       self.url = us[0]
-                       for hd in us[1:]:
-                               self.hls_headers.update(dict(urlparse.parse_qsl(hd.strip())))
-               else:
-                       self.url = url
-
-               self.agent = self.hls_headers.pop('User-Agent', getUserAgent())
-               if not self.path:
-                       self.path = tempfile.mkdtemp()
-
-               self._program_playlist = None
-               self._file_playlist = None
-               self._cookies = CookieJar()
-               self._cached_files = {}         # sequence n -> path
-               self._run = True
-               self._poolHelper = TwHTTP11PoolHelper(retryAutomatically=True)
-
-               self._files = None                      # the iter of the playlist files download
-               self._next_download = None      # the delayed download defer, if any
-               self._file_playlisted = None # the defer to wait until new files are added to playlist
-               self._new_filed = None
-               self._seg_task = None
-
-       def _get_page(self, url):
-               url = url.encode("utf-8")
-               if 'HLS_RESET_COOKIES' in os.environ.keys():
-                       self._cookies.clear()
-
-               timeout = 10
-               return twAgentGetPage(url, agent=self.agent, cookieJar=self._cookies, headers=self.hls_headers, timeout=timeout, pool=self._poolHelper._pool, proxy_url=self.purl, p_user=self.puser, p_pass=self.ppass)
-
-       def _download_page(self, url, path, file):
-               def _decrypt(data):
-                       def num_to_iv(n):
-                               iv = struct.pack(">8xq", n)
-                               return b"\x00" * (16 - len(iv)) + iv
-
-                       if not self._file_playlist._iv:
-                               iv = num_to_iv(file['sequence'])
-                               aes = AES.new(self._file_playlist._key, AES.MODE_CBC, iv)
-                       else:
-                               aes = AES.new(self._file_playlist._key, AES.MODE_CBC, self._file_playlist._iv)
-                       return aes.decrypt(data)
-
-               d = self._get_page(url)
-               if self._file_playlist._key:
-                       d.addCallback(_decrypt)
-               return d
-
-       def _download_segment(self, f):
-               url = make_url(self._file_playlist.url, f['file'])
-               name = 'seg_' + next(tempfile._get_candidate_names())
-               path = os.path.join(self.path, name)
-               d = self._download_page(url, path, f)
-               if self.n_segments_keep != 0:
-                       file = open(path, 'wb')
-                       d.addCallback(lambda x: file.write(x))
-                       d.addBoth(lambda _: file.close())
-                       d.addCallback(lambda _: path)
-                       d.addErrback(self._got_file_failed)
-                       d.addCallback(self._got_file, url, f)
-               else:
-                       d.addCallback(lambda _: (None, path, f))
-               return d
-
-       def delete_cache(self, f):
-               bgFileEraser = eBackgroundFileEraser.getInstance()
-               keys = self._cached_files.keys()
-               for i in ifilter(f, keys):
-                       filename = self._cached_files[i]
-                       bgFileEraser.erase(str(filename))
-                       del self._cached_files[i]
-
-       def delete_all_cache(self):
-               bgFileEraser = eBackgroundFileEraser.getInstance()
-               for path in self._cached_files.itervalues():
-                       bgFileEraser.erase(str(path))
-               self._cached_files.clear()
-
-       def _got_file_failed(self, e):
-               if self._new_filed:
-                       self._new_filed.errback(e)
-                       self._new_filed = None
-
-       def _got_file(self, path, url, f):
-               self._cached_files[f['sequence']] = path
-               if self.n_segments_keep != -1:
-                       self.delete_cache(lambda x: x <= f['sequence'] - self.n_segments_keep)
-               if self._new_filed:
-                       self._new_filed.callback((path, url, f))
-                       self._new_filed = None
-               return (path, url, f)
-
-       def _get_next_file(self):
-               next = self._files.next()
-               if next:
-                       return self._download_segment(next)
-               elif not self._file_playlist.endlist():
-                       self._seg_task.stop()
-                       self._file_playlisted = defer.Deferred()
-                       self._file_playlisted.addCallback(lambda x: self._get_next_file())
-                       self._file_playlisted.addCallback(self._next_file_delay)
-                       self._file_playlisted.addCallback(self._seg_task.start)
-                       return self._file_playlisted
-
-       def _handle_end(self, failure):
-               failure.trap(StopIteration)
-               print "End of media"
-
-       def _next_file_delay(self, f):
-               if f == None: return 0
-               delay = f[2]["duration"]
-               if self.nbuffer > 0:
-                       for i in range(0,self.nbuffer):
-                               if self._cached_files.has_key(f[2]['sequence'] - i):
-                                       return delay
-                       delay = 0
-               elif self._file_playlist.endlist():
-                       delay = 1
-               return delay
-
-       def _get_files_loop(self, res=None):
-               if not self._seg_task:
-                       self._seg_task = task.LoopingCall(self._get_next_file)
-               d = self._get_next_file()
-               if d != None:
-                       self._seg_task.stop()
-                       d.addCallback(self._next_file_delay)
-                       d.addCallback(self._seg_task.start)
-                       d.addErrback(self._handle_end)
-
-       def _playlist_updated(self, pl):
-               if pl and pl.has_programs():
-                       # if we got a program playlist, save it and start a program
-                       self._program_playlist = pl
-                       (program_url, _) = pl.get_program_playlist(self.program, self.bitrate)
-                       return self._reload_playlist(M3U8(program_url, self._cookies, self.hls_headers))
-               elif pl and pl.has_files():
-                       # we got sequence playlist, start reloading it regularly, and get files
-                       self._file_playlist = pl
-                       if not self._files:
-                               self._files = pl.iter_files()
-                       if not pl.endlist():
-                               reactor.callLater(pl.reload_delay(), self._reload_playlist, pl)
-                       if self._file_playlisted:
-                               self._file_playlisted.callback(pl)
-                               self._file_playlisted = None
-               else:
-                       raise Exception('Playlist has no valid content.')
-               return pl
-
-       def _got_playlist_content(self, content, pl):
-               if not pl.update(content) and self._run:
-                       # if the playlist cannot be loaded, start a reload timer
-                       d = deferLater(reactor, pl.reload_delay(), self._fetch_playlist, pl)
-                       d.addCallback(self._got_playlist_content, pl)
-                       return d
-               return pl
-
-       def _fetch_playlist(self, pl):
-               d = self._get_page(pl.url)
-               return d
-
-       def _reload_playlist(self, pl):
-               if self._run:
-                       d = self._fetch_playlist(pl)
-                       d.addCallback(self._got_playlist_content, pl)
-                       d.addCallback(self._playlist_updated)
-                       return d
-               else:
-                       return None
-
-       def get_file(self, sequence):
-               d = defer.Deferred()
-               keys = self._cached_files.keys()
-               try:
-                       endlist = sequence == self._file_playlist._end_sequence
-                       sequence = ifilter(lambda x: x >= sequence, keys).next()
-                       filename = self._cached_files[sequence]
-                       d.callback((filename, endlist))
-               except:
-                       d.addCallback(lambda x: self.get_file(sequence))
-                       self._new_filed = d
-                       keys.sort()
-               return d
-
-       def _start_get_files(self, x):
-               self._new_filed = defer.Deferred()
-               self._get_files_loop()
-               return self._new_filed
-
-       def start(self):
-               if self._run:
-                       self._files = None
-                       d = self._reload_playlist(M3U8(self.url, self._cookies, self.hls_headers))
-                       d.addCallback(self._start_get_files)
-                       return d
-
-       def stop(self):
-               self._run = False
-               self._poolHelper.close()
-               if self._seg_task != None:
-                       self._seg_task.stop()
-               if self._new_filed != None:
-                       self._new_filed.cancel()
-               reactor.callLater(1, self.delete_all_cache)
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_httpplayer.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_httpplayer.py
deleted file mode 100644 (file)
index 490ad49..0000000
+++ /dev/null
@@ -1,176 +0,0 @@
-# -*- coding: utf-8 -*-
-#    HTTP-Player for MediaPortal
-#
-#    Copyright (c) 2015 Billy2011, MediaPortal Team
-#
-# This file may be distributed and/or modified under the terms of
-# the GNU General Public License version 2 as published by
-# the Free Software Foundation.
-# This file is distributed without any warranty; without even the implied
-# warranty of merchantability or fitness for a particular purpose.
-# See "LICENSE" in the source distribution for more information.
-
-import os
-import Queue
-from twisted.web.server import NOT_DONE_YET
-from functools import partial
-
-from debuglog import printl
-
-CHUNK_SZ = 4096
-
-class GSTPlayer:
-
-       def __init__(self, request, keep=3):
-               self._playing = False
-               self._cb = None
-               self._pcb = None
-               self._request = request
-               self._streamqueue = Queue.Queue()
-               self.playerReady = True
-               self._proxy_infos = None
-               self._seeking = False
-               self._clean_seek_headers = False
-               self.set_seek_headers = False
-               self.bytes_sent = 0L
-               self.content_size = '*'
-
-       def initProxyInfos(self, infos):
-               self._proxy_infos = infos
-               self.bytes_sent = 0L
-
-       def doSeek(self, request):
-               self._seeking = True
-               self._request = request
-               if request.requestHeaders.hasHeader('range'):
-                       r_range = request.requestHeaders.getRawHeaders('range')[0].split('bytes=')[-1].split('-')[0]
-                       r_range = long(r_range)
-                       if r_range >= self.bytes_sent:
-                               self.bytes_sent = r_range
-                               request.setResponseCode(206)
-                               if not self._streamqueue.empty():
-                                       self.set_seek_headers
-                                       return self.sendSegm()
-                               else:
-                                       self._request.setHeader('Content-Range', 'bytes=%d-%d/%s' % (r_range, r_range-1, self.content_size))
-                                       self._request.write(b"")
-                                       if self.content_size == '*':
-                                               return self.play()
-                                       else:
-                                               self._seeking = False
-                                               return
-
-                       for item in self._proxy_infos['seek_cache']:
-                               c_range = range(item['bytes_range'], item['bytes_range'] + item['bytes_size'])
-                               if r_range in c_range:
-                                       request.setResponseCode(206)
-                                       self.set_seek_headers = True
-                                       return self.sendSegm(item, item['bytes_range'])
-
-                       self._seeking = False
-               else:
-                       self._seeking = False
-
-       def play(self):
-               print 'Play'
-               if self._seeking:
-                       self._seeking = False
-               self._playing = True
-               self._on_about_to_play
-
-       def stop(self):
-               self._playing = False
-               self._request = None
-               print 'Stop'
-
-       def set_uri(self, fpath):
-               if fpath[0]:
-                       self._streamqueue.put(fpath)
-               else:
-                       return
-
-               if self.playerReady:
-                       self.sendSegm()
-
-       def sendSegm(self, s_cache_item=None, r_range=None):
-               self.playerReady = endlist = False
-               while True:
-                       if s_cache_item != None:
-                               filepath = s_cache_item['filepath']
-                       else: filepath = ""
-
-                       if not self._request or (self._streamqueue.empty() and not s_cache_item):
-                               break
-                       if not filepath:
-                               filepath, endlist = self._streamqueue.get()
-                               if endlist:
-                                       self._request.setResponseCode(200)
-                                       self.set_seek_headers = True
-                       else:
-                               endlist = False
-                       try:
-                               size = os.path.getsize(filepath)
-                       except IOError, e:
-                               printl('File i/o error:'+str(e),self,'E')
-                               raise Exception(e)
-                               break
-                       else:
-                               with open(filepath, 'rb') as f:
-                                       count = 0
-                                       if self.set_seek_headers:
-                                               if r_range == None:
-                                                       bytes_range = self.bytes_sent
-                                               else: bytes_range = r_range
-                                               self._request.setHeader('Content-Range', 'bytes=%d-%d/*' % (bytes_range, bytes_range+size-1))
-                                               if endlist:
-                                                       self.content_size = str(bytes_range+size)
-                                               self._clean_seek_headers = True
-                                       elif self._clean_seek_headers:
-                                               self._request.removeHeader('Content-Range')
-                                               self._request.setResponseCode(200)
-                                               self._clean_seek_headers = False
-
-                                       self._request.write(f.read())
-                                       count = size
-
-                               if s_cache_item == None:
-                                       self._proxy_infos['seek_cache'].append({})
-                                       self._proxy_infos['seek_cache'][-1]['bytes_range'] = self.bytes_sent
-                                       if len(self._proxy_infos['seek_cache']) > 2:
-                                               del self._proxy_infos['seek_cache'][0]
-                                       self.bytes_sent += size
-                                       self._proxy_infos['seek_cache'][-1]['bytes_size'] = size
-                                       self._proxy_infos['seek_cache'][-1]['filepath'] = filepath
-                                       self._on_about_to_finish()
-                               else:
-                                       s_cache_item = None
-
-                               if self._seeking and not endlist:
-                                       self.play()
-               if endlist:
-                       self._request.finish()
-                       return NOT_DONE_YET
-               else:
-                       self.playerReady = True
-
-       def _on_about_to_finish(self, p=None):
-               if self._cb:
-                       self._cb()
-
-       def connect_about_to_finish(self, cb):
-               self._cb = cb
-
-       def connect_about_to_play(self, cb):
-               self._pcb = cb
-
-       def _on_about_to_play(self, p=None):
-               if self._pcb:
-                       self._pcb()
-
-       def finishPlayer(self,request):
-               print 'HLS-Player finished.'
-               self.stop()
-               self._seeking = False
-               if request and not request._disconnected:
-                       request.finish()
-                       return NOT_DONE_YET
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_m3u8.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_m3u8.py
deleted file mode 100644 (file)
index e191bf0..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-#    Copyright (c) 2015 Billy2011, MediaPortal Team
-#
-# Copyright (C) 2009-2010 Fluendo, S.L. (www.fluendo.com).
-# Copyright (C) 2009-2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
-
-# This file may be distributed and/or modified under the terms of
-# the GNU General Public License version 2 as published by
-# the Free Software Foundation.
-# This file is distributed without any warranty; without even the implied
-# warranty of merchantability or fitness for a particular purpose.
-# See "LICENSE" in the source distribution for more information.
-
-import logging
-import re
-import requests
-import urlparse
-import os
-import math
-from time import time
-
-from debuglog import printl
-
-class M3U8(object):
-
-       def __init__(self, url=None, cookies=None, headers=None):
-               self.url = url
-               self._cookies = cookies
-               self._headers = headers
-
-               self._programs = []             # main list of programs & bandwidth
-               self._files = {}                # the current program playlist
-               self._first_sequence = 0        # the first sequence to start fetching
-               self._last_sequence = 0         # the last sequence, to compute reload delay
-               self._reload_delay = 5          # the initial reload delay
-               self._update_tries = None       # the number consecutive reload tries
-               self._last_content = None
-               self._endlist = False           # wether the list ended and should not be refreshed
-               self.target_duration = None
-               self._encryption_method = None
-               self._key_url = None
-               self._key = None
-               self._iv = None
-               self._end_sequence = None
-               self.load_time = 0
-               self.version = 1
-               self._last_f = None
-
-       def endlist(self):
-               return self._endlist
-
-       def has_programs(self):
-               return len(self._programs) != 0
-
-       def get_target_dura(self):
-               return self.target_duration
-
-       def get_program_playlist(self, program_id=None, bitrate=None):
-               # return the (uri, dict) of the best matching playlist
-               if not self.has_programs():
-                       printl("PL has not programs!",self,'E')
-                       raise Exception('PL has not programs!')
-
-               _x, best = min((abs(int(x['BANDWIDTH']) - bitrate), x)
-                               for x in self._programs)
-               return best['uri'], best
-
-       def reload_delay(self):
-               # return the time between request updates, in seconds
-               if self._endlist or not self._last_sequence:
-                       raise Exception('ELST or nor LSEQ')
-
-               if self._update_tries == 0:
-                       ld = self._files[self._last_sequence]['duration']
-                       self._reload_delay = min(self.target_duration * 3, ld)
-                       d = max(0, self._reload_delay - self.load_time)
-               elif self._update_tries == 1:
-                       d = self._reload_delay * 0.5
-               elif self._update_tries == 2:
-                       d = self._reload_delay * 1.5
-               else:
-                       d = self._reload_delay * 3.0
-
-               return d
-
-       def has_files(self):
-               return len(self._files) != 0
-
-       def iter_files(self):
-               # return an iter on the playlist media files
-               if not self.has_files():
-                       return
-
-               if not self._endlist:
-                       current = max(self._first_sequence, self._last_sequence - 2)
-               else:
-                       # treat differently on-demand playlists?
-                       current = self._first_sequence
-
-               while True:
-                       try:
-                               if not self._files.has_key(current):
-                                       current = max(self._first_sequence, current)
-                               f = self._files[current]
-                               current += 1
-                               yield f
-                               if (f.has_key('endlist')):
-                                       break
-                       except GeneratorExit:
-                               break
-                       except StopIteration:
-                               yield None
-                       except KeyError:
-                               yield None
-                       except:
-                               break
-
-       def update(self, content):
-               # update this "constructed" playlist,
-               # return wether it has actually been updated
-               if self._last_content and content == self._last_content:
-                       self._update_tries += 1
-                       return False
-
-               start_time = time()
-               self._update_tries = 0
-               self._last_content = content
-
-               def get_lines_iter(c):
-                       c = c.decode("utf-8-sig")
-                       for l in c.splitlines():
-                               if l.startswith('#EXT'):
-                                       yield l
-                               elif l.startswith('#'):
-                                       pass
-                               else:
-                                       yield l
-
-               def getKey(l):
-                       #print l
-                       self._key = None
-                       a = l[18:].find(',')
-                       if a > 0:
-                               self._encryption_method = l[18:18+a].strip()
-                               if self._encryption_method == 'AES-128':
-                                       a=l.find('URI="')
-                                       if a > 0:
-                                               j=l[a+5:].find('"')
-                                               self._key_url = l[a+5:j+a+5]
-                                               j += a+5
-                                               a=l[j:].find('IV=')
-                                               if a > 0:
-                                                       self._iv = l[j+a+5:].strip().decode("hex")
-                                               url = urlparse.urljoin(self.url, self._key_url)
-                                               opener = requests.session()
-                                               try:
-                                                       response = opener.get(url, cookies=self._cookies, headers=self._headers, timeout=30)
-                                                       self._key = response.content
-                                               except:
-                                                       printl("No Encryption Key-URI found",self,'E')
-                                       else:
-                                               printl("No Encryption Key-URI found",self,'E')
-                               else:
-                                       printl("No valid Encryption Method found",self,'E')
-                       else:
-                               self._encryption_method = l[18:].strip()
-                       if not self._encryption_method:
-                               printl("No Encryption method found",self,'E')
-
-               extinf_start = content.find('#EXTINF')
-               if extinf_start < 0: content += '\n'
-               self._lines = get_lines_iter(content[:extinf_start])
-               try:
-                       first_line = self._lines.next()
-               except:
-                       return False
-               if not first_line.startswith('#EXTM3U'):
-                       printl('Invalid first line:\n%r' % content,self,'E')
-                       raise Exception('Invalid first line: %r' % first_line)
-
-               self.target_duration = None
-               i = 0
-               last_bw = '-1'
-               extinf_list = []
-               for l in self._lines:
-                       if l.startswith('#EXT-X-STREAM-INF'):
-                               def to_dict(l):
-                                       i = re.findall('(?:[\w-]*="[\w\.\,]*")|(?:[\w-]*=[\w]*)', l)
-                                       d = {v.split('=')[0]: v.split('=')[1].replace('"','') for v in i}
-                                       return d
-                               d = to_dict(l[18:])
-                               uri = self._lines.next()
-                               if 'googlevideo.com' in uri:
-                                       a = uri.find('/itag/')
-                                       if a > 0:
-                                               b = uri.find('/',a+6,a+10)
-                                               itag = int(uri[a+6:b]) if b > 0 else 0
-                                               if itag not in (91,92,93,94,95,96,132,151,300): continue
-                               if d['BANDWIDTH'] != last_bw:
-                                       last_bw = d['BANDWIDTH']
-                                       uri = urlparse.urljoin(self.url, uri)
-                                       d['uri'] = uri
-                                       self._add_playlist(d)
-                       elif l.startswith('#EXT-X-TARGETDURATION'):
-                               self.target_duration = int(l[22:])
-                       elif l.startswith('#EXT-X-MEDIA-SEQUENCE'):
-                               i = self.media_sequence = int(l[22:])
-                               if self._last_f != None:
-                                       y = content.rfind(self._last_f, extinf_start)
-                                       if y > 0:
-                                               y = content.find('#EXTINF', y)
-                                               if y > 0:
-                                                       extinf_start = y
-                                                       i = self._last_sequence
-                                               else:
-                                                       extinf_start = 0
-                                       else:
-                                               self._first_sequence = 0
-                       elif l.startswith('#EXT-X-VERSION'):
-                               self.version = int(l[15:])
-                       elif l.startswith('#EXT-X-PROGRAM-DATE-TIME'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-BYTE-SIZE'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-BYTERANGE'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-DATERANGE'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-CUEPOINT'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-PROGRAM-DATE-TIME'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-INDEPENDENT-SEGMENTS'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-PLAYLIST-TYPE'):
-                               #print l
-                               pass
-                       elif l.startswith('#EXT-X-ALLOW-CACHE'):
-                               pass
-                       elif l.startswith('#EXT-X-KEY'):
-                               getKey(l)
-                       elif len(l.strip()) != 0:
-                               print l
-
-               if extinf_start > 0:
-
-                       def proc_extinf_list(extinf_list):
-                               _len = len(extinf_list)
-                               a = _len - 5 if not self._endlist and _len >= 5 else 0
-                               for item in extinf_list[a:]:
-                                       _i, _l, _f = item
-                                       if _f == None:
-                                               self._files[_i]['endlist'] = True
-                                       else:
-                                               if _f.startswith('./'): _f = _f[2:]
-                                               v = _l[8:].split(',')
-                                               d = dict(file=_f,
-                                                               title=v[1].strip(),
-                                                               duration=math.trunc(float(v[0])) if self.version < 3 else float(v[0]),
-                                                               sequence=_i)
-                                               _i += 1
-                                               self._set_file(_i, d)
-                               if _i > self._last_sequence:
-                                       self._last_f = _f
-                                       self._last_sequence = _i
-                               else: self._last_f = None
-
-                               if self._endlist:
-                                       self._end_sequence = self._last_sequence - 1
-
-                       self._lines = get_lines_iter(content[extinf_start:])
-                       for l in self._lines:
-                               if l.startswith('#EXTINF'):
-                                       while True:
-                                               f = self._lines.next().strip()
-                                               if not f.startswith('#'):
-                                                       break
-                                       extinf_list.append((i,l,f))
-                                       i += 1
-                               elif l.startswith('#EXT-X-DISCONTINUITY'):
-                                       #print l
-                                       pass
-                               elif l.startswith('#EXT-X-ENDLIST'):
-                                       self._endlist = True
-                                       extinf_list.append((i,None,None))
-                                       #print l
-                               elif len(l.strip()) != 0:
-                                       print l
-
-                       proc_extinf_list(extinf_list)
-                       del extinf_list[:]
-                       result = True
-               elif extinf_start == 0:
-                       result = False
-                       self._update_tries += 1
-               else: result = True
-
-               if not self.has_programs() and not self.target_duration:
-                       printl("Invalid HLS stream: no programs & no duration",self,'E')
-                       raise Exception("Invalid HLS stream: no programs & no duration")
-
-               del content
-               self.load_time = time() - start_time
-               return result
-
-       def _add_playlist(self, d):
-               self._programs.append(d)
-
-       def _set_file(self, sequence, d):
-               if not self._first_sequence:
-                       self._first_sequence = sequence
-               elif sequence < self._first_sequence:
-                       self._first_sequence = sequence
-               self._files[sequence] = d
-
-       def __repr__(self):
-               return "M3U8 %r %r" % (self._programs, self._files)
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_make_url.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_hlsp_make_url.py
deleted file mode 100644 (file)
index e82f59e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2009-2010 Fluendo, S.L. (www.fluendo.com).
-# Copyright (C) 2009-2010 Marc-Andre Lureau <marcandre.lureau@gmail.com>
-
-# This file may be distributed and/or modified under the terms of
-# the GNU General Public License version 2 as published by
-# the Free Software Foundation.
-# This file is distributed without any warranty; without even the implied
-# warranty of merchantability or fitness for a particular purpose.
-# See "LICENSE" in the source distribution for more information.
-
-import os
-import urlparse
-
-def make_url(base_url, url):
-       if urlparse.urlsplit(url).scheme == '':
-               url = urlparse.urljoin(base_url, url)
-       if 'HLS_PLAYER_SHIFT_PORT' in os.environ.keys():
-               shift = int(os.environ['HLS_PLAYER_SHIFT_PORT'])
-               p = urlparse.urlparse(url)
-               loc = p.netloc
-               if loc.find(":") != -1:
-                       loc, port = loc.split(':')
-                       port = int(port) + shift
-                       loc = loc + ":" + str(port)
-               elif p.scheme == "http":
-                       port = 80 + shift
-                       loc = loc + ":" + str(shift)
-               p = urlparse.ParseResult(scheme=p.scheme,
-                                                               netloc=loc,
-                                                               path=p.path,
-                                                               params=p.params,
-                                                               query=p.query,
-                                                               fragment=p.fragment)
-               url = urlparse.urlunparse(p)
-       return url
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_yt-oauth2 b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mp_yt-oauth2
new file mode 100644 (file)
index 0000000..8bb0a22
--- /dev/null
@@ -0,0 +1,2 @@
+client_id=
+client_secret=
index 15668a1..eab8ca4 100644 (file)
@@ -895,16 +895,6 @@ class MPScreen(Screen, HelpableScreen):
                return res
 ##################
 
-####### fashiontvguide
-       def TvListEntry(self, entry):
-               width = self['liste'].instance.size().width()
-               height = self['liste'].l.getItemSize().height()
-               self.ml.l.setFont(0, gFont(mp_globals.font, height - 2 * mp_globals.sizefactor))
-               res = [entry]
-               res.append((eListboxPythonMultiContent.TYPE_TEXT, 0, 0, width, height * 2, 0, RT_HALIGN_LEFT, entry[0]+entry[1]))
-               return res
-##################
-
 class MPScreenSummary(Screen):
 
        def __init__(self, session, parent):