Modifiche ad Alpha

This commit is contained in:
Alhaziel01
2021-08-24 17:38:44 +02:00
parent 2764c48805
commit dfeec60fe3
27 changed files with 1945 additions and 67 deletions
+27
View File
@@ -0,0 +1,27 @@
{
"id": "altadefinizionecommunity",
"name": "Altadefinizione Community",
"language": ["ita", "sub-ita"],
"active": true,
"thumbnail": "altadefinizionecommunity.png",
"banner": "",
"categories": ["movie", "tvshow", "vos"],
"not_active": ["include_in_newest"],
"settings": [
{
"default": "",
"enabled": true,
"id": "username",
"label": "username",
"type": "text",
"visible": true
},
{
"default": "",
"enabled": true,
"id": "password",
"label": "password",
"type": "text",
"visible": true
}]
}
+230
View File
@@ -0,0 +1,230 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Altadefinizione Community
from logging import debug
from core import jsontools, support
from lib.fakeMail import Gmailnator
from platformcode import config, platformtools, logger
from core import scrapertools, httptools
def findhost(url):
return support.match(url, patron=r'<a href="([^"]+)/\w+">Accedi').match
host = config.get_channel_url(findhost)
register_url = 'https://altaregistrazione.com'
headers = {'Referer': host, 'x-requested-with': 'XMLHttpRequest'}
@support.menu
def mainlist(item):
support.info(item)
film = ['/load-more-film?anno=&order=&support_webp=1&type=movie&page=1',
# Voce Menu,['url','action','args',contentType]
('Generi', ['', 'genres', 'genres']),
]
tvshow = ['/load-more-film?type=tvshow&anno=&order=&support_webp=1&page=1',
# Voce Menu,['url','action','args',contentType]
('Generi', ['', 'genres', 'genres']),
]
altri = [
# ('Per Lettera', ['/lista-film', 'genres', 'letters']),
('Qualità', ['', 'genres', 'quality']),
# ('Anni', ['/anno', 'genres', 'years'])
]
search = ''
return locals()
def login():
r = support.httptools.downloadpage(host, cloudscraper=True)
Token = support.match(r.data, patron=r'name=\s*"_token"\s*value=\s*"([^"]+)', cloudscraper=True).match
if 'id="logged"' in r.text:
logger.info('Già loggato')
else:
logger.info('Login in corso')
post = {'_token': '',
'form_action':'login',
'email': config.get_setting('username', channel='altadefinizionecommunity'),
'password':config.get_setting('password', channel='altadefinizionecommunity')}
r = support.httptools.downloadpage(host + '/login', post=post, headers={'referer': host}, cloudscraper=True)
if not r.status_code in [200, 302] or 'Email o Password non validi' in r.text:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Username/password non validi')
return False
return 'id="logged"' in r.text
def registerOrLogin():
if config.get_setting('username', channel='altadefinizionecommunity') and config.get_setting('password', channel='altadefinizionecommunity'):
if login():
return True
action = platformtools.dialog_yesno('AltadefinizioneCommunity',
'Questo server necessita di un account, ne hai già uno oppure vuoi tentare una registrazione automatica?',
yeslabel='Accedi', nolabel='Tenta registrazione', customlabel='Annulla')
if action == 1: # accedi
from specials import setting
from core.item import Item
user_pre = config.get_setting('username', channel='altadefinizionecommunity')
password_pre = config.get_setting('password', channel='altadefinizionecommunity')
setting.channel_config(Item(config='altadefinizionecommunity'))
user_post = config.get_setting('username', channel='altadefinizionecommunity')
password_post = config.get_setting('password', channel='altadefinizionecommunity')
if user_pre != user_post or password_pre != password_post:
return registerOrLogin()
else:
return []
elif action == 0: # tenta registrazione
import random
import string
logger.debug('Registrazione automatica in corso')
mailbox = Gmailnator()
randPsw = ''.join(random.choice(string.ascii_letters + string.digits) for i in range(10))
logger.debug('email: ' + mailbox.address)
logger.debug('pass: ' + randPsw)
reg = platformtools.dialog_register(register_url, email=True, password=True, email_default=mailbox.address, password_default=randPsw)
if not reg:
return False
regPost = httptools.downloadpage(register_url, post={'email': reg['email'], 'password': reg['password']}, cloudscraper=True)
if regPost.url == register_url:
error = scrapertools.htmlclean(scrapertools.find_single_match(regPost.data, 'Impossibile proseguire.*?</div>'))
error = scrapertools.unescape(scrapertools.re.sub('\n\s+', ' ', error))
platformtools.dialog_ok('AltadefinizioneCommunity', error)
return False
if reg['email'] == mailbox.address:
if "L'indirizzo email risulta già registrato" in regPost.data:
# httptools.downloadpage(baseUrl + '/forgotPassword', post={'email': reg['email']})
platformtools.dialog_ok('AltadefinizioneCommunity', 'Indirizzo mail già utilizzato')
return False
mail = mailbox.waitForMail()
if mail:
checkUrl = scrapertools.find_single_match(mail.body, '<a href="([^"]+)[^>]+>Verifica').replace(r'\/', '/')
logger.debug('CheckURL: ' + checkUrl)
httptools.downloadpage(checkUrl, cloudscraper=True)
config.set_setting('username', mailbox.address, channel='altadefinizionecommunity')
config.set_setting('password', randPsw, channel='altadefinizionecommunity')
platformtools.dialog_ok('AltadefinizioneCommunity',
'Registrato automaticamente con queste credenziali:\nemail:' + mailbox.address + '\npass: ' + randPsw)
else:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Impossibile registrarsi automaticamente')
return False
else:
platformtools.dialog_ok('AltadefinizioneCommunity', 'Hai modificato la mail quindi KoD non sarà in grado di effettuare la verifica in autonomia, apri la casella ' + reg['email']
+ ' e clicca sul link. Premi ok quando fatto')
logger.debug('Registrazione completata')
else:
return False
return True
@support.scrape
def peliculas(item):
json = {}
action = 'check'
if '/load-more-film' not in item.url and '/search' not in item.url: # generi o altri menu, converto
import ast
ajax = support.match(item.url, patron='ajax_data\s*=\s*"?\s*([^;]+)', cloudscraper=True).match
item.url = host + '/load-more-film?' + support.urlencode(ast.literal_eval(ajax)) + '&page=1'
if not '/search' in item.url:
json = support.httptools.downloadpage(item.url, headers=headers, cloudscraper=True).json
data = "\n".join(json['data'])
else:
disabletmdb = True
data = support.httptools.downloadpage(item.url, headers=headers, cloudscraper=True).data
patron = r'wrapFilm">\s*<a href="(?P<url>[^"]+)">\s*<span class="year">(?P<year>[0-9]{4})</span>\s*<span[^>]+>[^<]+</span>\s*<span class="qual">(?P<quality>[^<]+).*?<img src="(?P<thumbnail>[^"]+)[^>]+>\s*<h3>(?P<title>[^<[]+)(?:\[(?P<lang>[sSuUbBiItTaA-]+))?'
# paginazione
if json.get('have_next'):
def fullItemlistHook(itemlist):
spl = item.url.split('=')
url = '='.join(spl[:-1])
page = str(int(spl[-1])+1)
support.nextPage(itemlist, item, next_page='='.join((url, page)), function_or_level='peliculas')
return itemlist
return locals()
def search(item, texto):
support.info("search ", texto)
item.args = 'search'
item.url = host + "/search?s={}&page=1".format(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 []
@support.scrape
def genres(item):
support.info(item)
data = support.httptools.downloadpage(item.url, cloudscraper=True).data
patronMenu = r'<a href="(?P<url>[^"]+)">(?P<title>[^<]+)'
if item.args == 'quality':
patronBlock = 'Risoluzione(?P<block>.*?)</ul>'
else:
patronBlock = ('Film' if item.contentType == 'movie' else 'Serie TV') + r'<span></span></a>\s+<ul class="dropdown-menu(?P<block>.*?)active-parent-menu'
action = 'peliculas'
return locals()
@support.scrape
def episodios(item):
support.info(item)
data = item.data
patron = r'class="playtvshow " data-href="(?P<url>[^"]+)'
def itemHook(it):
spl = it.url.split('/')[-2:]
it.infoLabels['season'] = int(spl[0])+1
it.infoLabels['episode'] = int(spl[1])+1
return it
return locals()
def check(item):
if '/watch-unsubscribed' not in item.url:
playWindow = support.match(support.httptools.downloadpage(item.url, cloudscraper=True).data, patron='playWindow" href="([^"]+)')
video_url = playWindow.match
if '/tvshow' in video_url:
item.data = playWindow.data
item.contentType = 'tvshow'
return episodios(item)
else:
item.video_url = video_url.replace('/watch-unsubscribed', '/watch-external')
return findvideos(item)
def findvideos(item):
itemlist = []
itemlist.append(item.clone(action='play', url=support.match(item.video_url, patron='allowfullscreen[^<]+src="([^"]+)"', cloudscraper=True).match, quality=''))
return support.server(item, itemlist=itemlist)
def play(item):
if host in item.url: # intercetto il server proprietario
if registerOrLogin():
return support.get_jwplayer_mediaurl(support.httptools.downloadpage(item.url, cloudscraper=True).data, 'Diretto')
else:
platformtools.play_canceled = True
return []
else:
return [item]
+37
View File
@@ -0,0 +1,37 @@
{
"id": "aniplay",
"name": "AniPlay",
"active": true,
"language": ["ita", "sub-ita"],
"thumbnail": "aniplay.png",
"banner": "aniplay.png",
"categories": ["anime", "vos"],
"settings": [
{
"id": "sort",
"type": "list",
"label": "Ordine di Visualizzazione",
"default": 0,
"enabled": true,
"visible": true,
"lvalues": [ "Popolarità", "Titolo", "Numero Episodi", "Data di inizio", "Data di fine", "Data di aggiunta"]
},
{
"id": "order",
"type": "bool",
"label": "Visualizza in ordine Discendente?",
"default": false,
"enabled": true,
"visible": true
},
{
"id": "perpage",
"type": "list",
"label": "Numero di elementi per pagina",
"default": 1,
"enabled": true,
"visible": true,
"lvalues": ["10", "20", "30", "40", "50", "60", "80", "90"]
}
]
}
+331
View File
@@ -0,0 +1,331 @@
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 = []
if item.args == 'az':
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']
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
videourl = json['episodeVideo']
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
+1 -1
View File
@@ -5,6 +5,6 @@
"active": true,
"thumbnail": "cb01.png",
"banner": "cb01.png",
"categories": ["tvshow", "movie", "sub, "documentary"],
"categories": ["tvshow", "movie", "sub", "documentary"],
"settings": []
}
+369
View File
@@ -0,0 +1,369 @@
# -*- coding: utf-8 -*-
# ------------------------------------------------------------
# Canale per Mediaset Play
# ------------------------------------------------------------
from platformcode import logger, config
import uuid
import requests, sys
from core import support, jsontools
if sys.version_info[0] >= 3: from urllib.parse import urlencode, quote
else: from urllib import urlencode, quote
if sys.version_info[0] >= 3: from concurrent import futures
else: from concurrent_py2 import futures
from collections import OrderedDict
PAGINATION = 4
host = config.get_channel_url()
post_url = '?assetTypes=HD,browser,widevine,geoIT|geoNo:HD,browser,geoIT|geoNo:HD,geoIT|geoNo:SD,browser,widevine,geoIT|geoNo:SD,browser,geoIT|geoNo:SD,geoIT|geoNo&auto=true&balance=true&format=smil&formats=MPEG-DASH,MPEG4,M3U&tracking=true'
deviceid = '61d27df7-5cbf-4419-ba06-cfd27ecd4588'
loginUrl = 'https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v2.0'
loginData = {"cid": deviceid, "platform": "pc", "appName": "web/mediasetplay-web/d667681"}
lic_url = 'https://widevine.entitlement.theplatform.eu/wv/web/ModularDrm/getRawWidevineLicense?releasePid=%s&account=http://access.auth.theplatform.com/data/Account/2702976343&schema=1.0&token={token}|Accept=*/*&Content-Type=&User-Agent=' + support.httptools.get_user_agent() + '|R{{SSM}}|'
entry = 'https://api.one.accedo.tv/content/entry/{id}?locale=it'
entries = 'https://api.one.accedo.tv/content/entries?id={id}&locale=it'
sessionUrl = "https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid={uuid}&gid=default"
current_session = requests.Session()
current_session.headers.update({'Content-Type': 'application/json', 'User-Agent': support.httptools.get_user_agent(), 'Referer': support.config.get_channel_url()})
# login anonimo
res = current_session.post(loginUrl, json=loginData, verify=False)
support.dbg()
Token = res.json['response']['beToken']
sid = res.json['response']['sid']
current_session.headers.update({'authorization': 'Bearer' + Token})
lic_url = lic_url.format(token=Token)
tracecid = res.json()['response']['traceCid']
cwid = res.json()['response']['cwId']
# sessione
res = current_session.get(sessionUrl.format(uuid=str(uuid.uuid4())), verify=False)
current_session.headers.update({'x-session': res.json()['sessionKey']})
cdict = {'CVFILM':'filmUltimiArrivi',
'CWFILMTOPVIEWED':'filmPiuVisti24H',
'CWFILMCOMEDY':'filmCommedia',
'CWFILMACTION':'filmAzioneThrillerAvventura',
'CWFILMDRAMATIC':'filmDrammatico',
'CWFILMSENTIMENTAL':'filmSentimentale',
'CWFILMCLASSIC':'filmClassici',
'personToContentFilm':'personToContentFilm',
'CWHOMEFICTIONNOWELITE':'stagioniFictionSerieTvSezione',
'CWFICTIONSOAP':'mostRecentSoapOpera',
'CWFICTIONDRAMATIC':'stagioniFictionDrammatico',
'CWFICTIONPOLICE':'stagioniFictionPoliziesco',
'CWFICTIONCOMEDY':'stagioniFictionCommedia',
'CWFICTIONSITCOM':'stagioniFictionSitCom',
'CWFICTIONSENTIMENTAL':'stagioniFictionSentimentale',
'CWFICTIONBIOGRAPHICAL':'stagioniFictionBiografico',
'CWPROGTVPRIME':'stagioniPrimaSerata',
'CWPROGTVDAY':'stagioniDaytime',
'CWPROGTVTOPVIEWED':'programmiTvClip24H',
'CWPROGTVTALENT':'stagioniReality',
'CWPROGTVVARIETY':'stagioniVarieta',
'CWPROGTVTALK':'stagioniTalk',
'CWPROGTVTG':'mostRecentTg',
'CWPROGTVSPORT':'mostRecentSport',
'CWPROGTVMAGAZINE':'stagioniCucinaLifestyle',
'CWDOCUMOSTRECENT':'mostRecentDocumentariFep',
'CWDOCUTOPVIEWED':'stagioniDocumentari',
'CWDOCUSPAZIO':'documentariSpazio',
'CWDOCUNATURANIMALI':'documentariNatura',
'CWDOCUSCIENZATECH':'documentariScienza',
'CWDOCUBIOSTORIE':'documentariBioStoria',
'CWDOCUINCHIESTE':'documentariInchiesta',
'CWFILMDOCU':'filmDocumentario',
'CWKIDSBOINGFORYOU':'kidsBoing',
'CWKIDSCARTOONITO':'kidsCartoonito',
'CWKIDSMEDIASETBRAND':'kidsMediaset',
'CWENABLERKIDS':'stagioniKids'}
@support.menu
def mainlist(item):
top = [('Dirette {bold}', ['https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle', 'live'])]
menu = [('Fiction / Serie TV {bullet bold}', ['/fiction', 'menu', ['Tutte','all','searchStagioni', '5acfcb3c23eec6000d64a6a4'], 'tvshow']),
('Programmi TV{ bullet bold}', ['/programmitv', 'menu', ['Tutti','all','searchStagioni', '5acfc8011de1c4000b6ec953'], 'tvshow']),
('Documentari {bullet bold}', ['/documentari', 'menu', ['Tutti','all','', '5bfd17c423eec6001aec49f9'], 'undefined']),
('Kids {bullet bold}', ['/kids', 'menu',['Tutti','all','', '5acfcb8323eec6000d64a6b3'], 'undefined'])]
search = ''
return locals()
def search(item, text):
itemlist = []
logger.debug(text)
item.search = text
try:
itemlist = peliculas(item)
except:
import sys
for line in sys.exc_info():
support.logger.error("%s" % line)
return itemlist
def menu(item):
logger.debug()
itemlist = []
if item.url:
json = get_from_id(item)
for it in json:
logger.debug(jsontools.dump(it))
if 'uxReference' in it: itemlist.append(
item.clone(title=support.typo(it['title'], 'bullet bold'), url= it['landingUrl'], feed = it.get('feedurlV2',''), ref=it['uxReference'], args='', action='peliculas'))
return itemlist
def liveDict():
livedict = OrderedDict({})
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-stations?sort=ShortTitle').json()['entries']
for it in json:
urls = []
if it.get('tuningInstruction') and not it.get('mediasetstation$digitalOnly'):
guide=current_session.get('https://static3.mediasetplay.mediaset.it/apigw/nownext/' + it['callSign'] + '.json').json()['response']
for key in it['tuningInstruction']['urn:theplatform:tv:location:any']:
urls += key['publicUrls']
title = it['title']
livedict[title] = {}
livedict[title]['urls'] = urls
livedict[title]['plot'] = support.typo(guide['currentListing']['mediasetlisting$epgTitle'],'bold') + '\n' + guide['currentListing']['mediasetlisting$shortDescription'] + '\n' + guide['currentListing']['description'] + '\n\n' + support.typo('A Seguire:' + guide['nextListing']['mediasetlisting$epgTitle'], 'bold')
return livedict
def live(item):
logger.debug()
itemlist = []
for key, value in liveDict().items():
itemlist.append(item.clone(title=support.typo(key, 'bold'),
fulltitle=key,
show=key,
contentTitle=key,
forcethumb=True,
urls=value['urls'],
plot=value['plot'],
action='play',
no_return=True))
return support.thumb(itemlist, live=True)
def peliculas(item):
logger.debug()
itemlist = []
titlelist = []
contentType = ''
if item.text:
json = []
itlist = []
with futures.ThreadPoolExecutor() as executor:
for arg in ['searchMovie', 'searchStagioni', 'searchClip']:
item.args = ['', 'search', arg]
itlist += [executor.submit(get_programs, item)]
for res in futures.as_completed(itlist):
json += res.result()
else:
json = get_programs(item)
for it in json:
if item.search.lower() in it['title'].lower() and it['title'] not in titlelist:
titlelist.append(it['title'])
if 'media' in it:
action = 'findvideos'
contentType = 'movie'
urls = []
for key in it['media']:
urls.append(key['publicUrl'])
else:
action = 'epmenu'
contentType = 'tvshow'
urls = it['mediasetprogram$brandId']
if urls:
title = it['mediasetprogram$brandTitle'] + ' - ' if 'mediasetprogram$brandTitle' in it and it['mediasetprogram$brandTitle'] != it['title'] else ''
itemlist.append(
item.clone(channel=item.channel,
action=action,
title=support.typo(title + it['title'], 'bold'),
fulltitle=it['title'],
show=it['title'],
contentType=contentType if contentType else item.contentType,
contentTitle=it['title'] if 'movie' in [contentType, item.contentType] else '',
contentSerieName=it['title'] if 'tvshow' in [contentType, item.contentType] else '',
thumbnail=it['thumbnails']['image_vertical-264x396']['url'] if 'image_vertical-264x396' in it['thumbnails'] else '',
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
plot=it['longDescription'] if 'longDescription' in it else it['description'] if 'description' in it else '',
urls=urls,
seriesid = it.get('seriesId',''),
url=it['mediasetprogram$pageUrl'],
forcethumb=True,
no_return=True))
if item.feed:
item.page = item.page + 100 if item.page else 101
support.nextPage(itemlist, item)
return itemlist
def epmenu(item):
logger.debug()
itemlist = []
if item.seriesid:
seasons = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-tv-seasons?bySeriesId=' + item.seriesid).json()['entries']
for season in seasons:
if 'mediasettvseason$brandId' in season and 'mediasettvseason$displaySeason' in season:
itemlist.append(
item.clone(seriesid = '',
title=support.typo(season['mediasettvseason$displaySeason'], 'bold'),
urls=season['mediasettvseason$brandId']))
itemlist = sorted(itemlist, key=lambda it: it.title, reverse=True)
if len(itemlist) == 1: return epmenu(itemlist[0])
if not itemlist:
entries = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + item.urls + '}').json()['entries']
for entry in entries:
if 'mediasetprogram$subBrandId' in entry:
itemlist.append(
item.clone(action='episodios',
title=support.typo(entry['description'], 'bold'),
url=entry['mediasetprogram$subBrandId'],
order=entry.get('mediasetprogram$order',0)))
if len(itemlist) == 1: return episodios(itemlist[0])
itemlist = sorted(itemlist, key=lambda it: it.order)
return itemlist
def episodios(item):
logger.debug()
itemlist = []
if not item.nextIndex: item.nextIndex = 1
url = 'https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{'+ item.url + '}&range=' + str(item.nextIndex) + '-' + str(item.nextIndex + PAGINATION)
json = current_session.get(url).json()['entries']
for it in json:
urls = []
if 'media' in it:
for key in it['media']:
urls.append(key['publicUrl'])
if urls:
title = it['title']
itemlist.append(
item.clone(action='findvideos',
title=support.typo(title, 'bold'),
contentType='episode',
thumbnail=it['thumbnails']['image_vertical-264x396']['url'] if 'image_vertical-264x396' in it['thumbnails'] else '',
fanart=it['thumbnails']['image_keyframe_poster-1280x720']['url'] if 'image_keyframe_poster-1280x720' in it['thumbnails'] else '',
plot=it['longDescription'] if 'longDescription' in it else it['description'],
urls=urls,
url=it['mediasetprogram$pageUrl'],
year=it.get('year',''),
ep= it.get('tvSeasonEpisodeNumber', 0) if it.get('tvSeasonEpisodeNumber', 0) else 0,
forcethumb=True,
no_return=True))
if len(itemlist) == 1: return findvideos(itemlist[0])
if (len(json) >= PAGINATION):
item.nextIndex += PAGINATION + 1
support.nextPage(itemlist, item)
return itemlist
def findvideos(item):
logger.debug()
itemlist = [item.clone(server='directo', title='Mediaset Play', urls=item.urls, action='play')]
return support.server(item, itemlist=itemlist, Download=False)
def play(item):
logger.debug()
for url in item.urls:
sec_data = support.match(url + post_url).data
item.url = support.match(sec_data, patron=r'<video src="([^"]+)').match
pid = support.match(sec_data, patron=r'pid=([^|]+)').match
item.manifest = 'mpd'
if pid:
item.drm = 'com.widevine.alpha'
item.license = lic_url % pid
break
return [item]
def subBrand(json):
logger.debug()
subBrandId = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-brands?byCustomValue={brandId}{' + json + '}').json()['entries'][-1]['mediasetprogram$subBrandId']
json = current_session.get('https://feed.entertainment.tv.theplatform.eu/f/PR1GhC/mediaset-prod-all-programs?byCustomValue={subBrandId}{' + subBrandId + '}').json()['entries']
return json
def get_from_id(item):
logger.debug()
json = current_session.get(entry.format(id=item.args[3])).json()
if 'components' in json:
id = quote(",".join(json["components"]))
json = current_session.get(entries.format(id=id)).json()
if 'entries' in json:
return json['entries']
return {}
def get_programs(item, ret=[], args={}):
hasMore = False
url = ''
# support.dbg()
if 'search' in item.args:
args['uxReference'] = item.args[2]
args["query"] = item.text
args['traceCid'] = tracecid
args['cwId'] = cwid
args['page'] = 1
args['platform'] = 'pc'
args['hitsPerPage'] = 500
url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec2/search/v1.0?' + urlencode(args)
elif item.feed:
pag = item.page if item.page else 1
url='{}&range={}-{}'.format(item.feed, pag, pag + 99)
elif not args:
if item.ref in cdict:
args['uxReference'] = cdict[item.ref]
args['platform'] = 'pc'
else:
args = {"query": "*:*"}
if item.args[2]:
args['categories'] = item.args[2]
args['cwId'] = cwid
args['traceCid'] = tracecid
args['hitsPerPage'] = 500
args['page'] = '0'
args['deviceId'] = deviceid
url="https://api-ott-prod-fe.mediaset.net/PROD/play/rec2/cataloguelisting/v1.0?" + urlencode(args)
if url:
json = current_session.get(url).json()
if 'response' in json:
json = json['response']
if 'hasMore' in json:
hasMore = json['hasMore']
if 'components' in json:
id = quote(",".join(json["components"]))
json = current_session.get(entries.format(id=id)).json()
if 'entries' in json:
ret += json['entries']
if hasMore:
args['page'] = str(int(args['page']) + 1)
return get_programs(item, ret, args)
else:
return ret
else:
return ret
+3 -1
View File
@@ -177,7 +177,7 @@ def episodios(item):
for it in episodes['episodes']:
itemlist.append(
support.Item(channel=item.channel,
title=support.typo(str(episodes['number']) + 'x' + str(it['number']).zfill(2) + ' - ' + it['name'], 'bold'),
title=it['name'],
episode = it['number'],
season=episodes['number'],
thumbnail=it['images'][0]['original_url'] if 'images' in it and 'original_url' in it['images'][0] else item.thumbnail,
@@ -185,6 +185,8 @@ def episodios(item):
plot=it['plot'],
action='findvideos',
contentType='episode',
contentSeason = int(episodes['number']),
contentEpisodeNumber = int(it['number']),
contentSerieName=item.fulltitle,
url=host + '/watch/' + str(episodes['title_id']),
episodeid= '?e=' + str(it['id'])))