diff --git a/addons.xml b/addons.xml index 15ddbac5..9681082a 100644 --- a/addons.xml +++ b/addons.xml @@ -1,6 +1,6 @@ - + diff --git a/addons.xml.md5 b/addons.xml.md5 index 0756753a..6768f00b 100644 --- a/addons.xml.md5 +++ b/addons.xml.md5 @@ -1 +1 @@ -3aa881372ca99713693d604665c17224 \ No newline at end of file +c877216d79f7c2973414fd7618c5d37a \ No newline at end of file diff --git a/plugin.video.pseudotv.live/addon.xml b/plugin.video.pseudotv.live/addon.xml index e4c648a3..1233fd7d 100644 --- a/plugin.video.pseudotv.live/addon.xml +++ b/plugin.video.pseudotv.live/addon.xml @@ -1,5 +1,5 @@ - + diff --git a/plugin.video.pseudotv.live/resources/language/resource.language.en_gb/strings.po b/plugin.video.pseudotv.live/resources/language/resource.language.en_gb/strings.po index 1bc79509..9e878b17 100644 --- a/plugin.video.pseudotv.live/resources/language/resource.language.en_gb/strings.po +++ b/plugin.video.pseudotv.live/resources/language/resource.language.en_gb/strings.po @@ -561,6 +561,9 @@ msgctxt "#30135" msgid "Include" msgstr "" +msgctxt "#30136" +msgid "Include iSpot Adverts" +msgstr "" diff --git a/plugin.video.pseudotv.live/resources/lib/builder.py b/plugin.video.pseudotv.live/resources/lib/builder.py index a4d817e8..eddb4d73 100644 --- a/plugin.video.pseudotv.live/resources/lib/builder.py +++ b/plugin.video.pseudotv.live/resources/lib/builder.py @@ -63,7 +63,7 @@ def __init__(self, service=None): self.incAdverts = SETTINGS.getSettingInt('Fillers_Commercials') self.srcAdverts = {"resource":SETTINGS.getSetting('Resource_Commericals').split('|'), - "paths":[]} + "paths":[self.getAdvertPath()]} self.incTrailer = SETTINGS.getSettingInt('Fillers_Trailers') self.srcTrailer = {"resource":SETTINGS.getSetting('Resource_Trailers').split('|'), @@ -107,6 +107,7 @@ def verify(self, channels=None): @timeit def build(self): + PROPERTIES.setEXTProperty('PseudoTVRunning','True') channels = sorted(self.verify(self.channels.getChannels()), key=lambda k: k['number']) if not channels: self.log('build, no verified channels found!') @@ -149,6 +150,7 @@ def build(self): self.pDialog = DIALOG.progressBGDialog(100, self.pDialog, message='%s %s'%(self.pMSG,LANGUAGE(32025) if self.completeBuild else LANGUAGE(32135))) self.log('build, completeBuild = %s, saved = %s'%(self.completeBuild,self.saveChannelLineups())) + PROPERTIES.setEXTProperty('PseudoTVRunning','False') return self.completeBuild @@ -497,4 +499,14 @@ def getTrailers(self): def setTrailers(self, nitems={}): items = mergeDictLST(self.getTrailers(),nitems) self.log('setTrailers, trailers: %s'%(len(items))) - self.cache.set('getTrailers', items, expiration=datetime.timedelta(days=28), json_data=True) \ No newline at end of file + self.cache.set('getTrailers', items, expiration=datetime.timedelta(days=28), json_data=True) + + + def getAdvertPath(self): + if bool(self.incAdverts) and SETTINGS.getSettingBool('Include_Adverts'): + if hasAddon('plugin.video.ispot.tv'): + try: folder = os.path.join(xbmcaddon.Addon('plugin.video.ispot.tv').getSetting('Download_Folder'),'') + except: folder = 'special://profile/addon_data/plugin.video.ispot.tv/resources/' + self.log('getAdvertPath, folder: %s'%(folder)) + return folder + return '' \ No newline at end of file diff --git a/plugin.video.pseudotv.live/resources/lib/constants.py b/plugin.video.pseudotv.live/resources/lib/constants.py index 3b1e5630..4499a340 100644 --- a/plugin.video.pseudotv.live/resources/lib/constants.py +++ b/plugin.video.pseudotv.live/resources/lib/constants.py @@ -123,6 +123,8 @@ VIDEO_EXTS = xbmc.getSupportedMedia('video').split('|') MUSIC_EXTS = xbmc.getSupportedMedia('music').split('|') IMAGE_EXTS = xbmc.getSupportedMedia('picture').split('|') +IMG_EXTS = ['.png','.jpg','.gif'] +TEXTURES = 'Textures.xbt' #file paths SETTINGS_FLE = os.path.join(SETTINGS_LOC,'settings.xml') diff --git a/plugin.video.pseudotv.live/resources/lib/fillers.py b/plugin.video.pseudotv.live/resources/lib/fillers.py index a483114b..e0a8f22c 100644 --- a/plugin.video.pseudotv.live/resources/lib/fillers.py +++ b/plugin.video.pseudotv.live/resources/lib/fillers.py @@ -38,6 +38,7 @@ def __init__(self, builder): "adverts" :{"max":builder.incAdverts,"auto":builder.incAdverts == 1,"enabled":bool(builder.incAdverts),"sources":builder.srcAdverts,"items":{}}, "trailers" :{"max":builder.incTrailer,"auto":builder.incTrailer == 1,"enabled":bool(builder.incTrailer),"sources":builder.srcTrailer,"items":{}}} self.fillSources() + print('self.bctTypes',self.bctTypes) @@ -48,38 +49,37 @@ def log(self, msg, level=xbmc.LOGDEBUG): def fillSources(self): if self.bctTypes['trailers'].get('enabled',False) and SETTINGS.getSettingInt('Include_Trailers') < 2: self.bctTypes['trailers']['items'] = mergeDictLST(self.bctTypes['trailers']['items'],self.builder.getTrailers()) - + for ftype, values in list(self.bctTypes.items()): - for id in values.get("sources",{}).get("resource",[]): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,id)) #parse resource packs - for path in values.get("sources",{}).get("paths",[]): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,path)) #parse vfs paths + for id in values.get("sources",{}).get("resource",[]): + if self.bctTypes[ftype].get('enabled',False): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,id)) #parse resource packs + for path in values.get("sources",{}).get("paths",[]): + if self.bctTypes[ftype].get('enabled',False): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,path)) #parse vfs paths - + @cacheit(expiration=datetime.timedelta(minutes=15),json_data=False) def buildSource(self, ftype, path): self.log('buildSource, type = %s, path = %s'%(ftype, path)) def _parseVFS(path): tmpDCT = {} - if not hasAddon(path, install=True): return {} - for url, items in list(self.jsonRPC.walkFileDirectory(path,retItem=True).items()): - for item in items: - for key in (item.get('genre',[]) or ['resources']): tmpDCT.setdefault(key.lower(),[]).append(item) + if hasAddon(path, install=True): + for url, items in list(self.jsonRPC.walkFileDirectory(path,chkDuration=True,retItem=True).items()): + for item in items: + for key in (item.get('genre',[]) or ['resources']): tmpDCT.setdefault(key.lower(),[]).append(item) return tmpDCT def _parseLocal(path): tmpDCT = {} - print('_parseLocal',self.jsonRPC.walkListDirectory(path,appendPath=True)) - # dirs, files = self.jsonRPC.walkListDirectory(path,appendPath=True) - # for idx, dir in enumerate(dirs): - # for file in files[idx] - # tmpDCT.setdefault(os.path.basename(dir).lower(),[]).append([ for file in]) - - - # dur = self.jsonRPC.getDuration(item.get('file'),item, accurate=True) - # tmpDCT.setdefault('resources',[]).append([(item.get('file'),item.get('duration')) for item in items if item.get('duration',0) > 0]) + print('_parseLocal',path,FileAccess.exists(path)) + if FileAccess.exists(path): + for paths, items in list(self.jsonRPC.walkListDirectory(path, exts=VIDEO_EXTS, depth=50, chkDuration=True).items()): + print('_parseLocal',path,items) + for item in items: + for key in (item.get('genre',[]) or ['resources']): tmpDCT.setdefault(key.lower(),[]).append(item) return tmpDCT def _parseResource(path): - if not hasAddon(path, install=True): return {} + if not hasAddon(path, install=True): return [],[] return self.resources.walkResource(path,exts=VIDEO_EXTS) def _sortbyfile(data): @@ -92,18 +92,22 @@ def _sortbyfile(data): def _sortbyfolder(data): tmpDCT = {} + print('_sortbyfolder',data) for path, files in list(data.items()): for file in files: dur = self.jsonRPC.getDuration(os.path.join(path,file), accurate=True) if dur > 0: tmpDCT.setdefault(os.path.basename(path).lower(),[]).append({'file':os.path.join(path,file),'duration':dur,'label':os.path.basename(path)}) return tmpDCT - if path.startswith('plugin://'): return _parseVFS(path) - if ftype == 'ratings': return _sortbyfile(_parseResource(path)) - elif ftype == 'bumpers': return _sortbyfolder(_parseResource(path)) - elif ftype == 'adverts': return _sortbyfolder(_parseResource(path)) - elif ftype == 'trailers': return _sortbyfolder(_parseResource(path)) - else: return {} + if not path: return {} + elif path.startswith('resource.'): + if ftype == 'ratings': return _sortbyfile(_parseResource(path)) + elif ftype == 'bumpers': return _sortbyfolder(_parseResource(path)) + elif ftype == 'adverts': return _sortbyfolder(_parseResource(path)) + elif ftype == 'trailers': return _sortbyfolder(_parseResource(path)) + elif path.startswith('plugin://'): return _parseVFS(path) + elif not path.startswith(tuple(VFS_TYPES)): return _sortbyfolder(_parseLocal(path)) + else: return {} def convertMPAA(self, ompaa): diff --git a/plugin.video.pseudotv.live/resources/lib/globals.py b/plugin.video.pseudotv.live/resources/lib/globals.py index fa71b26d..61e171f9 100644 --- a/plugin.video.pseudotv.live/resources/lib/globals.py +++ b/plugin.video.pseudotv.live/resources/lib/globals.py @@ -493,7 +493,7 @@ def setFirstrun(state=True): return PROPERTIES.setPropertyBool('hasFirstrun',state) def isClient(silent=True): - state = (SETTINGS.getSettingBool('Client_Mode') or False) + state = SETTINGS.getSettingInt('Client_Mode') > 0 PROPERTIES.setEXTProperty('%s.isClient'%(ADDON_ID),str(state).lower()) if state and not silent: DIALOG.notificationWait(LANGUAGE(32115)) return state diff --git a/plugin.video.pseudotv.live/resources/lib/jsonrpc.py b/plugin.video.pseudotv.live/resources/lib/jsonrpc.py index 21fa132c..3450d2dd 100644 --- a/plugin.video.pseudotv.live/resources/lib/jsonrpc.py +++ b/plugin.video.pseudotv.live/resources/lib/jsonrpc.py @@ -91,14 +91,16 @@ def cacheJSON(self, param, life=datetime.timedelta(minutes=15), checksum=ADDON_V return cacheResponse - def walkFileDirectory(self, path, depth=3, chkDuration=True, retItem=False): + def walkFileDirectory(self, path, exts=VIDEO_EXTS, depth=3, chkDuration=False, retItem=False, checksum=ADDON_VERSION, expiration=datetime.timedelta(minutes=15)): + self.log('walkFileDirectory, path = %s, exts = %s'%(path,exts)) walk = dict() dirs = [path] for idx, dir in enumerate(dirs): if MONITOR.waitForAbort(0.001) or idx > depth: break else: - for item in self.getDirectory(param={"directory":dir}, expiration=datetime.timedelta(days=MAX_GUIDEDAYS)).get('files',[]): - if not item.get('file'): continue + self.log('walkFileDirectory, walking %s/%s directory'%(idx,len(dirs))) + for item in self.getDirectory(param={"directory":dir}).get('files',[]): + if not item.get('file') or not item.get('file','').endswith(tuple(exts)): continue elif item.get('filetype') == 'directory': dirs.append(item.get('file')) elif item.get('filetype') == 'file': if chkDuration: @@ -109,29 +111,33 @@ def walkFileDirectory(self, path, depth=3, chkDuration=True, retItem=False): return walk - def walkListDirectory(self, path, depth=3, hasruntime=False, appendPath=False, checksum=ADDON_VERSION, expiration=datetime.timedelta(days=MAX_GUIDEDAYS)): - def chkruntime(file): - return self.getDuration(file) > 0 - - dirs = [path] - files = [] - for idx, dir in enumerate(dirs): + def walkListDirectory(self, path, exts=VIDEO_EXTS, depth=3, chkDuration=False, appendPath=True, checksum=ADDON_VERSION, expiration=datetime.timedelta(minutes=15)): + def _chkfile(path, f): + if appendPath: f = os.path.join(path,f) + if chkDuration: + if self.getDuration(f, accurate=True) == 0: return + return f + + def _parseXBT(): + resource = path.replace('/resources','').replace('special://home/addons/','resource://') + walk.setdefault(resource,[]).extend(self.getListDirectory(resource,checksum,expiration)[1]) + return walk + + self.log('walkListDirectory, path = %s, exts = %s'%(path,exts)) + walk = dict() + path = path.replace('\\','/') + dirs, files = self.getListDirectory(path,checksum,expiration) + if TEXTURES in files: return _parseXBT() + else: walk.setdefault(path,[]).extend(list(filter(None,[_chkfile(path, f) for f in files if f.endswith(tuple(exts))]))) + for idx, dir in enumerate(dirs): if MONITOR.waitForAbort(0.001) or idx > depth: break else: - ndirs, nfiles = self.getListDirectory(dir, checksum, expiration) - if hasruntime: nfiles = [file for file in nfiles if chkruntime(file)] - if appendPath: - dirs.extend([os.path.join(path,dir) for dir in ndirs]) - files.extend([os.path.join(path,fle) for fle in nfiles]) - else: - dirs.extend(ndirs) - files.extend(nfiles) - - self.log('walkListDirectory, return dirs = %s, files = %s\npath = %s'%(len(dirs), len(files),path)) - return dirs, files - + self.log('walkListDirectory, walking %s/%s directory'%(idx,len(dirs))) + walk.update(self.walkListDirectory(os.path.join(path, dir),exts,checksum)) + return walk - def getListDirectory(self, path, checksum=ADDON_VERSION, expiration=datetime.timedelta(days=MAX_GUIDEDAYS)): + + def getListDirectory(self, path, checksum=ADDON_VERSION, expiration=datetime.timedelta(minutes=15)): cacheName = 'getListDirectory.%s'%(getMD5(path)) results = self.cache.get(cacheName, checksum) if not results: @@ -535,11 +541,3 @@ def padItems(self, items, page=SETTINGS.getSettingInt('Page_Limit')): items.append(item) self.log("padItems; items Out = %s"%(len(items))) return items - - - def hasPVRSource(self): - for item in self.getSources(): - if item.get('file','').lower().startswith('pvr://'): - return True - return False - \ No newline at end of file diff --git a/plugin.video.pseudotv.live/resources/lib/kodi.py b/plugin.video.pseudotv.live/resources/lib/kodi.py index 492b5b1e..74dbcbc0 100644 --- a/plugin.video.pseudotv.live/resources/lib/kodi.py +++ b/plugin.video.pseudotv.live/resources/lib/kodi.py @@ -64,10 +64,11 @@ def closeBusyDialog(): @contextmanager def busy_dialog(): - if not isBusyDialog(): Builtin().executebuiltin('ActivateWindow(busydialognocancel)') + # if not isBusyDialog(): Builtin().executebuiltin('ActivateWindow(busydialognocancel)') try: yield finally: #todo debug kodi crashing. - if isBusyDialog(): Builtin().executebuiltin('Dialog.Close(busydialognocancel)') + pass + # if isBusyDialog(): Builtin().executebuiltin('Dialog.Close(busydialognocancel)') @contextmanager def sudo_dialog(msg): diff --git a/plugin.video.pseudotv.live/resources/lib/parsers/MP4Parser.py b/plugin.video.pseudotv.live/resources/lib/parsers/MP4Parser.py index 89b26b7b..42e9d6f3 100644 --- a/plugin.video.pseudotv.live/resources/lib/parsers/MP4Parser.py +++ b/plugin.video.pseudotv.live/resources/lib/parsers/MP4Parser.py @@ -134,4 +134,4 @@ def readBlock(self): except: pass - return box + return box \ No newline at end of file diff --git a/plugin.video.pseudotv.live/resources/lib/plugin.py b/plugin.video.pseudotv.live/resources/lib/plugin.py index 3b0f9279..ff0d21a5 100644 --- a/plugin.video.pseudotv.live/resources/lib/plugin.py +++ b/plugin.video.pseudotv.live/resources/lib/plugin.py @@ -27,9 +27,11 @@ class Plugin: @contextmanager def preparingPlayback(self): if self.playCheck(loadJSON(PROPERTIES.getEXTProperty('%s.lastPlayed.sysInfo'%(ADDON_ID)))): + PROPERTIES.setEXTProperty('PseudoTVRunning','True') self.preparingPlayback = True try: yield finally: + PROPERTIES.setEXTProperty('PseudoTVRunning','False') PROPERTIES.setEXTProperty('%s.lastPlayed.sysInfo'%(ADDON_ID),dumpJSON(self.sysInfo)) self.preparingPlayback = False else: @@ -203,20 +205,6 @@ def matchChannel(self, chname, id, radio=False, isPlaylist=False): self.log('matchChannel, id = %s, chname = %s, radio = %s, isPlaylist = %s'%(id,chname,radio,isPlaylist)) def getCallback(chname, id, radio=False, isPlaylist=False): self.log('getCallback, id = %s, radio = %s, isPlaylist = %s'%(id,radio,isPlaylist)) - def _matchVFS(): - pvrRoot = "pvr://channels/{dir}/".format(dir={True:'radio',False:'tv'}[radio]) - results = jsonRPC.walkListDirectory(pvrRoot,checksum=getInstanceID(),expiration=datetime.timedelta(minutes=OVERLAY_DELAY))[0] - for dir in [ADDON_NAME,'All channels']: #todo "All channels" may not work with non-English translations! - for result in results: - if result.lower().startswith(quoteString(dir.lower())): - self.log('getCallback: _matchVFS, found dir = %s'%(os.path.join(pvrRoot,result))) - response = jsonRPC.walkListDirectory(os.path.join(pvrRoot,result),appendPath=True,checksum=getInstanceID(),expiration=datetime.timedelta(minutes=OVERLAY_DELAY))[1] - for pvr in response: - if pvr.lower().endswith('%s.pvr'%(id)): - self.log('getCallback: _matchVFS, found file = %s'%(pvr)) - return pvr - self.log('getCallback: _matchVFS, no callback found!\nresults = %s'%(results)) - def _matchJSON(): results = jsonRPC.getDirectory(param={"directory":"pvr://channels/{dir}/".format(dir={True:'radio',False:'tv'}[radio])}, cache=True).get('files',[]) for dir in [ADDON_NAME,'All channels']: #todo "All channels" may not work with non-English translations! @@ -232,8 +220,6 @@ def _matchJSON(): if (isPlaylist or radio) and len(self.sysARG) > 2: callback = '%s%s'%(self.sysARG[0],self.sysARG[2]) - elif isLowPower() or not PROPERTIES.getPropertyBool('hasPVRSource'): - callback = _matchVFS() else: callback = _matchJSON() #use faster jsonrpc on high power devices. requires 'pvr://' json whitelisting. if callback is None: return DIALOG.okDialog(LANGUAGE(32133)) @@ -285,10 +271,10 @@ def playCheck(self, oldInfo={}): self.log('playCheck, id = %s\noldInfo = %s'%(oldInfo.get('chid','-1'),oldInfo)) def _chkPath(): if self.sysInfo.get('vid','').startswith(tuple(VFS_TYPES+["special://"])): - if hasAddon(getIDbyPath(self.sysInfo.get('vid','')),install=True,enable=True): return False - elif FileAccess.exists(self.sysInfo.get('vid','')): return False + if hasAddon(getIDbyPath(self.sysInfo.get('vid','')),install=True,enable=True): return True + elif FileAccess.exists(self.sysInfo.get('vid','')): return True self.log('playCheck _chkPath, failed! path (%s) not found.'%(self.sysInfo.get('vid',''))) - return True + return False def _chkGuide(): if (self.sysInfo.get('chid') == self.sysInfo.get('citem',{}).get('id',random.random()) and self.sysInfo.get('title') != self.sysInfo.get('fitem',{}).get('label',self.sysInfo.get('title'))): diff --git a/plugin.video.pseudotv.live/resources/lib/resources.py b/plugin.video.pseudotv.live/resources/lib/resources.py index a2d478a3..dcc2b62e 100644 --- a/plugin.video.pseudotv.live/resources/lib/resources.py +++ b/plugin.video.pseudotv.live/resources/lib/resources.py @@ -21,9 +21,6 @@ from globals import * from functools import reduce -TEXTURES = 'Textures.xbt' -IMG_EXTS = ['.png','.jpg','.gif'] - LOCAL_RESOURCES = [LOGO_LOC, IMAGE_LOC] MUSIC_RESOURCE = ["resource.images.musicgenreicons.text"] GENRE_RESOURCE = ["resource.images.moviegenreicons.transparent"] @@ -93,9 +90,8 @@ def getLogoResources(self, chname, type, select=False): continue else: self.log('getLogoResources, checking %s'%(id)) - paths = self.walkResource(id) - for path in paths: - for image in paths[path]: + for path, images in list(self.walkResource(id).items()): + for image in images: name, ext = os.path.splitext(image) if self.matchName(chname, name, type): self.log('getLogoResources, found %s'%('%s/%s'%(path,image))) @@ -133,32 +129,9 @@ def matchName(self, chname, name, type='Custom'): def walkResource(self, id, exts=IMG_EXTS): #convert path from id to vfs, include version checksum for cache expiration - return self.walkDirectory(os.path.join('special://home/addons/%s'%id,'resources'),exts,checksum=self.jsonRPC.getAddonDetails(id).get('version',ADDON_VERSION)) - - - @cacheit(expiration=datetime.timedelta(days=28),json_data=True) - def walkDirectory(self, path, exts=IMG_EXTS, checksum=ADDON_VERSION): #recursively walk all folders, parse xbt textures. - def _parseXBT(): - self.log('walkDirectory, %s Found'%(TEXTURES)) - resource = path.replace('/resources','').replace('special://home/addons/','resource://') - walk.setdefault(resource,[]).extend(self.jsonRPC.getListDirectory(resource,checksum,datetime.timedelta(days=MAX_GUIDEDAYS))[1]) - return walk - - walk = dict() - path = path.replace('\\','/') - self.log('walkDirectory, path = %s, exts = %s'%(path,exts)) - dirs, files = self.jsonRPC.getListDirectory(path,checksum,datetime.timedelta(days=MAX_GUIDEDAYS)) - if TEXTURES in files: return _parseXBT() - else: walk.setdefault(path,[]).extend(list([f for f in files if f.endswith(tuple(exts))])) - for idx, dir in enumerate(dirs): - if MONITOR.waitForAbort(0.001): - self.log('walkDirectory, waitForAbort') - break - else: - self.log('walkDirectory, walking %s/%s directory'%(idx,len(dirs))) - walk.update(self.walkDirectory(os.path.join(path, dir),exts,checksum)) - return walk - + return self.jsonRPC.walkListDirectory(os.path.join('special://home/addons/%s'%id,'resources'), exts, depth=50, appendPath=False, checksum=self.jsonRPC.getAddonDetails(id).get('version',ADDON_VERSION), expiration=datetime.timedelta(days=MAX_GUIDEDAYS)) + + def buildWebImage(self, image): if image.startswith(('resource://','special://','image://','http://')): return image diff --git a/plugin.video.pseudotv.live/resources/lib/tasks.py b/plugin.video.pseudotv.live/resources/lib/tasks.py index fc841959..49099835 100644 --- a/plugin.video.pseudotv.live/resources/lib/tasks.py +++ b/plugin.video.pseudotv.live/resources/lib/tasks.py @@ -164,8 +164,6 @@ def chkPVRSettings(self): if (self.jsonRPC.getSettingValue('epg.futuredaystodisplay') or 3) != MAX_GUIDEDAYS: SETTINGS.setSettingInt('Max_Days',max) - - PROPERTIES.setPropertyBool('hasPVRSource',self.jsonRPC.hasPVRSource()) except Exception as e: self.log('chkPVRSettings failed! %s'%(e), xbmc.LOGERROR) diff --git a/plugin.video.pseudotv.live/resources/settings.xml b/plugin.video.pseudotv.live/resources/settings.xml index 5660bb60..79380bf0 100644 --- a/plugin.video.pseudotv.live/resources/settings.xml +++ b/plugin.video.pseudotv.live/resources/settings.xml @@ -942,6 +942,22 @@ true + + 1 + false + + + + + System.HasAddon(plugin.video.ispot.tv) + String.Contains(Window(10000).Property(plugin.video.pseudotv.live.isClient),false) + + + + 0 + + + 2 25 diff --git a/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8o.zip b/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8o.zip index dad20444..ce305f15 100644 Binary files a/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8o.zip and b/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8o.zip differ diff --git a/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8p.zip b/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8p.zip new file mode 100644 index 00000000..7176c2c8 Binary files /dev/null and b/zips/plugin.video.pseudotv.live/plugin.video.pseudotv.live-0.4.8p.zip differ