forked from axiom-team/astrXbian
431 lines
15 KiB
Python
431 lines
15 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
|
|
# source 28
|
|
import re
|
|
import string
|
|
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.comaddon import progress #, VSlog
|
|
|
|
SITE_IDENTIFIER = 'animecomplet'
|
|
SITE_NAME = 'Animecomplet'
|
|
SITE_DESC = 'Series Anime'
|
|
|
|
URL_MAIN = 'https://www.animecomplet.org/'
|
|
|
|
ANIM_LIST = (URL_MAIN + 'liste-manga-vostfr-et-manga-vf/', 'showSeries')
|
|
tag_alpha ='tagaplha'
|
|
ANIM_ALPHA = (tag_alpha, 'showAlpha')
|
|
|
|
ANIM_NEWS = (URL_MAIN , 'showSeries')
|
|
|
|
ANIM_VOSTFRS = (URL_MAIN , 'showSeries')
|
|
ANIM_ANIMS = (True, 'load')
|
|
|
|
tag_global='#global'
|
|
URL_SEARCH_SERIES = (URL_MAIN + tag_global + '?s=', 'showSeries')
|
|
URL_SEARCH = (URL_MAIN + '?s=', 'showSeries')
|
|
|
|
|
|
def load():
|
|
|
|
oGui = cGui()
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', 'http://venom/')
|
|
oGui.addDir(SITE_IDENTIFIER, 'showSearch', 'Recherche', 'search.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', ANIM_NEWS[0])
|
|
oGui.addDir(SITE_IDENTIFIER, ANIM_NEWS[1], 'Animes (derniers épisodes récents)', 'series.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', ANIM_LIST[0])
|
|
oGui.addDir(SITE_IDENTIFIER, ANIM_LIST[1], 'Animes (liste complète)', 'series.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', ANIM_ALPHA[0])
|
|
oGui.addDir(SITE_IDENTIFIER, ANIM_ALPHA[1], 'Animes (liste alpha)', 'az.png', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showAlpha():
|
|
oGui = cGui()
|
|
sAlpha = string.ascii_lowercase
|
|
listalpha = list(sAlpha)
|
|
liste = []
|
|
url1 = tag_alpha + ';'
|
|
|
|
req = ANIM_LIST[0]
|
|
oRequestHandler = cRequestHandler(req)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
# on propose comme meme en premier la liste complete
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', ANIM_LIST[0])
|
|
oGui.addDir(SITE_IDENTIFIER, 'showSeries', ' [COLOR coral]' + 'ALL' + '[/COLOR]', 'listes.png', oOutputParameterHandler)
|
|
|
|
# récupere les chiffres dispos
|
|
sPattern = 'href="#gti_(\d+)'
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
for aEntry in aResult[1]:
|
|
liste.append([str(aEntry), url1 + str(aEntry)])
|
|
|
|
for alpha in listalpha:
|
|
liste.append([str(alpha).upper(), url1 + str(alpha)])
|
|
|
|
# sUrl = 'tagalpha ;alpha'
|
|
for sTitle, sUrl in liste:
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
|
oGui.addDir(SITE_IDENTIFIER, 'showSeries', 'Lettre [COLOR coral]' + sTitle + '[/COLOR]', 'listes.png', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
def showSearch():
|
|
oGui = cGui()
|
|
|
|
sSearchText = oGui.showKeyBoard()
|
|
if (sSearchText != False):
|
|
sUrl = URL_SEARCH[0] + sSearchText
|
|
showSeries(sUrl)
|
|
oGui.setEndOfDirectory()
|
|
return
|
|
|
|
def showSeries(sSearch=''):
|
|
oGui = cGui()
|
|
|
|
bSearchGlobal = False
|
|
if sSearch:
|
|
sUrl = sSearch.replace(' ', '+').replace('%20', '+')
|
|
if tag_global in sSearch:
|
|
sUrl = sUrl.replace(tag_global , '')
|
|
bSearchGlobal = True
|
|
|
|
else:
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
|
|
# pour la liste alpha on peu aussi faire sUrl=alpha (plus rapide)
|
|
# sPattern = '<a href="([^"]+)">..' + alpha + '([^<]+).+?style="width'
|
|
balpha = False
|
|
sAlpha = ''
|
|
if tag_alpha in sUrl:
|
|
letag ,sAlpha = sUrl.split(';')
|
|
sUrl = ANIM_LIST[0]
|
|
balpha = True
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
#VSlog(sHtmlContent)
|
|
|
|
if sUrl == ANIM_LIST[0]:#category"><a href="([^"]+).+?title="([^"]+).+?meta-date">([^<]+).+?src=.([^">]+)
|
|
sPattern = '<a href="([^"]+)">.([^<]+).+?style="width'
|
|
else:
|
|
sPattern = 'category"><a href="([^"]+).+?title="([^"]+).+?meta-date">([^<]+).+?src=.([^">]+)'
|
|
sPattern = '<center><p><img.*?src=.([^">]+).*?category"><a href="([^"]+).+?title="([^"]+).+?meta-date">([^<]+)'
|
|
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
icurrent = 0
|
|
list_simlilar= []
|
|
|
|
if (aResult[0] == False):
|
|
oGui.addText(SITE_IDENTIFIER)
|
|
|
|
if (aResult[0] == True):
|
|
total = len(aResult[1])
|
|
progress_ = progress().VScreate(SITE_NAME)
|
|
|
|
for aEntry in aResult[1]:
|
|
|
|
progress_.VSupdate(progress_, total)
|
|
if progress_.iscanceled():
|
|
break
|
|
icurrent = icurrent +1
|
|
sThumb = ''
|
|
sDesc= ''
|
|
if sUrl == ANIM_LIST[0]:
|
|
sUrl2 = aEntry[0]
|
|
sTitle = aEntry[1]
|
|
sTitle = sTitle.decode('ascii', errors = 'ignore')
|
|
|
|
if '(0)' in sTitle or 'EPISODES'in sTitle: # EPISODES 1 element pattern a revoir pattern
|
|
continue
|
|
|
|
if balpha:
|
|
sTitle2 = sTitle.strip().lower()
|
|
if not sTitle2.startswith(sAlpha):
|
|
continue
|
|
|
|
else:
|
|
sThumb = aEntry[0]
|
|
sUrl2 = aEntry[1]
|
|
sTitle = aEntry[2]
|
|
sTitle = sTitle.decode('ascii', errors ='ignore')
|
|
sDesc = 'Mise à jour : ' + aEntry[3]
|
|
|
|
if 'http' not in sThumb:
|
|
sThumb = URL_MAIN + sThumb
|
|
|
|
# le lien liés a l'episode va
|
|
# nous fournir apres tous les episodes saisons
|
|
# donc inutile de tout afficher si titre semblable
|
|
if bSearchGlobal and icurrent > 3:
|
|
bvalid ,sim = SimilarTitle(sTitle )
|
|
if bvalid:
|
|
if sim not in list_simlilar:
|
|
list_simlilar.append(sim)
|
|
else:
|
|
continue
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oGui.addAnime(SITE_IDENTIFIER, 'showEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
progress_.VSclose(progress_)
|
|
|
|
if not sSearch:
|
|
sNextPage = __checkForNextPage(sHtmlContent)
|
|
if (sNextPage != False):
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sNextPage)
|
|
number = ''
|
|
try:
|
|
number = re.search('page.([0-9]+)', sNextPage).group(1)
|
|
except:
|
|
pass
|
|
oGui.addNext(SITE_IDENTIFIER, 'showSeries', '[COLOR teal]Page ' + str(number) + ' >>>[/COLOR]', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def __checkForNextPage(sHtmlContent):
|
|
oParser = cParser()
|
|
sPattern = 'class="next page.+?href="([^"]+).+?Next'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
return aResult[1][0]
|
|
return False
|
|
|
|
|
|
def showSaisons():
|
|
oGui = cGui()
|
|
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
sPattern = 'colo_cont">.+?>([^<]*)</p>'
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
sDesc = aResult[1][0]
|
|
sDesc = ('[I][COLOR coral]%s[/COLOR][/I] %s') % (' SYNOPSIS : \r\n\r\n', sDesc)
|
|
else:
|
|
sDesc = ''
|
|
|
|
sPattern = 'class="item">.+?href="([^"]+)".+?<h2>([^<]+)'
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
if (aResult[0] == True):
|
|
for aEntry in aResult[1]:
|
|
sUrl2 = aEntry[0]
|
|
sTitle = sMovieTitle + ' ' + aEntry[1]
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oOutputParameterHandler.addParameter('sDesc', sDesc)
|
|
oGui.addEpisode(SITE_IDENTIFIER, 'showEpisodes', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showEpisodes():
|
|
oGui = cGui()
|
|
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
|
sDesc = oInputParameterHandler.getValue('sDesc')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
oParser = cParser()
|
|
sPattern = '<h2 class="entry-title">.+?b>([^<]+)'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
sDesc = ('[I][COLOR grey]%s[/COLOR][/I]') % ('Anime Complet ')
|
|
|
|
if (aResult[0] == True):
|
|
sDesc = ('[I][COLOR grey]%s[/COLOR][/I] %s') % ('Synopsis :', aResult[1][0])
|
|
|
|
# inutile (pour l'instant)
|
|
start=sHtmlContent.find('<div class="post-content">')
|
|
sHtmlContent = sHtmlContent[start:]
|
|
|
|
sPattern = '<h2><a href="([^"]+).+?title="([^"]+).+?src=.([^">]+)'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
if (aResult[0] == False):
|
|
oGui.addText(SITE_IDENTIFIER)
|
|
|
|
if (aResult[0] == True):
|
|
for aEntry in aResult[1]:
|
|
|
|
sUrl2 = aEntry[0]
|
|
sTitle = aEntry[1]
|
|
sThumb = aEntry[2]
|
|
if 'http' not in sThumb:
|
|
sThumb = URL_MAIN + sThumb
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oOutputParameterHandler.addParameter('sDesc', sDesc)
|
|
|
|
oGui.addEpisode(SITE_IDENTIFIER, 'seriesHosters', sTitle, '', sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
sNextPage = __episodecheckForNextPage(sHtmlContent)
|
|
if (sNextPage != False):
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sNextPage)
|
|
number = ''
|
|
try:
|
|
number = re.search('page.([0-9]+)', sNextPage).group(1)
|
|
except:
|
|
pass
|
|
oGui.addNext(SITE_IDENTIFIER, 'showEpisodes', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def __episodecheckForNextPage(sHtmlContent): # fct identique __checkForNextPage
|
|
oParser = cParser()
|
|
sPattern = 'class="next page.+?href="([^"]+).+?Next'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
return aResult[1][0]
|
|
return False
|
|
|
|
|
|
def seriesHosters():
|
|
oGui = cGui()
|
|
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
|
sDesc = oInputParameterHandler.getValue('sDesc')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
sPattern = '<iframe.*?src="([^"]+)'
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
if (aResult[0] == True):
|
|
for aEntry in aResult[1]:
|
|
sUrl2 = aEntry
|
|
|
|
if 'https' not in sUrl2:
|
|
sUrl2 = 'https:' + sUrl2
|
|
|
|
sHost = ''
|
|
oHoster = cHosterGui().checkHoster(sUrl2)
|
|
if (oHoster != False ):
|
|
sHost= '[COLOR coral]' + oHoster.getDisplayName() + '[/COLOR]'
|
|
else :
|
|
sHost= '[COLOR pink]' + GetHostname(sUrl2) + '[/COLOR]'
|
|
|
|
# juste pour dire que c'est le lien le plus fiable en generale
|
|
if 'SendVid' in sHost:
|
|
sHost = sHost + ' #'
|
|
|
|
sDisplayTitle = sMovieTitle + ' ' + sHost
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oOutputParameterHandler.addParameter('referer', sUrl)
|
|
oGui.addLink(SITE_IDENTIFIER, 'hostersLink', sDisplayTitle, sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def GetHostname(url):
|
|
try:
|
|
if 'www' not in url:
|
|
sHost = re.search('http.*?\/\/([^.]*)', url).group(1)
|
|
else:
|
|
sHost = re.search('htt.+?\/\/(?:www).([^.]*)', url).group(1)
|
|
|
|
sHost = str(sHost).capitalize()
|
|
except:
|
|
sHost = url
|
|
return sHost
|
|
|
|
|
|
def hostersLink():
|
|
oGui = cGui()
|
|
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
sThumb = oInputParameterHandler.getValue('sThumb')
|
|
referer = oInputParameterHandler.getValue('referer')
|
|
|
|
sHosterUrl = sUrl
|
|
sDisplayMovieTitle = sMovieTitle
|
|
|
|
if 'oload.tv' in sUrl: #https://oload.tv/embed/0rRYBdB_3Xw/# #ace attorney vostfr
|
|
oGui.addText(SITE_IDENTIFIER, ' Vstream : Acces refusé : Le site Oload.tv n\'est pas sécurisé')
|
|
oGui.setEndOfDirectory()
|
|
return
|
|
|
|
oHoster = cHosterGui().checkHoster(sHosterUrl)
|
|
if (oHoster != False):
|
|
oHoster.setDisplayName(sDisplayMovieTitle)
|
|
oHoster.setFileName(sMovieTitle)
|
|
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, sThumb)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def SimilarTitle(s):
|
|
|
|
list_spe = [ '&', '\'', ',', '.', ';' ,'!']
|
|
|
|
s = s.strip()
|
|
if ' ' in s:
|
|
try:
|
|
s = str(s).lower()
|
|
sx = s.split(' ')
|
|
snew = sx[0] + ' ' + sx[1]
|
|
for spe in list_spe:
|
|
snews = snew.replace(spe, '')
|
|
return True, snews.lower()
|
|
except:
|
|
return False, False
|
|
return False, False
|