forked from axiom-team/astrXbian
392 lines
16 KiB
Python
392 lines
16 KiB
Python
# -*- coding: utf-8 -*-
|
|
# vStream https://github.com/Kodi-vStream/venom-xbmc-addons
|
|
import re
|
|
|
|
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
|
|
|
|
SITE_IDENTIFIER = 'adkami_com'
|
|
SITE_NAME = 'ADKami'
|
|
SITE_DESC = 'Bienvenue sur ADKami un site Animés Manga & Série en streaming.'
|
|
|
|
URL_MAIN = 'https://www.adkami.com/'
|
|
|
|
ANIM_ANIMS = ('http://', 'load')
|
|
ANIM_NEWS = (URL_MAIN + 'anime', 'showMovies')
|
|
ANIM_LIST = (URL_MAIN + 'video?search=&n=&g=&s=&v=&t=0&p=&order=&d1=&d2=&e=&m=&q=&l=', 'showAZ')
|
|
ANIM_VIEWS = (URL_MAIN + 'video?search=&t=0&order=3', 'showMovies')
|
|
|
|
SERIE_SERIES = ('http://', 'load')
|
|
SERIE_NEWS = (URL_MAIN + 'serie', 'showMovies')
|
|
SERIE_LIST = (URL_MAIN + 'video?search=&n=&g=&s=&v=&t=1&p=&order=&d1=&d2=&e=&m=&q=&l=', 'showAZ')
|
|
SERIE_VIEWS = (URL_MAIN + 'video?search=&t=1&order=3', 'showMovies')
|
|
|
|
SERIE_DRAMAS = (URL_MAIN + 'drama', 'showMovies')
|
|
DRAMA_LIST = (URL_MAIN + 'video?search=&n=&g=&s=&v=&t=5&p=&order=&d1=&d2=&e=&m=&q=&l=', 'showAZ')
|
|
DRAMA_VIEWS = (URL_MAIN + 'video?search=&t=5&order=3', 'showMovies')
|
|
|
|
URL_SEARCH = (URL_MAIN + 'video?search=', 'showMovies')
|
|
URL_SEARCH_SERIES = (URL_SEARCH[0], 'showMovies')
|
|
FUNCTION_SEARCH = 'showMovies'
|
|
|
|
|
|
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_LIST[0])
|
|
oGui.addDir(SITE_IDENTIFIER, ANIM_LIST[1], 'Animés (Liste)', 'animes.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', ANIM_VIEWS[0])
|
|
oGui.addDir(SITE_IDENTIFIER, ANIM_VIEWS[1], 'Animés (Les plus vus)', 'views.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', SERIE_LIST[0])
|
|
oGui.addDir(SITE_IDENTIFIER, SERIE_LIST[1], 'Séries (Liste)', 'az.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', SERIE_VIEWS[0])
|
|
oGui.addDir(SITE_IDENTIFIER, SERIE_VIEWS[1], 'Séries (Les plus vues)', 'views.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', DRAMA_LIST[0])
|
|
oGui.addDir(SITE_IDENTIFIER, DRAMA_LIST[1], 'Dramas (Liste)', 'az.png', oOutputParameterHandler)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', DRAMA_VIEWS[0])
|
|
oGui.addDir(SITE_IDENTIFIER, DRAMA_VIEWS[1], 'Dramas (Les plus vues)', 'dramas.png', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showSearch():
|
|
oGui = cGui()
|
|
|
|
sSearchText = oGui.showKeyBoard()
|
|
if (sSearchText != False):
|
|
sUrl = URL_SEARCH[0] + sSearchText
|
|
showMovies(sUrl)
|
|
oGui.setEndOfDirectory()
|
|
return
|
|
|
|
|
|
def showGenre():
|
|
oGui = cGui()
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sType2 = oInputParameterHandler.getValue('type2')
|
|
|
|
liste = []
|
|
liste.append(['Action', URL_MAIN + 'video?recherche=&genre3=1&type2=' + sType2])
|
|
liste.append(['Aventure', URL_MAIN + 'video?recherche=&genre3=2&type2=' + sType2])
|
|
liste.append(['Amour & Amitié', URL_MAIN + 'video?recherche=&genre3=3&type2=' + sType2])
|
|
liste.append(['Combat', URL_MAIN + 'video?recherche=&genre3=4&type2=' + sType2])
|
|
liste.append(['Comédie', URL_MAIN + 'video?recherche=&genre3=5&type2=' + sType2])
|
|
liste.append(['Contes & Récits', URL_MAIN + 'video?recherche=&genre3=6&type2=' + sType2])
|
|
liste.append(['Cyber & Mecha', URL_MAIN + 'video?recherche=&genre3=7&type2=' + sType2])
|
|
liste.append(['Dark Fantasy', URL_MAIN + 'video?recherche=&genre3=8&type2=' + sType2])
|
|
liste.append(['Drame', URL_MAIN + 'video?recherche=&genre3=9&type2=' + sType2])
|
|
liste.append(['Ecchi', URL_MAIN + 'video?recherche=&genre3=10&type2=' + sType2])
|
|
liste.append(['Éducatif', URL_MAIN + 'video?recherche=&genre3=11&type2=' + sType2])
|
|
liste.append(['Énigme & Policier', URL_MAIN + 'video?recherche=&genre3=12&type2=' + sType2])
|
|
liste.append(['Épique & Héroique', URL_MAIN + 'video?recherche=&genre3=13&type2=' + sType2])
|
|
liste.append(['Espace & Sci-Fiction', URL_MAIN + 'video?recherche=&genre3=14&type2=' + sType2])
|
|
liste.append(['Familial & Jeunesse', URL_MAIN + 'video?recherche=&genre3=15&type2=' + sType2])
|
|
liste.append(['Fantastique & Mythe', URL_MAIN + 'video?recherche=&genre3=16&type2=' + sType2])
|
|
liste.append(['Hentai', URL_MAIN + 'video?recherche=&genre3=17&type2=' + sType2])
|
|
liste.append(['Historique', URL_MAIN + 'video?recherche=&genre3=18&type2=' + sType2])
|
|
liste.append(['Horreur', URL_MAIN + 'video?recherche=&genre3=19&type2=' + sType2])
|
|
liste.append(['Magical Girl', URL_MAIN + 'video?recherche=&genre3=20&type2=' + sType2])
|
|
liste.append(['Musical', URL_MAIN + 'video?recherche=&genre3=21&type2=' + sType2])
|
|
liste.append(['Psychologique', URL_MAIN + 'video?recherche=&genre3=22&type2=' + sType2])
|
|
liste.append(['Sport', URL_MAIN + 'video?recherche=&genre3=23&type2=' + sType2])
|
|
liste.append(['Tranche de vie', URL_MAIN + 'video?recherche=&genre3=24&type2=' + sType2])
|
|
liste.append(['Shôjo-Ai', URL_MAIN + 'video?recherche=&genre3=25&type2=' + sType2])
|
|
liste.append(['Shônen-Ai', URL_MAIN + 'video?recherche=&genre3=26&type2=' + sType2])
|
|
liste.append(['Yaoi/BL', URL_MAIN + 'video?recherche=&genre3=27&type2=' + sType2])
|
|
|
|
for sTitle, sUrl in liste:
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
|
oGui.addDir(SITE_IDENTIFIER, 'showMovies', sTitle, 'genres.png', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showAZ():
|
|
oGui = cGui()
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
|
|
# pas d'url pour les non alpha, on utilise l'ancienne méthode épurée.
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
|
oGui.addDir(SITE_IDENTIFIER, 'showNoAlpha', '[COLOR teal] Lettre [COLOR red]123[/COLOR]', 'az.png', oOutputParameterHandler)
|
|
|
|
import string
|
|
for i in string.ascii_lowercase:
|
|
|
|
sUrl2 = sUrl + str(i)
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oGui.addDir(SITE_IDENTIFIER, 'showMovies', '[COLOR teal] Lettre [COLOR red]' + str(i).upper() + '[/COLOR]', 'az.png', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showNoAlpha():
|
|
oGui = cGui()
|
|
oParser = cParser()
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
# Decoupage pour cibler la partie non alpha
|
|
sPattern = 'class="video-item-list-days"><h5>Lettre 123</h5>(.+?)<div id="A"'
|
|
sHtmlContent = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
# regex pour listage sur la partie decoupée
|
|
sPattern = '<span class="top"><a href="([^"]+)"><span class="title">([^<]+)</span>'
|
|
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] # .decode("unicode_escape").encode("latin-1")
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
|
|
if 't=1' in sUrl:
|
|
oGui.addTV(SITE_IDENTIFIER, 'showEpisode', sTitle, 'series.png', '', '', oOutputParameterHandler)
|
|
elif 't=5' in sUrl:
|
|
oGui.addTV(SITE_IDENTIFIER, 'showEpisode', sTitle, 'dramas.png', '', '', oOutputParameterHandler)
|
|
else:
|
|
oGui.addAnime(SITE_IDENTIFIER, 'showEpisode', sTitle, 'animes.png', '', '', oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showMovies(sSearch=''):
|
|
oGui = cGui()
|
|
if sSearch:
|
|
sUrl = sSearch.replace(' ', '+')
|
|
else:
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
oParser = cParser()
|
|
sPattern = 'class="top">\s*<a href="([^"]+)">\s*<span class="title">([^<]+)'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
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
|
|
|
|
sUrl2 = aEntry[0]
|
|
sTitle = aEntry[1]
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl2)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
|
|
if 't=1' in sUrl:
|
|
oGui.addTV(SITE_IDENTIFIER, 'showEpisode', sTitle, 'series.png', '', '', oOutputParameterHandler)
|
|
elif 't=5' in sUrl:
|
|
oGui.addTV(SITE_IDENTIFIER, 'showEpisode', sTitle, 'dramas.png', '', '', oOutputParameterHandler)
|
|
else:
|
|
oGui.addAnime(SITE_IDENTIFIER, 'showEpisode', sTitle, 'animes.png', '', '', oOutputParameterHandler)
|
|
|
|
progress_.VSclose(progress_)
|
|
|
|
sNextPage = __checkForNextPage(sHtmlContent)
|
|
if (sNextPage != False):
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sNextPage)
|
|
number = re.search('page=([0-9]+)', sNextPage).group(1)
|
|
oGui.addNext(SITE_IDENTIFIER, 'showMovies', '[COLOR teal]Page ' + number + ' >>>[/COLOR]', oOutputParameterHandler)
|
|
|
|
if not sSearch:
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def __checkForNextPage(sHtmlContent):
|
|
oParser = cParser()
|
|
sPattern = '<button class=\'actuel\'>[0-9]+</button><a href="([^"]+?)"'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
return aResult[1][0]
|
|
|
|
return False
|
|
|
|
|
|
def showEpisode():
|
|
oGui = cGui()
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
|
|
oRequestHandler = cRequestHandler(sUrl)
|
|
sHtmlContent = oRequestHandler.request()
|
|
|
|
oParser = cParser()
|
|
# info anime et serie
|
|
sThumb = ''
|
|
sDesc = ''
|
|
try:
|
|
sPattern = '<img itemprop="image".+?src="([^"]+).+?<strong>(.+?)</strong>'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
sThumb = aResult[1][0][0]
|
|
sDesc = aResult[1][0][1]
|
|
sDesc = sDesc.replace('<br />', '')
|
|
except:
|
|
pass
|
|
|
|
sPattern = 'line-height:200px;font-size:26px;text-align:center;">L.anime est licencié<.p>'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
if (aResult[0] == True):
|
|
oGui.addText(SITE_IDENTIFIER, '[COLOR red]Animé licencié[/COLOR]')
|
|
|
|
else:
|
|
sPattern = '<li class="saison">([^<]+)</li>|<a href="(https://www\.adkami\.com[^"]+)"[^<>]+>([^<]+)</a></li>'
|
|
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if (aResult[0] == True):
|
|
for aEntry in aResult[1]:
|
|
if aEntry[0]:
|
|
oGui.addText(SITE_IDENTIFIER, '[COLOR red]' + aEntry[0].capitalize() + '[/COLOR]')
|
|
else:
|
|
sUrl = aEntry[1]
|
|
sTitle = sMovieTitle + ' ' + aEntry[2]
|
|
sTitle = re.sub(' vf', ' (VF)', sTitle, re.IGNORECASE)
|
|
sDisplayTitle = re.sub(' vostfr', ' (VOSTFR)', sTitle, re.IGNORECASE)
|
|
sTitle = sDisplayTitle.replace(' (VF)', '').replace(' (VOSTFR)', '')
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oOutputParameterHandler.addParameter('sDesc', sDesc)
|
|
|
|
oGui.addEpisode(SITE_IDENTIFIER, 'showLinks', sDisplayTitle, 'series.png', sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showLinks():
|
|
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 = 'video-iframe" data-url="([^"]+)"'
|
|
oParser = cParser()
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
if not aResult[0]:
|
|
sPattern = '<iframe.+?src="([^"]+)"'
|
|
aResult = oParser.parse(sHtmlContent, sPattern)
|
|
|
|
for aEntry in aResult[1]:
|
|
sUrl = aEntry.replace('+', 'plus')
|
|
try:
|
|
sUrl = decodex(sUrl)
|
|
except Exception:
|
|
pass
|
|
|
|
if sUrl.startswith('//'):
|
|
sUrl = 'https:' + sUrl
|
|
|
|
if 'www.' in sUrl:
|
|
sHost = sUrl.split("/")[2].split('.')[1]
|
|
else:
|
|
sHost = sUrl.split("/")[2].split('.')[0]
|
|
|
|
if sHost:
|
|
if "crunchyroll" in str(sHost) or "wakanim" in str(sHost) or "animedigitalnetwork" in str(sHost):
|
|
sTitle = "[COLOR red]Licencié par : %s [/COLOR]" % str(sHost)
|
|
else:
|
|
sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, sHost.capitalize())
|
|
else:
|
|
sTitle = ('%s [COLOR coral]%s[/COLOR]') % (sMovieTitle, 'Inconnu')
|
|
|
|
oOutputParameterHandler = cOutputParameterHandler()
|
|
oOutputParameterHandler.addParameter('siteUrl', sUrl)
|
|
oOutputParameterHandler.addParameter('sMovieTitle', sMovieTitle)
|
|
oOutputParameterHandler.addParameter('sThumb', sThumb)
|
|
oGui.addLink(SITE_IDENTIFIER, 'showHosters', sTitle, sThumb, sDesc, oOutputParameterHandler)
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def showHosters():
|
|
oGui = cGui()
|
|
oInputParameterHandler = cInputParameterHandler()
|
|
sUrl = oInputParameterHandler.getValue('siteUrl')
|
|
sMovieTitle = oInputParameterHandler.getValue('sMovieTitle')
|
|
|
|
# bidouille facile
|
|
sUrl = sUrl.replace('plus', '+')
|
|
sHosterUrl = sUrl
|
|
|
|
if (sHosterUrl):
|
|
oHoster = cHosterGui().checkHoster(sHosterUrl)
|
|
if (oHoster != False):
|
|
oHoster.setDisplayName(sMovieTitle)
|
|
oHoster.setFileName(sMovieTitle)
|
|
cHosterGui().showHoster(oGui, oHoster, sHosterUrl, '')
|
|
|
|
oGui.setEndOfDirectory()
|
|
|
|
|
|
def decodex(x):
|
|
from itertools import chain
|
|
import base64
|
|
|
|
e = base64.b64decode(x.replace('https://www.youtube.com/embed/', ''))
|
|
t = ''
|
|
r = "ETEfazefzeaZa13MnZEe"
|
|
a = 0
|
|
|
|
px = chain(e)
|
|
for y in list(px):
|
|
t += chr(int(175 ^ ord(y[0])) - ord(r[a]))
|
|
a = 0 if a > len(r) - 2 else a + 1
|
|
return t
|