- aggiunto nuovo canale: guardaserie.cam
- autoplay migliorato, ora i settaggi sono globali e non più per canale
- adesso in onda riscritto, ora usa EPG (ringraziamo epg-guide.com)
- Riprendi la visione di un film o episodio da server diversi (solo videoteca)
- fix e ottimizzazioni varie
This commit is contained in:
marco
2020-07-03 23:08:20 +02:00
parent 8b78c88e41
commit 0932a1969f
296 changed files with 3205 additions and 8075 deletions
+1 -1
View File
@@ -256,7 +256,7 @@ def get_channel_setting(name, channel, default=None):
file_settings = filetools.join(config.get_data_path(), "settings_channels", channel + "_data.json")
dict_settings = {}
dict_file = {}
if channel not in ['trakt']: def_settings = get_default_settings(channel)
if channel not in ['trakt', 'autoplay']: def_settings = get_default_settings(channel)
if filetools.exists(file_settings):
# We get saved configuration from ../settings/channel_data.json
+1 -1
View File
@@ -360,7 +360,7 @@ def downloadfile(url, nombrefichero, headers=None, silent=False, continuar=False
tiempofalta = 0
# logger.info(sec_to_hms(tiempofalta))
if not silent:
progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s falta " %
progreso.update(percent, "%.2fMB/%.2fMB (%d%%) %.2f Kb/s %s" %
(descargadosmb, totalmb, percent, old_div(velocidad, 1024),
sec_to_hms(tiempofalta)))
break
+17 -3
View File
@@ -40,8 +40,20 @@ def printMatches(matches):
def find_single_match(data, patron, index=0):
try:
matches = re.findall(patron, data, flags=re.DOTALL)
return matches[index]
if index == 0:
matches = re.search(patron, data, flags=re.DOTALL)
if matches:
if len(matches.groups()) == 1:
return matches.group(1)
elif len(matches.groups()) > 1:
return matches.groups()
else:
return matches.group()
else:
return ""
else:
matches = re.findall(patron, data, flags=re.DOTALL)
return matches[index]
except:
return ""
@@ -91,6 +103,8 @@ def unescape(text):
from Fredrik Lundh
http://effbot.org/zone/re-sub.htm#unescape-html
"""
if not ('&' in text and ';' in text):
return text
def fixup(m):
text = m.group(0)
@@ -418,7 +432,7 @@ def get_season_and_episode(title):
"""
filename = ""
patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:[Ss]|[Tt])(\d+)(?:[Ee]|Ep\.)(\d+)",
patrons = ["(\d+)\s*[x-]\s*(\d+)", "(\d+)\s*×\s*(\d+)", "(?:[Ss]|[Tt])(\d+)\s?(?:[Ee]|Ep\.?)(\d+)",
"(?:[Ss]tag|[Ss]eason|[Ss]tagione\w*)\s*(\d+)\s*(?:[Ee]pi|[Ee]pisode|[Ee]pisodio\w*)\s*(\d+)"]
for patron in patrons:
+28 -57
View File
@@ -118,8 +118,6 @@ def get_servers_itemlist(itemlist, fnc=None, sort=False):
# We remove the deactivated servers
# itemlist = filter(lambda i: not i.server or is_server_enabled(i.server), itemlist)
# Filter if necessary
itemlist = filter_servers(itemlist)
for item in itemlist:
# We assign "direct" in case the server is not in KoD
@@ -152,23 +150,24 @@ def findvideos(data, skip=False):
servers_list = list(get_servers_list().keys())
is_filter_servers = False
# is_filter_servers = False
# Run findvideos on each active server
for serverid in servers_list:
'''if not is_server_enabled(serverid):
continue'''
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
is_filter_servers = True
if config.get_setting('servers_blacklist') and serverid not in config.get_setting("black_list", server='servers'):
# if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
# is_filter_servers = True
continue
devuelve.extend(findvideosbyserver(data, serverid))
if skip and len(devuelve) >= skip:
devuelve = devuelve[:skip]
break
if config.get_setting("filter_servers") == False: is_filter_servers = False
if not devuelve and is_filter_servers:
platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
# if config.get_setting("filter_servers") == False: is_filter_servers = False
# logger.info('DEVUELVE: ' + str(devuelve))
# if not devuelve and is_filter_servers:
# platformtools.dialog_ok(config.get_localized_string(60000), config.get_localized_string(60001))
return devuelve
@@ -214,8 +213,6 @@ def get_server_from_url(url):
for serverid in servers_list:
'''if not is_server_enabled(serverid):
continue'''
if config.get_setting("filter_servers") == True and config.get_setting("black_list", server=serverid):
continue
serverid = get_server_name(serverid)
if not serverid:
continue
@@ -535,35 +532,35 @@ def get_server_parameters(server):
return dict_servers_parameters[server]
def get_server_json(server_name):
# logger.info("server_name=" + server_name)
try:
server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
if not filetools.exists(server_path):
server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
# logger.info("server_path=" + server_path)
server_json = jsontools.load(filetools.read(server_path))
# logger.info("server_json= %s" % server_json)
except Exception as ex:
template = "An exception of type %s occured. Arguments:\n%r"
message = template % (type(ex).__name__, ex.args)
logger.error(" %s" % message)
server_json = None
return server_json
# def get_server_json(server_name):
# # logger.info("server_name=" + server_name)
# try:
# server_path = filetools.join(config.get_runtime_path(), "servers", server_name + ".json")
# if not filetools.exists(server_path):
# server_path = filetools.join(config.get_runtime_path(), "servers", "debriders", server_name + ".json")
#
# # logger.info("server_path=" + server_path)
# server_json = jsontools.load(filetools.read(server_path))
# # logger.info("server_json= %s" % server_json)
#
# except Exception as ex:
# template = "An exception of type %s occured. Arguments:\n%r"
# message = template % (type(ex).__name__, ex.args)
# logger.error(" %s" % message)
# server_json = None
#
# return server_json
def get_server_host(server_name):
from core import scrapertools
return [scrapertools.get_domain_from_url(pattern['url']) for pattern in get_server_json(server_name)['find_videos']['patterns']]
return [scrapertools.get_domain_from_url(pattern['url']) for pattern in get_server_parameters(server_name)['find_videos']['patterns']]
def get_server_controls_settings(server_name):
dict_settings = {}
list_controls = get_server_json(server_name).get('settings', [])
list_controls = get_server_parameters(server_name).get('settings', [])
import copy
list_controls = copy.deepcopy(list_controls)
@@ -720,33 +717,7 @@ def sort_servers(servers_list):
return servers_list
def filter_servers(servers_list):
"""
If the option "Filter by servers" is activated in the server configuration, removes the servers included in the Black List from the entry list.
:param servers_list: List of servers to filter. The items in the servers_list can be strings or Item objects. In which case it is necessary that they have an item.server attribute of type str.
:return: List of the same type of objects as servers_list filtered based on the Black List.
"""
# We eliminate the inactive
if servers_list:
servers_list = [i for i in servers_list if not i.server or is_server_enabled(i.server)]
if servers_list and config.get_setting('filter_servers'):
if isinstance(servers_list[0], Item):
servers_list_filter = [x for x in servers_list if not config.get_setting("black_list", server=x.server)]
else:
servers_list_filter = [x for x in servers_list if not config.get_setting("black_list", server=x)]
# If there are no links after filtering
if servers_list_filter or not platformtools.dialog_yesno(config.get_localized_string(60000), config.get_localized_string(60010), config.get_localized_string(70281)):
servers_list = servers_list_filter
return servers_list
# Checking links
def check_list_links(itemlist, numero='', timeout=3):
"""
Check a list of video links and return it by modifying the title with verification.
+45 -38
View File
@@ -39,13 +39,8 @@ def hdpass_get_servers(item):
for mir_url, srv in scrapertools.find_multiple_matches(mir, patron_option):
mir_url = scrapertools.decodeHtmlentities(mir_url)
log(mir_url)
it = Item(channel=item.channel,
action="play",
fulltitle=item.fulltitle,
it = item.clone(action="play",
quality=quality,
show=item.show,
thumbnail=item.thumbnail,
contentType=item.contentType,
title=srv,
server=srv,
url= mir_url)
@@ -114,7 +109,7 @@ def search(channel, item, texto):
def dbg():
if config.dev_mode():
import web_pdb;
import web_pdb
if not web_pdb.WebPdb.active_instance:
import webbrowser
webbrowser.open('http://127.0.0.1:5555')
@@ -128,7 +123,8 @@ def regexDbg(item, patron, headers, data=''):
if not data:
html = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True).data.replace("'", '"')
html = re.sub('\n|\t', ' ', html)
html = html.replace('\n', ' ')
html = html.replace('\t', ' ')
else:
html = data
headers = {'content-type': 'application/json'}
@@ -168,6 +164,14 @@ def cleantitle(title):
cleantitle = title.replace('"', "'").replace('×', 'x').replace('', '-').strip()
return cleantitle
def unifyEp(ep):
# ep = re.sub(r'\s-\s|-|–|×|×', 'x', scraped['episode'])
ep = ep.replace('-', 'x')
ep = ep.replace('–', 'x')
ep = ep.replace('×', 'x')
ep = ep.replace('×', 'x')
return ep
def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, typeContentDict, typeActionDict, blacklist, search, pag, function, lang, sceneTitle):
itemlist = []
log("scrapeBlock qui")
@@ -216,10 +220,10 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
if scraped['season']:
stagione = scraped['season']
ep = re.sub(r'\s-\s|-|x|&#8211|×|×', 'x', scraped['episode'])
ep = unifyEp(scraped['episode'])
if 'x' in ep:
episode = ep.split('x')[0]
second_episode = ep.split('x')[1]
episode = ep.split('x')[0].strip()
second_episode = ep.split('x')[1].strip()
else:
episode = ep
second_episode = ''
@@ -234,7 +238,7 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
item.news = 'season_completed'
episode = ''
else:
episode = re.sub(r'\s-\s|-|x|&#8211|×|×', 'x', scraped['episode']) if scraped['episode'] else ''
episode = unifyEp(scraped['episode']) if scraped['episode'] else ''
if 'x' in episode:
ep = episode.split('x')
episode = str(int(ep[0])).zfill(1) + 'x' + str(int(ep[1])).zfill(2)
@@ -292,7 +296,10 @@ def scrapeBlock(item, args, block, patron, headers, action, pagination, debug, t
if parsedTitle.get('screen_size'):
quality += ' ' + str(parsedTitle.get('screen_size', ''))
if not scraped['year']:
infolabels['year'] = parsedTitle.get('year', '')
if type(parsedTitle.get('year', '')) == list:
infolabels['year'] =parsedTitle.get('year', '')[0]
else:
infolabels['year'] = parsedTitle.get('year', '')
if parsedTitle.get('episode') and parsedTitle.get('season'):
longtitle = title + s
@@ -434,7 +441,8 @@ def scrape(func):
if not data:
page = httptools.downloadpage(item.url, headers=headers, ignore_response_code=True)
data = page.data.replace("'", '"')
data = re.sub('\n|\t', ' ', data)
data = data.replace('\n', ' ')
data = data.replace('\t', ' ')
data = re.sub(r'>\s+<', '> <', data)
# replace all ' with " and eliminate newline, so we don't need to worry about
scrapingTime = time()
@@ -479,8 +487,8 @@ def scrape(func):
else:
break
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
if patronNext and inspect.stack()[1][3] != 'newest':
if (pagination and len(matches) <= pag * pagination) or not pagination: # next page with pagination
if patronNext and inspect.stack()[1][3] not in ['newest', 'search']:
nextPage(itemlist, item, data, patronNext, function)
# next page for pagination
@@ -543,12 +551,13 @@ def dooplay_get_links(item, host):
for type, post, nume, title, server in matches:
postData = urlencode({
"action": "doo_player_ajax",
"post": post,
"post": post,
"nume": nume,
"type": type
})
dataAdmin = httptools.downloadpage(host + '/wp-admin/admin-ajax.php', post=postData,headers={'Referer': item.url}).data
link = scrapertools.find_single_match(dataAdmin, "<iframe.*src='([^']+)'")
link = scrapertools.find_single_match(dataAdmin, r"<iframe.*src='([^']+)'")
if not link: link = scrapertools.find_single_match(dataAdmin, r'"embed_url":"([^"]+)"').replace('\\','')
ret.append({
'url': link,
'title': title,
@@ -785,8 +794,8 @@ def menu(func):
menuItem(itemlist, filename, config.get_localized_string(70741) % '{bold}', 'search', host + dictUrl['search'], style=not global_search)
if not global_search:
autoplay.init(item.channel, list_servers, list_quality)
autoplay.show_option(item.channel, itemlist)
# autoplay.init(item.channel, list_servers, list_quality)
# autoplay.show_option(item.channel, itemlist)
channel_config(item, itemlist)
# Apply auto Thumbnails at the menus
@@ -915,8 +924,9 @@ def match(item_url_string, **args):
data = httptools.downloadpage(url, **args).data.replace("'", '"')
# format page data
data = re.sub(r'\n|\t', ' ', data)
data = re.sub(r'>\s\s*<', '><', data)
data = data.replace('\n', ' ')
data = data.replace('\t', ' ')
data = re.sub(r'>\s+<', '><', data)
# collect blocks of a page
if patronBlock:
@@ -1094,6 +1104,7 @@ def videolibrary(itemlist, item, typography='', function_level=1, function=''):
def nextPage(itemlist, item, data='', patron='', function_or_level=1, next_page='', resub=[]):
# Function_level is useful if the function is called by another function.
# If the call is direct, leave it blank
log()
action = inspect.stack()[function_or_level][3] if type(function_or_level) == int else function_or_level
if next_page == '':
next_page = scrapertools.find_single_match(data, patron)
@@ -1102,7 +1113,7 @@ def nextPage(itemlist, item, data='', patron='', function_or_level=1, next_page=
if resub: next_page = re.sub(resub[0], resub[1], next_page)
if 'http' not in next_page:
next_page = scrapertools.find_single_match(item.url, 'https?://[a-z0-9.-]+') + (next_page if next_page.startswith('/') else '/' + next_page)
next_page = re.sub('&amp;', '&',next_page)
next_page = next_page.replace('&amp;', '&')
log('NEXT= ', next_page)
itemlist.append(
Item(channel=item.channel,
@@ -1166,6 +1177,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
videoitem.contentType = item.contentType
videoitem.infoLabels = item.infoLabels
videoitem.quality = quality
# videoitem.nfo = item.nfo
# videoitem.strm_path = item.strm_path
return videoitem
with futures.ThreadPoolExecutor() as executor:
@@ -1180,11 +1193,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
if patronTag:
addQualityTag(item, verifiedItemlist, data, patronTag)
# Auto Play & Hide Links
AP, HS = autoplay.get_channel_AP_HS(item)
# Check Links
if not AP and not item.global_search and (config.get_setting('checklinks') or config.get_setting('checklinks', item.channel)):
if not item.global_search and (config.get_setting('checklinks') or config.get_setting('checklinks', item.channel)):
if config.get_setting('checklinks', item.channel):
checklinks_number = config.get_setting('checklinks_number', item.channel)
elif config.get_setting('checklinks'):
@@ -1198,11 +1208,8 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
videolibrary(verifiedItemlist, item)
if Download:
download(verifiedItemlist, item, function_level=3)
if not AP or not HS:
# for it in verifiedItemlist:
# log(it)
return verifiedItemlist
# if item.contentChannel == 'videolibrary' or not config.get_setting('autoplay'):
return verifiedItemlist
def filterLang(item, itemlist):
@@ -1213,12 +1220,12 @@ def filterLang(item, itemlist):
itemlist = filtertools.get_links(itemlist, item, list_language)
return itemlist
def aplay(item, itemlist, list_servers='', list_quality=''):
if inspect.stack()[1][3] == 'mainlist':
autoplay.init(item.channel, list_servers, list_quality)
autoplay.show_option(item.channel, itemlist)
else:
autoplay.start(itemlist, item)
# def aplay(item, itemlist, list_servers='', list_quality=''):
# if inspect.stack()[1][3] == 'mainlist':
# autoplay.init(item.channel, list_servers, list_quality)
# autoplay.show_option(item.channel, itemlist)
# else:
# autoplay.start(itemlist, item)
def log(*args):
+15 -16
View File
@@ -135,7 +135,7 @@ def save_movie(item, silent=False):
for raiz, subcarpetas, ficheros in filetools.walk(MOVIES_PATH):
for c in subcarpetas:
code = scrapertools.find_single_match(c, '\[(.*?)\]')
code = scrapertools.find_single_match(c, r'\[(.*?)\]')
if code and code in item.infoLabels['code']:
path = filetools.join(raiz, c)
_id = code
@@ -192,7 +192,7 @@ def save_movie(item, silent=False):
headers = {}
if item.headers:
headers = item.headers
channel = generictools.verify_channel(item.channel)
channel = item.channel
if config.get_setting("emergency_urls", channel) in [1, 3]:
item = emergency_urls(item, None, json_path, headers=headers)
if item_nfo.emergency_urls and not isinstance(item_nfo.emergency_urls, dict):
@@ -364,7 +364,7 @@ def filter_list(episodelist, action=None, path=None):
stop = False
while not stop:
for episode in episodelist:
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
if not any(title in word for word in ep_list) and episode.contentLanguage == langs[count]:
ep_list.append(episode.title)
if count < len(langs)-1: count += 1
@@ -386,14 +386,14 @@ def filter_list(episodelist, action=None, path=None):
stop = False
while not stop:
for episode in episodelist:
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
if not any(title in word for word in ep_list) and episode.quality.lower() in quality_dict[quality_list[selection]]:
ep_list.append(episode.title)
if selection != 0: selection = selection - 1
else: stop = True
if quality_list[selection] == 'N/A':
for episode in episodelist:
title = scrapertools.find_single_match(episode.title, '(\d+x\d+)')
title = scrapertools.find_single_match(episode.title, r'(\d+x\d+)')
if not any(title in word for word in ep_list):
ep_list.append(episode.title)
@@ -473,7 +473,7 @@ def save_tvshow(item, episodelist, silent=False):
for raiz, subcarpetas, ficheros in filetools.walk(TVSHOWS_PATH):
for c in subcarpetas:
code = scrapertools.find_single_match(c, '\[(.*?)\]')
code = scrapertools.find_single_match(c, r'\[(.*?)\]')
if code and code != 'None' and code in item.infoLabels['code']:
path = filetools.join(raiz, c)
_id = code
@@ -602,12 +602,12 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True):
p_dialog = platformtools.dialog_progress(config.get_localized_string(20000), config.get_localized_string(60064))
p_dialog.update(0, config.get_localized_string(60065))
channel_alt = generictools.verify_channel(serie.channel) # We prepare to add the emergency urls
channel_alt = serie.channels # We prepare to add the emergency urls
emergency_urls_stat = config.get_setting("emergency_urls", channel_alt) # Does the channel want emergency urls?
emergency_urls_succ = False
try: channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
except: channel = __import__('channels.%s' % channel_alt, fromlist=["channels.%s" % channel_alt])
if serie.torrent_caching_fail: # If the conversion process has failed, they are not cached
if serie.torrent_caching_fail: # If the conversion process has failed, they are not cached
emergency_urls_stat = 0
del serie.torrent_caching_fail
@@ -679,8 +679,8 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True):
high_sea = e.contentSeason
high_epi = e.contentEpisodeNumber
if scrapertools.find_single_match(e.title, '[a|A][l|L]\s*(\d+)'):
high_epi = int(scrapertools.find_single_match(e.title, 'al\s*(\d+)'))
if scrapertools.find_single_match(e.title, r'[a|A][l|L]\s*(\d+)'):
high_epi = int(scrapertools.find_single_match(e.title, r'al\s*(\d+)'))
max_sea = e.infoLabels["number_of_seasons"]
max_epi = 0
if e.infoLabels["number_of_seasons"] and (e.infoLabels["temporada_num_episodios"] or e.infoLabels["number_of_seasons"] == 1):
@@ -981,8 +981,8 @@ def add_tvshow(item, channel=None):
if not channel:
try:
# channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
# channel = __import__('specials.%s' % item.channel, fromlist=["specials.%s" % item.channel])
except ImportError:
exec("import channels." + item.channel + " as channel")
@@ -998,9 +998,8 @@ def add_tvshow(item, channel=None):
# del item.tmdb_stat # We clean the status so that it is not recorded in the Video Library
# Get the episode list
itemlist = getattr(channel, item.action)(item)
if itemlist and not scrapertools.find_single_match(itemlist[0].title, r'(\d+.\d+)'):
if itemlist and not scrapertools.find_single_match(itemlist[0].title, r'(\d+x\d+)'):
from specials.autorenumber import select_type, renumber, check
if not check(item):
action = item.action
@@ -1066,7 +1065,7 @@ def emergency_urls(item, channel=None, path=None, headers={}):
# we launched a "lookup" in the "findvideos" of the channel to obtain the emergency links
try:
if channel == None: # If the caller has not provided the channel structure, it is created
channel = generictools.verify_channel(item.channel) # It is verified if it is a clone, which returns "newpct1"
channel = item.channel # It is verified if it is a clone, which returns "newpct1"
#channel = __import__('channels.%s' % channel, fromlist=["channels.%s" % channel])
channel = __import__('specials.%s' % channel_alt, fromlist=["specials.%s" % channel_alt])
if hasattr(channel, 'findvideos'): # If the channel has "findvideos" ...
@@ -1099,7 +1098,7 @@ def emergency_urls(item, channel=None, path=None, headers={}):
try:
referer = None
post = None
channel_bis = generictools.verify_channel(item.channel)
channel_bis =item.channel
if config.get_setting("emergency_urls_torrents", channel_bis) and item_res.emergency_urls and path != None:
videolibrary_path = config.get_videolibrary_path() # we detect the absolute path of the title
movies = config.get_setting("folder_movies")