KoD 1.5.1

- corretta e migliorata la nuova ricerca globale\n- salvataggio punto di visione basato sull'id tmdb (disponibile su qualunque canale / server anche senza salvare in videoteca)\n- alcuni fix e migliore\n
This commit is contained in:
marco
2020-12-17 18:41:54 +01:00
parent 23e61f23c6
commit de5a65d77a
130 changed files with 853 additions and 553 deletions

View File

@@ -1,4 +1,4 @@
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.5" provider-name="KoD Team">
<addon id="plugin.video.kod" name="Kodi on Demand" version="1.5.1" provider-name="KoD Team">
<requires>
<!-- <import addon="script.module.libtorrent" optional="true"/> -->
<import addon="metadata.themoviedb.org"/>
@@ -26,10 +26,9 @@
<screenshot>resources/media/themes/ss/2.png</screenshot>
<screenshot>resources/media/themes/ss/3.png</screenshot>
</assets>
<news>-Nuova Ricerca Globale
-Nuova Rinumerazione
-Messaggi di Errore più chiari
-Fix var</news>
<news>- corretta e migliorata la nuova ricerca globale
- salvataggio punto di visione basato sull'id tmdb (disponibile su qualunque canale / server anche senza salvare in videoteca)
- alcuni fix e migliore</news>
<description lang="it">Naviga velocemente sul web e guarda i contenuti presenti</description>
<disclaimer>[COLOR red]The owners and submitters to this addon do not host or distribute any of the content displayed by these addons nor do they have any affiliation with the content providers.[/COLOR]
[COLOR yellow]Kodi © is a registered trademark of the XBMC Foundation. We are not connected to or in any other way affiliated with Kodi, Team Kodi, or the XBMC Foundation. Furthermore, any software, addons, or products offered by us will receive no support in official Kodi channels, including the Kodi forums and various social networks.[/COLOR]</disclaimer>

View File

@@ -1,57 +1,57 @@
{
"direct": {
"altadefinizione01_link": "https://altadefinizione01.tips",
"animealtadefinizione": "https://www.animealtadefinizione.it",
"animeforce": "https://ww1.animeforce.org",
"animeleggendari": "https://animeora.com",
"animesaturn": "https://www.animesaturn.it",
"animestream": "https://www.animeworld.tv",
"animesubita": "http://www.animesubita.org",
"animetubeita": "http://www.animetubeita.com",
"animeunity": "https://www.animeunity.it",
"animeuniverse": "https://www.animeuniverse.it/",
"animeworld": "https://www.animeworld.tv",
"casacinema": "https://www.casacinema.page",
"cb01anime": "https://www.cineblog01.red",
"cinemalibero": "https://cinemalibero.store",
"cinetecadibologna": "http://cinestore.cinetecadibologna.it",
"dreamsub": "https://dreamsub.stream",
"dsda": "https://www.dsda.press",
"eurostreaming": "https://eurostreaming.wiki",
"fastsubita": "https://fastsubita.xyz",
"filmgratis": "https://www.filmaltadefinizione.me",
"filmigratis": "https://filmigratis.org",
"filmsenzalimiticc": "https://www.filmsenzalimiti01.online",
"filmstreaming01": "https://filmstreaming01.com",
"guardaserie_stream": "https://guardaserie.host",
"guardaseriecam": "https://guardaserie.cam",
"guardaserieclick": "https://www.guardaserie.date",
"guardaserieicu": "https://guardaserie.today",
"hd4me": "https://hd4me.net",
"ilgeniodellostreaming": "https://ilgeniodellostreaming.cat",
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.gold",
"ilcorsaronero": "https://ilcorsaronero.link",
"italiaserie": "https://italiaserie.best",
"mondoserietv": "https://mondoserietv.fun",
"piratestreaming": "https://www.piratestreaming.date",
"polpotv": "https://roma.polpo.tv",
"raiplay": "https://www.raiplay.it",
"serietvonline": "https://serietvonline.cam",
"serietvsubita": "http://serietvsubita.xyz",
"serietvu": "https://www.serietvu.link",
"streamingcommunity": "https://streamingcommunity.net",
"streamtime": "https://t.me/s/StreamTime",
"toonitalia": "https://toonitalia.org",
"altadefinizione01_link": "https://altadefinizione01.tips",
"animealtadefinizione": "https://www.animealtadefinizione.it",
"animeforce": "https://ww1.animeforce.org",
"animeleggendari": "https://animeora.com",
"animesaturn": "https://www.animesaturn.it",
"animestream": "https://www.animeworld.tv",
"animesubita": "http://www.animesubita.org",
"animetubeita": "http://www.animetubeita.com",
"animeunity": "https://www.animeunity.it",
"animeuniverse": "https://www.animeuniverse.it/",
"animeworld": "https://www.animeworld.tv",
"casacinema": "https://www.casacinema.page",
"cb01anime": "https://www.cineblog01.red",
"cinemalibero": "https://cinemalibero.store",
"cinetecadibologna": "http://cinestore.cinetecadibologna.it",
"dreamsub": "https://dreamsub.stream",
"dsda": "https://www.dsda.press",
"eurostreaming": "https://eurostreaming.wiki",
"fastsubita": "https://fastsubita.xyz",
"filmgratis": "https://www.filmaltadefinizione.me",
"filmigratis": "https://filmigratis.org",
"filmsenzalimiticc": "https://www.filmsenzalimiti01.online",
"filmstreaming01": "https://filmstreaming01.com",
"guardaserie_stream": "https://guardaserie.host",
"guardaseriecam": "https://guardaserie.cam",
"guardaserieclick": "https://www.guardaserie.date",
"guardaserieicu": "https://guardaserie.today",
"hd4me": "https://hd4me.net",
"ilcorsaronero": "https://ilcorsaronero.link",
"ilgeniodellostreaming": "https://ilgeniodellostreaming.cat",
"ilgeniodellostreaming_cam": "https://ilgeniodellostreaming.gold",
"italiaserie": "https://italiaserie.best",
"mondoserietv": "https://mondoserietv.fun",
"piratestreaming": "https://www.piratestreaming.date",
"polpotv": "https://roma.polpo.tv",
"raiplay": "https://www.raiplay.it",
"serietvonline": "https://serietvonline.cam",
"serietvsubita": "http://serietvsubita.xyz",
"serietvu": "https://www.serietvu.link",
"streamingcommunity": "https://streamingcommunity.net",
"streamtime": "https://t.me/s/StreamTime",
"toonitalia": "https://toonitalia.org",
"vvvvid": "https://www.vvvvid.it"
},
},
"findhost": {
"altadefinizione01": "https://altadefinizione01-nuovo.info",
"altadefinizioneclick": "https://altadefinizione-nuovo.me",
"animealtadefinizione": "https://www.animealtadefinizione.it",
"cineblog01": "https://cb01.uno",
"film4k": "https://film4k-nuovo.link",
"filmpertutti": "https://filmpertutti.nuovo.live",
"seriehd": "https://nuovoindirizzo.info/seriehd/",
"altadefinizione01": "https://altadefinizione01-nuovo.info",
"altadefinizioneclick": "https://altadefinizione-nuovo.me",
"animealtadefinizione": "https://www.animealtadefinizione.it",
"cineblog01": "https://cb01.uno",
"film4k": "https://film4k-nuovo.link",
"filmpertutti": "https://filmpertutti.nuovo.live",
"seriehd": "https://nuovoindirizzo.info/seriehd/",
"tantifilm": "https://www.tantifilm.wiki"
}
}

View File

@@ -3,7 +3,7 @@
# Canale per AnimeUnity
# ------------------------------------------------------------
import requests, json, copy
import requests, json, copy, inspect
from core import support
from platformcode import autorenumber
@@ -212,7 +212,8 @@ def episodios(item):
contentType='episode',
url=it['link']))
autorenumber.start(itemlist, item)
if inspect.stack()[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item)
support.videolibrary(itemlist, item)
support.download(itemlist, item)
return itemlist

View File

@@ -95,7 +95,7 @@ def episodios(item):
item.contentType = 'tvshow'
else:# item.extra == 'serie':
support.info("Serie :", item)
patron = r'(?:>| )(?P<episode>\d+(?:x|×|&#215;)\d+)[;]?[ ]?(?:(?P<title>[^<-]+)(?P<url>.*?)|(\2[ ])(?:<(\3.*?)))(?:</a><br /|</a></p|$)'
patron = r'(?:>| )(?P<episode>\d+(?:x|×|&#215;)\d+)[;]?[ ]?(?:(?P<title>[^<-]+)(?P<data>.*?)|(\2[ ])(?:<(\3.*?)))(?:</a><br /|</a></p|$)'
patronBlock = r'>(?:[^<]+[Ss]tagione\s|[Ss]tagione [Uu]nica)(?:(?P<lang>iTA|ITA|Sub-ITA|Sub-iTA))?.*?</strong>(?P<block>.+?)(?:<strong|<div class="at-below)'
item.contentType = 'tvshow'
def itemHook(item):

View File

@@ -68,10 +68,10 @@ def episodios(item):
data = support.match(item.url, headers=headers).data
if 'accordion-item' in data:
patronBlock = r'<span class="season[^>]*>\d+[^>]+>[^>]+>[^>]+>[^>]+>\D*(?:STAGIONE|Stagione)[ -]+(?P<lang>[a-zA-Z\- ]+)[^<]*</span>(?P<block>.*?)<div id="(?:season|disqus)'
patron = r'<img src="(?P<thumb>[^"]+)">.*?<li class="season-no">(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<0-9]*<\/li>(?P<url>.*?javascript:;">(?P<title>[^<]+).*?</tbody>)'
patron = r'<img src="(?P<thumb>[^"]+)">.*?<li class="season-no">(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<0-9]*<\/li>(?P<data>.*?javascript:;">(?P<title>[^<]+).*?</tbody>)'
else:
patronBlock = r'(?:STAGIONE|Stagione)(?:<[^>]+>)?\s*(?:(?P<lang>[A-Za-z- ]+))?(?P<block>.*?)(?:&nbsp;|<strong>|<div class="addtoany)'
patron = r'(?:/>|p>)\s*(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<]+(?P<other>.*?)(?:<br|</p)'
patron = r'(?:/>|p>)\s*(?P<season>\d+)(?:&#215;|×|x)(?P<episode>\d+)[^<]+(?P<data>.*?)(?:<br|</p)'
def itemHook(i):
i.url = item.url
@@ -156,7 +156,7 @@ def newest(categoria):
def findvideos(item):
if item.contentType == 'movie':
data = httptools.downloadpage(item.url).data
data = support.match(item.url, patron=r'<a target="_blank" rel="nofollow" href="([^"]+)">').matches
return support.server(item, data=data, patronTag='Versione: <[^>]+>([^<]+)')
else:
return support.server(item, item.other)
return support.server(item, item.data)

View File

@@ -105,7 +105,7 @@ def peliculas(item):
if pagination and len(itemlist) >= item.page * pagination and not item.search:
itlist.append(item.clone(channel=item.channel, action = 'peliculas', title=support.typo(support.config.get_localized_string(30992), 'color kod bold'), page=item.page + 1, thumbnail=support.thumb()))
itemlist = itlist
autorenumber.renumber(itemlist, item, 'bold')
autorenumber.start(itemlist)
return itemlist
@@ -156,7 +156,8 @@ def episodios(item):
action='findvideos'))
itemlist.sort(key=lambda item: (item.season, item.episode))
autorenumber.renumber(itemlist, item, 'bold')
if inspect.stack()[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item)
return support.videolibrary(itemlist, item)

View File

@@ -3,7 +3,7 @@
# Canale per Rai Play
# ------------------------------------------------------------
import requests, sys
import requests, sys, inspect
from core import support
from platformcode import autorenumber
if sys.version_info[0] >= 3:
@@ -297,7 +297,7 @@ def episodios(item):
it.title = support.typo(item.season + 'x' + episode, 'bold') + (' - ' + it.title)
if itemlist and itemlist[0].VL: support.videolibrary(itemlist, item)
if itemlist and not support.match(itemlist[0].title, patron=r'[Ss]?(\d+)(?:x|_|\.|\s+)[Ee]?[Pp]?(\d+)').match:
if itemlist and not support.match(itemlist[0].title, patron=r'[Ss]?(\d+)(?:x|_|\.|\s+)[Ee]?[Pp]?(\d+)').match and inspect.stack()[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item)
return itemlist

View File

@@ -8,13 +8,18 @@ from core import support
host = support.config.get_channel_url()
session = requests.Session()
response = session.get(host)
csrf_token = support.match(response.text, patron='name="csrf-token" content="([^"]+)"').match
headers = {'content-type': 'application/json;charset=UTF-8',
'Referer': host,
'x-csrf-token': csrf_token,
'Cookie': '; '.join([x.name + '=' + x.value for x in response.cookies])}
headers = {}
def getHeaders():
global headers
if not headers:
session = requests.Session()
response = session.get(host)
csrf_token = support.match(response.text, patron='name="csrf-token" content="([^"]+)"').match
headers = {'content-type': 'application/json;charset=UTF-8',
'Referer': host,
'x-csrf-token': csrf_token,
'Cookie': '; '.join([x.name + '=' + x.value for x in response.cookies])}
@support.menu
@@ -34,6 +39,7 @@ def mainlist(item):
def genres(item):
getHeaders()
support.info()
itemlist = []
data = support.scrapertools.decodeHtmlentities(support.match(item).data)
@@ -85,6 +91,7 @@ def newest(category):
def peliculas(item):
getHeaders()
support.info()
itemlist = []
videoType = 'movie' if item.contentType == 'movie' else 'tv'
@@ -145,6 +152,7 @@ def peliculas(item):
return itemlist
def episodios(item):
getHeaders()
support.info()
itemlist = []
@@ -172,7 +180,7 @@ def episodios(item):
def findvideos(item):
getHeaders()
support.info()
itemlist=[]
url = support.match(support.match(item).data.replace('&quot;','"').replace('\\',''), patron=r'video_url"\s*:\s*"([^"]+)"').match

View File

@@ -2,9 +2,9 @@
# ------------------------------------------------------------
# Canale per vvvvid
# ----------------------------------------------------------
import requests, sys
import requests, sys, inspect
from core import support, tmdb
from platformcode import autorenumber, logger
from platformcode import autorenumber, logger, config
host = support.config.get_channel_url()
@@ -170,7 +170,8 @@ def episodios(item):
url= host + show_id + '/season/' + str(key['season_id']),
action= 'findvideos',
video_id= key['video_id']))
autorenumber.start(itemlist, item)
if inspect.stack()[1][3] not in ['find_episodes']:
autorenumber.start(itemlist, item)
if autorenumber.check(item) == True \
or support.match(itemlist[0].title, patron=r"(\d+x\d+)").match:
support.videolibrary(itemlist,item)
@@ -196,7 +197,7 @@ def findvideos(item):
url = url.split()[-1]
itemlist.append(
item.clone(action= 'play',
title='direct',
title=config.get_localized_string(30137),
url= 'https://or01.top-ix.org/videomg/_definst_/mp4:' + item.url + '/' + url,
server= 'directo')
)
@@ -206,7 +207,7 @@ def findvideos(item):
itemlist.append(
item.clone(action= 'play',
title='direct',
title=config.get_localized_string(30137),
url= item.url + '?' + key,
server= 'directo')
)

View File

@@ -67,7 +67,7 @@ def start(itemlist, item):
# Enable the "View in high quality" action (if the server returns more than one quality, eg gdrive)
if not user_config_setting_action: config.set_setting("default_action", 2)
if user_config_setting_player != 0: config.set_setting("player_mode", 0)
# if user_config_setting_player != 0: config.set_setting("player_mode", 0)
# Priorities when ordering itemlist:
# 0: Servers and qualities
@@ -230,6 +230,7 @@ def start(itemlist, item):
if isinstance(resolved_item[0], list): videoitem.video_urls = resolved_item
else: videoitem = resolved_item[0]
play_item.autoplay = True
# If not directly reproduce and mark as seen
# Check if the item comes from the video library
try:

View File

@@ -30,7 +30,7 @@ cookies_file = os.path.join(config.get_data_path(), "cookies.dat")
# Headers by default, if nothing is specified
default_headers = dict()
default_headers["User-Agent"] = "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
default_headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36" % config.get_setting("chrome_ua_version")
default_headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
default_headers["Accept-Language"] = "it-IT,it;q=0.8,en-US;q=0.5,en;q=0.3"
default_headers["Accept-Charset"] = "UTF-8"

View File

@@ -224,7 +224,12 @@ def get_nfo(item):
return info_nfo
else:
return scraper.get_nfo(item)
try: return scraper.get_nfo(item)
except:
if item.contentType == "movie": scraper_actual = ['tmdb'][config.get_setting("scraper_movies", "videolibrary")]
else: scraper_actual = ['tmdb', 'tvdb'][config.get_setting("scraper_tvshows", "videolibrary")]
scraper = __import__('core.%s' % scraper_actual, fromlist=["core.%s" % scraper_actual])
return scraper.get_nfo(item)
def sort_episode_list(episodelist):

View File

@@ -95,11 +95,14 @@ def search(channel, item, texto):
def dbg():
if config.dev_mode():
import web_pdb
if not web_pdb.WebPdb.active_instance:
import webbrowser
webbrowser.open('http://127.0.0.1:5555')
web_pdb.set_trace()
try:
import web_pdb
if not web_pdb.WebPdb.active_instance:
import webbrowser
webbrowser.open('http://127.0.0.1:5555')
web_pdb.set_trace()
except:
pass
def regexDbg(item, patron, headers, data=''):

View File

@@ -37,6 +37,7 @@ def start():
updater.showSavedChangelog()
def run(item=None):
# from core.support import dbg;dbg()
logger.debug()
if not item:
# Extract item from sys.argv
@@ -135,12 +136,6 @@ def run(item=None):
from platformcode import infoplus
return infoplus.Main(item)
elif config.get_setting('new_search') and item.channel == "search" and item.action == 'new_search':
from platformcode.globalsearch import Search
item.contextual = True
Search(item)
return
elif item.channel == "backup":
from platformcode import backup
return getattr(backup, item.action)(item)
@@ -489,17 +484,24 @@ def play_from_library(item):
item.play_from = 'window'
itemlist = videolibrary.findvideos(item)
p_dialog.update(100, ''); sleep(0.5); p_dialog.close()
# while platformtools.is_playing(): # Conventional window
# sleep(100)
play_time = platformtools.resume_playback(item, True)
if not play_time and config.get_setting('autoplay'):
while platformtools.is_playing(): sleep(1)
# from core.support import dbg;dbg()
if item.contentType == 'movie': nfo_path = item.nfo
else: nfo_path = item.strm_path.replace('strm','nfo')
if nfo_path and filetools.isfile(nfo_path):
from core import videolibrarytools
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
played_time = platformtools.get_played_time(item_nfo)
else: played_time = 0
if not played_time and config.get_setting('autoplay'):
return
# The number of links to show is limited
if config.get_setting("max_links", "videolibrary") != 0: itemlist = limit_itemlist(itemlist)
# The list of links is slightly "cleaned"
if config.get_setting("replace_VD", "videolibrary") == 1: itemlist = reorder_itemlist(itemlist)
# from core.support import dbg;dbg()
if len(itemlist) > 0:
while not xbmc.Monitor().abortRequested():
# The user chooses the mirror

View File

@@ -547,7 +547,7 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
context_commands.append(("InfoPlus", "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=infoplus&action=Main&from_channel=' + item.channel)))
# Go to the Main Menu (channel.mainlist)
if parent_item.channel not in ["news", "channelselector", "downloads"] and item.action != "mainlist":
if parent_item.channel not in ["news", "channelselector", "downloads", "search"] and item.action != "mainlist" and not parent_item.noMainMenu:
if parent_item.action != "mainlist":
context_commands.insert(0, (config.get_localized_string(60349), "Container.Refresh (%s?%s)" % (sys.argv[0], Item(channel=item.channel, action="mainlist").tourl())))
context_commands.insert(1, (config.get_localized_string(70739), "Container.Update (%s?%s)" % (sys.argv[0], Item(action="open_browser", url=item.url).tourl())))
@@ -556,7 +556,7 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
if item.channel not in ["favorites", "videolibrary", "help", ""] and parent_item.channel != "favorites":
context_commands.append( (config.get_localized_string(70557), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, urllib.urlencode({'channel': "kodfavorites", 'action': "addFavourite", 'from_channel': item.channel, 'from_action': item.action}))))
# Search in other channels
if item.contentTitle and item.contentType in ['movie', 'tvshow'] and item.channel != 'search' and item.action not in ['play'] and parent_item.action != 'mainlist':
if item.contentTitle and item.contentType in ['movie', 'tvshow'] and parent_item.channel != 'search' and item.action not in ['play'] and parent_item.action != 'mainlist':
# Search in other channels
if item.contentSerieName != '':
@@ -586,7 +586,7 @@ def set_context_commands(item, item_url, parent_item, **kwargs):
elif item.action in ["detail", "findvideos"] and item.contentType == 'movie' and item.contentTitle:
context_commands.append((config.get_localized_string(60353), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'action=add_pelicula_to_library&from_action=' + item.action)))
if not item.local and item.channel not in ["downloads", "filmontv"] and item.server != 'torrent' and parent_item.action != 'mainlist' and config.get_setting('downloadenabled'):
if not item.local and item.channel not in ["downloads", "filmontv", "search"] and item.server != 'torrent' and parent_item.action != 'mainlist' and config.get_setting('downloadenabled'):
# Download movie
if item.contentType == "movie":
context_commands.append((config.get_localized_string(60354), "RunPlugin(%s?%s&%s)" % (sys.argv[0], item_url, 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action)))
@@ -679,9 +679,7 @@ def play_video(item, strm=False, force_direct=False, autoplay=False):
if force_direct: item.play_from = 'window'
item, nfo_path, head_nfo, item_nfo = resume_playback(item)
set_player(item, xlistitem, mediaurl, view, strm, nfo_path, head_nfo, item_nfo)
set_player(item, xlistitem, mediaurl, view, strm)
def stop_video():
@@ -1009,9 +1007,17 @@ def get_video_seleccionado(item, seleccion, video_urls):
return mediaurl, view, mpd
def set_player(item, xlistitem, mediaurl, view, strm, nfo_path=None, head_nfo=None, item_nfo=None):
def set_player(item, xlistitem, mediaurl, view, strm):
logger.debug()
item.options = {'strm':False, 'continue':False}
# logger.debug("item:\n" + item.tostring('\n'))
# Prevent Busy
if not item.autoplay:
if item.globalsearch: xbmc.executebuiltin("PlayMedia(" + os.path.join(config.get_runtime_path(), "resources", "kod.mp4") + ")")
else: xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path=os.path.join(config.get_runtime_path(), "resources", "kod.mp4")))
xbmc.Player().stop()
# Moved del conector "torrent" here
if item.server == "torrent":
play_torrent(item, xlistitem, mediaurl)
@@ -1028,29 +1034,26 @@ def set_player(item, xlistitem, mediaurl, view, strm, nfo_path=None, head_nfo=No
player_mode = item.player_mode
else:
player_mode = config.get_setting("player_mode")
if (player_mode == 3 and mediaurl.startswith("rtmp")) or item.play_from == 'window' or item.nfo: player_mode = 0
if (player_mode == 3 and mediaurl.startswith("rtmp")): player_mode = 0
elif "megacrypter.com" in mediaurl: player_mode = 3
logger.info("mediaurl=" + mediaurl)
if player_mode == 0:
logger.info('Player Mode: Direct')
if player_mode in [0,1]:
logger.info('Player Mode:' + ['Direct', 'Bookmark'][player_mode])
# Add the listitem to a playlist
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
playlist.clear()
playlist.add(mediaurl, xlistitem)
# played_time = resume_playback(get_played_time(item))
# Reproduce
xbmc_player.play(playlist, xlistitem)
# viewed(item, played_time)
if config.get_setting('trakt_sync'):
from core import trakt_tools
trakt_tools.wait_for_update_trakt()
elif player_mode == 1:
logger.info('Player Mode: setResolvedUrl')
xlistitem.setPath(mediaurl)
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xlistitem)
# xbmc.sleep(2500)
elif player_mode == 2:
logger.info('Player Mode: Built-In')
xbmc.executebuiltin("PlayMedia(" + mediaurl + ")")
@@ -1068,13 +1071,14 @@ def set_player(item, xlistitem, mediaurl, view, strm, nfo_path=None, head_nfo=No
xbmc_player.setSubtitles(item.subtitle)
# if it is a video library file send to mark as seen
if strm or item.strm_path:
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_auto_as_watched(item, nfo_path, head_nfo, item_nfo)
if strm or item.strm_path: item.options['strm'] = True
if player_mode == 1: item.options['continue'] = True
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_auto_as_watched(item)
# for cases where the audio playback window appears in place of the video one
if item.focusOnVideoPlayer:
while is_playing and xbmcgui.getCurrentWindowId() != 12006:
while is_playing() and xbmcgui.getCurrentWindowId() != 12006:
continue
xbmc.sleep(500)
xbmcgui.Window(12005).show()
@@ -1136,16 +1140,16 @@ def play_torrent(item, xlistitem, mediaurl):
time.sleep(3)
def resume_playback(item, return_played_time=False):
def resume_playback(played_time):
class ResumePlayback(xbmcgui.WindowXMLDialog):
Close = False
Resume = False
def __init__(self, *args, **kwargs):
self.action_exitkeys_id = [xbmcgui.ACTION_BACKSPACE, xbmcgui.ACTION_PREVIOUS_MENU, xbmcgui.ACTION_NAV_BACK]
self.action_exitkeys_id = [92, 10]
self.progress_control = None
self.item = kwargs.get('item')
m, s = divmod(float(self.item.played_time), 60)
played_time = kwargs.get('played_time')
m, s = divmod(played_time, 60)
h, m = divmod(m, 60)
self.setProperty("time", '%02d:%02d:%02d' % (h, m, s))
@@ -1168,38 +1172,17 @@ def resume_playback(item, return_played_time=False):
if action in self.action_exitkeys_id:
self.set_values(False)
self.close()
from core import videolibrarytools, filetools
# Read NFO FILE
if item.contentType == 'movie':
nfo_path = item.nfo
else:
nfo_path = item.strm_path.replace('strm','nfo')
if filetools.isfile(nfo_path):
head_nfo, item_nfo = videolibrarytools.read_nfo(nfo_path)
if return_played_time:
return item_nfo.played_time
# Show Window
elif (config.get_setting("player_mode") not in [3] or item.play_from == 'window') and item_nfo.played_time and item_nfo.played_time >= 120:
Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), item=item_nfo)
Dialog.show()
t = 0
while not Dialog.is_close() and t < 100:
t += 1
xbmc.sleep(100)
if not Dialog.Resume: item_nfo.played_time = 0
else:
item_nfo.played_time = 0
return item, nfo_path, head_nfo, item_nfo
else:
item.nfo = item.strm_path = ""
return item, None, None, None
if played_time:
Dialog = ResumePlayback('ResumePlayback.xml', config.get_runtime_path(), played_time=played_time)
Dialog.show()
t = 0
while not Dialog.is_close() and t < 100:
t += 1
xbmc.sleep(100)
if not Dialog.Resume: played_time = 0
else: played_time = 0
xbmc.sleep(300)
return played_time
##### INPUTSTREM #####
@@ -1396,3 +1379,65 @@ def get_platform():
ret["arch"] = "arm"
return ret
def get_played_time(item):
import sqlite3
from core import filetools
db_name = filetools.join(config.get_data_path(), "kod_db.sqlite")
ID = item.infoLabels['tmdb_id']
conn = sqlite3.connect(db_name, timeout=15)
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS viewed (tmdb_id TEXT, season INT, episode INT, played_time REAL)')
conn.commit()
if ID:
if item.contentType == 'movie': c.execute("SELECT played_time FROM viewed WHERE tmdb_id=?", (ID,))
elif 'season' in item.infoLabels:
S = item.infoLabels['season']
E = item.infoLabels['episode']
c.execute("SELECT played_time FROM viewed WHERE tmdb_id=? AND season=? AND episode=?", (ID, S, E))
elif 'episode' in item.infoLabels:
E = item.infoLabels['episode']
c.execute("SELECT played_time FROM viewed WHERE tmdb_id=? AND episode=?", (ID, E))
result = c.fetchone()
if not result: played_time = 0
else: played_time = result[0]
else: played_time = 0
conn.close()
return played_time
def set_played_time(item):
import sqlite3
from core import filetools
ID = item.infoLabels['tmdb_id']
played_time = item.played_time
db_name = filetools.join(config.get_data_path(), "kod_db.sqlite")
conn = sqlite3.connect(db_name, timeout=15)
c = conn.cursor()
if item.contentType == 'movie':
c.execute("SELECT played_time FROM viewed WHERE tmdb_id=?", (ID,))
result = c.fetchone()
if result:
if played_time > 0: c.execute("UPDATE viewed SET played_time=? WHERE tmdb_id=?", (item.played_time, ID))
else: c.execute("DELETE from viewed WHERE tmdb_id=?", (ID,))
else: c.execute("INSERT INTO viewed (tmdb_id, played_time) VALUES (?, ?)", (ID, item.played_time))
elif 'season' in item.infoLabels:
S = item.infoLabels['season']
E = item.infoLabels['episode']
c.execute("SELECT played_time FROM viewed WHERE tmdb_id=? AND season = ? AND episode=?", (ID, S, E))
result = c.fetchone()
if result:
if played_time > 0: c.execute("UPDATE viewed SET played_time=? WHERE tmdb_id=? AND season=? AND episode=?", (item.played_time, ID, S, E))
else: c.execute("DELETE from viewed WHERE tmdb_id=? AND season=? AND episode=?", (ID, S, E))
else: c.execute("INSERT INTO viewed (tmdb_id, season, episode, played_time) VALUES (?, ?, ?, ?)", (ID, S, E, item.played_time))
elif 'episode' in item.infoLabels:
E = item.infoLabels['episode']
c.execute("SELECT played_time FROM viewed WHERE tmdb_id=? AND episode=?", (ID, E))
result = c.fetchone()
if result:
if played_time > 0: c.execute("UPDATE viewed SET played_time=? WHERE tmdb_id=? AND episode=?", (item.played_time, ID, E))
else: c.execute("DELETE from viewed WHERE tmdb_id=? AND episode=?", (ID, E))
else: c.execute("INSERT INTO viewed (tmdb_id, episode, played_time) VALUES (?, ?, ?)", (ID, E, item.played_time))
conn.commit()
conn.close()

View File

@@ -20,15 +20,19 @@ from core import scrapertools
from xml.dom import minidom
def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
def mark_as_watched_subThread(item, nfo_path, head_nfo, item_nfo):
def mark_auto_as_watched(item):
def mark_as_watched_subThread(item):
logger.debug()
actual_time = 0
total_time = 0
# logger.debug("item:\n" + item.tostring('\n'))
if item.options['continue']: item.played_time = platformtools.resume_playback(platformtools.get_played_time(item))
time_limit = time.time() + 30
while not platformtools.is_playing() and time.time() < time_limit:
time.sleep(1)
marked = False
next_episode = None
show_server = True
@@ -39,14 +43,15 @@ def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
next_dialogs = ['NextDialog.xml', 'NextDialogExtended.xml', 'NextDialogCompact.xml']
next_ep_type = config.get_setting('next_ep_type')
ND = next_dialogs[next_ep_type]
next_episode = next_ep(item)
try: next_episode = next_ep(item)
except: next_episode = False
while platformtools.is_playing():
actual_time = xbmc.Player().getTime()
total_time = xbmc.Player().getTotalTime()
if item_nfo.played_time and xbmcgui.getCurrentWindowId() == 12005:
xbmc.Player().seekTime(item_nfo.played_time)
item_nfo.played_time = 0 # Fix for Slow Devices
if item.played_time and xbmcgui.getCurrentWindowId() == 12005:
xbmc.Player().seekTime(item.played_time)
item.played_time = 0 # Fix for Slow Devices
mark_time = total_time * percentage
difference = total_time - actual_time
@@ -55,7 +60,7 @@ def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
if actual_time > mark_time and not marked:
logger.info("Marked as Watched")
item.playcount = 1
marked = True
if item.options['strm'] : marked = True
show_server = False
from specials import videolibrary
videolibrary.mark_content_as_watched2(item)
@@ -75,9 +80,11 @@ def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
break
xbmc.sleep(1000)
# Set played time
item_nfo.played_time = int(actual_time) if not marked else 0
filetools.write(nfo_path, head_nfo + item_nfo.tojson())
if item.options['continue']:
if 120 < actual_time < (total_time / 100) * 80:
item.played_time = actual_time
else: item.played_time = 0
platformtools.set_played_time(item)
# Silent sync with Trakt
if marked and config.get_setting("trakt_sync"): sync_trakt_kodi()
@@ -94,7 +101,7 @@ def mark_auto_as_watched(item, nfo_path=None, head_nfo=None, item_nfo=None):
# If it is configured to mark as seen
if config.get_setting("mark_as_watched", "videolibrary"):
threading.Thread(target=mark_as_watched_subThread, args=[item, nfo_path, head_nfo, item_nfo]).start()
threading.Thread(target=mark_as_watched_subThread, args=[item]).start()
@@ -1340,12 +1347,11 @@ class NextDialog(xbmcgui.WindowXMLDialog):
f.close()
full_info = "".join(full_info)
info = jsontools.load(full_info)
if "thumbnail" in info:
img = info["thumbnail"]
else:
img = filetools.join(config.get_runtime_path(), "resources", "noimage.png")
self.setProperty("next_img", img)
info = info["infoLabels"]
if "fanart" in info: img = info["fanart"]
elif "thumbnail" in info: img = info["thumbnail"]
else: img = filetools.join(config.get_runtime_path(), "resources", "noimage.png")
self.setProperty("next_img", img)
self.setProperty("title", info["tvshowtitle"])
self.setProperty("ep_title", "%dx%02d - %s" % (info["season"], info["episode"], info["title"]))
@@ -1381,4 +1387,4 @@ class NextDialog(xbmcgui.WindowXMLDialog):
if action in self.action_exitkeys_id:
self.set_exit(True)
self.set_continue_watching(False)
self.close()
self.close()

View File

@@ -13,6 +13,7 @@
<setting id="checkdns" type="bool" default="true" visible="false"/>
<setting label="70788" type="lsep"/>
<setting id="debug" type="bool" label="30003" default="false"/>
<setting id="chrome_ua_version" type="text" default="87.0.4280.88" visible="False"/>
</category>
<!-- Playback -->

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<window>
<depth>0.52</depth>
<zorder>0.52</zorder>
<coordinates>
<left>0</left>
<top>0</top>
@@ -73,7 +73,7 @@
<!-- <font>font30_title</font> -->
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>$INFO[Container(102).ListItem.Label] [B][COLOR FFAAAAAA]$INFO[Container(102).ListItem.Property(year)] [CR]$INFO[Container(101).ListItem.Label][/COLOR][/B]</label>
<label>$INFO[Container(102).ListItem.Label][B][COLOR FFAAAAAA]$INFO[Container(102).ListItem.Property(year)]$INFO[Container(102).ListItem.Property(rating)][CR]$INFO[Container(102).ListItem.Property(channel)][/COLOR][/B]</label>
<align>left</align>
<aligny>center</aligny>
</control>
@@ -117,69 +117,110 @@
<orientation>horizontal</orientation>
<scrolltime tween="cubic" easing="out">300</scrolltime>
<itemlayout height="570" width="180">
<control type="image">
<description>Item Poster</description>
<control type="group">
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture colordiffuse="AAFFFFFF">$INFO[ListItem.Property(thumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
<visible>String.IsEmpty(ListItem.Property(channelthumb))</visible>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture colordiffuse="FF999999">$INFO[ListItem.Property(thumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture>$INFO[ListItem.Property(thumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</control>
<control type="image">
<description>Item Poster</description>
<top>300</top>
<left>0</left>
<width>180</width>
<height>270</height>
<texture>$INFO[ListItem.Property(thumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Verified</description>
<top>315</top>
<left>145</left>
<width>20</width>
<height>20</height>
<texture colordiffuse="FF0082C2">$INFO[ListItem.Property(verified)]</texture>
<aspectratio>scale</aspectratio>
<control type="group">
<top>390</top>
<visible>!String.IsEmpty(ListItem.Property(channelthumb))</visible>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>180</width>
<height>180</height>
<texture colordiffuse="FF999999">$INFO[ListItem.Property(channelthumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>180</width>
<height>180</height>
<texture>$INFO[ListItem.Property(channelthumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</control>
</itemlayout>
<focusedlayout height="570" width="380">
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture colordiffuse="AAFFFFFF">$INFO[ListItem.Property(thumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
<control type="group">
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture colordiffuse="FF999999">$INFO[ListItem.Property(thumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture>$INFO[ListItem.Property(thumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</control>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>380</width>
<height>570</height>
<texture>$INFO[ListItem.Property(thumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Verified</description>
<top>15</top>
<left>330</left>
<width>40</width>
<height>40</height>
<texture colordiffuse="FF0082C2">$INFO[ListItem.Property(verified)]</texture>
<aspectratio>scale</aspectratio>
<control type="group">
<top>420</top>
<left>230</left>
<visible>!String.IsEmpty(ListItem.Property(channelthumb))</visible>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>150</width>
<height>150</height>
<texture colordiffuse="FF999999">$INFO[ListItem.Property(channelthumb)]</texture>
<visible>!Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Item Poster</description>
<top>0</top>
<left>0</left>
<width>150</width>
<height>150</height>
<texture>$INFO[ListItem.Property(channelthumb)]</texture>
<visible>Control.HasFocus(102)</visible>
<bordersize>10</bordersize>
<aspectratio>scale</aspectratio>
</control>
</control>
</focusedlayout>
</control>
@@ -248,10 +289,10 @@
</control>
<control type="textbox">
<description>Results Count</description>
<right>5</right>
<top>5</top>
<width>30</width>
<height>30</height>
<left>110</left>
<top>0</top>
<width>40</width>
<height>40</height>
<!-- <font>font30_title</font> -->
<textcolor>22FFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
@@ -259,15 +300,6 @@
<align>center</align>
<aligny>center</aligny>
</control>
<control type="image">
<description>Verified</description>
<top>5</top>
<left>5</left>
<width>30</width>
<height>30</height>
<texture colordiffuse="880082C2">$INFO[ListItem.Property(verified)]</texture>
<aspectratio>scale</aspectratio>
</control>
</itemlayout>
<focusedlayout height="150" width="150">
<control type="image">
@@ -288,22 +320,12 @@
<texture colordiffuse="880082C2">white.png</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="image">
<description>Results Count</description>
<top>5</top>
<left>5</left>
<width>30</width>
<height>30</height>
<texture colordiffuse="FF0082C2">$INFO[ListItem.Property(verified)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="textbox">
<description>Verified</description>
<right>5</right>
<top>5</top>
<width>30</width>
<height>30</height>
<!-- <font>font30_title</font> -->
<description>Results Count</description>
<left>110</left>
<top>0</top>
<width>40</width>
<height>40</height>
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<label>[B]$INFO[ListItem.Property(results)][/B]</label>
@@ -346,7 +368,7 @@
<control type="list" id="200"> <!-- Episodes List -->
<description>Episodes List</description>
<bottom>40</bottom>
<top>110</top>
<left>520</left>
<width>700</width>
<height>570</height>
@@ -359,7 +381,6 @@
<left>20</left>
<width>660</width>
<height>60</height>
<!-- <font>font30_title</font> -->
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
@@ -370,6 +391,8 @@
<focusedlayout height="60" width="700">
<control type="image">
<description>Selected Background</description>
<top>0</top>
<left>0</left>
<width>700</width>
<height>60</height>
<texture colordiffuse="88000000">white.png</texture>
@@ -380,7 +403,6 @@
<left>20</left>
<width>660</width>
<height>60</height>
<!-- <font>font30_title</font> -->
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
@@ -476,6 +498,20 @@
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<control type="textbox">
<description>No Server Title</description>
<left>150</left>
<top>35</top>
<width>450</width>
<height>60</height>
<!-- <font>font30_title</font> -->
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>$INFO[ListItem.Label]</label>
<visible>!ListItem.Property(servername)</visible>
</control>
</itemlayout>
<focusedlayout height="140" width="700">
<control type="image">
@@ -543,6 +579,20 @@
<aligny>center</aligny>
<label>[B][COLOR FFAAAAAA]$INFO[ListItem.Property(servername)][/COLOR][/B]</label>
</control>
<control type="textbox">
<description>No Server Title</description>
<left>150</left>
<top>35</top>
<width>450</width>
<height>60</height>
<!-- <font>font30_title</font> -->
<textcolor>FFFFFFFF</textcolor>
<shadowcolor>00000000</shadowcolor>
<align>left</align>
<aligny>center</aligny>
<label>$INFO[ListItem.Label]</label>
<visible>!ListItem.Property(servername)</visible>
</control>
</focusedlayout>
</control> <!-- END Servers List -->
</control> <!-- END SERVERS GROUP -->

View File

@@ -25,6 +25,7 @@
<width>326</width>
<height>180</height>
<texture>$INFO[Window.Property(next_img)]</texture>
<aspectratio>scale</aspectratio>
</control>
<control type="grouplist" id="20">
<orientation>vertical</orientation>

View File

@@ -6,26 +6,26 @@
<controls>
<control type="group">
<animation type="WindowOpen" reversible="false">
<effect type="fade" start="0" end="100" time="300" />
<effect type="fade" start="0" end="100" time="100" />
</animation>
<animation type="WindowClose" reversible="false">
<effect type="fade" start="100" end="0" time="300" />
<effect type="fade" start="100" end="0" time="100" />
</animation>
<right>440</right>
<top>320</top>
<right>490</right>
<top>300</top>
<height>40</height>
<width>400</width>
<width>300</width>
<control type="grouplist" id="20">
<orientation>vertical</orientation>
<height>80</height>
<height>120</height>
<itemgap>0</itemgap>
<align>center</align>
<control type="button" id="3012">
<label>$ADDON[plugin.video.kod 30045] $INFO[Window.Property(time)]</label>
<label>[B]$ADDON[plugin.video.kod 30045] $INFO[Window.Property(time)][/B]</label>
<onclick>SendClick(3012)</onclick>
<height>40</height>
<width>400</width>
<font>font30_title</font>
<height>60</height>
<width>300</width>
<!-- <font>font30_title</font> -->
<textoffsetx>20</textoffsetx>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>
@@ -35,10 +35,10 @@
<pulseonselect>no</pulseonselect>
</control>
<control type="button" id="3013">
<label>$ADDON[plugin.video.kod 30046]</label>
<height>40</height>
<width>400</width>
<font>font30_title</font>
<label>[B]$ADDON[plugin.video.kod 30046][/B]</label>
<height>60</height>
<width>300</width>
<!-- <font>font30_title</font> -->
<textoffsetx>20</textoffsetx>
<textcolor>FFFFFFFF</textcolor>
<aligny>center</aligny>

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -22,7 +22,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "$ADDON[plugin.video.kod 60654]",
"label": "$ADDON[plugin.video.kod 70708]",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -50,7 +50,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -14,7 +14,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -20,7 +20,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -24,7 +24,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -31,7 +31,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -25,7 +25,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -37,7 +37,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -20,7 +20,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -36,7 +36,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -19,7 +19,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -1,7 +1,7 @@
{
"active": true,
"find_videos": {
"ignore_urls": [],
"ignore_urls": ["https://embed.mystream.to/span"],
"patterns": [
{
"pattern": "my?stream\\.(?:\\w+\\.)?[^/]+/(?:external|watch/|embed-)?([0-9a-zA-Z_]+)",
@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -36,7 +36,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -26,7 +26,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -22,7 +22,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -26,7 +26,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -20,7 +20,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -14,7 +14,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -62,7 +62,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": false
},

View File

@@ -34,7 +34,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -25,7 +25,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -21,7 +21,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

View File

@@ -17,7 +17,7 @@
"default": false,
"enabled": true,
"id": "black_list",
"label": "@60654",
"label": "@70708",
"type": "bool",
"visible": true
},

Some files were not shown because too many files have changed in this diff Show More