Added Realtime Support
This commit is contained in:
@@ -0,0 +1,292 @@
|
||||
from Src.Utilities.info import get_info_tmdb, is_movie, get_info_imdb
|
||||
import Src.Utilities.config as config
|
||||
from fake_headers import Headers
|
||||
from Src.Utilities.loadenv import load_env
|
||||
from urllib.parse import quote
|
||||
import logging
|
||||
from Src.Utilities.config import setup_logging
|
||||
level = config.LEVEL
|
||||
import random
|
||||
Icon = config.Icon
|
||||
Name = config.Name
|
||||
logger = setup_logging(level)
|
||||
env_vars = load_env()
|
||||
random_headers = Headers()
|
||||
RT_PROXY = config.RT_PROXY
|
||||
proxies = {}
|
||||
if RT_PROXY == "1":
|
||||
PROXY_CREDENTIALS = env_vars.get('PROXY_CREDENTIALS')
|
||||
proxy_list = json.loads(PROXY_CREDENTIALS)
|
||||
proxy = random.choice(proxy_list)
|
||||
if proxy == "":
|
||||
proxies = {}
|
||||
else:
|
||||
proxies = {
|
||||
"http": proxy,
|
||||
"https": proxy
|
||||
}
|
||||
RT_ForwardProxy = config.RT_ForwardProxy
|
||||
if RT_ForwardProxy == "1":
|
||||
ForwardProxy = env_vars.get('ForwardProxy')
|
||||
else:
|
||||
ForwardProxy = ""
|
||||
|
||||
|
||||
endpoints = {
|
||||
'it' : 'https://public.aurora.enhanced.live',
|
||||
'dplay' : 'https://eu1-prod.disco-api.com'
|
||||
}
|
||||
async def search(showname,date,client):
|
||||
showname = showname.split('-')[0]
|
||||
showname = quote(showname)
|
||||
response = await client.get(ForwardProxy + f'https://public.aurora.enhanced.live/site/search/page/?include=default&filter[environment]=realtime&v=2&q={showname}&page[number]=1&page[size]=20', proxies = proxies)
|
||||
data = response.json()
|
||||
for item in data['data']:
|
||||
return item['slug']
|
||||
|
||||
|
||||
|
||||
async def program_info(slug,season,episode,client):
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'en-US,en;q=0.5',
|
||||
'Referer': 'https://realtime.it/',
|
||||
'Origin': 'https://realtime.it',
|
||||
'Sec-GPC': '1',
|
||||
'Connection': 'keep-alive',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Site': 'cross-site',
|
||||
'DNT': '1',
|
||||
'Priority': 'u=4',
|
||||
}
|
||||
link = f'https://public.aurora.enhanced.live/site/page/{slug}/?include=default&filter[environment]=realtime&v=2&parent_slug=programmi-real-time'
|
||||
|
||||
response = await client.get(ForwardProxy + link,headers = headers, proxies = proxies)
|
||||
data = response.json()
|
||||
for item in reversed(data['blocks'][1]['items']):
|
||||
if season == item['seasonNumber'] and episode == item['episodeNumber']:
|
||||
if 'aurora' in data['blocks'][0]['item']['poster']['src']:
|
||||
platform = 'IT'
|
||||
elif 'eu1-prod' in data['blocks'][0]['item']['poster']['src']:
|
||||
platform = 'DPLAY'
|
||||
x_realm_it = ''
|
||||
x_realm_dplay = ''
|
||||
if 'X-REALM-IT' in data['userMeta']['realm']:
|
||||
x_realm_it = data['userMeta']['realm']['X-REALM-IT']
|
||||
if 'X-REALM-DPLAY' in data['userMeta']['realm']:
|
||||
x_realm_dplay = data['userMeta']['realm']['X-REALM-DPLAY']
|
||||
return item['id'],x_realm_it,x_realm_dplay, platform
|
||||
return None,None,None,None
|
||||
|
||||
async def get_token(client):
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'en-US,en;q=0.5',
|
||||
'Referer': 'https://realtime.it/',
|
||||
'Content-Type': 'application/json',
|
||||
'X-disco-client': 'WEB:UNKNOWN:wbdatv:2.1.9',
|
||||
'X-disco-params': 'realm=dplay',
|
||||
'X-Device-Info': 'STONEJS/1 (Unknown/Unknown; Linux/undefined; Unknown)',
|
||||
'Origin': 'https://realtime.it',
|
||||
'Sec-GPC': '1',
|
||||
'Connection': 'keep-alive',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Site': 'cross-site',
|
||||
'DNT': '1',
|
||||
'Priority': 'u=4',
|
||||
}
|
||||
response = await client.get(ForwardProxy + 'https://public.aurora.enhanced.live/site/page/casa-a-prima-vista/?include=default&filter[environment]=realtime&v=2&parent_slug=programmi-real-time', headers = headers, proxies = proxies)
|
||||
data = response.json()
|
||||
x_realm_it = data['userMeta']['realm']['X-REALM-IT']
|
||||
x_realm_dplay = data['userMeta']['realm']['X-REALM-DPLAY']
|
||||
return x_realm_it,x_realm_dplay
|
||||
|
||||
|
||||
|
||||
async def get_url(id, endpoint, x_realm_it,x_realm_dplay,streams,client):
|
||||
if 'IT' in endpoint:
|
||||
base_url = endpoints['it']
|
||||
token = x_realm_it
|
||||
elif 'DPLAY' in endpoint:
|
||||
base_url = endpoints['dplay']
|
||||
token = x_realm_dplay
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'en-US,en;q=0.5',
|
||||
'Referer': 'https://realtime.it/',
|
||||
'Content-Type': 'application/json',
|
||||
'X-disco-client': 'WEB:UNKNOWN:wbdatv:2.1.9',
|
||||
'X-disco-params': 'realm=dplay',
|
||||
'X-Device-Info': 'STONEJS/1 (Unknown/Unknown; Linux/undefined; Unknown)',
|
||||
'Authorization': f'Bearer {token}',
|
||||
'Origin': 'https://realtime.it',
|
||||
'Sec-GPC': '1',
|
||||
'Connection': 'keep-alive',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Site': 'cross-site',
|
||||
'DNT': '1',
|
||||
'Priority': 'u=4',
|
||||
}
|
||||
|
||||
|
||||
json_data = {
|
||||
'deviceInfo': {
|
||||
'adBlocker': False,
|
||||
'drmSupported': True,
|
||||
'hdrCapabilities': [
|
||||
'SDR',
|
||||
],
|
||||
'hwDecodingCapabilities': [],
|
||||
'soundCapabilities': [
|
||||
'STEREO',
|
||||
],
|
||||
},
|
||||
'wisteriaProperties': {},
|
||||
'videoId': id,
|
||||
}
|
||||
response = await client.post(ForwardProxy + f'{base_url}/playback/v3/videoPlaybackInfo', headers=headers, json=json_data, proxies = proxies)
|
||||
data = response.json()
|
||||
|
||||
for item in data['data']['attributes']['streaming']:
|
||||
if item['type'] == 'hls':
|
||||
m3u8 = item['url']
|
||||
streams['streams'].append({'name': f"{Name}",'title': f'{Icon}▶️ Realtime\n HLS', 'url': m3u8, 'behaviorHints': {'bingeGroup': f'realtimehls'}})
|
||||
|
||||
elif item['type'] == 'dash':
|
||||
mpd = item['url']
|
||||
streams['streams'].append({'name': f"{Name}",'title': f'{Icon}▶️ Realtime\n MPD', 'url': mpd, 'behaviorHints': {'bingeGroup': f'realtimempd'}})
|
||||
|
||||
return streams
|
||||
|
||||
|
||||
|
||||
|
||||
async def search_catalog(query,catalog,client):
|
||||
showname = quote(query)
|
||||
response = await client.get(f'https://public.aurora.enhanced.live/site/search/page/?include=default&filter[environment]=realtime&v=2&q={showname}&page[number]=1&page[size]=20')
|
||||
data = response.json()
|
||||
for item in data['data']:
|
||||
title = item['title']
|
||||
description = item['subtitle']
|
||||
date = item['datePublished'].split('-')[0]
|
||||
id = item['slug']
|
||||
image = item['image']['url']
|
||||
typeof = item['type']
|
||||
catalog['metas'].append({'id': f'realtime{typeof}:'+id, 'type': "series",'name': f'{title}', 'description': description, 'releaseInfo': date, 'background': image, 'poster': image })
|
||||
return catalog
|
||||
|
||||
async def meta_catalog(id,catalog,client):
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:143.0) Gecko/20100101 Firefox/143.0',
|
||||
'Accept': '*/*',
|
||||
'Accept-Language': 'en-US,en;q=0.5',
|
||||
'Referer': 'https://realtime.it/',
|
||||
'Origin': 'https://realtime.it',
|
||||
'Sec-GPC': '1',
|
||||
'Connection': 'keep-alive',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Site': 'cross-site',
|
||||
'DNT': '1',
|
||||
'Priority': 'u=4',
|
||||
}
|
||||
parts = id.split(':')
|
||||
slug = parts[1]
|
||||
parts2 = parts[0].split('realtime')
|
||||
typeof= parts2[1]
|
||||
if typeof == 'showpage':
|
||||
link = f'https://public.aurora.enhanced.live/site/page/{slug}/?include=default&filter[environment]=realtime&v=2&parent_slug=programmi-real-time'
|
||||
elif typeof == 'article':
|
||||
link = f'https://public.aurora.enhanced.live/site/page/{slug}/?include=default&filter[environment]=realtime&v=2'
|
||||
|
||||
response = await client.get(ForwardProxy + link,headers = headers, proxies = proxies)
|
||||
data = response.json()
|
||||
title = data['title']
|
||||
subtitle = data['subtitle']
|
||||
|
||||
if data['type'] == 'articlepage':
|
||||
if data['blocks'][1]['sonicOverrideEnabled'] == True:
|
||||
platform = 'IT'
|
||||
else:
|
||||
platform = 'DPLAY'
|
||||
elif data['type'] == 'showpage':
|
||||
|
||||
if 'aurora' in data['blocks'][0]['item']['poster']['src']:
|
||||
platform = 'IT'
|
||||
elif 'eu1-prod' in data['blocks'][0]['item']['poster']['src']:
|
||||
platform = 'DPLAY'
|
||||
if typeof == 'showpage':
|
||||
for item in reversed(data['blocks'][1]['items']):
|
||||
id = item['id']
|
||||
description = item['description']
|
||||
episode = item['episodeNumber']
|
||||
season = item['seasonNumber']
|
||||
poster = item['poster']
|
||||
date = item['publishStart']
|
||||
catalog['meta']['videos'].append({'title': f'S{season}'+ f'E{episode}','season': season, 'episode': episode,'firstAired':date,'overview': description, 'thumbnail': poster['src'], 'id': f'realtime{platform}:id:'+id})
|
||||
elif typeof == 'article':
|
||||
item = data['blocks'][1]['item']
|
||||
id = item['id']
|
||||
description = item['description']
|
||||
episode = item['episodeNumber']
|
||||
season = item['seasonNumber']
|
||||
poster = item['poster']
|
||||
date = item['publishStart']
|
||||
catalog['meta']['videos'].append({'title': f'{title}','season': season, 'episode': episode,'firstAired':date,'overview': description, 'thumbnail': poster['src'], 'id': f'realtime{platform}:id:'+id})
|
||||
|
||||
catalog['meta']['name'] = title
|
||||
catalog['meta']['description'] = subtitle
|
||||
catalog['meta']['releaseInfo'] = '-' + data['datePublished'].split('-')[0]
|
||||
catalog['meta']['background'] = data['metaMedia'][0]['media']['url']
|
||||
return catalog
|
||||
async def realtime(streams,id,client):
|
||||
try:
|
||||
if 'realtime' in id:
|
||||
parts = id.split('id:')
|
||||
id = parts[1]
|
||||
endpoint = parts[0]
|
||||
x_realm_it,x_realm_dplay = await get_token(client)
|
||||
streams = await get_url(id, endpoint, x_realm_it,x_realm_dplay,streams,client)
|
||||
else:
|
||||
general = await is_movie(id)
|
||||
ismovie = general[0]
|
||||
clean_id = general[1]
|
||||
type = "Realtime"
|
||||
if ismovie == 0 :
|
||||
season = int(general[2])
|
||||
episode = int(general[3])
|
||||
elif ismovie == 1:
|
||||
season = None
|
||||
episode = None
|
||||
if "tmdb" in id:
|
||||
showname,date = get_info_tmdb(clean_id,ismovie,type)
|
||||
else:
|
||||
showname,date = await get_info_imdb(clean_id,ismovie,type,client)
|
||||
logger.info(f'RT {showname}')
|
||||
slug = await search(showname,date,client)
|
||||
id,x_realm_it,x_realm_dplay,platform = await program_info(slug,season,episode,client)
|
||||
streams = await get_url(id,platform,x_realm_it,x_realm_dplay,streams,client)
|
||||
return streams
|
||||
except Exception as e:
|
||||
logger.warning(f'RT {e}')
|
||||
return streams
|
||||
|
||||
|
||||
|
||||
|
||||
async def test_realtime():
|
||||
from curl_cffi.requests import AsyncSession
|
||||
async with AsyncSession() as client:
|
||||
results = await realtime({'streams': []},"tt5684368:13:10",client)
|
||||
print(results)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import asyncio
|
||||
asyncio.run(test_realtime())
|
||||
Reference in New Issue
Block a user