import enigma2-plugin-extensions-mediaportal 2019102701 v2019102701
authorChristian Weiske <cweiske@cweiske.de>
Mon, 28 Oct 2019 00:15:22 +0000 (01:15 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Mon, 28 Oct 2019 00:15:22 +0000 (01:15 +0100)
38 files changed:
usr/lib/enigma2/python/Components/Converter/MPServiceInfo.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/additions.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/myspass.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/beeg.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/chaturbate.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/cumlouder.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/eporner.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/hotscope.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/lovehomeporn.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pinflix.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porncom.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porngo.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pornhub.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/redtube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/spankbang.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/tube8.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xhamster.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xnxx.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xvideos.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/youporn.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/CZ.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/DE.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/EN.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ENDE.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ES.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/FI.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/PL.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/RU.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SE.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SK.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/TR.png
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.mo
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.po
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/plugin.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/cfscrape/__init__.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/mpscreen.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/simpleplayer.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/yt_url.py

index 5623c09..6a4b0d0 100644 (file)
@@ -5,7 +5,7 @@ from os import path
 from Plugins.Extensions.MediaPortal.resources import mp_globals
 from Plugins.Extensions.MediaPortal.resources.imports import TimerCall
 
-if mp_globals.isDreamOS and mp_globals.model in ["one"]:
+if mp_globals.isDreamOS and mp_globals.model in ["one","two"]:
        from enigma import CT_MPEG2, CT_H264, CT_MPEG1, CT_MPEG4_PART2, CT_VC1, CT_VC1_SIMPLE_MAIN, CT_H265, CT_DIVX311, CT_DIVX4, CT_SPARK, CT_VP6, CT_VP8, CT_VP9, CT_H263, CT_MJPEG, CT_REAL, CT_AVS, CT_UNKNOWN
 
 class MPServiceInfo(Converter, object):
@@ -15,7 +15,7 @@ class MPServiceInfo(Converter, object):
 
        def __init__(self, type):
                Converter.__init__(self, type)
-               if mp_globals.isDreamOS and mp_globals.model in ["one"]:
+               if mp_globals.isDreamOS and mp_globals.model in ["one","two"]:
                        self.type, self.interesting_events = {
                                        "VideoInfo": (self.VIDEO_INFO, (iPlayableService.evVideoSizeChanged, iPlayableService.evVideoProgressiveChanged, iPlayableService.evVideoFramerateChanged, iPlayableService.evUpdatedInfo,)),
                                        "VideoInfoCodec": (self.VIDEO_INFOCODEC, (iPlayableService.evVideoSizeChanged, iPlayableService.evVideoProgressiveChanged, iPlayableService.evVideoFramerateChanged, iPlayableService.evUpdatedInfo, iPlayableService.evVideoTypeReady,)),
@@ -48,7 +48,7 @@ class MPServiceInfo(Converter, object):
                if self.type == self.VIDEO_INFO:
                        if mp_globals.isDreamOS:
                                frame_rate = info.getInfo(iServiceInformation.sFrameRate)
-                               if mp_globals.isDreamOS and mp_globals.model in ["one"]:
+                               if mp_globals.isDreamOS and mp_globals.model in ["one","two"]:
                                        xres = info.getInfo(iServiceInformation.sVideoWidth)
                                        yres = info.getInfo(iServiceInformation.sVideoHeight)
                                        if frame_rate > 0 and xres > 0 and yres > 0:
@@ -112,16 +112,7 @@ class MPServiceInfo(Converter, object):
                                yres = info.getInfo(iServiceInformation.sVideoHeight)
 
                        if mp_globals.isDreamOS:
-                               if mp_globals.model in ["one"] and path.exists("/sys/class/deinterlace/di0/frame_format"):
-                                       f = open("/sys/class/deinterlace/di0/frame_format", "r")
-                                       try:
-                                               progressive = str(f.read())
-                                               progressive = False if progressive.strip() == "interlace" else True
-                                       except:
-                                               pass
-                                       f.close()
-                               else:
-                                       progressive = info.getInfo(iServiceInformation.sProgressive)
+                               progressive = info.getInfo(iServiceInformation.sProgressive)
                                frame_rate = info.getInfo(iServiceInformation.sFrameRate)
                                if not progressive:
                                        frame_rate *= 2
@@ -148,7 +139,7 @@ class MPServiceInfo(Converter, object):
                                return "%s%s%s%s%s" % (xres, x, yres, p, frame_rate)
                if self.type in [self.VIDEO_INFOCODEC, self.VIDEO_CODEC]:
                        codec = None
-                       if mp_globals.isDreamOS and mp_globals.model in ["one"]:
+                       if mp_globals.isDreamOS and mp_globals.model in ["one","two"]:
                                codec = info.getInfo(iServiceInformation.sVideoType)
                                codec = { CT_MPEG2 : "MPEG2", CT_H264 : "H.264/AVC", CT_MPEG1 : "MPEG1", CT_MPEG4_PART2 : "MPEG4",
                                        CT_VC1 : "VC1", CT_VC1_SIMPLE_MAIN : "WMV3", CT_H265 : "H.265/HEVC", CT_DIVX311 : "DIVX3",
index bba2a47..63e4630 100644 (file)
                <plugin type="mod" modfile="porn.elladies" confopt="showelladies" default="False" confcat="porn" gz="0" name="EL-Ladies" icon="elladies" filter="Porn" screen="elladiesGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="elladiesFilmScreen" searchparam=", &quot;&quot;"/>
                <plugin type="mod" modfile="porn.eroprofile" confopt="showeroprofile" default="False" confcat="porn" gz="0" name="EroProfile" icon="eroprofile" filter="Porn" screen="eroprofileGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="eroprofileFilmScreen" searchparam=", &quot;&quot;"/>
                <plugin type="mod" modfile="porn.homemoviestube" confopt="showhomemoviestube" default="False" confcat="porn" gz="0" name="HomeMoviesTube" icon="homemoviestube" filter="Porn" screen="homemoviestubeGenreScreen" param1="" param2="" search="1" delim="-" searchurl="%s" searchscreen="homemoviestubeFilmScreen" searchparam=""/>
+               <plugin type="mod" modfile="porn.lovehomeporn" confopt="showlovehomeporn" default="False" confcat="porn" gz="0" name="LoveHomePorn" icon="lovehomeporn" filter="Porn" screen="lovehomepornGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="lovehomepornFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.faapy" confopt="showfaapy" default="False" confcat="porn" gz="0" name="Faapy" icon="faapy" filter="Porn" screen="faapyGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="faapyFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.eporner" confopt="showeporner" default="False" confcat="porn" gz="0" name="Eporner" icon="eporner" filter="Porn" screen="epornerGenreScreen" param1="" param2="" search="1" delim="-" searchurl="http://www.eporner.com/search/%s/" searchscreen="epornerFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.sexu" confopt="showsexu" default="False" confcat="porn" gz="0" name="Sexu" icon="sexu" filter="Porn" screen="sexuGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="sexuFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.moviefap" confopt="showmoviefap" default="False" confcat="porn" gz="0" name="MovieFap" icon="moviefap" filter="Porn" screen="moviefapGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="moviefapFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.befuck" confopt="showbefuck" default="False" confcat="porn" gz="0" name="BeFuck" icon="befuck" filter="Porn" screen="befuckGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="befuckListScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.pornrabbit" confopt="showpornrabbit" default="False" confcat="porn" gz="0" name="PornRabbit" icon="pornrabbit" filter="Porn" screen="pornrabbitGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="/search/%s/" searchscreen="pornrabbitFilmScreen" searchparam=""/>
-               <plugin type="mod" modfile="porn.hdporn" confopt="showhdporn" default="False" confcat="porn" gz="0" name="HDPorn" icon="hdporn" filter="Porn" screen="hdpornGenreScreen" param1="" param2=""/>
+               <!--<plugin type="mod" modfile="porn.hdporn" confopt="showhdporn" default="False" confcat="porn" gz="0" name="HDPorn" icon="hdporn" filter="Porn" screen="hdpornGenreScreen" param1="" param2=""/>-->
                <plugin type="mod" modfile="porn.updatetube" confopt="showupdatetube" default="False" confcat="porn" gz="0" name="UpdateTube" icon="updatetube" filter="Porn" screen="updatetubeGenreScreen" param1="updatetube" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;UpdateTube.com&quot;, &quot;www.updatetube.com&quot;"/>
                <plugin type="mod" modfile="porn.updatetube" confopt="showthenewporn" default="False" confcat="porn" gz="0" name="TheNewPorn" icon="thenewporn" filter="Porn" screen="updatetubeGenreScreen" param1="thenewporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;TheNewPorn.com&quot;, &quot;www.thenewporn.com&quot;"/>
                <plugin type="mod" modfile="porn.updatetube" confopt="showpinkrod" default="False" confcat="porn" gz="0" name="Pinkrod" icon="pinkrod" filter="Porn" screen="updatetubeGenreScreen" param1="pinkrod" param2="" search="1" delim="+" searchurl="%s" searchscreen="updatetubeFilmScreen" searchparam=", &quot;Pinkrod.com&quot;, &quot;www.pinkrod.com&quot;"/>
index 38edc3e..0cfd44e 100644 (file)
@@ -36,6 +36,7 @@
 
 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/59.0.3071.115 Safari/537.36'
 default_cover = "file://%s/myspass.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
 class myspassGenreScreen(MPScreen):
@@ -67,13 +68,13 @@ class myspassGenreScreen(MPScreen):
                self.genreliste = []
                self.count = 2
                url = "http://www.myspass.de/ganze-folgen/"
-               getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(url, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
                url2 = "http://www.myspass.de/sendungen-a-bis-z/"
-               getPage(url2).addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(url2, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
                self.count -= 1
-               ganze = re.findall('<a\shref="(/shows/.*?)".*?(?:data-src|src)="(/wp-content/.*?\.jpg)".*?alt="(.*?)"', data, re.S)
+               ganze = re.findall('<a\shref="(/shows/[a-z]+/[a-z0-9-/]+)".*?(?:data-src|src)="(/wp-content/.*?\.jpg)".*?alt="(.*?)"', data, re.S)
                if ganze:
                        for (link, image, name) in ganze:
                                link = "http://www.myspass.de" + link
@@ -127,7 +128,7 @@ class myspassStaffelListeScreen(MPScreen):
                self.onLayoutFinish.append(self.loadPage)
 
        def loadPage(self):
-               getPage(self.myspassUrl).addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(self.myspassUrl, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
                parse = re.search('has-season-selector"(.*)class="videoPanel__dropdown-placeholder', data, re.S)
@@ -193,14 +194,14 @@ class myspassFolgenListeScreen(MPScreen):
 
        def loadPage(self):
                url = "http://www.myspass.de/frontend/php/ajax.php?query=bob&seasonId=%s&formatId=%s&category=%s" % (self.seasonid, self.formatid, self.type)
-               getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(url, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
                myspassdata = json.loads(data)
                folgen = re.findall('href=".*?--/(\d+)/".*?class="title".*?>(.*?)(?:</h2|<small).*?class="subTitle">(.*?)</.*?class="desc".*?>(.*?)</', myspassdata["slider"], re.S)
                if folgen:
                        for (id, title, meta, desc) in folgen:
-                               link = "http://www.myspass.de/includes/apps/video/getvideometadataxml.php?id=%s" % str(id)
+                               link = "http://m.myspass.de/api/index.php?command=video&id=%s" % str(id)
                                image = "http://www.myspass.de/myspass/media/images/videos/%s/%s_640x360.jpg" % (str(id[-2:]), str(id))
                                episode = re.search("(Folge.*?\|.*?)\|", str(meta), re.S).group(1).strip().replace(' | ', ' - ')
                                runtime = re.search(".*\|(.*?)$", str(meta), re.S).group(1).strip()
@@ -224,9 +225,10 @@ class myspassFolgenListeScreen(MPScreen):
                        return
                self.myname = self['liste'].getCurrent()[0][0]
                self.mylink = self['liste'].getCurrent()[0][1]
-               getPage(self.mylink).addCallback(self.get_link).addErrback(self.dataError)
+               getPage(self.mylink, agent=agent).addCallback(self.get_link).addErrback(self.dataError)
 
        def get_link(self, data):
-               stream_url = re.search('<url_flv><.*?CDATA\[(.*?)\]\]></url_flv>', data, re.S)
-               if stream_url:
-                       self.session.open(SimplePlayer, [(self.myname, stream_url.group(1))], showPlaylist=False, ltype='myspass')
\ No newline at end of file
+               json_data = json.loads(data)
+               url = str(json_data["data"]["video_url"]).replace('http://c11021-osu.p.core.cdn.streamfarm.net/', 'https://cldf-od.r53.cdn.tv1.eu/')
+               mp_globals.player_agent = agent
+               self.session.open(SimplePlayer, [(self.myname, url)], showPlaylist=False, ltype='myspass')
\ No newline at end of file
index 62d0595..479e837 100644 (file)
@@ -172,11 +172,17 @@ class beegFilmScreen(MPScreen, ThumbsHelper):
                                title = str(node["ps_name"])
                        elif title.strip() == "-":
                                title = str(node["ps_name"])
-                       image = 'https://img.beeg.com/800x450/%s' % str(node["thumbs"][0]["image"])
-                       svid = str(node["svid"])
-                       pid = str(node["thumbs"][0]["pid"])
-                       start = str(node["thumbs"][0]["start"])
-                       end = str(node["thumbs"][0]["end"])
+                       try:
+                               image = 'https://img.beeg.com/800x450/%s' % str(node["thumbs"][0]["image"])
+                       except:
+                               image = default_cover
+                       try:
+                               svid = str(node["svid"])
+                               pid = str(node["thumbs"][0]["pid"])
+                               start = str(node["thumbs"][0]["start"])
+                               end = str(node["thumbs"][0]["end"])
+                       except:
+                               continue
                        url = 'https://beeg.com/api/v6/%s/video/%s?v=2&p=%s&s=%s&e=%s' % (beeg_apikey, svid, pid, start, end)
                        duration = str(node["duration"])
                        added = str(node["datetime"])
@@ -216,7 +222,7 @@ class beegFilmScreen(MPScreen, ThumbsHelper):
                twAgentGetPage(url, agent=IPhone5Agent, headers=MyHeaders).addCallback(self.getVideoPage).addErrback(self.dataError)
 
        def getVideoPage(self, data):
-               if mp_globals.model in ["one"]:
+               if mp_globals.model in ["one","two"]:
                        streamlinks = re.findall('(?:240|480|720|1080|2160)p":"(.*?)"', data , re.S)
                else:
                        streamlinks = re.findall('(?:240|480|720|1080)p":"(.*?)"', data , re.S)
index 97609b9..ecc4527 100644 (file)
@@ -273,7 +273,7 @@ class chaturbateFilmScreen(MPScreen, ThumbsHelper):
                match_sec_m3u8=re.findall('BANDWIDTH=(\d+).*?RESOLUTION=(\d+).*?\n(.*?m3u8)', data, re.S)
                max = 0
                for x in match_sec_m3u8:
-                       if (int(x[0]) > max) and ((int(x[1]) <= 1920) or mp_globals.model in ["one","duo4k"]):
+                       if (int(x[0]) > max) and ((int(x[1]) <= 1920) or mp_globals.model in ["one","two","duo4k"]):
                                max = int(x[0])
                videoPrio = int(config_mp.mediaportal.videoquali_others.value)
                if videoPrio == 2:
@@ -284,7 +284,7 @@ class chaturbateFilmScreen(MPScreen, ThumbsHelper):
                        bw = max/3
                for each in match_sec_m3u8:
                        bandwith,res,url = each
-                       if (int(res) <= 1920 or mp_globals.model in ["one","duo4k"]):
+                       if (int(res) <= 1920 or mp_globals.model in ["one","two","duo4k"]):
                                self.bandwith_list.append((int(bandwith),url))
                _x, best = min((abs(int(x[0]) - bw), x) for x in self.bandwith_list)
 
index ccf7c5f..f111542 100644 (file)
@@ -77,7 +77,7 @@ class cumlouderGenreScreen(MPScreen):
                twAgentGetPage(url, agent=myagent).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               Cats = re.findall('<a\stag-url=.*?href="(.*?)\?.*?data-lazy="(.*?)".*?alt="(.*?)">', data, re.S)
+               Cats = re.findall('<a\stag-url=.*?href="(.*?)\?.*?data-src="(.*?)".*?alt="(.*?)">', data, re.S)
                if Cats:
                        for (Url, Image, Title) in Cats:
                                Url = 'http://www.cumlouder.com%s' % Url
@@ -162,9 +162,10 @@ class cumlouderSeriesScreen(MPScreen):
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                twAgentGetPage(self.Link, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
+               twAgentGetPage('https://www.cumlouder.com/categories-main/pagination/?page=1&d=desktop&lang=en&home=true&co=DE', agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
-               Series = re.findall('\(\d{3},\s\'home-categorias.*?href="(.*?)".*?data-lazy="(.*?)".*?itemprop="name">(.*?)</h.*?<p>(.*?)\svideos', data, re.S)
+               Series = re.findall('\(\d{3},\s\'home-categorias.*?href="(.*?)".*?data-src="(.*?)".*?itemprop="name">(.*?)</h.*?<p>(.*?)\svideos', data, re.S)
                if Series:
                        for (Url, Image, Title, Count) in Series:
                                Title = Title.lower().title()
@@ -230,7 +231,7 @@ class cumlouderSitesScreen(MPScreen):
                twAgentGetPage(self.Link, agent=myagent).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
-               Sites = re.findall('class="muestra-escena">.*?href="(.*?)".*?data-lazy="(.*?)".*?alt="(.*?)"', data, re.S)
+               Sites = re.findall('class="muestra-escena">.*?href="(.*?)".*?data-src="(.*?)".*?alt="(.*?)"', data, re.S)
                if Sites:
                        for (Url, Image, Title) in Sites:
                                Url = "https://www.cumlouder.com" + Url
@@ -303,7 +304,7 @@ class cumlouderChannelsScreen(MPScreen):
 
        def loadData(self, data):
                self.getLastPage(data, 'class="paginador"(.*?)</ul>')
-               Girls = re.findall('channel-url=.*?href="(.*?)".*?data-lazy="(.*?)".*?alt="(.*?)".*?videos sprite"></span>(.*?)\sVideos', data, re.S)
+               Girls = re.findall('channel-url=.*?href="(.*?)".*?data-src="(.*?)".*?alt="(.*?)".*?videos sprite"></span>(.*?)\sVideos', data, re.S)
                if Girls:
                        for (Url, Image, Title, Count) in Girls:
                                Url = "http://www.cumlouder.com" + Url
@@ -377,7 +378,7 @@ class cumlouderGirlsScreen(MPScreen):
 
        def loadData(self, data):
                self.getLastPage(data, 'class="paginador"(.*?)</ul>')
-               Girls = re.findall('girl-url=.*?href="(.*?)".*?data-lazy="(.*?)".*?alt="(.*?)".*?videos sprite"></span>(.*?)\sVideos.*?puntaje sprite"></span>(.*?)</span', data, re.S)
+               Girls = re.findall('girl-url=.*?href="(.*?)".*?data-src="(.*?)".*?alt="(.*?)".*?videos sprite"></span>(.*?)\sVideos.*?puntaje sprite"></span>(.*?)</span', data, re.S)
                if Girls:
                        for (Url, Image, Title, Count, Rating) in Girls:
                                Url = "http://www.cumlouder.com" + Url
@@ -474,7 +475,7 @@ class cumlouderFilmScreen(MPScreen):
        def loadData(self, data):
                self.getLastPage(data, 'class="paginador"(.*?)</ul>')
                if 'class="box-link-productora">' in data:
-                       Movies = re.findall('class="muestra-escena"\shref="(.*?)".*?data-lazy="(.*?)".*?alt="(.*?)".*?vistas sprite"></span>(.*?)views.*?minutos sprite"></span>(.*?)(?:\sm|)</span.*?class="link-productora.*?>(.*?)</a', data, re.S)
+                       Movies = re.findall('class="muestra-escena"\shref="(.*?)".*?data-src="(.*?)".*?alt="(.*?)".*?vistas sprite"></span>(.*?)views.*?minutos sprite"></span>(.*?)(?:\sm|)</span.*?class="link-productora.*?>(.*?)</a', data, re.S)
                        if Movies:
                                for (Url, Image, Title, Views, Runtime, Channel) in Movies:
                                        Url = "https://www.cumlouder.com" + Url
@@ -482,7 +483,7 @@ class cumlouderFilmScreen(MPScreen):
                                                Image = 'http:' + Image
                                        self.filmliste.append((decodeHtml(Title), Url, Image, None, Runtime, Views, Channel))
                else:
-                       Movies = re.findall('class="muestra-escena"\shref="(.*?)".*?data-lazy="(.*?)".*?alt="(.*?)".*?vistas sprite"></span>(.*?)views.*?fecha sprite"></span>(.*?)</span.*?minutos sprite"></span>(.*?)(?:\sm|)</span', data, re.S)
+                       Movies = re.findall('class="muestra-escena"\shref="(.*?)".*?data-src="(.*?)".*?alt="(.*?)".*?vistas sprite"></span>(.*?)views.*?fecha sprite"></span>(.*?)</span.*?minutos sprite"></span>(.*?)(?:\sm|)</span', data, re.S)
                        if Movies:
                                for (Url, Image, Title, Views, Date, Runtime) in Movies:
                                        Url = "https://www.cumlouder.com" + Url
index e26b896..8f4a91b 100644 (file)
@@ -84,7 +84,7 @@ class epornerGenreScreen(MPScreen):
                                Url = "http://www.eporner.com" + Url
                                Title = Title.replace(' porn videos', '')
                                self.genreliste.append((Title, Url, Image))
-                       if mp_globals.model in ["one"]:
+                       if mp_globals.model in ["one","two"]:
                                self.genreliste.insert(0, ("4K Ultra HD", "https://www.eporner.com/category/4k-porn/", default_cover))
                        self.genreliste.sort()
                        self.genreliste.insert(0, ("Longest", "https://www.eporner.com/%page/longest/", default_cover))
@@ -234,10 +234,10 @@ class epornerFilmScreen(MPScreen, ThumbsHelper):
                videoRes = re.findall('"(\d+p).*?src["\']:\s+["\'](.*?)["\']', data, re.S)
                if videoRes:
                        for item in videoRes:
-                               if ("2160p" in item and mp_globals.model in ["one"]):
+                               if ("2160p" in item and mp_globals.model in ["one","two"]):
                                        url = item[1]
                                        break
-                               if ("1440p" in item and mp_globals.model in ["one"]):
+                               if ("1440p" in item and mp_globals.model in ["one","two"]):
                                        url = item[1]
                                        break
                                if "1080p" in item:
index 4060468..fe73d6f 100644 (file)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
 #######################################################################################################
 #
 #    MediaPortal for Dreambox OS
@@ -36,6 +36,7 @@
 
 from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
+import subprocess
 
 json_headers = {
        'Accept':'application/json, text/plain, */*',
@@ -212,31 +213,53 @@ class hotscopeFilmScreen(MPScreen, ThumbsHelper):
                else:
                        embedurl = re.findall('"embedURL":"https://\w+.pornhub.com/embed/(.*?)",', data.replace('\u002F','/'), re.S)
                        if embedurl:
+                               self['name'].setText(_('Please wait...'))
                                url = "https://www.pornhub.com/view_video.php?viewkey=" + embedurl[0]
                                twAgentGetPage(url, agent=agent).addCallback(self.getVideoPage2).addErrback(self.dataError)
 
        def getVideoPage2(self, data):
-               match = re.findall('quality":"720","videoUrl"."(.*?)"', data, re.S)
-               if not match:
-                       match = re.findall('quality":"480","videoUrl"."(.*?)"', data, re.S)
-               if not match:
-                       match = re.findall('quality":"240","videoUrl"."(.*?)"', data, re.S)
-               fetchurl = urllib2.unquote(match[0]).replace('\/','/')
-
-               # retry till we get a good working cdn streamurl
-               if config_mp.mediaportal.pornhub_cdnfix.value:
-                       if re.match('.*?bv.phncdn.com', fetchurl, re.S):
-                               self.count += 1
-                               if self.count < 20:
-                                       self.keyOK()
-                                       printl('CDN retry: '+str(self.count),self,'A')
-                                       return
-
-               Title = self['liste'].getCurrent()[0][0]
-               mp_globals.player_agent = agent
-               if "&hash=" in fetchurl:
-                       url = fetchurl.split('&hash=')
-                       url = url[0] + "&hash=" + url[1].replace('/','%2F').replace('=','%3D').replace('+','%2B')
-               else:
-                       url = fetchurl
-               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='hotscope')
\ No newline at end of file
+               js = re.findall('type="text/javascript">.*?(var\sflashvars.*?)loadScriptUniqueId', data, re.S)
+               if js:
+                       js = js[0]
+                       if "media_0" in js:
+                               js = js + "console.log(media_0+'\\n');"
+                       if "media_1" in js:
+                               js = js + "console.log(media_1+'\\n');"
+                       if "media_2" in js:
+                               js = js + "console.log(media_2+'\\n');"
+                       if "media_3" in js:
+                               js = js + "console.log(media_3+'\\n');"
+                       if "media_4" in js:
+                               js = js + "console.log(media_4+'\\n');"
+                       if "media_5" in js:
+                               js = js + "console.log(media_5+'\\n');"
+                       try:
+                               urls = subprocess.check_output(["node", "-e", js]).strip()
+                       except OSError as e:
+                               if e.errno == 2:
+                                       self.session.open(MessageBoxExt, _("This plugin requires package nodejs."), MessageBoxExt.TYPE_INFO)
+                       except Exception:
+                               self.session.open(MessageBoxExt, _("Error executing Javascript, please report to the developers."), MessageBoxExt.TYPE_INFO)
+
+                       url = re.findall('(https://.*?)\n', urls, re.S)
+                       if url:
+                               fetchurl = url[0]
+
+                               # retry till we get a good working cdn streamurl
+                               if config_mp.mediaportal.pornhub_cdnfix.value:
+                                       if re.match('.*?bv.phncdn.com', fetchurl, re.S):
+                                               self.count += 1
+                                               if self.count < 20:
+                                                       self.keyOK()
+                                                       printl('CDN retry: '+str(self.count),self,'A')
+                                                       return
+
+                               Title = self['liste'].getCurrent()[0][0]
+                               self['name'].setText(Title)
+                               mp_globals.player_agent = agent
+                               if "&hash=" in fetchurl:
+                                       url = fetchurl.split('&hash=')
+                                       url = url[0] + "&hash=" + url[1].replace('/','%2F').replace('=','%3D').replace('+','%2B')
+                               else:
+                                       url = fetchurl
+                               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='hotscope')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/lovehomeporn.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/lovehomeporn.py
new file mode 100644 (file)
index 0000000..9b0e3fd
--- /dev/null
@@ -0,0 +1,207 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2019
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
+from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
+
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36'
+default_cover = "file://%s/lovehomeporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+ck = {}
+
+class lovehomepornGenreScreen(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("LoveHomePorn.com")
+               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 = "https://lovehomeporn.com/videos"
+               getPage(url, agent=agent, cookies=ck).addCallback(self.genreData).addErrback(self.dataError)
+
+       def genreData(self, data):
+               Cats = re.findall('class="tag2" href="(.*?)">(.*?)</a></li>', data, re.S)
+               if Cats:
+                       for (Url, Title) in Cats:
+                               if Title not in ["all","bigass","bigboobs"]:
+                                       Url = Url.replace('#menu','') + "&page="
+                                       self.genreliste.append((Title.title(), Url, default_cover))
+                       self.genreliste.sort()
+                       self.genreliste.insert(0, ("Being Watched", "https://lovehomeporn.com/videos?o=bw&page=", default_cover))
+                       self.genreliste.insert(0, ("Most Downloaded", "https://lovehomeporn.com/videos?o=md&page=", default_cover))
+                       self.genreliste.insert(0, ("Most Favorited", "https://lovehomeporn.com/videos?o=tf&page=", default_cover))
+                       self.genreliste.insert(0, ("Most Viewed", "https://lovehomeporn.com/videos?o=mv&page=", default_cover))
+                       self.genreliste.insert(0, ("Top Rated", "https://lovehomeporn.com/videos?o=tr&page=", default_cover))
+                       self.genreliste.insert(0, ("Newest", "https://lovehomeporn.com/videos?o=mr&page=", default_cover))
+                       self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
+                       self.ml.setList(map(self._defaultlistcenter, self.genreliste))
+                       self.ml.moveToIndex(0)
+                       self.keyLocked = False
+                       self.showInfos()
+
+       def showInfos(self):
+               Image = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(Image, agent=agent, headers={'Referer':'https://lovehomeporn.com/'})
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Name = self['liste'].getCurrent()[0][0]
+               if Name == "--- Search ---":
+                       self.suchen()
+               else:
+                       Link = self['liste'].getCurrent()[0][1]
+                       self.session.open(lovehomepornFilmScreen, Link, Name)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = urllib.quote(self.suchString).replace(' ', '+')
+                       self.session.open(lovehomepornFilmScreen, Link, Name)
+
+class lovehomepornFilmScreen(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("LoveHomePorn.com")
+               self['ContentTitle'] = Label("Genre: %s" % self.Name)
+               self['F2'] = Label(_("Page"))
+
+               self['Page'] = Label(_("Page:"))
+               self.keyLocked = True
+               self.page = 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://lovehomeporn.com/search?search_type=videos&search_query=%s&page=%s' % (self.Link, str(self.page))
+               else:
+                       url = "%s%s" % (self.Link, str(self.page))
+               getPage(url, agent=agent, cookies=ck).addCallback(self.loadData).addErrback(self.dataError)
+
+       def loadData(self, data):
+               self.getLastPage(data, 'class="pagination">(.*?)</div>', '.*(?:page=|>)(\d+)(?:"(?! class="prevnext">Next)|<)')
+               Movies = re.findall('href="https://lovehomeporn.com/video/(\d+)/.*?alt="(.*?)"\sdata-original=\'(.*?)\'.*?class="info">(.*?)</div>.*?class="text">(.*?)</span>.*?class="text">(\d+) views</span>', data, re.S)
+               if Movies:
+                       for (Id, Title, Image, Runtime, Added, Views) in Movies:
+                               if Image.startswith('//'):
+                                       Image = 'https:' + Image
+                               Image = Image.replace('cdn.static.','')
+                               self.filmliste.append((decodeHtml(Title), Id, Image, Runtime, Views, Added))
+               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, self.lastpage, mode=1)
+               self.showInfos()
+
+       def showInfos(self):
+               title = self['liste'].getCurrent()[0][0]
+               pic = self['liste'].getCurrent()[0][2]
+               runtime = self['liste'].getCurrent()[0][3]
+               views = self['liste'].getCurrent()[0][4]
+               added = self['liste'].getCurrent()[0][5]
+               self['name'].setText(title)
+               self['handlung'].setText("Runtime: %s\nAdded: %s\nViews: %s" % (runtime, added, views))
+               CoverHelper(self['coverArt']).getCover(pic, agent=agent, headers={'Referer':'https://lovehomeporn.com/'})
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Id = self['liste'].getCurrent()[0][1]
+               if Id:
+                       url = "https://lovehomeporn.com/media/nuevo/config.php?key=%s" % Id
+                       getPage(url, agent=agent, cookies=ck).addCallback(self.getVideoPage).addErrback(self.dataError)
+
+       def getVideoPage(self, data):
+               videoPage = re.findall('<file>(.*?)</file>', data, re.S)
+               if videoPage:
+                       Title = self['liste'].getCurrent()[0][0]
+                       headers = '&Referer=https://lovehomeporn.com/'
+                       url = videoPage[-1].replace('&amp;','&') + '#User-Agent='+agent+headers
+                       mp_globals.player_agent = agent
+                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='lovehomeporn')
\ No newline at end of file
index 33c0fad..aaed9bd 100644 (file)
@@ -424,6 +424,10 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
                        Movies = re.findall('article\sclass="video-item.*?href="(.*?/videos.*?)".*?<img\salt="(.*?)".*?src="(.*?)".*?class="meta">.*?<time.*?>(.*?)</time', data, re.S)
                        if Movies:
                                for (Url, Title, Image, Runtime) in Movies:
+                                       if Url.startswith('//'):
+                                               Url = 'https:' + Url
+                                       elif Url.startswith('/'):
+                                               Url = self.baseurl + Url
                                        Image = Image.replace('.webp','.jpg')
                                        self.filmliste.append((decodeHtml(Title).strip(), Url, Image, Runtime))
                        else:
index d7e09e4..d3b746e 100644 (file)
@@ -104,7 +104,6 @@ class porncomGenreScreen(MPScreen):
                self.filmliste.insert(0, ("Top Rated", "https://www.porn.com/videos?o=r$$AGE$$&p=", default_cover, False))
                self.filmliste.insert(0, ("Most Viewed", "https://www.porn.com/videos?o=v$$AGE$$&p=", default_cover, False))
                self.filmliste.insert(0, ("Most Popular", "https://www.porn.com/videos?o=f$$AGE$$&p=", default_cover, False))
-               self.filmliste.insert(0, ("Featured", "https://www.porn.com/videos?p=", default_cover, False))
                self.filmliste.insert(0, ("Newest", "https://www.porn.com/videos?o=d&p=", default_cover, False))
                self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover, True))
                self.ml.setList(map(self._defaultlistcenter, self.filmliste))
@@ -605,9 +604,9 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                self['title'] = Label("Porn.com")
                self['ContentTitle'] = Label("Genre: %s" % self.Name)
                self['F2'] = Label(_("Page"))
-               if self.Sort:
+               if self.Sort and not re.match(".*Search", self.Name):
                        self['F3'] = Label(_("Sort"))
-               if not self.Sort and self.Name != 'Newest':
+               if (not self.Sort and self.Name != 'Newest') or re.match(".*Search", self.Name):
                        self['F4'].setText(_("Filter"))
 
                self['Page'] = Label(_("Page:"))
@@ -615,7 +614,7 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                self.page = 1
                self.lastpage = 1
                if re.match(".*Search", self.Name):
-                       self.sortname = 'Most Relevant'
+                       self.sortname = ''
                        self.sort = ''
                else:
                        self.sortname = 'Newest'
@@ -634,11 +633,11 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                if re.match(".*Search", self.Name):
-                       if self.sortname != 'Most Relevant' and self.sortname != 'Newest':
-                               age = '$$AGE$$'
+                       if self.sortname != 'All Time':
+                               age = '&tp=$$AGE$$'
                        else:
                                age = ''
-                       url = "https://www.porn.com/videos/search?q=%s&p=%s&o=%s%s" % (self.Link, str(self.page), self.sort, age)
+                       url = "https://www.porn.com/videos/search?q=%s&p=%s%s" % (self.Link, str(self.page), age)
                else:
                        url = "%s%s" % (self.Link, str(self.page))
                        if self.Sort:
@@ -659,19 +658,26 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                        else:
                                lastp = round((float(lastp) / 25) + 0.5)
                        self.lastpage = int(lastp)
-                       if self.lastpage > 244 and re.match(".*Search", self.Name):
-                               self.lastpage = 244
+                       if self.lastpage > 25 and re.match(".*Search", self.Name):
+                               self.lastpage = 25
                        self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
                else:
-                       lastp = re.search('Videos:</span><span>(.*?)</span>', data, re.S)
+                       lastp = re.search('class="sub"><span>(?:- |)(.*?) videos</span>', data, re.S)
                        if lastp:
                                lastp = lastp.group(1).replace(',','')
-                               lastp = round((float(lastp) / 201) + 0.5)
+                               lastp = round((float(lastp) / 40) + 0.5)
                                self.lastpage = int(lastp)
                                self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
                        else:
-                               self.lastpage = 999
-                               self['page'].setText(str(self.page))
+                               lastp = re.search('Videos:</span><span>(.*?)</span>', data, re.S)
+                               if lastp:
+                                       lastp = lastp.group(1).replace(',','')
+                                       lastp = round((float(lastp) / 201) + 0.5)
+                                       self.lastpage = int(lastp)
+                                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                               else:
+                                       self.lastpage = 999
+                                       self['page'].setText(str(self.page))
                Movies = re.findall('class="thumb"><a href="(.*?)"\stitle=".*?<img src="(.*?)".*?></a></div><h3><a href=".*?>(.*?)</a>.*?<div class="meta">(.*?)</div>', data, re.S)
                if Movies:
                        for (Url, Image, Title, Meta) in Movies:
@@ -703,9 +709,8 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                if not self.Sort:
                        return
                if re.match(".*Search", self.Name):
-                       rangelist = [ ['Most Relevant', None], ['Newest', 'd'], ['Most Popular', 'f'], ['Most Viewed', 'v'], ['Top Rated', 'r'], ['Longest', 'l'] ]
-               else:
-                       rangelist = [ ['Newest', 'd'], ['Most Popular', 'f'], ['Most Viewed', 'v'], ['Top Rated', 'r'], ['Most Discussed', 'm'], ['Longest', 'l'] ]
+                       return
+               rangelist = [ ['Hot', 'h'], ['Newest', 'd'], ['Most Popular', 'f'], ['Most Viewed', 'v'], ['Top Rated', 'r'], ['Most Discussed', 'm'], ['Longest', 'l'] ]
                self.session.openWithCallback(self.keySortAction, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
 
        def keySortAction(self, result):
@@ -713,7 +718,7 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
                        self.sort = result[1]
                        self.sortname = result[0]
                        self.loadPage()
-               if self.sortname != 'Newest' and self.sortname != 'Most Relevant':
+               if self.sortname != 'Newest' and self.sortname != 'Hot':
                        self['F4'].setText(_("Filter"))
                else:
                        self['F4'].setText('')
@@ -723,11 +728,14 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
        def keyAge(self):
                if self.keyLocked:
                        return
-               if self.Sort and (self.sortname == 'Newest' or self.sortname == 'Most Relevant'):
+               if self.Sort and (self.sortname == 'Newest' or self.sortname == 'Hot'):
                        return
                if not self.Sort and self.Name == 'Newest':
                        return
-               rangelist = [ ['Today', '1'], ['This Week', '7'], ['This Month', '30'], ['All Time', ''] ]
+               if re.match(".*Search", self.Name):
+                       rangelist = [ ['Today', '1'], ['This Week', '7'], ['This Month', '30'], ['3 Month', '90'], ['This Year', '365'], ['All Time', ''] ]
+               else:
+                       rangelist = [ ['Today', '1'], ['This Week', '7'], ['This Month', '30'], ['All Time', ''] ]
                self.session.openWithCallback(self.keyAgeAction, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
 
        def keyAgeAction(self, result):
@@ -757,7 +765,7 @@ class porncomFilmScreen(MPScreen, ThumbsHelper):
 
        def parseData(self, data):
                Title = self['liste'].getCurrent()[0][0]
-               if mp_globals.model in ["one"]:
+               if mp_globals.model in ["one","two"]:
                        match = re.findall('"(?:\d+p|2K|4K)",url:"(http.*?)"', data)
                else:
                        match = re.findall('"\d+p",url:"(http.*?)"', data)
index c373836..2398fa6 100644 (file)
@@ -273,7 +273,7 @@ class porngoFilmScreen(MPScreen, ThumbsHelper):
                                                        max = int(res)
                                        else:
                                                break
-                               #elif mp_globals.model in ["one"]:
+                               #elif mp_globals.model in ["one","two"]:
                                #       if int(res) > max:
                                #               check = url_ok(stream)
                                #               if check == 200:
index d38999a..6ba9bf5 100644 (file)
@@ -1,4 +1,4 @@
-# -*- coding: utf-8 -*-
+# -*- coding: utf-8 -*-
 #######################################################################################################
 #
 #    MediaPortal for Dreambox OS
@@ -40,6 +40,7 @@ from Plugins.Extensions.MediaPortal.resources.configlistext import ConfigListScr
 from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
 from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
 import requests
+import subprocess
 
 config_mp.mediaportal.pornhub_username = ConfigText(default="pornhubUserName", fixed_size=False)
 config_mp.mediaportal.pornhub_password = ConfigPassword(default="pornhubPassword", fixed_size=False)
@@ -901,6 +902,7 @@ class pornhubFilmScreen(MPScreen, ThumbsHelper, LoginFunc):
                self.favhash = ""
                self.retry = False
                self.feedpageurl = None
+               self.retrycount = 0
 
                self.infoTimer = eTimer()
                try:
@@ -1117,12 +1119,22 @@ class pornhubFilmScreen(MPScreen, ThumbsHelper, LoginFunc):
                self.lock = False
                self['handlung'].setText("Runtime: %s\nViews: %s\nAdded: %s%s%s" % (runtime, views, added, submsg, favmsg))
 
-       def keyOK(self):
+       def keyOK(self, retry=False):
                if self.keyLocked:
                        return
                self.url = self['liste'].getCurrent()[0][1]
                if self.url:
-                       twAgentGetPage(self.url, agent=phAgent, cookieJar=ph_cookiesUrl).addCallback(self.parseData).addErrback(self.dataError)
+                       self['name'].setText(_('Please wait...'))
+                       if retry:
+                               if self.retrycount == 0:
+                                       self.retrycount = 1
+                                       cookies = ph_cookies
+                               else:
+                                       return
+                       else:
+                               self.retrycount = 0
+                               cookies = ph_cookiesUrl
+                       twAgentGetPage(self.url, agent=phAgent, cookieJar=cookies).addCallback(self.parseData).addErrback(self.dataError)
 
        def keyFavourite(self):
                if self.keyLocked:
@@ -1185,30 +1197,58 @@ class pornhubFilmScreen(MPScreen, ThumbsHelper, LoginFunc):
                                self.session.open(MessageBoxExt, _("Unknown error."), MessageBoxExt.TYPE_INFO)
 
        def parseData(self, data):
-               match = re.findall('quality":"720","videoUrl"."(.*?)"', data, re.S)
-               if not match:
-                       match = re.findall('quality":"480","videoUrl"."(.*?)"', data, re.S)
-               if not match:
-                       match = re.findall('quality":"240","videoUrl"."(.*?)"', data, re.S)
-               fetchurl = urllib2.unquote(match[0]).replace('\/','/')
-
-               # retry till we get a good working cdn streamurl
-               if config_mp.mediaportal.pornhub_cdnfix.value:
-                       if re.match('.*?bv.phncdn.com', fetchurl, re.S):
-                               self.count += 1
-                               if self.count < 20:
-                                       self.keyOK()
-                                       printl('CDN retry: '+str(self.count),self,'A')
-                                       return
-
-               Title = self['liste'].getCurrent()[0][0]
-               mp_globals.player_agent = phAgent
-               if "&hash=" in fetchurl:
-                       url = fetchurl.split('&hash=')
-                       url = url[0] + "&hash=" + url[1].replace('/','%2F').replace('=','%3D').replace('+','%2B')
+               if 'id="iconLocked"' in data:
+                       msg = re.findall('(<div class="userMessageSection.*?<div class="avatarPosition"></div>)', data, re.S)
+                       if msg:
+                               if "video is private" in msg[0]:
+                                       #printl(re.sub(r"\s+", " ", stripAllTags(msg[0])).strip(),self,'A')
+                                       self.keyOK(True)
                else:
-                       url = fetchurl
-               self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornhub')
+                       js = re.findall('type="text/javascript">.*?(var\sflashvars.*?)loadScriptUniqueId', data, re.S)
+                       if js:
+                               js = js[0]
+                               if "media_0" in js:
+                                       js = js + "console.log(media_0+'\\n');"
+                               if "media_1" in js:
+                                       js = js + "console.log(media_1+'\\n');"
+                               if "media_2" in js:
+                                       js = js + "console.log(media_2+'\\n');"
+                               if "media_3" in js:
+                                       js = js + "console.log(media_3+'\\n');"
+                               if "media_4" in js:
+                                       js = js + "console.log(media_4+'\\n');"
+                               if "media_5" in js:
+                                       js = js + "console.log(media_5+'\\n');"
+                               try:
+                                       urls = subprocess.check_output(["node", "-e", js]).strip()
+                               except OSError as e:
+                                       if e.errno == 2:
+                                               self.session.open(MessageBoxExt, _("This plugin requires package nodejs."), MessageBoxExt.TYPE_INFO)
+                               except Exception:
+                                       self.session.open(MessageBoxExt, _("Error executing Javascript, please report to the developers."), MessageBoxExt.TYPE_INFO)
+
+                               url = re.findall('(https://.*?)\n', urls, re.S)
+                               if url:
+                                       fetchurl = url[0]
+
+                                       # retry till we get a good working cdn streamurl
+                                       if config_mp.mediaportal.pornhub_cdnfix.value:
+                                               if re.match('.*?bv.phncdn.com', fetchurl, re.S):
+                                                       self.count += 1
+                                                       if self.count < 20:
+                                                               self.keyOK()
+                                                               printl('CDN retry: '+str(self.count),self,'A')
+                                                               return
+
+                                       Title = self['liste'].getCurrent()[0][0]
+                                       self['name'].setText(Title)
+                                       mp_globals.player_agent = phAgent
+                                       if "&hash=" in fetchurl:
+                                               url = fetchurl.split('&hash=')
+                                               url = url[0] + "&hash=" + url[1].replace('/','%2F').replace('=','%3D').replace('+','%2B')
+                                       else:
+                                               url = fetchurl
+                                       self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='pornhub')
 
        def ok(self, data):
                message = re.findall('"message":"(.*?)",', data, re.S)
index 9847f45..cef5291 100644 (file)
@@ -88,7 +88,7 @@ class redtubeGenreScreen(MPScreen):
                global token
                token = re.findall('page_params.token\s=\s"(.*?)";', data, re.S)[0]
                parse = re.search('id="categories_list_section"(.*?)$', data, re.S)
-               Cats = re.findall('class="category_item_wrapper.*?">.*?<a href="(.*?)".*?data-src="(.*?\.jpg).*?".*?alt="(.*?)"', parse.group(1), re.S)
+               Cats = re.findall('class="category_item_wrapper.*?">.*?<a href="(/redtube/.*?)".*?data-src="(.*?\.jpg).*?".*?alt="(.*?)"', parse.group(1), re.S)
                if Cats:
                        for (Url, Image, Title) in Cats:
                                Url = "https://www.redtube.com" + Url
@@ -218,15 +218,27 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
                twAgentGetPage(url).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
-               lastp = re.search('<h1>.*?\s\((.*?)\)</h1>', data, re.S)
+               lastp = re.search('<h1(?: class="title_inactive\s{0,2}"|)>.*?\s\((.*?)\)</h1>', data, re.S)
                if lastp:
                        lastp = lastp.group(1).replace(',','')
                        cat = self.Link
                        lastp = round((float(lastp) / 24) + 0.5)
                        self.lastpage = int(lastp)
+                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
                else:
-                       self.lastpage = 1230
-               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       self.getLastPage(data, 'id="w_pagination_list">(.*?)</ul>', '.*(?:&amp;|\?)page=(\d+)"')
+               if 'id="block_browse"' in data:
+                       parse = re.search('id="block_browse"(.*?)$', data, re.S)
+                       if parse:
+                               data = parse.group(1)
+               elif 'id="recommended_videos_block"' in data:
+                       parse = re.search('id="recommended_videos_block"(.*?)$', data, re.S)
+                       if parse:
+                               data = parse.group(1)
+               elif 'id="search_results_block"' in data:
+                       parse = re.search('id="search_results_block"(.*?)$', data, re.S)
+                       if parse:
+                               data = parse.group(1)
                Movies = re.findall('class="video_block_wrapper">.*?<a\sclass="video_link.*?href="(\/\d+)".*?data-src\s{0,1}=\s{0,1}"(.*?)".*?duration">.*?(\d.*?)</a.*?a\stitle="(.*?)".*?video_count">(.*?)views', data, re.S)
                if Movies:
                        for (Url, Image, Runtime, Title, Views) in Movies:
index e1680d0..478f28d 100644 (file)
@@ -96,7 +96,7 @@ class spankbangGenreScreen(MPScreen):
                                        Image = "https://spankbang.com" + Image
                                        self.filmliste.append((Title, Url, Image, False, False, True))
                self.filmliste.sort()
-               if mp_globals.model in ["one"]:
+               if mp_globals.model in ["one","two"]:
                        self.filmliste.insert(0, ("4K Ultra HD", "https://spankbang.com/new_videos/", default_cover, False, False, False))
                self.filmliste.insert(0, ("Longest", "https://spankbang.com/longest_videos/", default_cover, False, True, False))
                self.filmliste.insert(0, ("Trending", "https://spankbang.com/trending_videos/", default_cover, False, False, False))
@@ -295,7 +295,7 @@ class spankbangFilmScreen(MPScreen, ThumbsHelper):
                        twAgentGetPage(url, method='POST', postdata=urlencode(postdata), cookieJar=cookies, agent=agent, headers=json_headers).addCallback(self.parseVideo, vr).addErrback(self.dataError)
 
        def parseVideo(self, data, vr):
-               if mp_globals.model in ["one"]:
+               if mp_globals.model in ["one","two"]:
                        if vr:
                                resolutions = "1080p|720p|480p|320p|240p"
                        else:
index 1898bac..465547b 100644 (file)
@@ -87,11 +87,19 @@ class tube8GenreScreen(MPScreen):
 
        def genreData(self, data):
                parse = re.search('id="porn-categories-box" class="gridList"(.*?)</ul>', data,re.S)
-               Cats = re.findall('a\shref="(http[s]?://www.tube8.com/%scat/.*?)">.*?data-thumb="(.*?)".*?<h5>(.*?)<span>' % self.scopeval[self.scope], parse.group(1), re.S)
-               if Cats:
-                       for (Url, Image, Title) in Cats:
-                               Url = Url + "page/"
-                               self.filmliste.append((Title, Url, Image))
+               if parse:
+                       Cats = re.findall('a\shref="(http[s]?://www.tube8.com/%scat/.*?)".*?data-thumb="(.*?)".*?<h5>(.*?)<span>' % self.scopeval[self.scope], parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Image, Title) in Cats:
+                                       Url = Url + "page/"
+                                       self.filmliste.append((Title, Url, Image))
+               parse = re.search('<h2>Popular Tags</h2>(.*?)</ul>', data, re.S)
+               if parse:
+                       Cats = re.findall('a\shref="(http[s]?://www.tube8.com/%sporntags/.*?)".*?list_item">(.*?)</a' % self.scopeval[self.scope], parse.group(1), re.S)
+                       if Cats:
+                               for (Url, Title) in Cats:
+                                       Url = Url + "?page="
+                                       self.filmliste.append((upperString(Title), Url, default_cover))
                self.filmliste.sort()
                self.filmliste.insert(0, ("Longest", "http://www.tube8.com/%slongest/page/" % self.scopeval[self.scope], default_cover))
                self.filmliste.insert(0, ("Most Voted", "http://www.tube8.com/%smost-voted/page/" % self.scopeval[self.scope], default_cover))
@@ -233,13 +241,20 @@ class tube8FilmScreen(MPScreen, ThumbsHelper):
                        getPage(url, method='POST', agent=agent, postdata=postdata, headers={'Content-Type': 'application/x-www-form-urlencoded'}).addCallback(self.genreData).addErrback(self.dataError)
                else:
                        if self.page == 1:
-                               url = self.Link.replace('page/','')
+                               url = self.Link.replace('page/','').replace('?page=','')
                        else:
-                               url = "%s%s/" % (self.Link, str(self.page))
+                               url = "%s%s" % (self.Link, str(self.page))
                        if self.sort:
-                               url = "%s?orderby=%s" % (url, self.sort)
+                               if "?" in url:
+                                       url = "%s&orderby=%s" % (url, self.sort)
+                               else:
+                                       url = "%s?orderby=%s" % (url, self.sort)
                        if self.filter:
-                               url = ("%s?filter_duration=%s" % (url, self.filter)).replace('?', '&').replace('&', '?', 1)
+                               if "?" in url:
+                                       url = "%s&filter_duration=%s" % (url, self.filter)
+                               else:
+                                       url = "%s?filter_duration=%s" % (url, self.filter)
+                       print url
                        getPage(url).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
@@ -258,8 +273,13 @@ class tube8FilmScreen(MPScreen, ThumbsHelper):
                                        Views = str(node["attributes"]["stats"]["views"])
                                        self.filmliste.append((Title, Url, Image, Runtime, Views))
                else:
-                       self.getLastPage(data, 'id="pagination"(.*?)</ul>')
                        preparse = re.search('id="category_video_list"(.*?)$', data, re.S)
+                       if preparse:
+                               self.getLastPage(data, 'id="pagination"(.*?)</ul>')
+                       else:
+                               preparse = re.search('<!-- SEARCH RESULT -->(.*?)$', data, re.S)
+                               if preparse:
+                                       self.getLastPage(data, 'id="pagination"(.*?)</ul>', '.*>(\d+)</a></strong>')
                        Movies = re.findall('id="video_i\d+.*?href="(.*?)".*?data-thumb="(http[s]?://.*?\.jpg)".*?title="(.*?)".*?(class="video-attributes-features">.*?video-likes)', preparse.group(1), re.S)
                        if Movies:
                                for (Url, Image, Title, Meta) in Movies:
index 3ea9867..6691d11 100644 (file)
@@ -38,12 +38,13 @@ from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
 from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
+import requests
 
 ck = {}
 favourites = []
 subscriptions = []
 pornstars = []
-xhAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
+xhAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"
 base_url = "https://xhamster.com"
 
 default_cover = "file://%s/xhamster.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
@@ -76,7 +77,7 @@ class xhamsterGenreScreen(MPScreen):
 
                self.scope = 0
                self.scopeText = ['Straight', 'Shemale', 'Gays']
-               self.scopeval = ['', 'shemale/', 'gay/']
+               self.scopeval = ['', '/shemale', '/gay']
                self.scopefilter = ['s%3A8%3A%22straight%22%3B', 's%3A7%3A%22shemale%22%3B', 's%3A3%3A%22gay%22%3B']
 
                self['title'] = Label("xHamster.com")
@@ -120,7 +121,7 @@ class xhamsterGenreScreen(MPScreen):
                ck.update({'x_content_preference_index':self.scopefilter[self.scope]})
                self['F3'].setText(self.scopeText[self.scope])
                self.keyLocked = True
-               url = "%s/%scategories" % (base_url, self.scopeval[self.scope])
+               url = "%s%s/categories" % (base_url, self.scopeval[self.scope])
                getPage(url, agent=xhAgent, cookies=ck).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
@@ -138,19 +139,19 @@ class xhamsterGenreScreen(MPScreen):
                self.genreliste.insert(0, ("Favourite Videos", 'favs'))
                self.genreliste.insert(0, (400 * "—", None))
                self.genreliste.insert(0, ("Pornstars", '%s/pornstars' % base_url))
-               self.genreliste.insert(0, ("Most Commented (All Time)", '%s$$HD$$/%smost-commented' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Commented (Monthly)", '%s$$HD$$/%smost-commented/monthly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Commented (Weekly)", '%s$$HD$$/%smost-commented/weekly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Commented (Daily)", '%s$$HD$$/%smost-commented/daily' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Viewed (All Time)", '%s$$HD$$/%smost-viewed' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Viewed (Monthly)", '%s$$HD$$/%smost-viewed/monthly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Viewed (Weekly)", '%s$$HD$$/%smost-viewed/weekly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Most Viewed (Daily)", '%s$$HD$$/%smost-viewed/daily' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Top Rated (All Time)", '%s$$HD$$/%sbest' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Top Rated (Monthly)", '%s$$HD$$/%sbest/monthly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Top Rated (Weekly)", '%s$$HD$$/%sbest/weekly' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Top Rated (Daily)", '%s$$HD$$/%sbest/daily' % (base_url, self.scopeval[self.scope])))
-               self.genreliste.insert(0, ("Newest", '%s$$HD$$/%s' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Commented (All Time)", '%s%s$$HD$$/most-commented' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Commented (Monthly)", '%s%s$$HD$$/most-commented/monthly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Commented (Weekly)", '%s%s$$HD$$/most-commented/weekly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Commented (Daily)", '%s%s$$HD$$/most-commented/daily' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Viewed (All Time)", '%s%s$$HD$$/most-viewed' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Viewed (Monthly)", '%s%s$$HD$$/most-viewed/monthly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Viewed (Weekly)", '%s%s$$HD$$/most-viewed/weekly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Most Viewed (Daily)", '%s%s$$HD$$/most-viewed/daily' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Top Rated (All Time)", '%s%s$$HD$$/best' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Top Rated (Monthly)", '%s%s$$HD$$/best/monthly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Top Rated (Weekly)", '%s%s$$HD$$/best/weekly' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Top Rated (Daily)", '%s%s$$HD$$/best/daily' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("Newest", '%s%s$$HD$$' % (base_url, self.scopeval[self.scope])))
                self.genreliste.insert(0, ("--- Search ---", "callSuchen"))
                self.ml.setList(map(self._defaultlistcenter, self.genreliste))
                self.ml.moveToIndex(0)
@@ -497,7 +498,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                self.keyLocked = True
                self.page = 1
                self.lastpage = 1
-               self.hd = False
+               self.hd = ''
                self.favourited = False
                self.subscribed = False
                self.username = ""
@@ -519,8 +520,10 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                else:
                        self['name'].setText(_('Please wait...'))
                        if re.match(".*?Search", self.Name):
-                               if self.hd:
+                               if self.hd == "/hd":
                                        hd = "hd"
+                               elif self.hd == "/4k":
+                                       hd = "4k"
                                else:
                                        hd = "all"
                                url = "https://xhamster.com/search?date=any&duration=any&sort=relevance&quality=%s&categories=%s=&q=%s&p=%s" % (hd, self.scopesearch[self.scope], self.Link, str(self.page))
@@ -528,15 +531,10 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                                if self.Name == "Related":
                                        url = self.Link + str(self.page)
                                else:
-                                       if self.hd:
-                                               hd = '/hd'
-                                       else:
-                                               hd = ''
                                        if self.page == 1:
-                                               url = self.Link.replace('$$HD$$', hd)
+                                               url = self.Link.replace('$$HD$$', self.hd)
                                        else:
-                                               url = "%s/%s" % (self.Link.replace('$$HD$$', hd), str(self.page))
-                       print url
+                                               url = "%s/%s" % (self.Link.replace('$$HD$$', self.hd), str(self.page))
                        getPage(url, agent=xhAgent, cookies=ck).addCallback(self.pageData).addErrback(self.dataError)
 
        def pageData(self, data):
@@ -679,7 +677,10 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                        return
                elif self.Link == "favs":
                        return
-               rangelist = [['All Videos', False], ['Only HD', True]]
+               if mp_globals.model in ["one","two","dm900","dm920"]:
+                       rangelist = [['All Videos', ''], ['Only HD', '/hd'], ['Only 4K', '/4k']]
+               else:
+                       rangelist = [['All Videos', ''], ['Only HD', '/hd']]
                self.session.openWithCallback(self.keyMenuAction, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
 
        def keyMenuAction(self, result):
@@ -756,14 +757,47 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
        def playerData(self, data):
                playerData = re.findall('"embedUrl":"(.*?)",', data, re.S)
                if playerData:
-                       getPage(playerData[0].replace('\/','/'), agent=xhAgent, cookies=ck).addCallback(self.playUrl).addErrback(self.dataError)
+                       url = playerData[0].replace('\/','/')
+                       getPage(url, agent=xhAgent, cookies=ck).addCallback(self.playUrl).addErrback(self.dataError)
 
        def playUrl(self, data):
                Title = self['liste'].getCurrent()[0][0]
+               url = None
                jsondata = re.findall('window.XPlayer2\("player",\s(.*?{"autoplay":false,"preview":true}})', data, re.S)
                if jsondata:
                        jsondata = json.loads(jsondata[0])
-                       url = str(jsondata["sources"]["standard"]["mp4"][0]["url"])
+                       max = 0
+                       if jsondata["sources"]["standard"].has_key("vp9") and mp_globals.model in ["one","two","dm900","dm920"]:
+                               for node in jsondata["sources"]["standard"]["vp9"]:
+                                       if str(node["quality"]) == "auto":
+                                               continue
+                                       else:
+                                               res = int(str(node["quality"]).replace('p',''))
+                                               if res > max:
+                                                       max = res
+                                                       url = str(node["url"])
+                       if jsondata["sources"]["standard"].has_key("h265") and mp_globals.model in ["one","two","dm900","dm920"]:
+                               for node in jsondata["sources"]["standard"]["h265"]:
+                                       if str(node["quality"]) == "auto":
+                                               continue
+                                       else:
+                                               res = int(str(node["quality"]).replace('p',''))
+                                               if res > max:
+                                                       max = res
+                                                       url = str(node["url"])
+                       for node in jsondata["sources"]["standard"]["mp4"]:
+                               if str(node["quality"]) == "auto":
+                                       continue
+                               else:
+                                       res = int(str(node["quality"]).replace('p',''))
+                                       if mp_globals.model in ["one","two"]:
+                                               if res > max:
+                                                       max = res
+                                                       url = str(node["url"])
+                                       else:
+                                               if res < 1440 and res > max:
+                                                       max = res
+                                                       url = str(node["url"])
                if url:
                        self.keyLocked = False
                        self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='xhamster')
\ No newline at end of file
index ac6cc8d..77cff95 100644 (file)
@@ -39,6 +39,8 @@ from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
 from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
 
+config_mp.mediaportal.xnxx_country = ConfigText(default="de", fixed_size=False)
+
 agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
 json_headers = {
        'Accept':'application/json',
@@ -53,6 +55,7 @@ headers = {
        'Accept-Language':'en-US,en;q=0.9',
        'Host':'www.xnxx.com'
        }
+cookies=CookieJar()
 
 class xnxxGenreScreen(MPScreen):
 
@@ -68,14 +71,22 @@ class xnxxGenreScreen(MPScreen):
                        "up" : self.keyUp,
                        "down" : self.keyDown,
                        "right" : self.keyRight,
-                       "left" : self.keyLeft
+                       "left" : self.keyLeft,
+                       "yellow" : self.keyScope,
+                       "blue" : self.keyCountry
                }, -1)
 
+               self.scope = 0
+               self.scopeText = ['Straight', 'Shemale', 'Gay']
+               self.scopeval = ['', 'shemale/', 'gay/']
+
                self['title'] = Label("XNXX.com")
                if self.Name:
                        self['ContentTitle'] = Label("Genre: %s" % self.Name)
                else:
                        self['ContentTitle'] = Label("Genre:")
+               if self.Name != "Best Of":
+                       self['F3'] = Label(self.scopeText[self.scope])
                self.keyLocked = True
                self.suchString = ''
 
@@ -86,35 +97,77 @@ class xnxxGenreScreen(MPScreen):
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
+               self.filmliste = []
+               self['name'].setText(_('Please wait...'))
+               twAgentGetPage('https://www.xnxx.com/change-country/%s' % config_mp.mediaportal.xnxx_country.value, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.layoutFinished2).addErrback(self.dataError)
+
+       def layoutFinished2(self, data):
+               self.filmliste = []
+               if self.scopeval[self.scope] == '':
+                       orientation = "straight"
+               else:
+                       orientation = self.scopeval[self.scope]
+               twAgentGetPage('https://www.xnxx.com/switch-sexual-orientation/%s' % orientation, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.layoutFinished3).addErrback(self.dataError)
+
+       def layoutFinished3(self, data):
                self.keyLocked = True
                if self.Link:
                        self.url = self.Link
                else:
-                       self.url = "https://www.xnxx.com/tags/"
-               twAgentGetPage(self.url, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                       self.genreData(data)
+                       return
+               twAgentGetPage(self.url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
+               self.country_list = []
+               if self.Name != "Best Of":
+                       countrydata = re.search('("countries":.*?]]),', data, re.S)
+                       if countrydata:
+                               countries = json.loads('{'+countrydata.group(1)+'}')
+                               for country in countries["countries"]:
+                                       try:
+                                               self.country_list.append([str(country[1]), str(country[0]).lower()])
+                                       except:
+                                               continue
+                               self['F4'].setText(_("Country")+": "+config_mp.mediaportal.xnxx_country.value.upper())
+                       else:
+                               self['F4'].setText("")
                if self.Name:
-                       parse = re.search('id="best-months">(.*?)$', data, re.S)
-                       Cats = re.findall('<a href="(/best/.*?)"\s+(?:class="active"\s{0,2}|class="hidden"\s{0,2}|)>(.*?)</a>', parse.group(1), re.S)
+                       parse = re.search('class="infobar">(.*?)$', data, re.S)
+                       Cats = re.findall('<a href="(/best.*?)"\s+(?:class="active"\s{0,2}|class="hidden"\s{0,2}|)>(.*?)</a>', parse.group(1), re.S)
                        if Cats:
                                for (Url, Title) in Cats:
                                        Url = "https://www.xnxx.com" + Url + "/$$PAGE$$"
                                        self.filmliste.append((Title, Url, default_cover, False))
                else:
-                       parse = re.search('id="tags">(.*?)$', data, re.S)
-                       if parse:
-                               Cats = re.findall('<li><a href="(/search/.*?)">(.*?)</a><strong>(.*?)</strong></li>', parse.group(1), re.S)
-                               if Cats:
-                                       for (Url, Title, Count) in Cats:
-                                               Count = int(Count.replace(',',''))
-                                               if Count > 250:
-                                                       Url = "https://www.xnxx.com" + Url.replace('tags','search') + "/$$PAGE$$/"
-                                                       self.filmliste.append((upperString(Title), Url, default_cover, False))
+                       catsdata = re.search('("categories":.*?]),"more_links', data, re.S)
+                       if catsdata:
+                               cats = json.loads('{'+catsdata.group(1)+'}')
+                               for cat in cats["categories"]:
+                                       try:
+                                               if str(cat["url"]).startswith('/search/'):
+                                                       if "?" in str(cat["url"]):
+                                                               Url = str(cat["url"]).split('?')[0]
+                                                       else:
+                                                               Url = str(cat["url"])
+                                                       Url = "https://www.xnxx.com" + Url + "/$$PAGE$$/"
+                                                       self.filmliste.append((upperString(str(cat["label"])), Url, default_cover, False))
+                                       except:
+                                               continue
                        self.filmliste.sort()
-                       self.filmliste.insert(0, ("Best Of", "https://www.xnxx.com/best", default_cover, False))
-                       self.filmliste.insert(0, ("Most Popular", "https://www.xnxx.com/todays-selection/$$PAGE$$", default_cover, False))
-                       self.filmliste.insert(0, ("Most Viewed", "https://www.xnxx.com/hits/$$AGE$$$$PAGE$$", default_cover, True))
+                       if self.scope == 0:
+                               self.filmliste.insert(0, ("Best Of", "https://www.xnxx.com/best", default_cover, False))
+                       elif self.scope == 1:
+                               self.filmliste.insert(0, ("Best Of", "https://www.xnxx.com/best-of-shemale", default_cover, False))
+                       elif self.scope == 2:
+                               self.filmliste.insert(0, ("Best Of", "https://www.xnxx.com/best-of-gay", default_cover, False))
+                       self.filmliste.insert(0, ("Most Popular", "https://www.xnxx.com/%stodays-selection/$$PAGE$$" % self.scopeval[self.scope], default_cover, False))
+                       if self.scope == 0:
+                               self.filmliste.insert(0, ("Most Viewed", "https://www.xnxx.com/hits/$$AGE$$$$PAGE$$", default_cover, True))
+                       elif self.scope == 1:
+                               self.filmliste.insert(0, ("Most Viewed", "https://www.xnxx.com/shemale-hits/$$AGE$$$$PAGE$$", default_cover, True))
+                       elif self.scope == 2:
+                               self.filmliste.insert(0, ("Most Viewed", "https://www.xnxx.com/gay-hits/$$AGE$$$$PAGE$$", default_cover, True))
                        self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover, True))
                self.ml.setList(map(self._defaultlistcenter, self.filmliste))
                self.ml.moveToIndex(0)
@@ -138,17 +191,47 @@ class xnxxGenreScreen(MPScreen):
                elif self.Name and self.Name.endswith("Best Of"):
                        self.session.open(xnxxFilmScreen, Link, Name, Best=True, Filter=Filter)
                else:
-                       self.session.open(xnxxFilmScreen, Link, Name, Filter=Filter)
+                       self.session.open(xnxxFilmScreen, Link, Name, Filter=Filter, Scope=self.scopeval[self.scope])
+
+       def keyScope(self):
+               if self.keyLocked:
+                       return
+               if self.Name == "Best Of":
+                       return
+               self.filmliste = []
+               if self.scope == 0:
+                       self.scope = 1
+               elif self.scope == 1:
+                       self.scope = 2
+               else:
+                       self.scope = 0
+               self['F3'].setText(self.scopeText[self.scope])
+               self.layoutFinished()
+
+       def keyCountry(self):
+               if self.keyLocked:
+                       return
+               if self.Name == "Best Of":
+                       return
+               if len(self.country_list) > 0:
+                       self.session.openWithCallback(self.keyCountryAction, ChoiceBoxExt, title=_('Select Country'), list=self.country_list, keys=[])
+
+       def keyCountryAction(self, result):
+               if result:
+                       config_mp.mediaportal.xnxx_country.value = result[1]
+                       config_mp.mediaportal.xnxx_country.save()
+                       configfile_mp.save()
+                       self.layoutFinished()
 
        def SuchenCallback(self, callback = None):
                if callback is not None and len(callback):
                        Name = "--- Search ---"
                        self.suchString = callback
                        Link = urllib.quote(self.suchString).replace(' ', '+')
-                       self.session.open(xnxxFilmScreen, Link, Name)
+                       self.session.open(xnxxFilmScreen, Link, Name, Scope=self.scopeval[self.scope])
 
        def getSuggestions(self, text, max_res):
-               url = "https://www.xnxx.com/search-suggest/%s" % urllib.quote_plus(text)
+               url = "https://www.xnxx.com/search-suggest/%s%s" % (self.scopeval[self.scope], urllib.quote_plus(text))
                d = twAgentGetPage(url, agent=agent, headers=json_headers, timeout=5)
                d.addCallback(self.gotSuggestions, max_res)
                d.addErrback(self.gotSuggestions, max_res, err=True)
@@ -169,12 +252,13 @@ class xnxxGenreScreen(MPScreen):
 
 class xnxxFilmScreen(MPScreen, ThumbsHelper):
 
-       def __init__(self, session, Link, Name, Related=False, Best=False, Filter=True):
+       def __init__(self, session, Link, Name, Related=False, Best=False, Filter=True, Scope=''):
                self.Link = Link
                self.Name = Name
                self.Related = Related
                self.Best = Best
                self.Filter = Filter
+               self.Scope = Scope
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
 
@@ -227,18 +311,23 @@ class xnxxFilmScreen(MPScreen, ThumbsHelper):
                self['name'].setText(_('Please wait...'))
                self.filmliste = []
                if self.Related:
-                       twAgentGetPage(self.Link, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(self.Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
                else:
                        if re.match(".*Search", self.Name):
-                               url = "https://www.xnxx.com/search/%s%s/%s/" % (self.age, self.Link, str(self.page-1))
+                               if self.page == 1:
+                                       url = "https://www.xnxx.com/search/%s%s%s/" % (self.Scope, self.age, self.Link)
+                               else:
+                                       url = "https://www.xnxx.com/search/%s%s%s/%s/" % (self.Scope, self.age, self.Link, str(self.page-1))
                        else:
                                if self.page == 1 and self.Name == "Most Popular":
                                        url = self.Link.replace('$$PAGE$$','')
                                else:
                                        url = self.Link.replace('$$PAGE$$', str(self.page-1)).replace('$$AGE$$', self.age)
-                       twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                       print url
+                       twAgentGetPage(url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
+               self.data = data
                if self.Related:
                        self['page'].setText('1 / 1')
                        datarel = re.findall('var video_related=(.*?);window.wpn_categories', data, re.S)
@@ -297,7 +386,10 @@ class xnxxFilmScreen(MPScreen, ThumbsHelper):
                if self.Related or self.Best:
                        return
                if re.match(".*Search", self.Name):
-                       rangelist = [ ['Today', 'day/'], ['Yesterday', 'yesterday/'], ['2 days ago', '2daysago/'], ['This week', 'week/'], ['This month', 'month/'], ['All time', ''] ]
+                       if "Results for" in self.data:
+                               rangelist = [ ['This month', 'month/'], ['This year', 'year/'], ['All time', ''] ]
+                       else:
+                               rangelist = [ ['Today', 'day/'], ['Yesterday', 'yesterday/'], ['2 days ago', '2daysago/'], ['This week', 'week/'], ['This month', 'month/'], ['All time', ''] ]
                elif self.Name == "Most Viewed":
                        rangelist = [ ['Today', 'day/'], ['This week', 'week/'], ['This month', 'month/'], ['All time', ''] ]
                else:
@@ -330,7 +422,7 @@ class xnxxFilmScreen(MPScreen, ThumbsHelper):
                Name = self['liste'].getCurrent()[0][0]
                Link = self['liste'].getCurrent()[0][1]
                if Link:
-                       twAgentGetPage(Link, agent=agent, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
 
        def parseData(self, data):
                match = re.findall("setVideo(?:UrlLow|UrlHigh|HLS)\('(.*?)'\);", data)
index f1597d3..9058cd2 100644 (file)
@@ -39,6 +39,8 @@ from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
 from Plugins.Extensions.MediaPortal.resources.choiceboxext import ChoiceBoxExt
 
+config_mp.mediaportal.xvideos_country = ConfigText(default="de", fixed_size=False)
+
 agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
 json_headers = {
        'Accept':'application/json',
@@ -53,6 +55,7 @@ headers = {
        'Accept-Language':'en-US,en;q=0.9',
        'Host':'www.xvideos.com'
        }
+cookies=CookieJar()
 
 class xvideosGenreScreen(MPScreen):
 
@@ -69,7 +72,8 @@ class xvideosGenreScreen(MPScreen):
                        "down" : self.keyDown,
                        "right" : self.keyRight,
                        "left" : self.keyLeft,
-                       "yellow" : self.keyScope
+                       "yellow" : self.keyScope,
+                       "blue" : self.keyCountry
                }, -1)
 
                self.scope = 0
@@ -81,7 +85,8 @@ class xvideosGenreScreen(MPScreen):
                        self['ContentTitle'] = Label("Genre: %s" % self.Name)
                else:
                        self['ContentTitle'] = Label("Genre:")
-               self['F3'] = Label(self.scopeText[self.scope])
+               if self.Name != "Best Videos":
+                       self['F3'] = Label(self.scopeText[self.scope])
                self.keyLocked = True
                self.suchString = ''
 
@@ -92,18 +97,44 @@ class xvideosGenreScreen(MPScreen):
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
+               self.filmliste = []
+               self['name'].setText(_('Please wait...'))
+               twAgentGetPage('https://www.xvideos.com/change-country/%s' % config_mp.mediaportal.xvideos_country.value, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.layoutFinished2).addErrback(self.dataError)
+
+       def layoutFinished2(self, data):
+               self.filmliste = []
+               if self.scopeval[self.scope] == '':
+                       orientation = "straight"
+               else:
+                       orientation = self.scopeval[self.scope]
+               twAgentGetPage('https://www.xvideos.com/switch-sexual-orientation/%s' % orientation, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.layoutFinished3).addErrback(self.dataError)
+
+       def layoutFinished3(self, data):
                self.keyLocked = True
-               self['F3'].setText(self.scopeText[self.scope])
                if self.Link:
                        self.url = self.Link
                else:
                        if self.scopeval[self.scope] == '':
                                self.url = "https://www.xvideos.com/lang"
                        else:
-                               self.url = "https://www.xvideos.com/%s" % self.scopeval[self.scope]
-               twAgentGetPage(self.url, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                               self.genreData(data)
+                               return
+               twAgentGetPage(self.url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
+               self.country_list = []
+               if self.Name != "Best Videos":
+                       countrydata = re.search('("countries":.*?]]),', data, re.S)
+                       if countrydata:
+                               countries = json.loads('{'+countrydata.group(1)+'}')
+                               for country in countries["countries"]:
+                                       try:
+                                               self.country_list.append([str(country[1]), str(country[0]).lower()])
+                                       except:
+                                               continue
+                               self['F4'].setText(_("Country")+": "+config_mp.mediaportal.xvideos_country.value.upper())
+                       else:
+                               self['F4'].setText("")
                if self.Name:
                        parse = re.search('id="main">(.*?)$', data, re.S)
                        if parse:
@@ -124,12 +155,15 @@ class xvideosGenreScreen(MPScreen):
                                        Url = "https://www.xvideos.com/?k=%s&p=$$PAGE$$" % Url
                                        self.filmliste.append((Title, Url, default_cover, True))
                        Cats = re.findall('li><a href="/lang/(.*?)"\stitle="(.*?)"', data, re.S)
-                       if Cats:
-                               for (Url, Title) in Cats:
-                                       Url = "https://www.xvideos.com/porn/" + Url + "/$$PAGE$$"
-                                       self.filmliste.append((Title, Url, default_cover, False))
                        self.filmliste.sort()
                        if self.scopeval[self.scope] == '':
+                               self.filmliste.append((400 * "—", None, default_cover, False))
+                               if Cats:
+                                       for (Url, Title) in Cats:
+                                               Url = "https://www.xvideos.com/porn/" + Url + "/$$PAGE$$"
+                                               self.filmliste.append((Title, Url, default_cover, False))
+                       if self.scopeval[self.scope] == '':
+                               self.filmliste.insert(0, (400 * "—", None, default_cover, False))
                                self.filmliste.insert(0, ("Channels", "https://www.xvideos.com/channels-index/$$AGE$$$$PAGE$$", default_cover, False))
                                self.filmliste.insert(0, ("Amateurs", "https://www.xvideos.com/amateurs-index/$$AGE$$$$PAGE$$", default_cover, False))
                                self.filmliste.insert(0, ("Erotic Models", "https://www.xvideos.com/erotic-models-index/$$AGE$$$$PAGE$$", default_cover, False))
@@ -143,12 +177,12 @@ class xvideosGenreScreen(MPScreen):
                                self.filmliste.insert(0, ("Newest", "https://www.xvideos.com/%s$$PAGE$$" % self.scopeval[self.scope], default_cover, False))
                        self.filmliste.insert(0, ("--- Search ---", "callSuchen", default_cover, True))
                self.ml.setList(map(self._defaultlistcenter, self.filmliste))
+               self['name'].setText('')
                self.ml.moveToIndex(0)
                self.keyLocked = False
                self.showInfos()
 
        def showInfos(self):
-               url = self['liste'].getCurrent()[0][1]
                cover = self['liste'].getCurrent()[0][2]
                CoverHelper(self['coverArt']).getCover(cover)
 
@@ -167,11 +201,14 @@ class xvideosGenreScreen(MPScreen):
                elif self.Name and self.Name.endswith("Best Videos"):
                        self.session.open(xvideosFilmScreen, Link, Name, Sort, Best=True)
                else:
-                       self.session.open(xvideosFilmScreen, Link, Name, Sort, Scope=self.scopeval[self.scope][:-1])
+                       if Link:
+                               self.session.open(xvideosFilmScreen, Link, Name, Sort, Scope=self.scopeval[self.scope][:-1])
 
        def keyScope(self):
                if self.keyLocked:
                        return
+               if self.Name == "Best Videos":
+                       return
                self.filmliste = []
                if self.scope == 0:
                        self.scope = 1
@@ -179,8 +216,24 @@ class xvideosGenreScreen(MPScreen):
                        self.scope = 2
                else:
                        self.scope = 0
+               self['F3'].setText(self.scopeText[self.scope])
                self.layoutFinished()
 
+       def keyCountry(self):
+               if self.keyLocked:
+                       return
+               if self.Name == "Best Videos":
+                       return
+               if len(self.country_list) > 0:
+                       self.session.openWithCallback(self.keyCountryAction, ChoiceBoxExt, title=_('Select Country'), list=self.country_list, keys=[])
+
+       def keyCountryAction(self, result):
+               if result:
+                       config_mp.mediaportal.xvideos_country.value = result[1]
+                       config_mp.mediaportal.xvideos_country.save()
+                       configfile_mp.save()
+                       self.layoutFinished()
+
        def SuchenCallback(self, callback = None):
                if callback is not None and len(callback):
                        Name = "--- Search ---"
@@ -190,7 +243,7 @@ class xvideosGenreScreen(MPScreen):
 
        def getSuggestions(self, text, max_res):
                url = "https://www.xvideos.com/search-suggest/%s%s" % (self.scopeval[self.scope], urllib.quote_plus(text))
-               d = twAgentGetPage(url, agent=agent, headers=json_headers, timeout=5)
+               d = twAgentGetPage(url, agent=agent, cookieJar=cookies, headers=json_headers, timeout=5)
                d.addCallback(self.gotSuggestions, max_res)
                d.addErrback(self.gotSuggestions, max_res, err=True)
                return d
@@ -265,7 +318,7 @@ class xvideosPornstarsScreen(MPScreen, ThumbsHelper):
                else:
                        page = ''
                url = self.Link.replace('$$PAGE$$', page).replace('$$AGE$$', self.region + self.age)
-               twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+               twAgentGetPage(url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
                lastp = re.search('label">.*?Top\s(.*?)\s(?:pornstars|porn actresses|cam girls|erotic models|female amateurs)', data, re.S)
@@ -338,7 +391,7 @@ class xvideosPornstarsScreen(MPScreen, ThumbsHelper):
                title = self['liste'].getCurrent()[0][0]
                Link = self['liste'].getCurrent()[0][1].replace('/videos/$$PORNSTAR$$/$$PAGE$$', '')
                self['name'].setText(title)
-               twAgentGetPage(Link, agent=agent, headers=headers).addCallback(self.showInfos2).addErrback(self.dataError)
+               twAgentGetPage(Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.showInfos2).addErrback(self.dataError)
 
        def showInfos2(self, data):
                infos = re.findall('class="profile-pic">(.*?)class="user-subscribe', data, re.S)
@@ -468,7 +521,7 @@ class xvideosFilmScreen(MPScreen, ThumbsHelper):
                self.filmliste = []
                if self.Related:
                        self.counter = 0
-                       twAgentGetPage(self.Link, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(self.Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
                else:
                        if re.match(".*Search", self.Name):
                                url = "https://www.xvideos.com/?k=%s&p=%s&sort=%s&datef=%s&durf=allduration&typef=%s" % (self.Link, str(self.page-1), self.sort, self.age, self.Scope)
@@ -489,8 +542,8 @@ class xvideosFilmScreen(MPScreen, ThumbsHelper):
                                self.counter = 2
                                self.url2 = url.replace('$$PORNSTAR$$', 'new')
                                url = url.replace('$$PORNSTAR$$', 'pornstar-new')
-                               twAgentGetPage(self.url2, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
-                       twAgentGetPage(url, agent=agent, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                               twAgentGetPage(self.url2, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
+                       twAgentGetPage(url, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
                if self.Related:
@@ -664,7 +717,7 @@ class xvideosFilmScreen(MPScreen, ThumbsHelper):
                        rangelist = [ ['Video', 'video'], ['Profile', 'profile'] ]
                        self.session.openWithCallback(self.keyOKAction, ChoiceBoxExt, title=_('Select Action'), list = rangelist)
                else:
-                       twAgentGetPage(Link, agent=agent, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
+                       twAgentGetPage(Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
 
        def keyOKAction(self, result):
                if result:
@@ -675,7 +728,7 @@ class xvideosFilmScreen(MPScreen, ThumbsHelper):
                                        self.session.open(xvideosFilmScreen, Link, Name, False)
                        else:
                                Link = self['liste'].getCurrent()[0][1]
-                               twAgentGetPage(Link, agent=agent, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
+                               twAgentGetPage(Link, agent=agent, cookieJar=cookies, headers=headers).addCallback(self.parseData).addErrback(self.dataError)
 
        def parseData(self, data):
                match = re.findall("setVideo(?:UrlLow|UrlHigh|HLS)\('(.*?)'\);", data)
index 33a32c9..9b4c1db 100644 (file)
@@ -404,23 +404,16 @@ class youpornFilmScreen(MPScreen, ThumbsHelper):
 
        def loadData(self, data):
                self.getLastPage(data, 'objectPagination =.*?total: (\d+),', '(\d+)')
-               parse = re.search('My Favorited Videos(.*?)class=\'ad-bottom-text', data, re.S)
-               if not parse:
-                       parse = re.search('eight-column\sheading4\'>Videos from(.*?)class=\'ad-bottom-text', data, re.S)
-                       if not parse:
-                               parse = re.search('class=\'container\'>(.*?)search-suggestions', data, re.S)
-                               if not parse:
-                                       parse = re.search('heading4\'>Most Recent Videos</h2(.*?)class=\'ad-bottom-text', data, re.S)
-                                       if not parse:
-                                               parse = re.search('class=\'ad-bottom-text\'>(.*?)class=\'footer', data, re.S)
+               parse = re.findall('<div data-espnode="videobox" class=\'video-box(.*?)<i class="icon-thin-x">', data, re.S)
                if parse:
-                       Movies = re.findall('data-video-id="\d+".*?<a\shref="(.*?)".*?<img\ssrc=".*?"\salt=\'(.*?)\'.*?data-(?:thumbnail|echo)="(.*?)".*?class=\'video-box-percentage\sup\'>(.*?)</.*?class="video-duration">(.*?)</', parse.group(1), re.S)
-                       if Movies:
-                               for (Url, Title, Image, Rating, Runtime) in Movies:
-                                       Url = Url.replace("&amp;","&")
-                                       self.filmliste.append((decodeHtml(Title), Url, Image, Runtime.strip(), Rating.strip()))
+                       for video in parse:
+                               Movies = re.findall('data-video-id="\d+".*?<a\shref="(.*?)".*?<img\ssrc=".*?"\salt=\'(.*?)\'.*?data-(?:thumbnail|echo)="(.*?)".*?class="video-duration">(.*?)</', video, re.S)
+                               if Movies:
+                                       for (Url, Title, Image, Runtime) in Movies:
+                                               Url = Url.replace("&amp;","&")
+                                               self.filmliste.append((decodeHtml(Title), Url, Image, Runtime.strip()))
                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
@@ -431,9 +424,8 @@ class youpornFilmScreen(MPScreen, ThumbsHelper):
                title = self['liste'].getCurrent()[0][0]
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
-               rating = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               self['handlung'].setText("Runtime: %s\nRating: %s" % (runtime, rating))
+               self['handlung'].setText("Runtime: %s" % runtime)
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keyOK(self):
@@ -450,5 +442,5 @@ class youpornFilmScreen(MPScreen, ThumbsHelper):
                        videoPage = re.findall('\d+","videoUrl":[\"|\'](http[s]?.*?)[\"|\']', parse[-1], re.S)
                        if videoPage:
                                self.keyLocked = False
-                               url = decodeHtml(videoPage[0]).replace('\/','/')#.replace('%2F','%252F').replace('%3D','%253D').replace('%2B','%252B'))
+                               url = decodeHtml(videoPage[0]).replace('\/','/')
                                self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='youporn')
\ No newline at end of file
index 35fff95..ca50b3b 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/CZ.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/CZ.png differ
index 00aba9e..950e5e9 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/DE.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/DE.png differ
index b366956..43b759a 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/EN.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/EN.png differ
index 25933a2..f5b1085 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ENDE.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ENDE.png differ
index f59b3e0..3559811 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ES.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/ES.png differ
index 8b148b5..1f47e1a 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/FI.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/FI.png differ
index 48bbf76..c2d76e0 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/PL.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/PL.png differ
index 881fd06..5b580a2 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/RU.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/RU.png differ
index 741aebc..22766e8 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SE.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SE.png differ
index df6f22c..7a2a928 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SK.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/SK.png differ
index aea87a9..27745ab 100644 (file)
Binary files a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/TR.png and b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/countries/TR.png differ
index 19049f3..a3524c1 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 7c049a1..0b86b26 100644 (file)
@@ -1,8 +1,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: MediaPortal\n"
-"POT-Creation-Date: 2019-08-30 17:26+0200\n"
-"PO-Revision-Date: 2019-08-30 17:27+0200\n"
+"POT-Creation-Date: 2019-10-21 21:47+0200\n"
+"PO-Revision-Date: 2019-10-21 21:48+0200\n"
 "Last-Translator: dhwz <dhwz@gmx.net>\n"
 "Language-Team: MediaPortal Team\n"
 "Language: de_DE\n"
@@ -16,15 +16,7 @@ msgstr ""
 "X-Poedit-SearchPath-0: src\n"
 "X-Poedit-SearchPath-1: mpgz/src\n"
 
-#: mpgz/src/additions/porn/adultbay.py:52
-#, python-format
-msgid ""
-"%s only works with enabled MP premiumize.me or Real-Debrid.com option (MP "
-"Setup)!"
-msgstr ""
-"%s funktioniert nur mit aktivierter premiumize.me oder Real-Debrid.com "
-"Einstellung (MP Setup)!"
-
+#: mpgz/src/additions/porn/absoluporn.py:99
 #: mpgz/src/additions/porn/adultbay.py:131
 #: mpgz/src/additions/porn/amateuremdh.py:89
 #: mpgz/src/additions/porn/bitporno.py:97
@@ -33,6 +25,7 @@ msgstr ""
 #: mpgz/src/additions/porn/fapbraze.py:107
 #: mpgz/src/additions/porn/freeomovie.py:154
 #: mpgz/src/additions/porn/hqporner.py:144
+#: mpgz/src/additions/porn/incestflix.py:91
 #: mpgz/src/additions/porn/javbraze.py:181
 #: mpgz/src/additions/porn/javdos.py:166 mpgz/src/additions/porn/lfporn.py:89
 #: mpgz/src/additions/porn/mydirtyhobby.py:90
@@ -43,67 +36,74 @@ msgstr ""
 #: mpgz/src/additions/porn/pornfromczech.py:149
 #: mpgz/src/additions/porn/pornrewind.py:99
 #: mpgz/src/additions/porn/pornstreams.py:110
-#: mpgz/src/additions/porn/porntrex.py:219
+#: mpgz/src/additions/porn/porntrex.py:220
 #: mpgz/src/additions/porn/pornvortexx.py:100
 #: mpgz/src/additions/porn/streammdh.py:128
 #: mpgz/src/additions/porn/streamxxx.py:153
-#: mpgz/src/additions/porn/yourpornsexy.py:145
-#: mpgz/src/additions/porn/yourpornsexy.py:207
-#: mpgz/src/additions/porn/yourpornsexy.py:275
+#: mpgz/src/additions/porn/yourpornsexy.py:144
+#: mpgz/src/additions/porn/yourpornsexy.py:206
+#: mpgz/src/additions/porn/yourpornsexy.py:274
 #: mpgz/src/additions/useradditions/flimmerstube.py:80
 #: mpgz/src/additions/useradditions/movie4k.py:351
 #: mpgz/src/additions/useradditions/movie4k.py:844
-#: src/additions/fun/failto.py:65 src/additions/fun/gigatv.py:129
-#: src/additions/fun/retrotv.py:68 src/additions/fun/twitch.py:134
-#: src/additions/mediatheken/srg.py:181 src/additions/music/radio.py:298
-#: src/additions/porn/ahme.py:186 src/additions/porn/badoinkvr.py:130
+#: src/additions/fun/failto.py:65 src/additions/fun/retrotv.py:68
+#: src/additions/fun/twitch.py:134 src/additions/mediatheken/srg.py:181
+#: src/additions/music/radio.py:298 src/additions/porn/ahme.py:186
+#: src/additions/porn/anyporn.py:286 src/additions/porn/badoinkvr.py:130
 #: src/additions/porn/badoinkvr.py:204 src/additions/porn/bangbros.py:142
 #: src/additions/porn/beeg.py:141 src/additions/porn/befuck.py:140
 #: src/additions/porn/bongacams.py:132 src/additions/porn/brazzers.py:145
 #: src/additions/porn/cam4.py:171 src/additions/porn/chaturbate.py:181
 #: src/additions/porn/cliphunter.py:170 src/additions/porn/cliphunter.py:240
-#: src/additions/porn/cumlouder.py:284 src/additions/porn/cumlouder.py:358
-#: src/additions/porn/cumlouder.py:433 src/additions/porn/dachix.py:159
+#: 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:145
-#: src/additions/porn/faapy.py:211 src/additions/porn/fetishshrine.py:137
-#: src/additions/porn/freeones.py:161 src/additions/porn/hdporn.py:123
-#: src/additions/porn/homemoviestube.py:166 src/additions/porn/hotscope.py:146
+#: src/additions/porn/extremetube.py:167 src/additions/porn/faapy.py:147
+#: src/additions/porn/faapy.py:213 src/additions/porn/fetishshrine.py:137
+#: src/additions/porn/freeones.py:161 src/additions/porn/hclips.py:163
+#: src/additions/porn/hdporn.py:123 src/additions/porn/hdzog.py:167
+#: src/additions/porn/homemoviestube.py:166 src/additions/porn/hotmovs.py:166
+#: src/additions/porn/hotscope.py:148 src/additions/porn/hypnotube.py:140
 #: src/additions/porn/julesjordan.py:145 src/additions/porn/julesjordan.py:216
 #: src/additions/porn/kink.py:147 src/additions/porn/mofos.py:136
 #: src/additions/porn/mofos.py:212 src/additions/porn/moviefap.py:134
 #: src/additions/porn/naughtyamerica.py:152
 #: src/additions/porn/nubilefilms.py:132 src/additions/porn/nubilefilms.py:206
-#: src/additions/porn/nudez.py:165 src/additions/porn/pinflix.py:165
-#: src/additions/porn/pinflix.py:280 src/additions/porn/porncom.py:192
+#: src/additions/porn/nudez.py:165 src/additions/porn/pinflix.py:232
+#: src/additions/porn/pinflix.py:367 src/additions/porn/porncom.py:192
 #: src/additions/porn/porncom.py:331 src/additions/porn/porncom.py:469
 #: src/additions/porn/porncom.py:607 src/additions/porn/porndoe.py:147
-#: src/additions/porn/pornhub.py:310 src/additions/porn/pornhub.py:466
-#: src/additions/porn/pornhub.py:624 src/additions/porn/pornhub.py:758
-#: src/additions/porn/pornhub.py:886 src/additions/porn/pornoxo.py:182
-#: src/additions/porn/pornrabbit.py:137 src/additions/porn/porntv.py:290
+#: src/additions/porn/porngo.py:72 src/additions/porn/porngo.py:202
+#: src/additions/porn/pornhub.py:311 src/additions/porn/pornhub.py:467
+#: src/additions/porn/pornhub.py:625 src/additions/porn/pornhub.py:759
+#: src/additions/porn/pornhub.py:887 src/additions/porn/pornoxo.py:182
+#: src/additions/porn/pornrabbit.py:137 src/additions/porn/porntv.py:292
 #: src/additions/porn/realgfporn.py:160 src/additions/porn/realitykings.py:156
 #: src/additions/porn/redtube.py:181 src/additions/porn/sexu.py:130
-#: src/additions/porn/shesfreaky.py:139 src/additions/porn/spankbang.py:167
-#: src/additions/porn/spankwire.py:204 src/additions/porn/sunporno.py:192
-#: src/additions/porn/teamskeet.py:145 src/additions/porn/tnaflix.py:153
-#: src/additions/porn/tube8.py:200 src/additions/porn/tubewolf.py:158
-#: src/additions/porn/updatetube.py:183 src/additions/porn/vintagetube.py:243
+#: src/additions/porn/shemalez.py:165 src/additions/porn/shesfreaky.py:139
+#: src/additions/porn/spankbang.py:167 src/additions/porn/spankwire.py:204
+#: src/additions/porn/sunporno.py:192 src/additions/porn/teamskeet.py:145
+#: src/additions/porn/tnaflix.py:153 src/additions/porn/tube8.py:200
+#: src/additions/porn/tubepornclassic.py:159 src/additions/porn/tubewolf.py:162
+#: src/additions/porn/txxx.py:166 src/additions/porn/updatetube.py:183
+#: src/additions/porn/upornia.py:166 src/additions/porn/vintagetube.py:243
+#: src/additions/porn/vjav.py:165 src/additions/porn/voyeurhit.py:167
 #: src/additions/porn/vporn.py:288 src/additions/porn/wetplace.py:137
 #: src/additions/porn/wicked.py:129 src/additions/porn/wicked.py:211
 #: src/additions/porn/x4tube.py:245 src/additions/porn/x4tube.py:373
-#: src/additions/porn/xhamster.py:494 src/additions/porn/xhamster.py:622
+#: src/additions/porn/xhamster.py:495 src/additions/porn/xhamster.py:620
 #: src/additions/porn/xnxx.py:199 src/additions/porn/xpaja.py:148
-#: src/additions/porn/xvideos.py:238 src/additions/porn/xvideos.py:434
-#: src/additions/porn/youporn.py:316 src/additions/porn/youporn.py:383
-#: src/plugin.py:2142 src/plugin.py:2394 src/plugin.py:3192 src/plugin.py:3211
-#: src/resources/showAsThumb.py:247
+#: src/additions/porn/xvideos.py:275 src/additions/porn/xvideos.py:471
+#: src/additions/porn/xxxdan.py:166 src/additions/porn/youporn.py:316
+#: src/additions/porn/youporn.py:383 src/plugin.py:2142 src/plugin.py:2394
+#: src/plugin.py:3192 src/plugin.py:3211 src/resources/showAsThumb.py:247
 msgid "Page"
 msgstr "Seite"
 
+#: mpgz/src/additions/porn/absoluporn.py:101
 #: mpgz/src/additions/porn/adultbay.py:133
 #: mpgz/src/additions/porn/amateuremdh.py:93
 #: mpgz/src/additions/porn/bitporno.py:99
@@ -112,6 +112,7 @@ msgstr "Seite"
 #: mpgz/src/additions/porn/fapbraze.py:109
 #: mpgz/src/additions/porn/freeomovie.py:156
 #: mpgz/src/additions/porn/hqporner.py:146
+#: mpgz/src/additions/porn/incestflix.py:93
 #: mpgz/src/additions/porn/javbraze.py:183
 #: mpgz/src/additions/porn/javdos.py:168 mpgz/src/additions/porn/lfporn.py:91
 #: mpgz/src/additions/porn/mydirtyhobby.py:94
@@ -122,13 +123,13 @@ msgstr "Seite"
 #: mpgz/src/additions/porn/pornfromczech.py:151
 #: mpgz/src/additions/porn/pornrewind.py:101
 #: mpgz/src/additions/porn/pornstreams.py:112
-#: mpgz/src/additions/porn/porntrex.py:221
+#: mpgz/src/additions/porn/porntrex.py:222
 #: mpgz/src/additions/porn/pornvortexx.py:102
 #: mpgz/src/additions/porn/streammdh.py:131
 #: mpgz/src/additions/porn/streamxxx.py:155
-#: mpgz/src/additions/porn/yourpornsexy.py:147
-#: mpgz/src/additions/porn/yourpornsexy.py:209
-#: mpgz/src/additions/porn/yourpornsexy.py:277
+#: mpgz/src/additions/porn/yourpornsexy.py:146
+#: mpgz/src/additions/porn/yourpornsexy.py:208
+#: mpgz/src/additions/porn/yourpornsexy.py:276
 #: mpgz/src/additions/sport/wrestlingnetwork.py:86
 #: mpgz/src/additions/useradditions/ddl_me.py:164
 #: mpgz/src/additions/useradditions/filmpalast.py:307
@@ -139,8 +140,7 @@ msgstr "Seite"
 #: src/additions/fun/failto.py:67 src/additions/fun/forplayers.py:80
 #: src/additions/fun/forplayers.py:259
 #: src/additions/fun/funnyvideoclips_de.py:80
-#: src/additions/fun/gaskrank_tv.py:88 src/additions/fun/gigatv.py:131
-#: src/additions/fun/heisevideo.py:133 src/additions/fun/lachmeister_de.py:116
+#: src/additions/fun/gaskrank_tv.py:88 src/additions/fun/lachmeister_de.py:116
 #: src/additions/fun/lachschon_de.py:134 src/additions/fun/liveleak.py:99
 #: src/additions/fun/retrotv.py:70 src/additions/fun/twitch.py:144
 #: src/additions/mediatheken/ard.py:539 src/additions/mediatheken/arte.py:302
@@ -157,126 +157,68 @@ msgstr "Seite"
 #: 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/dokustream.py:140 src/additions/newsdoku/wissen.py:64
-#: src/additions/porn/ahme.py:188 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/chaturbate.py:183
-#: src/additions/porn/cliphunter.py:172 src/additions/porn/cliphunter.py:242
-#: src/additions/porn/cumlouder.py:286 src/additions/porn/cumlouder.py:360
-#: src/additions/porn/cumlouder.py:437 src/additions/porn/dachix.py:161
-#: src/additions/porn/ddfnetwork.py:165 src/additions/porn/ddfnetwork.py:241
+#: 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/chaturbate.py:183 src/additions/porn/cliphunter.py:172
+#: src/additions/porn/cliphunter.py:242 src/additions/porn/cumlouder.py:287
+#: src/additions/porn/cumlouder.py:361 src/additions/porn/cumlouder.py:438
+#: src/additions/porn/dachix.py:161 src/additions/porn/ddfnetwork.py:165
+#: src/additions/porn/ddfnetwork.py:241
 #: src/additions/porn/digitalplayground.py:156
 #: src/additions/porn/drtuber.py:193 src/additions/porn/elladies.py:135
 #: src/additions/porn/eporner.py:167 src/additions/porn/eroprofile.py:141
-#: src/additions/porn/extremetube.py:195 src/additions/porn/faapy.py:146
-#: src/additions/porn/faapy.py:213 src/additions/porn/fetishshrine.py:139
-#: src/additions/porn/freeones.py:163 src/additions/porn/hdporn.py:125
-#: src/additions/porn/homemoviestube.py:170 src/additions/porn/hotscope.py:148
+#: src/additions/porn/extremetube.py:195 src/additions/porn/faapy.py:148
+#: src/additions/porn/faapy.py:215 src/additions/porn/fetishshrine.py:139
+#: src/additions/porn/freeones.py:163 src/additions/porn/hclips.py:165
+#: src/additions/porn/hdporn.py:125 src/additions/porn/hdzog.py:169
+#: src/additions/porn/homemoviestube.py:170 src/additions/porn/hotmovs.py:168
+#: src/additions/porn/hotscope.py:150 src/additions/porn/hypnotube.py:142
 #: src/additions/porn/julesjordan.py:147 src/additions/porn/julesjordan.py:218
 #: src/additions/porn/kink.py:149 src/additions/porn/mofos.py:138
 #: src/additions/porn/mofos.py:214 src/additions/porn/moviefap.py:136
 #: src/additions/porn/naughtyamerica.py:154
 #: src/additions/porn/nubilefilms.py:134 src/additions/porn/nubilefilms.py:208
-#: src/additions/porn/nudez.py:167 src/additions/porn/pinflix.py:168
-#: src/additions/porn/pinflix.py:283 src/additions/porn/porncom.py:194
+#: src/additions/porn/nudez.py:167 src/additions/porn/pinflix.py:235
+#: src/additions/porn/pinflix.py:370 src/additions/porn/porncom.py:194
 #: src/additions/porn/porncom.py:334 src/additions/porn/porncom.py:472
 #: src/additions/porn/porncom.py:613 src/additions/porn/porndoe.py:151
-#: src/additions/porn/pornhub.py:313 src/additions/porn/pornhub.py:469
-#: src/additions/porn/pornhub.py:627 src/additions/porn/pornhub.py:761
-#: src/additions/porn/pornhub.py:888 src/additions/porn/pornoxo.py:184
-#: src/additions/porn/pornrabbit.py:139 src/additions/porn/porntv.py:292
+#: src/additions/porn/porngo.py:73 src/additions/porn/porngo.py:204
+#: src/additions/porn/pornhub.py:314 src/additions/porn/pornhub.py:470
+#: src/additions/porn/pornhub.py:628 src/additions/porn/pornhub.py:762
+#: src/additions/porn/pornhub.py:889 src/additions/porn/pornoxo.py:184
+#: src/additions/porn/pornrabbit.py:139 src/additions/porn/porntv.py:294
 #: src/additions/porn/realgfporn.py:162 src/additions/porn/realitykings.py:158
 #: src/additions/porn/redtube.py:185 src/additions/porn/sexu.py:132
-#: src/additions/porn/shesfreaky.py:141 src/additions/porn/spankbang.py:173
-#: src/additions/porn/spankwire.py:233 src/additions/porn/sunporno.py:194
-#: src/additions/porn/teamskeet.py:147 src/additions/porn/tnaflix.py:155
-#: src/additions/porn/tube8.py:204 src/additions/porn/tubewolf.py:160
-#: src/additions/porn/updatetube.py:185 src/additions/porn/vintagetube.py:191
-#: src/additions/porn/vintagetube.py:274 src/additions/porn/vporn.py:292
+#: src/additions/porn/shemalez.py:167 src/additions/porn/shesfreaky.py:141
+#: src/additions/porn/spankbang.py:173 src/additions/porn/spankwire.py:233
+#: src/additions/porn/sunporno.py:194 src/additions/porn/teamskeet.py:147
+#: src/additions/porn/tnaflix.py:155 src/additions/porn/tube8.py:204
+#: src/additions/porn/tubepornclassic.py:161 src/additions/porn/tubewolf.py:164
+#: src/additions/porn/txxx.py:168 src/additions/porn/updatetube.py:185
+#: src/additions/porn/upornia.py:168 src/additions/porn/vintagetube.py:191
+#: src/additions/porn/vintagetube.py:274 src/additions/porn/vjav.py:167
+#: src/additions/porn/voyeurhit.py:169 src/additions/porn/vporn.py:292
 #: src/additions/porn/wetplace.py:139 src/additions/porn/wicked.py:131
 #: src/additions/porn/wicked.py:213 src/additions/porn/x4tube.py:248
-#: src/additions/porn/x4tube.py:377 src/additions/porn/xhamster.py:496
+#: src/additions/porn/x4tube.py:377 src/additions/porn/xhamster.py:497
 #: src/additions/porn/xnxx.py:204 src/additions/porn/xpaja.py:150
-#: src/additions/porn/xvideos.py:241 src/additions/porn/xvideos.py:443
-#: src/additions/porn/youporn.py:318 src/additions/porn/youporn.py:385
+#: src/additions/porn/xvideos.py:278 src/additions/porn/xvideos.py:480
+#: src/additions/porn/xxxdan.py:170 src/additions/porn/youporn.py:318
+#: src/additions/porn/youporn.py:385
 msgid "Page:"
 msgstr "Seite:"
 
-#: mpgz/src/additions/porn/adultbay.py:155
-#: mpgz/src/additions/porn/adultbay.py:158
-#: mpgz/src/additions/porn/datoporn.py:127
-#: mpgz/src/additions/porn/fapbraze.py:146
-#: mpgz/src/additions/porn/hqporner.py:168
-#: mpgz/src/additions/porn/javbraze.py:242
-#: mpgz/src/additions/porn/javdos.py:210 mpgz/src/additions/porn/lfporn.py:122
-#: mpgz/src/additions/porn/pandamovie.py:159
-#: mpgz/src/additions/porn/paradisehill.py:149
-#: mpgz/src/additions/porn/porn00.py:133
-#: mpgz/src/additions/porn/pornfreetv.py:197
-#: mpgz/src/additions/porn/pornfromczech.py:179
-#: mpgz/src/additions/porn/pornrewind.py:130
-#: mpgz/src/additions/porn/pornstreams.py:141
-#: mpgz/src/additions/porn/pornvortexx.py:137
-#: mpgz/src/additions/porn/streamxxx.py:188
-#: mpgz/src/additions/useradditions/filmpalast.py:260
-#: mpgz/src/additions/useradditions/filmpalast.py:334
-#: mpgz/src/additions/useradditions/movie4k.py:297
-#: mpgz/src/additions/useradditions/movie4k.py:388
-#: mpgz/src/additions/useradditions/movie4k.py:415
-#: mpgz/src/additions/useradditions/movie4k.py:487
-#: mpgz/src/additions/useradditions/movie4k.py:559
-#: mpgz/src/additions/useradditions/movie4k.py:757
-#: mpgz/src/additions/useradditions/movie4k.py:893
-#: 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:693 src/additions/porn/pornhub.py:1004
-#: src/additions/porn/pornhub.py:1029 src/additions/porn/pornoxo.py:215
-#: src/additions/porn/porntv.py:347 src/additions/porn/sexu.py:165
-#: src/additions/porn/shesfreaky.py:175 src/additions/porn/spankbang.py:225
-#: src/additions/porn/tube8.py:271 src/additions/porn/xnxx.py:275
-#: src/additions/porn/xpaja.py:182 src/additions/porn/xvideos.py:584
-msgid "No movies found!"
-msgstr "Keine Filme gefunden!"
-
-#: mpgz/src/additions/porn/adultbay.py:233
-#: mpgz/src/additions/porn/hqporner.py:217
-#: mpgz/src/additions/porn/hqporner.py:231
-#: mpgz/src/additions/porn/javdos.py:272 mpgz/src/additions/porn/javdos.py:275
-#: mpgz/src/additions/porn/lfporn.py:184
-#: mpgz/src/additions/porn/pandamovie.py:220
-#: mpgz/src/additions/porn/pornfreetv.py:263
-#: mpgz/src/additions/porn/pornfromczech.py:242
-#: mpgz/src/additions/porn/pornrewind.py:207
-#: mpgz/src/additions/porn/pornstreams.py:203
-#: mpgz/src/additions/porn/streamxxx.py:253
-#: mpgz/src/additions/useradditions/ddl_me.py:562
-#: mpgz/src/additions/useradditions/filmpalast.py:399
-#: mpgz/src/additions/useradditions/flimmerstube.py:173
-#: mpgz/src/additions/useradditions/flimmerstube.py:181
-#: mpgz/src/additions/useradditions/kinoxto.py:827
-#: mpgz/src/additions/useradditions/kinoxto.py:862
-#: mpgz/src/additions/useradditions/kinoxto.py:944
-#: mpgz/src/additions/useradditions/serienstream.py:822
-#: mpgz/src/additions/useradditions/watchseries.py:296
-#: src/additions/porn/pornrabbit.py:210
-msgid "No supported streams found!"
-msgstr "Keine unterstützten Streams gefunden!"
-
-#: mpgz/src/additions/porn/amateuremdh.py:91
-#: mpgz/src/additions/porn/mydirtyhobby.py:92
-#: mpgz/src/additions/porn/streammdh.py:129 src/additions/porn/pornhub.py:1058
-#: src/additions/porn/xhamster.py:495 src/additions/porn/xhamster.py:623
-#: src/additions/porn/xnxx.py:202 src/additions/porn/xvideos.py:441
-msgid "Show Related"
-msgstr "Ähnliche anzeigen"
-
+#: mpgz/src/additions/porn/absoluporn.py:114
 #: mpgz/src/additions/porn/amateuremdh.py:106
 #: mpgz/src/additions/porn/bitporno.py:112
 #: mpgz/src/additions/porn/datoporn.py:107
 #: mpgz/src/additions/porn/dirtymoviez.py:107
 #: mpgz/src/additions/porn/fapbraze.py:122
 #: mpgz/src/additions/porn/freeomovie.py:166
+#: mpgz/src/additions/porn/incestflix.py:106
 #: mpgz/src/additions/porn/javbraze.py:196 mpgz/src/additions/porn/javdos.py:61
 #: mpgz/src/additions/porn/javdos.py:181 mpgz/src/additions/porn/javdos.py:238
 #: mpgz/src/additions/porn/lfporn.py:104
@@ -294,8 +236,8 @@ msgstr "Ähnliche anzeigen"
 #: mpgz/src/additions/porn/pornfromczech.py:164
 #: mpgz/src/additions/porn/pornrewind.py:114
 #: mpgz/src/additions/porn/pornstreams.py:125
-#: mpgz/src/additions/porn/porntrex.py:234
-#: mpgz/src/additions/porn/porntrex.py:307
+#: mpgz/src/additions/porn/porntrex.py:235
+#: mpgz/src/additions/porn/porntrex.py:316
 #: mpgz/src/additions/porn/pornvortexx.py:117
 #: mpgz/src/additions/porn/streammdh.py:41
 #: mpgz/src/additions/porn/streammdh.py:144
@@ -303,9 +245,9 @@ msgstr "Ähnliche anzeigen"
 #: mpgz/src/additions/porn/streamxxx.py:152
 #: mpgz/src/additions/porn/streamxxx.py:167
 #: mpgz/src/additions/porn/streamxxx.py:230
-#: mpgz/src/additions/porn/yourpornsexy.py:161
-#: mpgz/src/additions/porn/yourpornsexy.py:222
-#: mpgz/src/additions/porn/yourpornsexy.py:291
+#: mpgz/src/additions/porn/yourpornsexy.py:160
+#: mpgz/src/additions/porn/yourpornsexy.py:221
+#: mpgz/src/additions/porn/yourpornsexy.py:290
 #: mpgz/src/additions/sport/wrestlingnetwork.py:27
 #: mpgz/src/additions/useradditions/ddl_me.py:217
 #: mpgz/src/additions/useradditions/filmpalast.py:66
@@ -324,11 +266,8 @@ msgstr "Ähnliche anzeigen"
 #: mpgz/src/additions/useradditions/serienstream.py:94
 #: mpgz/src/additions/useradditions/watchseries.py:278
 #: src/additions/fun/chefkoch.py:60 src/additions/fun/chefkoch.py:113
-#: src/additions/fun/e2world.py:98 src/additions/fun/failto.py:79
-#: src/additions/fun/funnyvideoclips_de.py:119
-#: src/additions/fun/gaskrank_tv.py:126 src/additions/fun/gigatv.py:145
-#: src/additions/fun/heisevideo.py:68 src/additions/fun/heisevideo.py:149
-#: src/additions/fun/heisevideo.py:210 src/additions/fun/lachmeister_de.py:150
+#: src/additions/fun/failto.py:79 src/additions/fun/funnyvideoclips_de.py:119
+#: src/additions/fun/gaskrank_tv.py:126 src/additions/fun/lachmeister_de.py:150
 #: src/additions/fun/lachschon_de.py:170 src/additions/fun/liveleak.py:108
 #: src/additions/fun/retrotv.py:80 src/additions/mediatheken/ard.py:458
 #: src/additions/mediatheken/ard.py:657 src/additions/mediatheken/arte.py:183
@@ -361,6 +300,7 @@ msgstr "Ähnliche anzeigen"
 #: src/additions/newsdoku/dokus4_me.py:164
 #: src/additions/newsdoku/dokustream.py:175 src/additions/newsdoku/focus.py:119
 #: src/additions/newsdoku/urknall.py:73 src/additions/porn/ahme.py:202
+#: src/additions/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
@@ -371,110 +311,203 @@ msgstr "Ähnliche anzeigen"
 #: src/additions/porn/camsoda.py:125 src/additions/porn/camsoda.py:205
 #: src/additions/porn/chaturbate.py:196 src/additions/porn/chaturbate.py:260
 #: src/additions/porn/cliphunter.py:255 src/additions/porn/cumlouder.py:73
-#: src/additions/porn/cumlouder.py:162 src/additions/porn/cumlouder.py:228
-#: src/additions/porn/cumlouder.py:299 src/additions/porn/cumlouder.py:373
-#: src/additions/porn/cumlouder.py:459 src/additions/porn/dachix.py:71
+#: 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:152
-#: src/additions/porn/faapy.py:226 src/additions/porn/fetishshrine.py:152
-#: src/additions/porn/freeones.py:176 src/additions/porn/hdporn.py:138
-#: src/additions/porn/homemoviestube.py:185 src/additions/porn/hotscope.py:161
-#: src/additions/porn/julesjordan.py:72 src/additions/porn/julesjordan.py:160
-#: src/additions/porn/julesjordan.py:231 src/additions/porn/kink.py:162
-#: src/additions/porn/mofos.py:72 src/additions/porn/mofos.py:151
-#: src/additions/porn/mofos.py:227 src/additions/porn/moviefap.py:149
-#: src/additions/porn/naughtyamerica.py:167
+#: src/additions/porn/extremetube.py:181 src/additions/porn/faapy.py:154
+#: src/additions/porn/faapy.py:228 src/additions/porn/fetishshrine.py:152
+#: src/additions/porn/freeones.py:176 src/additions/porn/hclips.py:178
+#: src/additions/porn/hdporn.py:138 src/additions/porn/hdzog.py:182
+#: src/additions/porn/homemoviestube.py:185 src/additions/porn/hotmovs.py:181
+#: src/additions/porn/hotscope.py:163 src/additions/porn/hotscope.py:216
+#: src/additions/porn/hypnotube.py:155 src/additions/porn/julesjordan.py:72
+#: src/additions/porn/julesjordan.py:160 src/additions/porn/julesjordan.py:231
+#: src/additions/porn/kink.py:162 src/additions/porn/mofos.py:72
+#: src/additions/porn/mofos.py:151 src/additions/porn/mofos.py:227
+#: src/additions/porn/moviefap.py:149 src/additions/porn/naughtyamerica.py:167
 #: src/additions/porn/nubilefilms.py:71 src/additions/porn/nubilefilms.py:147
 #: src/additions/porn/nubilefilms.py:221 src/additions/porn/nudez.py:180
-#: src/additions/porn/pinflix.py:182 src/additions/porn/pinflix.py:302
+#: src/additions/porn/pinflix.py:253 src/additions/porn/pinflix.py:392
 #: src/additions/porn/porncom.py:211 src/additions/porn/porncom.py:351
 #: src/additions/porn/porncom.py:489 src/additions/porn/porncom.py:634
-#: src/additions/porn/porndoe.py:169 src/additions/porn/pornhub.py:922
+#: src/additions/porn/porndoe.py:169 src/additions/porn/porngo.py:217
+#: src/additions/porn/pornhub.py:924 src/additions/porn/pornhub.py:1127
 #: src/additions/porn/pornoxo.py:197 src/additions/porn/pornrabbit.py:152
-#: src/additions/porn/porntv.py:163 src/additions/porn/porntv.py:305
+#: src/additions/porn/porntv.py:163 src/additions/porn/porntv.py:307
 #: src/additions/porn/realgfporn.py:175 src/additions/porn/realitykings.py:73
 #: src/additions/porn/realitykings.py:171 src/additions/porn/redtube.py:206
 #: src/additions/porn/sexu.py:68 src/additions/porn/sexu.py:145
-#: src/additions/porn/shesfreaky.py:72 src/additions/porn/shesfreaky.py:154
-#: src/additions/porn/spankbang.py:204 src/additions/porn/spankwire.py:87
-#: src/additions/porn/spankwire.py:218 src/additions/porn/sunporno.py:86
-#: src/additions/porn/sunporno.py:207 src/additions/porn/teamskeet.py:73
-#: src/additions/porn/teamskeet.py:160 src/additions/porn/tnaflix.py:168
-#: src/additions/porn/tube8.py:228 src/additions/porn/tubewolf.py:84
-#: src/additions/porn/tubewolf.py:157 src/additions/porn/updatetube.py:92
-#: src/additions/porn/updatetube.py:198 src/additions/porn/vintagetube.py:87
+#: src/additions/porn/shemalez.py:180 src/additions/porn/shesfreaky.py:72
+#: src/additions/porn/shesfreaky.py:154 src/additions/porn/spankbang.py:204
+#: src/additions/porn/spankwire.py:87 src/additions/porn/spankwire.py:218
+#: src/additions/porn/sunporno.py:86 src/additions/porn/sunporno.py:207
+#: src/additions/porn/teamskeet.py:73 src/additions/porn/teamskeet.py:160
+#: src/additions/porn/tnaflix.py:168 src/additions/porn/tube8.py:228
+#: src/additions/porn/tubepornclassic.py:174 src/additions/porn/tubewolf.py:87
+#: src/additions/porn/tubewolf.py:161 src/additions/porn/txxx.py:181
+#: src/additions/porn/updatetube.py:92 src/additions/porn/updatetube.py:198
+#: src/additions/porn/upornia.py:181 src/additions/porn/vintagetube.py:87
 #: src/additions/porn/vintagetube.py:181 src/additions/porn/vintagetube.py:257
-#: src/additions/porn/vintagetube.py:317 src/additions/porn/vporn.py:101
+#: src/additions/porn/vintagetube.py:317 src/additions/porn/vjav.py:180
+#: src/additions/porn/voyeurhit.py:182 src/additions/porn/vporn.py:101
 #: src/additions/porn/vporn.py:307 src/additions/porn/wetplace.py:152
 #: src/additions/porn/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:520 src/additions/porn/xnxx.py:227
-#: src/additions/porn/xpaja.py:164 src/additions/porn/xvideos.py:261
-#: src/additions/porn/xvideos.py:467 src/additions/porn/youporn.py:400
-#: src/additions/sport/pokerstars.py:59 src/additions/sport/pokerstars.py:118
-#: src/additions/sport/pokerstars.py:168 src/additions/sport/pokerstars.py:200
-#: src/additions/sport/sporttotal.py:59 src/additions/sport/sporttotal.py:130
-#: src/resources/menuhelper.py:62 src/resources/mpscreen.py:324
-#: src/resources/simplelist.py:362 src/resources/simplelist.py:540
+#: src/additions/porn/xhamster.py:521 src/additions/porn/xnxx.py:227
+#: src/additions/porn/xpaja.py:164 src/additions/porn/xvideos.py:298
+#: src/additions/porn/xvideos.py:504 src/additions/porn/xxxdan.py:189
+#: src/additions/porn/youporn.py:400 src/additions/sport/pokerstars.py:59
+#: src/additions/sport/pokerstars.py:118 src/additions/sport/pokerstars.py:168
+#: src/additions/sport/pokerstars.py:200 src/additions/sport/sporttotal.py:59
+#: src/additions/sport/sporttotal.py:130 src/resources/menuhelper.py:62
+#: src/resources/mpscreen.py:324 src/resources/simplelist.py:362
+#: src/resources/simplelist.py:540
 msgid "Please wait..."
 msgstr "Bitte warten..."
 
-#: 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/nubilefilms.py:162 src/additions/porn/porncom.py:244
-#: src/additions/porn/pornhub.py:656 src/additions/porn/wicked.py:159
-#: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:390
-#: src/additions/porn/xvideos.py:303
-msgid "No pornstars found!"
-msgstr "Keine Pornstars gefunden!"
-
+#: mpgz/src/additions/porn/absoluporn.py:139
 #: mpgz/src/additions/porn/amateuremdh.py:134
 #: mpgz/src/additions/porn/dirtymoviez.py:135
+#: mpgz/src/additions/porn/incestflix.py:118
 #: mpgz/src/additions/porn/mydirtyhobby.py:136
-#: mpgz/src/additions/porn/porntrex.py:274
+#: mpgz/src/additions/porn/porntrex.py:283
 #: mpgz/src/additions/porn/streammdh.py:160
-#: mpgz/src/additions/porn/yourpornsexy.py:357 src/additions/fun/failto.py:95
+#: mpgz/src/additions/porn/yourpornsexy.py:356 src/additions/fun/failto.py:95
 #: src/additions/fun/funnyvideoclips_de.py:127
 #: src/additions/fun/funnyvideoclips_de.py:171
 #: src/additions/fun/gaskrank_tv.py:134 src/additions/fun/gaskrank_tv.py:158
-#: src/additions/fun/germanytv.py:181 src/additions/fun/heisevideo.py:191
-#: src/additions/fun/lachschon_de.py:223 src/additions/fun/liveleak.py:122
-#: src/additions/fun/liveleak.py:154 src/additions/fun/twitch.py:286
-#: src/additions/fun/twitch.py:304 src/additions/mediatheken/arte.py:368
-#: src/additions/mediatheken/atv.py:150 src/additions/mediatheken/brf.py:145
+#: src/additions/fun/germanytv.py:181 src/additions/fun/lachschon_de.py:223
+#: src/additions/fun/liveleak.py:122 src/additions/fun/liveleak.py:154
+#: src/additions/fun/twitch.py:286 src/additions/fun/twitch.py:304
+#: src/additions/mediatheken/arte.py:368 src/additions/mediatheken/atv.py:150
+#: src/additions/mediatheken/brf.py:145
 #: 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/porn/ahme.py:217 src/additions/porn/badoinkvr.py:239
-#: src/additions/porn/bangbros.py:183 src/additions/porn/beeg.py:188
-#: src/additions/porn/brazzers.py:180 src/additions/porn/cliphunter.py:271
-#: src/additions/porn/cumlouder.py:493 src/additions/porn/ddfnetwork.py:275
+#: src/additions/porn/ahme.py:217 src/additions/porn/anyporn.py:358
+#: src/additions/porn/badoinkvr.py:239 src/additions/porn/bangbros.py:183
+#: src/additions/porn/beeg.py:191 src/additions/porn/brazzers.py:180
+#: src/additions/porn/cliphunter.py:271 src/additions/porn/cumlouder.py:494
+#: src/additions/porn/ddfnetwork.py:275
 #: src/additions/porn/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:243
-#: src/additions/porn/hdporn.py:151 src/additions/porn/homemoviestube.py:211
-#: src/additions/porn/hotscope.py:180 src/additions/porn/julesjordan.py:251
+#: src/additions/porn/extremetube.py:209 src/additions/porn/faapy.py:245
+#: src/additions/porn/hclips.py:194 src/additions/porn/hdporn.py:151
+#: src/additions/porn/hdzog.py:203 src/additions/porn/homemoviestube.py:211
+#: src/additions/porn/hotmovs.py:209 src/additions/porn/hotscope.py:182
+#: src/additions/porn/hypnotube.py:173 src/additions/porn/julesjordan.py:251
 #: src/additions/porn/kink.py:180 src/additions/porn/mofos.py:244
 #: src/additions/porn/moviefap.py:164 src/additions/porn/naughtyamerica.py:186
-#: src/additions/porn/nubilefilms.py:239 src/additions/porn/porndoe.py:193
-#: src/additions/porn/realitykings.py:190 src/additions/porn/redtube.py:240
+#: src/additions/porn/nubilefilms.py:242 src/additions/porn/porndoe.py:193
+#: src/additions/porn/porngo.py:233 src/additions/porn/realitykings.py:190
+#: src/additions/porn/redtube.py:252 src/additions/porn/shemalez.py:202
 #: src/additions/porn/spankwire.py:247 src/additions/porn/sunporno.py:227
 #: src/additions/porn/teamskeet.py:184 src/additions/porn/tnaflix.py:183
-#: src/additions/porn/tubewolf.py:196 src/additions/porn/vintagetube.py:300
-#: src/additions/porn/vporn.py:333 src/additions/porn/wicked.py:254
-#: src/additions/porn/x4tube.py:433 src/additions/porn/xhamster.py:578
-#: src/additions/porn/youporn.py:423
+#: src/additions/porn/tubepornclassic.py:192 src/additions/porn/tubewolf.py:200
+#: src/additions/porn/txxx.py:201 src/additions/porn/upornia.py:212
+#: src/additions/porn/vintagetube.py:300 src/additions/porn/vjav.py:205
+#: src/additions/porn/voyeurhit.py:198 src/additions/porn/vporn.py:333
+#: 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
 msgid "No videos found!"
 msgstr "Keine Videos gefunden!"
 
+#: mpgz/src/additions/porn/adultbay.py:52
+#, python-format
+msgid ""
+"%s only works with enabled MP premiumize.me or Real-Debrid.com option (MP "
+"Setup)!"
+msgstr ""
+"%s funktioniert nur mit aktivierter premiumize.me oder Real-Debrid.com "
+"Einstellung (MP Setup)!"
+
+#: mpgz/src/additions/porn/adultbay.py:155
+#: mpgz/src/additions/porn/adultbay.py:158
+#: mpgz/src/additions/porn/datoporn.py:127
+#: mpgz/src/additions/porn/fapbraze.py:146
+#: mpgz/src/additions/porn/hqporner.py:168
+#: mpgz/src/additions/porn/javbraze.py:242
+#: mpgz/src/additions/porn/javdos.py:210 mpgz/src/additions/porn/lfporn.py:122
+#: mpgz/src/additions/porn/pandamovie.py:159
+#: mpgz/src/additions/porn/paradisehill.py:149
+#: mpgz/src/additions/porn/porn00.py:133
+#: mpgz/src/additions/porn/pornfreetv.py:197
+#: mpgz/src/additions/porn/pornfromczech.py:179
+#: mpgz/src/additions/porn/pornrewind.py:130
+#: mpgz/src/additions/porn/pornstreams.py:141
+#: mpgz/src/additions/porn/pornvortexx.py:137
+#: mpgz/src/additions/porn/streamxxx.py:188
+#: mpgz/src/additions/useradditions/filmpalast.py:260
+#: mpgz/src/additions/useradditions/filmpalast.py:334
+#: mpgz/src/additions/useradditions/movie4k.py:297
+#: mpgz/src/additions/useradditions/movie4k.py:388
+#: mpgz/src/additions/useradditions/movie4k.py:415
+#: mpgz/src/additions/useradditions/movie4k.py:487
+#: mpgz/src/additions/useradditions/movie4k.py:559
+#: mpgz/src/additions/useradditions/movie4k.py:757
+#: mpgz/src/additions/useradditions/movie4k.py:893
+#: src/additions/porn/dachix.py:193 src/additions/porn/fetishshrine.py:180
+#: src/additions/porn/freeones.py:192 src/additions/porn/nudez.py:195
+#: src/additions/porn/porncom.py:700 src/additions/porn/pornhub.py:1006
+#: src/additions/porn/pornhub.py:1031 src/additions/porn/pornoxo.py:215
+#: src/additions/porn/porntv.py:349 src/additions/porn/sexu.py:165
+#: src/additions/porn/shesfreaky.py:175 src/additions/porn/spankbang.py:225
+#: src/additions/porn/tube8.py:271 src/additions/porn/xnxx.py:277
+#: src/additions/porn/xpaja.py:182 src/additions/porn/xvideos.py:621
+msgid "No movies found!"
+msgstr "Keine Filme gefunden!"
+
+#: mpgz/src/additions/porn/adultbay.py:233
+#: mpgz/src/additions/porn/hqporner.py:217
+#: mpgz/src/additions/porn/hqporner.py:231
+#: mpgz/src/additions/porn/javdos.py:272 mpgz/src/additions/porn/javdos.py:275
+#: mpgz/src/additions/porn/lfporn.py:184
+#: mpgz/src/additions/porn/pandamovie.py:220
+#: mpgz/src/additions/porn/pornfreetv.py:263
+#: mpgz/src/additions/porn/pornfromczech.py:242
+#: mpgz/src/additions/porn/pornrewind.py:207
+#: mpgz/src/additions/porn/pornstreams.py:203
+#: mpgz/src/additions/porn/streamxxx.py:253
+#: mpgz/src/additions/useradditions/ddl_me.py:562
+#: mpgz/src/additions/useradditions/filmpalast.py:399
+#: mpgz/src/additions/useradditions/flimmerstube.py:173
+#: mpgz/src/additions/useradditions/flimmerstube.py:181
+#: mpgz/src/additions/useradditions/kinoxto.py:827
+#: mpgz/src/additions/useradditions/kinoxto.py:862
+#: mpgz/src/additions/useradditions/kinoxto.py:944
+#: mpgz/src/additions/useradditions/serienstream.py:822
+#: mpgz/src/additions/useradditions/watchseries.py:296
+#: src/additions/porn/pornrabbit.py:210
+msgid "No supported streams found!"
+msgstr "Keine unterstützten Streams gefunden!"
+
+#: mpgz/src/additions/porn/amateuremdh.py:91
+#: mpgz/src/additions/porn/mydirtyhobby.py:92
+#: mpgz/src/additions/porn/streammdh.py:129 src/additions/porn/pornhub.py:1060
+#: src/additions/porn/xhamster.py:496 src/additions/porn/xhamster.py:621
+#: src/additions/porn/xnxx.py:202 src/additions/porn/xvideos.py:478
+msgid "Show Related"
+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/nubilefilms.py:162 src/additions/porn/porncom.py:244
+#: src/additions/porn/pornhub.py:657 src/additions/porn/wicked.py:159
+#: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:391
+#: src/additions/porn/xvideos.py:340
+msgid "No pornstars found!"
+msgstr "Keine Pornstars gefunden!"
+
 #: mpgz/src/additions/porn/amateuremdh.py:170
 #: mpgz/src/additions/porn/dirtymoviez.py:162
 #: mpgz/src/additions/porn/mydirtyhobby.py:172
@@ -499,74 +532,75 @@ msgstr ""
 #: mpgz/src/additions/porn/javdos.py:266
 #: mpgz/src/additions/porn/pornfromczech.py:266
 #: mpgz/src/additions/porn/pornfromczech.py:277
-#: mpgz/src/additions/porn/streammdh.py:67
-#: src/resources/hosters/streamango.py:22
+#: mpgz/src/additions/porn/streammdh.py:67 src/additions/porn/hotscope.py:240
+#: src/additions/porn/pornhub.py:1226 src/resources/hosters/streamango.py:22
 msgid "This plugin requires package nodejs."
 msgstr "Dieses Plugin benötigt das Paket nodejs."
 
 #: mpgz/src/additions/porn/javdos.py:268
 #: mpgz/src/additions/porn/pornfromczech.py:268
 #: mpgz/src/additions/porn/pornfromczech.py:279
-#: mpgz/src/additions/porn/streammdh.py:69
-#: src/resources/hosters/streamango.py:24
+#: mpgz/src/additions/porn/streammdh.py:69 src/additions/porn/hotscope.py:242
+#: src/additions/porn/pornhub.py:1228 src/resources/hosters/streamango.py:24
 msgid "Error executing Javascript, please report to the developers."
 msgstr "Fehler beim Ausführen von Javascript, bitte an die Entwickler melden."
 
 #: mpgz/src/additions/porn/paradisehill.py:103
 #: src/additions/mediatheken/ard.py:460 src/additions/music/shoutcast.py:203
-#: src/additions/porn/homemoviestube.py:168 src/additions/porn/pinflix.py:166
-#: src/additions/porn/pinflix.py:281 src/additions/porn/porncom.py:193
+#: src/additions/porn/homemoviestube.py:168 src/additions/porn/pinflix.py:233
+#: src/additions/porn/pinflix.py:368 src/additions/porn/porncom.py:193
 #: src/additions/porn/porncom.py:332 src/additions/porn/porncom.py:470
 #: src/additions/porn/porncom.py:609 src/additions/porn/porndoe.py:149
-#: src/additions/porn/pornhub.py:311 src/additions/porn/pornhub.py:467
-#: src/additions/porn/pornhub.py:625 src/additions/porn/pornhub.py:759
+#: src/additions/porn/pornhub.py:312 src/additions/porn/pornhub.py:468
+#: src/additions/porn/pornhub.py:626 src/additions/porn/pornhub.py:760
 #: src/additions/porn/redtube.py:183 src/additions/porn/spankbang.py:169
 #: src/additions/porn/tube8.py:201 src/additions/porn/vporn.py:290
 #: src/additions/porn/x4tube.py:246 src/additions/porn/x4tube.py:374
-#: src/additions/porn/xvideos.py:436 src/plugin.py:1771 src/plugin.py:2796
+#: src/additions/porn/xvideos.py:473 src/plugin.py:1771 src/plugin.py:2796
 msgid "Sort"
 msgstr "Sortieren"
 
 #: mpgz/src/additions/porn/paradisehill.py:105
-#: src/additions/porn/cumlouder.py:435 src/additions/porn/cumlouder.py:507
+#: src/additions/porn/cumlouder.py:436 src/additions/porn/cumlouder.py:508
 #: src/additions/porn/porncom.py:265 src/additions/porn/porncom.py:294
 #: src/additions/porn/porncom.py:333 src/additions/porn/porncom.py:403
 #: src/additions/porn/porncom.py:432 src/additions/porn/porncom.py:471
 #: src/additions/porn/porncom.py:541 src/additions/porn/porncom.py:570
-#: src/additions/porn/porncom.py:611 src/additions/porn/porncom.py:717
-#: src/additions/porn/porncom.py:749 src/additions/porn/spankbang.py:171
+#: src/additions/porn/porncom.py:611 src/additions/porn/porncom.py:724
+#: src/additions/porn/porncom.py:756 src/additions/porn/spankbang.py:171
 #: src/additions/porn/spankbang.py:270 src/additions/porn/tube8.py:202
 #: src/additions/porn/tube8.py:312 src/additions/porn/x4tube.py:375
 #: src/additions/porn/x4tube.py:445 src/additions/porn/xnxx.py:201
-#: src/additions/porn/xnxx.py:319 src/additions/porn/xvideos.py:240
-#: src/additions/porn/xvideos.py:385 src/additions/porn/xvideos.py:390
-#: src/additions/porn/xvideos.py:437 src/additions/porn/xvideos.py:439
-#: src/additions/porn/xvideos.py:648
+#: src/additions/porn/xnxx.py:321 src/additions/porn/xvideos.py:277
+#: src/additions/porn/xvideos.py:422 src/additions/porn/xvideos.py:427
+#: src/additions/porn/xvideos.py:474 src/additions/porn/xvideos.py:476
+#: src/additions/porn/xvideos.py:685 src/additions/porn/xxxdan.py:168
+#: src/additions/porn/xxxdan.py:227
 msgid "Filter"
 msgstr "Filter"
 
 #: mpgz/src/additions/porn/paradisehill.py:169
 #: mpgz/src/additions/porn/paradisehill.py:183
 #: src/additions/mediatheken/ard.py:631 src/additions/music/shoutcast.py:269
-#: src/additions/porn/cumlouder.py:530 src/additions/porn/homemoviestube.py:243
-#: src/additions/porn/naughtyamerica.py:121 src/additions/porn/pinflix.py:222
-#: src/additions/porn/pinflix.py:353 src/additions/porn/porncom.py:257
+#: src/additions/porn/cumlouder.py:531 src/additions/porn/homemoviestube.py:243
+#: src/additions/porn/naughtyamerica.py:121 src/additions/porn/pinflix.py:306
+#: src/additions/porn/pinflix.py:476 src/additions/porn/porncom.py:257
 #: src/additions/porn/porncom.py:277 src/additions/porn/porncom.py:395
 #: src/additions/porn/porncom.py:415 src/additions/porn/porncom.py:533
-#: src/additions/porn/porncom.py:553 src/additions/porn/porncom.py:709
-#: src/additions/porn/porncom.py:731 src/additions/porn/porndoe.py:215
-#: src/additions/porn/pornhub.py:399 src/additions/porn/pornhub.py:567
-#: src/additions/porn/pornhub.py:694 src/additions/porn/pornhub.py:825
-#: src/additions/porn/redtube.py:265 src/additions/porn/spankbang.py:237
+#: src/additions/porn/porncom.py:553 src/additions/porn/porncom.py:716
+#: src/additions/porn/porncom.py:738 src/additions/porn/porndoe.py:215
+#: src/additions/porn/pornhub.py:400 src/additions/porn/pornhub.py:568
+#: src/additions/porn/pornhub.py:695 src/additions/porn/pornhub.py:826
+#: src/additions/porn/redtube.py:277 src/additions/porn/spankbang.py:237
 #: src/additions/porn/spankbang.py:240 src/additions/porn/spankbang.py:254
 #: src/additions/porn/tube8.py:284 src/additions/porn/tube8.py:297
 #: src/additions/porn/vporn.py:360 src/additions/porn/wicked.py:178
 #: src/additions/porn/x4tube.py:312 src/additions/porn/x4tube.py:452
-#: src/additions/porn/x4tube.py:463 src/additions/porn/xhamster.py:683
-#: src/additions/porn/xnxx.py:303 src/additions/porn/xvideos.py:317
-#: src/additions/porn/xvideos.py:329 src/additions/porn/xvideos.py:596
-#: src/additions/porn/xvideos.py:611 src/additions/porn/xvideos.py:633
-#: src/additions/porn/xvideos.py:665
+#: src/additions/porn/x4tube.py:463 src/additions/porn/xhamster.py:684
+#: src/additions/porn/xnxx.py:305 src/additions/porn/xvideos.py:354
+#: src/additions/porn/xvideos.py:366 src/additions/porn/xvideos.py:633
+#: src/additions/porn/xvideos.py:648 src/additions/porn/xvideos.py:670
+#: src/additions/porn/xvideos.py:702 src/additions/porn/xxxdan.py:237
 msgid "Select Action"
 msgstr "Wähle Aktion"
 
@@ -583,39 +617,39 @@ msgid "Nothing found!"
 msgstr "Nichts gefunden!"
 
 #: mpgz/src/additions/porn/porntrex.py:62
-#: mpgz/src/additions/porn/porntrex.py:150
-#: mpgz/src/additions/porn/porntrex.py:152
+#: mpgz/src/additions/porn/porntrex.py:151
+#: mpgz/src/additions/porn/porntrex.py:153
 #: mpgz/src/additions/useradditions/serienstream.py:61
 #: mpgz/src/additions/useradditions/serienstream.py:156
 #: mpgz/src/additions/useradditions/serienstream.py:158
 #: src/additions/music/radio.py:92 src/additions/music/radio.py:151
 #: src/additions/music/radio.py:153 src/additions/music/shoutcast.py:73
 #: src/additions/music/shoutcast.py:155 src/additions/music/shoutcast.py:157
-#: src/additions/porn/pornhub.py:137 src/additions/porn/pornhub.py:259
-#: src/additions/porn/pornhub.py:261 src/additions/porn/vporn.py:223
+#: src/additions/porn/pornhub.py:138 src/additions/porn/pornhub.py:260
+#: src/additions/porn/pornhub.py:262 src/additions/porn/vporn.py:223
 #: src/additions/porn/vporn.py:225 src/additions/porn/youporn.py:77
 #: src/additions/porn/youporn.py:221 src/additions/porn/youporn.py:223
-#: src/plugin.py:525 src/resources/simpleplayer.py:2294
+#: src/plugin.py:525 src/resources/simpleplayer.py:2307
 msgid "Setup"
 msgstr "Einstellungen"
 
-#: mpgz/src/additions/porn/porntrex.py:158
-#: mpgz/src/additions/porn/porntrex.py:161
-#: mpgz/src/additions/porn/porntrex.py:164 src/additions/porn/pornhub.py:266
+#: mpgz/src/additions/porn/porntrex.py:159
+#: mpgz/src/additions/porn/porntrex.py:162
+#: mpgz/src/additions/porn/porntrex.py:165 src/additions/porn/pornhub.py:267
 #: src/additions/porn/vporn.py:230 src/additions/porn/youporn.py:228
 msgid "Username:"
 msgstr "Username:"
 
-#: mpgz/src/additions/porn/porntrex.py:159
-#: mpgz/src/additions/porn/porntrex.py:162
-#: mpgz/src/additions/porn/porntrex.py:165
+#: mpgz/src/additions/porn/porntrex.py:160
+#: mpgz/src/additions/porn/porntrex.py:163
+#: mpgz/src/additions/porn/porntrex.py:166
 #: mpgz/src/additions/useradditions/serienstream.py:164
-#: src/additions/porn/pornhub.py:267 src/additions/porn/vporn.py:231
+#: src/additions/porn/pornhub.py:268 src/additions/porn/vporn.py:231
 #: src/additions/porn/youporn.py:229
 msgid "Password:"
 msgstr "Passwort:"
 
-#: mpgz/src/additions/porn/porntrex.py:319
+#: mpgz/src/additions/porn/porntrex.py:328
 #: mpgz/src/additions/useradditions/serienstream.py:132
 msgid "Login data is required for video playback!"
 msgstr "Logindaten sind erforderlich für Video-Wiedergabe!"
@@ -690,14 +724,12 @@ msgid "Selection was added to the watchlist."
 msgstr "Auswahl wurde zur Watchlist hinzugefügt."
 
 #: mpgz/src/additions/useradditions/kinoxto.py:519 src/additions/fun/ccc.py:26
-#: src/additions/fun/ccc.py:108 src/additions/fun/e2world.py:54
-#: src/additions/fun/forplayers.py:25 src/additions/fun/germanytv.py:57
-#: src/additions/fun/germanytv.py:99 src/additions/fun/heisevideo.py:57
-#: src/additions/fun/heisevideo.py:97 src/additions/fun/itunestrailers.py:63
-#: src/additions/mediatheken/ard.py:125 src/additions/mediatheken/ard.py:291
-#: src/additions/mediatheken/ard.py:351 src/additions/mediatheken/ard.py:457
-#: src/additions/mediatheken/arte.py:54 src/additions/mediatheken/arte.py:109
-#: src/additions/mediatheken/arte.py:171
+#: src/additions/fun/ccc.py:108 src/additions/fun/forplayers.py:25
+#: src/additions/fun/germanytv.py:57 src/additions/fun/germanytv.py:99
+#: src/additions/fun/itunestrailers.py:63 src/additions/mediatheken/ard.py:125
+#: src/additions/mediatheken/ard.py:291 src/additions/mediatheken/ard.py:351
+#: src/additions/mediatheken/ard.py:457 src/additions/mediatheken/arte.py:54
+#: src/additions/mediatheken/arte.py:109 src/additions/mediatheken/arte.py:171
 #: src/additions/mediatheken/dreisat.py:207
 #: src/additions/mediatheken/funk.py:67 src/additions/mediatheken/funk.py:154
 #: src/additions/mediatheken/funk.py:256
@@ -875,11 +907,6 @@ msgstr "Beenden"
 msgid "No program data found!"
 msgstr "Keine Programmdaten gefunden!"
 
-#: src/additions/fun/gigatv.py:189 src/additions/fun/gigatv.py:201
-#: src/additions/mediatheken/arte.py:413 src/additions/newsdoku/urknall.py:132
-msgid "This video is not available."
-msgstr "Dieses Video ist nicht verfügbar."
-
 #: src/additions/fun/itunestrailers.py:192
 msgid "Movie Selection"
 msgstr "Film Auswahl"
@@ -927,8 +954,8 @@ msgstr "Keine Streams gefunden!"
 #: src/additions/mediatheken/youtube.py:405
 #: src/additions/mediatheken/youtube.py:970
 #: src/additions/mediatheken/youtube_user.py:76
-#: src/additions/porn/cumlouder.py:314 src/additions/porn/porncom.py:382
-#: src/additions/porn/pornhub.py:792 src/additions/porn/xvideos.py:300
+#: src/additions/porn/cumlouder.py:315 src/additions/porn/porncom.py:382
+#: src/additions/porn/pornhub.py:793 src/additions/porn/xvideos.py:337
 msgid "No channels found!"
 msgstr "Keine Kanäle gefunden!"
 
@@ -970,6 +997,10 @@ msgstr "Laufzeit:"
 msgid "Date:"
 msgstr "Datum:"
 
+#: src/additions/mediatheken/arte.py:413 src/additions/newsdoku/urknall.py:132
+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
@@ -977,7 +1008,7 @@ msgid "No contents / results found!"
 msgstr "Keine Inhalte / Ergebnisse gefunden!"
 
 #: src/additions/mediatheken/kindertube.py:128
-#: src/additions/mediatheken/kindertube.py:195 src/additions/porn/faapy.py:167
+#: src/additions/mediatheken/kindertube.py:195 src/additions/porn/faapy.py:169
 msgid "Parsing error!"
 msgstr "Parsing error!"
 
@@ -1617,7 +1648,7 @@ msgid "Topic"
 msgstr "Thema"
 
 #: src/additions/music/radio.py:205 src/additions/music/radio.py:384
-#: src/additions/music/radio.py:494
+#: src/additions/music/radio.py:494 src/additions/porn/xvideos.py:124
 msgid "Country"
 msgstr "Land"
 
@@ -1686,9 +1717,9 @@ msgid "%s only works with enabled MP premiumize.me option (MP Setup)!"
 msgstr ""
 "%s funktioniert nur mit aktivierter premiumize.me Einstellung (MP Setup)!"
 
-#: src/additions/porn/beeg.py:235 src/additions/porn/porncom.py:768
-#: src/additions/porn/tube8.py:328 src/additions/porn/xnxx.py:350
-#: src/additions/porn/xvideos.py:697
+#: src/additions/porn/beeg.py:238 src/additions/porn/porncom.py:775
+#: src/additions/porn/tube8.py:328 src/additions/porn/xnxx.py:352
+#: src/additions/porn/xvideos.py:734
 msgid "Stream not found"
 msgstr "Stream nicht gefunden"
 
@@ -1703,15 +1734,15 @@ msgstr "Keine Livestreams gefunden!"
 msgid "Cam is currently offline."
 msgstr "Cam ist zur Zeit offline."
 
-#: src/additions/porn/cumlouder.py:176
+#: src/additions/porn/cumlouder.py:177
 msgid "No series found!"
 msgstr "Keine Serien gefunden!"
 
-#: src/additions/porn/cumlouder.py:242
+#: src/additions/porn/cumlouder.py:243
 msgid "No sites found!"
 msgstr "Keine Websites gefunden!"
 
-#: src/additions/porn/cumlouder.py:388
+#: src/additions/porn/cumlouder.py:389
 msgid "No girls found!"
 msgstr "Keine Girls gefunden!"
 
@@ -1719,67 +1750,67 @@ msgstr "Keine Girls gefunden!"
 msgid "Mode"
 msgstr "Modus"
 
-#: src/additions/porn/pinflix.py:233 src/additions/porn/pinflix.py:343
+#: src/additions/porn/pinflix.py:317 src/additions/porn/pinflix.py:460
 #: src/additions/porn/porncom.py:294 src/additions/porn/porncom.py:432
-#: src/additions/porn/porncom.py:570 src/additions/porn/porncom.py:749
-#: src/additions/porn/porndoe.py:206 src/additions/porn/pornhub.py:373
-#: src/additions/porn/pornhub.py:385 src/additions/porn/pornhub.py:548
-#: src/additions/porn/pornhub.py:667 src/additions/porn/pornhub.py:682
-#: src/additions/porn/pornhub.py:812 src/additions/porn/redtube.py:253
+#: src/additions/porn/porncom.py:570 src/additions/porn/porncom.py:756
+#: src/additions/porn/porndoe.py:206 src/additions/porn/pornhub.py:374
+#: src/additions/porn/pornhub.py:386 src/additions/porn/pornhub.py:549
+#: src/additions/porn/pornhub.py:668 src/additions/porn/pornhub.py:683
+#: src/additions/porn/pornhub.py:813 src/additions/porn/redtube.py:265
 #: src/additions/porn/spankbang.py:274 src/additions/porn/tube8.py:312
 #: src/additions/porn/x4tube.py:322 src/additions/porn/x4tube.py:445
-#: src/additions/porn/xvideos.py:652
+#: src/additions/porn/xvideos.py:689
 msgid "Sort order"
 msgstr "Sortierreihenfolge"
 
-#: src/additions/porn/porncom.py:520 src/additions/porn/pornhub.py:351
+#: src/additions/porn/porncom.py:520 src/additions/porn/pornhub.py:352
 msgid "No playlists found!"
 msgstr "Keine Playlist gefunden!"
 
-#: src/additions/porn/pornhub.py:268
+#: src/additions/porn/pornhub.py:269
 msgid "CDN fix (please don't use this option as default):"
 msgstr ""
 
-#: src/additions/porn/pornhub.py:367 src/additions/porn/pornhub.py:380
-#: src/additions/porn/pornhub.py:1110 src/additions/porn/xhamster.py:616
-#: src/additions/porn/xhamster.py:656
+#: src/additions/porn/pornhub.py:368 src/additions/porn/pornhub.py:381
+#: src/additions/porn/pornhub.py:1112 src/additions/porn/xhamster.py:614
+#: src/additions/porn/xhamster.py:654
 msgid "Remove Favourite"
 msgstr "Favorit entfernen"
 
-#: src/additions/porn/pornhub.py:383 src/additions/porn/pornhub.py:1113
-#: src/additions/porn/xhamster.py:660
+#: src/additions/porn/pornhub.py:384 src/additions/porn/pornhub.py:1115
+#: src/additions/porn/xhamster.py:658
 msgid "Add Favourite"
 msgstr "Favorit hinzufügen"
 
-#: src/additions/porn/pornhub.py:433
+#: src/additions/porn/pornhub.py:434
 msgid ""
 "You have reached the maximum allowed number of favorite playlists. Please "
 "delete some of your current favorite playlists before adding new ones."
 msgstr ""
 
-#: src/additions/porn/pornhub.py:465 src/additions/porn/pornhub.py:678
-#: src/additions/porn/pornhub.py:808 src/additions/porn/pornhub.py:1098
-#: src/additions/porn/xhamster.py:276 src/additions/porn/xhamster.py:301
-#: src/additions/porn/xhamster.py:418 src/additions/porn/xhamster.py:640
+#: src/additions/porn/pornhub.py:466 src/additions/porn/pornhub.py:679
+#: src/additions/porn/pornhub.py:809 src/additions/porn/pornhub.py:1100
+#: src/additions/porn/xhamster.py:277 src/additions/porn/xhamster.py:302
+#: src/additions/porn/xhamster.py:419 src/additions/porn/xhamster.py:638
 msgid "Unsubscribe"
 msgstr "Abmelden"
 
-#: src/additions/porn/pornhub.py:537 src/additions/porn/xhamster.py:252
+#: src/additions/porn/pornhub.py:538 src/additions/porn/xhamster.py:253
 msgid "No subscriptions found!"
 msgstr "Keine Abonnements gefunden!"
 
-#: src/additions/porn/pornhub.py:596 src/additions/porn/pornhub.py:730
-#: src/additions/porn/pornhub.py:855 src/additions/porn/pornhub.py:1185
+#: src/additions/porn/pornhub.py:597 src/additions/porn/pornhub.py:731
+#: src/additions/porn/pornhub.py:856 src/additions/porn/pornhub.py:1197
 msgid "Unknown error."
 msgstr "Unbekannter Fehler."
 
-#: src/additions/porn/pornhub.py:681 src/additions/porn/pornhub.py:811
-#: src/additions/porn/pornhub.py:1101 src/additions/porn/xhamster.py:306
-#: src/additions/porn/xhamster.py:425 src/additions/porn/xhamster.py:646
+#: src/additions/porn/pornhub.py:682 src/additions/porn/pornhub.py:812
+#: src/additions/porn/pornhub.py:1103 src/additions/porn/xhamster.py:307
+#: src/additions/porn/xhamster.py:426 src/additions/porn/xhamster.py:644
 msgid "Subscribe"
 msgstr "Abonnieren"
 
-#: src/additions/porn/pornhub.py:1217
+#: src/additions/porn/pornhub.py:1257
 msgid ""
 "You have reached the maximum allowed number of favorite videos. Please "
 "delete some of your current favorite videos before adding new ones."
@@ -1807,11 +1838,15 @@ msgstr "Suche eingeben"
 msgid "No websites found!"
 msgstr "Keine Websites gefunden!"
 
-#: src/additions/porn/xvideos.py:239 src/additions/porn/xvideos.py:385
+#: src/additions/porn/xvideos.py:212
+msgid "Select Country"
+msgstr "Wähle Land"
+
+#: src/additions/porn/xvideos.py:276 src/additions/porn/xvideos.py:422
 msgid "Region"
 msgstr "Region"
 
-#: src/additions/porn/xvideos.py:517
+#: src/additions/porn/xvideos.py:554
 msgid "Keywords"
 msgstr "Keywords"
 
@@ -1910,7 +1945,7 @@ msgstr "Film am Ende pausieren"
 
 #: src/plugin.py:261 src/plugin.py:280 src/resources/simplelist.py:508
 #: src/resources/simplelist.py:683 src/resources/simplelist.py:707
-#: src/resources/simpleplayer.py:1785 src/resources/simpleplayer.py:1791
+#: src/resources/simpleplayer.py:1792 src/resources/simpleplayer.py:1798
 msgid "No"
 msgstr "Nein"
 
@@ -1998,7 +2033,7 @@ msgstr "Hellgrün"
 msgid "premiumize.me is not activated."
 msgstr "premiumize.me ist nicht aktiviert."
 
-#: src/plugin.py:559 src/resources/simpleplayer.py:2222
+#: src/plugin.py:559 src/resources/simpleplayer.py:2235
 msgid "GENERAL"
 msgstr "ALLGEMEIN"
 
@@ -2110,7 +2145,7 @@ msgstr "Temporäres Cacheverzeichnis:"
 msgid "Icon Cachepath:"
 msgstr "Icon Cacheverzeichnis:"
 
-#: src/plugin.py:599 src/resources/simpleplayer.py:2225
+#: src/plugin.py:599 src/resources/simpleplayer.py:2238
 msgid "Videoquality:"
 msgstr "Videoqualität:"
 
@@ -2118,35 +2153,35 @@ msgstr "Videoqualität:"
 msgid "Watchlist/Playlist/Userchan path:"
 msgstr "Watchlist/Playlist/Userchan Verzeichnis:"
 
-#: src/plugin.py:602 src/resources/simpleplayer.py:2236
+#: src/plugin.py:602 src/resources/simpleplayer.py:2249
 msgid "YOUTUBE"
 msgstr "YOUTUBE"
 
-#: src/plugin.py:603 src/resources/simpleplayer.py:2237
+#: src/plugin.py:603 src/resources/simpleplayer.py:2250
 msgid "Highest resolution for playback:"
 msgstr "Höchste Auflösung für die Wiedergabe:"
 
-#: src/plugin.py:604 src/resources/simpleplayer.py:2238
+#: src/plugin.py:604 src/resources/simpleplayer.py:2251
 msgid "Enable DASH format (no seeking possible):"
 msgstr "DASH Format aktivieren (kein Spulen möglich):"
 
-#: src/plugin.py:606 src/resources/simpleplayer.py:2240
+#: src/plugin.py:606 src/resources/simpleplayer.py:2253
 msgid "Use DASH format for 480p:"
 msgstr "DASH Format verwenden für 480p:"
 
-#: src/plugin.py:607 src/resources/simpleplayer.py:2241
+#: src/plugin.py:607 src/resources/simpleplayer.py:2254
 msgid "Use DASH format for 720p:"
 msgstr "DASH Format verwenden für 720p:"
 
-#: src/plugin.py:608 src/resources/simpleplayer.py:2242
+#: src/plugin.py:608 src/resources/simpleplayer.py:2255
 msgid "Enable VP9 codec (required for resolutions >1080p):"
 msgstr "VP9 Codec aktivieren (erforderlich für Auflösungen >1080p):"
 
-#: src/plugin.py:610 src/resources/simpleplayer.py:2244
+#: src/plugin.py:610 src/resources/simpleplayer.py:2257
 msgid "Enable VP9 HDR (only for resolutions 720p and higher):"
 msgstr "VP9 HDR aktivieren (nur für Auflösungen ab 720p):"
 
-#: src/plugin.py:612 src/resources/simpleplayer.py:2246
+#: src/plugin.py:612 src/resources/simpleplayer.py:2259
 msgid "Enable Opus codec:"
 msgstr "Opus Codec aktivieren:"
 
@@ -2576,7 +2611,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:1521
+#: src/resources/mtvdelink.py:82 src/resources/simpleplayer.py:1528
 msgid "No URL found!"
 msgstr "Keine URL gefunden!"
 
@@ -2729,8 +2764,8 @@ msgstr ""
 "aktiviert werden"
 
 #: src/resources/simplelist.py:507 src/resources/simplelist.py:682
-#: src/resources/simplelist.py:706 src/resources/simpleplayer.py:1783
-#: src/resources/simpleplayer.py:1790
+#: src/resources/simplelist.py:706 src/resources/simpleplayer.py:1790
+#: src/resources/simpleplayer.py:1797
 msgid "Yes"
 msgstr "Ja"
 
@@ -2825,168 +2860,168 @@ msgstr "zum Player"
 msgid "Playmode"
 msgstr "Abspielmodus"
 
-#: src/resources/simpleplayer.py:1229
+#: src/resources/simpleplayer.py:1236
 msgid "Tuning..."
 msgstr "Tune..."
 
-#: src/resources/simpleplayer.py:1232
+#: src/resources/simpleplayer.py:1239
 msgid "Connecting..."
 msgstr "Verbinde..."
 
-#: src/resources/simpleplayer.py:1235
+#: src/resources/simpleplayer.py:1242
 msgid "Please wait!"
 msgstr "Bitte warten!"
 
-#: src/resources/simpleplayer.py:1238
+#: src/resources/simpleplayer.py:1245
 msgid "Reconnecting..."
 msgstr "Verbinde neu..."
 
-#: src/resources/simpleplayer.py:1407 src/resources/simpleplayer.py:1416
+#: src/resources/simpleplayer.py:1414 src/resources/simpleplayer.py:1423
 #, python-format
 msgid "This STB can't decode %s streams!"
 msgstr "Diese STB kann %s Streams nicht wiedergeben!"
 
-#: src/resources/simpleplayer.py:1436
+#: src/resources/simpleplayer.py:1443
 #, python-format
 msgid "Streaming error: %s"
 msgstr "Streaming Fehler: %s"
 
-#: src/resources/simpleplayer.py:1468
+#: src/resources/simpleplayer.py:1475
 msgid "Buffering..."
 msgstr "Puffern..."
 
-#: src/resources/simpleplayer.py:1784
+#: src/resources/simpleplayer.py:1791
 #, python-format
 msgid "Yes & Add Service to global Playlist-%02d"
 msgstr "Ja & Service zur globalen Playlist-%02d hinzufügen"
 
-#: src/resources/simpleplayer.py:1786 src/resources/simpleplayer.py:1792
+#: src/resources/simpleplayer.py:1793 src/resources/simpleplayer.py:1799
 msgid "No, but start over from the beginning"
 msgstr "Nein, aber von Anfang an neu beginnen"
 
-#: src/resources/simpleplayer.py:1795
+#: src/resources/simpleplayer.py:1802
 msgid "Stop playing this movie?"
 msgstr "Wiedergabe dieses Films stoppen?"
 
-#: src/resources/simpleplayer.py:1930
+#: src/resources/simpleplayer.py:1937
 msgid "No entries in the playlist available!"
 msgstr "Keine Einträge in der Playlist vorhanden!"
 
-#: src/resources/simpleplayer.py:2012
+#: src/resources/simpleplayer.py:2019
 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:2026
+#: src/resources/simpleplayer.py:2033
 msgid "Error: URL is not persistent!"
 msgstr "Fehler: URL ist nicht persistent!"
 
-#: src/resources/simpleplayer.py:2032
+#: src/resources/simpleplayer.py:2039
 msgid "Added entry"
 msgstr "Eintrag hinzugefügt"
 
-#: src/resources/simpleplayer.py:2034
+#: src/resources/simpleplayer.py:2041
 msgid "Entry already exists"
 msgstr "Eintrag schon vorhanden"
 
-#: src/resources/simpleplayer.py:2036
+#: src/resources/simpleplayer.py:2043
 msgid "Error!"
 msgstr "Fehler!"
 
-#: src/resources/simpleplayer.py:2204 src/resources/simpleplayer.py:2205
+#: src/resources/simpleplayer.py:2217 src/resources/simpleplayer.py:2218
 msgid "SimplePlayer Setup"
 msgstr "SimplePlayer Einstellungen"
 
-#: src/resources/simpleplayer.py:2223
+#: src/resources/simpleplayer.py:2236
 msgid "Global playlist number:"
 msgstr "Globale Playlist-Nummer:"
 
-#: src/resources/simpleplayer.py:2224
+#: src/resources/simpleplayer.py:2237
 msgid "Playmode:"
 msgstr "Abspielmodus:"
 
-#: src/resources/simpleplayer.py:2227
+#: src/resources/simpleplayer.py:2240
 msgid "Buffersize (in seconds):"
 msgstr "Puffergröße (in Sekunden):"
 
-#: src/resources/simpleplayer.py:2228
+#: src/resources/simpleplayer.py:2241
 msgid "Save resume cache in flash memory:"
 msgstr "Speichere Wiederaufnahme-Cache im Flashspeicher:"
 
-#: src/resources/simpleplayer.py:2229
+#: src/resources/simpleplayer.py:2242
 msgid "Behavior on movie start:"
 msgstr "Verhalten bei Filmstart:"
 
-#: src/resources/simpleplayer.py:2230
+#: src/resources/simpleplayer.py:2243
 msgid "Behavior on movie stop:"
 msgstr "Verhalten bei Filmstopp:"
 
-#: src/resources/simpleplayer.py:2231
+#: src/resources/simpleplayer.py:2244
 msgid "Behavior on movie end:"
 msgstr "Verhalten bei Filmende:"
 
-#: src/resources/simpleplayer.py:2232
+#: src/resources/simpleplayer.py:2245
 msgid "Seekbar sensibility:"
 msgstr "Suchleistenempfindlichkeit:"
 
-#: src/resources/simpleplayer.py:2233
+#: src/resources/simpleplayer.py:2246
 msgid "Infobar cover always off:"
 msgstr "Infobar-Coveranzeige immer aus:"
 
-#: src/resources/simpleplayer.py:2234
+#: src/resources/simpleplayer.py:2247
 msgid "Use SP number seek:"
 msgstr "Verwende SP Nummernsuche:"
 
-#: src/resources/simpleplayer.py:2248
+#: src/resources/simpleplayer.py:2261
 msgid "RADIO"
 msgstr "RADIO"
 
-#: src/resources/simpleplayer.py:2249
+#: src/resources/simpleplayer.py:2262
 msgid "Radio cover:"
 msgstr "Radio-Cover:"
 
-#: src/resources/simpleplayer.py:2250
+#: src/resources/simpleplayer.py:2263
 msgid "Radio visualization:"
 msgstr "Radio-Visualisierung:"
 
-#: src/resources/simpleplayer.py:2251
+#: src/resources/simpleplayer.py:2264
 msgid "Radio screensaver:"
 msgstr "Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2252
+#: src/resources/simpleplayer.py:2265
 msgid "Radio screensaver keywords:"
 msgstr "Schlüsselwörter für den Radio-Bildschirmschoner:"
 
-#: src/resources/simpleplayer.py:2282 src/resources/simpleplayer.py:2283
+#: src/resources/simpleplayer.py:2295 src/resources/simpleplayer.py:2296
 msgid "SimplePlayer Menu"
 msgstr "SimplePlayer Menü"
 
-#: src/resources/simpleplayer.py:2297
+#: src/resources/simpleplayer.py:2310
 #, python-format
 msgid "Add service to global playlist-%02d"
 msgstr "Füge Service zu globaler Playlist-%02d hinzu"
 
-#: src/resources/simpleplayer.py:2299
+#: src/resources/simpleplayer.py:2312
 #, python-format
 msgid "Open global playlist-%02d"
 msgstr "Öffne globale Playlist-%02d"
 
-#: src/resources/simpleplayer.py:2301
+#: src/resources/simpleplayer.py:2314
 msgid "Open local playlist"
 msgstr "Öffne lokale Playlist"
 
-#: src/resources/simpleplayer.py:2303
+#: src/resources/simpleplayer.py:2316
 msgid "A/V Settings"
 msgstr "A/V Einstellungen"
 
-#: src/resources/simpleplayer.py:2305
+#: src/resources/simpleplayer.py:2318
 msgid "Advanced Audio Settings"
 msgstr "Erweiterte Audioeinstellungen"
 
-#: src/resources/simpleplayer.py:2306
+#: src/resources/simpleplayer.py:2319
 msgid "Mainmenu"
 msgstr "Hauptmenü"
 
-#: src/resources/simpleplayer.py:2374
+#: src/resources/simpleplayer.py:2387
 #, python-format
 msgid ""
 "The directory path does not end with '/':\n"
@@ -2995,7 +3030,7 @@ msgstr ""
 "Der Verzeichnispfad endet nicht mit '/':\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2375
+#: src/resources/simpleplayer.py:2388
 #, python-format
 msgid ""
 "File with the same name exists in the directory path:\n"
@@ -3004,7 +3039,7 @@ msgstr ""
 "Datei mit gleichen Namen im Verzeichnispfad vorhanden:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2376
+#: src/resources/simpleplayer.py:2389
 #, python-format
 msgid ""
 "The missing directory:\n"
@@ -3013,7 +3048,7 @@ msgstr ""
 "Das fehlende Verzeichnis:\n"
 "%s konnte nicht angelegt werden!"
 
-#: src/resources/simpleplayer.py:2377
+#: src/resources/simpleplayer.py:2390
 #, python-format
 msgid ""
 "The directory path:\n"
@@ -3022,7 +3057,7 @@ msgstr ""
 "Der Verzeichnispfad:\n"
 "%s ist nicht vorhanden!"
 
-#: src/resources/simpleplayer.py:2378
+#: src/resources/simpleplayer.py:2391
 #, python-format
 msgid ""
 "There exists already a directory with this name:\n"
@@ -3031,7 +3066,7 @@ msgstr ""
 "Es existiert schon ein Verzeichnis mit diesem Namen:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2379
+#: src/resources/simpleplayer.py:2392
 #, python-format
 msgid ""
 "The path is OK, the file name was not specified:\n"
@@ -3040,7 +3075,7 @@ msgstr ""
 "Der Pfad ist i.O., der Dateiname wurde nicht angegeben:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2380
+#: src/resources/simpleplayer.py:2393
 #, python-format
 msgid ""
 "The directory path and file name is OK:\n"
@@ -3049,11 +3084,11 @@ msgstr ""
 "Der Verzeichnispfad & Dateiname ist i.O.:\n"
 "%s"
 
-#: src/resources/simpleplayer.py:2381
+#: src/resources/simpleplayer.py:2394
 msgid "The directory path is not specified!"
 msgstr "Der Verzeichnispfad wurde nicht angegeben!"
 
-#: src/resources/simpleplayer.py:2382
+#: src/resources/simpleplayer.py:2395
 #, python-format
 msgid ""
 "Symbolic link with the same name in the directory path:\n"
@@ -3062,7 +3097,7 @@ msgstr ""
 "Symbolischer Link mit gleichen Namen im Verzeichnispfad:\n"
 "%s vorhanden!"
 
-#: src/resources/simpleplayer.py:2383
+#: src/resources/simpleplayer.py:2396
 #, python-format
 msgid ""
 "The directory path does not begin with '/':\n"
index 4f927d6..e63777f 100644 (file)
@@ -155,8 +155,8 @@ config.mediaportal = ConfigSubsection()
 config_mp.mediaportal.fake_entry = NoSave(ConfigNothing())
 
 # Allgemein
-config_mp.mediaportal.version = NoSave(ConfigText(default="2019092801"))
-config.mediaportal.version = NoSave(ConfigText(default="2019092801"))
+config_mp.mediaportal.version = NoSave(ConfigText(default="2019102701"))
+config.mediaportal.version = NoSave(ConfigText(default="2019102701"))
 config_mp.mediaportal.autoupdate = ConfigYesNo(default = True)
 config.mediaportal.autoupdate = NoSave(ConfigYesNo(default = True))
 
@@ -606,9 +606,9 @@ class MPSetup(Screen, CheckPremiumize, ConfigListScreenExt):
                        self.configlist.append(getConfigListEntry(_("Use DASH format for 480p:"), config_mp.mediaportal.youtubeenabledash480p, False))
                        self.configlist.append(getConfigListEntry(_("Use DASH format for 720p:"), config_mp.mediaportal.youtubeenabledash720p, False))
                        self.configlist.append(getConfigListEntry(_("Enable VP9 codec (required for resolutions >1080p):"), config_mp.mediaportal.youtubeenablevp9, True))
-                       if config_mp.mediaportal.youtubeenablevp9.value and mp_globals.model in ["one"]:
+                       if config_mp.mediaportal.youtubeenablevp9.value and mp_globals.model in ["one","two"]:
                                self.configlist.append(getConfigListEntry(_("Enable VP9 HDR (only for resolutions 720p and higher):"), config_mp.mediaportal.youtubeenablehdr, False))
-                       if mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+                       if mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                                self.configlist.append(getConfigListEntry(_("Enable Opus codec:"), config_mp.mediaportal.youtubeenableopus, False))
                self.configlist.append(getConfigListEntry(_("Show USER-Channels Help:"), config_mp.mediaportal.show_userchan_help, False))
                self.configlist.append(getConfigListEntry(_('Use Proxy:'), config_mp.mediaportal.sp_use_yt_with_proxy, True))
@@ -1779,18 +1779,18 @@ class MPWall(Screen, HelpableScreen):
 
                for x in range(1,len(self.plugin_liste)+1):
                        if self.wallbw or self.wallzoom:
-                               if mp_globals.isDreamOS and mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+                               if mp_globals.isDreamOS and mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                                        self["zeile"+str(x)] = PixmapExt()
                                else:
                                        self["zeile"+str(x)] = Pixmap()
                                self["zeile"+str(x)].show()
-                               if mp_globals.isDreamOS and mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+                               if mp_globals.isDreamOS and mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                                        self["zeile_bw"+str(x)] = PixmapExt()
                                else:
                                        self["zeile_bw"+str(x)] = Pixmap()
                                self["zeile_bw"+str(x)].hide()
                        else:
-                               if mp_globals.isDreamOS and mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+                               if mp_globals.isDreamOS and mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                                        self["zeile"+str(x)] = PixmapExt()
                                else:
                                        self["zeile"+str(x)] = Pixmap()
@@ -2015,7 +2015,7 @@ class MPWall(Screen, HelpableScreen):
                        else:
                                self.picload.startDecode(poster_path, 0, 0, False)
 
-                       if mp_globals.isDreamOS and mp_globals.model not in ["one"]:
+                       if mp_globals.isDreamOS and mp_globals.model not in ["one","two"]:
                                self["zeile"+str(x)].instance.setPixmap(gPixmapPtr())
                        else:
                                self["zeile"+str(x)].instance.setPixmap(gPixmapPtr())
@@ -2055,7 +2055,7 @@ class MPWall(Screen, HelpableScreen):
                                else:
                                        self.picload.startDecode(poster_path, 0, 0, False)
 
-                               if mp_globals.isDreamOS and mp_globals.model not in ["one"]:
+                               if mp_globals.isDreamOS and mp_globals.model not in ["one","two"]:
                                        self["zeile_bw"+str(x)].instance.setPixmap(gPixmapPtr())
                                else:
                                        self["zeile_bw"+str(x)].instance.setPixmap(gPixmapPtr())
@@ -2080,7 +2080,7 @@ class MPWall(Screen, HelpableScreen):
                                else:
                                        self.picload.startDecode(poster_path, 0, 0, False)
 
-                               if mp_globals.isDreamOS and mp_globals.model not in ["one"]:
+                               if mp_globals.isDreamOS and mp_globals.model not in ["one","two"]:
                                        self["zeile_bw"+str(x)].instance.setPixmap(gPixmapPtr())
                                else:
                                        self["zeile_bw"+str(x)].instance.setPixmap(gPixmapPtr())
index 03083dd..a90c31c 100644 (file)
@@ -20,7 +20,7 @@ from urllib3.util.ssl_ import create_urllib3_context, DEFAULT_CIPHERS
 
 from .user_agents import USER_AGENTS
 
-__version__ = "2.0.7"
+__version__ = "2.0.8"
 
 DEFAULT_USER_AGENT = random.choice(USER_AGENTS)
 
@@ -57,7 +57,7 @@ https://github.com/Anorov/cloudflare-scrape/issues\
 """
 
 # Remove a few problematic TLSv1.0 ciphers from the defaults
-DEFAULT_CIPHERS += ":!ECDHE+SHA:!AES128-SHA"
+DEFAULT_CIPHERS += ":!ECDHE+SHA:!AES128-SHA:!AESCCM:!DHE:!ARIA"
 
 
 class CloudflareAdapter(HTTPAdapter):
index 57d3239..66172e1 100644 (file)
@@ -211,7 +211,7 @@ class MPScreen(Screen, HelpableScreen):
                self['F2'] = Label("")
                self['F3'] = Label("")
                self['F4'] = Label("")
-               if mp_globals.isDreamOS and mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+               if mp_globals.isDreamOS and mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                        self['coverArt'] = PixmapExt()
                else:
                        self['coverArt'] = Pixmap()
index 6864ef0..a449698 100644 (file)
@@ -847,12 +847,12 @@ class RadioBackground(Screen):
                                        <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="1200,251" size="70,495" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_90x60_h9.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="15" maxValue="40" fadeOutTime="500" smoothing="0.9" />'''
 
                                if config_mp.mediaportal.sp_radio_visualization.value == "1":
-                                       if mp_globals.model in ["dm900","dm920","one"]:
+                                       if mp_globals.model in ["dm900","dm920","one","two"]:
                                                self.skin += '''<widget name="visu" position="0,741" size="1920,339" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
                                        else:
                                                self.skin += '''<widget name="visu" position="0,741" size="1920,339" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="0" blendColor="#fcc000" smoothing="0.4" />'''
                                if config_mp.mediaportal.sp_radio_visualization.value == "2":
-                                       if mp_globals.model in ["dm900","dm920","one"]:
+                                       if mp_globals.model in ["dm900","dm920","one","two"]:
                                                self.skin += '''<widget name="visu" position="0,930" size="1920,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="20" fadeOutTime="0" internalSize="2" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                                        else:
                                                self.skin += '''<widget name="visu" position="0,930" size="1920,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_30x20_h8.png" distance1="18" distance2="8" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
@@ -876,12 +876,12 @@ class RadioBackground(Screen):
                                        <widget name="rms1" channel="1" backgroundColor="#404040" zPosition="13" position="800,167" size="60,330" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_60x40_h6.png" transparent="1" mode="imagesOrientationUp" pixmapBackground1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" drawBackground="0" pixmapBackgroundColor1="#080808" distance="10" maxValue="40" fadeOutTime="500" smoothing="0.9" />'''
 
                                if config_mp.mediaportal.sp_radio_visualization.value == "1":
-                                       if mp_globals.model in ["dm900","dm920","one"]:
+                                       if mp_globals.model in ["dm900","dm920","one","two"]:
                                                self.skin += '''<widget name="visu" position="0,494" size="1280,226" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="2" blendColor="#fcc000" smoothing="0.4" />'''
                                        else:
                                                self.skin += '''<widget name="visu" position="0,494" size="1280,226" transparent="1" zPosition="11" pixmap1="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/bar_88_226.png" distance1="12" threshold1="24" mode="visUp" internalSize="1" blendColor="#fcc000" smoothing="0.4" />'''
                                if config_mp.mediaportal.sp_radio_visualization.value == "2":
-                                       if mp_globals.model in ["dm900","dm920","one"]:
+                                       if mp_globals.model in ["dm900","dm920","one","two"]:
                                                self.skin += '''<widget name="visu" position="0,620" size="1280,100" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="20" fadeOutTime="0" internalSize="2" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
                                        else:
                                                self.skin += '''<widget name="visu" position="0,570" size="1280,150" transparent="1" zPosition="11" pixmapBackground2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/colorgradient.png" pixmap2="/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/led_20x13_h5.png" distance1="12" distance2="5" mode="visImagesUp" maxValue="15" fadeOutTime="0" internalSize="1" pixmapBackgroundColor1="#080808" drawBackground="0" smoothing="0.6" />'''
@@ -948,7 +948,7 @@ class RadioBackground(Screen):
                                return
 
                        try:
-                               if mp_globals.model in ["dm900","dm920","one"]:
+                               if mp_globals.model in ["dm900","dm920","one","two"]:
                                        self['screenSaver'].instance.setShowHideAnimation("mp_screensaver")
                                elif config_mp.mediaportal.sp_radio_visualization.value not in ["1", "2"]:
                                        self['screenSaver'].instance.setShowHideAnimation("mp_screensaver")
@@ -980,7 +980,7 @@ class RadioBackground(Screen):
                        self.val += 1
                        self.timestamp = self.getTimestamp()
                if self.val == self.offset:
-                       if mp_globals.model in ["dm900","dm920","one"]:
+                       if mp_globals.model in ["dm900","dm920","one","two"]:
                                self['screenSaver'].hide()
                                self.fadeouttimer.start(500, 1)
                        elif config_mp.mediaportal.sp_radio_visualization.value not in ["1", "2"]:
@@ -1638,7 +1638,7 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
                                                if mp_globals.isDreamOS:
                                                        if self.playerMode == 'RADIO' and config_mp.mediaportal.sp_radio_visualization.value != "0" and MerlinMusicPlayerPresent:
                                                                sref = eServiceReference(0x1019, 0, url)
-                                                       elif self.eServiceStream and ('.m3u8' in url or 'm3u8-aapl' in url or '.mpd' in url) and mp_globals.model in ["one"]:
+                                                       elif self.eServiceStream and ('.m3u8' in url or 'm3u8-aapl' in url or '.mpd' in url) and mp_globals.model in ["one","two"]:
                                                                sref = eServiceReference(0x2223, 0, url)
                                                        else:
                                                                sref = eServiceReference(0x1001, 0, url)
@@ -1663,7 +1663,7 @@ class SimplePlayer(Screen, M3U8Player, CoverSearchHelper, SimpleSeekHelper, Simp
 
                                self.buffered = False
                                self.session.nav.playService(sref)
-                               if mp_globals.isDreamOS and self.playerMode not in ["RADIO"] and mp_globals.model not in ["one"] and not self.dash:
+                               if mp_globals.isDreamOS and self.playerMode not in ["RADIO"] and mp_globals.model not in ["one","two"] and not self.dash:
                                        from imports import TimerCall
                                        TimerCall(1, self.fixSeek)
 
@@ -2253,9 +2253,9 @@ class SimpleConfig(Screen, ConfigListScreenExt):
                        self.configlist.append(getConfigListEntry(_("Use DASH format for 480p:"), config_mp.mediaportal.youtubeenabledash480p))
                        self.configlist.append(getConfigListEntry(_("Use DASH format for 720p:"), config_mp.mediaportal.youtubeenabledash720p))
                        self.configlist.append(getConfigListEntry(_("Enable VP9 codec (required for resolutions >1080p):"), config_mp.mediaportal.youtubeenablevp9, True))
-                       if config_mp.mediaportal.youtubeenablevp9.value and mp_globals.model in ["one"]:
+                       if config_mp.mediaportal.youtubeenablevp9.value and mp_globals.model in ["one","two"]:
                                self.configlist.append(getConfigListEntry(_("Enable VP9 HDR (only for resolutions 720p and higher):"), config_mp.mediaportal.youtubeenablehdr))
-                       if mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+                       if mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                                self.configlist.append(getConfigListEntry(_("Enable Opus codec:"), config_mp.mediaportal.youtubeenableopus))
                self._spacer()
                self.configlist.append(getConfigListEntry(_("RADIO"), ))
index d2bf0d8..dfb7c59 100644 (file)
@@ -209,7 +209,7 @@ class youtubeUrl(object):
                '172' : 9, #VORBIS 256
                '171' : 10, #VORBIS 128
        }
-       if config_mp.mediaportal.youtubeenableopus.value and mp_globals.model in ["one", "dm7080", "dm900", "dm920"]:
+       if config_mp.mediaportal.youtubeenableopus.value and mp_globals.model in ["one", "two", "dm7080", "dm900", "dm920"]:
                self.AUDIO_FMT_PRIORITY_MAP.update({
                '251' : 3, #Opus 160
                '250' : 5, #Opus 70