# -*- coding: utf-8 -*- # vStream https://github.com/Kodi-vStream/venom-xbmc-addons import re import base64 import xbmc from resources.lib.gui.hoster import cHosterGui from resources.lib.gui.gui import cGui from resources.lib.handler.inputParameterHandler import cInputParameterHandler from resources.lib.handler.outputParameterHandler import cOutputParameterHandler from resources.lib.handler.requestHandler import cRequestHandler from resources.lib.parser import cParser from resources.lib.util import cUtil from resources.lib.comaddon import progress, VSlog # Detecte si c'est Kodi 19 ou plus if xbmc.getInfoLabel('system.buildversion')[0:2] >= '19': isPython3 = True else: isPython3 = False UA = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0' SITE_IDENTIFIER = 'french_stream_com' SITE_NAME = 'French-stream' SITE_DESC = 'Films, Séries & Mangas en streaming' URL_MAIN = 'https://www.french-streaming.to/'# old 'https://www8.french-streaming.com/' # URL_SEARCH_MOVIES = (URL_MAIN + 'index.php?do=search&subaction=search&catlist[]=9&story=', 'showMovies') # URL_SEARCH_SERIES = (URL_MAIN + 'index.php?do=search&subaction=search&catlist[]=10&story=', 'showSeries') URL_SEARCH_MOVIES = (URL_MAIN + 'search/', 'showMovies') URL_SEARCH_SERIES = (URL_MAIN + 'search/', 'showSeries') FUNCTION_SEARCH = 'showMovies' MOVIE_MOVIE = (True, 'showMoviesMenu') MOVIE_NEWS = (URL_MAIN + 'films-streaming/', 'showMovies') # MOVIE_VF = (URL_MAIN + 'films/vf/', 'showMovies') MOVIE_VOSTFR = (URL_MAIN + 'film/VOSTFR/', 'showMovies') MOVIE_HD = (URL_MAIN + 'qualit/HDLight/', 'showMovies') MOVIE_GENRES = (True, 'showMovieGenres') SERIE_SERIES = (True, 'showSeriesMenu') SERIE_NEWS = (URL_MAIN + 'serie-tv-streaming', 'showSeries') SERIE_VFS = (URL_MAIN + 'serie/VF/', 'showSeries') SERIE_VOSTFRS = (URL_MAIN + 'serie/VOSTFR/', 'showSeries') SERIE_GENRES = (True, 'showSerieGenres') ANIM_ANIMS = (True, 'showMangasMenu') ANIM_NEWS = (URL_MAIN + 'mangas/', 'showSeries') def decode_url_Serie(url, sId, tmp=''): v = url if 'singh' in sId: # sId2 = sId[6:] fields = url.split('nbsp') try: if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) except IndexError: if isPython3: t = base64.b64encode(base64.b64encode(fields[0].encode())) else: t = base64.b64encode(base64.b64encode(fields[0])) else: return v = "/s.php?p_id=1&&c_id=" + str(t) if sId == 'honey': # sId2 = sId[6:] fields = url.split('nbsp') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/s.php?p_id=1&&c_id=" + str(t) if sId == 'yoyo': # sId2 = sId[5:] fields = url.split('nbsp') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/s.php?p_id=1&&c_id=" + str(t) if sId == 'seriePlayer': fields = url.split('nbsp') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/s.php?p_id=1&&c_id=" + str(t) return v def decode_url(url, sId, tmp=''): v = url if sId == 'seriePlayer': fields = tmp.split('sig=705&&') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = '/f.php?p_id=1&&c_id=' + str(t) if sId == 'gGotop1': fields = tmp.split('sig=705&&') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = '/f.php?p_id=1&&c_id=' + str(t) if sId == 'gGotop2': fields = url.split('nbsp') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/f.php?p_id=2&&c_id=" + str(t) if sId == 'gGotop3': fields = url.split('nbsq') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/f.php?p_id=3&&c_id=" + str(t) if sId == 'gGotop4': fields = url.split('nbsr') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/f.php?p_id=4&&c_id=" + str(t) if sId == 'gGotop5': fields = url.split('nbss') if isPython3: t = base64.b64encode(base64.b64encode(fields[1].encode())) else: t = base64.b64encode(base64.b64encode(fields[1])) v = "/dl.php?p_id=5&&c_id=" + str(t) return v def ResolveUrl(url): try: url2 = '' pat = 'p_id=([0-9]+).+?c_id=([^&]+)' sId = re.search(pat, url, re.DOTALL).group(1) hAsh = re.search(pat, url, re.DOTALL).group(2) hAsh = base64.b64decode(base64.b64decode(hAsh)) if sId == '2': url2 = 'https://oload.stream/embed/' elif sId == '3': url2 = 'https://vidlox.me/embed-' elif sId == '4': url2 = 'https://hqq.watch/player/embed_player.php?vid=' url2 = url2 + hAsh return url2 except: return '' return '' def load(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche Film', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showSearchSeries', 'Recherche Série', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_MOVIE[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_MOVIE[1], 'Films', 'films.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_SERIES[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_SERIES[1], 'Séries', 'series.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', ANIM_ANIMS[0]) oGui.addDir(SITE_IDENTIFIER, ANIM_ANIMS[1], 'Animés', 'animes.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMoviesMenu(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche Film', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_NEWS[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_NEWS[1], 'Films (Derniers ajouts)', 'news.png', oOutputParameterHandler) # oOutputParameterHandler = cOutputParameterHandler() # oOutputParameterHandler.addParameter('siteUrl', MOVIE_VF[0]) # oGui.addDir(SITE_IDENTIFIER, MOVIE_VF[1], 'Films (VF)', 'vf.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_VOSTFR[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_VOSTFR[1], 'Films (VOSTFR)', 'vostfr.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_HD[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_HD[1], 'Films (HD-VF)', 'hd.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', MOVIE_GENRES[0]) oGui.addDir(SITE_IDENTIFIER, MOVIE_GENRES[1], 'Films (Genres)', 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showSeriesMenu(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', 'http://venom/') oGui.addDir(SITE_IDENTIFIER, 'showSearchSeries', 'Recherche Série', 'search.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_NEWS[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_NEWS[1], 'Séries (Derniers ajouts)', 'news.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_VFS[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_VFS[1], 'Séries (VF)', 'vf.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_VOSTFRS[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_VOSTFRS[1], 'Séries (VOSTFR)', 'vostfr.png', oOutputParameterHandler) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', SERIE_GENRES[0]) oGui.addDir(SITE_IDENTIFIER, SERIE_GENRES[1], 'Séries (Genres)', 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMangasMenu(): oGui = cGui() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', ANIM_NEWS[0]) oGui.addDir(SITE_IDENTIFIER, ANIM_NEWS[1], 'Animés (Derniers ajouts)', 'news.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showSearch(): oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl = URL_SEARCH_MOVIES[0] + sSearchText showMovies(sUrl) oGui.setEndOfDirectory() return def showSearchSeries(): oGui = cGui() sSearchText = oGui.showKeyBoard() if (sSearchText != False): sUrl = URL_SEARCH_SERIES[0] + sSearchText showSeries(sUrl) oGui.setEndOfDirectory() return def showMovieGenres(): oGui = cGui() liste = [] liste.append(['Action', URL_MAIN + 'film-genre/action/']) liste.append(['Animation', URL_MAIN +'film-genre/animation/']) liste.append(['Arts Martiaux', URL_MAIN + 'film-genre/arts-Martiaux/']) liste.append(['Aventure', URL_MAIN + 'film-genre/aventure/']) liste.append(['Biopic', URL_MAIN + 'film-genre/biopic/']) liste.append(['Comédie', URL_MAIN + 'film-genre/com%C3%A9die/']) liste.append(['Comédie Dramatique', URL_MAIN + 'film-genre/com%C3%A9die-dramatique/']) liste.append(['Comédie Musicale', URL_MAIN + 'film-genre/com%C3%A9die-musicale/']) liste.append(['Documentaire', URL_MAIN + 'film-genre/documentaire/']) liste.append(['Drame', URL_MAIN + 'film-genre/drame/']) liste.append(['Epouvante Horreur', URL_MAIN + 'film-genre/epouvante_horreur/']) liste.append(['Erotique', URL_MAIN + 'film-genre/erotique/']) liste.append(['Espionnage', URL_MAIN + 'film-genre/espionnage/']) liste.append(['Famille', URL_MAIN + 'film-genre/famille/']) liste.append(['Fantastique', URL_MAIN + 'film-genre/fantastique/']) liste.append(['Guerre', URL_MAIN + 'film-genre/guerre/']) liste.append(['Historique', URL_MAIN + 'film-genre/historique/']) liste.append(['Musical', URL_MAIN + 'film-genre/musical/']) liste.append(['Policier', URL_MAIN + 'film-genre/policier/']) liste.append(['Péplum', URL_MAIN + 'film-genre/peplum/']) liste.append(['Romance', URL_MAIN + 'film-genre/romance/']) liste.append(['Science Fiction', URL_MAIN + 'film-genre/science-fiction/']) liste.append(['Spectacle', URL_MAIN + 'film-genre/spectacle/']) liste.append(['Super héros', URL_MAIN + 'film-genre/Super_héros/']) liste.append(['Thriller', URL_MAIN + 'film-genre/thriller/']) liste.append(['Walt Disney', URL_MAIN + 'film-genre/Walt-Disney/']) liste.append(['Western', URL_MAIN + 'film-genre/western/']) liste.append(['Divers', URL_MAIN + 'film-genre/divers/']) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showSerieGenres(): oGui = cGui() liste = [] liste.append(['Action', URL_MAIN +'serie-genre/Action/']) liste.append(['Animation', URL_MAIN+'serie-genre/Animation/']) liste.append(['Arts Martiaux', URL_MAIN + 'serie-genre/Arts-Martiaux/']) liste.append(['Aventure', URL_MAIN + 'serie-genre/Aventure/']) liste.append(['Biopic', URL_MAIN + 'serie-genre/Biopic/']) liste.append(['Comédie', URL_MAIN + 'serie-genre/Comédie/']) liste.append(['Comédie Dramatique', URL_MAIN + 'serie-genre/Comédie+dramatique/']) liste.append(['Comédie Musicale', URL_MAIN + 'serie-genre/Comédie+musicale/']) liste.append(['Documentaire', URL_MAIN + 'serie-genre/Documentaire/']) liste.append(['Drame', URL_MAIN + 'serie-genre/Drame/']) liste.append(['Epouvante Horreur', URL_MAIN + 'serie-genre/Epouvante-horreur/']) liste.append(['Espionnage', URL_MAIN + 'serie-genre/Espionnage/']) liste.append(['Famille', URL_MAIN + 'serie-genre/Famille/']) liste.append(['Fantastique', URL_MAIN + 'serie-genre/Fantastique/']) liste.append(['Guerre', URL_MAIN + 'serie-genre/Guerre/']) liste.append(['Historique', URL_MAIN + 'serie-genre/Historique/']) liste.append(['Judiciaire', URL_MAIN + 'serie-genre/Judiciaire/']) liste.append(['Médical', URL_MAIN + 'serie-genre/Médical/']) liste.append(['Musical', URL_MAIN + 'serie-genre/Musical/']) liste.append(['Policier', URL_MAIN + 'serie-genre/Policier/']) liste.append(['Romance', URL_MAIN + 'serie-genre/Romance/']) liste.append(['Science Fiction', URL_MAIN + 'serie-genre/Science+fiction/']) liste.append(['Soap', URL_MAIN + 'serie-genre/Soap/']) liste.append(['Sport', URL_MAIN + 'serie-genre/Sport+event/']) liste.append(['Thriller', URL_MAIN + 'serie-genre/Thriller/']) liste.append(['Western', URL_MAIN + 'serie-genre/Western/']) for sTitle, sUrl in liste: oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', sUrl) oGui.addDir(SITE_IDENTIFIER, 'showSeries', sTitle, 'genres.png', oOutputParameterHandler) oGui.setEndOfDirectory() def showMovies(sSearch=''): oGui = cGui() if sSearch: sUrl = sSearch else: oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() sPattern = 'film-ripz".+?href="([^"]+)" title="[^"]+">>><' oParser = cParser() aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): return URL_MAIN[:-1] + aResult[1][0] return False def showHosters(): oGui = cGui() oParser = cParser() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() sPattern = '([^"]+)' aResult = oParser.parse(sHtmlContent, sPattern) if (aResult[0] == True): for aEntry in aResult[1]: oHoster = cHosterGui().checkHoster(aEntry[0]) if (oHoster != False): oHoster.setDisplayName(sMovieTitle) oHoster.setFileName(sMovieTitle) cHosterGui().showHoster(oGui, oHoster, aEntry[0], sThumb) oGui.setEndOfDirectory() def showEpisode(): oGui = cGui() oParser = cParser() oInputParameterHandler = cInputParameterHandler() sUrl = oInputParameterHandler.getValue('siteUrl') sMovieTitle = oInputParameterHandler.getValue('sMovieTitle') sThumb = oInputParameterHandler.getValue('sThumb') # sType = oInputParameterHandler.getValue('sType') oRequestHandler = cRequestHandler(sUrl) sHtmlContent = oRequestHandler.request() sDesc = '' try: sPattern = 'id="s-desc">.+?streaming : (.+?)<' aResult = oParser.parse(sHtmlContent, sPattern) if aResult[0]: sDesc = aResult[1][0] except: pass sPattern = ' *(VF|VOSTFR) *|