diff --git a/channels.json b/channels.json index 5797e51f..ac31bca1 100644 --- a/channels.json +++ b/channels.json @@ -32,6 +32,7 @@ "ilgeniodellostreaming": "https://ilgeniodellostreaming.cat", "ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.gold", "italiaserie": "https://italiaserie.best", + "mediasetplay": "https://www.mediasetplay.mediaset.it", "mondoserietv": "https://mondoserietv.fun", "piratestreaming": "https://www.piratestreaming.date", "polpotv": "https://roma.polpo.tv", diff --git a/channels/mediasetplay.py b/channels/mediasetplay.py index fa345558..2afcc8df 100644 --- a/channels/mediasetplay.py +++ b/channels/mediasetplay.py @@ -2,77 +2,123 @@ # ------------------------------------------------------------ # Canale per Mediaset Play # ------------------------------------------------------------ +import uuid import requests, sys from core import support if sys.version_info[0] >= 3: from urllib.parse import urlencode, quote else: from urllib import urlencode, quote - -DRM = 'com.widevine.alpha' -post_url = '?assetTypes=HD,browser,widevine:HD,browser:SD,browser,widevine:SD,browser:SD&auto=true&balance=true&format=smil&formats=MPEG-DASH,MPEG4,M3U&tracking=true' - -current_session = requests.Session() - -data = {"cid": "dc4e7d82-89a5-4a96-acac-d3c7f2ca6d67", "platform": "pc", "appName": "web/mediasetplay-web/576ea90"} -res = current_session.post("https://api-ott-prod-fe.mediaset.net/PROD/play/idm/anonymous/login/v1.0", json=data, verify=False) - -current_session.headers.update({'t-apigw': res.headers['t-apigw']}) -current_session.headers.update({'t-cts': res.headers['t-cts']}) - -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=' + res.headers['t-cts'] + '|Accept=*/*&Content-Type=&User-Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36|R{SSM}|' - -tracecid=res.json()['response']['traceCid'] -cwid=res.json()['response']['cwId'] - -res = current_session.get("https://api.one.accedo.tv/session?appKey=59ad346f1de1c4000dfd09c5&uuid=sdd",verify=False) -current_session.headers.update({'x-session': res.json()['sessionKey']}) +if sys.version_info[0] >= 3: from concurrent import futures +else: from concurrent_py2 import futures host = '' +DRM = 'com.widevine.alpha' +post_url = '?assetTypes=HD,browser,widevine:HD,browser:SD,browser,widevine:SD,browser:SD&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/v1.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) +Token = res.headers['t-cts'] +current_session.headers.update({'t-apigw': res.headers['t-apigw'], 't-cts': 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 = {'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 = [('Film {bullet bold}', ['5acfcbc423eec6000d64a6bb', 'menu', ['Tutti','all','Cinema']]), - ('Fiction / Serie TV {bullet bold}', ['5acfcb3c23eec6000d64a6a4', 'menu', ['Tutte','all','Fiction'], 'tvshow']), - ('Programmi TV{ bullet bold}', ['', 'menu', ['Tutti','all','Programmi Tv'], 'tvshow']), - ('Documentari {bullet bold}', ['5bfd17c423eec6001aec49f9', 'menu', ['Tutti','all','Documentari'], 'undefined']), - ('Kids {bullet bold}', ['5acfcb8323eec6000d64a6b3', 'menu',['Tutti','all','Kids'], 'undefined']), + menu = [('Film {bullet bold}', ['5acfcbc423eec6000d64a6bb', 'menu', ['Tutti','all','searchMovie']]), + ('Fiction / Serie TV {bullet bold}', ['5acfcb3c23eec6000d64a6a4', 'menu', ['Tutte','all','searchStagioni'], 'tvshow']), + ('Programmi TV{ bullet bold}', ['5acfc8011de1c4000b6ec953', 'menu', ['Tutti','all','searchStagioni'], 'tvshow']), + ('Documentari {bullet bold}', ['5bfd17c423eec6001aec49f9', 'menu', ['Tutti','all',''], 'undefined']), + ('Kids {bullet bold}', ['5acfcb8323eec6000d64a6b3', 'menu',['Tutti','all',''], 'undefined']), + ('Family {bullet bold}', ['5e662d01a0e845001d56875b', 'menu',['Tutti','all',''], 'undefined']), ] search = '' return locals() - def search(item, text): + itemlist = [] support.info(text) item.search = text - if not item.args: - item.contentType = 'undefined' - item.args=['','all',''] - itemlist = [] + try: - itemlist += peliculas(item) + itemlist = peliculas(item) except: import sys for line in sys.exc_info(): support.logger.error("%s" % line) + return itemlist + def menu(item): support.info() - itemlist = [item.clone(title=support.typo(item.args[0],'bullet bold'), url='', action='peliculas')] + itemlist = [] + # itemlist = [item.clone(title=support.typo(item.args[0], 'bullet bold'), url='', action='peliculas')] if item.url: json = get_from_id(item) for it in json: - if 'uxReference' in it: itemlist.append(item.clone(title=support.typo(it['title'], 'submenu'), url=it['uxReference'], args = '', action='peliculas')) - itemlist.append(item.clone(title=support.typo('Cerca...','submenu bold'), url='', action ='search')) + if 'uxReference' in it: itemlist.append( + item.clone(title=support.typo(it['title'], 'bullet bold'), url=it['uxReference'], args='', action='peliculas')) return itemlist + def live(item): support.info() itemlist = [] @@ -89,23 +135,31 @@ def live(item): 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') itemlist.append(item.clone(title=support.typo(it['title'], 'bold'), - fulltitle=it['title'], - show=it['title'], - contentTitle=it['title'], - thumbnail=it['thumbnails']['channel_logo-100x100']['url'], - forcethumb = True, - urls=urls, - plot=plot, - action='play', - no_return=True)) + fulltitle=it['title'], + show=it['title'], + contentTitle=it['title'], + thumbnail=it['thumbnails']['channel_logo-100x100']['url'], + forcethumb=True, + urls=urls, + plot=plot, + action='play', + no_return=True)) return support.thumb(itemlist, live=True) + def peliculas(item): support.info() itemlist = [] titlelist = [] contentType = '' - json = get_programs(item) + if item.text: + json = [] + with futures.ThreadPoolExecutor() as executor: + for arg in ['searchMovie', 'searchStagioni', 'searchClip']: + item.args = ['', 'search', arg] + json += executor.submit(get_programs, item).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']) @@ -147,6 +201,7 @@ def peliculas(item): url=it['mediasetprogram$pageUrl'])) return itemlist + def epmenu(item): support.info() itemlist = [] @@ -155,13 +210,12 @@ def epmenu(item): if 'mediasetprogram$subBrandId' in entry: itemlist.append( item.clone(action='episodios', - title=support.typo(entry['description'], 'bold'), - url=entry['mediasetprogram$subBrandId'])) + title=support.typo(entry['description'], 'bold'), + url=entry['mediasetprogram$subBrandId'])) if len(itemlist) == 1: return episodios(itemlist[0]) return itemlist - def episodios(item): support.info() itemlist = [] @@ -193,11 +247,13 @@ def episodios(item): support.videolibrary(itemlist, item) return itemlist + def findvideos(item): support.info() - itemlist = [support.Item(server = 'directo', title = 'Direct', url = item.urls, action = 'play')] + itemlist = [support.Item(server='directo', title='Direct', url=item.urls, action='play')] return support.server(item, itemlist=itemlist, Download=False) + def play(item): support.info() if not item.urls: urls = item.url @@ -215,12 +271,14 @@ def play(item): return support.servertools.find_video_items(item, data=data) + def subBrand(json): support.info() 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): support.info() json = current_session.get(entry.format(id=item.url)).json() @@ -231,12 +289,24 @@ def get_from_id(item): return json['entries'] return {} + def get_programs(item, ret=[], args={}): - support.info() hasMore = False - if not args: - if item.url: - args['uxReference'] = item.url + support.info('DICT=',item.url) + url = '' + + 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 not args: + if item.url in cdict: + args['uxReference'] = cdict[item.url] args['platform'] = 'pc' else: args = {"query": "*:*"} @@ -247,21 +317,27 @@ def get_programs(item, ret=[], args={}): 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 'all' in item.args: url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec/azlisting/v1.0?' + urlencode(args) - else: url="https://api-ott-prod-fe.mediaset.net/PROD/play/rec/cataloguelisting/v1.0?" + urlencode(args) - 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) + # if 'all' in item.args: url = 'https://api-ott-prod-fe.mediaset.net/PROD/play/rec/azlisting/v1.0?' + urlencode(args) + if url: + support.logger.info(url) + json = current_session.get(url).json() + # support.logger.debug(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 \ No newline at end of file + return ret