- nuovo metodo di override DNS - aggiunta opzione nascondi server, se usi l'autoplay - migliorie al codice e fix vari
176 lines
6.3 KiB
Python
176 lines
6.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from core import support, httptools, scrapertools
|
|
from core.item import Item
|
|
from platformcode import config, logger
|
|
|
|
|
|
"""
|
|
Nota per i tester: questo non è un canale 'tradizionale', essendo un canale telegram, i cui contenuti (film/serie) sono mischiati tra loro (ed a volte ci sono messaggi sponsor),
|
|
la lista delle pagine non sarà affatto 'uniforme' (a seconda di come viene presentata la preview)
|
|
"""
|
|
|
|
host = config.get_channel_url()
|
|
headers = [['Referer', 'org.telegram.messenger']]
|
|
list_servers = ['directo']
|
|
list_quality = ['default']
|
|
|
|
downPrefix = 'https://stsh.ml/Down-'
|
|
|
|
@support.menu
|
|
def mainlist(item):
|
|
film = ['?q=%23Film']
|
|
tvshow = ['?q=%23SerieTv']
|
|
return locals()
|
|
|
|
|
|
@support.scrape
|
|
def peliculas(item):
|
|
patron = """tgme_widget_message_photo_wrap.*?image:url\("(?P<thumbnail>[^"]+).*?//telegram\.org/img/emoji/40/(?:F09F8EAC|F09F8EA5)\.png"\)">.*?</i>\s?(?:<b>)?(?P<title>[^<]+).*?(?:Audio(?:</b>)?: (?P<lang>.*?<br>))?.*?Anno(?:</b>)?: (?P<year>[0-9]{4}).*?(?:<b>Stream</b>|Risoluzione|<b>Tipo</b>|Tipo|Stream): (?P<quality>[^<]+).*?tgme_widget_message_inline_button url_button" href="(?P<url>[^"]+)"""
|
|
def itemlistHook(itemlist):
|
|
retItemlist = []
|
|
# filtro per tipo
|
|
for i in itemlist:
|
|
if '/Film/' in i.url or 'Stream-' in i.url:
|
|
i.contentType = 'movie'
|
|
if '/SerieTv/' in i.url:
|
|
i.contentType = 'tvshow'
|
|
i.action = 'episodios'
|
|
if item.contentType == i.contentType or item.contentType == 'list': # list = ricerca globale quando c'è un solo tipo di risultato
|
|
retItemlist.append(i)
|
|
# rimuovo duplicati
|
|
if item.contentType != 'movie' and not item.cercaSerie:
|
|
nonDupl = []
|
|
for i in retItemlist:
|
|
for nd in nonDupl:
|
|
if i.fulltitle == nd.fulltitle:
|
|
break
|
|
else:
|
|
nonDupl.append(i)
|
|
retItemlist = nonDupl
|
|
return retItemlist[::-1]
|
|
# debug = True
|
|
# nella ricerca faccio finta che non ci siano "pagine successive", sarebbe un casino gestirle (ed è piuttosto improbabile)
|
|
if item.action != 'search' and item.action:
|
|
patronNext = 'tgme_widget_message_photo_wrap blured" href="([^"]+)'
|
|
|
|
# trovo l'id dell'ultimo messaggio e nella pagina successiva ci metto il link per prendere i 20 msg precedenti
|
|
def fullItemlistHook(itemlist):
|
|
msgId = int(itemlist[-1].url.split('/')[-1])
|
|
itemlist[-1].url = host + '?before=' + str(msgId) + '&after=' + str(msgId-20)
|
|
return itemlist
|
|
|
|
# necessario per togliere html vario dal titolo (operazione fatta solo su fulltitle)
|
|
# def itemHook(item):
|
|
# item.contentTitle = item.fulltitle
|
|
# item.show = item.fulltitle
|
|
# return item
|
|
|
|
if item.contentType == 'tvshow':
|
|
action = 'episodios'
|
|
return locals()
|
|
|
|
|
|
def search(item, texto):
|
|
item.url = host + "/?q=" + texto
|
|
try:
|
|
return peliculas(item)
|
|
# Continua la ricerca in caso di errore
|
|
except:
|
|
import sys
|
|
for line in sys.exc_info():
|
|
logger.error("%s" % line)
|
|
return []
|
|
|
|
|
|
def newest(categoria):
|
|
item = Item()
|
|
if categoria == "series":
|
|
item.contentType = 'tvshow'
|
|
item.url = host + '?q=%23SerieTv'
|
|
else:
|
|
item.contentType = 'movie'
|
|
item.url = host + '?q=%23Film'
|
|
return peliculas(item)
|
|
|
|
|
|
# cerco il titolo, così mi escono fuori tutti i messaggi contenenti puntate singole o serie
|
|
def episodios(item):
|
|
url = item.url
|
|
item.cercaSerie = True
|
|
itemlist = search(item, item.fulltitle.replace("'", ""))
|
|
stagioni = {}
|
|
|
|
for i in itemlist[:-1]:
|
|
spl1 = i.url.split('-')
|
|
if len(spl1) > 3:
|
|
st = spl1[1] + '-' + spl1[2]
|
|
else:
|
|
st = spl1[-2]
|
|
nEp = int(spl1[-1])
|
|
if st not in stagioni.keys():
|
|
stagioni[st] = nEp
|
|
elif nEp > stagioni[st]:
|
|
stagioni[st] = nEp
|
|
|
|
itemlist = []
|
|
domain, id = scrapertools.find_single_match(url, r'(https?://[a-z0-9.-]+)/[^/]+/([^-/]+)')
|
|
for st in sorted(stagioni.keys()):
|
|
season = st[1:]
|
|
episode = stagioni[st]
|
|
for n in range(1, int(episode)):
|
|
url = domain + '/play_s.php?s=' + id + '-S' + season + '&e=' + str(n)
|
|
if '-' in season: # vedi https://stpgs.ml/SerieTv/Atypical-S01-8-8.html
|
|
season = season.split('-')[0]
|
|
itemlist.append(
|
|
Item(channel=item.channel,
|
|
action="findvideos",
|
|
title=str(int(season)) + 'x' + str(n) + support.typo(item.quality, '-- [] color kod'),
|
|
url=url,
|
|
fulltitle=item.fulltitle,
|
|
thumbnail=item.thumbnail,
|
|
show=item.show,
|
|
quality=item.quality,
|
|
contentType='episode',
|
|
folder=True,
|
|
args={'id': id, 'season': season, 'episode': episode}))
|
|
|
|
support.videolibrary(itemlist, item)
|
|
return itemlist
|
|
|
|
|
|
def findvideos(item):
|
|
# support.dbg()
|
|
domain = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+')
|
|
if item.contentType == 'movie':
|
|
id = item.url.split('/')[-1]
|
|
url = domain + '/play_f.php?f=' + id
|
|
else:
|
|
url = item.url
|
|
id = item.args['id']
|
|
season = str(item.args['season'])
|
|
episode = str(item.args['episode'])
|
|
res = support.match(item, 'src="([^"]+)"[^>]*></video>', url=url, headers=[['Referer', domain]])
|
|
itemlist = []
|
|
|
|
if res[0]:
|
|
itemlist.append(
|
|
Item(channel=item.channel,
|
|
action="play",
|
|
title='contentful',
|
|
url=res[0][0],
|
|
server='directo',
|
|
fulltitle=item.fulltitle,
|
|
thumbnail=item.thumbnail,
|
|
quality=item.quality,
|
|
contentType=item.contentType))
|
|
# download = itemlist[0].clone()
|
|
# if item.contentType == 'movie':
|
|
# download.url = downPrefix + id
|
|
# else:
|
|
# download.url = downPrefix + id + '-S' + season + '-' + episode
|
|
# itemlist.append(download)
|
|
else:
|
|
# google drive...
|
|
pass
|
|
return support.server(item, itemlist=itemlist)
|