Skip to content

Commit

Permalink
v.0.5.8k
Browse files Browse the repository at this point in the history
  • Loading branch information
Lunatixz committed Jan 27, 2025
1 parent aaa88d1 commit 7bd4898
Show file tree
Hide file tree
Showing 19 changed files with 223 additions and 178 deletions.
2 changes: 1 addition & 1 deletion addons.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addons>
<addon id="plugin.video.pseudotv.live" version="0.5.8j" name="PseudoTV Live" provider-name="Lunatixz">
<addon id="plugin.video.pseudotv.live" version="0.5.8k" name="PseudoTV Live" provider-name="Lunatixz">
<requires>
<import addon="xbmc.python" version="3.0.1"/>
<import addon="pvr.iptvsimple" version="21.8.0"/>
Expand Down
2 changes: 1 addition & 1 deletion addons.xml.md5
Original file line number Diff line number Diff line change
@@ -1 +1 @@
fe4bb4b5d55094c29484c882692ac4fc
27db0c223dcef2a012b13823aba5291f
2 changes: 1 addition & 1 deletion plugin.video.pseudotv.live/addon.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon id="plugin.video.pseudotv.live" version="0.5.8j" name="PseudoTV Live" provider-name="Lunatixz">
<addon id="plugin.video.pseudotv.live" version="0.5.8k" name="PseudoTV Live" provider-name="Lunatixz">
<requires>
<import addon="xbmc.python" version="3.0.1"/>
<import addon="pvr.iptvsimple" version="21.8.0"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1348,7 +1348,7 @@ msgid "Rebuilding Autotuned Channels"
msgstr ""

msgctxt "#32129"
msgid "Error detected! %s is out of sync with Kodi.\nTry clearing Kodi's PVR & LiveTV guide data."
msgid "%s is missing guide data for this channel\nPlease wait for Kodi and %s to finish updating."
msgstr ""

msgctxt "#32130"
Expand Down
16 changes: 8 additions & 8 deletions plugin.video.pseudotv.live/resources/lib/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,19 @@ def __init__(self, service=None):
self.completedBuild = False

self.bctTypes = {"ratings" :{"min":-1, "max":SETTINGS.getSettingInt('Enable_Preroll'), "auto":SETTINGS.getSettingInt('Enable_Preroll') == -1, "enabled":bool(SETTINGS.getSettingInt('Enable_Preroll')), "chance":SETTINGS.getSettingInt('Random_Pre_Chance'),
"sources" :{"ids":SETTINGS.getSetting('Resource_Ratings').split('|'),"paths":[os.path.join(FILLER_LOC,'Ratings' ,'')]},"items":{}},
"sources" :{"ids":SETTINGS.getSetting('Resource_Ratings').split('|'),"paths":[os.path.join(FILLER_LOC,'Ratings' ,'')]},"items":{}},

"bumpers" :{"min":-1, "max":SETTINGS.getSettingInt('Enable_Preroll'), "auto":SETTINGS.getSettingInt('Enable_Preroll') == -1, "enabled":bool(SETTINGS.getSettingInt('Enable_Preroll')), "chance":SETTINGS.getSettingInt('Random_Pre_Chance'),
"sources" :{"ids":SETTINGS.getSetting('Resource_Bumpers').split('|'),"paths":[os.path.join(FILLER_LOC,'Bumpers' ,'')]},"items":{}},
"sources" :{"ids":SETTINGS.getSetting('Resource_Bumpers').split('|'),"paths":[os.path.join(FILLER_LOC,'Bumpers' ,'')]},"items":{}},

"adverts" :{"min":SETTINGS.getSettingInt('Enable_Postroll'), "max":MIN_EPG_DURATION, "auto":SETTINGS.getSettingInt('Enable_Postroll') == -1, "enabled":bool(SETTINGS.getSettingInt('Enable_Postroll')), "chance":SETTINGS.getSettingInt('Random_Post_Chance'),
"sources" :{"ids":SETTINGS.getSetting('Resource_Adverts').split('|'),"paths":[os.path.join(FILLER_LOC,'Adverts' ,'')]},"items":{},
"incIspot":SETTINGS.getSettingBool('Include_Adverts_iSpot')},
"sources" :{"ids":SETTINGS.getSetting('Resource_Adverts').split('|'),"paths":[os.path.join(FILLER_LOC,'Adverts' ,'')]},"items":{},
"incIspot":SETTINGS.getSettingBool('Include_Adverts_iSpot')},

"trailers":{"min":SETTINGS.getSettingInt('Enable_Postroll'), "max":MIN_EPG_DURATION, "auto":SETTINGS.getSettingInt('Enable_Postroll') == -1, "enabled":bool(SETTINGS.getSettingInt('Enable_Postroll')), "chance":SETTINGS.getSettingInt('Random_Post_Chance'),
"sources" :{"ids":SETTINGS.getSetting('Resource_Trailers').split('|'),"paths":[os.path.join(FILLER_LOC,'Trailers','')]},"items":{},
"incKODI":SETTINGS.getSettingBool('Include_Trailers_KODI'),
"incIMDB":SETTINGS.getSettingBool('Include_Trailers_IMDB')}}
"sources" :{"ids":SETTINGS.getSetting('Resource_Trailers').split('|'),"paths":[os.path.join(FILLER_LOC,'Trailers','')]},"items":{},
"incKODI":SETTINGS.getSettingBool('Include_Trailers_KODI'),
"incIMDB":SETTINGS.getSettingBool('Include_Trailers_IMDB')}}

self.xsp = XSP()
self.xmltv = XMLTVS()
Expand All @@ -114,7 +114,7 @@ def verify(self, channels=None):
self.log('verify, [%s] SKIPPING - missing necessary channel meta\n%s'%(citem.get('id'),citem))
continue
citem['name'] = validString(citem['name']) #todo temp. correct existing file names; drop by v.0.6
citem['logo'] = self.resources.getLogo(citem['name'],citem['type'],logo=Seasonal().getHoliday().get('logo') if citem['name'] == LANGUAGE(32002) else None)
citem['logo'] = self.resources.getLogo(citem,logo=Seasonal().getHoliday().get('logo') if citem['name'] == LANGUAGE(32002) else None)
self.log('verify, [%s] VERIFIED - channel %s: %s'%(citem['id'],citem['number'],citem['name']))
yield self.runActions(RULES_ACTION_CHANNEL_CITEM, citem, citem, inherited=self)

Expand Down
4 changes: 3 additions & 1 deletion plugin.video.pseudotv.live/resources/lib/default.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ def run(sysARG, fitem: dict={}, nitem: dict={}):

if PROPERTIES.isRunning('togglePVR'): DIALOG.notificationDialog(LANGUAGE(32000))
elif mode == 'live':
if params.get('start') == '{utc}':DIALOG.okDialog(LANGUAGE(32129)%(PVR_CLIENT_NAME))
if params.get('start') == '{utc}':
DIALOG.okDialog(LANGUAGE(32129)%(PVR_CLIENT_NAME,ADDON_NAME))
BUILTIN.closeBusyDialog()
elif params['isPlaylist']: threadit(Plugin(sysARG, sysInfo=params).playPlaylist)(params["name"],params["chid"])
elif params['vid'] : threadit(Plugin(sysARG, sysInfo=params).playLive)(params["name"],params["chid"],params["vid"])
else: threadit(Plugin(sysARG, sysInfo=params).playTV)(params["name"],params["chid"])
Expand Down
4 changes: 2 additions & 2 deletions plugin.video.pseudotv.live/resources/lib/fillers.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ def fillSources(self):
if self.builder.bctTypes.get(ftype,{}).get("incIspot",False): self.builder.bctTypes.get(ftype,{}).get("sources",{}).get("paths",[]).append(self.getAdvertPath())
if self.builder.bctTypes.get(ftype,{}).get('incIMDB',False): self.builder.bctTypes.get(ftype,{}).get("sources",{}).get("paths",[]).extend(IMDB_PATHS)
if self.builder.bctTypes.get(ftype,{}).get('incKODI',False): self.builder.bctTypes.get(ftype,{})["items"] = mergeDictLST(self.builder.bctTypes.get(ftype,{}).get("items",[]), self.builder.kodiTrailers())
for id in values["sources"].get("ids",[]): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,id)) #parse resource packs
for path in values["sources"].get("paths",[]): values['items'] = mergeDictLST(values['items'],self.buildSource(ftype,path)) #parse vfs paths
for id in values["sources"].get("ids",[]): values['items'] = mergeDictLST(values.get('items',{}),self.buildSource(ftype,id)) #parse resource packs
for path in values["sources"].get("paths",[]): values['items'] = mergeDictLST(values.get('items',{}),self.buildSource(ftype,path)) #parse vfs paths
values['items'] = lstSetDictLst(values['items'])


Expand Down
68 changes: 60 additions & 8 deletions plugin.video.pseudotv.live/resources/lib/kodi.py
Original file line number Diff line number Diff line change
Expand Up @@ -443,8 +443,60 @@ def __getMeta(payload):
payload['updated'] = datetime.datetime.fromtimestamp(time.time()).strftime(DTFORMAT)
payload['md5'] = getMD5(dumpJSON(payload))
return payload
# todo add "Valid","Passed","Failed" entries for m3u,xmltv instead of detailed listings.
# @cacheit(expiration=datetime.timedelta(minutes=5), json_data=True)
# def getPayload(self, inclDebug: bool=False):
# self.log("getPayload, inclDebug! %s"%(inclDebug))
# def __getM3U():
# from m3u import M3U
# m3u = M3U()
# stations = m3u.getStations()
# recordings = m3u.getRecordings()
# del m3u
# return stations, recordings

# def __getXMLTV():
# from xmltvs import XMLTVS
# xmltv = XMLTVS()
# stations = xmltv.getChannels()
# recordings = xmltv.getRecordings()
# del xmltv
# return stations, recordings


# def __getMeta(payload):
# from library import Library
# from multiroom import Multiroom

# payload.pop('updated')
# payload.pop('md5')

# now = getUTCstamp()
# stop = datetime.datetime.fromtimestamp(roundTimeDown(now,offset=60)).strftime(DTFORMAT)

# payload['now'] = datetime.datetime.fromtimestamp(now).strftime(DTFORMAT)
# payload['m3u'] = dict(poolit(__chkM3U, *(stop,M3U().getM3U())))
# print('payload[m3u]'payload['m3u'])



# return '[%s] - %s'%(station.get('id'),station.get('name')), {True:'[COLOR=green][B]PASSED[/B][/COLOR]',False:'[COLOR=red][B]Failed![/B][/COLOR]'}[not station.get('id') is None]



# # payload['xmltv'] = {'stations' :[{'id':station.get('id'),'display-name':station.get('display-name',[['','']])[0][0],'icon':station.get('icon',[{'src':LOGO}])[0].get('src',LOGO)} for station in stations],
# # 'recordings':[{'id':recording.get('id'),'display-name':recording.get('display-name',[['','']])[0][0],'icon':recording.get('icon',[{'src':LOGO}])[0].get('src',LOGO)} for recording in recordings],
# # 'programmes':[{'id':key,'end-time':datetime.datetime.fromtimestamp(time.time()).strftime(DTFORMAT)} for key, value in list(dict(xmltv.loadStopTimes()).items())]}
# payload['library'] = Library().getLibrary()
# payload['servers'] = Multiroom().getDiscovery()
# return payload

# payload = __getMeta(self.getBonjour(inclChannels=True))
# if inclDebug: payload['debug'] = loadJSON(self.property.getEXTProperty('%s.debug.log'%(ADDON_ID))).get('DEBUG',{})
# payload['updated'] = datetime.datetime.fromtimestamp(time.time()).strftime(DTFORMAT)
# payload['md5'] = getMD5(dumpJSON(payload))
# return payload


@cacheit(expiration=datetime.timedelta(minutes=5))
def getPayloadUI(self):
return Json2Html().convert(self.getPayload(inclDebug=True))
Expand Down Expand Up @@ -1181,24 +1233,24 @@ def log(self, msg, level=xbmc.LOGDEBUG):
log('%s: %s'%(self.__class__.__name__,msg),level)


def toggleInfoMonitor(self, state, wait=0.1):
def toggleInfoMonitor(self, state, wait=0.5):
self.log('toggleInfoMonitor, state = %s'%(state))
if self.properties.setPropertyBool('chkInfoMonitor',state):
self.properties.setPropertyBool('chkInfoMonitor',state)
if state:
self.properties.clrProperty('monitor.montiorList')
timerit(self.doInfoMonitor)(0.5)
timerit(self.doInfoMonitor)(wait)


def doInfoMonitor(self):
def doInfoMonitor(self, wait=0.5):
monitor = MONITOR()
while not monitor.abortRequested():
if not self.fillInfoMonitor() or monitor.waitForAbort(0.1): break
if not self.fillInfoMonitor() or monitor.waitForAbort(wait): break
del monitor


def fillInfoMonitor(self, type='ListItem'):
#todo catch full listitem not singular properties.
try:
if not self.properties.getPropertyBool('chkInfoMonitor'): return False
item = {'label' :self.builtin.getInfoLabel('Label' ,type),
'label2' :self.builtin.getInfoLabel('Label2' ,type),
'set' :self.builtin.getInfoLabel('Set' ,type),
Expand All @@ -1221,7 +1273,7 @@ def fillInfoMonitor(self, type='ListItem'):
montiorList = self.getInfoMonitor()
if item.get('label') not in montiorList: montiorList.insert(0,item)
self.setInfoMonitor(montiorList)
return True
return self.properties.getPropertyBool('chkInfoMonitor')
except Exception as e:
self.log("fillInfoMonitor, failed! %s"%(e), xbmc.LOGERROR)
return False
Expand Down
18 changes: 9 additions & 9 deletions plugin.video.pseudotv.live/resources/lib/library.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,8 @@ def getMixedGenres(self):

def getMixed(self):
MixedList = []
MixedList.append({'name':LANGUAGE(32001), 'type':"Mixed",'path':self.predefined.createMixedRecent() ,'logo':self.resources.getLogo(LANGUAGE(32001),"Mixed")}) #"Recently Added"
MixedList.append({'name':LANGUAGE(32002), 'type':"Mixed",'path':self.predefined.createSeasonal() ,'logo':self.resources.getLogo(LANGUAGE(32002),"Mixed"),'rules':{"800":{"values":{"0":LANGUAGE(32002)}}}}) #"Seasonal"
MixedList.append({'name':LANGUAGE(32001), 'type':"Mixed",'path':self.predefined.createMixedRecent() ,'logo':self.resources.getLogo({'name':LANGUAGE(32001),'type':"Mixed"})}) #"Recently Added"
MixedList.append({'name':LANGUAGE(32002), 'type':"Mixed",'path':self.predefined.createSeasonal() ,'logo':self.resources.getLogo({'name':LANGUAGE(32002),'type':"Mixed"}),'rules':{"800":{"values":{"0":LANGUAGE(32002)}}}}) #"Seasonal"
MixedList.extend(self.getPVRRecordings())#"PVR Recordings"
MixedList.extend(self.getPVRSearches()) #"PVR Searches"
self.log('getMixed, mixed = %s' % (len(MixedList)))
Expand All @@ -218,7 +218,7 @@ def getPVRRecordings(self):
recordList = []
json_response = self.jsonRPC.getPVRRecordings()
paths = [item.get('file') for idx, item in enumerate(json_response) if item.get('label','').endswith('(%s)'%(ADDON_NAME))]
if len(paths) > 0: recordList.append({'name':LANGUAGE(32003),'type':"Mixed",'path':[paths],'logo':self.resources.getLogo(LANGUAGE(32003),"Mixed")})
if len(paths) > 0: recordList.append({'name':LANGUAGE(32003),'type':"Mixed",'path':[paths],'logo':self.resources.getLogo({'name':LANGUAGE(32003),'type':"Mixed"})})
self.log('getPVRRecordings, recordings = %s' % (len(recordList)))
return sorted(recordList,key=itemgetter('name'))

Expand All @@ -228,7 +228,7 @@ def getPVRSearches(self):
json_response = self.jsonRPC.getPVRSearches()
for idx, item in enumerate(json_response):
if not item.get('file'): continue
searchList.append({'name':"%s (%s)"%(item.get('label',LANGUAGE(32241)),LANGUAGE(32241)),'type':"Mixed",'path':[item.get('file')],'logo':self.resources.getLogo(item.get('label',LANGUAGE(32241)),"Mixed")})
searchList.append({'name':"%s (%s)"%(item.get('label',LANGUAGE(32241)),LANGUAGE(32241)),'type':"Mixed",'path':[item.get('file')],'logo':self.resources.getLogo({'name':item.get('label',LANGUAGE(32241)),'type':"Mixed"})})
self.log('getPVRSearches, searches = %s' % (len(searchList)))
return sorted(searchList,key=itemgetter('name'))

Expand Down Expand Up @@ -284,13 +284,13 @@ def getTVInfo(self, sortbycount=True):
nNetworkList = []
for network in NetworkList:
rules = {"800":{"values":{"0":network}}}
nNetworkList.append({'name':network, 'type':"TV Networks", 'path': self.predefined.createNetworkPlaylist(network),'logo':self.resources.getLogo(network,"TV Networks"),'rules':rules})
nNetworkList.append({'name':network, 'type':"TV Networks", 'path': self.predefined.createNetworkPlaylist(network),'logo':self.resources.getLogo({'name':network,'type':"TV Networks"}),'rules':rules})
NetworkList = nNetworkList

nShowGenreList = []
for tvgenre in ShowGenreList:
rules = {"800":{"values":{"0":tvgenre}}}
nShowGenreList.append({'name':tvgenre, 'type':"TV Genres" , 'path': self.predefined.createTVGenrePlaylist(tvgenre),'logo':self.resources.getLogo(tvgenre,"TV Genres"),'rules':rules})
nShowGenreList.append({'name':tvgenre, 'type':"TV Genres" , 'path': self.predefined.createTVGenrePlaylist(tvgenre),'logo':self.resources.getLogo({'name':tvgenre,'type':"TV Genres"}),'rules':rules})
ShowGenreList = nShowGenreList

else: NetworkList = ShowGenreList = TVShows = []
Expand Down Expand Up @@ -321,8 +321,8 @@ def getMovieInfo(self, sortbycount=True):
MovieGenreList = (sorted(set(list(MovieGenreList.keys()))))

#search resources for studio/genre logos
StudioList = [{'name':studio, 'type':"Movie Studios", 'path': self.predefined.createStudioPlaylist(studio) ,'logo':self.resources.getLogo(studio,"Movie Studios"),'rules':{"800":{"values":{"0":studio}}}} for studio in StudioList]
MovieGenreList = [{'name':genre, 'type':"Movie Genres" , 'path': self.predefined.createMovieGenrePlaylist(genre) ,'logo':self.resources.getLogo(genre ,"Movie Genres") ,'rules':{"800":{"values":{"0":genre}}}} for genre in MovieGenreList]
StudioList = [{'name':studio, 'type':"Movie Studios", 'path': self.predefined.createStudioPlaylist(studio) ,'logo':self.resources.getLogo({'name':studio,'type':"Movie Studios"}),'rules':{"800":{"values":{"0":studio}}}} for studio in StudioList]
MovieGenreList = [{'name':genre, 'type':"Movie Genres" , 'path': self.predefined.createMovieGenrePlaylist(genre) ,'logo':self.resources.getLogo({'name':genre,'type':"Movie Genres"}) ,'rules':{"800":{"values":{"0":genre}}}} for genre in MovieGenreList]

else: StudioList = MovieGenreList = []
self.log('getMovieInfo, studios = %s, genres = %s' % (len(StudioList), len(MovieGenreList)))
Expand All @@ -349,7 +349,7 @@ def getMusicInfo(self, sortbycount=True):
MusicGenreList = (sorted(set(list(MusicGenreList.keys()))))

#search resources for studio/genre logos
MusicGenreList = [{'name':genre, 'type':"Music Genres", 'path': self.predefined.createMusicGenrePlaylist(genre),'logo':self.resources.getLogo(genre,"Music Genres")} for genre in MusicGenreList]
MusicGenreList = [{'name':genre, 'type':"Music Genres", 'path': self.predefined.createMusicGenrePlaylist(genre),'logo':self.resources.getLogo({'name':genre,'type':"Music Genres"})} for genre in MusicGenreList]

else: MusicGenreList = []
self.log('getMusicInfo, found genres = %s' % (len(MusicGenreList)))
Expand Down
Loading

0 comments on commit 7bd4898

Please sign in to comment.