Files
addon/channels/aniplay.py
Alhaziel01 1398e96ed6 Fix Aniplay
2022-04-20 19:21:35 +02:00

332 lines
13 KiB
Python

from platformcode import config, logger, autorenumber
from core import httptools, scrapertools, support, tmdb
from inspect import stack
import sys
if sys.version_info[0] >= 3:
from concurrent import futures
else:
from concurrent_py2 import futures
host = config.get_channel_url()
sort = ['views', 'title', 'episodeNumber', 'startDate', 'endDate', 'createdDate'][config.get_setting('sort', 'aniplay')]
order = 'asc' if config.get_setting('order', 'aniplay') else 'desc'
perpage = [10, 20, 30 ,40, 50, 60, 70, 80, 90][config.get_setting('perpage', 'aniplay')]
@support.menu
def mainlist(item):
anime=['/api/anime/advanced-search',
('A-Z', ['/api/anime/advanced-search', 'submenu_az', '']),
('Anno', ['', 'submenu_year', '']),
('Top', ['', 'submenu_top', '']),
('Ultimi aggiunti', ['', 'latest_added', ''])]
return locals()
def submenu_az(item):
itemlist = []
for letter in ['0-9'] + list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'):
itemlist.append(item.clone(title = support.typo(letter, 'bold'),
url= host + '/api/anime/find-by-char',
action= 'peliculas',
variable= '&character=' + letter,
thumbnail=support.thumb('az')))
return itemlist
def submenu_year(item):
itemlist = []
from datetime import date
current = date.today().year
first = int(httptools.downloadpage('{}/api/anime/advanced-search?page=0&size=1&sort=startDate,asc&sort=id'.format(host)).json[0]['startDate'].split('-')[0]) -1
for year in range(current, first, -1):
itemlist.append(item.clone(title = support.typo(year, 'bold'),
action= 'submenu_season',
variable= year,
thumbnail=support.thumb('year')))
return itemlist
def submenu_top(item):
itemlist = []
links = {'Top del giorno':'daily-top', 'Top della settimana':'weekly-top', 'Top del mese':'monthly-top'}
for label in links:
link = links[label]
itemlist.append(item.clone(title = support.typo(label, 'bold'),
action= 'submenu_top_of',
variable= link))
return itemlist
def submenu_season(item):
itemlist = []
seasons = {'winter':'Inverno', 'spring':'Primavera', 'summer':'Estate', 'fall':'Autunno'}
url= '{}/api/seasonal-view?page=0&size=36&years={}'.format(host, item.variable)
js = httptools.downloadpage(url).json[0]['seasonalAnime']
for season in js:
s = season['season'].split('.')[-1]
title = seasons[s]
itemlist.append(item.clone(title=title,
url = '{}/api/seasonal-view/{}-{}'.format(host, s, item.variable),
thumbnail = support.thumb(s),
action = 'peliculas',
variable=''))
return itemlist
def submenu_top_of(item):
itemlist = []
url= '{}/api/home/{}'.format(host, item.variable)
js = httptools.downloadpage(url).json
for anime in js:
fulltitle = anime['animeTitle']
title = fulltitle.split('(')[0].strip()
scrapedlang = scrapertools.find_single_match(fulltitle, r'\(([^\)]+)')
lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA'
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod')
itemlist.append(item.clone(title=long_title,
id=anime['animeId'],
url = '{}/api/anime/{}'.format(host, anime['animeId']),
thumbnail = get_thumbnail(anime, 'animeHorizontalImages'),
action = 'episodios',
variable=anime['animeId']))
return itemlist
def search(item, texto):
support.info(texto)
item.url = host + '/api/anime/advanced-search'
item.variable = '&query=' + texto
try:
return peliculas(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return []
def newest(categoria):
support.info(categoria)
item = support.Item()
try:
if categoria == "anime":
return latest_added(item)
# Continua la ricerca in caso di errore
except:
import sys
for line in sys.exc_info():
support.logger.error("{0}".format(line))
return []
def latest_added(item):
itemlist = []
page = item.page if item.page else 0
url= '{}/api/home/latest-episodes?page={}'.format(host, page)
js = httptools.downloadpage(url).json
for episode in js:
title = episode['title'] if episode['title'] else ''
animeTitle, lang = get_lang(episode['animeTitle'])
quality = 'Full HD' if episode['fullHd'] else 'HD'
long_title = support.typo('{}. {}{}'.format(int(float(episode['episodeNumber'])), title + ' - ' if title else '', animeTitle), 'bold') + support.typo(lang, '_ [] color kod') + support.typo(quality, '_ [] color kod')
image = get_thumbnail(episode, 'episodeImages')
itemlist.append(item.clone(title=long_title,
fulltitle=title,
animeId = episode['animeId'],
id=episode['id'],
contentType = 'episode',
contentTitle = title,
contentSerieName = animeTitle,
contentLanguage = lang,
quality = quality,
contentEpisodeNumber = int(float(episode['episodeNumber'])),
animeUrl = '{}/api/anime/{}'.format(host, episode['animeId']),
thumbnail = image,
fanart = image,
action = 'findvideos'))
if stack()[1][3] not in ['newest']:
support.nextPage(itemlist, item.clone(page = page + 1))
return itemlist
def peliculas(item):
logger.debug()
itemlist = []
page = item.page if item.page else 0
js = httptools.downloadpage('{}?page={}&size={}{}&sort={},{}&sort=id'.format(item.url, page, perpage, item.variable, sort, order)).json
for it in js:
title, lang = get_lang(it['title'])
long_title = support.typo(title, 'bold') + support.typo(lang, '_ [] color kod')
itemlist.append(item.clone(title = long_title,
fulltitle = title,
show = title,
contentLanguage = lang,
contentType = 'movie' if it['type'] == 'Movie' else 'tvshow',
contentTitle = title,
contentSerieName = title if it['type'] == 'Serie' else '',
action ='findvideos' if it['type'] == 'Movie' else 'episodios',# '' if not active else 'findvideos' if it['type'] == 'Movie' else 'episodios',
plot = it['storyline'],
# year = it['startDate'].split('-')[0],
url = '{}/api/anime/{}'.format(host, it['id']),
thumbnail = get_thumbnail(it),
fanart = get_thumbnail(it, 'horizontalImages')))
autorenumber.start(itemlist)
tmdb.set_infoLabels_itemlist(itemlist, seekTmdb=True)
if len(itemlist) == perpage:
support.nextPage(itemlist, item.clone(page = page + 1))
return itemlist
def episodios(item):
logger.debug()
itemlist = []
# url = '{}/api/anime/{}'.format(host, item.id)
json = httptools.downloadpage(item.url, CF=False ).json
if type(json) == list:
item.show_renumber = False
itemlist = list_episodes(item, json)
elif json.get('seasons'):
seasons = json['seasons']
seasons.sort(key=lambda s: s['episodeStart'])
for it in seasons:
title = it['name']
itemlist.append(item.clone(title = title,
id= '{}/season/{}'.format(it['animeId'], it['id']),
contentType = 'season',
action = 'list_episodes',
plot = json['storyline'],
year = it['yearStart'],
show_renumber = True))
# If the call come from the videolibrary or autorenumber, shows the episodes
if stack()[1][3] in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']:
itlist = []
with futures.ThreadPoolExecutor() as executor:
eplist = []
for ep in itemlist:
ep.show_renumber = False
eplist.append(executor.submit(list_episodes, ep))
for res in futures.as_completed(eplist):
if res.result():
itlist.extend(res.result())
itemlist = itlist
elif json.get('episodes'):
itemlist = list_episodes(item, json)
# add renumber option
if stack()[1][3] not in ['find_episodes'] and itemlist and itemlist[0].contentType == 'episode':
autorenumber.start(itemlist, item)
# add add to videolibrary menu
if stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes']:
support.videolibrary(itemlist, item)
return itemlist
def list_episodes(item, json=None):
itemlist = []
if not json:
url = '{}/api/anime/{}'.format(host, item.id)
json = httptools.downloadpage(url, CF=False ).json
episodes = json['episodes'] if 'episodes' in json else json
episodes.sort(key=lambda ep: int(ep['episodeNumber'].split('.')[0]))
for it in episodes:
quality = 'Full HD' if it['fullHd'] else 'HD'
if item.contentSeason:
episode = '{}x{:02d}'.format(item.contentSeason, int(it['episodeNumber'].split('.')[0]))
else:
episode = '{:02d}'.format(int(it['episodeNumber'].split('.')[0]))
title = support.typo('{}. {}'.format(episode, it['title']), 'bold')
image = get_thumbnail(it, 'episodeImages')
itemlist.append(item.clone(title = title,
id= it['id'],
url= 'api/episode/{}'.format(it['id']),
contentType = 'episode',
contentEpisodeNumber = int(it['episodeNumber'].split('.')[0]),
contentSeason = item.contentSeason if item.contentSeason else '',
action = 'findvideos',
quality = quality,
thumbnail = image,
fanart= image))
# Renumber episodes only if shown in the menu
if item.show_renumber:
autorenumber.start(itemlist, item)
return itemlist
def findvideos(item):
logger.debug()
url = '{}/api/{}/{}'.format(host, 'episode' if item.contentType == 'episode' else 'anime', item.id)
json = httptools.downloadpage(url, CF=False ).json
if json.get('episodes', []):
json = httptools.downloadpage('{}/api/episode/{}'.format(host, json['episodes'][0]['id'])).json
# logger.debug(json)
videourl = json['videoUrl']
itemlist = [item.clone(title=config.get_localized_string(30137),
url=videourl,
server='directo')]
return support.server(item, itemlist=itemlist)
def get_thumbnail(data, prop = 'verticalImages', key = 'full'):
"""
" Returns the vertical image as per given key and prop
" possibile key values are:
" - small
" - full
" - blurred
" - medium
" possibile prop values are:
" - verticalImages
" - animeHorizontalImages
" - animeVerticalImages
" - horizontalImages
" - episodeImages
"""
value = None
verticalImages = data.get(prop, [])
if verticalImages:
first = verticalImages[0]
if first:
value = first.get('image' + key.capitalize(), '')
return value
def get_lang(value):
title = value.split('(')[0] if value else ''
scrapedlang = scrapertools.find_single_match(value, r'\(([^\)]+)')
lang = scrapedlang.upper() if scrapedlang else 'Sub-ITA'
return title, lang