diff --git a/addons.xml b/addons.xml index a52b1492dd..1973023cbd 100644 --- a/addons.xml +++ b/addons.xml @@ -1,6 +1,6 @@ - + diff --git a/addons.xml.md5 b/addons.xml.md5 index 6e74c664cd..469673329a 100644 --- a/addons.xml.md5 +++ b/addons.xml.md5 @@ -1 +1 @@ -d571d86457fca5621bcf0fb7fd614fd3 \ No newline at end of file +428fe7749c70c893128c315b04c48b44 \ No newline at end of file diff --git a/plugin.video.vstream/addon.xml b/plugin.video.vstream/addon.xml index 5f3011fa44..49473e0dcc 100644 --- a/plugin.video.vstream/addon.xml +++ b/plugin.video.vstream/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/plugin.video.vstream/resources/hosters/oneupload.py b/plugin.video.vstream/resources/hosters/oneupload.py index d319c8ab50..d3317776d7 100644 --- a/plugin.video.vstream/resources/hosters/oneupload.py +++ b/plugin.video.vstream/resources/hosters/oneupload.py @@ -23,6 +23,12 @@ def _getMediaLinkForGuest(self): if aResult[0] is True: api_call = aResult[1][0] + if not api_call: + sPattern = 'jwplayer\("vplayer"\)\.setup\({ *sources: \[\{file:"([^"]+)' + aResult = oParser.parse(sHtmlContent, sPattern) + if aResult[0] is True: + api_call = aResult[1][0] + if api_call: return True, api_call #+ '|User-Agent=' + UA + '&Referer=' + self._url + '&Origin=https://vidfast.co' diff --git a/plugin.video.vstream/resources/lib/gui/gui.py b/plugin.video.vstream/resources/lib/gui/gui.py index 4f29329cf9..bf39e00fbf 100644 --- a/plugin.video.vstream/resources/lib/gui/gui.py +++ b/plugin.video.vstream/resources/lib/gui/gui.py @@ -38,6 +38,8 @@ def addNewDir(self, Type, sId, sFunction, sLabel, sIcon, sThumbnail='', sDesc='' # dir ou link => CONTENT par défaut = files if Type != 'dir' and Type != 'link': cGui.CONTENT = Type + if sCat is not None: + oGuiElement.setCat(sCat) oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) @@ -51,9 +53,6 @@ def addNewDir(self, Type, sId, sFunction, sLabel, sIcon, sThumbnail='', sDesc='' oGuiElement.setDescription(sDesc) - if sCat is not None: - oGuiElement.setCat(sCat) - # Pour addLink on recupere le sCat et sMeta precedent. if Type == 'link': oInputParameterHandler = cInputParameterHandler() @@ -397,9 +396,9 @@ def _createListItem(self, oGuiElement, oListItem=None): oListItem = listitem(itemTitle) if data.get('cast'): - credits = json.loads(data['cast']) + casts = json.loads(data['cast']) data['cast'] = [] - for i in credits: + for i in casts: if isNexus(): data['cast'].append(xbmc.Actor(i['name'], i['character'], i['order'], i.get('thumbnail', ""))) else: @@ -425,7 +424,8 @@ def _createListItem(self, oGuiElement, oListItem=None): videoInfoTag.setMpaa(data.get('mpaa', "")) videoInfoTag.setDuration(int(data.get('duration', 0))) videoInfoTag.setPlaycount(int(data.get('playcount', 0))) - videoInfoTag.setCountries(data.get('country', [""])) + # inutilisé ? et fragile + # videoInfoTag.setCountries(data.get('country', [''])) videoInfoTag.setTrailer(data.get('trailer', "")) videoInfoTag.setTagLine(data.get('tagline', "")) videoInfoTag.setStudios(list(data.get('studio', '').split("/"))) diff --git a/plugin.video.vstream/resources/lib/gui/guiElement.py b/plugin.video.vstream/resources/lib/gui/guiElement.py index 6e91b21e41..f0827a913e 100644 --- a/plugin.video.vstream/resources/lib/gui/guiElement.py +++ b/plugin.video.vstream/resources/lib/gui/guiElement.py @@ -238,40 +238,44 @@ def TraiteTitre(self, sTitle): sDecoColor = self.addons.getSetting('deco_color') sTitle = re.sub('([\(|\[](?!\/*COLOR)[^\)\(\]\[]+?[\]|\)])', '[COLOR ' + sDecoColor + ']\\1[/COLOR]', sTitle) - # Recherche saisons et episodes + # Recherche saisons et episodes si séries ou animes sa = ep = '' - m = re.search('(|S|saison)(\s?|\.)(\d+)(\s?|\.)(E|Ep|x|\wpisode)(\s?|\.)(\d+)', sTitle, re.UNICODE) - if m: - sa = m.group(3) - ep = m.group(7) - if ep=='264' or ep=='265': # echape les codecs X264 et x265 - sa = ep = '' - else: - sTitle = sTitle.replace(m.group(0), '') - - else: # Juste l'épisode - m = re.search('(^|\s|\.)(E|Ep|\wpisode)(\s?|\.)(\d+)', sTitle, re.UNICODE) + + if self.__sCat in (2, 3, 4, 8, 9): + m = re.search('(|S|saison)(\s?|\.)(\d+)(\s?|\.)(E|Ep|x|\wpisode)(\s?|\.)(\d+)', sTitle, re.UNICODE) if m: - sTitle = sTitle.replace(m.group(0), '') - ep = m.group(4) - else: # juste la saison - m = re.search('( S|saison)(\s?|\.)(\d+)', sTitle, re.UNICODE) + sa = m.group(3) + ep = m.group(7) + if ep=='264' or ep=='265': # echape les codecs X264 et x265 + sa = ep = '' + else: + sTitle = sTitle.replace(m.group(0), '') + + else: # Juste l'épisode + m = re.search('(^|\s|\.)(E|Ep|\wpisode)(\s?|\.)(\d+)', sTitle, re.UNICODE) if m: sTitle = sTitle.replace(m.group(0), '') - sa = m.group(3) - - # enleve les crochets et les parentheses si elles sont vides - if sa or ep: - sTitle = sTitle.replace('()', '').replace('[]', '').replace('- -', '-') - # vire espace et - a la fin - sTitle = re.sub('[- –_\.\[]+$', '', sTitle) - - if sa: - self.__Season = sa - self.addItemValues('Season', self.__Season) - if ep: - self.__Episode = ep - self.addItemValues('Episode', self.__Episode) + ep = m.group(4) + else: # juste la saison + m = re.search('( S|saison)(\s?|\.)(\d+)', sTitle, re.UNICODE) + if m: + sTitle = sTitle.replace(m.group(0), '') + sa = m.group(3) + + # enleve les crochets et les parentheses si elles sont vides + if sa or ep: + sTitle = sTitle.replace('()', '').replace('[]', '').replace('- -', '-') + # vire espace et - a la fin + sTitle = re.sub('[- –_\.\[]+$', '', sTitle) + + if sa: + self.__Season = sa + self.addItemValues('Season', self.__Season) + if ep: + self.__Episode = ep + self.addItemValues('Episode', self.__Episode) + if not self.__Season: + self.__Season = 1 # forcer pour les séries sans saison # on repasse en utf-8 if not isMatrix(): diff --git a/plugin.video.vstream/resources/lib/home.py b/plugin.video.vstream/resources/lib/home.py index 2df496627e..6e0fac756f 100644 --- a/plugin.video.vstream/resources/lib/home.py +++ b/plugin.video.vstream/resources/lib/home.py @@ -401,7 +401,7 @@ def showUsers(self): oGui.addDir('alldebrid', 'load', 'AllDebrid', 'sites/alldebrid.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') - oGui.addDir('sitedarkibox', 'load', 'darkiBox', 'sites/sitedarkibox.png', oOutputParameterHandler) + oGui.addDir('sitedarkibox', 'load', 'DarkiBox', 'sites/sitedarkibox.png', oOutputParameterHandler) oOutputParameterHandler.addParameter('siteUrl', 'http://') oGui.addDir('themoviedb_org', 'showMyTmdb', 'TMDB', 'tmdb.png', oOutputParameterHandler) diff --git a/plugin.video.vstream/resources/lib/trakt.py b/plugin.video.vstream/resources/lib/trakt.py index 95893176ba..9bd683bcbb 100644 --- a/plugin.video.vstream/resources/lib/trakt.py +++ b/plugin.video.vstream/resources/lib/trakt.py @@ -717,7 +717,11 @@ def getLocalizedTitle(self, item, what): oRequestHandler.addHeaderEntry('Authorization', 'Bearer %s' % self.ADDON.getSetting('bstoken')) sHtmlContent = oRequestHandler.request(jsonDecode=True) - title = next((title for title in sHtmlContent if title['language'].lower() == 'fr'), item)['title'] + for titleSearch in sHtmlContent: + if titleSearch['language'].lower() == 'fr': + title = titleSearch['title'] + if titleSearch['country'].lower() == 'fr': + break if title is None: return item['title'] @@ -1042,9 +1046,6 @@ def getTmdbInfo(self, sTmdb, oGuiElement): return def getTmdbID(self, sTitle, sType): - - oInputParameterHandler = cInputParameterHandler() - from resources.lib.tmdb import cTMDb grab = cTMDb() @@ -1053,9 +1054,8 @@ def getTmdbID(self, sTitle, sType): elif sType == 'movies': sType = 'movie' - meta = 0 - year = '' # on cherche l'annee + year = '' r = re.search('(\([0-9]{4}\))', sTitle) if r: year = str(r.group(0)) diff --git a/plugin.video.vstream/resources/sites/buzzmonclick_com.py b/plugin.video.vstream/resources/sites/buzzmonclick_com.py index 82fd05457f..5f277ca527 100644 --- a/plugin.video.vstream/resources/sites/buzzmonclick_com.py +++ b/plugin.video.vstream/resources/sites/buzzmonclick_com.py @@ -109,7 +109,7 @@ def showMovies(sSearch=''): # mise en page sTitle = sTitle.replace('Permalien pour', '').replace('′', '\'') sTitle = re.sub('(?:,)* (?:Replay |Video )*du ([0-9]+ [a-zA-z]+ [0-9]+)', ' (\\1)', sTitle) - sTitle = re.sub(', (?:Replay|Video)$', '', sTitle) + sTitle = re.sub(', (?:Replay|Video|Vidéo|vidéo)', '', sTitle) sUrl = aEntry[1] sThumb = aEntry[2] @@ -131,7 +131,7 @@ def showMovies(sSearch=''): def __checkForNextPage(sHtmlContent): - sPattern = 'class="nextpostslink" rel="next" href="([^"]+)"' + sPattern = 'class="nextpostslink" rel="next".+?href="([^"]+)"' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: @@ -153,9 +153,14 @@ def showLinks(): sHtmlContent = oRequestHandler.request() oParser = cParser() - sPattern = 'wp-block-button.+?(?:href=|src=)"([^"]+)".+?>(?:([^<]+)|)' + sHtmlContent = oParser.abParse(sHtmlContent, '#555555;', 'section-box') + sPattern = "(?:href=|src=)\"([^\"]+)\".+?value=\'([^\']+)\'" aResult = oParser.parse(sHtmlContent, sPattern) + if not aResult[0]: + sPattern = 'wp-block-button.+?(?:href=|src=)"([^"]+)".+?>(?:([^<]+)|)' + aResult = oParser.parse(sHtmlContent, sPattern) + if aResult[0]: oOutputParameterHandler = cOutputParameterHandler() for aEntry in aResult[1]: @@ -178,20 +183,32 @@ def showLinks(): def showHosters(): oGui = cGui() + oParser = cParser() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') + oHoster = None - if 'forum-tv' in sUrl: + if 'generated' in sUrl: + oRequestHandler = cRequestHandler(sUrl) + sHtmlContent = oRequestHandler.request() + sPattern = 'window.location.href = "([^"]+)"' + aResult = oParser.parse(sHtmlContent, sPattern) + if aResult[0]: + sHosterUrl = aResult[1][0] + oHoster = cHosterGui().checkHoster(sHosterUrl) + + elif 'dood.forum-tv.org' in sUrl: + showDoodHosters(sMovieTitle, sUrl) + + elif 'forum-tv' in sUrl: dialog().VSinfo('Décodage en cours', "Patientez", 5) s = requests.Session() - response = s.get(sUrl, headers={'User-Agent': UA}) sHtmlContent = str(response.content) cookie_string = "; ".join([str(x) + "=" + str(y) for x, y in s.cookies.items()]) - oParser = cParser() sPattern = '', '', sHtmlContent) + sHtmlContentBck = sHtmlContent = re.sub('', '', sHtmlContent) # recuperation nom de la release if 'elease :' in sHtmlContent: @@ -558,6 +558,24 @@ def showHosters(): oOutputParameterHandler.addParameter('sDesc', sDesc) oGui.addLink(SITE_IDENTIFIER, 'Display_protected_link', sTitle, sThumb, sDesc, oOutputParameterHandler) + else: + sHtmlContent = oParser.abParse(sHtmlContentBck, '