Recupero url su community channel + varie (#329)

* Aggiunto recupero da url + varie

* Autoplay da community channel

* small fix

* cambiato patter server "directo" per escludere gli spazi vuoti e trovare url di file m3u8, mp4, mpeg, mpd, flv m3u
Aggiunta funzionalità sul canale community per filtrare i risultati trovati tramite patterns

* fix consigliati

* fix se l'url inserito è un server conosciuto da kod

* creata chiave apposita "find_links" per differenziare il funzionamento standard aggiunto il controllo sugli short link (per poterli utilizzare nel canale), aggiunto is.gd come servizio di short link su unshortenit

Co-authored-by: Alex Pettiti <alex.pettiti@axterisko.it>
Co-authored-by: mac12m99 <10120390+mac12m99@users.noreply.github.com>
This commit is contained in:
4l3x87
2021-08-26 18:19:35 +02:00
committed by GitHub
parent 48eac3643b
commit 4f83b6f8be
4 changed files with 215 additions and 157 deletions
+1 -1
View File
@@ -39,7 +39,7 @@ def start(itemlist, item):
if not config.is_xbmc(): if not config.is_xbmc():
return itemlist return itemlist
if config.get_setting('autoplay'): if config.get_setting('autoplay') or (item.channel == 'community' and item.autoplay):
# Save the current value of "Action and Player Mode" in preferences # Save the current value of "Action and Player Mode" in preferences
user_config_setting_action = config.get_setting("default_action") user_config_setting_action = config.get_setting("default_action")
# user_config_setting_player = config.get_setting("player_mode") # user_config_setting_player = config.get_setting("player_mode")
+1 -1
View File
@@ -45,7 +45,7 @@ class UnshortenIt(object):
# for services that only include real link inside iframe # for services that only include real link inside iframe
_simple_iframe_regex = r'cryptmango|xshield\.net|vcrypt\.club' _simple_iframe_regex = r'cryptmango|xshield\.net|vcrypt\.club'
# for services that only do redirects # for services that only do redirects
_simple_redirect = r'streamcrypt\.net/[^/]+|uprot\.net' _simple_redirect = r'streamcrypt\.net/[^/]+|uprot\.net|is\.gd'
listRegex = [_adfly_regex, _linkbucks_regex, _adfocus_regex, _lnxlu_regex, _shst_regex, _hrefli_regex, _anonymz_regex, listRegex = [_adfly_regex, _linkbucks_regex, _adfocus_regex, _lnxlu_regex, _shst_regex, _hrefli_regex, _anonymz_regex,
_shrink_service_regex, _rapidcrypt_regex, _simple_iframe_regex, _linkup_regex, _linkhub_regex, _shrink_service_regex, _rapidcrypt_regex, _simple_iframe_regex, _linkup_regex, _linkhub_regex,
+1 -6
View File
@@ -4,12 +4,7 @@
"ignore_urls": [], "ignore_urls": [],
"patterns": [ "patterns": [
{ {
"pattern": "((?:http://|https://).*?m3u8[^\"'\n]*)", "pattern": "((?:https?://).\\S+.(m3u8|mp4|mpeg|mpd|flv)[^\"'\n]*)",
"url": "\\1"
},
{
"pattern": "((?:http://|https://).*?.mpd[^\"'\n]*)",
"url": "\\1" "url": "\\1"
}, },
{ {
+211 -148
View File
@@ -2,25 +2,30 @@
# -*- Channel Community -*- # -*- Channel Community -*-
import re, inspect, xbmcgui import re, inspect, mimetypes, xbmcgui
from core import httptools, jsontools, tmdb, support, filetools from core import httptools, jsontools, tmdb, support, filetools
from core.item import Item from core.item import Item
from lib import unshortenit
from platformcode import config, platformtools, logger from platformcode import config, platformtools, logger
from channelselector import get_thumb from channelselector import get_thumb
from collections import OrderedDict from collections import OrderedDict
from core import servertools
info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json info_language = ["de", "en", "es", "fr", "it", "pt"] # from videolibrary.json
try: lang = info_language[config.get_setting("info_language", "videolibrary")] try:
except: lang = 'it' lang = info_language[config.get_setting("info_language", "videolibrary")]
except:
lang = 'it'
defpage = ["", "20", "40", "60", "80", "100"] defpage = ["", "20", "40", "60", "80", "100"]
defp = defpage[config.get_setting('pagination','community')] defp = defpage[config.get_setting('pagination', 'community')]
disable_pagination = False disable_pagination = False
show_seasons = config.get_setting('show_seasons','community') show_seasons = config.get_setting('show_seasons', 'community')
tmdb_api = 'a1ab8b8669da03637a4b98fa39c39228' tmdb_api = 'a1ab8b8669da03637a4b98fa39c39228'
def mainlist(item): def mainlist(item):
logger.debug() logger.debug()
@@ -38,19 +43,19 @@ def show_channels(item):
itemlist = [] itemlist = []
# add context menu # add context menu
context = [{"title": config.get_localized_string(50005), "action": "remove_channel", "channel": "community"}] context = [{"title": config.get_localized_string(50005), "action": "remove_channel", "channel": "community"}]
# read json # read json
json = load_and_check(item) json = load_and_check(item)
itemlist.append(Item(channel=item.channel, itemlist.append(Item(channel=item.channel,
title=support.typo(config.get_localized_string(70676),'bold color kod'), title=support.typo(config.get_localized_string(70676), 'bold color kod'),
action='add_channel', action='add_channel',
thumbnail=get_thumb('add.png'))) thumbnail=get_thumb('add.png')))
for key, channel in json['channels'].items(): for key, channel in json['channels'].items():
path = filetools.dirname(channel['path']) # relative path path = filetools.dirname(channel['path']) # relative path
channel_json = load_json(channel) # read channel json channel_json = load_json(channel) # read channel json
# retrieve information from json # retrieve information from json
thumbnail = relative('thumbnail', channel_json, path) thumbnail = relative('thumbnail', channel_json, path)
@@ -59,13 +64,13 @@ def show_channels(item):
plot = channel_json['plot'] if 'plot' in channel_json else '' plot = channel_json['plot'] if 'plot' in channel_json else ''
itemlist.append(Item(channel=item.channel, itemlist.append(Item(channel=item.channel,
title=support.typo(channel['channel_name'],'bold'), title=support.typo(channel['channel_name'], 'bold'),
url=channel['url'] if 'url' in channel else path, url=channel['url'] if 'url' in channel else path,
thumbnail=thumbnail, thumbnail=thumbnail,
fanart=fanart, fanart=fanart,
plot=plot, plot=plot,
action='show_menu', action='show_menu',
channel_id = key, channel_id=key,
context=context, context=context,
path=path)) path=path))
@@ -77,8 +82,7 @@ def show_menu(item):
logger.debug() logger.debug()
itemlist = [] itemlist = []
if item.menu: # if second level menu
if item.menu: # if second level menu
get_sub_menu(item, item.menu, 'level2', itemlist) get_sub_menu(item, item.menu, 'level2', itemlist)
else: else:
if type(item.url) == dict: if type(item.url) == dict:
@@ -103,14 +107,12 @@ def show_menu(item):
itemlist += get_seasons(item) itemlist += get_seasons(item)
elif key in ['episodes_list']: elif key in ['episodes_list']:
itemlist += episodios(item, json, key) itemlist += episodios(item, json, key)
elif key in ['links']: elif key in ['links', 'find_links']:
itemlist += findvideos(item) itemlist += findvideos(item)
elif key in ['search'] and 'url' in json['search']: elif key in ['search'] and 'url' in json['search']:
search_json = json['search'] search_json = json['search']
itemlist += get_search_menu(item, search_json) itemlist += get_search_menu(item, search_json)
if 'channel_name' in json and not 'disable_search' in json and 'search' not in json: if 'channel_name' in json and not 'disable_search' in json and 'search' not in json:
itemlist += get_search_menu(item, json, channel_name=json['channel_name']) itemlist += get_search_menu(item, json, channel_name=json['channel_name'])
logger.debug('PAGINATION:', disable_pagination) logger.debug('PAGINATION:', disable_pagination)
@@ -118,7 +120,7 @@ def show_menu(item):
def search(item, text): def search(item, text):
logger.info('search',text) logger.info('search', text)
itemlist = [] itemlist = []
if item.custom_search: if item.custom_search:
@@ -142,6 +144,7 @@ def search(item, text):
return itemlist return itemlist
def global_search(item, text): def global_search(item, text):
itemlist = [] itemlist = []
json = load_json(item) json = load_json(item)
@@ -149,7 +152,8 @@ def global_search(item, text):
if 'menu' in json: if 'menu' in json:
for option in json['menu']: for option in json['menu']:
if option in ['submenu', 'level2'] and 'seach' in json['menu'][option] and 'url' in json['menu'][option]['search']: if option in ['submenu', 'level2'] and 'seach' in json['menu'][option] and 'url' in json['menu'][option][
'search']:
item.custom_search = json['menu'][option]['search']['url'] item.custom_search = json['menu'][option]['search']['url']
itemlist += search(item, text) itemlist += search(item, text)
else: else:
@@ -158,15 +162,13 @@ def global_search(item, text):
if item.url: if item.url:
itemlist += global_search(item, text) itemlist += global_search(item, text)
if any(key in json for key in ['movies_list','tvshows_list', 'generic_list']): if any(key in json for key in ['movies_list', 'tvshows_list', 'generic_list']):
itemlist += search(item, text) itemlist += search(item, text)
return itemlist return itemlist
def peliculas(item, json='', key='', itemlist=[]): def peliculas(item, json='', key='', itemlist=[]):
item.plot = item.thumb = item.fanart ='' item.plot = item.thumb = item.fanart = ''
logger.debug('PAGINATION:', item.disable_pagination) logger.debug('PAGINATION:', item.disable_pagination)
if not json: if not json:
key = item.key key = item.key
@@ -174,25 +176,28 @@ def peliculas(item, json='', key='', itemlist=[]):
else: else:
json = json[key] json = json[key]
# logger.debug('DEBUG:', json)
infoLabels = item.infoLabels if item.infoLabels else {} infoLabels = item.infoLabels if item.infoLabels else {}
contentType = 'tvshow' if 'tvshow' in key else 'movie' contentType = 'tvshow' if 'tvshow' in key else 'movie'
itlist = filterkey = [] itlist = filterkey = []
action = 'findvideos' action = 'findvideos'
if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'search'] and not item.filterkey and not item.disable_pagination: if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes',
'search'] and not item.filterkey and not item.disable_pagination:
Pagination = int(defp) if defp.isdigit() else '' Pagination = int(defp) if defp.isdigit() else ''
else: Pagination = '' else:
Pagination = ''
pag = item.page if item.page else 1 pag = item.page if item.page else 1
for i, option in enumerate(json): for i, option in enumerate(json):
if Pagination and (pag - 1) * Pagination > i: continue # pagination if Pagination and (pag - 1) * Pagination > i: continue # pagination
if Pagination and i >= pag * Pagination: break if Pagination and i >= pag * Pagination: break
if item.filterkey and item.filterkey in option: if item.filterkey and item.filterkey in option:
filterkey = [it.lower() for it in option[item.filterkey]] if type(option[item.filterkey]) == list else [option[item.filterkey].lower()] filterkey = [it.lower() for it in option[item.filterkey]] if type(option[item.filterkey]) == list else [
option[item.filterkey].lower()]
else: else:
filterkey = [] filterkey = []
title = option['title'] if 'title' in option else '' title = option['title'] if 'title' in option else ''
if 'tvshows_list' in key and 'links' not in option: if 'tvshows_list' in key and 'links' not in option:
@@ -200,26 +205,32 @@ def peliculas(item, json='', key='', itemlist=[]):
# filter elements # filter elements
if (not item.filter or item.filter.lower() in filterkey) and item.search.lower() in title.lower() and title: if (not item.filter or item.filter.lower() in filterkey) and item.search.lower() in title.lower() and title:
if 'generic_list' in key and 'links' not in option and 'url' in option:
option['links'] = []
option['links'].append({'url': option['url']})
option['url'] = ''
extra = set_extra_values(item, option, item.path) extra = set_extra_values(item, option, item.path)
infoLabels['year'] = option['year'] if 'year' in option else '' infoLabels['year'] = option['year'] if 'year' in option else ''
infoLabels['tmdb_id'] = option['tmdb_id'] if 'tmdb_id' in option else '' infoLabels['tmdb_id'] = option['tmdb_id'] if 'tmdb_id' in option else ''
it = Item(channel = item.channel, it = Item(channel=item.channel,
title = set_title(title, extra.language, extra.quality), title=set_title(title, extra.language, extra.quality),
fulltitle = title, fulltitle=title,
show = title, show=title,
contentTitle = title if contentType == 'movie' else '', contentTitle=title if contentType == 'movie' else '',
contentSerieName = title if contentType != 'movie' else '', contentSerieName=title if contentType != 'movie' else '',
contentType = contentType, contentType=contentType,
infoLabels = infoLabels, infoLabels=infoLabels,
url = extra.url, url=extra.url,
path = item.path, path=item.path,
thumbnail = extra.thumb, thumbnail=extra.thumb,
fanart = extra.fanart, fanart=extra.fanart,
plot = extra.plot, plot=extra.plot,
personal_plot = extra.plot, personal_plot=extra.plot,
action = action) action=action)
itlist.append(it) itlist.append(it)
if not 'generic_list' in key: if not 'generic_list' in key:
@@ -242,8 +253,10 @@ def get_seasons(item):
itemlist = [] itemlist = []
infoLabels = item.infoLabels infoLabels = item.infoLabels
json = item.url if type(item.url) == dict else item.url json = item.url if type(item.url) == dict else item.url
if 'seasons_list' in json: json = json['seasons_list'] if 'seasons_list' in json:
elif 'tvshows_list' in json: return show_menu(item) json = json['seasons_list']
elif 'tvshows_list' in json:
return show_menu(item)
for option in json: for option in json:
infoLabels['season'] = option['season'] infoLabels['season'] = option['season']
title = config.get_localized_string(60027) % option['season'] title = config.get_localized_string(60027) % option['season']
@@ -263,12 +276,14 @@ def get_seasons(item):
contentType='season' if show_seasons else 'tvshow', contentType='season' if show_seasons else 'tvshow',
path=extra.path)) path=extra.path))
if inspect.stack()[2][3] in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'get_newest'] or show_seasons == False: if inspect.stack()[2][3] in ['add_tvshow', 'get_episodes', 'update', 'find_episodes',
'get_newest'] or show_seasons == False:
itlist = [] itlist = []
for item in itemlist: for item in itemlist:
itlist = episodios(item) itlist = episodios(item)
itemlist = itlist itemlist = itlist
if inspect.stack()[2][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'get_newest'] and defp and not item.disable_pagination: if inspect.stack()[2][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes',
'get_newest'] and defp and not item.disable_pagination:
itemlist = pagination(item, itemlist) itemlist = pagination(item, itemlist)
if show_seasons: if show_seasons:
@@ -277,10 +292,10 @@ def get_seasons(item):
return itemlist return itemlist
def episodios(item, json ='', key='', itemlist =[]): def episodios(item, json='', key='', itemlist=[]):
logger.debug() logger.debug()
infoLabels = item.infoLabels infoLabels = item.infoLabels
itm=item itm = item
if type(item.url) == dict: if type(item.url) == dict:
if 'seasons_list' in item.url: if 'seasons_list' in item.url:
@@ -304,9 +319,11 @@ def episodios(item, json ='', key='', itemlist =[]):
ep = 1 ep = 1
season = infoLabels['season'] if 'season' in infoLabels else item.contentSeason if item.contentSeason else 1 season = infoLabels['season'] if 'season' in infoLabels else item.contentSeason if item.contentSeason else 1
if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'search'] and not show_seasons: if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes',
'search'] and not show_seasons:
Pagination = int(defp) if defp.isdigit() else '' Pagination = int(defp) if defp.isdigit() else ''
else: Pagination = '' else:
Pagination = ''
pag = item.page if item.page else 1 pag = item.page if item.page else 1
# make items # make items
@@ -315,7 +332,7 @@ def episodios(item, json ='', key='', itemlist =[]):
if Pagination and i >= pag * Pagination: break if Pagination and i >= pag * Pagination: break
# build numeration of episodes # build numeration of episodes
numeration = option['number'] if 'number' in option else option['title'] numeration = option['number'] if 'number' in option else option['title']
match = support.match(numeration , patron=r'(?P<season>\d+)x(?P<episode>\d+)').match match = support.match(numeration, patron=r'(?P<season>\d+)x(?P<episode>\d+)').match
if match: if match:
episode_number = match[1] episode_number = match[1]
ep = int(match[1]) + 1 ep = int(match[1]) + 1
@@ -338,25 +355,25 @@ def episodios(item, json ='', key='', itemlist =[]):
title = '%sx%s%s' % (season_number, episode_number, title) title = '%sx%s%s' % (season_number, episode_number, title)
extra = set_extra_values(item, option, item.path) extra = set_extra_values(item, option, item.path)
if not item.filterseason or season_number == int(item.filterseason): if not item.filterseason or season_number == int(item.filterseason):
itemlist.append(Item(channel = item.channel, itemlist.append(Item(channel=item.channel,
title = set_title(title, extra.language, extra.quality), title=set_title(title, extra.language, extra.quality),
fulltitle = item.fulltitle, fulltitle=item.fulltitle,
show = item.show, show=item.show,
url = option, url=option,
action = 'findvideos', action='findvideos',
plot = extra.plot, plot=extra.plot,
thumbnail= extra.thumb if extra.thumb else item.thumbnail, thumbnail=extra.thumb if extra.thumb else item.thumbnail,
fanart = extra.fanart, fanart=extra.fanart,
contentSeason = season_number, contentSeason=season_number,
contentEpisode = episode_number, contentEpisode=episode_number,
infoLabels = infoLabels, infoLabels=infoLabels,
contentType = 'episode', contentType='episode',
path = item.path)) path=item.path))
# if showseason # if showseason
if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'get_newest', 'search']: if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'get_newest', 'search']:
if show_seasons and not item.filterseason: if show_seasons and not item.filterseason:
itm.contentType='season' itm.contentType = 'season'
season_list = [] season_list = []
for item in itemlist: for item in itemlist:
if item.contentSeason not in season_list: if item.contentSeason not in season_list:
@@ -371,7 +388,7 @@ def episodios(item, json ='', key='', itemlist =[]):
url=itm.url, url=itm.url,
action='episodios', action='episodios',
contentSeason=season, contentSeason=season,
contentType = 'episode', contentType='episode',
infoLabels=infoLabels, infoLabels=infoLabels,
filterseason=str(season), filterseason=str(season),
path=item.path)) path=item.path))
@@ -391,17 +408,46 @@ def episodios(item, json ='', key='', itemlist =[]):
# Find Servers # Find Servers
def findvideos(item): def findvideos(item):
logger.debug() # logger.debug('DEBUG', item)
item.contentTitle = item.fulltitle item.contentTitle = item.fulltitle
itemlist = [] itemlist = []
json = []
if 'links' in item.url: if 'links' in item.url:
json = item.url['links'] json = item.url['links']
elif 'find_links' in item.url:
for link in item.url['find_links']:
link['url'] = unshortenit.findlinks(link['url'])
mimetype = findS = None
mimetype = mimetypes.MimeTypes().guess_type(link['url'])[0]
if mimetype is None:
findS = servertools.get_server_from_url(link['url'])
if mimetype is None and findS is None:
data = support.match(link['url']).data
itemlist_url = servertools.find_video_items(data=data)
if len(itemlist_url):
for item_url in itemlist_url:
valid = True
patterns = link.get('patterns', False)
if patterns:
valid = False
for pattern in patterns:
match = re.search(pattern, item_url.url)
if match:
valid = True
break
if valid:
json.append({"url": item_url.url})
else:
json.append(link)
else: else:
json = item.url url = item.url
item.url = {}
json.append({"url": url})
# support.dbg() # support.dbg()
for option in json: for option in json:
extra = set_extra_values(item, option, item.path) extra = set_extra_values(item, option, item.path)
itemlist.append( itemlist.append(
item.clone(url=option['url'], item.clone(url=option['url'],
action='play', action='play',
@@ -409,32 +455,34 @@ def findvideos(item):
contentLanguage=extra.language, contentLanguage=extra.language,
extraInfo=extra.info)) extraInfo=extra.info))
videolibrary = item.url.get('videolibrary', True)
item.autoplay = item.url.get('autoplay', False)
item.url = '' # do not pass referer item.url = '' # do not pass referer
return support.server(item, itemlist=itemlist) return support.server(item, itemlist=itemlist, Videolibrary=videolibrary)
################################ Menu ################################ ################################ Menu ################################
def get_menu(item, json, key, itemlist=[]): def get_menu(item, json, key, itemlist=[]):
logger.debug()
json = json[key] json = json[key]
for option in json: for option in json:
title = option['title'] if 'title' in option else json[option] if 'search' not in option else '' title = option['title'] if 'title' in option else json[option] if 'search' not in option else ''
extra = set_extra_values(item, option, item.path) extra = set_extra_values(item, option, item.path)
level2 = option if 'level2' in option else [] level2 = option if 'level2' in option else []
it = Item(channel = item.channel, it = Item(channel=item.channel,
title = support.typo(title, 'bullet bold'), title=support.typo(title, 'bullet bold'),
fulltitle = title, fulltitle=title,
show = title, show=title,
url = extra.url, url=extra.url,
path = item.path, path=item.path,
thumbnail = extra.thumb, thumbnail=extra.thumb,
fanart = extra.fanart, fanart=extra.fanart,
plot = extra.plot, plot=extra.plot,
action = 'show_menu', action='show_menu',
menu = level2 if not item.menu else None, menu=level2 if not item.menu else None,
filterkey = extra.filterkey, filterkey=extra.filterkey,
filter = extra.filter) filter=extra.filter)
if title: if title:
itemlist.append(it) itemlist.append(it)
@@ -442,7 +490,7 @@ def get_menu(item, json, key, itemlist=[]):
get_search_menu(it, json, itemlist) get_search_menu(it, json, itemlist)
elif 'submenu' in option: elif 'submenu' in option:
get_sub_menu(it, option, 'submenu' ,itemlist) get_sub_menu(it, option, 'submenu', itemlist)
for item in itemlist: for item in itemlist:
if not item.thumbnail: support.thumb(item) if not item.thumbnail: support.thumb(item)
@@ -463,20 +511,20 @@ def get_sub_menu(item, json, key, itemlist=[]):
extra = set_extra_values(item, json[option], item.path) extra = set_extra_values(item, json[option], item.path)
if not extra.url: extra.url = item.url if not extra.url: extra.url = item.url
filterkey = option filterkey = option
level2 = option if 'level2' in option else [] level2 = option if 'level2' in option else []
it = Item(channel = item.channel, it = Item(channel=item.channel,
title = support.typo(title,'submenu'), title=support.typo(title, 'submenu'),
fulltitle = title, fulltitle=title,
show = title, show=title,
url = extra.url, url=extra.url,
path = item.path, path=item.path,
thumbnail = extra.thumb, thumbnail=extra.thumb,
fanart = extra.fanart, fanart=extra.fanart,
plot = extra.plot, plot=extra.plot,
action = 'show_menu', action='show_menu',
menu = level2 if not item.menu else None, menu=level2 if not item.menu else None,
filterkey = filterkey, filterkey=filterkey,
description = extra.description) description=extra.description)
itemlist.append(it) itemlist.append(it)
if 'search' in option: if 'search' in option:
@@ -500,7 +548,7 @@ def get_search_menu(item, json='', itemlist=[], channel_name=''):
extra = set_extra_values(item, json, item.path) extra = set_extra_values(item, json, item.path)
itemlist.append(Item(channel=item.channel, itemlist.append(Item(channel=item.channel,
title=support.typo(title,'submenu bold'), title=support.typo(title, 'submenu bold'),
fulltitle=title, fulltitle=title,
show=title, show=title,
thumbnail=extra.thumb, thumbnail=extra.thumb,
@@ -515,7 +563,7 @@ def get_search_menu(item, json='', itemlist=[], channel_name=''):
return itemlist return itemlist
def submenu(item, json, key, itemlist = [], filter_list = []): def submenu(item, json, key, itemlist=[], filter_list=[]):
logger.debug(item) logger.debug(item)
import sys import sys
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
@@ -527,8 +575,10 @@ def submenu(item, json, key, itemlist = [], filter_list = []):
if type(item.description) == dict: if type(item.description) == dict:
description = item.description description = item.description
else: else:
if ':/' in item.description: url = item.description if ':/' in item.description:
else: url = filetools.join(item.path, item.description) url = item.description
else:
url = filetools.join(item.path, item.description)
description = load_json(url, no_order=True) description = load_json(url, no_order=True)
else: else:
description = None description = None
@@ -585,8 +635,11 @@ def filter_thread(filter, key, item, description):
results = tmdb_inf.results[0] results = tmdb_inf.results[0]
id = results['id'] id = results['id']
if id: if id:
thumbnail = 'https://image.tmdb.org/t/p/original' + results['profile_path'] if results['profile_path'] else item.thumbnail thumbnail = 'https://image.tmdb.org/t/p/original' + results['profile_path'] if results[
json_file = httptools.downloadpage('http://api.themoviedb.org/3/person/'+ str(id) + '?api_key=' + tmdb_api + '&language=en', use_requests=True).data 'profile_path'] else item.thumbnail
json_file = httptools.downloadpage(
'http://api.themoviedb.org/3/person/' + str(id) + '?api_key=' + tmdb_api + '&language=en',
use_requests=True).data
plot += jsontools.load(json_file)['biography'] plot += jsontools.load(json_file)['biography']
if description: if description:
@@ -596,7 +649,6 @@ def filter_thread(filter, key, item, description):
fanart = extra.fanart if extra.fanart else item.fanart fanart = extra.fanart if extra.fanart else item.fanart
plot = extra.plot if extra.plot else item.plot plot = extra.plot if extra.plot else item.plot
item = Item(channel=item.channel, item = Item(channel=item.channel,
title=support.typo(filter, 'bold'), title=support.typo(filter, 'bold'),
url=item.url, url=item.url,
@@ -674,25 +726,28 @@ def set_extra_values(item, json, path):
if key == 'quality': if key == 'quality':
ret.quality = json[key] ret.quality = json[key]
if ret.quality and not ret.quality[0].isdigit(): ret.quality = ret.quality.upper() if ret.quality and not ret.quality[0].isdigit(): ret.quality = ret.quality.upper()
elif key == 'language': elif key == 'language':
ret.language = json[key].upper() ret.language = json[key].upper()
elif key == 'plot': elif key == 'plot':
ret.plot = json[key] ret.plot = json[key]
elif key in ['poster', 'thumbnail']: elif key in ['poster', 'thumbnail']:
ret.thumb = json[key] if ':/' in json[key] else filetools.join(path,json[key]) if '/' in json[key] else get_thumb(json[key]) ret.thumb = json[key] if ':/' in json[key] else filetools.join(path, json[key]) if '/' in json[
elif key == 'fanart': key] else get_thumb(json[key])
ret.fanart = json[key] if ':/' in json[key] else filetools.join(path,json[key]) elif key == 'fanart':
ret.fanart = json[key] if ':/' in json[key] else filetools.join(path, json[key])
elif key in ['url', 'link']: elif key in ['url', 'link']:
ret.url = json[key] if ':/' in json[key] or type(json[key]) == dict else filetools.join(path,json[key]) ret.url = json[key] if ':/' in json[key] or type(json[key]) == dict else filetools.join(path, json[key])
elif key == 'seasons_list': elif key == 'seasons_list':
ret.url = {} ret.url = {}
ret.url['seasons_list'] = json['seasons_list'] ret.url['seasons_list'] = json['seasons_list']
elif key == 'episodes_list': elif key == 'episodes_list':
ret.url = {} ret.url = {}
ret.url['episodes_list'] = json['episodes_list'] ret.url['episodes_list'] = json['episodes_list']
elif key == 'links': elif key in ['links', 'find_links']:
ret.url={} ret.url = {}
ret.url['links'] = json[key] ret.url[key] = json[key]
ret.url['videolibrary'] = json.get('videolibrary', True)
ret.url['autoplay'] = json.get('autoplay', False)
elif key == 'filter': elif key == 'filter':
filterkey = json[key].keys()[0] filterkey = json[key].keys()[0]
ret.filter = json[key][filterkey] ret.filter = json[key][filterkey]
@@ -712,6 +767,7 @@ def set_extra_values(item, json, path):
if not ret.plot: if not ret.plot:
ret.plot = item.plot ret.plot = item.plot
logger.debug(ret.url)
return ret return ret
@@ -721,8 +777,8 @@ def set_title(title, language='', quality='', info=''):
t = support.match(title, patron=r'\{([^\}]+)\}').match t = support.match(title, patron=r'\{([^\}]+)\}').match
if 'bold' not in t: t += ' bold' if 'bold' not in t: t += ' bold'
title = re.sub(r'(\{[^\}]+\})','',title) title = re.sub(r'(\{[^\}]+\})', '', title)
title = support.typo(title,t) title = support.typo(title, t)
if quality: if quality:
title += support.typo(quality, '_ [] color kod bold') title += support.typo(quality, '_ [] color kod bold')
@@ -744,14 +800,15 @@ def relative(key, json, path):
ret = '' ret = ''
if key in json: if key in json:
if key in ['thumbnail', 'poster']: if key in ['thumbnail', 'poster']:
ret = json[key] if ':/' in json[key] else filetools.join(path,json[key]) if '/' in json[key] else get_thumb(json[key]) if json[key] else '' ret = json[key] if ':/' in json[key] else filetools.join(path, json[key]) if '/' in json[
key] else get_thumb(json[key]) if json[key] else ''
else: else:
ret = json[key] if ':/' in json[key] else filetools.join(path,json[key]) if '/' in json[key] else '' ret = json[key] if ':/' in json[key] else filetools.join(path, json[key]) if '/' in json[key] else ''
return ret return ret
def pagination(item, itemlist = []): def pagination(item, itemlist=[]):
logger.debug() logger.debug()
itlist = [] itlist = []
@@ -764,12 +821,13 @@ def pagination(item, itemlist = []):
encoded_itemlist.append(it.tourl()) encoded_itemlist.append(it.tourl())
if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'search']: if inspect.stack()[1][3] not in ['add_tvshow', 'get_episodes', 'update', 'find_episodes', 'search']:
Pagination = int(defp) if defp.isdigit() else '' Pagination = int(defp) if defp.isdigit() else ''
else: Pagination = '' else:
Pagination = ''
pag = item.page if item.page else 1 pag = item.page if item.page else 1
for i, item in enumerate(itemlist): for i, item in enumerate(itemlist):
if Pagination and (pag - 1) * Pagination > i: continue # pagination if Pagination and (pag - 1) * Pagination > i: continue # pagination
if Pagination and i >= pag * Pagination: break # pagination if Pagination and i >= pag * Pagination: break # pagination
itlist.append(item) itlist.append(item)
@@ -777,28 +835,30 @@ def pagination(item, itemlist = []):
if inspect.stack()[1][3] != 'get_newest': if inspect.stack()[1][3] != 'get_newest':
itlist.append( itlist.append(
Item(channel=item.channel, Item(channel=item.channel,
action = 'pagination', action='pagination',
contentType=item.contentType, contentType=item.contentType,
title=support.typo(config.get_localized_string(30992), 'color kod bold'), title=support.typo(config.get_localized_string(30992), 'color kod bold'),
fulltitle= item.fulltitle, fulltitle=item.fulltitle,
show= item.show, show=item.show,
url=item.url, url=item.url,
args=item.args, args=item.args,
page=pag + 1, page=pag + 1,
path=item.path, path=item.path,
media_type=item.media_type, media_type=item.media_type,
thumbnail=support.thumb(), thumbnail=support.thumb(),
itemlist= encoded_itemlist)) itemlist=encoded_itemlist))
return itlist return itlist
def add_channel(item): def add_channel(item):
logger.debug() logger.debug()
channel_to_add = {} channel_to_add = {}
json_file = '' json_file = ''
result = platformtools.dialog_select(config.get_localized_string(70676), [config.get_localized_string(70678), config.get_localized_string(70679)]) result = platformtools.dialog_select(config.get_localized_string(70676),
[config.get_localized_string(70678), config.get_localized_string(70679)])
if result == -1: if result == -1:
return return
if result==0: if result == 0:
file_path = xbmcgui.Dialog().browseSingle(1, config.get_localized_string(70680), 'files') file_path = xbmcgui.Dialog().browseSingle(1, config.get_localized_string(70680), 'files')
try: try:
channel_to_add['path'] = file_path channel_to_add['path'] = file_path
@@ -808,7 +868,7 @@ def add_channel(item):
except: except:
pass pass
elif result==1: elif result == 1:
url = platformtools.dialog_input("", config.get_localized_string(70681), False) url = platformtools.dialog_input("", config.get_localized_string(70681), False)
try: try:
if url[:4] != 'http': if url[:4] != 'http':
@@ -832,19 +892,21 @@ def add_channel(item):
community_json = jsontools.load(community_json.read()) community_json = jsontools.load(community_json.read())
id = 1 id = 1
while str(id) in community_json['channels']: while str(id) in community_json['channels']:
id +=1 id += 1
community_json['channels'][str(id)]=(channel_to_add) community_json['channels'][str(id)] = (channel_to_add)
with open(path, "w") as file: with open(path, "w") as file:
file.write(jsontools.dump(community_json)) file.write(jsontools.dump(community_json))
file.close() file.close()
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(70683) % json_file['channel_name']) platformtools.dialog_notification(config.get_localized_string(20000),
config.get_localized_string(70683) % json_file['channel_name'])
import xbmc import xbmc
xbmc.sleep(1000) xbmc.sleep(1000)
platformtools.itemlist_refresh() platformtools.itemlist_refresh()
return return
def remove_channel(item): def remove_channel(item):
logger.debug() logger.debug()
@@ -857,9 +919,10 @@ def remove_channel(item):
to_delete = community_json['channels'][id]['channel_name'] to_delete = community_json['channels'][id]['channel_name']
del community_json['channels'][id] del community_json['channels'][id]
with open(path, "w") as file: with open(path, "w") as file:
file.write(jsontools.dump(community_json)) file.write(jsontools.dump(community_json))
file.close() file.close()
platformtools.dialog_notification(config.get_localized_string(20000), config.get_localized_string(70684) % to_delete) platformtools.dialog_notification(config.get_localized_string(20000),
config.get_localized_string(70684) % to_delete)
platformtools.itemlist_refresh() platformtools.itemlist_refresh()
return return