import enigma2-plugin-extensions-mediaportal 2020032201 v2020032201
authorChristian Weiske <cweiske@cweiske.de>
Mon, 23 Mar 2020 00:15:25 +0000 (01:15 +0100)
committerChristian Weiske <cweiske@cweiske.de>
Mon, 23 Mar 2020 00:15:25 +0000 (01:15 +0100)
28 files changed:
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/additions.xml
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/forplayers.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/funnyvideoclips_de.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/hornoxe.py [moved from usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/failto.py with 81% similarity]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/liveleak.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/popcorntimes.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/spiegeltv.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/youtube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/radio.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/shoutcast.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/tunein.py [new file with mode: 0644]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/bild.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/doku_to.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/wissen.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/bongacams.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/lovehomeporn.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/pinflix.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porndoe.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/porntv.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/redtube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/x4tube.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/porn/xhamster.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.mo
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/locale/de/LC_MESSAGES/MediaPortal.po
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/plugin.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/api.py [deleted file]
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/nexx.py
usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/simpleplayer.py

index 55644f7..a02440a 100644 (file)
@@ -8,24 +8,20 @@
                <plugin type="mod" modfile="music.mtvdecharts" confopt="showMTVdeCharts" default="True" confcat="music" gz="0" name="MTV Charts" icon="mtvdecharts" filter="Music" screen="MTVdeChartsGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="music.radio" confopt="showradio" default="True" confcat="music" gz="0" name="Radio" icon="radio" filter="Music" screen="RadioGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="music.shoutcast" confopt="showshoutcast" default="True" confcat="music" gz="0" name="shoutcast" icon="shoutcast" filter="Music" screen="ShoutcastGenreScreen" param1="" param2=""/>
+               <plugin type="mod" modfile="music.tunein" confopt="showtunein" default="True" confcat="music" gz="0" name="TuneIn" icon="tunein" filter="Music" screen="tuneinGenreScreen" param1="" param2=""/>
                <!--newsdoku section-->
                <plugin type="mod" modfile="newsdoku.focus" confopt="showFocus" default="True" confcat="newsdoku" gz="0" name="Focus" icon="focus" filter="NewsDoku" screen="focusGenre" param1="" param2=""/>
                <plugin type="mod" modfile="newsdoku.autobild" confopt="showAutoBild" default="True" confcat="newsdoku" gz="0" name="Autobild" icon="autobild" filter="NewsDoku" screen="autoBildGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="newsdoku.dokus4_me" confopt="showDokus4me" default="True" confcat="newsdoku" gz="0" name="dokus4.me" icon="dokus4_me" filter="NewsDoku" screen="show_D4ME_Genre" param1="" param2=""/>
-               <plugin type="mod" modfile="newsdoku.wissen" confopt="showwissen" default="True" confcat="newsdoku" gz="0" name="Wissen.de" icon="wissen" filter="NewsDoku" screen="wissenListeScreen" param1="" param2=""/>
-               <plugin type="mod" modfile="newsdoku.bild" confopt="showbildde" default="True" confcat="newsdoku" gz="0" name="Bild" icon="bild" filter="NewsDoku" screen="bildFirstScreen" param1="" param2=""/>
-               <plugin type="mod" modfile="newsdoku.doku_to" confopt="showDUTO" default="True" confcat="newsdoku" gz="0" name="DOKU.to" icon="doku_to" filter="NewsDoku" screen="show_DUTO_Genre" param1="" param2=""/>
                <plugin type="mod" modfile="newsdoku.urknall" confopt="showurknall" default="True" confcat="newsdoku" gz="0" name="Urknall, Weltall und das Leben" icon="urknall" filter="NewsDoku" screen="UrknallFilmListeScreen" param1="" param2=""/>
                <!--fun section-->
                <plugin type="mod" modfile="fun.retrotv" confopt="showretrotv" default="True" confcat="fun" gz="0" name="retro-tv" icon="retrotv" filter="Fun" screen="retrotvFilmListeScreen" param1="" param2=""/>
-               <plugin type="mod" modfile="fun.forplayers" confopt="show4Players" default="True" confcat="fun" gz="0" name="4Players" icon="4players" filter="Fun" screen="forPlayersGenreScreen" param1="" param2=""/>
-               <plugin type="mod" modfile="fun.failto" confopt="showFail" default="True" confcat="fun" gz="0" name="Fail.to" icon="fail" filter="Fun" screen="failScreen" param1="" param2=""/>
+               <plugin type="mod" modfile="fun.hornoxe" confopt="showhornoxe" default="True" confcat="fun" gz="0" name="hornoxe" icon="hornoxe" filter="Fun" screen="hornoxeScreen" param1="" param2=""/>
                <plugin type="mod" modfile="fun.ccc" confopt="showCCC" default="True" confcat="fun" gz="0" name="CCC Media" icon="ccc" filter="Fun" screen="CccOverviewScreen" param1="" param2=""/>
                <plugin type="mod" modfile="fun.cczwei" confopt="showCC2" default="True" confcat="fun" gz="0" name="CC2.tv" icon="cczwei" filter="Fun" screen="cczwei" param1="" param2=""/>
                <plugin type="mod" modfile="fun.itunestrailers" confopt="showitunestrailers" default="True" confcat="fun" gz="0" name="iTunes Movie Trailers" icon="itunesmovietrailers" filter="Fun" screen="itunestrailersGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="fun.liveleak" confopt="showLiveLeak" default="False" confcat="fun" gz="0" name="LiveLeak" icon="liveleak" filter="Fun" screen="LiveLeakScreen" param1="" param2=""/>
                <plugin type="mod" modfile="fun.gaskrank_tv" confopt="showGaskrank" default="False" confcat="fun" gz="0" name="Gaskrank.tv" icon="gaskrank_tv" filter="Fun" screen="show_GKTV_Genre" param1="" param2=""/>
-               <plugin type="mod" modfile="fun.funnyvideoclips_de" confopt="showFunnyVideoclips" default="True" confcat="fun" gz="0" name="Funny Videoclips" icon="funnyvideoclips_de" filter="Fun" screen="show_FVCDE_Genre" param1="" param2=""/>
                <plugin type="mod" modfile="fun.lachmeister_de" confopt="showLachmeister" default="False" confcat="fun" gz="0" name="Lachmeister" icon="lachmeister_de" filter="Fun" screen="show_LMDE_Genre" param1="" param2=""/>
                <plugin type="mod" modfile="fun.lachschon_de" confopt="showLachschon" default="True" confcat="fun" gz="0" name="LACHSCHON.DE" icon="lachschon_de" filter="Fun" screen="show_LSDE_Genre" param1="" param2=""/>
                <plugin type="mod" modfile="fun.twitch" confopt="showTwitch" default="True" confcat="fun" gz="0" name="Twitch" icon="twitch" filter="Mediathek/Fun" screen="twitchMainScreen" param1="" param2=""/>
@@ -39,7 +35,6 @@
                <plugin type="mod" modfile="mediatheken.atv" confopt="showatv" default="True" confcat="mediatheken" gz="0" name="ATV Mediathek" icon="atv" filter="Mediathek" screen="atvGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.brf" confopt="showbrf" default="True" confcat="mediatheken" gz="0" name="BRF Mediathek" icon="brf" filter="Mediathek" screen="brfGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.funk" confopt="showFUNK" default="True" confcat="mediatheken" gz="0" name="FUNK" icon="funk" filter="Mediathek" screen="funkGenreScreen" param1="" param2=""/>
-               <plugin type="mod" modfile="mediatheken.spiegeltv" confopt="showspiegeltv" default="True" confcat="mediatheken" gz="0" name="SPIEGEL.TV" icon="spiegeltv" filter="Mediathek" screen="spiegeltvGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.kindertube" confopt="showkindertube" default="True" confcat="mediatheken" gz="0" name="KinderTube" icon="kindertube" filter="Mediathek" screen="kindertubeMain" param1="" param2="" kids="1"/>
                <plugin type="mod" modfile="mediatheken.myspass" confopt="showmyspass" default="True" confcat="mediatheken" gz="0" name="MySpass" icon="myspass" filter="Mediathek" screen="myspassGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="mediatheken.netzkino" confopt="showNetzKino" default="True" confcat="mediatheken" gz="0" name="Netzkino" icon="netzkino" filter="Mediathek" screen="netzKinoGenreScreen" param1="" param2=""/>
                <plugin type="mod" modfile="porn.porntv" confopt="showasspoint" default="False" confcat="porn" gz="0" name="AssPoint" icon="asspoint" filter="Porn" screen="porntvGenreScreen" param1="asspoint" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;AssPoint.com&quot;, &quot;https://www.asspoint.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showanalpornvideos" default="False" confcat="porn" gz="0" name="AnalPornVideos" icon="analpornvideos" filter="Porn" screen="porntvGenreScreen" param1="analpornvideos" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;AnalPornVideos.com&quot;, &quot;https://www.analpornvideos.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showhoodtube" default="False" confcat="porn" gz="0" name="HoodTube" icon="hoodtube" filter="Porn" screen="porntvGenreScreen" param1="hoodtube" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;HoodTube.com&quot;, &quot;https://www.hoodtube.com&quot;"/>
-               <plugin type="mod" modfile="porn.porntv" confopt="showbigboobstube" default="False" confcat="porn" gz="0" name="BigBoobsTube" icon="bigboobstube" filter="Porn" screen="porntvGenreScreen" param1="bigboobstube" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;BigBoobsTube.com&quot;, &quot;https://www.bigboobstube.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showsuzisporn" default="False" confcat="porn" gz="0" name="SuzisPorn" icon="suzisporn" filter="Porn" screen="porntvGenreScreen" param1="suzisporn" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;SuzisPorn.com&quot;, &quot;https://www.suzisporn.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showmovieshark" default="False" confcat="porn" gz="0" name="MovieShark" icon="movieshark" filter="Porn" screen="porntvGenreScreen" param1="movieshark" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;MovieShark.com&quot;, &quot;https://www.movieshark.com&quot;"/>
-               <plugin type="mod" modfile="porn.porntv" confopt="showyoungsextube" default="False" confcat="porn" gz="0" name="YoungSexTube" icon="youngsextube" filter="Porn" screen="porntvGenreScreen" param1="youngsextube" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;YoungSexTube.com&quot;, &quot;https://www.youngsextube.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showyoungporno" default="False" confcat="porn" gz="0" name="YoungPorno" icon="youngporno" filter="Porn" screen="porntvGenreScreen" param1="youngporno" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;YoungPorno.com&quot;, &quot;https://www.youngporno.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showporntitan" default="False" confcat="porn" gz="0" name="PornTitan" icon="porntitan" filter="Porn" screen="porntvGenreScreen" param1="porntitan" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;PornTitan.com&quot;, &quot;https://www.porntitan.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showxjizz" default="False" confcat="porn" gz="0" name="XJizz" icon="xjizz" filter="Porn" screen="porntvGenreScreen" param1="xjizz" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;XJizz.com&quot;, &quot;https://www.xjizz.com&quot;"/>
                <plugin type="mod" modfile="porn.porntv" confopt="showmovietitan" default="False" confcat="porn" gz="0" name="MovieTitan" icon="movietitan" filter="Porn" screen="porntvGenreScreen" param1="movietitan" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;MovieTitan.com&quot;, &quot;https://www.movietitan.com&quot;"/>
-               <plugin type="mod" modfile="porn.porntv" confopt="showcartoonsextube" default="False" confcat="porn" gz="0" name="CartoonSexTube" icon="cartoonsextube" filter="Porn" screen="porntvGenreScreen" param1="cartoonsextube" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;CartoonSexTube.com&quot;, &quot;https://www.cartoonsextube.com&quot;"/>
-               <plugin type="mod" modfile="porn.porntv" confopt="showmobilepornmovies" default="False" confcat="porn" gz="0" name="MobilePornMovies" icon="mobilepornmovies" filter="Porn" screen="porntvGenreScreen" param1="mobilepornmovies" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;MobilePornMovies.com&quot;, &quot;https://www.mobilepornmovies.com&quot;"/>
-               <plugin type="mod" modfile="porn.porntv" confopt="showxxxmilfs" default="False" confcat="porn" gz="0" name="XXXMilfs" icon="xxxmilfs" filter="Porn" screen="porntvGenreScreen" param1="xxxmilfs" param2="" search="1" delim="+" searchurl="%s" searchscreen="porntvFilmScreen" searchparam=", &quot;XXXMilfs.com&quot;, &quot;https://www.xxxmilfs.com&quot;"/>
                <plugin type="mod" modfile="porn.beeg" confopt="showbeeg" default="False" confcat="porn" gz="0" name="beeg" icon="beeg" filter="Porn" screen="beegGenreScreen" param1="" param2="" search="0" delim="" searchurl="" searchscreen="" searchparam=""/>
-               <plugin type="mod" modfile="porn.vporn" confopt="showvporn" default="False" confcat="porn" gz="0" name="VPORN" icon="vporn" filter="Porn" screen="vpornGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="vpornFilmScreen" searchparam=", &quot;&quot;, &quot;&quot;, False"/>
+               <plugin type="mod" modfile="porn.vporn" confopt="showvporn" default="False" confcat="porn" gz="0" name="VPORN" icon="vporn" filter="Porn" screen="vpornGenreScreen" param1="" param2="" search="1" delim="+" searchurl="%s" searchscreen="vpornFilmScreen" searchparam=", &quot;&quot;, &quot;&quot;"/>
                <plugin type="mod" modfile="porn.cliphunter" confopt="showcliphunter" default="False" confcat="porn" gz="0" name="cliphunter" icon="cliphunter" filter="Porn" screen="cliphunterGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="cliphunterFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.realgfporn" confopt="showrealgfporn" default="False" confcat="porn" gz="0" name="RealGFPorn" icon="realgfporn" filter="Porn" screen="realgfpornGenreScreen" param1="" param2="" search="1" delim="-" searchurl="https://www.realgfporn.com/search/%s/page" searchscreen="realgfpornFilmScreen" searchparam=""/>
                <plugin type="mod" modfile="porn.hotscope" confopt="showhotscope" default="False" confcat="porn" gz="0" name="Hotscope" icon="hotscope" filter="Porn" screen="hotscopeGenreScreen" param1="" param2="" search="1" delim="%20" searchurl="%s" searchscreen="hotscopeFilmScreen" searchparam=""/>
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/forplayers.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/forplayers.py
deleted file mode 100644 (file)
index 1507569..0000000
+++ /dev/null
@@ -1,325 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-from Plugins.Extensions.MediaPortal.resources.keyboardext import VirtualKeyBoardExt
-try:
-       from Plugins.Extensions.MediaPortal.resources.api import ForPlayersApi, SYSTEMS
-       api = ForPlayersApi()
-except:
-       pass
-
-default_cover = "file://%s/4players.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class forPlayersGenreScreen(MPScreen):
-
-       def __init__(self, session):
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "ok"    : self.keyOK,
-                       "0" : self.closeAll,
-                       "cancel": self.keyCancel
-               }, -1)
-
-               self['title'] = Label("4Players")
-               self['ContentTitle'] = Label(_("Selection:"))
-               self.selectionListe = []
-               self.suchString = ''
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.selectionListe.append(("Aktuelle Videos", "1"))
-               self.selectionListe.append(("Meistgesehene Videos", "2"))
-               self.selectionListe.append(("Letzte Reviews", "3"))
-               self.selectionListe.append(("Videos nach Spiel suchen", "4"))
-               self.ml.setList(map(self._defaultlistcenter, self.selectionListe))
-
-       def keyOK(self):
-               self.selectionLink = self['liste'].getCurrent()[0][1]
-               print 'SelektionLink: ', self.selectionLink
-               if self.selectionLink == "4":
-                       limit = int(150)
-                       api.set_systems(SYSTEMS)
-                       self.suchen()
-               else:
-                       self.session.open(forPlayersVideoScreen, self.selectionLink, '')
-
-       def SuchenCallback(self, callback = None):
-               if callback is not None and len(callback):
-                       self.suchString = callback
-                       self.session.open(forPlayersVideoScreen, self.selectionLink, self.suchString)
-
-class forPlayersVideoScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, selectionLink, searchData):
-               self.selectionLink = selectionLink
-               self.searchData = searchData
-               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,
-                       "left"  : self.keyLeft,
-                       "right" : self.keyRight,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown
-               }, -1)
-
-               self.page = 1
-               self.lastpage = 999
-               self.keyLocked = True
-               self['title'] = Label("4Players")
-
-               self['Page'] = Label(_("Page:"))
-               self['page'] = Label("1")
-               self.juengstTS = ''
-               self.videosListe = []
-               self.videosQueue = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-               self.onLayoutFinish.append(self.loadVideos)
-
-       def loadVideos(self):
-               self['page'].setText(str(self.page))
-               if self.selectionLink == '1':
-                       try:
-                               limit = int(50)
-                               api.set_systems(SYSTEMS)
-                               videos = api.get_latest_videos(limit)
-                               self.videosQueue.append((self.page, videos))
-                               self.juengstTS = min((v['ts'] for v in videos))
-                               self.showData(videos)
-                       except:
-                               self.videosListe.append(('4Players nicht verfügbar....', "", "", ""))
-                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               elif self.selectionLink == '2':
-                       try:
-                               limit = int(150)
-                               api.set_systems(SYSTEMS)
-                               videos = api.get_popular_videos(limit)
-                               self.showData(videos)
-                       except:
-                               self.videosListe.append(('4Players nicht verfügbar....', "", "", ""))
-                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               elif self.selectionLink == '3':
-                       try:
-                               limit = int(150)
-                               api.set_systems(SYSTEMS)
-                               videos = api.get_latest_reviews(older_than=0)
-                               self.showData(videos)
-                       except:
-                               self.videosListe.append(('4Players nicht verfügbar....', "", "", ""))
-                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               elif self.selectionLink == "4":
-                       videos = []
-                       try:
-                               searchStr = str(self.searchData)
-                               try:
-                                       videos = api.get_games(searchStr)
-                                       if videos == None:
-                                               self.videosListe.append(('Keine Videos gefunden....', "", "", ""))
-                                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-                                       else:
-                                               self.showSearchData(videos)
-                               except:
-                                       self.videosListe.append(('Keine Videos gefunden....', "", "", ""))
-                       except:
-                               self.videosListe.append(('4Players nicht verfügbar....', "", "", ""))
-                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-
-       def showSearchData(self, videos):
-               for video in videos:
-                       gameTitel = video['title'].encode('utf-8')
-                       gameID = video['id']
-                       videoPic = video['thumb']
-                       gameStudio = video['studio']
-                       self.videosListe.append((gameTitel, "empty", str(videoPic), gameTitel, gameID, gameStudio, gameTitel))
-               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               self.keyLocked = False
-
-       def showData(self, videos):
-               for video in videos:
-                       gameTitle = video['game']['title'].encode('utf-8')
-                       videoTitle = video['video_title'].encode('utf-8')
-                       videoStreamUrl = video['streams']['hq']['url'].encode('utf-8')
-                       videoDate = video['date']
-                       videoPic = video['thumb']
-                       gameId = video['game']['id']
-                       gameStudio = video['game']['studio']
-                       videoTitleConv = gameTitle + ' - ' + videoTitle + ' ' + '(' + videoDate + ')'
-                       self.videosListe.append((videoTitleConv, videoStreamUrl, str(videoPic), videoTitle, gameId, gameStudio, gameTitle))
-               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.th_ThumbsQuery(self.videosListe, 0, 1, 2, None, None, self.page, 999, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               Title = self['liste'].getCurrent()[0][0]
-               Image = self['liste'].getCurrent()[0][2]
-               self['name'].setText(str(Title))
-               if self.selectionLink == '1':
-                       self['page'].setText(str(self.page))
-               CoverHelper(self['coverArt']).getCover(Image)
-               self.keyInfo()
-
-       def loadPage(self):
-               if self.selectionLink == '1':
-                       self.videosListe = []
-                       self.queuedVideoList = []
-                       for queuedEntry in self.videosQueue:
-                               if queuedEntry[0] == self.page:
-                                       self.queuedVideoList = queuedEntry[1]
-                       if self.queuedVideoList:
-                               self.showData(self.queuedVideoList)
-                       else:
-                               try:
-                                               api.set_systems(SYSTEMS)
-                                               videos = api.get_latest_videos(older_than=self.juengstTS)
-                                               self.juengstTS = min((v['ts'] for v in videos))
-                                               self.videosQueue.append((self.page, videos))
-                                               self.showData(videos)
-                               except:
-                                               self.videosListe.append(('4Players nicht verfügbar....', "", "", ""))
-                                               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-
-       def keyInfo(self):
-               text = []
-               gameStudio = self['liste'].getCurrent()[0][5]
-               gameId = self['liste'].getCurrent()[0][4]
-               gameTitle = self['liste'].getCurrent()[0][6]
-               gameInfoCol = api._get_game_info(gameId)
-               text.append('Titel: ' + str(gameTitle))
-               text.append('\n')
-               text.append('Studion: ' + str(gameStudio))
-               text.append('\n')
-               for info in gameInfoCol:
-                       gamePub = info['publisher']
-                       text.append('Publisher: ' + str(gamePub))
-                       text.append('\n')
-                       for system in info['systeme']:
-                               gameSys = system['system']
-                               text.append('Plattform: ' + str(gameSys))
-                               text.append('\n')
-                               text.append('Release: ' + str(system['releasetag']) + '.' + str(system['releasemonat']) + '.' + str(system['releasejahr']))
-                               text.append('\n')
-                               text.append('USK: ' + str(system['usk']))
-                               text.append('\n')
-               sText = ''.join(text)
-               self['handlung'].setText(sText)
-               #self.session.open(MessageBoxExt,sText, MessageBoxExt.TYPE_INFO)
-
-       def keyOK(self):
-               playersUrl = self['liste'].getCurrent()[0][1]
-               if playersUrl == "empty":
-                       game_id = self['liste'].getCurrent()[0][4]
-                       game_id_int = int(game_id)
-                       try:
-                               searchVideos = api.get_videos_by_game(older_than=0, game_id=game_id)
-                               self.session.open(forPlayersSearchListScreen, searchVideos)
-                       except:
-                               pass
-               else:
-                       streamUrl = str(playersUrl)
-                       playersTitle = self['liste'].getCurrent()[0][3]
-                       playersTitleStr = str(playersTitle)
-                       if playersUrl:
-                               self.session.open(SimplePlayer, [(playersTitleStr, streamUrl)], showPlaylist=False, ltype='4players')
-
-class forPlayersSearchListScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, videosListe):
-               self.searchVideoListe = videosListe
-               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,
-                       "left"  : self.keyLeft,
-                       "right" : self.keyRight
-               }, -1)
-
-               self.page = 1
-               self.lastpage = 999
-               self.keyLocked = True
-               self['title'] = Label("4Players")
-
-               self['Page'] = Label(_("Page:"))
-               self['page'] = Label("1")
-               self.juengstTS = ''
-               self.videosListe = []
-               self.videosQueue = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-               self.onLayoutFinish.append(self.loadSearchVideos)
-
-       def loadSearchVideos(self):
-               videos = self.searchVideoListe
-               for video in videos:
-                       gameTitle = video['game']['title'].encode('utf-8')
-                       videoTitle = video['video_title'].encode('utf-8')
-                       videoStreamUrl = video['streams']['hq']['url'].encode('utf-8')
-                       videoDate = video['date']
-                       videoPic = video['thumb']
-                       gameId = video['game']['id']
-                       gameStudio = video['game']['studio']
-                       videoTitleConv = gameTitle + ' - ' + videoTitle + ' ' + '(' + videoDate + ')'
-                       self.videosListe.append((videoTitleConv, videoStreamUrl, str(videoPic), videoTitle, gameId, gameStudio, gameTitle))
-               self.ml.setList(map(self._defaultlistleft, self.videosListe))
-               self.keyLocked = False
-               self.th_ThumbsQuery(self.videosListe, 0, 1, 2, None, None, self.page, 999, mode=1)
-               self.showInfos()
-
-       def showInfos(self):
-               Title = self['liste'].getCurrent()[0][0]
-               Image = self['liste'].getCurrent()[0][2]
-               self['name'].setText(str(Title))
-               self['page'].setText(str(self.page))
-               CoverHelper(self['coverArt']).getCover(Image)
-               self.keyInfo()
-
-       def keyInfo(self):
-               text = []
-               gameStudio = self['liste'].getCurrent()[0][5]
-               gameId = self['liste'].getCurrent()[0][4]
-               gameTitle = self['liste'].getCurrent()[0][6]
-               gameInfoCol = api._get_game_info(gameId)
-               text.append('Titel: ' + str(gameTitle))
-               text.append('\n')
-               text.append('Studion: ' + str(gameStudio))
-               text.append('\n')
-               for info in gameInfoCol:
-                       gamePub = info['publisher']
-                       text.append('Publisher: ' + str(gamePub))
-                       text.append('\n')
-                       for system in info['systeme']:
-                               gameSys = system['system']
-                               text.append('Plattform: ' + str(gameSys))
-                               text.append('\n')
-                               text.append('Release: ' + str(system['releasetag']) + '.' + str(system['releasemonat']) + '.' + str(system['releasejahr']))
-                               text.append('\n')
-                               text.append('USK: ' + str(system['usk']))
-                               text.append('\n')
-               sText = ''.join(text)
-               self['handlung'].setText(sText)
-               #self.session.open(MessageBoxExt,sText, MessageBoxExt.TYPE_INFO)
-
-       def keyOK(self):
-               playersUrl = self['liste'].getCurrent()[0][1]
-               streamUrl = str(playersUrl)
-               playersTitle = self['liste'].getCurrent()[0][3]
-               playersTitleStr = str(playersTitle)
-               if playersUrl:
-                       self.session.open(SimplePlayer, [(playersTitleStr, streamUrl)], showPlaylist=False, ltype='4players')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/funnyvideoclips_de.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/fun/funnyvideoclips_de.py
deleted file mode 100644 (file)
index 14a5a46..0000000
+++ /dev/null
@@ -1,327 +0,0 @@
-# -*- coding: utf-8 -*-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-import Queue
-import threading
-from Plugins.Extensions.MediaPortal.resources.youtubelink import YoutubeLink
-from Plugins.Extensions.MediaPortal.resources.menuhelper import MenuHelper
-from Plugins.Extensions.MediaPortal.resources.twagenthelper import twAgentGetPage
-
-default_cover = "file://%s/funnyvideoclips_de.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class show_FVCDE_Genre(MenuHelper):
-
-       def __init__(self, session):
-\r              MenuHelper.__init__(self, session, 0, [[]], "http://www.funny-videoclips.de", "", self._defaultlistcenter, default_cover=default_cover)
-
-               self['title'] = Label("Funny Videoclips")
-               self['ContentTitle'] = Label("Genres")
-
-               self.onLayoutFinish.append(self.mh_initMenu)
-
-       def mh_parseData(self, data):
-               entrys = []
-               menu = re.search('class="widget-title widgettitle">Lustige Videos</h4>(.*?)</ul>', data, re.S)
-               if menu:
-                       entrys += re.findall('<li.*?href="(.*?)"\s.*?>(.*?)</a>', menu.group(1))
-
-               return entrys
-
-       def mh_callGenreListScreen(self):
-               genreurl = self.mh_genreUrl[0]+self.mh_genreUrl[1]
-               self.session.open(FVCDE_FilmListeScreen, genreurl, self.mh_genreTitle)
-
-class FVCDE_FilmListeScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, genreLink, genreName):
-               self.genreLink = genreLink
-               self.genreName = genreName
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions2", "MP_Actions"], {
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "5" : self.keyShowThumb,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "upUp" : self.key_repeatedUp,
-                       "rightUp" : self.key_repeatedUp,
-                       "leftUp" : self.key_repeatedUp,
-                       "downUp" : self.key_repeatedUp,
-                       "upRepeated" : self.keyUpRepeated,
-                       "downRepeated" : self.keyDownRepeated,
-                       "rightRepeated" : self.keyRightRepeated,
-                       "leftRepeated" : self.keyLeftRepeated,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown,
-                       "1" : self.key_1,
-                       "3" : self.key_3,
-                       "4" : self.key_4,
-                       "6" : self.key_6,
-                       "7" : self.key_7,
-                       "9" : self.key_9,
-                       "0"     : self.closeAll
-               }, -1)
-
-               self.sortOrder = 0
-               self.baseUrl = "http://www.funny-videoclips.de"
-               self.genreTitle = ""
-               self.sortParIMDB = ""
-               self.sortParAZ = ""
-               self.sortOrderStrAZ = ""
-               self.sortOrderStrIMDB = ""
-               self.sortOrderStrGenre = ""
-               self['title'] = Label("Funny Videoclips")
-
-               self['Page'] = Label(_("Page:"))
-
-               self.filmQ = Queue.Queue(0)
-               self.hanQ = Queue.Queue(0)
-               self.picQ = Queue.Queue(0)
-               self.updateP = 0
-               self.eventL = threading.Event()
-               self.eventP = threading.Event()
-               self.keyLocked = True
-               self.dokusListe = []
-               self.page = 0
-               self.pages = 0;
-
-               self.setGenreStrTitle()
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def setGenreStrTitle(self):
-               genreName = "%s%s" % (self.genreTitle,self.genreName)
-               self['ContentTitle'].setText(genreName)
-
-       def loadPage(self):
-               if self.page > 1:
-                       url = "%s/page/%d/" % (self.genreLink, self.page)
-               else:
-                       url = self.genreLink
-
-               if self.page:
-                       self['page'].setText("%d / %d" % (self.page,self.pages))
-
-               self.filmQ.put(url)
-               if not self.eventL.is_set():
-                       self.eventL.set()
-                       self.loadPageQueued()
-
-       def loadPageQueued(self):
-               self['name'].setText(_('Please wait...'))
-               while not self.filmQ.empty():
-                       url = self.filmQ.get_nowait()
-               twAgentGetPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
-
-       def dataError(self, error):
-               self.eventL.clear()
-               printl(error,self,"E")
-               self.dokusListe.append((_("No videos found!"),"","",""))
-               self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-
-       def loadPageData(self, data):
-               self.dokusListe = []
-               a = 0
-               l = len(data)
-               while a < l:
-                       m = re.search('<article class="post-(.*?)</div></div>', data[a:], re.S)
-                       if m:
-                               a += m.end()
-                               d = re.search('href="(.*?)">(.*?)</a.*?<img.*?src="(.*?)".*?', m.group(1), re.S)
-                               if d:
-                                       t = re.search('<p>(.*?)</p>', m.group(1))
-                                       if t:
-                                               desc = stripAllTags(decodeHtml(t.group(1))).strip()
-                                       else:
-                                               desc = None
-                                       image = d.group(3)
-                                       if image.startswith('/'):
-                                               image = 'http://www.funny-videoclips.de' + image
-                                       self.dokusListe.append((decodeHtml(d.group(2)), d.group(1), image, desc))
-                       else:
-                               break
-
-               if self.dokusListe:
-                       if not self.page:
-                               pages = 0
-                               try:
-                                       m = re.search('pagination"><ul>(.*?)</ul></div>', data, re.S)
-                                       for p in re.finditer('">(\w+)</', m.group(1)):
-                                               page = int(p.group(1))
-                                               if page > pages: pages = page
-                                       self.pages = pages
-                                       self.page = 1
-                               except:
-                                       pass
-                               else:
-                                       self['page'].setText("%d / %d" % (self.page,self.pages))
-
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       self.th_ThumbsQuery(self.dokusListe, 0, 1, 2, None, None, self.page, self.pages, mode=1)
-                       self.loadPicQueued()
-               else:
-                       self.dokusListe.append((_("No videos found!"),"","",""))
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       if self.filmQ.empty():
-                               self.eventL.clear()
-                       else:
-                               self.loadPageQueued()
-
-       def loadPic(self):
-
-               if self.picQ.empty():
-                       self.eventP.clear()
-                       return
-
-               if self.updateP:
-                       return
-
-               while not self.picQ.empty():
-                       self.picQ.get_nowait()
-
-               streamName = self['liste'].getCurrent()[0][0]
-               self['name'].setText(streamName)
-               streamPic = self['liste'].getCurrent()[0][2]
-               desc = self['liste'].getCurrent()[0][3]
-               self.getHandlung(desc)
-               self.updateP = 1
-               CoverHelper(self['coverArt'], self.ShowCoverFileExit).getCover(streamPic)
-
-       def getHandlung(self, desc):
-               if desc == None:
-                       self['handlung'].setText('')
-                       return
-               self.setHandlung(desc)
-
-       def setHandlung(self, data):
-               self['handlung'].setText(decodeHtml(data))
-
-       def ShowCoverFileExit(self):
-               self.updateP = 0;
-               self.keyLocked  = False
-               if not self.filmQ.empty():
-                       self.loadPageQueued()
-               else:
-                       self.eventL.clear()
-                       self.loadPic()
-
-       def loadPicQueued(self):
-               self.picQ.put(None)
-               if not self.eventP.is_set():
-                       self.eventP.set()
-               self.loadPic()
-
-       def keyOK(self):
-               if (self.keyLocked|self.eventL.is_set()):
-                       return
-               self.session.open(
-                       FVCDEPlayer,
-                       self.dokusListe,
-                       playIdx = self['liste'].getSelectedIndex()
-                       )
-
-       def keyUpRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].up()
-
-       def keyDownRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].down()
-
-       def key_repeatedUp(self):
-               if self.keyLocked:
-                       return
-               self.loadPicQueued()
-
-       def keyLeftRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].pageUp()
-
-       def keyRightRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].pageDown()
-
-       def keyPageDown(self):
-               self.keyPageDownFast(1)
-
-       def keyPageUp(self):
-               self.keyPageUpFast(1)
-
-       def keyPageUpFast(self,step):
-               if self.keyLocked:
-                       return
-               oldpage = self.page
-               if (self.page + step) <= self.pages:
-                       self.page += step
-               else:
-                       self.page = 1
-               if oldpage != self.page:
-                       self.loadPage()
-
-       def keyPageDownFast(self,step):
-               if self.keyLocked:
-                       return
-               oldpage = self.page
-               if (self.page - step) >= 1:
-                       self.page -= step
-               else:
-                       self.page = self.pages
-               if oldpage != self.page:
-                       self.loadPage()
-
-       def key_1(self):
-               self.keyPageDownFast(2)
-
-       def key_4(self):
-               self.keyPageDownFast(5)
-
-       def key_7(self):
-               self.keyPageDownFast(10)
-
-       def key_3(self):
-               self.keyPageUpFast(2)
-
-       def key_6(self):
-               self.keyPageUpFast(5)
-
-       def key_9(self):
-               self.keyPageUpFast(10)
-
-class FVCDEPlayer(SimplePlayer):
-
-       def __init__(self, session, playList, playIdx):
-               SimplePlayer.__init__(self, session, playList, playIdx=playIdx, playAll=True, listTitle="FUNNY-VIDEOCLIPS.DE", ltype='funny-videoclips.de')
-
-       def getVideo(self):
-               dhVideoId = self.playList[self.playIdx][1]
-               dhTitle = self.playList[self.playIdx][0]
-               imgurl =  self.playList[self.playIdx][2]
-               if not dhVideoId.startswith('http'):
-                       YoutubeLink(self.session).getLink(self.playStream, self.ytError, dhTitle, dhVideoId, imgurl=imgurl)
-               else:
-                       getPage(dhVideoId).addCallback(self.parseStream).addErrback(self.dataError)
-
-       def parseStream(self, data):
-               m2 = re.search('//www.youtube.com/(embed|v)/(.*?)(\?|" |&amp)', data)
-               if m2:
-                       dhVideoId = m2.group(2)
-                       dhTitle = self.playList[self.playIdx][0]
-                       imgurl =  self.playList[self.playIdx][2]
-                       YoutubeLink(self.session).getLink(self.playStream, self.ytError, dhTitle, dhVideoId, imgurl=imgurl)
-               else:
-                       self.dataError("Kein Videostream gefunden!")
-
-       def ytError(self, error):
-               msg = "Title: %s\n%s" % (self.playList[self.playIdx][0], error)
-               self.dataError(msg)
\ No newline at end of file
@@ -38,9 +38,9 @@ from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.youtubeplayer import YoutubePlayer
 
-default_cover = "file://%s/fail.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+default_cover = "file://%s/hornoxe.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
-class failScreen(MPScreen, ThumbsHelper):
+class hornoxeScreen(MPScreen, ThumbsHelper):
 
        def __init__(self, session):
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
@@ -61,7 +61,7 @@ class failScreen(MPScreen, ThumbsHelper):
                }, -1)
 
                self.keyLocked = True
-               self['title'] = Label("Fail.to")
+               self['title'] = Label("hornoxe.com")
                self['F2'] = Label(_("Page"))
 
                self['Page'] = Label(_("Page:"))
@@ -77,20 +77,17 @@ class failScreen(MPScreen, ThumbsHelper):
        def loadPage(self):
                self.keyLocked = True
                self['name'].setText(_('Please wait...'))
-               url = "https://www.fail.to/genre/1-videos/p-%s" % str(self.page)
+               url = "http://www.hornoxe.com/fun-clips/page/%s/" % str(self.page)
                twAgentGetPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
-               self.getLastPage(data, '', 'class="pagination">.*?<strong>(.*?)</strong>')
-               parse = re.search('<body>(.*?)class="pagination">', data, re.S)
-               Videos = re.findall('class="entry">.*?</span><a href="(.*?)" title=".*?">(.*?)</a></h3>.*?class="preview".*?<img src="(.*?)".*?class="description">(.*?)</div>', parse.group(1), re.S)
+               self.getLastPage(data, "class='wp-pagenavi'>(.*?)</div>", '.*/page/(\d+)')
+               Videos = re.findall('lass="storytitle"><a\shref="((?!http://www.hornoxe.com/den-picdump-von-morgen).*?)".*?img\ssrc="(.*?)".*?alt="(.*?)".*?</a>(.*?)</p', data, re.S)
                if Videos:
                        self.filmliste = []
-                       for (Url, Title, Image, Descr) in Videos:
-                               Url = "https://www.fail.to" + Url
-                               Image = "https://www.fail.to" + Image
+                       for (Url, Image, Title, Descr) in Videos:
                                Descr = stripAllTags(Descr).strip()
-                               self.filmliste.append((Title, Url, Image, Descr))
+                               self.filmliste.append((decodeHtml(Title), Url, Image, decodeHtml(Descr)))
                if len(self.filmliste) == 0:
                        self.filmliste.append((_('No videos found!'), None, None, ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
@@ -115,10 +112,10 @@ class failScreen(MPScreen, ThumbsHelper):
 
        def parseData(self, data):
                Title = self['liste'].getCurrent()[0][0]
-               Stream = re.findall("'file': '(.*?)'", data)
+               Stream = re.findall('<source type="video/mp4" src="(.*?)"', data)
                if Stream:
-                       Stream = "https://www.fail.to" + Stream[0]
-                       self.session.open(SimplePlayer, [(Title, Stream)], showPlaylist=False, ltype='failto')
+                       Stream = Stream[0]
+                       self.session.open(SimplePlayer, [(Title, Stream)], showPlaylist=False, ltype='hornoxe')
                else:
                        videoPage = re.findall('www.youtube.com/(v|embed)/(.*?)"', data, re.S)
                        if videoPage:
index fd42463..2302ab7 100644 (file)
@@ -54,25 +54,44 @@ class LiveLeakScreen(MPScreen):
                self['title'] = Label("LiveLeak.com")
                self['ContentTitle'] = Label("Genre:")
                self.genreliste = []
+               self.suchString = ''
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
                self['liste'] = self.ml
 
                self.onLayoutFinish.append(self.layoutFinished)
 
        def layoutFinished(self):
-               self.genreliste.append(("Featured", "https://www.liveleak.com/rss?featured=1&page="))
-               self.genreliste.append(("Upcoming", "https://www.liveleak.com/rss?upcoming=1&page="))
+               self.genreliste.append(("--- Search ---", ""))
+               self.genreliste.append(("Featured", "browse?featured=1&page="))
+               self.genreliste.append(("Recent Items", "browse?page="))
+               self.genreliste.append(("Must See", "browse?in_bookmark_folder_id=2&container_id=module_container_1&hs=1&page="))
+               self.genreliste.append(("German", "browse?q=german&hs=1&page="))
+               self.genreliste.append(("News & Politics", "browse?tag_string=news%2C+politics%2C+trump&container_id=module_container_1&hs=1&page="))
+               self.genreliste.append(("Law Enforcement", "browse?tag_string=police%2C+law+enforcement%2C+cops%2C+bodycam&container_id=module_container_1&hs=1&page="))
+               self.genreliste.append(("Weather", "browse?tag_string=weather%2Cstorm%2Cthunder%2Cwind%2Churricane%2Ctornado%2Crainbow%2Chail%2Csnow%2Cice&container_id=module_container_1&hs=1&page="))
+               self.genreliste.append(("Entertainment", "browse?tag_string=entertainment&container_id=module_container_1&hs=1&page="))
+               self.genreliste.append(("WTF", "browse?tag_string=wtf&container_id=module_container_1&hs=1&page="))
                self.ml.setList(map(self._defaultlistcenter, self.genreliste))
 
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "--- Search ---"
+                       self.suchString = callback
+                       Link = 'browse?q=%s&hs=1&page=' % urllib.quote(self.suchString).replace(' ', '+')
+                       self.session.open(LiveLeakClips, Link, Name)
+
        def keyOK(self):
                Name = self['liste'].getCurrent()[0][0]
-               streamGenreLink = self['liste'].getCurrent()[0][1]
-               self.session.open(LiveLeakClips, streamGenreLink, Name)
+               if Name == "--- Search ---":
+                       self.suchen()
+               else:
+                       Link = self['liste'].getCurrent()[0][1]
+                       self.session.open(LiveLeakClips, Link, Name)
 
 class LiveLeakClips(MPScreen, ThumbsHelper):
 
-       def __init__(self, session, streamGenreLink, Name):
-               self.streamGenreLink = streamGenreLink
+       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)
@@ -87,17 +106,19 @@ class LiveLeakClips(MPScreen, ThumbsHelper):
                        "left"  : self.keyLeft,
                        "right" : self.keyRight,
                        "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown
+                       "prevBouquet" : self.keyPageDown,
+                       "green" : self.keyPageNumber
                }, -1)
 
                self.keyLocked = True
                self.page = 1
-               self.lastpage = 999
+               self.lastpage = 1
+
                self['title'] = Label("LiveLeak.com")
                self['ContentTitle'] = Label("Auswahl: %s" %self.Name)
+               self['F2'] = Label(_("Page"))
 
                self['Page'] = Label(_("Page:"))
-               self['page'] = Label("1")
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
                self['liste'] = self.ml
 
@@ -105,36 +126,47 @@ class LiveLeakClips(MPScreen, ThumbsHelper):
 
        def loadPage(self):
                self.keyLocked = True
+               self.feedliste = []
                self['name'].setText(_('Please wait...'))
-               url = "%s%s&safe_mode=off" % (self.streamGenreLink, str(self.page))
+               url = "https://www.liveleak.com/%s%s&safe_mode=off" % (self.Link, str(self.page))
                getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
-               rssfeed = re.findall('<item>.*?<title>(.*?)</title>.*?<link>(http[s]?://www.liveleak.com/view.*?)</link>.*?<description>(.*?)</description>.*?<media:thumbnail\surl="(.*?)"', data, re.S)
-               if rssfeed:
-                       self.feedliste = []
-                       for (title,url,desc,image) in rssfeed:
-                               if not re.match('LiveLeak.com Rss Feed', title, re.S|re.I):
-                                       if image.startswith('//'):
-                                               image = "https:" + image
-                                       self.feedliste.append((decodeHtml(title).strip(),url,image,decodeHtml(desc.strip())))
+               self.getLastPage(data, 'class="pagination"(.*?)</ul>')
+               vids = re.findall('items_pic.*?img\ssrc="(.*?)"\salt="(.*?)".*?href="(.*?)".*?h3>(.*?)<div.*?Leaked:(.*?)in:.*?Views:\s(\d+)', data, re.S)
+               if vids:
+                       for (image, title, url, descr, date, views) in vids:
+                               if image.startswith('//'):
+                                       image = "https:" + image
+                               self.feedliste.append((decodeHtml(title).strip(), url , image , decodeHtml(stripAllTags(descr)).strip(), date.strip(), views.strip()))
                if len(self.feedliste) == 0:
-                       self.feedliste.append((_('No videos found!'), None, None, ''))
+                       self.feedliste.append((_('No videos found!'), None, None, '', '', ''))
                self.ml.setList(map(self._defaultlistleft, self.feedliste))
                self.ml.moveToIndex(0)
                self.keyLocked = False
-               self.th_ThumbsQuery(self.feedliste, 0, 1, 2, None, None, self.page, 999, mode=1)
+               self.th_ThumbsQuery(self.feedliste, 0, 1, 2, None, None, self.page, self.lastpage, mode=1)
                self.showInfos()
 
        def showInfos(self):
+               url = self['liste'].getCurrent()[0][1]
                Title = self['liste'].getCurrent()[0][0]
                Image = self['liste'].getCurrent()[0][2]
-               desc = self['liste'].getCurrent()[0][3]
+               descr = self['liste'].getCurrent()[0][3]
+               date = self['liste'].getCurrent()[0][4]
+               views = self['liste'].getCurrent()[0][5]
                self['name'].setText(Title)
-               self['handlung'].setText(desc)
-               self['page'].setText(str(self.page))
+               self['handlung'].setText("Leaked: %s\nViews: %s\n\n%s" % (date, views, descr))
+               if descr.endswith('..'):
+                       getPage(url).addCallback(self.showInfos2).addErrback(self.dataError)
                CoverHelper(self['coverArt']).getCover(Image)
 
+       def showInfos2(self, data):
+               date = self['liste'].getCurrent()[0][4]
+               views = self['liste'].getCurrent()[0][5]
+               descr = re.findall('step_outer">(.*?)<div', data, re.S)
+               if descr:
+                       self['handlung'].setText("Leaked: %s\nViews: %s\n\n%s" % (date, views, decodeHtml(stripAllTags(descr[0])).strip()))
+
        def keyOK(self):
                if self.keyLocked:
                        return
index 0a96751..44e18b0 100644 (file)
@@ -70,6 +70,10 @@ class popcorntimesGenreScreen(MPScreen):
                self.genreliste.append(('Blast from the Past : Mehr als hundert Jahre alt', '/de/neu'))
                self.genreliste.append(('Blast from the Past : 1910 - 1940', '/de/neu'))
                self.genreliste.append(('Blast from the Past : 1940 - 1960', '/de/neu'))
+               self.genreliste.append(('Laurel & Hardy Collection', '/de'))
+               self.genreliste.append(('Buster Keaton Collection', '/de'))
+               self.genreliste.append(('John Wayne Collection', '/de'))
+               self.genreliste.append(('Superman 40s Collection', '/de'))
                self.genreliste.append(('Abenteuer', '/genre/abenteuer'))
                self.genreliste.append(('Action', '/genre/action'))
                self.genreliste.append(('Animation', '/genre/animation'))
@@ -158,7 +162,7 @@ class popcorntimesFilmeScreen(MPScreen, ThumbsHelper):
                                        if image.startswith('//'):
                                                image = 'https:' + image
                                        meta = stripAllTags(meta)
-                                       self.filmliste.append((title, image, url, desc, meta))
+                                       self.filmliste.append((decodeHtml(title), image, url, desc, meta))
                        else:
                                vids = re.findall('class="pt-movie-tile.*?href="(.*?)".*?<img.*?data-src="(.*?)"\salt="(.*?)".*?.*?pt-video-time">(.*?)</p>', data, re.S)
                                if vids:
@@ -167,7 +171,7 @@ class popcorntimesFilmeScreen(MPScreen, ThumbsHelper):
                                                if image.startswith('//'):
                                                        image = 'https:' + image
                                                meta = stripAllTags(meta)
-                                               self.filmliste.append((title, image, url, '', meta))
+                                               self.filmliste.append((decodeHtml(title), image, url, '', meta))
                else:
                        check = re.search('class="pt-hero(.*?)class="pt-section', data, re.S)
                        if check:
@@ -179,7 +183,7 @@ class popcorntimesFilmeScreen(MPScreen, ThumbsHelper):
                                                if image.startswith('//'):
                                                        image = 'https:' + image
                                                meta = stripAllTags(meta)
-                                               self.filmliste.append((title, image, url, desc, meta))
+                                               self.filmliste.append((decodeHtml(title), image, url, desc, meta))
                if len(self.filmliste) == 0:
                        self.filmliste.append((_("No videos found!"), default_cover, None, '', ''))
                self.ml.setList(map(self._defaultlistleft, self.filmliste))
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/spiegeltv.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/mediatheken/spiegeltv.py
deleted file mode 100644 (file)
index b00814b..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  This plugin is open source but it is NOT free software.
-#
-#  This plugin may only be distributed to and executed on hardware which
-#  is licensed by Dream Property GmbH. This includes commercial distribution.
-#  In other words:
-#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
-#  to hardware which is NOT licensed by Dream Property GmbH.
-#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
-#  on hardware which is NOT licensed by Dream Property GmbH.
-#
-#  This applies to the source code as a whole as well as to parts of it, unless explicitely
-#  stated otherwise.
-#
-#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
-#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
-#  other than under the conditions noted above.
-#
-#  As an exception regarding modifcations, you are NOT permitted to remove
-#  any copy protections implemented in this plugin or change them for means of disabling
-#  or working around the copy protections, unless the change has been explicitly permitted
-#  by the original authors. Also decompiling and modification of the closed source
-#  parts is NOT permitted.
-#
-#  Advertising with this plugin is NOT allowed.
-#
-#  For other uses, permission from the authors is necessary.
-#
-#######################################################################################################
-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-default_cover = "file://%s/spiegeltv.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-BASE_URL = 'https://www.spiegel.tv/'
-cid = 0
-
-class spiegeltvGenreScreen(MPScreen):
-
-       def __init__(self, session):
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok" : self.keyOK,
-                       "cancel" : self.keyCancel,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft
-               }, -1)
-
-               self['title'] = Label("SPIEGEL.TV")
-               self['ContentTitle'] = Label(_("Genre:"))
-               self['name'] = Label(_("Selection:"))
-
-               self.keyLocked = True
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.getCID)
-
-       def getCID(self):
-               getPage(BASE_URL).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               global cid
-               cid = re.findall('"cid":"(.*?)",', data, re.S)[0]
-               self.filmliste.append(("Neu auf SPIEGEL.TV", "new", ""))
-               self.filmliste.append(("Meistgesehen", "hot", ""))
-               self.filmliste.append(("Sendungen", "allshows", ""))
-               self.filmliste.append(("Themen", "allplaylists", ""))
-               self.filmliste.append(("Studios", "allstudios", ""))
-               self.filmliste.append(("Filme", "playlists", "2543-popcorn-film-schauen-und-zuruecklehnen"))
-               self.ml.setList(map(self._defaultlistcenter, self.filmliste))
-               self.keyLocked = False
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Name = self['liste'].getCurrent()[0][0]
-               method = self['liste'].getCurrent()[0][1]
-               param = self['liste'].getCurrent()[0][2]
-               self.session.open(spiegeltvListScreen, Name, method, param)
-
-class spiegeltvListScreen(MPScreen):
-
-       def __init__(self, session, name, method, param):
-               self.Name = name
-               self.method = method
-               self.param = param
-
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0"             : self.closeAll,
-                       "ok" : self.keyOK,
-                       "cancel" : self.keyCancel,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown
-               }, -1)
-
-               self['title'] = Label("SPIEGEL.TV")
-               self['ContentTitle'] = Label("Auswahl: %s" % self.Name)
-               self['name'] = Label(_("Selection:"))
-
-               self.keyLocked = True
-
-               self.filmliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.page = 1
-               self.lastpage = 1
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.filmliste = []
-               self.keyLocked = True
-
-               url = "http://www.spiegel.tv/gateway/service.php"
-               self.postdata = {'cid':cid,
-                               'method':self.method,
-                               'cgw':'html5',
-                               'param':self.param,
-                               'start':(self.page-1)*25,
-                               'isu':0,
-                               'uhs':0,
-                               'agc':0,
-                               'wbp':0,
-                               'client':748,
-                               'cdlang':'de'
-                               }
-               getPage(url, method='POST',  postdata=urlencode(self.postdata), headers={'Content-Type':'application/x-www-form-urlencoded'}).addCallback(self.genreData).addErrback(self.dataError)
-
-       def genreData(self, data):
-               data = str(json.loads(data)['contents'])
-               if "navigatemore" in data:
-                       self.lastpage = self.page + 1
-               if self.lastpage > 1:
-                       self['Page'].setText(_("Page:"))
-                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
-               if self.method in ["allshows", "allstudios", "allplaylists"]:
-                       shows = re.findall("(<a href.*?data-navigateto='(.*?)' data-navigateparam='(.*?)'.*?<img class='icon' src='(.*?)'.*?\salt='(.*?)'.*?class=(?:'tholderbottom'|'autocut addinfo')>.*?</div>)", data, re.S)
-                       for (entry,method,param,image,title) in shows:
-                               subtitle = re.findall("cardsubtitle'>(.*?)</div>", entry, re.S)
-                               if subtitle and subtitle[0] != "&nbsp;":
-                                       title = decodeHtml(title + " - " + subtitle[0])
-                               image = image.replace('.webp','.jpg')
-                               self.filmliste.append((title, image, method, param, "sub"))
-               else:
-                       shows = re.findall("(<a href='/videos/.*?data-vid='(.*?)'.*?img(?:\sclass='tleft'|)\ssrc='(.*?)'.*?cardsubtitle'>(.*?)</div.*?cardtitle'>(.*?)</div.*?class=(?:'tholderbottom'|'autocut addinfo')>.*?</div>)", data, re.S)
-                       for (entry,vid,image,subtitle,title) in shows:
-                               image = image.replace('.webp','.jpg')
-                               if subtitle != "":
-                                       title = decodeHtml(title + " - " + subtitle)
-                               desc = re.findall("class='tdesc'>(.*?)</div>", entry, re.S)
-                               if desc:
-                                       desc = decodeHtml(desc[0]).strip()
-                               else:
-                                       desc = ""
-                               info = re.findall("class=(?:'tholderbottom'|'autocut addinfo')>(.*?)</div>", entry, re.S)
-                               if info:
-                                       info = stripAllTags(info[0])
-                                       if "|" in info:
-                                               runtime = decodeHtml(info.split('|')[0].strip())
-                                               studio = decodeHtml(info.split('|')[1].strip())
-                                       else:
-                                               if "Min." in info:
-                                                       runtime = info
-                                                       studio = "---"
-                                               else:
-                                                       runtime = "---"
-                                                       studio = info
-                               else:
-                                       runtime = "---"
-                                       studio = "---"
-                               descr = _("Runtime:") + " " + runtime + "\n" + "Studio: " + studio + "\n\n" + desc
-                               self.filmliste.append((title, image, vid, descr, ""))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_('No videos found!'), default_cover, None, "", ""))
-               self.ml.setList(map(self._defaultlistleft, self.filmliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               Title = self['liste'].getCurrent()[0][0]
-               Image = self['liste'].getCurrent()[0][1]
-               descr = self['liste'].getCurrent()[0][3]
-               type = self['liste'].getCurrent()[0][4]
-               if type == "":
-                       self['handlung'].setText(descr)
-               self['name'].setText(Title)
-               CoverHelper(self['coverArt']).getCover(Image)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               sub = self['liste'].getCurrent()[0][4]
-               Name = self['liste'].getCurrent()[0][0]
-               if sub != "":
-                       method = self['liste'].getCurrent()[0][2]
-                       param = self['liste'].getCurrent()[0][3]
-                       self.session.open(spiegeltvListScreen, Name, method, param)
-               else:
-                       id = self['liste'].getCurrent()[0][2]
-                       videourl = None
-                       if id:
-                               from Plugins.Extensions.MediaPortal.resources import nexx
-                               videourl = nexx.getVideoUrl(id, False, operation='spiegeltv')
-                       if videourl:
-                               self.session.open(SimplePlayer, [(Name, videourl)], showPlaylist=False, ltype='spiegeltv')
\ No newline at end of file
index d9a24e1..c6b98df 100644 (file)
@@ -279,6 +279,7 @@ class youtubeGenreScreen(MenuHelper):
                        ('Danny Burnage - Darauf ein Snickers-Eis!', 'https://www.youtube.com/user/TheDannyBurnage'),
                        ('m4xFPS - Keks mit ♥', 'https://www.youtube.com/user/m4xFPS'),
                        ('xTheSolution', 'https://www.youtube.com/user/xTheSolution'),
+                       ('4Players', 'https://www.youtube.com/channel/UC0jRczpEKxLbGOo45XGkrzg'),
                        ]
                self.GamingChannels.sort(key=lambda t : t[0].lower())
                self.subCatGamingChannels = []
@@ -370,6 +371,8 @@ class youtubeGenreScreen(MenuHelper):
                        ('The HDR Channel', 'https://www.youtube.com/channel/UCve7_yAZHFNipzeAGBI5t9g'),
                        ('4K Relaxation Channel', 'https://www.youtube.com/channel/UCg72Hd6UZAgPBAUZplnmPMQ'),
                        ('VEVO Music', 'https://www.youtube.com/user/VEVO'),
+                       ('Spiegel TV', 'https://www.youtube.com/user/spiegeltv'),
+                       ('BILD', 'https://www.youtube.com/channel/UC4zcMHyrT_xyWlgy5WGpFFQ'),
                        ]
                self.SelectedChannels.sort(key=lambda t : t[0].lower())
                self.subCatSelectedChannels = []
index 358ddd1..dbfb244 100644 (file)
@@ -38,11 +38,10 @@ from Plugins.Extensions.MediaPortal.plugin import _
 from Plugins.Extensions.MediaPortal.resources.imports import *
 from Plugins.Extensions.MediaPortal.resources.configlistext import ConfigListScreenExt
 
-config_mp.mediaportal.radio_base = ConfigText(default="http://www.rad.io", fixed_size=False)
-config_mp.mediaportal.radio_sort = ConfigYesNo(default=True)
-
 default_cover = "file://%s/radio.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-base_url = config_mp.mediaportal.radio_base.value
+config_mp.mediaportal.radio_country = ConfigSelectionExt(default = "de", choices = [("de", _("Germany")),("at", _("Austria")),("fr", _("France")),("es", _("Spain")),("pt", _("Portugal")),("it", _("Italy")),("net", _("USA")),("dk", _("Denmark")),("se", _("Sweden")),("pl", _("Poland"))])
+config_mp.mediaportal.radio_sort = ConfigYesNo(default=True)
+agent = "XBMC Addon Radio"
 
 def check_playlist(url):
        import requests
@@ -92,6 +91,7 @@ class RadioGenreScreen(MPScreen):
                self['F4'] = Label(_("Setup"))
 
                self.genreliste = []
+               self.suchString = ''
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
                self['liste'] = self.ml
 
@@ -99,19 +99,17 @@ class RadioGenreScreen(MPScreen):
                self.onClose.append(self.restoreRadio)
 
        def loadPage(self):
+               country = config_mp.mediaportal.radio_country.value
                self.genreliste = [
-                       (_('Favorites'),None),
-                       ('Radio.de',"http://www.radio.de"),
-                       ('Radio.at',"http://www.radio.at"),
-                       ('Radio.fr',"http://www.radio.fr"),
-                       ('Radio.es',"http://www.radio.es"),
-                       ('Radio.it',"http://www.rad.io"),
-                       ('Radio.pt',"http://www.rad.io"),
-                       ('Radio.dk',"http://www.rad.io"),
-                       ('Radio.se',"http://www.rad.io"),
-                       ('Radio.pl',"http://www.rad.io"),
-                       ('Radio.net',"http://www.rad.io")]
-
+                       (_('Favorites'), '', ''),
+                       (_('Search'), '', ''),
+                       (_('Local Stations'), "https://api.radio.%s/info/v2/search/localstations?sizeperpage=19&pageindex=" % country, ''),
+                       (_('Top Stations'), "https://api.radio.%s/info/v2/search/topstations?sizeperpage=250&pageindex=" % country, ''),
+                       (_('Genre') ,"https://api.radio.%s/info/v2/search/getgenres" % country, 'stationsbygenre?genre=%%VALUE%%&sorttype=RANK&sizeperpage=19&pageindex='),
+                       (_('Topic'), "https://api.radio.%s/info/v2/search/gettopics" % country, 'stationsbytopic?topic=%%VALUE%%&sorttype=RANK&sizeperpage=19&pageindex='),
+                       (_('Country'), "https://api.radio.%s/info/v2/search/getcountries" % country, 'stationsbycountry?country=%%VALUE%%&sorttype=RANK&sizeperpage=19&pageindex='),
+                       (_('City'), "https://api.radio.%s/info/v2/search/getcities" % country, 'stationsbycity?city=%%VALUE%%&sorttype=RANK&sizeperpage=19&pageindex='),
+                       (_('Language'), "https://api.radio.%s/info/v2/search/getlanguages" % country, 'stationsbylanguage?language=%%VALUE%%&sorttype=RANK&sizeperpage=19&pageindex=')]
                self.ml.setList(map(self._defaultlistcenter, self.genreliste))
                self.keyLocked = False
 
@@ -120,16 +118,24 @@ class RadioGenreScreen(MPScreen):
                        return
                Genre = self['liste'].getCurrent()[0][0]
                Url = self['liste'].getCurrent()[0][1]
+               SubUrl = self['liste'].getCurrent()[0][2]
 
-               if Genre == _('Favorites'):
+               if Genre == _('Search'):
+                       self.suchen()
+               elif Genre == _('Favorites'):
                        self.session.open(RadioPlaylist)
+               elif Genre == _("Top Stations") or Genre == _("Local Stations"):
+                       self.session.open(RadioListeScreen, Url)
                else:
-                       config_mp.mediaportal.radio_base.value = Url
-                       config_mp.mediaportal.radio_base.save()
-                       configfile_mp.save()
-                       global base_url
-                       base_url = config_mp.mediaportal.radio_base.value
-                       self.session.open(RadioSubGenreScreen, Genre, Url)
+                       self.session.open(RadioSubValueGenreScreen, Genre, Url, SubUrl)
+
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = _('Search')
+                       self.suchString = callback
+                       url = "https://api.radio.%s/info/v2/search/stations?query=%s&sizeperpage=19&pageindex=" % (config_mp.mediaportal.radio_country.value, urllib.quote(self.suchString))
+                       self.session.open(RadioListeScreen, url)
 
        def keySetup(self):
                if mp_globals.isDreamOS:
@@ -155,6 +161,7 @@ class RadioSetupScreen(MPSetupScreen, ConfigListScreenExt):
                self.list = []
                ConfigListScreenExt.__init__(self, self.list)
 
+               self.list.append(getConfigListEntry(_("Region:"), config_mp.mediaportal.radio_country))
                self.list.append(getConfigListEntry(_("Sort Favorites:"), config_mp.mediaportal.radio_sort))
 
                self["config"].setList(self.list)
@@ -171,62 +178,12 @@ class RadioSetupScreen(MPSetupScreen, ConfigListScreenExt):
                                x[1].save()
                self.close(True)
 
-class RadioSubGenreScreen(MPScreen):
-
-       def __init__(self, session, genre, url):
-               self.genre = genre
-               self.url = url
-
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "ok"    : self.keyOK,
-                       "0" : self.closeAll,
-                       "cancel": self.keyCancel
-               }, -1)
-
-               self.keyLocked = True
-               self['title'] = Label(self.genre)
-               self['ContentTitle'] = Label(_("Genre:"))
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.genreliste = [
-                       (_('Local Stations'),self.url+"/info/account/getmostwantedbroadcastlists?sizeoflists=100",'localBroadcasts'),
-                       (_('Top Stations'),self.url+"/info/account/getmostwantedbroadcastlists?sizeoflists=100",'topBroadcasts'),
-                       (_('All Stations'),self.url+"/info/menu/broadcastsofcategory?category=_",''),
-                       (_('Genre'),self.url+"/info/menu/valuesofcategory?category=_genre",''),
-                       (_('Topic'),self.url+"/info/menu/valuesofcategory?category=_topic",''),
-                       (_('Country'),self.url+"/info/menu/valuesofcategory?category=_country",''),
-                       (_('City'),self.url+"/info/menu/valuesofcategory?category=_city",''),
-                       (_('Language'),self.url+"/info/menu/valuesofcategory?category=_language",'')]
-
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-               self.keyLocked = False
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               Genre = self['liste'].getCurrent()[0][0]
-               Url = self['liste'].getCurrent()[0][1]
-               Sub = self['liste'].getCurrent()[0][2]
-
-               if Genre == _("Top Stations") or Genre == _("All Stations") or Genre == _("Local Stations") or Genre == _("Recommended Stations"):
-                       self.session.open(RadioListeScreen, self.genre, Url, sub=Sub)
-               else:
-                       self.session.open(RadioSubValueGenreScreen, self.genre, Genre, Url)
-
 class RadioSubValueGenreScreen(MPScreen):
 
-       def __init__(self, session, topgenre, genre, url):
-               self.topgenre = topgenre
+       def __init__(self, session, genre, url, suburl):
                self.genre = genre
                self.url = url
+               self.suburl = suburl
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
@@ -237,7 +194,7 @@ class RadioSubValueGenreScreen(MPScreen):
                }, -1)
 
                self.keyLocked = True
-               self['title'] = Label(self.topgenre)
+               self['title'] = Label("Radio")
                self['ContentTitle'] = Label(_(self.genre))
 
                self.genreliste = []
@@ -248,12 +205,16 @@ class RadioSubValueGenreScreen(MPScreen):
 
        def loadPage(self):
                self.keyLocked = True
-               getPage(self.url, agent="XBMC").addCallback(self.loadPageData).addErrback(self.dataError)
+               getPage(self.url, agent=agent).addCallback(self.loadPageData).addErrback(self.dataError)
 
        def loadPageData(self, data):
                jsondata = json.loads(data)
                for each in jsondata:
-                       self.genreliste.append((str(each),))
+                       title = str(each["localized"])
+                       if not title:
+                               title = str(each["systemEnglish"])
+                       val = str(each["systemEnglish"])
+                       self.genreliste.append((title, val))
                self.genreliste.sort(key=lambda t : t[0].lower())
                self.ml.setList(map(self._defaultlistcenter, self.genreliste))
                self.keyLocked = False
@@ -261,17 +222,14 @@ class RadioSubValueGenreScreen(MPScreen):
        def keyOK(self):
                if self.keyLocked:
                        return
-               Value = self['liste'].getCurrent()[0][0]
-
-               self.session.open(RadioListeScreen, self.topgenre, self.url.replace('valuesofcategory','broadcastsofcategory'), Value)
+               Value = self['liste'].getCurrent()[0][1]
+               self.session.open(RadioListeScreen, self.suburl, Value)
 
 class RadioListeScreen(MPScreen, ThumbsHelper):
 
-       def __init__(self, session, genre, url, value=None, sub=''):
-               self.genre = genre
+       def __init__(self, session, url, value=None):
                self.url = url
                self.value = value
-               self.sub = sub
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
@@ -292,11 +250,12 @@ class RadioListeScreen(MPScreen, ThumbsHelper):
                }, -1)
 
                self.keyLocked = True
-               self['title'] = Label(self.genre)
+               self['title'] = Label("Radio")
                self['ContentTitle'] = Label(_("Stations:"))
                self['F2'] = Label(_("Add to Favorites"))
                self['F3'].setText(_("Page"))
 
+               self['Page'] = Label(_("Page:"))
                self.page = 1
                self.lastpage = 1
 
@@ -309,37 +268,29 @@ class RadioListeScreen(MPScreen, ThumbsHelper):
        def loadPage(self):
                self.keyLocked = True
                self['name'].setText(_('Please wait...'))
-               if self.genre in ['Radio.net', 'Radio.it', 'Radio.pt', 'Radio.dk', 'Radio.se', 'Radio.pl'] and self.sub == "topBroadcasts":
-                       url = "http://www.%s/stations/" % self.genre.lower()
+               if self.value:
+                       url = "https://api.radio.%s/info/v2/search/" % config_mp.mediaportal.radio_country.value + self.url.replace('%%VALUE%%', urllib.quote(self.value)) + str(self.page)
                else:
-                       url = self.url
-                       if self.value:
-                               url = url + "&value=" + urllib.quote_plus(self.value)
-                       if self.lastpage > 1:
-                               url = url + "&start=" + str((self.page-1)*100)
-               getPage(url, agent="XBMC").addCallback(self.getStations).addErrback(self.dataError)
+                       url = self.url + str(self.page)
+               getPage(url, agent=agent).addCallback(self.getStations).addErrback(self.dataError)
 
        def getStations(self, data):
                self.streamList = []
-               if self.genre in ['Radio.net', 'Radio.it', 'Radio.pt', 'Radio.dk', 'Radio.se', 'Radio.pl'] and self.sub == "topBroadcasts":
-                       parse = re.search('.*?class="main-content"(.*?)search-footer', data, re.S)
-                       stations = re.findall('<img\ssrc="(.*?\/)c\d+.png".*?alt="(.*?)".*?now-playing="(\d+)"', parse.group(1), re.S)
-                       for (img,name,id) in stations:
-                               self.streamList.append((name, id, img+"c175.png"))
-               else:
-                       jsondata = json.loads(data)
-                       if self.sub != '':
-                               jsondata = jsondata[self.sub]
-                       if len(jsondata) == 100 and not "sizeoflists" in self.url:
-                               self.lastpage = 999
+               jsondata = json.loads(data)
+               if jsondata.has_key('numberPages'):
+                       self.lastpage = int(jsondata['numberPages'])
                        if self.lastpage > 1:
-                               self['Page'].setText(_("Page:"))
-                               self['page'].setText(str(self.page))
-                       for each in jsondata:
-                               if str(each['broadcastType']) == "1":
-                                       self.streamList.append((str(each['name']).strip(), str(each['id']), str(each['pictureBaseURL'])+"c175.png"))
-               if self.sub == '':
-                       self.streamList.sort(key=lambda t : t[0].lower())
+                               self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
+                       else:
+                               self['page'].setText('1 / 1')
+               for each in jsondata["categories"][0]["matches"]:
+                       if each.has_key('logo300x300'):
+                               logo = str(each['logo300x300'])
+                       elif each.has_key('logo175x175'):
+                               logo = str(each['logo100x100']).replace('c175.png','c300.png')
+                       elif each.has_key('logo100x100'):
+                               logo = str(each['logo100x100']).replace('c100.png','c300.png')
+                       self.streamList.append((str(each['name']['value']).strip(), str(each['id']), logo))
                if len(self.streamList) == 0:
                        self.streamList.append((_('No stations found!'), None, None))
                self.ml.setList(map(self._defaultlistleft, self.streamList))
@@ -352,8 +303,8 @@ class RadioListeScreen(MPScreen, ThumbsHelper):
                self['name'].setText(self['liste'].getCurrent()[0][0])
                stationId = self['liste'].getCurrent()[0][1]
                if stationId:
-                       url = base_url + "/info/broadcast/getbroadcastembedded?broadcast=%s" % stationId
-                       getPage(url, agent="XBMC").addCallback(self.getInfos).addErrback(self.dataError)
+                       url = "https://api.radio.%s/info/v2/search/station?station=%s" % (config_mp.mediaportal.radio_country.value, stationId)
+                       getPage(url, agent=agent).addCallback(self.getInfos).addErrback(self.dataError)
 
        def keyOK(self):
                if self.keyLocked:
@@ -361,12 +312,12 @@ class RadioListeScreen(MPScreen, ThumbsHelper):
                stationId = self['liste'].getCurrent()[0][1]
                if not stationId:
                        return
-               url = base_url + "/info/broadcast/getbroadcastembedded?broadcast=%s" % stationId
-               getPage(url, agent="XBMC").addCallback(self.getStreamURL).addErrback(self.dataError)
+               url = "https://api.radio.%s/info/v2/search/station?station=%s" % (config_mp.mediaportal.radio_country.value, stationId)
+               getPage(url, agent=agent).addCallback(self.getStreamURL).addErrback(self.dataError)
 
        def getInfos(self, data):
                jsondata = json.loads(data)
-               image = str(jsondata['pictureBaseURL'])+"c175.png"
+               image = str(jsondata['logo300x300'])
                CoverHelper(self['coverArt']).getCover(image)
                genre = ''
                for node in jsondata["genres"]:
@@ -388,7 +339,7 @@ class RadioListeScreen(MPScreen, ThumbsHelper):
                url = str(jsondata['streamUrls'][0]['streamUrl'])
                url = check_playlist(url)
                stationName = self['liste'].getCurrent()[0][0]
-               stationCover = str(jsondata['pictureBaseURL'])+"c175.png"
+               stationCover = str(jsondata['logo300x300'])
                config_mp.mediaportal.is_radio.value = True
                self.session.open(SimplePlayer, [(stationName, url, stationCover)], showPlaylist=False, ltype='radio', playerMode='RADIO', cover=True)
 
@@ -450,7 +401,7 @@ class RadioPlaylist(MPScreen):
                                        (stationName, stationId) = data[0]
                                        self.playList.append((stationName, stationId))
                        if config_mp.mediaportal.radio_sort.value:
-                               self.playList.sort()
+                               self.playList.sort(key=lambda t : t[0].lower())
                        readStations.close()
                if len(self.playList) == 0:
                        self.playList.append((_('No entries found!'), None, default_cover))
@@ -463,20 +414,20 @@ class RadioPlaylist(MPScreen):
                if exist:
                        self['name'].setText(self['liste'].getCurrent()[0][0])
                        stationId = self['liste'].getCurrent()[0][1]
-                       url = base_url + "/info/broadcast/getbroadcastembedded?broadcast=%s" % stationId
-                       getPage(url, agent="XBMC").addCallback(self.getInfos).addErrback(self.dataError)
+                       url = "https://api.radio.%s/info/v2/search/station?station=%s" % (config_mp.mediaportal.radio_country.value, stationId)
+                       getPage(url, agent=agent).addCallback(self.getInfos).addErrback(self.dataError)
 
        def keyOK(self):
                exist = self['liste'].getCurrent()
                if self.keyLocked or exist == None:
                        return
                stationId = self['liste'].getCurrent()[0][1]
-               url = base_url + "/info/broadcast/getbroadcastembedded?broadcast=%s" % stationId
-               getPage(url, agent="XBMC").addCallback(self.getStreamURL).addErrback(self.dataError)
+               url = "https://api.radio.%s/info/v2/search/station?station=%s" % (config_mp.mediaportal.radio_country.value, stationId)
+               getPage(url, agent=agent).addCallback(self.getStreamURL).addErrback(self.dataError)
 
        def getInfos(self, data):
                jsondata = json.loads(data)
-               image = str(jsondata['pictureBaseURL'])+"c175.png"
+               image = str(jsondata['logo300x300'])
                CoverHelper(self['coverArt']).getCover(image)
                genre = ''
                for node in jsondata["genres"]:
@@ -498,7 +449,7 @@ class RadioPlaylist(MPScreen):
                url = str(jsondata['streamUrls'][0]['streamUrl'])
                url = check_playlist(url)
                stationName = self['liste'].getCurrent()[0][0]
-               stationCover = str(jsondata['pictureBaseURL'])+"c175.png"
+               stationCover = str(jsondata['logo300x300'])
                config_mp.mediaportal.is_radio.value = True
                self.session.open(SimplePlayer, [(stationName, url, stationCover)], showPlaylist=False, ltype='radio', playerMode='RADIO', cover=True)
 
index 1a8b866..2dc68cf 100644 (file)
@@ -347,7 +347,7 @@ class ShoutcastFavoritesScreen(MPScreen):
                                        (stationName, stationId) = data[0]
                                        self.playList.append((stationName, stationId))
                        if config_mp.mediaportal.shoutcast_sort.value:
-                               self.playList.sort()
+                               self.playList.sort(key=lambda t : t[0].lower())
                        readStations.close()
                if len(self.playList) == 0:
                        self.playList.append((_('No entries found!'), None, default_cover))
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/tunein.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/music/tunein.py
new file mode 100644 (file)
index 0000000..e985fec
--- /dev/null
@@ -0,0 +1,437 @@
+# -*- coding: utf-8 -*-
+#######################################################################################################
+#
+#    MediaPortal for Dreambox OS
+#
+#    Coded by MediaPortal Team (c) 2013-2020
+#
+#  This plugin is open source but it is NOT free software.
+#
+#  This plugin may only be distributed to and executed on hardware which
+#  is licensed by Dream Property GmbH. This includes commercial distribution.
+#  In other words:
+#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
+#  to hardware which is NOT licensed by Dream Property GmbH.
+#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
+#  on hardware which is NOT licensed by Dream Property GmbH.
+#
+#  This applies to the source code as a whole as well as to parts of it, unless explicitely
+#  stated otherwise.
+#
+#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
+#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
+#  other than under the conditions noted above.
+#
+#  As an exception regarding modifcations, you are NOT permitted to remove
+#  any copy protections implemented in this plugin or change them for means of disabling
+#  or working around the copy protections, unless the change has been explicitly permitted
+#  by the original authors. Also decompiling and modification of the closed source
+#  parts is NOT permitted.
+#
+#  Advertising with this plugin is NOT allowed.
+#
+#  For other uses, permission from the authors is necessary.
+#
+#######################################################################################################
+
+from Plugins.Extensions.MediaPortal.plugin import _
+from Plugins.Extensions.MediaPortal.resources.imports import *
+from Plugins.Extensions.MediaPortal.resources.configlistext import ConfigListScreenExt
+
+default_cover = "file://%s/tunein.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
+config_mp.mediaportal.tunein_sort = ConfigYesNo(default=True)
+agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36'
+json_headers = {
+       'Accept':'application/json',
+       'Accept-Language':'de,en-US;q=0.7,en;q=0.3',
+       'X-Requested-With':'XMLHttpRequest',
+       'Content-Type':'application/x-www-form-urlencoded',
+       }
+
+def check_playlist(url):
+       import requests
+       servers = []
+       if url.lower().endswith('.m3u'):
+               try:
+                       s = requests.session()
+                       page = s.get(url, timeout=15)
+                       data = page.content
+                       servers = [
+                               l for l in data.splitlines()
+                               if l.strip() and not l.strip().startswith('#')
+                       ]
+               except:
+                       pass
+       elif url.lower().endswith('.pls'):
+               try:
+                       s = requests.session()
+                       page = s.get(url, timeout=15)
+                       data = page.content
+                       servers = [
+                               l.split('=')[1] for l in data.splitlines()
+                               if l.lower().startswith('file')
+                       ]
+               except:
+                       pass
+       if servers:
+               return random.choice(servers)
+       return url
+
+class tuneinGenreScreen(MPScreen):
+
+       def __init__(self, session, subgenre="", url=""):
+               self.subgenre = subgenre
+               self.url = url
+
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok"    : self.keyOK,
+                       "0" : self.closeAll,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "cancel": self.keyCancel,
+                       "green": self.keyAdd,
+                       "blue": self.keySetup,
+               }, -1)
+
+               self.keyLocked = True
+               self['title'] = Label("TuneIn")
+               self['ContentTitle'] = Label(_("Genre:"))
+               self['F2'] = Label(_("Add to Favorites"))
+               self['F4'] = Label(_("Setup"))
+
+               self.genreliste = []
+               self.suchString = ''
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadPage)
+               self.onClose.append(self.restoreRadio)
+
+       def loadPage(self):
+               self.genreliste = []
+               self['name'].setText(_('Please wait...'))
+               self.keyLocked = True
+               if self.url:
+                       url = self.url
+               else:
+                       url = "http://opml.radiotime.com/Browse.ashx"
+               if "?" in url:
+                       url = url + "&render=json"
+               else:
+                       url = url + "?render=json"
+               twAgentGetPage(url, agent=agent, headers=json_headers).addCallback(self.loadPageData).addErrback(self.dataError)
+
+       def loadPageData(self, data):
+               if self.subgenre != '':
+                       jsondata = json.loads(data)
+                       catname = ''
+                       for each in jsondata["body"]:
+                               if each.has_key('children'):
+                                       if each.has_key('text'):
+                                               catname = str(each["text"]) + ": "
+                                       for item in each["children"]:
+                                               if item.has_key('formats'):
+                                                       type = str(item["type"])
+                                                       name = str(item["text"])
+                                                       if "(" in name:
+                                                               name = name.split('(')[0].strip()
+                                                       title = name
+                                                       name = catname + name
+                                                       url = str(item["URL"])
+                                                       bitrate = str(item["bitrate"])
+                                                       format = str(item["formats"])
+                                                       if item.has_key('image'):
+                                                               image = str(item["image"])
+                                                       else:
+                                                               image = default_cover
+                                                       if not "notcompatible" in url:
+                                                               self.genreliste.append((name, url, image, title, bitrate, format, type))
+                                               else:
+                                                       type = str(item["type"])
+                                                       name = str(item["text"])
+                                                       title = name
+                                                       name = catname + name
+                                                       url = str(item["URL"])
+                                                       if item.has_key('image'):
+                                                               image = str(item["image"])
+                                                       else:
+                                                               image = default_cover
+                                                       if not "notcompatible" in url:
+                                                               self.genreliste.append((name, url, image, title, '', '', type))
+                               elif each.has_key('formats'):
+                                       type = str(each["type"])
+                                       name = str(each["text"])
+                                       if "(" in name:
+                                               name = name.split('(')[0].strip()
+                                       title = name
+                                       if each.has_key('item') and self.subgenre == "search":
+                                               catname = str(each["item"])
+                                               if catname == "station":
+                                                       catname = _("Station:") + " "
+                                               elif catname == "show":
+                                                       catname = _("Show:") + " "
+                                               elif catname == "topic":
+                                                       catname = _("Topic:") + " "
+                                               name = catname + name
+                                       url = str(each["URL"])
+                                       bitrate = str(each["bitrate"])
+                                       format = str(each["formats"])
+                                       if each.has_key('image'):
+                                               image = str(each["image"])
+                                       else:
+                                               image = default_cover
+                                       self.genreliste.append((name, url, image, title, bitrate, format, type))
+                               else:
+                                       type = str(each["type"])
+                                       name = str(each["text"])
+                                       title = name
+                                       if each.has_key('item') and self.subgenre == "search":
+                                               catname = str(each["item"])
+                                               if catname == "station":
+                                                       catname = _("Station:") + " "
+                                               elif catname == "show":
+                                                       catname = _("Show:") + " "
+                                               elif catname == "topic":
+                                                       catname = _("Topic:") + " "
+                                               name = catname + name
+                                       if each.has_key('URL'):
+                                               url = str(each["URL"])
+                                               if each.has_key('image'):
+                                                       image = str(each["image"])
+                                               else:
+                                                       image = default_cover
+                                               if not "notcompatible" in url:
+                                                       self.genreliste.append((name, url, image, title, '', '', type))
+                       if catname:
+                               self.ml.setList(map(self._defaultlistleft, self.genreliste))
+                       else:
+                               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
+               else:
+                       jsondata = json.loads(data)
+                       for each in jsondata["body"]:
+                               type = str(each["type"])
+                               name = str(each["text"])
+                               title = name
+                               url = str(each["URL"])
+                               self.genreliste.append((name, url, default_cover, title, '', '', type))
+                       self.genreliste.insert(0, (_("Search"), '', default_cover, '', '', '', "search"))
+                       self.genreliste.insert(0, (_('Favorites'), '', default_cover, '', '', '', "favorites"))
+                       self.ml.setList(map(self._defaultlistcenter, self.genreliste))
+               if len(self.genreliste) == 0:
+                       self.genreliste.append((_('No contents / results found!'), '', default_cover, '', '', '', None))
+                       self.ml.setList(map(self._defaultlistcenter, self.genreliste))
+               self.keyLocked = False
+               self.showInfos()
+
+       def showInfos(self):
+               self['name'].setText(self['liste'].getCurrent()[0][0])
+               pic = self['liste'].getCurrent()[0][2]
+               bitrate = self['liste'].getCurrent()[0][4]
+               format = self['liste'].getCurrent()[0][5]
+               CoverHelper(self['coverArt']).getCover(pic)
+               if bitrate and format:
+                       self['handlung'].setText(_("Bitrate")+": "+bitrate+"\n"+_("Format")+": "+format)
+                       self['F2'].setText(_("Add to Favorites"))
+               else:
+                       self['handlung'].setText('')
+                       self['F2'].setText('')
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               Url = self['liste'].getCurrent()[0][1]
+               Type = self['liste'].getCurrent()[0][6]
+               if not Type:
+                       return
+               elif Type == "link":
+                       self.session.open(tuneinGenreScreen, Type, Url)
+               elif Type == "audio":
+                       url = Url
+                       if "?" in url:
+                               url = url + "&render=json"
+                       else:
+                               url = url + "?render=json"
+                       twAgentGetPage(url, agent=agent, headers=json_headers).addCallback(self.getStreamData).addErrback(self.dataError)
+               elif Type == "favorites":
+                       self.session.open(tuneinFavoritesScreen)
+               elif Type == "search":
+                       self.suchen()
+
+       def keyAdd(self):
+               stationName = self['liste'].getCurrent()[0][3]
+               stationId = self['liste'].getCurrent()[0][1]
+               if "?id=" in stationId:
+                       stationId = stationId.split('id=')[-1]
+                       if "&" in stationId:
+                               stationId = stationId.split('&')[0]
+                       if not stationId.startswith('s'):
+                               return
+               else:
+                       return
+               stationLogo = self['liste'].getCurrent()[0][2]
+               if self.keyLocked or not stationId:
+                       return
+               fn = config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist"
+               if not fileExists(fn):
+                       open(fn,"w").close()
+               try:
+                       writePlaylist = open(fn, "a")
+                       writePlaylist.write('"%s" "%s" "%s"\n' % (stationName, stationId, stationLogo))
+                       writePlaylist.close()
+                       message = self.session.open(MessageBoxExt, _("Selection was added to the favorites."), MessageBoxExt.TYPE_INFO, timeout=3)
+               except:
+                       pass
+
+       def getStreamData(self, data):
+               title = self['liste'].getCurrent()[0][3]
+               jsondata = json.loads(data)
+               url = str(jsondata["body"][0]["url"])
+               url = check_playlist(url)
+               pic = self['liste'].getCurrent()[0][2]
+               config_mp.mediaportal.is_radio.value = True
+               self.session.open(SimplePlayer, [(title, url, pic)], showPlaylist=False, ltype='tunein', playerMode='RADIO', cover=True)
+
+       def SuchenCallback(self, callback = None):
+               if callback is not None and len(callback):
+                       Name = "Suche"
+                       self.suchString = callback
+                       url = "http://opml.radiotime.com/Search.ashx?query=" + urllib.quote(self.suchString)
+                       self.session.open(tuneinGenreScreen, 'search', url)
+
+       def keySetup(self):
+               if mp_globals.isDreamOS:
+                       self.session.openWithCallback(self.setupCallback, tuneinSetupScreen, is_dialog=True)
+               else:
+                       self.session.openWithCallback(self.setupCallback, tuneinSetupScreen)
+
+       def setupCallback(self, answer=False):
+               self.loadPage()
+
+       def restoreRadio(self):
+               config_mp.mediaportal.is_radio.value = False
+
+class tuneinSetupScreen(MPSetupScreen, ConfigListScreenExt):
+
+       def __init__(self, session):
+               MPSetupScreen.__init__(self, session, skin='MP_PluginSetup')
+
+               self['title'] = Label("TuneIn " + _("Setup"))
+               self['F4'] = Label('')
+               self.setTitle("Radio " + _("Setup"))
+
+               self.list = []
+               ConfigListScreenExt.__init__(self, self.list)
+
+               self.list.append(getConfigListEntry(_("Sort Favorites:"), config_mp.mediaportal.tunein_sort))
+
+               self["config"].setList(self.list)
+
+               self["setupActions"] = ActionMap(["MP_Actions"],
+               {
+                       "ok"    : self.keySave,
+                       "cancel": self.keyCancel
+               }, -1)
+
+       def keySave(self):
+               for x in self["config"].list:
+                       if len(x) > 1:
+                               x[1].save()
+               self.close(True)
+
+class tuneinFavoritesScreen(MPScreen):
+
+       def __init__(self, session):
+               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
+
+               self["actions"] = ActionMap(["MP_Actions"], {
+                       "ok"    : self.keyOK,
+                       "0" : self.closeAll,
+                       "up" : self.keyUp,
+                       "down" : self.keyDown,
+                       "right" : self.keyRight,
+                       "left" : self.keyLeft,
+                       "cancel": self.keyCancel,
+                       "red": self.keyDel
+               }, -1)
+
+               self.keyLocked = True
+               self['title'] = Label("TuneIn")
+               self['ContentTitle'] = Label(_("Favorites:"))
+               self['F1'] = Label(_("Delete"))
+
+               self.playList = []
+               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
+               self['liste'] = self.ml
+
+               self.onLayoutFinish.append(self.loadStations)
+
+       def loadStations(self):
+               self.playList = []
+               if not fileExists(config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist"):
+                       open(config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist","w").close()
+               if fileExists(config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist"):
+                       path = config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist"
+
+               if fileExists(path):
+                       readStations = open(path,"r")
+                       for rawData in readStations.readlines():
+                               data = re.findall('"(.*?)" "(.*?)" "(.*?)"', rawData, re.S)
+                               if data:
+                                       (stationName, stationId, stationLogo) = data[0]
+                                       self.playList.append((stationName, stationId, stationLogo))
+                       if config_mp.mediaportal.tunein_sort.value:
+                               self.playList.sort(key=lambda t : t[0].lower())
+                       readStations.close()
+               if len(self.playList) == 0:
+                       self.playList.append((_('No entries found!'), None, default_cover))
+               self.ml.setList(map(self._defaultlistleft, self.playList))
+               self.keyLocked = False
+               self.showInfos()
+
+       def keyOK(self):
+               if self.keyLocked:
+                       return
+               stationId = self['liste'].getCurrent()[0][1]
+               if not stationId:
+                       return
+               url = "http://opml.radiotime.com/Tune.ashx?id=%s&render=json" % stationId
+               twAgentGetPage(url, agent=agent, headers=json_headers).addCallback(self.getStreamURL).addErrback(self.dataError)
+
+       def showInfos(self):
+               self['name'].setText(self['liste'].getCurrent()[0][0])
+               pic = self['liste'].getCurrent()[0][2]
+               CoverHelper(self['coverArt']).getCover(pic)
+
+       def getStreamURL(self, data):
+               title = self['liste'].getCurrent()[0][0]
+               pic = self['liste'].getCurrent()[0][2]
+               jsondata = json.loads(data)
+               url = str(jsondata["body"][0]["url"])
+               url = check_playlist(url)
+               config_mp.mediaportal.is_radio.value = True
+               self.session.open(SimplePlayer, [(title, url, pic)], showPlaylist=False, ltype='tunein', playerMode='RADIO', cover=True)
+
+       def keyDel(self):
+               exist = self['liste'].getCurrent()
+               if self.keyLocked or exist == None:
+                       return
+
+               i = self['liste'].getSelectedIndex()
+               c = j = 0
+               l = len(self.playList)
+               fn = config_mp.mediaportal.watchlistpath.value+"mp_tunein_playlist"
+               try:
+                       f1 = open(fn, 'w')
+                       while j < l:
+                               if j != i:
+                                       (stationName, stationId, stationLogo) = self.playList[j]
+                                       f1.write('"%s" "%s" "%s"\n' % (stationName, stationId, stationLogo))
+                               j += 1
+                       f1.close()
+                       self.loadStations()
+               except:
+                       pass
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/bild.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/bild.py
deleted file mode 100644 (file)
index b47971c..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  This plugin is open source but it is NOT free software.
-#
-#  This plugin may only be distributed to and executed on hardware which
-#  is licensed by Dream Property GmbH. This includes commercial distribution.
-#  In other words:
-#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
-#  to hardware which is NOT licensed by Dream Property GmbH.
-#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
-#  on hardware which is NOT licensed by Dream Property GmbH.
-#
-#  This applies to the source code as a whole as well as to parts of it, unless explicitely
-#  stated otherwise.
-#
-#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
-#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
-#  other than under the conditions noted above.
-#
-#  As an exception regarding modifcations, you are NOT permitted to remove
-#  any copy protections implemented in this plugin or change them for means of disabling
-#  or working around the copy protections, unless the change has been explicitly permitted
-#  by the original authors. Also decompiling and modification of the closed source
-#  parts is NOT permitted.
-#
-#  Advertising with this plugin is NOT allowed.
-#
-#  For other uses, permission from the authors is necessary.
-#
-#######################################################################################################
-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-base_url = "https://www.bild.de"
-default_cover = "file://%s/bild.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class bildFirstScreen(MPScreen):
-
-       def __init__(self, session):
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0" : self.closeAll,
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel
-               }, -1)
-
-               self['title'] = Label("Bild.de")
-               self['ContentTitle'] = Label("Genre:")
-
-               self.genreliste = []
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.layoutFinished)
-
-       def layoutFinished(self):
-               self.genreliste.append(("Startseite", "/video/startseite/bildchannel-home/video-home-15713248.bild.html", "3-position-teaserreihe-100-videos-47971084,contentContextId=15713248"))
-               self.genreliste.append(("News", "/video/clip/news/news-15477962.bild.html", "neueste-videos-3-47902306,contentContextId=15477962"))
-               self.genreliste.append(("Politik", "/video/clip/politik/politik-15714862.bild.html", "neueste-videos-3-47902306,contentContextId=15714862"))
-               self.genreliste.append(("Regional", "/video/clip/regional/regional-15716814.bild.html", "neueste-videos-3-47902306,contentContextId=15716814"))
-               self.genreliste.append(("Unterhaltung", "/video/clip/unterhaltung/unterhaltung-15478026.bild.html", "neueste-videos-3-47902306,contentContextId=15478026"))
-               self.genreliste.append(("Sport", "/video/clip/sport/sport-15717150.bild.html", "3-position-teaserreihe-x-viele-videos-sport-42003590,contentContextId=15717150"))
-               self.genreliste.append(("Auto", "/video/clip/auto/auto-15711140.bild.html", "neueste-videos-3-47902306,contentContextId=15711140"))
-               self.genreliste.append(("Lifestyle", "/video/clip/lifestyle/lifestyle-15716870.bild.html", "neueste-videos-3-47902306,contentContextId=15716870"))
-               self.genreliste.append(("Futtern", "/video/clip/futtern/futtern-47049016.bild.html", "neueste-videos-3-47902306,contentContextId=47049016"))
-               self.genreliste.append(("Viral", "/video/clip/virale-videos/virale-videos-36659638.bild.html", "neueste-videos-3-47902306,contentContextId=36659638"))
-               self.genreliste.append(("Digital", "/video/clip/digital/digital-15884812.bild.html", "neueste-videos-3-47902306,contentContextId=15884812"))
-               self.genreliste.append(("Games", "/video/clip/spiele/spiele-15885178.bild.html", "neueste-videos-3-47902306,contentContextId=15885178"))
-               self.genreliste.append(("Bild-Live", "/video/clip/bild-live/bild-live-54351602.bild.html", "neueste-videos-3-47902306,contentContextId=54351602"))
-               self.genreliste.append(("Bild-Boxx", "/video/clip/bild-boxx/bild-boxx-34731956.bild.html", "neueste-videos-3-47902306,contentContextId=34731956"))
-               self.genreliste.append(("Bild-Reporter", "/video/clip/bild-reporter/bild-reporter-36659552.bild.html", "neueste-videos-3-47902306,contentContextId=36659552"))
-               self.genreliste.append(("Bild-Daily", "/video/clip/bild-daily/bild-daily-41607010.bild.html", "neueste-videos-3-47902306,contentContextId=41607010"))
-               self.genreliste.append(("Tiervideos", "/video/clip/tiervideos/tiervideos-25998606.bild.html", "neueste-videos-3-47902306,contentContextId=25998606"))
-               self.genreliste.append(("Motorsport", "/video/clip/motorsport/motorsport-15883290.bild.html", "neueste-videos-3-47902306,contentContextId=15883290"))
-               self.genreliste.append(("Boxen", "/video/clip/boxen/boxen-15883202.bild.html", "neueste-videos-3-47902306,contentContextId=15883202"))
-               self.genreliste.append(("Fußball", "/video/clip/fussball/fussball-15716788.bild.html", "neueste-videos-3-47902306,contentContextId=15716788"))
-               self.genreliste.append(("Bundesliga", "/video/clip/bundesliga-bei-bild/bundesliga-bei-bild-33009168.bild.html", "neueste-videos-3-47902306,contentContextId=33009168"))
-               self.genreliste.append(("2. Bundesliga", "/video/clip/2-bundesliga/zweite-liga-tore-highlights-starteite-31149208.bild.html", "neueste-videos-3-47902306,contentContextId=31149208"))
-               self.genreliste.append(("Top Ligen", "/video/clip/premier-league/ligue-1-serie-a-primera-division-47933904.bild.html", "neueste-videos-3-47902306,contentContextId=47933904"))
-               self.genreliste.append(("Knops Kult-Liga", "/video/clip/knops-kult-liga/knops-kult-liga-15718778.bild.html", "neueste-videos-3-47902306,contentContextId=15718778"))
-               self.genreliste.append(("Leser-Reporter", "/video/clip/leserreporter/leser-reporter-15714330.bild.html", "neueste-videos-3-47902306,contentContextId=15714330"))
-               self.genreliste.append(("Herr Gerstenberg", "/video/clip/word/word-39692016.bild.html", "neueste-videos-3-47902306,contentContextId=39692016"))
-               self.genreliste.append(("Erotik", "/video/clip/erotik/erotik-15716836.bild.html", "neueste-videos-3-47902306,contentContextId=15716836"))
-               self.ml.setList(map(self._defaultlistcenter, self.genreliste))
-
-       def getTriesEntry(self):
-               return config.ParentalControl.retries.setuppin
-
-       def pincheckok(self, pincode):
-               name = self['liste'].getCurrent()[0][0]
-               url = self['liste'].getCurrent()[0][1]
-               more = self['liste'].getCurrent()[0][2]
-               if pincode:
-                       self.session.open(bildSecondScreen, url, name, more)
-
-       def keyOK(self):
-               name = self['liste'].getCurrent()[0][0]
-               url = self['liste'].getCurrent()[0][1]
-               more = self['liste'].getCurrent()[0][2]
-               self.session.open(bildSecondScreen, url, name, more)
-
-class bildSecondScreen(MPScreen):
-
-       def __init__(self, session, link, name, more):
-               self.link = link
-               self.name = name
-               self.more = more
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "0" : self.closeAll,
-                       "ok" : self.keyOK,
-                       "cancel" : self.keyCancel,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown
-               }, -1)
-
-               self['title'] = Label("Bild.de")
-               self['ContentTitle'] = Label("Genre: %s" % self.name)
-               self['name'] = Label(_("Please wait..."))
-
-               self.page = 1
-               self.lastpage = 1
-
-               self.keyLocked = True
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.filmliste = []
-               if self.page > 1:
-                       url = base_url + "/video/buehnenelemente/" + self.more + ",fromTeaser=%s,inTeaserReihe=true,isEndlessScrolling=true,toTeaser=25,view=teaserOnly.bild.html" % str((self.page-1)*25)
-               else:
-                       url = base_url + self.link
-               twAgentGetPage(url).addCallback(self.parseData).addErrback(self.dataError)
-
-       def parseData(self, data):
-               if 'class="btn-add">Mehr anzeigen</a>' in data:
-                       self.lastpage = self.page + 1
-               if self.lastpage > 1:
-                       self['Page'].setText(_("Page:"))
-                       self['page'].setText(str(self.page) + ' / ' + str(self.lastpage))
-               videos =  re.findall('video-id.*?data-video-json="(.*?)".*?class="kicker">(.*?)</span>.*?class="headline">(.*?)</span>', data, re.S)
-               for (Url, Title1, Title2) in videos:
-                       if not re.match('.*?bild-plus', Url):
-                               Url = base_url + Url
-                               Title = Title1.strip() + " - " + Title2.strip()
-                               self.filmliste.append((decodeHtml(Title), Url))
-               if len(self.filmliste) == 0:
-                       self.filmliste.append((_("No videos found!"),"",""))
-               self.ml.setList(map(self._defaultlistleft, self.filmliste))
-               self.ml.moveToIndex(0)
-               self.keyLocked = False
-               self.showInfos()
-
-       def showInfos(self):
-               self.videourl = None
-               title = self['liste'].getCurrent()[0][0]
-               self['name'].setText(title)
-               jsonurl = self['liste'].getCurrent()[0][1]
-               twAgentGetPage(jsonurl).addCallback(self.showInfos2).addErrback(self.dataError)
-
-       def showInfos2(self, data):
-               parse = re.findall('description":\s"(.*?)",.*?"durationSec":(\d+),.*?poster":\s"(.*?)".*?src":"([A-Za-z0-9:.,-=\/]+\.mp4)"', data, re.S)
-               if parse:
-                       Handlung = parse[0][0]
-                       m, s = divmod(int(parse[0][1]), 60)
-                       Runtime = _("Runtime:") + " %02d:%02d" % (m, s)
-                       coverUrl = parse[0][2]
-                       self.videourl = parse[0][3]
-               else:
-                       coverUrl = None
-                       Handlung = ""
-               self['handlung'].setText(Runtime + "\n\n" + decodeHtml(Handlung))
-               CoverHelper(self['coverArt']).getCover(coverUrl)
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               if self.videourl:
-                       self.playVideo(self.videourl)
-
-       def playVideo(self, url):
-               title = self['liste'].getCurrent()[0][0]
-               self.session.open(SimplePlayer, [(title, url)], showPlaylist=False, ltype='bild')
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/doku_to.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/doku_to.py
deleted file mode 100644 (file)
index 6ad9901..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-#    Copyright (c) 2016 Billy2011, MediaPortal Team
-#
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-import Queue
-import threading
-from Plugins.Extensions.MediaPortal.resources.youtubeplayer import YoutubePlayer
-from Plugins.Extensions.MediaPortal.resources.menuhelper import MenuHelper
-from Plugins.Extensions.MediaPortal.additions.mediatheken.youtube import YT_ListScreen
-from Plugins.Extensions.MediaPortal.resources.twagenthelper import twAgentGetPage
-
-default_cover = "file://%s/doku_to.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class show_DUTO_Genre(MenuHelper):
-
-       def __init__(self, session):
-
-               baseUrl = "http://doku.to"
-               MenuHelper.__init__(self, session, 0, None, baseUrl, "", self._defaultlistcenter, default_cover=default_cover)
-
-               self['title'] = Label("DOKU.to")
-               self['ContentTitle'] = Label("Genres")
-
-               self.onLayoutFinish.append(self.mh_initMenu)
-
-       def mh_parseCategorys(self, data):
-               menu = [
-                       (0, "/", "Letzte Beiträge"),
-                       (0, "/", "Kategorien"),
-                       ]
-               menu_marker = '">Kategorien</h3'
-               menu += self.scanMenu(data,menu_marker, base_url=self.mh_baseUrl, init_level=0)
-               m = re.search('="widget-title">Schlagwörter<(.*?)</div>', data, re.S)
-               if m:
-                       menu.append((0, "", "Schlagwörter"))
-                       for m2 in re.finditer('<a\shref="(.*?)\/"\sclass="tag-cloud-link.*?">(.*?)</a>', m.group(1)):
-                               url, nm = m2.groups()
-                               menu.append((1, url, decodeHtml(nm)))
-               self.mh_genMenu2(menu)
-               del menu[:]
-
-       def mh_callGenreListScreen(self):
-               genreurl = self.mh_genreUrl[self.mh_menuLevel].replace('&#038;','&')
-               if not genreurl.startswith('http'):
-                       genreurl = self.mh_baseUrl+genreurl
-               self.session.open(DUTO_FilmListeScreen, genreurl, self.mh_genreTitle)
-
-class DUTO_FilmListeScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session, genreLink, genreName):
-               self.genreLink = genreLink
-               self.genreName = genreName
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions2", "MP_Actions"], {
-                       "ok"    : self.keyOK,
-                       "cancel": self.keyCancel,
-                       "5" : self.keyShowThumb,
-                       "up" : self.keyUp,
-                       "down" : self.keyDown,
-                       "right" : self.keyRight,
-                       "left" : self.keyLeft,
-                       "upUp" : self.key_repeatedUp,
-                       "rightUp" : self.key_repeatedUp,
-                       "leftUp" : self.key_repeatedUp,
-                       "downUp" : self.key_repeatedUp,
-                       "upRepeated" : self.keyUpRepeated,
-                       "downRepeated" : self.keyDownRepeated,
-                       "rightRepeated" : self.keyRightRepeated,
-                       "leftRepeated" : self.keyLeftRepeated,
-                       "nextBouquet" : self.keyPageUp,
-                       "prevBouquet" : self.keyPageDown,
-                       "1" : self.key_1,
-                       "3" : self.key_3,
-                       "4" : self.key_4,
-                       "6" : self.key_6,
-                       "7" : self.key_7,
-                       "9" : self.key_9,
-                       "0" : self.closeAll
-               }, -1)
-
-               self.sortOrder = 0
-               self.genreTitle = ""
-               self.sortParIMDB = ""
-               self.sortParAZ = ""
-               self.sortOrderStrAZ = ""
-               self.sortOrderStrIMDB = ""
-               self.sortOrderStrGenre = ""
-               self['title'] = Label("DOKU.to")
-
-               self['Page'] = Label(_("Page:"))
-
-               self.filmQ = Queue.Queue(0)
-               self.hanQ = Queue.Queue(0)
-               self.picQ = Queue.Queue(0)
-               self.updateP = 0
-               self.eventL = threading.Event()
-               self.eventP = threading.Event()
-               self.keyLocked = True
-               self.dokusListe = []
-               self.page = 0
-               self.pages = 0
-               self.pageplus = ''
-
-               self.setGenreStrTitle()
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def setGenreStrTitle(self):
-               genreName = "%s%s" % (self.genreTitle,self.genreName)
-               self['ContentTitle'].setText(genreName)
-
-       def loadPage(self):
-               if self.page > 1:
-                       if '/?' in self.genreLink:
-                               url = self.genreLink.replace('/?', '/page/%d/?', 1)
-                       else:
-                               url = self.genreLink + "/page/%d/"
-                       url = url % self.page
-               else:
-                       url = self.genreLink
-
-               if self.page:
-                       self['page'].setText("%d / %d%s" % (self.page,self.pages,self.pageplus))
-
-               self.filmQ.put(url)
-               if not self.eventL.is_set():
-                       self.eventL.set()
-                       self.loadPageQueued()
-
-       def loadPageQueued(self):
-               self['name'].setText(_('Please wait...'))
-               while not self.filmQ.empty():
-                       url = self.filmQ.get_nowait()
-               twAgentGetPage(url, timeout=30).addCallback(self.loadPageData).addErrback(self.dataError)
-
-       def dataError(self, error):
-               self.eventL.clear()
-               printl(error,self,"E")
-               if not 'TimeoutError' in str(error):
-                       message = self.session.open(MessageBoxExt, _("No dokus / streams found!"), MessageBoxExt.TYPE_INFO, timeout=5)
-               else:
-                       message = self.session.open(MessageBoxExt, str(error), MessageBoxExt.TYPE_INFO)
-
-       def loadPageData(self, data):
-               self.dokusListe = []
-               for m in re.finditer('<article id=(.*?)</article>', data, re.S):
-                       if re.search('Status:.*?alt="Offline"', m.group(1)): continue
-                       m2 = re.search('="entry-thumb">.*?href="(.*?)"\stitle="(.*?)".*?<img.*?src="(.*?)".*?<p>\s*(.*?)\s*</p>', m.group(1), re.S)
-                       if m2:
-                               url, nm, img, desc = m2.groups()
-                               self.dokusListe.append((decodeHtml(nm), url, img, decodeHtml(desc)))
-
-               self.pageplus = '+' if re.search('class="fa fa-long-arrow-left"></i>&nbsp;<a href="', data) != None and self.page >= self.pages else ''
-               if self.dokusListe:
-                       if not self.page:
-                               self.page = 1
-                       if self.page > self.pages: self.pages = self.page
-                       self['page'].setText("%d / %d%s" % (self.page,self.pages,self.pageplus))
-
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       self['liste'].moveToIndex(0)
-                       self.th_ThumbsQuery(self.dokusListe,0,1,2,None,None, self.page, self.pages)
-                       self.loadPicQueued()
-               else:
-                       if self.page:
-                               self['page'].setText("%d / %d%s" % (self.page,self.pages,self.pageplus))
-                       self.dokusListe.append((_("No playable dokus found!"),"","",""))
-                       self.ml.setList(map(self._defaultlistleft, self.dokusListe))
-                       self['liste'].moveToIndex(0)
-                       if self.filmQ.empty():
-                               self.eventL.clear()
-                       else:
-                               self.loadPageQueued()
-
-       def loadPic(self):
-               if self.picQ.empty():
-                       self.eventP.clear()
-                       return
-
-               if self.updateP:
-                       return
-
-               while not self.picQ.empty():
-                       self.picQ.get_nowait()
-
-               streamName = self['liste'].getCurrent()[0][0]
-               self['name'].setText(streamName)
-               streamPic = self['liste'].getCurrent()[0][2]
-               self.updateP = 1
-               CoverHelper(self['coverArt'], self.ShowCoverFileExit).getCover(streamPic)
-
-       def getHandlung(self, desc):
-               if desc == None:
-                       self['handlung'].setText('')
-                       return
-               self.setHandlung(desc)
-
-       def setHandlung(self, data):
-               self['handlung'].setText(data)
-
-       def ShowCoverFileExit(self):
-               self.updateP = 0;
-               self.keyLocked  = False
-               if not self.filmQ.empty():
-                       self.loadPageQueued()
-               else:
-                       self.eventL.clear()
-                       self.loadPic()
-
-       def loadPicQueued(self):
-               self.picQ.put(None)
-               if not self.eventP.is_set():
-                       self.eventP.set()
-               desc = self['liste'].getCurrent()[0][3]
-               self.getHandlung(desc)
-               self.loadPic()
-
-       def parseYTStream(self, data):
-               m2 = re.search('//www.youtube.*?com/(embed|v|p)/(.*?)(\?|" |&amp)', data)
-               url = None
-               if m2:
-                       dhVideoId = m2.group(2)
-                       if 'p' == m2.group(1):
-                               url = 'gdata.youtube.com/feeds/api/playlists/PL'+dhVideoId+'?'
-               else:
-                       m2 = re.search('youtu.*?/(.*?)</p>', data)
-                       if not m2:
-                               m2 = re.search('//youtu.be/(.*?)"', data)
-                       if m2:
-                               dhVideoId = m2.group(1)
-               if m2:
-                       dhTitle = self['liste'].getCurrent()[0][0]
-                       if url:
-                               url = 'gdata.youtube.com/feeds/api/playlists/PL'+dhVideoId+'?'
-                               self.session.open(YT_ListScreen, url, dhTitle, title="DOKU.to")
-                       else:
-                               self.session.open(
-                                       YoutubePlayer,
-                                       [(dhTitle, dhVideoId, None)],
-                                       showPlaylist=False
-                                       )
-               else:
-                       self.dataError(_('No streamlink found.'))
-
-       def keyOK(self):
-               if (self.keyLocked|self.eventL.is_set()):
-                       return
-               streamLink = self['liste'].getCurrent()[0][1]
-               twAgentGetPage(streamLink, timeout=30).addCallback(self.parseYTStream).addErrback(self.dataError)
-
-       def keyUpRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].up()
-
-       def keyDownRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].down()
-
-       def key_repeatedUp(self):
-               if self.keyLocked:
-                       return
-               self.loadPicQueued()
-
-       def keyLeftRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].pageUp()
-
-       def keyRightRepeated(self):
-               if self.keyLocked:
-                       return
-               self['liste'].pageDown()
-
-       def keyPageDown(self):
-               self.keyPageDownFast(1)
-
-       def keyPageUp(self):
-               self.keyPageUpFast(1)
-
-       def keyPageUpFast(self,step):
-               if self.keyLocked:
-                       return
-               oldpage = self.page
-               if (self.page + step) <= self.pages:
-                       self.page += step
-               elif self.pageplus:
-                       self.page += 1
-                       self.pages += 1
-                       self.pageplus = ''
-               else:
-                       self.page = 1
-               if oldpage != self.page:
-                       self.loadPage()
-
-       def keyPageDownFast(self,step):
-               if self.keyLocked:
-                       return
-               oldpage = self.page
-               if (self.page - step) >= 1:
-                       self.page -= step
-               else:
-                       self.page = self.pages
-               if oldpage != self.page:
-                       self.loadPage()
-
-       def key_1(self):
-               self.keyPageDownFast(2)
-
-       def key_4(self):
-               self.keyPageDownFast(5)
-
-       def key_7(self):
-               self.keyPageDownFast(10)
-
-       def key_3(self):
-               self.keyPageUpFast(2)
-
-       def key_6(self):
-               self.keyPageUpFast(5)
-
-       def key_9(self):
-               self.keyPageUpFast(10)
\ No newline at end of file
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/wissen.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/additions/newsdoku/wissen.py
deleted file mode 100644 (file)
index 1030723..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-# -*- coding: utf-8 -*-
-#######################################################################################################
-#
-#    MediaPortal for Dreambox OS
-#
-#    Coded by MediaPortal Team (c) 2013-2020
-#
-#  This plugin is open source but it is NOT free software.
-#
-#  This plugin may only be distributed to and executed on hardware which
-#  is licensed by Dream Property GmbH. This includes commercial distribution.
-#  In other words:
-#  It's NOT allowed to distribute any parts of this plugin or its source code in ANY way
-#  to hardware which is NOT licensed by Dream Property GmbH.
-#  It's NOT allowed to execute this plugin and its source code or even parts of it in ANY way
-#  on hardware which is NOT licensed by Dream Property GmbH.
-#
-#  This applies to the source code as a whole as well as to parts of it, unless explicitely
-#  stated otherwise.
-#
-#  If you want to use or modify the code or parts of it, permission from the authors is necessary.
-#  You have to keep OUR license and inform us about any modification, but it may NOT be distributed
-#  other than under the conditions noted above.
-#
-#  As an exception regarding modifcations, you are NOT permitted to remove
-#  any copy protections implemented in this plugin or change them for means of disabling
-#  or working around the copy protections, unless the change has been explicitly permitted
-#  by the original authors. Also decompiling and modification of the closed source
-#  parts is NOT permitted.
-#
-#  Advertising with this plugin is NOT allowed.
-#
-#  For other uses, permission from the authors is necessary.
-#
-#######################################################################################################
-
-from Plugins.Extensions.MediaPortal.plugin import _
-from Plugins.Extensions.MediaPortal.resources.imports import *
-
-default_cover = "file://%s/wissen.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-
-class wissenListeScreen(MPScreen, ThumbsHelper):
-
-       def __init__(self, session):
-               MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
-               ThumbsHelper.__init__(self)
-
-               self["actions"] = ActionMap(["MP_Actions"], {
-                       "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
-               }, -1)
-
-               self.keyLocked = True
-               self['title'] = Label("Wissen.de")
-               self['ContentTitle'] = Label("Videos:")
-               self['Page'] = Label(_("Page:"))
-
-               self.videoliste = []
-               self.page = 0
-               self.lastpage = 0
-
-               self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
-               self['liste'] = self.ml
-
-               self.onLayoutFinish.append(self.loadPage)
-
-       def loadPage(self):
-               self.keyLocked = True
-               self.videoliste = []
-               url = "http://www.wissen.de/medien-videos/all?page=%s" % str(self.page)
-               getPage(url).addCallback(self.loadPageData).addErrback(self.dataError)
-
-       def loadPageData(self, data):
-               lastlast = re.search('class="pager-last\slast".*?all\?page=(.*?)"', data, re.S)
-               currentlast = re.search('pager-current\slast">(.*?)</li>', data, re.S)
-               if lastlast:
-                       lastp = int(lastlast.group(1))
-               else:
-                       lastp = int(currentlast.group(1))-1
-               if lastp:
-                       lastp = lastp
-                       self.lastpage = lastp
-               else:
-                       self.lastpage = 0
-               self['page'].setText(str(self.page+1) + ' / ' + str(self.lastpage+1))
-
-               preparse = re.findall('<div\sclass="views-row\sviews-row-\d+\sviews-row-(odd|even)(.*?teaser-h2.*?)</div', data, re.S)
-               for (dummy, videos) in preparse:
-                       video = re.findall('<a\shref="(/video/.*?)">.*?background-image..url\(\'(.*?)\'.*?class="teaser-h3">Video</p>.*?<p\sclass="teaser-h2">(.*?)</p>', videos, re.S)
-                       if video:
-                               for (url, img, title) in video:
-                                       url = "http://www.wissen.de%s" % url
-                                       self.videoliste.append((decodeHtml(title), url, img))
-               self.ml.setList(map(self._defaultlistleft, self.videoliste))
-               self.keyLocked = False
-               self.th_ThumbsQuery(self.videoliste, 0, 1, 2, None, None, self.page+1, self.lastpage, mode=1, pagefix=-1)
-               self.showInfos()
-
-       def showInfos(self):
-               streamPic = self['liste'].getCurrent()[0][2]
-               CoverHelper(self['coverArt']).getCover(streamPic)
-
-       def keyPageDown(self):
-               if self.keyLocked:
-                       return
-               if not self.page < 1:
-                       self.page -= 1
-                       self.loadPage()
-
-       def keyPageUp(self):
-               if self.keyLocked:
-                       return
-               if self.page < self.lastpage:
-                       self.page += 1
-                       self.loadPage()
-
-       def keyOK(self):
-               if self.keyLocked:
-                       return
-               self.wissentitle = self['liste'].getCurrent()[0][0]
-               url = self['liste'].getCurrent()[0][1]
-               getPage(url).addCallback(self.get_videourl).addErrback(self.dataError)
-
-       def get_videourl(self, data):
-               videourls = re.findall('sources:\s.*?file:\s"(.*?)"', data, re.S)
-               if videourls:
-                       self.session.open(SimplePlayer, [(self.wissentitle, videourls[-1])], showPlaylist=False, ltype='wissen')
\ No newline at end of file
index b060e84..53af064 100644 (file)
@@ -79,8 +79,8 @@ class bongacamsGenreScreen(MPScreen):
                getPage(BASEURL).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
-               parse = re.search('js-spa_categories">(.*?)</ul', data, re.S)
-               Cats = re.findall('href="\/(.*?)".*?>(.*?) <span', parse.group(1), re.S)
+               parse = re.search('js-spa_categories(.*?)</ul', data, re.S)
+               Cats = re.findall('class="ht_item" href="\/(.*?)">(.*?)</a', parse.group(1), re.S)
                if Cats:
                        for (Url, Title) in Cats:
                                self.genreliste.append((Title.strip(), Url))
@@ -151,8 +151,10 @@ class bongacamsFilmScreen(MPScreen, ThumbsHelper):
                        category = ""
                else:
                        livetab = "females"
-                       category = self.Link
-               url = BASEURL + "tools/listing_v3.php?livetab=" + livetab + "&online_only=true&offset=" + str((self.page*24)-24) + "&category=" + category
+               if "/" in self.Link:
+                       self.Link = self.Link.split('/')[-1]
+               category = self.Link
+               url = BASEURL + "tools/listing_v3.php?livetab=" + livetab + "&online_only=true&offset=" + str((self.page*24)-24) + "&tag=" + category
                self.filmQ.put(url)
                if not self.eventL.is_set():
                        self.eventL.set()
index a5daaca..ea253c4 100644 (file)
@@ -80,15 +80,15 @@ class lovehomepornGenreScreen(MPScreen):
                if Cats:
                        for (Url, Title) in Cats:
                                if Title not in ["all","bigass","bigboobs"]:
-                                       Url = Url.replace('#menu','') + "&page="
+                                       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, ("Being Watched", "https://lovehomeporn.com/videos/$$PAGE$$?o=bw", default_cover))
+                       self.genreliste.insert(0, ("Most Downloaded", "https://lovehomeporn.com/videos/$$PAGE$$?o=md", default_cover))
+                       self.genreliste.insert(0, ("Most Favorited", "https://lovehomeporn.com/videos/$$PAGE$$?o=tf", default_cover))
+                       self.genreliste.insert(0, ("Most Viewed", "https://lovehomeporn.com/videos/$$PAGE$$?o=mv", default_cover))
+                       self.genreliste.insert(0, ("Top Rated", "https://lovehomeporn.com/videos/$$PAGE$$?o=tr", default_cover))
+                       self.genreliste.insert(0, ("Newest", "https://lovehomeporn.com/videos/$$PAGE$$?o=mr", default_cover))
                        self.genreliste.insert(0, ("--- Search ---", "callSuchen", default_cover))
                        self.ml.setList(map(self._defaultlistcenter, self.genreliste))
                        self.ml.moveToIndex(0)
@@ -159,7 +159,7 @@ class lovehomepornFilmScreen(MPScreen, ThumbsHelper):
                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))
+                       url = self.Link.replace('$$PAGE$$', str(self.page))
                getPage(url, agent=agent, cookies=ck).addCallback(self.loadData).addErrback(self.dataError)
 
        def loadData(self, data):
@@ -173,7 +173,7 @@ class lovehomepornFilmScreen(MPScreen, ThumbsHelper):
                                Image = Image.replace('cdn.static.','').replace('.webp','.jpg')
                                self.filmliste.append((decodeHtml(Title), Id, Image, Runtime, Views, Added))
                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
index 0114677..3a35f95 100644 (file)
@@ -237,10 +237,10 @@ class pinflixSitesScreen(MPScreen, ThumbsHelper):
                self.page = 1
                if self.portal == "GotPorn.com":
                        self.sort = ''
-                       self.sorttext = 'Newest Videos'
+                       self.sortname = 'Newest Videos'
                else:
                        self.sort = 'most-popular'
-                       self.sorttext = 'Most Viewed'
+                       self.sortname = 'Most Viewed'
 
                self.filmliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
@@ -308,13 +308,13 @@ class pinflixSitesScreen(MPScreen, ThumbsHelper):
        def keySortAction(self, result):
                if result:
                        self.sort = result[1]
-                       self.sorttext = result[0]
+                       self.sortname = result[0]
                        self.loadPage()
 
        def showInfos(self):
                Title = self['liste'].getCurrent()[0][0]
                Image = self['liste'].getCurrent()[0][2]
-               self['handlung'].setText("%s: %s" % (_("Sort order"),self.sorttext))
+               self['extrainfo'].setText("%s: %s" % (_("Sort order"), self.sortname))
                self['name'].setText(Title)
                CoverHelper(self['coverArt']).getCover(Image)
 
@@ -373,13 +373,13 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
                self.lastpage = 1
                if re.match(".*?Search", self.Name):
                        self.sort = 'mostrelevant'
-                       self.sorttext = 'Most Relevant'
+                       self.sortname = 'Most Relevant'
                else:
                        if self.portal == "GotPorn.com":
                                self.sort = ''
                        else:
                                self.sort = 'newest'
-                       self.sorttext = 'Newest'
+                       self.sortname = 'Newest'
 
                self.filmliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
@@ -421,7 +421,7 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
                                        Image = re.search('data-original="(.*?)"', BackupImage, re.S).group(1).replace('.webp','.jpg')
                                self.filmliste.append((decodeHtml(Title).strip(), Url, Image, Runtime))
                else:
-                       Movies = re.findall('article\sclass="video-item.*?href="(.*?/videos.*?)".*?<img\salt="(.*?)".*?src="(.*?)".*?class="meta">.*?<time.*?>(.*?)</time', data, re.S)
+                       Movies = re.findall('article\sclass="video-item.*?href="(.*?/videos.*?)".*?<img\salt="(.*?)".*?src="(.*?)".*?class="meta">.*?(?:<time.*?>|class="video-duration">)(.*?)(?:</time|</span)', data, re.S)
                        if Movies:
                                for (Url, Title, Image, Runtime) in Movies:
                                        if Url.startswith('//'):
@@ -457,7 +457,8 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
                self['name'].setText(title)
-               self['handlung'].setText("%s: %s\nRuntime: %s" % (_("Sort order"),self.sorttext,runtime))
+               self['handlung'].setText("Runtime: %s" % runtime)
+               self['extrainfo'].setText("%s: %s" % (_("Sort order"), self.sortname))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keySort(self):
@@ -478,7 +479,7 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
        def keySortAction(self, result):
                if result:
                        self.sort = result[1]
-                       self.sorttext = result[0]
+                       self.sortname = result[0]
                        self.loadPage()
 
        def keyOK(self):
@@ -496,7 +497,7 @@ class pinflixFilmScreen(MPScreen, ThumbsHelper):
                        tw_agent_hlp = TwAgentHelper(cookieJar=cookies)
                        tw_agent_hlp.getRedirectedUrl(url).addCallback(self.getStream).addErrback(self.dataError)
                else:
-                       videoUrl = re.findall('source\ssrc="(.*?)".*?(?:label=\'\d+p\'|type=\'video/mp4\')', data, re.S)
+                       videoUrl = re.findall('source\s+src="(.*?)".*?(?:label=\'\d+p\'|type=\'video/mp4\')', data, re.S)
                        if videoUrl:
                                self.keyLocked = False
                                url = videoUrl[0].replace('\/','/')
index 22acd1b..1b22872 100644 (file)
@@ -39,7 +39,7 @@ 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/61.0.3163.100 Safari/537.36'
+agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
 default_cover = "file://%s/porndoe.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
 ck = {}
@@ -73,11 +73,13 @@ class porndoeGenreScreen(MPScreen):
 
        def layoutFinished(self):
                self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
                ck.update({'__language':'en'})
                url = "https://www.porndoe.com/categories"
                getPage(url, agent=agent, cookies=ck).addCallback(self.genreData).addErrback(self.dataError)
 
        def genreData(self, data):
+               data = re.search('class="categories-listing">(.*?)footer', data, re.S).group(1)
                Cats = re.findall('class="item">.*?href="(.*?)".*?data-src="(.*?)".*?class="txt">(.*?)(?:</span|<span)', data, re.S)
                if Cats:
                        for (Url, Image, Title) in Cats:
@@ -95,6 +97,7 @@ class porndoeGenreScreen(MPScreen):
                        self.ml.moveToIndex(0)
                        self.keyLocked = False
                        self.showInfos()
+               self['name'].setText('')
 
        def showInfos(self):
                Image = self['liste'].getCurrent()[0][2]
@@ -153,10 +156,10 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
                self.page = 1
                if not self.Sort:
                        self.sort = ''
-                       self.sorttext = ''
+                       self.sortname = ''
                else:
                        self.sort = ''
-                       self.sorttext = 'Date'
+                       self.sortname = 'Date'
 
                self.filmliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
@@ -180,9 +183,13 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
 
        def loadData(self, data):
                self.getLastPage(data, 'class="paginator"(.*?)</ul>', '.*(?:page=|<span>)(\d+)(?:"|</span>)')
-               Movies = re.findall('data-title="(.*?)".*?href="(.*?)".*?data-src="(.*?)".*?class="item-stat right duration".*?txt">(.*?)</span.*?class="item-stat views".*?txt">(.*?)</span', data, re.S)
+               if 'class="videos-listing">' in data:
+                       data = re.search('class="videos-listing">(.*?)footer', data, re.S).group(1)
+               else:
+                       data = re.search('<body(.*?)footer', data, re.S).group(1)
+               Movies = re.findall('class="item".*?href="(.*?)".*?data-src="(.*?)"\s+alt="(.*?)".*?class="item-stat right duration (?:star|)".*?txt">(.*?)</span.*?class="item-stat views".*?txt">(.*?)</span', data, re.S)
                if Movies:
-                       for (Title, Url, Image, Runtime, Views) in Movies:
+                       for (Url, Image, Title, Runtime, Views) in Movies:
                                Url = "https://www.porndoe.com" + Url
                                if Image.startswith('//'):
                                        Image = 'http:' + Image
@@ -203,7 +210,8 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
                runtime = self['liste'].getCurrent()[0][3]
                views = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               self['handlung'].setText("%s: %s\nRuntime: %s\nViews: %s" % (_("Sort order"),self.sorttext,runtime, views))
+               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
+               self['extrainfo'].setText("%s: %s" % (_("Sort order"), self.sortname))
                CoverHelper(self['coverArt']).getCover(pic, agent=agent, headers={'Referer':'https://www.porndoe.com'})
 
        def keySort(self):
@@ -217,7 +225,7 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
        def keySortAction(self, result):
                if result:
                        self.sort = result[1]
-                       self.sorttext = result[0]
+                       self.sortname = result[0]
                        self.loadPage()
 
        def keyOK(self):
@@ -225,10 +233,14 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
                        return
                Link = self['liste'].getCurrent()[0][1]
                self.keyLocked = True
+               self['name'].setText(_('Please wait...'))
                getPage(Link, agent=agent, cookies=ck).addCallback(self.getVideoPage).addErrback(self.dataError)
 
        def getVideoPage(self, data):
+               Title = self['liste'].getCurrent()[0][0]
+               self['name'].setText(Title)
                videoPage = re.findall('"(\d+)": {\s+"type": "video".*?"url":\s"(.*?)"', data, re.S)
+               self.keyLocked = False
                if videoPage:
                        maxres = 0
                        for (res, vidurl) in videoPage:
@@ -237,8 +249,6 @@ class porndoeFilmScreen(MPScreen, ThumbsHelper):
                                        url = vidurl
                        if url.startswith('//'):
                                url = 'http:' + url
-                       self.keyLocked = False
-                       Title = self['liste'].getCurrent()[0][0]
                        headers = '&Referer=' + self['liste'].getCurrent()[0][1]
                        url = url + '#User-Agent='+agent+headers
                        mp_globals.player_agent = agent
index a2580a1..a4f11a6 100644 (file)
@@ -90,10 +90,6 @@ class porntvGenreScreen(MPScreen):
                        self.portal = "HoodTube.com"
                        self.baseurl = "https://www.hoodtube.com"
                        default_cover = "file://%s/hoodtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.mode == "bigboobstube":
-                       self.portal = "BigBoobsTube.com"
-                       self.baseurl = "https://www.bigboobstube.com"
-                       default_cover = "file://%s/bigboobstube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.mode == "suzisporn":
                        self.portal = "SuzisPorn.com"
                        self.baseurl = "https://www.suzisporn.com"
@@ -102,10 +98,6 @@ class porntvGenreScreen(MPScreen):
                        self.portal = "MovieShark.com"
                        self.baseurl = "https://www.movieshark.com"
                        default_cover = "file://%s/movieshark.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.mode == "youngsextube":
-                       self.portal = "YoungSexTube.com"
-                       self.baseurl = "https://www.youngsextube.com"
-                       default_cover = "file://%s/youngsextube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.mode == "youngporno":
                        self.portal = "YoungPorno.com"
                        self.baseurl = "https://www.youngporno.com"
@@ -122,18 +114,6 @@ class porntvGenreScreen(MPScreen):
                        self.portal = "MovieTitan.com"
                        self.baseurl = "https://www.movietitan.com"
                        default_cover = "file://%s/movietitan.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.mode == "cartoonsextube":
-                       self.portal = "CartoonSexTube.com"
-                       self.baseurl = "https://www.cartoonsextube.com"
-                       default_cover = "file://%s/cartoonsextube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.mode == "mobilepornmovies":
-                       self.portal = "MobilePornMovies.com"
-                       self.baseurl = "https://www.mobilepornmovies.com"
-                       default_cover = "file://%s/mobilepornmovies.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.mode == "xxxmilfs":
-                       self.portal = "XXXMilfs.com"
-                       self.baseurl = "https://www.xxxmilfs.com"
-                       default_cover = "file://%s/xxxmilfs.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
 
@@ -247,14 +227,10 @@ class porntvFilmScreen(MPScreen, ThumbsHelper):
                        default_cover = "file://%s/analpornvideos.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "HoodTube.com":
                        default_cover = "file://%s/hoodtube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.portal == "BigBoobsTube.com":
-                       default_cover = "file://%s/bigboobstube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "SuzisPorn.com":
                        default_cover = "file://%s/suzisporn.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "MovieShark.com":
                        default_cover = "file://%s/movieshark.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.portal == "YoungSexTube.com":
-                       default_cover = "file://%s/youngsextube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "YoungPorno.com":
                        default_cover = "file://%s/youngporno.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "PornTitan.com":
@@ -263,12 +239,6 @@ class porntvFilmScreen(MPScreen, ThumbsHelper):
                        default_cover = "file://%s/xjizz.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
                elif self.portal == "MovieTitan.com":
                        default_cover = "file://%s/movietitan.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.portal == "CartoonSexTube.com":
-                       default_cover = "file://%s/cartoonsextube.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.portal == "MobilePornMovies.com":
-                       default_cover = "file://%s/mobilepornmovies.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
-               elif self.portal == "XXXMilfs.com":
-                       default_cover = "file://%s/xxxmilfs.png" % (config_mp.mediaportal.iconcachepath.value + "logos")
 
                MPScreen.__init__(self, session, skin='MP_Plugin', default_cover=default_cover)
                ThumbsHelper.__init__(self)
index 1e287aa..8de3409 100644 (file)
@@ -187,13 +187,13 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
                self.page = 1
                if not self.Sort:
                        self.sort = ''
-                       self.sorttext = ''
+                       self.sortname = ''
                elif (re.match(".*?Search", self.Name) or self.Name == "Recommended"):
                        self.sort = ''
-                       self.sorttext = 'Most Relevant'
+                       self.sortname = 'Most Relevant'
                else:
                        self.sort = ''
-                       self.sorttext = 'Newest'
+                       self.sortname = 'Newest'
 
                self.filmliste = []
                self.ml = MenuList([], enableWrapAround=True, content=eListboxPythonMultiContent)
@@ -239,7 +239,7 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
                        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)
+               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:
                                if Image.startswith('//'):
@@ -262,10 +262,9 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
                runtime = self['liste'].getCurrent()[0][3]
                views = self['liste'].getCurrent()[0][4]
                self['name'].setText(title)
-               if not self.Sort:
-                       self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
-               else:
-                       self['handlung'].setText("%s: %s\nRuntime: %s\nViews: %s" % (_("Sort order"),self.sorttext,runtime, views))
+               if self.Sort:
+                       self['extrainfo'].setText("%s: %s" % (_("Sort order"), self.sortname))
+               self['handlung'].setText("Runtime: %s\nViews: %s" % (runtime, views))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keySort(self):
@@ -282,7 +281,7 @@ class redtubeFilmScreen(MPScreen, ThumbsHelper):
        def keySortAction(self, result):
                if result:
                        self.sort = result[1]
-                       self.sorttext = result[0]
+                       self.sortname = result[0]
                        self.loadPage()
 
        def keyOK(self):
index b1b8e02..d4b9c0c 100644 (file)
@@ -319,7 +319,7 @@ class fourtubeSitesScreen(MPScreen, ThumbsHelper):
        def showInfos(self):
                Title = self['liste'].getCurrent()[0][0]
                Image = self['liste'].getCurrent()[0][2]
-               self['handlung'].setText("%s: %s" % (_("Sort order"),self.sort.title()))
+               self['extrainfo'].setText("%s: %s" % (_("Sort order"),self.sort.title()))
                self['name'].setText(Title)
                CoverHelper(self['coverArt']).getCover(Image)
 
@@ -442,7 +442,8 @@ class fourtubeFilmScreen(MPScreen, ThumbsHelper):
                pic = self['liste'].getCurrent()[0][2]
                runtime = self['liste'].getCurrent()[0][3]
                self['name'].setText(title)
-               self['handlung'].setText("%s: %s\n%s: %s\nRuntime: %s" % (_("Sort order"),self.sort.title(),_("Filter"),self.filter[1:].title(),runtime))
+               self['handlung'].setText("Runtime: %s" % runtime)
+               self['extrainfo'].setText("%s: %s / %s: %s" % (_("Sort order"), self.sort.title(), _("Filter"), self.filter[1:].title()))
                CoverHelper(self['coverArt']).getCover(pic)
 
        def keySort(self):
index 212236f..1173b0a 100644 (file)
@@ -134,6 +134,9 @@ class xhamsterGenreScreen(MPScreen):
                                Url = Url + "$$HD$$/newest"
                                self.genreliste.append((decodeHtml(Title), Url))
                self.genreliste.sort()
+               if mp_globals.model in ["one","two","dm900","dm920"]:
+                       self.genreliste.insert(0, ("4K", '%s%s/4k' % (base_url, self.scopeval[self.scope])))
+               self.genreliste.insert(0, ("HD", '%s%s/hd' % (base_url, self.scopeval[self.scope])))
                self.genreliste.insert(0, (400 * "—", None))
                self.genreliste.insert(0, ("Subscriptions", 'subs'))
                self.genreliste.insert(0, ("Favourite Pornstars", 'stars'))
@@ -545,7 +548,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                                url = "https://xhamster.com/movies/" + m[0]
                                self.streamList.append((m[1], None, url, "", "", ""))
                else:
-                       self.getLastPage(data, 'class="pager-section"(.*?)</div>')
+                       self.getLastPage(data, 'class="pager-section"(.*?)</div>', '.*>([0-9,]+)<')
                        if 'video-thumb__date-added' in data:
                                parse = re.search('video-thumb__date-added(.*?)</html>', data, re.S)
                        else:
@@ -765,6 +768,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
 
        def playUrl(self, data):
                Title = self['liste'].getCurrent()[0][0]
+               Link = self['liste'].getCurrent()[0][2]
                url = None
                jsondata = re.findall('window.XPlayer2\("player",\s(.*?{"autoplay":false,"preview":true}})', data, re.S)
                if jsondata:
@@ -778,10 +782,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                                                res = int(str(node["quality"]).replace('p',''))
                                                if res > max:
                                                        max = res
-                                                       if node.has_key("fallback") and "xhcdn.com" in str(node["fallback"]):
-                                                               url = str(node["fallback"])
-                                                       else:
-                                                               url = str(node["url"])
+                                                       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":
@@ -790,10 +791,7 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                                                res = int(str(node["quality"]).replace('p',''))
                                                if res > max:
                                                        max = res
-                                                       if node.has_key("fallback") and "xhcdn.com" in str(node["fallback"]):
-                                                               url = str(node["fallback"])
-                                                       else:
-                                                               url = str(node["url"])
+                                                       url = str(node["url"])
                        for node in jsondata["sources"]["standard"]["mp4"]:
                                if str(node["quality"]) == "auto":
                                        continue
@@ -802,17 +800,14 @@ class xhamsterFilmScreen(MPScreen, ThumbsHelper):
                                        if mp_globals.model in ["one","two"]:
                                                if res > max:
                                                        max = res
-                                                       if node.has_key("fallback") and "xhcdn.com" in str(node["fallback"]):
-                                                               url = str(node["fallback"])
-                                                       else:
-                                                               url = str(node["url"])
+                                                       url = str(node["url"])
                                        else:
                                                if res < 1440 and res > max:
                                                        max = res
-                                                       if node.has_key("fallback") and "xhcdn.com" in str(node["fallback"]):
-                                                               url = str(node["fallback"])
-                                                       else:
-                                                               url = str(node["url"])
+                                                       url = str(node["url"])
                if url:
                        self.keyLocked = False
+                       mp_globals.player_agent = xhAgent
+                       headers = '&Referer=%s' % Link
+                       url = url + '#User-Agent='+mp_globals.player_agent+headers
                        self.session.open(SimplePlayer, [(Title, url)], showPlaylist=False, ltype='xhamster')
\ No newline at end of file
index cc01bf3..1fc964d 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 b1a0937..f643043 100644 (file)
@@ -1,15 +1,15 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: MediaPortal\n"
-"POT-Creation-Date: 2020-02-20 17:03+0100\n"
-"PO-Revision-Date: 2020-02-20 17:03+0100\n"
+"POT-Creation-Date: 2020-03-02 18:27+0100\n"
+"PO-Revision-Date: 2020-03-02 18:28+0100\n"
 "Last-Translator: dhwz <dhwz@gmx.net>\n"
 "Language-Team: MediaPortal Team\n"
 "Language: de_DE\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.4\n"
+"X-Generator: Poedit 2.3\n"
 "X-Poedit-Basepath: ../../../..\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-SourceCharset: UTF-8\n"
@@ -47,54 +47,50 @@ msgstr ""
 #: mpgz/src/additions/useradditions/movie4k.py:776
 #: src/additions/fun/failto.py:65 src/additions/fun/retrotv.py:68
 #: src/additions/fun/twitch.py:135 src/additions/mediatheken/srg.py:181
-#: src/additions/music/radio.py:298 src/additions/porn/ahme.py:186
+#: src/additions/music/radio.py:296 src/additions/porn/ahme.py:186
 #: src/additions/porn/anyporn.py:286 src/additions/porn/beeg.py:141
-#: src/additions/porn/befuck.py:140 src/additions/porn/bongacams.py:132
-#: src/additions/porn/brazzers.py:145 src/additions/porn/cam4.py:171
-#: src/additions/porn/camhub.py:128 src/additions/porn/chaturbate.py:181
-#: src/additions/porn/cliphunter.py:170 src/additions/porn/cliphunter.py:240
-#: src/additions/porn/crocotube.py:144 src/additions/porn/cumlouder.py:287
-#: src/additions/porn/cumlouder.py:361 src/additions/porn/cumlouder.py:436
-#: src/additions/porn/dachix.py:159 src/additions/porn/ddfnetwork.py:163
-#: src/additions/porn/ddfnetwork.py:239 src/additions/porn/drtuber.py:192
-#: src/additions/porn/eporner.py:165 src/additions/porn/eroprofile.py:139
-#: src/additions/porn/extremetube.py:167 src/additions/porn/faapy.py:147
-#: src/additions/porn/faapy.py:213 src/additions/porn/freeones.py:161
-#: src/additions/porn/hclips.py:163 src/additions/porn/hdzog.py:167
+#: src/additions/porn/bongacams.py:132 src/additions/porn/brazzers.py:145
+#: src/additions/porn/cam4.py:171 src/additions/porn/camhub.py:128
+#: src/additions/porn/chaturbate.py:181 src/additions/porn/cliphunter.py:170
+#: src/additions/porn/cliphunter.py:240 src/additions/porn/crocotube.py:144
+#: src/additions/porn/cumlouder.py:287 src/additions/porn/cumlouder.py:361
+#: src/additions/porn/cumlouder.py:436 src/additions/porn/dachix.py:159
+#: src/additions/porn/drtuber.py:192 src/additions/porn/eporner.py:165
+#: src/additions/porn/eroprofile.py:139 src/additions/porn/extremetube.py:167
+#: src/additions/porn/faapy.py:147 src/additions/porn/faapy.py:213
+#: src/additions/porn/freeones.py:161 src/additions/porn/hdzog.py:167
 #: src/additions/porn/homemoviestube.py:166 src/additions/porn/hotmovs.py:166
-#: src/additions/porn/hotscope.py:148 src/additions/porn/kink.py:147
-#: src/additions/porn/lovehomeporn.py:143 src/additions/porn/mofos.py:136
-#: src/additions/porn/mofos.py:212 src/additions/porn/moviefap.py:134
-#: src/additions/porn/nubilefilms.py:132 src/additions/porn/nubilefilms.py:206
-#: src/additions/porn/pinflix.py:232 src/additions/porn/pinflix.py:367
-#: src/additions/porn/porn7.py:216 src/additions/porn/porndoe.py:147
-#: src/additions/porn/porngo.py:72 src/additions/porn/porngo.py:202
-#: src/additions/porn/pornhat.py:176 src/additions/porn/pornhub.py:345
-#: src/additions/porn/pornhub.py:516 src/additions/porn/pornhub.py:680
-#: src/additions/porn/pornhub.py:929 src/additions/porn/pornhub.py:1066
-#: src/additions/porn/pornicom.py:200 src/additions/porn/pornid.py:197
-#: src/additions/porn/pornoreino.py:128 src/additions/porn/pornoxo.py:182
-#: src/additions/porn/pornrabbit.py:176 src/additions/porn/porntv.py:292
-#: src/additions/porn/pornxio.py:264 src/additions/porn/realgfporn.py:160
-#: src/additions/porn/redtube.py:181 src/additions/porn/sexu.py:131
-#: src/additions/porn/shemalez.py:165 src/additions/porn/shesfreaky.py:139
-#: src/additions/porn/slutload.py:310 src/additions/porn/spankbang.py:167
-#: src/additions/porn/spankwire.py:204 src/additions/porn/sunporno.py:192
-#: src/additions/porn/teamskeet.py:145 src/additions/porn/tnaflix.py:153
-#: src/additions/porn/tube8.py:208 src/additions/porn/tubepornclassic.py:159
-#: src/additions/porn/tubewolf.py:162 src/additions/porn/txxx.py:78
-#: src/additions/porn/txxx.py:274 src/additions/porn/updatetube.py:183
+#: src/additions/porn/hotscope.py:148 src/additions/porn/lovehomeporn.py:143
+#: src/additions/porn/mofos.py:136 src/additions/porn/mofos.py:212
+#: src/additions/porn/moviefap.py:134 src/additions/porn/nubilefilms.py:132
+#: src/additions/porn/nubilefilms.py:206 src/additions/porn/pinflix.py:232
+#: src/additions/porn/pinflix.py:367 src/additions/porn/porn7.py:210
+#: src/additions/porn/porndoe.py:147 src/additions/porn/porngo.py:72
+#: src/additions/porn/porngo.py:202 src/additions/porn/pornhat.py:176
+#: src/additions/porn/pornhub.py:345 src/additions/porn/pornhub.py:516
+#: src/additions/porn/pornhub.py:680 src/additions/porn/pornhub.py:929
+#: src/additions/porn/pornhub.py:1066 src/additions/porn/pornicom.py:200
+#: src/additions/porn/pornid.py:197 src/additions/porn/pornoreino.py:128
+#: src/additions/porn/pornoxo.py:182 src/additions/porn/pornrabbit.py:176
+#: src/additions/porn/porntv.py:292 src/additions/porn/pornxio.py:264
+#: src/additions/porn/realgfporn.py:160 src/additions/porn/redtube.py:181
+#: src/additions/porn/sexu.py:131 src/additions/porn/shemalez.py:165
+#: src/additions/porn/shesfreaky.py:139 src/additions/porn/slutload.py:310
+#: src/additions/porn/spankbang.py:167 src/additions/porn/spankwire.py:204
+#: src/additions/porn/sunporno.py:192 src/additions/porn/teamskeet.py:145
+#: src/additions/porn/tnaflix.py:153 src/additions/porn/tube8.py:208
+#: src/additions/porn/tubepornclassic.py:159 src/additions/porn/tubewolf.py:162
+#: src/additions/porn/txxx.py:89 src/additions/porn/txxx.py:297
 #: src/additions/porn/upornia.py:166 src/additions/porn/vintagetube.py:252
 #: src/additions/porn/vjav.py:165 src/additions/porn/voyeurhit.py:167
-#: src/additions/porn/vporn.py:192 src/additions/porn/wetplace.py:137
-#: src/additions/porn/x4tube.py:245 src/additions/porn/x4tube.py:373
-#: src/additions/porn/xhamster.py:497 src/additions/porn/xhamster.py:623
-#: src/additions/porn/xnxx.py:301 src/additions/porn/xpaja.py:148
-#: src/additions/porn/xvideos.py:291 src/additions/porn/xvideos.py:489
-#: src/additions/porn/xxxdan.py:166 src/additions/porn/youjizz.py:171
-#: src/additions/porn/youporn.py:316 src/additions/porn/youporn.py:383
-#: src/plugin.py:2022 src/plugin.py:2272 src/plugin.py:3044 src/plugin.py:3063
-#: src/resources/showAsThumb.py:245
+#: src/additions/porn/vporn.py:192 src/additions/porn/x4tube.py:245
+#: src/additions/porn/x4tube.py:373 src/additions/porn/xhamster.py:500
+#: src/additions/porn/xhamster.py:626 src/additions/porn/xnxx.py:301
+#: src/additions/porn/xpaja.py:148 src/additions/porn/xvideos.py:291
+#: src/additions/porn/xvideos.py:489 src/additions/porn/xxxdan.py:166
+#: src/additions/porn/youjizz.py:171 src/additions/porn/youporn.py:316
+#: src/additions/porn/youporn.py:383 src/plugin.py:2022 src/plugin.py:2272
+#: src/plugin.py:3044 src/plugin.py:3063 src/resources/showAsThumb.py:245
 msgid "Page"
 msgstr "Seite"
 
@@ -145,55 +141,52 @@ msgstr "Seite"
 #: src/additions/mediatheken/spiegeltv.py:154
 #: src/additions/mediatheken/srg.py:187
 #: src/additions/mediatheken/youtube.py:879
-#: src/additions/mediatheken/zdf.py:403 src/additions/music/radio.py:336
+#: src/additions/mediatheken/zdf.py:403 src/additions/music/radio.py:334
 #: src/additions/newsdoku/autobild.py:105 src/additions/newsdoku/bild.py:153
 #: src/additions/newsdoku/doku_to.py:94 src/additions/newsdoku/dokus4_me.py:129
 #: src/additions/newsdoku/wissen.py:64 src/additions/porn/ahme.py:188
 #: src/additions/porn/anyporn.py:288 src/additions/porn/beeg.py:143
-#: src/additions/porn/befuck.py:142 src/additions/porn/bongacams.py:134
-#: src/additions/porn/brazzers.py:147 src/additions/porn/cam4.py:173
-#: src/additions/porn/camhub.py:130 src/additions/porn/chaturbate.py:183
-#: src/additions/porn/cliphunter.py:172 src/additions/porn/cliphunter.py:242
-#: src/additions/porn/crocotube.py:146 src/additions/porn/cumlouder.py:289
-#: src/additions/porn/cumlouder.py:363 src/additions/porn/cumlouder.py:440
-#: src/additions/porn/dachix.py:161 src/additions/porn/ddfnetwork.py:165
-#: src/additions/porn/ddfnetwork.py:241 src/additions/porn/drtuber.py:193
-#: src/additions/porn/eporner.py:167 src/additions/porn/eroprofile.py:141
-#: src/additions/porn/extremetube.py:169 src/additions/porn/faapy.py:148
-#: src/additions/porn/faapy.py:215 src/additions/porn/freeones.py:163
-#: src/additions/porn/hclips.py:165 src/additions/porn/hdzog.py:169
+#: src/additions/porn/bongacams.py:134 src/additions/porn/brazzers.py:147
+#: src/additions/porn/cam4.py:173 src/additions/porn/camhub.py:130
+#: src/additions/porn/chaturbate.py:183 src/additions/porn/cliphunter.py:172
+#: src/additions/porn/cliphunter.py:242 src/additions/porn/crocotube.py:146
+#: src/additions/porn/cumlouder.py:289 src/additions/porn/cumlouder.py:363
+#: src/additions/porn/cumlouder.py:440 src/additions/porn/dachix.py:161
+#: src/additions/porn/drtuber.py:193 src/additions/porn/eporner.py:167
+#: src/additions/porn/eroprofile.py:141 src/additions/porn/extremetube.py:169
+#: src/additions/porn/faapy.py:148 src/additions/porn/faapy.py:215
+#: src/additions/porn/freeones.py:163 src/additions/porn/hdzog.py:169
 #: src/additions/porn/homemoviestube.py:170 src/additions/porn/hotmovs.py:168
-#: src/additions/porn/hotscope.py:150 src/additions/porn/kink.py:149
-#: src/additions/porn/lovehomeporn.py:145 src/additions/porn/mofos.py:138
-#: src/additions/porn/mofos.py:214 src/additions/porn/moviefap.py:136
-#: src/additions/porn/nubilefilms.py:134 src/additions/porn/nubilefilms.py:208
-#: src/additions/porn/pinflix.py:235 src/additions/porn/pinflix.py:370
-#: src/additions/porn/porn7.py:218 src/additions/porn/porndoe.py:151
-#: src/additions/porn/porngo.py:73 src/additions/porn/porngo.py:204
-#: src/additions/porn/pornhat.py:178 src/additions/porn/pornhub.py:348
-#: src/additions/porn/pornhub.py:519 src/additions/porn/pornhub.py:683
-#: src/additions/porn/pornhub.py:932 src/additions/porn/pornhub.py:1068
-#: src/additions/porn/pornicom.py:202 src/additions/porn/pornid.py:199
-#: src/additions/porn/pornoreino.py:130 src/additions/porn/pornoxo.py:184
-#: src/additions/porn/pornrabbit.py:178 src/additions/porn/porntv.py:294
-#: src/additions/porn/pornxio.py:266 src/additions/porn/realgfporn.py:162
-#: src/additions/porn/redtube.py:185 src/additions/porn/sexu.py:133
-#: src/additions/porn/shemalez.py:167 src/additions/porn/shesfreaky.py:141
-#: src/additions/porn/slutload.py:312 src/additions/porn/spankbang.py:173
-#: src/additions/porn/spankwire.py:233 src/additions/porn/sunporno.py:194
-#: src/additions/porn/teamskeet.py:147 src/additions/porn/tnaflix.py:155
-#: src/additions/porn/tube8.py:212 src/additions/porn/tubepornclassic.py:161
-#: src/additions/porn/tubewolf.py:164 src/additions/porn/txxx.py:79
-#: src/additions/porn/txxx.py:276 src/additions/porn/updatetube.py:185
+#: src/additions/porn/hotscope.py:150 src/additions/porn/lovehomeporn.py:145
+#: src/additions/porn/mofos.py:138 src/additions/porn/mofos.py:214
+#: src/additions/porn/moviefap.py:136 src/additions/porn/nubilefilms.py:134
+#: src/additions/porn/nubilefilms.py:208 src/additions/porn/pinflix.py:235
+#: src/additions/porn/pinflix.py:370 src/additions/porn/porn7.py:212
+#: src/additions/porn/porndoe.py:151 src/additions/porn/porngo.py:73
+#: src/additions/porn/porngo.py:204 src/additions/porn/pornhat.py:178
+#: src/additions/porn/pornhub.py:348 src/additions/porn/pornhub.py:519
+#: src/additions/porn/pornhub.py:683 src/additions/porn/pornhub.py:932
+#: src/additions/porn/pornhub.py:1068 src/additions/porn/pornicom.py:202
+#: src/additions/porn/pornid.py:199 src/additions/porn/pornoreino.py:130
+#: src/additions/porn/pornoxo.py:184 src/additions/porn/pornrabbit.py:178
+#: src/additions/porn/porntv.py:294 src/additions/porn/pornxio.py:266
+#: src/additions/porn/realgfporn.py:162 src/additions/porn/redtube.py:185
+#: src/additions/porn/sexu.py:133 src/additions/porn/shemalez.py:167
+#: src/additions/porn/shesfreaky.py:141 src/additions/porn/slutload.py:312
+#: src/additions/porn/spankbang.py:173 src/additions/porn/spankwire.py:233
+#: src/additions/porn/sunporno.py:194 src/additions/porn/teamskeet.py:147
+#: src/additions/porn/tnaflix.py:155 src/additions/porn/tube8.py:212
+#: src/additions/porn/tubepornclassic.py:161 src/additions/porn/tubewolf.py:164
+#: src/additions/porn/txxx.py:90 src/additions/porn/txxx.py:299
 #: src/additions/porn/upornia.py:168 src/additions/porn/vintagetube.py:191
 #: src/additions/porn/vintagetube.py:283 src/additions/porn/vjav.py:167
 #: src/additions/porn/voyeurhit.py:169 src/additions/porn/vporn.py:197
-#: src/additions/porn/wetplace.py:139 src/additions/porn/x4tube.py:248
-#: src/additions/porn/x4tube.py:377 src/additions/porn/xhamster.py:499
-#: src/additions/porn/xnxx.py:306 src/additions/porn/xpaja.py:150
-#: src/additions/porn/xvideos.py:294 src/additions/porn/xvideos.py:498
-#: src/additions/porn/xxxdan.py:170 src/additions/porn/youjizz.py:173
-#: src/additions/porn/youporn.py:318 src/additions/porn/youporn.py:385
+#: src/additions/porn/x4tube.py:248 src/additions/porn/x4tube.py:377
+#: src/additions/porn/xhamster.py:502 src/additions/porn/xnxx.py:306
+#: src/additions/porn/xpaja.py:150 src/additions/porn/xvideos.py:294
+#: src/additions/porn/xvideos.py:498 src/additions/porn/xxxdan.py:170
+#: src/additions/porn/youjizz.py:173 src/additions/porn/youporn.py:318
+#: src/additions/porn/youporn.py:385
 msgid "Page:"
 msgstr "Seite:"
 
@@ -261,6 +254,7 @@ msgstr "Seite:"
 #: src/additions/mediatheken/netzkino.py:144
 #: src/additions/mediatheken/orf.py:123 src/additions/mediatheken/orf.py:180
 #: src/additions/mediatheken/orf.py:239
+#: src/additions/mediatheken/popcorntimes.py:146
 #: src/additions/mediatheken/servustv.py:135
 #: src/additions/mediatheken/southpark.py:144
 #: src/additions/mediatheken/southpark.py:226
@@ -270,14 +264,13 @@ msgstr "Seite:"
 #: src/additions/mediatheken/zdf.py:156 src/additions/mediatheken/zdf.py:284
 #: src/additions/mediatheken/zdf.py:293 src/additions/mediatheken/zdf.py:393
 #: src/additions/mediatheken/zdf.py:589 src/additions/music/mtvdecharts.py:191
-#: src/additions/music/radio.py:311 src/additions/music/shoutcast.py:85
-#: src/additions/music/shoutcast.py:214 src/additions/newsdoku/bild.py:131
-#: src/additions/newsdoku/doku_to.py:138
+#: src/additions/music/radio.py:309 src/additions/music/shoutcast.py:85
+#: src/additions/music/shoutcast.py:214 src/additions/music/tunein.py:116
+#: src/additions/newsdoku/bild.py:131 src/additions/newsdoku/doku_to.py:138
 #: src/additions/newsdoku/dokus4_me.py:164 src/additions/newsdoku/focus.py:121
 #: src/additions/newsdoku/urknall.py:75 src/additions/porn/ahme.py:202
 #: src/additions/porn/anyporn.py:113 src/additions/porn/anyporn.py:285
-#: src/additions/porn/beeg.py:157 src/additions/porn/befuck.py:60
-#: src/additions/porn/befuck.py:139 src/additions/porn/bongacams.py:147
+#: src/additions/porn/beeg.py:157 src/additions/porn/bongacams.py:147
 #: src/additions/porn/bongacams.py:207 src/additions/porn/brazzers.py:72
 #: src/additions/porn/brazzers.py:160 src/additions/porn/cam4.py:79
 #: src/additions/porn/cam4.py:186 src/additions/porn/cam4.py:249
@@ -290,50 +283,46 @@ msgstr "Seite:"
 #: src/additions/porn/cumlouder.py:162 src/additions/porn/cumlouder.py:231
 #: src/additions/porn/cumlouder.py:302 src/additions/porn/cumlouder.py:376
 #: src/additions/porn/cumlouder.py:462 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/drtuber.py:206 src/additions/porn/eporner.py:180
-#: src/additions/porn/eroprofile.py:155 src/additions/porn/extremetube.py:182
-#: src/additions/porn/faapy.py:154 src/additions/porn/faapy.py:228
-#: src/additions/porn/freeones.py:176 src/additions/porn/hclips.py:178
+#: src/additions/porn/dachix.py:158 src/additions/porn/drtuber.py:206
+#: src/additions/porn/eporner.py:180 src/additions/porn/eroprofile.py:155
+#: src/additions/porn/extremetube.py:182 src/additions/porn/faapy.py:154
+#: src/additions/porn/faapy.py:228 src/additions/porn/freeones.py:176
 #: 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/kink.py:162
-#: src/additions/porn/lovehomeporn.py:157 src/additions/porn/mofos.py:72
-#: src/additions/porn/mofos.py:151 src/additions/porn/mofos.py:227
-#: src/additions/porn/moviefap.py:149 src/additions/porn/nubilefilms.py:71
-#: src/additions/porn/nubilefilms.py:147 src/additions/porn/nubilefilms.py:221
-#: src/additions/porn/pinflix.py:253 src/additions/porn/pinflix.py:392
-#: src/additions/porn/porn7.py:231 src/additions/porn/porn7.py:285
-#: src/additions/porn/porndoe.py:169 src/additions/porn/porngo.py:217
-#: src/additions/porn/pornhat.py:86 src/additions/porn/pornhat.py:191
-#: src/additions/porn/pornhat.py:227 src/additions/porn/pornhub.py:1097
-#: src/additions/porn/pornhub.py:1355 src/additions/porn/pornicom.py:215
-#: src/additions/porn/pornicom.py:282 src/additions/porn/pornid.py:212
-#: src/additions/porn/pornid.py:288 src/additions/porn/pornoreino.py:143
-#: src/additions/porn/pornoreino.py:189 src/additions/porn/pornoxo.py:197
-#: src/additions/porn/pornrabbit.py:191 src/additions/porn/porntv.py:163
-#: src/additions/porn/porntv.py:307 src/additions/porn/pornxio.py:279
-#: src/additions/porn/pornxio.py:348 src/additions/porn/realgfporn.py:175
-#: src/additions/porn/redtube.py:206 src/additions/porn/sexu.py:69
-#: src/additions/porn/sexu.py:146 src/additions/porn/shemalez.py:180
-#: src/additions/porn/shesfreaky.py:72 src/additions/porn/shesfreaky.py:154
-#: src/additions/porn/slutload.py:148 src/additions/porn/slutload.py:326
-#: src/additions/porn/slutload.py:487 src/additions/porn/spankbang.py:204
-#: src/additions/porn/spankwire.py:87 src/additions/porn/spankwire.py:218
-#: src/additions/porn/sunporno.py:86 src/additions/porn/sunporno.py:207
-#: src/additions/porn/teamskeet.py:73 src/additions/porn/teamskeet.py:160
-#: src/additions/porn/tnaflix.py:168 src/additions/porn/tube8.py:236
-#: src/additions/porn/tubepornclassic.py:174 src/additions/porn/tubewolf.py:87
-#: src/additions/porn/tubewolf.py:161 src/additions/porn/txxx.py:289
-#: src/additions/porn/updatetube.py:92 src/additions/porn/updatetube.py:198
-#: src/additions/porn/upornia.py:181 src/additions/porn/vintagetube.py:87
-#: src/additions/porn/vintagetube.py:181 src/additions/porn/vintagetube.py:266
-#: src/additions/porn/vintagetube.py:326 src/additions/porn/vjav.py:180
-#: src/additions/porn/voyeurhit.py:182 src/additions/porn/vporn.py:221
-#: src/additions/porn/wetplace.py:152 src/additions/porn/x4tube.py:264
+#: src/additions/porn/hotscope.py:216 src/additions/porn/lovehomeporn.py:157
+#: src/additions/porn/mofos.py:72 src/additions/porn/mofos.py:151
+#: src/additions/porn/mofos.py:227 src/additions/porn/moviefap.py:149
+#: src/additions/porn/nubilefilms.py:71 src/additions/porn/nubilefilms.py:147
+#: src/additions/porn/nubilefilms.py:221 src/additions/porn/pinflix.py:253
+#: src/additions/porn/pinflix.py:392 src/additions/porn/porn7.py:225
+#: src/additions/porn/porn7.py:279 src/additions/porn/porndoe.py:169
+#: src/additions/porn/porngo.py:217 src/additions/porn/pornhat.py:86
+#: src/additions/porn/pornhat.py:191 src/additions/porn/pornhat.py:227
+#: src/additions/porn/pornhub.py:1097 src/additions/porn/pornhub.py:1355
+#: src/additions/porn/pornicom.py:215 src/additions/porn/pornicom.py:282
+#: src/additions/porn/pornid.py:212 src/additions/porn/pornid.py:288
+#: src/additions/porn/pornoreino.py:143 src/additions/porn/pornoreino.py:189
+#: src/additions/porn/pornoxo.py:197 src/additions/porn/pornrabbit.py:191
+#: src/additions/porn/porntv.py:163 src/additions/porn/porntv.py:307
+#: src/additions/porn/pornxio.py:279 src/additions/porn/pornxio.py:348
+#: src/additions/porn/realgfporn.py:175 src/additions/porn/redtube.py:206
+#: src/additions/porn/sexu.py:69 src/additions/porn/sexu.py:146
+#: src/additions/porn/shemalez.py:180 src/additions/porn/shesfreaky.py:72
+#: src/additions/porn/shesfreaky.py:154 src/additions/porn/slutload.py:148
+#: src/additions/porn/slutload.py:326 src/additions/porn/slutload.py:487
+#: src/additions/porn/spankbang.py:204 src/additions/porn/spankwire.py:87
+#: src/additions/porn/spankwire.py:218 src/additions/porn/sunporno.py:86
+#: src/additions/porn/sunporno.py:207 src/additions/porn/teamskeet.py:73
+#: src/additions/porn/teamskeet.py:160 src/additions/porn/tnaflix.py:168
+#: src/additions/porn/tube8.py:236 src/additions/porn/tubepornclassic.py:174
+#: src/additions/porn/tubewolf.py:87 src/additions/porn/tubewolf.py:161
+#: src/additions/porn/txxx.py:312 src/additions/porn/upornia.py:181
+#: src/additions/porn/vintagetube.py:87 src/additions/porn/vintagetube.py:181
+#: src/additions/porn/vintagetube.py:266 src/additions/porn/vintagetube.py:326
+#: src/additions/porn/vjav.py:180 src/additions/porn/voyeurhit.py:182
+#: src/additions/porn/vporn.py:221 src/additions/porn/x4tube.py:264
 #: src/additions/porn/x4tube.py:392 src/additions/porn/xhamster.py:121
-#: src/additions/porn/xhamster.py:523 src/additions/porn/xnxx.py:101
+#: src/additions/porn/xhamster.py:526 src/additions/porn/xnxx.py:101
 #: src/additions/porn/xnxx.py:329 src/additions/porn/xpaja.py:164
 #: src/additions/porn/xvideos.py:101 src/additions/porn/xvideos.py:314
 #: src/additions/porn/xvideos.py:522 src/additions/porn/xxxdan.py:189
@@ -362,33 +351,33 @@ msgstr "Bitte warten..."
 #: 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/popcorntimes.py:184
 #: src/additions/mediatheken/spiegeltv.py:194
 #: src/additions/mediatheken/youtube.py:1622 src/additions/newsdoku/bild.py:162
 #: src/additions/porn/ahme.py:217 src/additions/porn/anyporn.py:358
 #: src/additions/porn/beeg.py:191 src/additions/porn/brazzers.py:180
 #: src/additions/porn/camhub.py:165 src/additions/porn/cliphunter.py:273
 #: src/additions/porn/crocotube.py:175 src/additions/porn/cumlouder.py:496
-#: src/additions/porn/ddfnetwork.py:275 src/additions/porn/drtuber.py:220
-#: src/additions/porn/eroprofile.py:177 src/additions/porn/extremetube.py:207
-#: src/additions/porn/faapy.py:245 src/additions/porn/hclips.py:194
+#: src/additions/porn/drtuber.py:220 src/additions/porn/eroprofile.py:177
+#: src/additions/porn/extremetube.py:207 src/additions/porn/faapy.py:245
 #: src/additions/porn/hdzog.py:203 src/additions/porn/homemoviestube.py:211
 #: src/additions/porn/hotmovs.py:209 src/additions/porn/hotscope.py:182
-#: src/additions/porn/kink.py:180 src/additions/porn/lovehomeporn.py:176
-#: src/additions/porn/mofos.py:244 src/additions/porn/moviefap.py:164
-#: src/additions/porn/nubilefilms.py:242 src/additions/porn/porn7.py:264
-#: src/additions/porn/porndoe.py:193 src/additions/porn/porngo.py:233
-#: src/additions/porn/pornhat.py:208 src/additions/porn/pornicom.py:254
-#: src/additions/porn/pornid.py:260 src/additions/porn/pornoreino.py:167
-#: src/additions/porn/pornxio.py:321 src/additions/porn/redtube.py:252
-#: src/additions/porn/shemalez.py:202 src/additions/porn/slutload.py:462
-#: src/additions/porn/spankwire.py:247 src/additions/porn/sunporno.py:227
-#: src/additions/porn/teamskeet.py:184 src/additions/porn/tnaflix.py:183
-#: src/additions/porn/tubepornclassic.py:193 src/additions/porn/tubewolf.py:200
-#: src/additions/porn/txxx.py:325 src/additions/porn/upornia.py:212
-#: src/additions/porn/vintagetube.py:309 src/additions/porn/vjav.py:205
-#: src/additions/porn/voyeurhit.py:201 src/additions/porn/vporn.py:243
-#: src/additions/porn/x4tube.py:433 src/additions/porn/xhamster.py:578
-#: src/additions/porn/xxxdan.py:213 src/additions/porn/youporn.py:416
+#: src/additions/porn/lovehomeporn.py:176 src/additions/porn/mofos.py:244
+#: src/additions/porn/moviefap.py:164 src/additions/porn/nubilefilms.py:242
+#: src/additions/porn/porn7.py:258 src/additions/porn/porndoe.py:193
+#: src/additions/porn/porngo.py:233 src/additions/porn/pornhat.py:208
+#: src/additions/porn/pornicom.py:254 src/additions/porn/pornid.py:260
+#: src/additions/porn/pornoreino.py:167 src/additions/porn/pornxio.py:321
+#: src/additions/porn/redtube.py:252 src/additions/porn/shemalez.py:202
+#: src/additions/porn/slutload.py:462 src/additions/porn/spankwire.py:247
+#: src/additions/porn/sunporno.py:227 src/additions/porn/teamskeet.py:184
+#: src/additions/porn/tnaflix.py:183 src/additions/porn/tubepornclassic.py:193
+#: src/additions/porn/tubewolf.py:200 src/additions/porn/txxx.py:348
+#: src/additions/porn/upornia.py:212 src/additions/porn/vintagetube.py:309
+#: src/additions/porn/vjav.py:205 src/additions/porn/voyeurhit.py:201
+#: src/additions/porn/vporn.py:243 src/additions/porn/x4tube.py:433
+#: src/additions/porn/xhamster.py:581 src/additions/porn/xxxdan.py:213
+#: src/additions/porn/youporn.py:416
 msgid "No videos found!"
 msgstr "Keine Videos gefunden!"
 
@@ -463,17 +452,16 @@ 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:1289
-#: src/additions/porn/xhamster.py:498 src/additions/porn/xhamster.py:624
+#: src/additions/porn/xhamster.py:501 src/additions/porn/xhamster.py:627
 #: src/additions/porn/xnxx.py:304 src/additions/porn/xvideos.py:496
 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/ddfnetwork.py:195 src/additions/porn/mofos.py:168
+#: mpgz/src/additions/porn/mydirtyhobby.py:125 src/additions/porn/mofos.py:168
 #: src/additions/porn/nubilefilms.py:162 src/additions/porn/pornhub.py:714
-#: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:393
+#: src/additions/porn/x4tube.py:295 src/additions/porn/xhamster.py:396
 #: src/additions/porn/xvideos.py:356
 msgid "No pornstars found!"
 msgstr "Keine Pornstars gefunden!"
@@ -557,7 +545,7 @@ msgstr "Sortierreihenfolge"
 #: src/additions/porn/tube8.py:317 src/additions/porn/vporn.py:277
 #: src/additions/porn/vporn.py:289 src/additions/porn/x4tube.py:312
 #: src/additions/porn/x4tube.py:452 src/additions/porn/x4tube.py:463
-#: src/additions/porn/xhamster.py:687 src/additions/porn/xnxx.py:415
+#: src/additions/porn/xhamster.py:690 src/additions/porn/xnxx.py:415
 #: src/additions/porn/xvideos.py:370 src/additions/porn/xvideos.py:382
 #: src/additions/porn/xvideos.py:651 src/additions/porn/xvideos.py:666
 #: src/additions/porn/xvideos.py:688 src/additions/porn/xvideos.py:726
@@ -578,13 +566,15 @@ msgstr "Defektes URL Parsing, bitte an die Entwickler melden."
 #: mpgz/src/additions/useradditions/serienstream.py:37
 #: mpgz/src/additions/useradditions/serienstream.py:105
 #: mpgz/src/additions/useradditions/serienstream.py:107
-#: src/additions/music/radio.py:92 src/additions/music/radio.py:151
-#: src/additions/music/radio.py:153 src/additions/music/shoutcast.py:73
+#: src/additions/music/radio.py:91 src/additions/music/radio.py:148
+#: src/additions/music/radio.py:150 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:295
-#: src/additions/porn/pornhub.py:297 src/additions/porn/youporn.py:77
-#: src/additions/porn/youporn.py:221 src/additions/porn/youporn.py:223
-#: src/plugin.py:500 src/resources/simpleplayer.py:2268
+#: src/additions/music/tunein.py:104 src/additions/music/tunein.py:322
+#: src/additions/music/tunein.py:324 src/additions/porn/pornhub.py:137
+#: src/additions/porn/pornhub.py:295 src/additions/porn/pornhub.py:297
+#: src/additions/porn/youporn.py:77 src/additions/porn/youporn.py:221
+#: src/additions/porn/youporn.py:223 src/plugin.py:500
+#: src/resources/simpleplayer.py:2268
 msgid "Setup"
 msgstr "Einstellungen"
 
@@ -717,9 +707,9 @@ msgstr "Keine Episoden gefunden!"
 #: mpgz/src/additions/useradditions/kinoxto.py:648
 #: mpgz/src/additions/useradditions/serienstream.py:391
 #: src/additions/fun/twitch.py:134 src/additions/mediatheken/youtube.py:871
-#: src/additions/music/radio.py:430 src/additions/music/shoutcast.py:327
-#: src/additions/porn/x2search4porn.py:80 src/resources/simplelist.py:528
-#: src/resources/simpleplayer.py:633
+#: src/additions/music/radio.py:428 src/additions/music/shoutcast.py:327
+#: src/additions/music/tunein.py:364 src/additions/porn/x2search4porn.py:80
+#: src/resources/simplelist.py:528 src/resources/simpleplayer.py:633
 msgid "Delete"
 msgstr "Löschen"
 
@@ -747,7 +737,7 @@ msgstr "PIN eingeben"
 #: mpgz/src/additions/useradditions/movie4k.py:654
 #: mpgz/src/additions/useradditions/movie4k.py:742
 #: mpgz/src/additions/useradditions/movie4k.py:746
-#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:691
+#: src/additions/mediatheken/kindertube.py:215 src/resources/streams.py:690
 msgid "Stream not found, try another Stream Hoster."
 msgstr "Stream nicht gefunden, versuche einen anderen Stream Hoster."
 
@@ -845,8 +835,9 @@ msgstr "Film Auswahl"
 msgid "any"
 msgstr "alle"
 
-#: src/additions/fun/twitch.py:132 src/additions/music/radio.py:297
-#: src/additions/music/shoutcast.py:202
+#: src/additions/fun/twitch.py:132 src/additions/music/radio.py:295
+#: src/additions/music/shoutcast.py:202 src/additions/music/tunein.py:103
+#: src/additions/music/tunein.py:238
 msgid "Add to Favorites"
 msgstr "Zu Favoriten hinzufügen"
 
@@ -860,13 +851,15 @@ msgstr "Videos"
 
 #: src/additions/fun/twitch.py:143 src/additions/fun/twitch.py:401
 #: src/additions/mediatheken/youtube.py:135
-#: src/additions/mediatheken/youtube.py:437 src/additions/music/radio.py:207
+#: src/additions/mediatheken/youtube.py:437 src/additions/music/radio.py:110
+#: src/additions/music/radio.py:205
 msgid "Language"
 msgstr "Sprache"
 
-#: src/additions/fun/twitch.py:236 src/additions/music/radio.py:456
-#: src/additions/music/shoutcast.py:353 src/resources/simplelist.py:178
-#: src/resources/simplelist.py:331 src/resources/simplelist.py:597
+#: src/additions/fun/twitch.py:236 src/additions/music/radio.py:454
+#: src/additions/music/shoutcast.py:353 src/additions/music/tunein.py:390
+#: src/resources/simplelist.py:178 src/resources/simplelist.py:331
+#: src/resources/simplelist.py:597
 msgid "No entries found!"
 msgstr "Keine Einträge gefunden!"
 
@@ -891,8 +884,8 @@ msgstr "Keine Kanäle gefunden!"
 msgid "Select language"
 msgstr "Wähle Sprache"
 
-#: src/additions/fun/twitch.py:418 src/additions/music/radio.py:407
-#: src/additions/music/shoutcast.py:304
+#: src/additions/fun/twitch.py:418 src/additions/music/radio.py:405
+#: src/additions/music/shoutcast.py:304 src/additions/music/tunein.py:285
 msgid "Selection was added to the favorites."
 msgstr "Auswahl wurde zu den Favoriten hinzugefügt."
 
@@ -903,10 +896,11 @@ msgstr "Derzeit ist kein Live-Stream auf diesem Kanal verfügbar."
 #: src/additions/mediatheken/arte.py:53 src/additions/mediatheken/arte.py:108
 #: src/additions/mediatheken/orf.py:57 src/additions/mediatheken/orf.py:112
 #: src/additions/mediatheken/orf.py:170
-#: src/additions/mediatheken/spiegeltv.py:60 src/additions/music/radio.py:91
-#: src/additions/music/radio.py:190 src/additions/music/radio.py:384
-#: src/additions/music/radio.py:494 src/additions/music/shoutcast.py:72
-#: src/additions/music/shoutcast.py:263 src/resources/tmdb.py:141
+#: src/additions/mediatheken/spiegeltv.py:60 src/additions/music/radio.py:90
+#: src/additions/music/radio.py:188 src/additions/music/radio.py:382
+#: src/additions/music/radio.py:492 src/additions/music/shoutcast.py:72
+#: src/additions/music/shoutcast.py:263 src/additions/music/tunein.py:102
+#: src/resources/tmdb.py:141
 msgid "Genre:"
 msgstr "Genre:"
 
@@ -930,7 +924,7 @@ msgstr "Dieses Video ist nicht verfügbar."
 
 #: src/additions/mediatheken/dreisat.py:272
 #: src/additions/mediatheken/youtube.py:1482
-#: src/additions/mediatheken/youtube.py:1500
+#: src/additions/mediatheken/youtube.py:1500 src/additions/music/tunein.py:225
 msgid "No contents / results found!"
 msgstr "Keine Inhalte / Ergebnisse gefunden!"
 
@@ -944,7 +938,7 @@ msgid "Please wait while Netflix is started..."
 msgstr "Bitte warten Sie, während Netflix gestartet wird..."
 
 #: src/additions/mediatheken/netflix.py:81
-#: src/additions/mediatheken/primevideo.py:91 src/additions/sport/dazn.py:81
+#: src/additions/mediatheken/primevideo.py:81 src/additions/sport/dazn.py:81
 msgid "This plugin is only available for Dreambox One and Two!"
 msgstr "Dieses Plugin ist nur für Dreambox One und Two verfügbar!"
 
@@ -952,23 +946,11 @@ msgstr "Dieses Plugin ist nur für Dreambox One und Two verfügbar!"
 msgid "Launching Netflix failed!"
 msgstr "Der Start von Netflix ist fehlgeschlagen!"
 
-#: src/additions/mediatheken/primevideo.py:85
+#: src/additions/mediatheken/primevideo.py:78
 msgid "Please wait while Prime Video is started..."
 msgstr "Bitte warten Sie, während Prime Video gestartet wird..."
 
-#: src/additions/mediatheken/primevideo.py:88
-msgid "Please configure your login data first!"
-msgstr "Bitte konfigurieren Sie zuerst Ihre Zugangsdaten!"
-
-#: src/additions/mediatheken/primevideo.py:89
-msgid ""
-"Please configure your login data first via VideoOnDemand plugin in "
-"extensions menu."
-msgstr ""
-"Bitte konfigurieren Sie Ihre Zugangsdaten zunächst über das VideoOnDemand "
-"Plugin im Erweiterungsmenü."
-
-#: src/additions/mediatheken/primevideo.py:111
+#: src/additions/mediatheken/primevideo.py:101
 msgid "Launching Prime Video failed!"
 msgstr "Der Start von Prime Video ist fehlgeschlagen!"
 
@@ -982,7 +964,7 @@ msgstr ""
 "Dieses Video wurde nicht gefunden oder ist auf Grund von Datums oder "
 "Rechtebeschränkungen nicht länger verfügbar."
 
-#: src/additions/mediatheken/tvnow.py:65 src/additions/music/radio.py:296
+#: src/additions/mediatheken/tvnow.py:65 src/additions/music/radio.py:294
 #: src/additions/music/shoutcast.py:201
 msgid "Stations:"
 msgstr "Sender:"
@@ -1093,11 +1075,11 @@ msgstr "Weltweit"
 msgid "Great Britain"
 msgstr "Großbritannien"
 
-#: src/additions/mediatheken/youtube.py:85
+#: src/additions/mediatheken/youtube.py:85 src/additions/music/radio.py:42
 msgid "Germany"
 msgstr "Deutschland"
 
-#: src/additions/mediatheken/youtube.py:86
+#: src/additions/mediatheken/youtube.py:86 src/additions/music/radio.py:42
 msgid "Austria"
 msgstr "Österreich"
 
@@ -1105,27 +1087,27 @@ msgstr "Österreich"
 msgid "Switzerland"
 msgstr "Schweiz"
 
-#: src/additions/mediatheken/youtube.py:88
+#: src/additions/mediatheken/youtube.py:88 src/additions/music/radio.py:42
 msgid "France"
 msgstr "Frankreich"
 
-#: src/additions/mediatheken/youtube.py:89
+#: src/additions/mediatheken/youtube.py:89 src/additions/music/radio.py:42
 msgid "Italy"
 msgstr "Italien"
 
-#: src/additions/mediatheken/youtube.py:90
+#: src/additions/mediatheken/youtube.py:90 src/additions/music/radio.py:42
 msgid "Spain"
 msgstr "Spanien"
 
-#: src/additions/mediatheken/youtube.py:91
+#: src/additions/mediatheken/youtube.py:91 src/additions/music/radio.py:42
 msgid "Portugal"
 msgstr "Portugal"
 
-#: src/additions/mediatheken/youtube.py:92
+#: src/additions/mediatheken/youtube.py:92 src/additions/music/radio.py:42
 msgid "Poland"
 msgstr "Polen"
 
-#: src/additions/mediatheken/youtube.py:93
+#: src/additions/mediatheken/youtube.py:93 src/additions/music/radio.py:42
 msgid "Denmark"
 msgstr "Dänemark"
 
@@ -1133,7 +1115,7 @@ msgstr "Dänemark"
 msgid "Norway"
 msgstr "Norwegen"
 
-#: src/additions/mediatheken/youtube.py:95
+#: src/additions/mediatheken/youtube.py:95 src/additions/music/radio.py:42
 msgid "Sweden"
 msgstr "Schweden"
 
@@ -1287,8 +1269,9 @@ msgstr "Mein Kanal"
 
 #: src/additions/mediatheken/youtube.py:193
 #: src/additions/mediatheken/youtube.py:746
-#: src/additions/mediatheken/youtube.py:829 src/additions/music/radio.py:103
-#: src/additions/music/radio.py:124 src/additions/music/shoutcast.py:105
+#: src/additions/mediatheken/youtube.py:829 src/additions/music/radio.py:102
+#: src/additions/music/radio.py:121 src/additions/music/shoutcast.py:105
+#: src/additions/music/tunein.py:222
 msgid "Favorites"
 msgstr "Favoriten"
 
@@ -1564,56 +1547,69 @@ msgstr "Mit der 'Grünen' Taste wird die Benutzerdatei:"
 msgid "'%s' is loaded."
 msgstr "'%s' geladen."
 
-#: src/additions/music/radio.py:158 src/additions/music/shoutcast.py:162
-msgid "Sort Favorites:"
-msgstr "Sortiere Favoriten:"
+#: src/additions/music/radio.py:42
+msgid "USA"
+msgstr "USA"
 
-#: src/additions/music/radio.py:200 src/additions/music/radio.py:219
+#: src/additions/music/radio.py:103 src/additions/music/radio.py:198
+#: src/additions/music/radio.py:217
 msgid "Local Stations"
 msgstr "Lokale Sender"
 
-#: src/additions/music/radio.py:201 src/additions/music/radio.py:219
-#: src/additions/music/shoutcast.py:103
+#: src/additions/music/radio.py:104 src/additions/music/radio.py:199
+#: src/additions/music/radio.py:217 src/additions/music/shoutcast.py:103
 msgid "Top Stations"
 msgstr "Top Sender"
 
-#: src/additions/music/radio.py:202 src/additions/music/radio.py:219
-#: src/additions/music/shoutcast.py:97
+#: src/additions/music/radio.py:105 src/additions/music/radio.py:200
+#: src/additions/music/radio.py:217 src/additions/music/shoutcast.py:97
 msgid "All Stations"
 msgstr "Alle Sender"
 
-#: src/additions/music/radio.py:203 src/additions/music/shoutcast.py:268
+#: src/additions/music/radio.py:106 src/additions/music/radio.py:201
+#: src/additions/music/shoutcast.py:268
 msgid "Genre"
 msgstr "Genre"
 
-#: src/additions/music/radio.py:204
+#: src/additions/music/radio.py:107 src/additions/music/radio.py:202
 msgid "Topic"
 msgstr "Thema"
 
-#: src/additions/music/radio.py:205 src/additions/music/radio.py:384
-#: src/additions/music/radio.py:494 src/additions/porn/xnxx.py:135
-#: src/additions/porn/xvideos.py:135
+#: src/additions/music/radio.py:108 src/additions/music/radio.py:203
+#: src/additions/music/radio.py:382 src/additions/music/radio.py:492
+#: src/additions/porn/xnxx.py:135 src/additions/porn/xvideos.py:135
 msgid "Country"
 msgstr "Land"
 
-#: src/additions/music/radio.py:206 src/additions/music/radio.py:384
-#: src/additions/music/radio.py:494
+#: src/additions/music/radio.py:109 src/additions/music/radio.py:204
+#: src/additions/music/radio.py:382 src/additions/music/radio.py:492
 msgid "City"
 msgstr "Stadt"
 
-#: src/additions/music/radio.py:219
+#: src/additions/music/radio.py:155
+msgid "Region:"
+msgstr "Region:"
+
+#: src/additions/music/radio.py:156 src/additions/music/shoutcast.py:162
+#: src/additions/music/tunein.py:329
+msgid "Sort Favorites:"
+msgstr "Sortiere Favoriten:"
+
+#: src/additions/music/radio.py:217
 msgid "Recommended Stations"
 msgstr "Empfohlene Sender"
 
-#: src/additions/music/radio.py:344 src/additions/music/shoutcast.py:252
+#: src/additions/music/radio.py:342 src/additions/music/shoutcast.py:252
 msgid "No stations found!"
 msgstr "Keine Sender gefunden!"
 
-#: src/additions/music/radio.py:429 src/additions/music/shoutcast.py:326
+#: src/additions/music/radio.py:427 src/additions/music/shoutcast.py:326
+#: src/additions/music/tunein.py:363
 msgid "Favorites:"
 msgstr "Favoriten:"
 
 #: src/additions/music/shoutcast.py:104 src/additions/music/shoutcast.py:136
+#: src/additions/music/tunein.py:221
 msgid "Search"
 msgstr "Suche"
 
@@ -1626,10 +1622,12 @@ msgid "Listeners"
 msgstr "Zuhörer"
 
 #: src/additions/music/shoutcast.py:263 src/additions/music/shoutcast.py:268
+#: src/additions/music/tunein.py:237
 msgid "Bitrate"
 msgstr "Bitrate"
 
 #: src/additions/music/shoutcast.py:263 src/additions/music/shoutcast.py:268
+#: src/additions/music/tunein.py:237
 msgid "Format"
 msgstr "Format"
 
@@ -1637,6 +1635,18 @@ msgstr "Format"
 msgid "Station"
 msgstr "Sender"
 
+#: src/additions/music/tunein.py:174 src/additions/music/tunein.py:195
+msgid "Station:"
+msgstr "Sender:"
+
+#: src/additions/music/tunein.py:176 src/additions/music/tunein.py:197
+msgid "Show:"
+msgstr "Sendung:"
+
+#: src/additions/music/tunein.py:178 src/additions/music/tunein.py:199
+msgid "Topic:"
+msgstr "Folge:"
+
 #: src/additions/newsdoku/doku_to.py:147
 msgid "No dokus / streams found!"
 msgstr "Keine Dokus / Streams gefunden!"
@@ -1672,8 +1682,7 @@ msgstr "Keine Livestreams gefunden!"
 msgid "Cam is currently offline."
 msgstr "Cam ist zur Zeit offline."
 
-#: src/additions/porn/brazzers.py:105 src/additions/porn/ddfnetwork.py:117
-#: src/additions/porn/kink.py:107 src/additions/porn/mofos.py:102
+#: src/additions/porn/brazzers.py:105 src/additions/porn/mofos.py:102
 #: src/additions/porn/nubilefilms.py:98 src/additions/porn/teamskeet.py:105
 #, python-format
 msgid "%s only works with enabled MP premiumize.me option (MP Setup)!"
@@ -1697,13 +1706,13 @@ msgid "No playlists found!"
 msgstr "Keine Playlist gefunden!"
 
 #: src/additions/porn/pornhub.py:410 src/additions/porn/pornhub.py:429
-#: src/additions/porn/pornhub.py:1340 src/additions/porn/xhamster.py:617
-#: src/additions/porn/xhamster.py:657
+#: src/additions/porn/pornhub.py:1340 src/additions/porn/xhamster.py:620
+#: src/additions/porn/xhamster.py:660
 msgid "Remove Favourite"
 msgstr "Favorit entfernen"
 
 #: src/additions/porn/pornhub.py:432 src/additions/porn/pornhub.py:1343
-#: src/additions/porn/xhamster.py:661
+#: src/additions/porn/xhamster.py:664
 msgid "Add Favourite"
 msgstr "Favorit hinzufügen"
 
@@ -1715,12 +1724,12 @@ msgstr ""
 
 #: src/additions/porn/pornhub.py:515 src/additions/porn/pornhub.py:847
 #: src/additions/porn/pornhub.py:988 src/additions/porn/pornhub.py:1331
-#: src/additions/porn/xhamster.py:279 src/additions/porn/xhamster.py:304
-#: src/additions/porn/xhamster.py:421 src/additions/porn/xhamster.py:641
+#: src/additions/porn/xhamster.py:282 src/additions/porn/xhamster.py:307
+#: src/additions/porn/xhamster.py:424 src/additions/porn/xhamster.py:644
 msgid "Unsubscribe"
 msgstr "Abmelden"
 
-#: src/additions/porn/pornhub.py:590 src/additions/porn/xhamster.py:255
+#: src/additions/porn/pornhub.py:590 src/additions/porn/xhamster.py:258
 msgid "No subscriptions found!"
 msgstr "Keine Abonnements gefunden!"
 
@@ -1730,8 +1739,8 @@ msgid "Unknown error."
 msgstr "Unbekannter Fehler."
 
 #: src/additions/porn/pornhub.py:850 src/additions/porn/pornhub.py:991
-#: src/additions/porn/pornhub.py:1334 src/additions/porn/xhamster.py:309
-#: src/additions/porn/xhamster.py:428 src/additions/porn/xhamster.py:647
+#: src/additions/porn/pornhub.py:1334 src/additions/porn/xhamster.py:312
+#: src/additions/porn/xhamster.py:431 src/additions/porn/xhamster.py:650
 msgid "Subscribe"
 msgstr "Abonnieren"
 
@@ -2967,19 +2976,19 @@ msgstr ""
 "Der Verzeichnispfad beginnt nicht mit '/':\n"
 "%s"
 
-#: src/resources/streams.py:684
+#: src/resources/streams.py:683
 msgid "No supported Stream Hoster, try another one!"
 msgstr "Kein unterstützter Stream Hoster, versuche einen anderen!"
 
-#: src/resources/streams.py:686
+#: src/resources/streams.py:685
 msgid "Invalid Stream link, try another Stream Hoster!"
 msgstr "Ungültiger Stream Link, versuche eine anderen Stream Hoster!"
 
-#: src/resources/streams.py:695
+#: src/resources/streams.py:694
 msgid "This hoster is only working with enabled Premium support."
 msgstr "Dieser Hoster funktioniert nur mit aktivierter Premium-Unterstützung."
 
-#: src/resources/streams.py:697
+#: src/resources/streams.py:696
 msgid ""
 "This Stream link is currently not available via Premium, try another Stream "
 "Hoster."
@@ -2987,7 +2996,7 @@ msgstr ""
 "Dieser Stream ist aktuell nicht über Premium verfügbar, versuche einen "
 "anderen Stream Hoster."
 
-#: src/resources/streams.py:701
+#: src/resources/streams.py:700
 msgid "Unknown error, check MP logfile."
 msgstr "Unbekannter Fehler, MP Logfile überprüfen."
 
@@ -3070,6 +3079,3 @@ msgstr ""
 #: src/resources/update.py:146
 msgid "MediaPortal update failed! Check the update log carefully!"
 msgstr "MediaPortal Update fehlgeschlagen! Überprüfe das Updatelog sorgfältig!"
-
-#~ msgid "Return"
-#~ msgstr "Zurück"
index 8bfb0ab..8fa0988 100644 (file)
@@ -154,7 +154,7 @@ config_mp.mediaportal = ConfigSubsection()
 config_mp.mediaportal.fake_entry = NoSave(ConfigNothing())
 
 # Allgemein
-config_mp.mediaportal.version = NoSave(ConfigText(default="2020022301"))
+config_mp.mediaportal.version = NoSave(ConfigText(default="2020032201"))
 config_mp.mediaportal.autoupdate = ConfigYesNo(default = True)
 
 config_mp.mediaportal.skinfail = ConfigYesNo(default = False)
diff --git a/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/api.py b/usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/resources/api.py
deleted file mode 100644 (file)
index 4afb818..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-#     Copyright (C) 2013 Tristan Fischer (sphere@dersphere.de)
-#
-#    This program is free software: you can redistribute it and/or modify
-#    it under the terms of the GNU General Public License as published by
-#    the Free Software Foundation, either version 3 of the License, or
-#    (at your option) any later version.
-#
-#    This program is distributed in the hope that it will be useful,
-#    but WITHOUT ANY WARRANTY; without even the implied warranty of
-#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-#    GNU General Public License for more details.
-#
-#    You should have received a copy of the GNU General Public License
-#    along with this program. If not, see <http://www.gnu.org/licenses/>.
-#
-
-import json
-import re
-from datetime import date
-from urllib import quote
-import requests
-
-API_URL = 'http://app.4players.de/services/app/data.php'
-USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
-
-SYSTEMS = (
-    '360', 'PC-CDROM', 'iPhone', 'iPad', 'Android', '3DS', 'N3DS', 'NDS', 'Wii_U',
-    'PlayStation3', 'PlayStation4', 'PSP', 'PS_Vita', 'PlaystationVR', 'Spielkultur', 'HTCVive', 'OculusRift',
-    'WindowsPhone7', 'XBox', 'XBoxOne', 'Wii', 'Wii_U', 'Switch', 'PlayStation2', 'Mac', 'Linux', 'VirtualReality',
-)
-
-class ForPlayersApi(object):
-
-    LIMIT = 50
-
-    def __init__(self):
-        self._game_infos = {}
-        self._systems = []
-        pass
-
-    def set_systems(self, system_list):
-        self._systems = system_list
-
-    def get_latest_videos(self, limit=LIMIT, older_than=0):
-        params = (
-            0,  # video_id
-            limit,  # limit
-            0,  # newer_than
-            older_than,  # older_than
-            0,  # reviews_only
-            self.systems,  # system filter
-            1,  # include spielinfo
-        )
-        videos = self.__api_call('getVideos', *params)['Video']
-        return self.__format_videos(videos)
-
-    def get_latest_reviews(self, limit=LIMIT, older_than=0):
-        params = (
-            0,  # video_id
-            limit,  # limit
-            0,  # newer_than
-            older_than,  # older_than
-            1,  # reviews_only
-            self.systems,  # system filter
-            1,  # include spielinfo
-        )
-        videos = self.__api_call('getVideos', *params)['Video']
-        return self.__format_videos(videos)
-
-    def get_popular_videos(self, limit=LIMIT, page=1):
-        offset = int(limit) * (int(page) - 1)
-        params = (
-            limit,  # limit
-            offset,  # offset
-            self.systems,  # system filter
-            1,  # include spielinfo
-        )
-        videos = self.__api_call('getVideosByViews', *params)['Video']
-        return self.__format_videos(videos)
-
-    def get_videos_by_game(self, game_id, limit=LIMIT, older_than=0):
-        params = (
-            game_id,  # game_id
-            limit,  # limit
-            0,  # newer_than
-            older_than,  # older_than
-        )
-        videos = self.__api_call('getVideosBySpiel', *params)['Video']
-        return self.__format_videos(videos)
-
-    def get_games(self, search_string, limit=LIMIT):
-        params = (
-            search_string,  # search_string
-            limit  # limit
-        )
-        games = self.__api_call('getSpieleBySuchbegriff', *params)['GameInfo']
-        return self.__format_games(games)
-
-    def _get_game_info(self, game_id):
-        params = (
-            game_id,  # game_id
-            0,  # newer than
-        )
-        call = self.__api_call('getSpielinfo', *params)
-        if type(call) == str:
-            x = []
-        else:
-            x = call['GameInfo']
-        return x
-
-    def __format_videos(self, raw_videos):
-        videos = [{
-            'id': video['id'],
-            'video_title': video['beschreibung'],
-            'rating': video['rating'],
-            'play_count': video['counter'],
-            'ts': video['datum'],
-            'date': self.__format_date(video['datum']),
-            'duration': self.__format_duration(video['laufzeit']),
-            'duration_str': video['laufzeit'],
-            'thumb': self.__format_thumb(video['thumb']),
-            'game': self.__format_game(video['spielinfo']),
-            'streams': {
-                'normal': {
-                    'url': video['url'],
-                    'size': video['filesize']
-                },
-                'hq': {
-                    'url': video['urlHQ'],
-                    'size': video['filesizeHQ']
-                }
-            }
-        } for video in raw_videos]
-        return videos
-
-    def __format_games(self, raw_games):
-        games = [{
-            'id': game['id'],
-            'title': game['name'],
-            'thumb': game['systeme'][0]['cover_big'],
-            'genre': game['subgenre'],
-            'studio': game['hersteller']
-        } for game in raw_games]
-        return games
-
-    def __format_game(self, game_info):
-        if not isinstance(game_info, list):
-            game_id = game_info['id']
-            if game_id in self._game_infos:
-                game_info = self._game_infos[game_id]
-            else:
-                self._game_infos[game_id] = self._get_game_info(game_id)
-            game_info = self._game_infos[game_id]
-        else:
-            self._game_infos[game_info[0]['id']] = game_info
-        game = {
-            'id': game_info[0]['id'],
-            'title': game_info[0]['name'],
-            'genre': game_info[0]['subgenre'],
-            'studio': game_info[0]['hersteller'],
-        }
-        return game
-
-    @property
-    def systems(self):
-        if self._systems and not self._systems == SYSTEMS:
-            return ','.join((s for s in self._systems if s in SYSTEMS))
-        else:
-            return 0
-
-    @staticmethod
-    def __format_thumb(url):
-        return url.replace('-thumb160x90.jpg', '-screenshot.jpg')
-
-    @staticmethod
-    def __format_date(timestamp):
-        f = '%d.%m.%Y'
-        return date.fromtimestamp(timestamp).strftime(f)
-
-    @staticmethod
-    def __format_duration(duration_str):
-        if ':' in duration_str:
-            try:
-                m, s = duration_str.split(' ')[0].split(':', 1)
-                return int(int(m) * 60 + int(s))
-            except:
-                print "error"
-        return 0
-
-    @staticmethod
-    def __api_call(method, *params):
-        parts = [API_URL, method] + [quote(str(p)) for p in params]
-        url = '/'.join(parts)
-        s = requests.session()
-        headers = {'User-Agent': USER_AGENT}
-        try:
-            page = s.get(url, headers=headers, timeout=15)
-            json_data = json.loads(page.content)
-            return json_data
-        except:
-            return 'empty'
\ No newline at end of file
index c2ae496..c6f4fe8 100644 (file)
@@ -2,11 +2,11 @@
 import json
 import requests
 
-operations = {'funk':'f058a27469d8b709c3b9db648cae47c2','spiegeltv':'dd070e3baf94dc2de0940e08291c6075'}
-channelId = {'funk':'741','spiegeltv':'748'}
-origin = {'funk':'https://www.funk.net','spiegeltv':'http://www.spiegel.tv'}
+operations = {'funk':'137782e774d7cadc93dcbffbbde0ce9c','tele5':'e40c07933eee1500e9251dff3afcceb0'}
+channelId = {'funk':'741','tele5':'759'}
+origin = {'funk':'https://www.funk.net','tele5':'https://www.tele5.de'}
 
-base_url = 'https://api.nexx.cloud/v3/'
+base_url = 'https://api.nexx.cloud/v3.1/'
 
 def getVideoUrl(id, downld, operation='funk'):
        try:
index 3611e2f..e976349 100644 (file)
@@ -1817,7 +1817,7 @@ class SimplePlayer(Screen, CoverSearchHelper, SimpleSeekHelper, SimplePlayerResu
                        self.downloader.stop()
                reactor.callLater(1, clearTmpBuffer)
 
-               if self.ltype in ['netflix', 'amazon']:
+               if self.ltype in ['netflix', 'amazon', 'dazn']:
                        from Plugins.Extensions.MediaPortal.plugin import _stylemanager
                        _stylemanager(0)
 
@@ -2018,7 +2018,7 @@ class SimplePlayer(Screen, CoverSearchHelper, SimpleSeekHelper, SimplePlayerResu
                        else:
                                self._BgCover.getCover(cover.replace('450x450','800x800'), bgcover=True)
                        if mp_globals.isDreamOS:
-                               if "static.rad.io" in cover or "static.radio" in cover:
+                               if "static.rad.io" in cover or "static.radio" in cover or "cdn-profiles.tunein" in cover or "cdn-radiotime-logos.tunein" in cover:
                                        cover = "file:///usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png"
                                if cover.startswith('file://'):
                                        try:
@@ -2033,7 +2033,7 @@ class SimplePlayer(Screen, CoverSearchHelper, SimpleSeekHelper, SimplePlayerResu
                                self['Cover'].hide()
                        self._Cover.getCover(cover, download_cb=download_cb)
                        if mp_globals.isDreamOS:
-                               if "static.rad.io" in cover or "static.radio" in cover:
+                               if "static.rad.io" in cover or "static.radio" in cover or "cdn-profiles.tunein" in cover or "cdn-radiotime-logos.tunein" in cover:
                                        cover = "file:///usr/lib/enigma2/python/Plugins/Extensions/MediaPortal/images/none.png"
                                if cover.startswith('file://'):
                                        try: