def __init__(self): if not (isKrypton() == True): self.__sDisplayName = '(Windows\Android Nécessite Kodi17)' + ' ' + 'Vidlox' else: self.__sDisplayName = 'Vidlox' self.__sFileName = self.__sDisplayName self.__sHD = ''
def addHost(self, oGuiElement, oOutputParameterHandler=''): if isKrypton(): cGui.CONTENT = 'movies' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'true') oListItem.setProperty('Video', 'true') oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) # sPluginHandle = cPluginHandler().getPluginHandle() # modif 13/09 #xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=False) self.listing.append((sItemUrl, oListItem, False))
def __init__(self): if not (isKrypton() == True): self.__sDisplayName = '(Windows\Android Nécessite Kodi17)' + ' Vidlox' else: self.__sDisplayName = 'Vidlox' self.__sFileName = self.__sDisplayName self.__sHD = ''
def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) #oGuiElement.setDirFanart(sIcon) oOutputParameterHandler.addParameter('sFav', sFunction) # context parametre if isKrypton(): self.createContexMenuSettings(oGuiElement, oOutputParameterHandler) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass
def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler = ''): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) #oGuiElement.setDirFanart(sIcon) oOutputParameterHandler.addParameter('sFav', sFunction) #context parametre if isKrypton(): self.createContexMenuSettings(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler)
def addHost(self, oGuiElement, oOutputParameterHandler=''): if isKrypton(): cGui.CONTENT = 'movies' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) oListItem = self.createListItem(oGuiElement) oListItem.setProperty("IsPlayable", "true") oListItem.setProperty("Video", "true") oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) sPluginHandle = cPluginHandler().getPluginHandle() #modif 13/09 #xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=False) self.listing.append((sItemUrl, oListItem, False))
class cGui: SITE_NAME = 'cGui' CONTENT = 'files' searchResults = [] listing = [] ADDON = addon() if isKrypton(): CONTENT = 'addons' def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(1) oGuiElement.setDescription(sDesc) # oGuiElement.setMovieFanart() oGuiElement.setCat(1) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass # Coffret et integrale de films def addMoviePack(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(3) oGuiElement.setDescription(sDesc) # oGuiElement.setMovieFanart() oGuiElement.setCat(1) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addTV(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): cGui.CONTENT = 'tvshows' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(2) oGuiElement.setDescription(sDesc) # oGuiElement.setTvFanart() oGuiElement.setCat(2) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addAnime(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): cGui.CONTENT = 'tvshows' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(4) # Recherche des Métas spécifiques Animation oGuiElement.setDescription(sDesc) # oGuiElement.setTvFanart() oGuiElement.setCat(2) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass # Affichage d'un épisode, sans recherche de Métadonnées, et menu adapté def addEpisode(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # comportement proche de addMisc self.addMisc(sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, sCat=2) cGui.CONTENT = 'files' # Affichage d'une personne (acteur, réalisateur, ..) def addPerson(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(7) # oGuiElement.setCat(7) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass # Affichage d'un réseau de distribution du média def addNetwork(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): cGui.CONTENT = 'files' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(8) # oGuiElement.setCat(7) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass # Meme mode d'affichage qu'un film, avec la description si fournie, mais il n'y a pas de recherche des Métadonnées def addMisc(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler='', sCat=5): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setDescription(sDesc) # oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(0) # oGuiElement.setDirFanart(sIcon) oGuiElement.setCat(sCat) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) # self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler=''): cGui.CONTENT = 'files' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) # oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setDescription(sDesc) oGuiElement.setMeta(0) # oGuiElement.setDirFanart('') oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) # oGuiElement.setDirFanart(sIcon) oOutputParameterHandler.addParameter('sFav', sFunction) # context parametre # if isKrypton(): # self.createContexMenuSettings(oGuiElement, oOutputParameterHandler) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addNext(self, sId, sFunction, sLabel, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon('next.png') oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) # oGuiElement.setDirFanart('next.png') oGuiElement.setCat(5) self.createContexMenuPageSelect(oGuiElement, oOutputParameterHandler) self.createContexMenuViewBack(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) # utiliser oGui.addText(SITE_IDENTIFIER) def addNone(self, sId): return self.addText(sId) def addText(self, sId, sLabel='', sIcon='none.png'): # Pas de texte lors des recherches globales if window(10101).getProperty('search') == 'true': return oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction('DoNothing') if not sLabel: sLabel = self.ADDON.VSlang(30204) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oOutputParameterHandler = cOutputParameterHandler() self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser depuis le 22/04 def addMovieDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(1) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser 22/04 def addTVDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'tvshows' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # afficher les liens non playable def addFolder(self, oGuiElement, oOutputParameterHandler = '', _isFolder=True): # recherche append les reponses if window(10101).getProperty('search') == 'true': import copy cGui.searchResults.append({'guiElement': oGuiElement, 'params': copy.deepcopy(oOutputParameterHandler)}) return # Des infos a rajouter ? params = { 'siteUrl': oGuiElement.setSiteUrl, # indispensable 'sTmdbId': oGuiElement.setTmdbId, 'sImbdId': oGuiElement.setImdbId, # inutile ? 'sYear': oGuiElement.setYear, } try: for sParam, callback in params.iteritems(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) except AttributeError: for sParam, callback in params.items(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'false') # affiche tag HD # if '1080' in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', {'aspect': '1.78', 'width': 1920, 'height': 1080}) # elif '720' in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', {'aspect': '1.50', 'width': 1280, 'height': 720}) # elif '2160'in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', {'aspect': '1.78', 'width': 3840, 'height': 2160}) # oListItem.addStreamInfo('audio', {'language': 'fr'}) # if oGuiElement.getMeta(): # oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) if oGuiElement.getCat(): oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) # new context prend en charge les metas if oGuiElement.getMeta() in (1, 2, 3, 4): # Films, Séries, Saga, Animes if cGui.CONTENT in ('movies', 'tvshows'): self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('bstoken') != '': self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('tmdb_account') != '': self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) # sPluginHandle = cPluginHandler().getPluginHandle() # xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=_isFolder) self.listing.append((sItemUrl, oListItem, _isFolder)) # affiche les liens playable def addHost(self, oGuiElement, oOutputParameterHandler=''): cGui.CONTENT = 'files' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'true') oListItem.setProperty('Video', 'true') oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) # sPluginHandle = cPluginHandler().getPluginHandle() # xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=False) self.listing.append((sItemUrl, oListItem, False)) def createListItem(self, oGuiElement): oListItem = listitem(oGuiElement.getTitle()) # voir : https://kodi.wiki/view/InfoLabels oListItem.setInfo(oGuiElement.getType(), oGuiElement.getItemValues()) # oListItem.setThumbnailImage(oGuiElement.getThumbnail()) # oListItem.setIconImage(oGuiElement.getIcon()) oListItem.setArt({'poster': oGuiElement.getPoster(), 'thumb': oGuiElement.getThumbnail(), 'icon': oGuiElement.getIcon(), 'fanart': oGuiElement.getFanart()}) aProperties = oGuiElement.getItemProperties() for sPropertyKey, sPropertyValue in aProperties.items(): oListItem.setProperty(sPropertyKey, str(sPropertyValue)) return oListItem # Marquer vu/Non vu def createContexMenuWatch(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'setWatched', self.ADDON.VSlang(30206)) def createContexMenuPageSelect(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('selectPage') oContext.setTitle(self.ADDON.VSlang(30017)) oOutputParameterHandler.addParameter('OldFunction', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuViewBack(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('viewBack') oContext.setTitle(self.ADDON.VSlang(30018)) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # marque page def createContexMenuBookmark(self, oGuiElement, oOutputParameterHandler = ''): oOutputParameterHandler.addParameter('sCleanTitle', oGuiElement.getCleanTitle()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sFav', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'setBookmark', self.ADDON.VSlang(30210)) def createContexMenuTrakt(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) sType = cGui.CONTENT.replace('tvshows', 'shows') oOutputParameterHandler.addParameter('sType', sType) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', self.ADDON.VSlang(30214)) def createContexMenuTMDB(self, oGuiElement, oOutputParameterHandler = ''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'themoviedb_org', 'themoviedb_org', 'getAction', 'TMDB') def createContexMenuDownload(self, oGuiElement, oOutputParameterHandler='', status='0'): if status == '0': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StartDownloadOneFile', self.ADDON.VSlang(30215)) if status == '0' or status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'delDownload', self.ADDON.VSlang(30216)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'DelFile', self.ADDON.VSlang(30217)) if status == '1': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StopDownloadList', self.ADDON.VSlang(30218)) if status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ReadDownload', self.ADDON.VSlang(30219)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ResetDownload', self.ADDON.VSlang(30220)) # Information def createContexMenuinfo(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewInfo', self.ADDON.VSlang(30208)) # Bande annonce def createContexMenuba(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) oOutputParameterHandler.addParameter('sTrailerUrl', oGuiElement.getTrailer()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewBA', self.ADDON.VSlang(30212)) # Recherche similaire def createContexMenuSimil(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewSimil', self.ADDON.VSlang(30213)) def CreateSimpleMenu(self, oGuiElement, oOutputParameterHandler, sFile, sName, sFunction, sTitle): oContext = cContextElement() oContext.setFile(sFile) oContext.setSiteName(sName) oContext.setFunction(sFunction) oContext.setTitle(sTitle) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuDelFav(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'delBookmarksMenu', self.ADDON.VSlang(30209)) def createContexMenuSettings(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'globalParametre', 'globalParametre', 'opensetting', self.ADDON.VSlang(30023)) def __createContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] # Menus classiques reglés a la base if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus, True) return oListItem def __ContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem def __ContextMenuPlay(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() # cree une id unique # if oGuiElement.getSiteUrl(): # print(str(hash(oGuiElement.getSiteUrl()))) sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % (sPluginPath, oGuiElement.getSiteName(), QuotePlus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % (sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), QuotePlus(oGuiElement.getCleanTitle()), sParams) return sItemUrl def setEndOfDirectory(self, ForceViewMode=False): iHandler = cPluginHandler().getPluginHandle() # modif 22/06 if not self.listing: self.addText('cGui') xbmcplugin.addDirectoryItems(iHandler, self.listing, len(self.listing)) xbmcplugin.setPluginCategory(iHandler, '') xbmcplugin.setContent(iHandler, cGui.CONTENT) xbmcplugin.addSortMethod(iHandler, xbmcplugin.SORT_METHOD_NONE) xbmcplugin.endOfDirectory(iHandler, succeeded=True, cacheToDisc=True) # reglage vue # 50 = liste / 51 grande liste / 500 icone / 501 gallerie / 508 fanart / if ForceViewMode: xbmc.executebuiltin('Container.SetViewMode(' + str(ForceViewMode) + ')') else: if self.ADDON.getSetting('active-view') == 'true': if cGui.CONTENT == 'movies': # xbmc.executebuiltin('Container.SetViewMode(507)') xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('movie-view')) elif cGui.CONTENT == 'tvshows': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('serie-view')) elif cGui.CONTENT == 'files': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('default-view')) # bug affichage Kodi 18 del self.listing[:] def updateDirectory(self): # refresh the content xbmc.executebuiltin('Container.Refresh') def viewBA(self): oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') sYear = oInputParameterHandler.getValue('sYear') sTrailerUrl = oInputParameterHandler.getValue('sTrailerUrl') sMeta = oInputParameterHandler.getValue('sMeta') from resources.lib.ba import cShowBA cBA = cShowBA() cBA.SetSearch(sFileName) cBA.SetYear(sYear) cBA.SetTrailerUrl(sTrailerUrl) cBA.SetMetaType(sMeta) cBA.SearchBA() def viewBack(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sTest = '%s?site=%s' % (sPluginPath, sId) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def viewInfo(self): from resources.lib.config import WindowsBoxes oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue('sFileName') if oInputParameterHandler.exist('sFileName') else xbmc.getInfoLabel('ListItem.Property(sCleanTitle)') sMeta = oInputParameterHandler.getValue('sMeta') if oInputParameterHandler.exist('sMeta') else xbmc.getInfoLabel('ListItem.Property(sMeta)') sYear = oInputParameterHandler.getValue('sYear') if oInputParameterHandler.exist('sYear') else xbmc.getInfoLabel('ListItem.Year') WindowsBoxes(sCleanTitle, sCleanTitle, sMeta, sYear) def viewSimil(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue('sFileName') if oInputParameterHandler.exist('sFileName') else xbmc.getInfoLabel('ListItem.Property(sCleanTitle)') sCat = oInputParameterHandler.getValue('sCat') if oInputParameterHandler.exist('sCat') else xbmc.getInfoLabel('ListItem.Property(sCat)') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('searchtext', sCleanTitle) oOutputParameterHandler.addParameter('sCat', sCat) oOutputParameterHandler.addParameter('readdb', 'False') sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, 'globalSearch', 'globalSearch', sParams) # Si lancé depuis la page Home de Kodi, il faut d'abord en sortir pour lancer la recherche if xbmc.getCondVisibility('Window.IsVisible(home)'): xbmc.executebuiltin('ActivateWindow(%d)' % (10028)) xbmc.executebuiltin('Container.Update(%s)' % sTest) return False def selectPage(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') oParser = cParser() oldNum = oParser.getNumberFromString(siteUrl) newNum = 0 if oldNum: newNum = self.showNumBoard() if newNum: try: siteUrl = siteUrl.replace(oldNum, newNum) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s)' % sTest) except: return False return False def selectPage2(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') selpage = self.showNumBoard() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('Selpage', selpage) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def setWatched(self): if True: # Use matrix database oInputParameterHandler = cInputParameterHandler() sSite = oInputParameterHandler.getValue('siteUrl') sTitle = oInputParameterHandler.getValue('sTitleWatched') if not sTitle: return meta = {} meta['title'] = sTitle meta['site'] = sSite db = cDb() row = db.get_watched(meta) if row: db.del_watched(meta) db.del_resume(meta) else: db.insert_watched(meta) # To test # xbmc.executebuiltin('Container.Refresh') else: # Use kodi buildin feature xbmc.executebuiltin('Action(ToggleWatched)') # Not usefull ? # xbmc.executebuiltin('Container.Refresh') def showKeyBoard(self, sDefaultText='', heading=''): keyboard = xbmc.Keyboard(sDefaultText) keyboard.setHeading(heading) keyboard.doModal() if (keyboard.isConfirmed()): sSearchText = keyboard.getText() if (len(sSearchText)) > 0: return sSearchText return False def showNumBoard(self, sDefaultNum=''): dialogs = dialog() numboard = dialogs.numeric(0, self.ADDON.VSlang(30019), sDefaultNum) # numboard.doModal() if numboard != None: return numboard return False def openSettings(self): return False def showNofication(self, sTitle, iSeconds=0): return False def showError(self, sTitle, sDescription, iSeconds=0): return False def showInfo(self, sTitle, sDescription, iSeconds=0): return False
def showHoster(self, oGui, oHoster, sMediaUrl, sThumbnail, bGetRedirectUrl=False): oInputParameterHandler = cInputParameterHandler() sMovieTitle = oInputParameterHandler.getValue('title') oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) #oGuiElement.setFunction('showHosterMenu') oGuiElement.setFunction('play') oGuiElement.setTitle(oHoster.getDisplayName()) #oGuiElement.setThumbnail(sThumbnail) # if (oInputParameterHandler.exist('sMeta')): # sMeta = oInputParameterHandler.getValue('sMeta') # oGuiElement.setMeta(int(sMeta)) oGuiElement.setFileName(oHoster.getFileName()) oGuiElement.getInfoLabel() if sThumbnail: oGuiElement.setThumbnail(sThumbnail) #oGuiElement.setMeta(1) oGuiElement.setIcon('host.png') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sMediaUrl', sMediaUrl) #oOutputParameterHandler.addParameter('sThumbnail', oGuiElement.getThumbnail()) oOutputParameterHandler.addParameter('sHosterIdentifier', oHoster.getPluginIdentifier()) oOutputParameterHandler.addParameter('bGetRedirectUrl', bGetRedirectUrl) oOutputParameterHandler.addParameter('sFileName', oHoster.getFileName()) oOutputParameterHandler.addParameter('sTitle', oHoster.getDisplayName()) oOutputParameterHandler.addParameter('sId', 'cHosterGui') oOutputParameterHandler.addParameter('siteUrl', sMediaUrl) #oOutputParameterHandler.addParameter('sFav', 'play') #oOutputParameterHandler.addParameter('sCat', '4') #nouveaux pour la lecture. if (oInputParameterHandler.exist('sCat')): sCat = oInputParameterHandler.getValue('sCat') oGuiElement.setCat(sCat) oOutputParameterHandler.addParameter('sCat', sCat) else: oGuiElement.setCat('4') #existe dans le menu krypton 17 if not isKrypton(): oGui.createContexMenuWatch(oGuiElement, oOutputParameterHandler) #context playlit menu oContext = cContextElement() oContext.setFile('cHosterGui') oContext.setSiteName(self.SITE_NAME) oContext.setFunction('addToPlaylist') oContext.setTitle(self.ADDON.VSlang(30201)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) #Download menu if (oHoster.isDownloadable() == True): oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadList') oContext.setTitle(self.ADDON.VSlang(30202)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) if (oHoster.isDownloadable() == True): #Beta context download and view menu oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadListandview') oContext.setTitle(self.ADDON.VSlang(30326)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) #Upload menu if cInputParameterHandler().getValue( 'site') != 'siteuptobox' and self.ADDON.getSetting( 'hoster_uptobox_premium') == 'true': host = oHoster.getPluginIdentifier() accept = [ 'uptobox', 'uptostream', 'onefichier', 'uploaded', 'uplea' ] for i in accept: if host == i: oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'siteuptobox', 'siteuptobox', 'UptomyAccount', self.ADDON.VSlang(30325)) #context FAV menu oGui.createContexMenuFav(oGuiElement, oOutputParameterHandler) #context Library menu oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cLibrary', 'cLibrary', 'setLibrary', self.ADDON.VSlang(30324)) #bug oGui.addHost(oGuiElement, oOutputParameterHandler)
def run(self, oGuiElement, sTitle, sUrl): self.totalTime = 0 self.currentTime = 0 sPluginHandle = cPluginHandler().getPluginHandle() oGui = cGui() item = oGui.createListItem(oGuiElement) item.setPath(oGuiElement.getMediaUrl()) #meta = {'label': oGuiElement.getTitle(), 'title': oGuiElement.getTitle()} #item = xbmcgui.ListItem(path=sUrl, iconImage='DefaultVideo.png', thumbnailImage=self.sThumbnail) #item.setInfo(type='Video', infoLabels=meta) #Sous titres if (self.Subtitles_file): try: item.setSubtitles(self.Subtitles_file) VSlog('Load SubTitle :' + str(self.Subtitles_file)) self.SubtitleActive = True except: VSlog("Can't load subtitle:" + str(self.Subtitles_file)) player_conf = self.ADDON.getSetting('playerPlay') #Si lien dash, methode prioritaire if sUrl.endswith('.mpd'): if isKrypton() == True: self.enable_addon('inputstream.adaptive') item.setProperty('inputstreamaddon', 'inputstream.adaptive') item.setProperty('inputstream.adaptive.manifest_type', 'mpd') xbmcplugin.setResolvedUrl(sPluginHandle, True, listitem=item) VSlog('Player use inputstream addon') else: dialog().VSerror('Nécessite kodi 17 minimum') return #1 er mode de lecture elif (player_conf == '0'): self.play(sUrl, item) VSlog('Player use Play() method') #2 eme mode non utilise elif (player_conf == 'neverused'): xbmc.executebuiltin('PlayMedia(' + sUrl + ')') VSlog('Player use PlayMedia() method') #3 eme mode (defaut) else: xbmcplugin.setResolvedUrl(sPluginHandle, True, item) VSlog('Player use setResolvedUrl() method') #Attend que le lecteur demarre, avec un max de 20s if xbmc.getInfoLabel('system.buildversion')[0:2] >= '19': for _ in range(20): if self.playBackEventReceived: break xbmc.sleep(1000) else: for _ in xrange(20): if self.playBackEventReceived: break xbmc.sleep(1000) #active/desactive les sous titres suivant l'option choisie dans la config if (self.SubtitleActive): if (self.ADDON.getSetting('srt-view') == 'true'): self.showSubtitles(True) dialog().VSinfo('Sous-titres chargés', 'Sous-Titres', 5) else: self.showSubtitles(False) dialog().VSinfo('Sous-titres chargés, vous pouvez les activer', 'Sous-Titres', 15) while self.isPlaying() and not self.forcestop: #while not xbmc.abortRequested: try: self.currentTime = self.getTime() self.totalTime = self.getTotalTime() #xbmc.log(str(self.currentTime)) except: pass #break xbmc.sleep(1000) if not self.playBackStoppedEventReceived: self.onPlayBackStopped() #Uniquement avec la lecture avec play() if (player_conf == '0'): r = xbmcplugin.addDirectoryItem(handle=sPluginHandle, url=sUrl, listitem=item, isFolder=False) #xbmcplugin.endOfDirectory(sPluginHandle, True, False, False) return r VSlog('Closing player')
def showHoster(self, oGui, oHoster, sMediaUrl, sThumbnail, bGetRedirectUrl = False): oInputParameterHandler = cInputParameterHandler() sMovieTitle = oInputParameterHandler.getValue('title') oGuiElement = cGuiElement() oGuiElement.setSiteName(self.SITE_NAME) #oGuiElement.setFunction('showHosterMenu') oGuiElement.setFunction('play') oGuiElement.setTitle(oHoster.getDisplayName()) #oGuiElement.setThumbnail(sThumbnail) # if (oInputParameterHandler.exist('sMeta')): # sMeta = oInputParameterHandler.getValue('sMeta') # oGuiElement.setMeta(int(sMeta)) oGuiElement.setFileName(oHoster.getFileName()) oGuiElement.getInfoLabel() if sThumbnail: oGuiElement.setThumbnail(sThumbnail) #oGuiElement.setMeta(1) oGuiElement.setIcon('host.png') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sMediaUrl', sMediaUrl) #oOutputParameterHandler.addParameter('sThumbnail', oGuiElement.getThumbnail()) oOutputParameterHandler.addParameter('sHosterIdentifier', oHoster.getPluginIdentifier()) oOutputParameterHandler.addParameter('bGetRedirectUrl', bGetRedirectUrl) oOutputParameterHandler.addParameter('sFileName', oHoster.getFileName()) oOutputParameterHandler.addParameter('sTitle', oHoster.getDisplayName()) oOutputParameterHandler.addParameter('sId', 'cHosterGui') oOutputParameterHandler.addParameter('siteUrl', sMediaUrl) #oOutputParameterHandler.addParameter('sFav', 'play') #oOutputParameterHandler.addParameter('sCat', '4') #nouveaux pour la lecture. if (oInputParameterHandler.exist('sCat')): sCat = oInputParameterHandler.getValue('sCat') oGuiElement.setCat(sCat) oOutputParameterHandler.addParameter('sCat', sCat) else: oGuiElement.setCat('4') #existe dans le menu krypton 17 if not isKrypton(): oGui.createContexMenuWatch(oGuiElement, oOutputParameterHandler) #context playlit menu oContext = cContextElement() oContext.setFile('cHosterGui') oContext.setSiteName(self.SITE_NAME) oContext.setFunction('addToPlaylist') oContext.setTitle(self.ADDON.VSlang(30201)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) #Download menu if (oHoster.isDownloadable() == True): oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadList') oContext.setTitle(self.ADDON.VSlang(30202)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) if (oHoster.isDownloadable() == True): #Beta context download and view menu oContext = cContextElement() oContext.setFile('cDownload') oContext.setSiteName('cDownload') oContext.setFunction('AddtoDownloadListandview') oContext.setTitle(self.ADDON.VSlang(30326)) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) #Upload menu uptobox if cInputParameterHandler().getValue('site') != 'siteuptobox' and self.ADDON.getSetting('hoster_uptobox_premium') == 'true' : host = oHoster.getPluginIdentifier() accept = ['uptobox','uptostream','onefichier','uploaded','uplea'] for i in accept: if host == i : oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'siteuptobox', 'siteuptobox', 'UptomyAccount', self.ADDON.VSlang(30325)) #onefichier if cInputParameterHandler().getValue('site') != 'siteonefichier' and self.ADDON.getSetting('hoster_onefichier_premium') == 'true' : host = oHoster.getPluginIdentifier() accept = 'onefichier' #les autres ne fonctionnent pas if host == accept : oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'siteonefichier', 'siteonefichier', 'UptomyAccount', '1fichier') #context FAV menu oGui.createContexMenuFav(oGuiElement, oOutputParameterHandler) #context Library menu oGui.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cLibrary', 'cLibrary', 'setLibrary', self.ADDON.VSlang(30324)) #bug oGui.addHost(oGuiElement, oOutputParameterHandler)
def run(self, oGuiElement, sTitle, sUrl): # Lancement d'une vidéo sans avoir arreté la précedente self.tvShowTitle = oGuiElement.getItemValue('tvshowtitle') if self.isPlaying(): self.multi = True self._setWatched() # la vidéo en cours doit être marquée comme VUE self.totalTime = 0 self.currentTime = 0 sPluginHandle = cPluginHandler().getPluginHandle() oGui = cGui() item = oGui.createListItem(oGuiElement) item.setPath(oGuiElement.getMediaUrl()) #Sous titres if (self.Subtitles_file): try: item.setSubtitles(self.Subtitles_file) VSlog('Load SubTitle :' + str(self.Subtitles_file)) self.SubtitleActive = True except: VSlog("Can't load subtitle:" + str(self.Subtitles_file)) player_conf = self.ADDON.getSetting('playerPlay') #Si lien dash, methode prioritaire if splitext(urlparse(sUrl).path)[-1] in [".mpd",".m3u8"]: if isKrypton() == True: addonManager().enableAddon('inputstream.adaptive') item.setProperty('inputstream','inputstream.adaptive') if '.m3u8' in sUrl: item.setProperty('inputstream.adaptive.manifest_type', 'hls') else: item.setProperty('inputstream.adaptive.manifest_type', 'mpd') xbmcplugin.setResolvedUrl(sPluginHandle, True, listitem=item) VSlog('Player use inputstream addon') else: dialog().VSerror('Nécessite kodi 17 minimum') return #1 er mode de lecture elif (player_conf == '0'): self.play(sUrl,item) VSlog('Player use Play() method') #2 eme mode non utilise elif (player_conf == 'neverused'): xbmc.executebuiltin('PlayMedia(' + sUrl + ')') VSlog('Player use PlayMedia() method') #3 eme mode (defaut) else: xbmcplugin.setResolvedUrl(sPluginHandle, True, item) VSlog('Player use setResolvedUrl() method') #Attend que le lecteur demarre, avec un max de 20s for _ in range(20): if self.playBackEventReceived: break xbmc.sleep(1000) #active/desactive les sous titres suivant l'option choisie dans la config if self.getAvailableSubtitleStreams(): if (self.ADDON.getSetting('srt-view') == 'true'): self.showSubtitles(True) else: self.showSubtitles(False) dialog().VSinfo('Des sous-titres sont disponibles', 'Sous-Titres', 4) waitingNext = 0 while self.isPlaying() and not self.forcestop: try: self.currentTime = self.getTime() waitingNext += 1 if waitingNext == 8: # attendre un peu avant de chercher le prochain épisode d'une série self.totalTime = self.getTotalTime() self.infotag = self.getVideoInfoTag() UpNext().nextEpisode(oGuiElement) except Exception as err: VSlog("Exception run: {0}".format(err)) xbmc.sleep(1000) if not self.playBackStoppedEventReceived: self.onPlayBackStopped() #Uniquement avec la lecture avec play() if (player_conf == '0'): r = xbmcplugin.addDirectoryItem(handle=sPluginHandle, url=sUrl, listitem=item, isFolder=False) return r VSlog('Closing player') return True
def run(self, oGuiElement, sTitle, sUrl): self.totalTime = 0 self.currentTime = 0 sPluginHandle = cPluginHandler().getPluginHandle() oGui = cGui() item = oGui.createListItem(oGuiElement) item.setPath(oGuiElement.getMediaUrl()) #meta = {'label': oGuiElement.getTitle(), 'title': oGuiElement.getTitle()} #item = xbmcgui.ListItem(path=sUrl, iconImage="DefaultVideo.png", thumbnailImage=self.sThumbnail) #item.setInfo( type="Video", infoLabels= meta ) #Sous titres if (self.Subtitles_file): try: item.setSubtitles(self.Subtitles_file) VSlog("Load SubTitle :" + str(self.Subtitles_file)) self.SubtitleActive = True except: VSlog("Can't load subtitle :" + str(self.Subtitles_file)) player_conf = self.ADDON.getSetting("playerPlay") #Si lien dash, methode prioritaire if sUrl.endswith('.mpd'): if isKrypton() == True: self.enable_addon("inputstream.adaptive") item.setProperty('inputstreamaddon','inputstream.adaptive') item.setProperty('inputstream.adaptive.manifest_type', 'mpd') xbmcplugin.setResolvedUrl(sPluginHandle, True, listitem=item) VSlog('Player use inputstream addon') else: dialog().VSerror('Nécessite kodi 17 minimum') return #1 er mode de lecture elif (player_conf == '0'): self.play(sUrl,item) VSlog('Player use Play() method') #2 eme mode non utilise elif (player_conf == 'neverused'): xbmc.executebuiltin( "PlayMedia("+sUrl+")" ) VSlog('Player use PlayMedia() method') #3 eme mode (defaut) else: xbmcplugin.setResolvedUrl(sPluginHandle, True, item) VSlog('Player use setResolvedUrl() method') #Attend que le lecteur demarre, avec un max de 20s for _ in xrange(20): if self.playBackEventReceived: break xbmc.sleep(1000) #active/desactive les sous titres suivant l'option choisie dans la config if (self.SubtitleActive): if (self.ADDON.getSetting("srt-view") == 'true'): self.showSubtitles(True) self.DIALOG.VSinfo("Sous titre charges", "Sous-Titres", 5) else: self.showSubtitles(False) self.DIALOG.VSinfo("Sous titre charges, Vous pouvez les activer", "Sous-Titres", 15) while self.isPlaying() and not self.forcestop: #while not xbmc.abortRequested: try: self.currentTime = self.getTime() self.totalTime = self.getTotalTime() #xbmc.log(str(self.currentTime)) except: pass #break xbmc.sleep(1000) if not self.playBackStoppedEventReceived: self.onPlayBackStopped() #Uniquement avec la lecture avec play() if (player_conf == '0'): r = xbmcplugin.addDirectoryItem(handle=sPluginHandle,url=sUrl,listitem=item,isFolder=False) #xbmcplugin.endOfDirectory(sPluginHandle, True, False, False) return r VSlog('Closing player')
class cGui(): SITE_NAME = 'cGui' CONTENT = 'files' searchResults = [] #modif 22/06 listing = [] ADDON = addon() if isKrypton(): CONTENT = 'addons' def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler = ''): cGui.CONTENT = "movies" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(1) oGuiElement.setDescription(sDesc) #oGuiElement.setMovieFanart() oGuiElement.setCat(1) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) def addTV(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler = ''): cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(2) oGuiElement.setDescription(sDesc) #oGuiElement.setTvFanart() oGuiElement.setCat(2) # if oOutputParameterHandler.getValue('season'): # sSeason = oOutputParameterHandler.getValue('season') # oGuiElement.addItemValues('Season', sSeason) # if oOutputParameterHandler.getValue('episode'): # sSeason = oOutputParameterHandler.getValue('episode') # oGuiElement.addItemValues('Episode', sSeason) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) def addMisc(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler = ''): cGui.CONTENT = "movies" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) #oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(0) #oGuiElement.setDirFanart(sIcon) oGuiElement.setCat(5) oGuiElement.setDescription(sDesc) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) #self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuFav(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) #non utiliser le 18/04 #def addFav(self, sId, sFunction, sLabel, sIcon, sThumbnail, fanart, oOutputParameterHandler = ''): #cGui.CONTENT = "files" #oGuiElement = cGuiElement() #oGuiElement.setSiteName(sId) #oGuiElement.setFunction(sFunction) #oGuiElement.setTitle(sLabel) #oGuiElement.setIcon(sIcon) #oGuiElement.setMeta(0) #oGuiElement.setThumbnail(sThumbnail) #oGuiElement.setFanart(fanart) #self.createContexMenuDelFav(oGuiElement, oOutputParameterHandler) #self.addFolder(oGuiElement, oOutputParameterHandler) def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler = ''): cGui.CONTENT = "files" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) #oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setDescription(sDesc) oGuiElement.setMeta(0) #oGuiElement.setDirFanart('') oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) self.addFolder(oGuiElement, oOutputParameterHandler) def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler = ''): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) #oGuiElement.setDirFanart(sIcon) oOutputParameterHandler.addParameter('sFav', sFunction) #context parametre if isKrypton(): self.createContexMenuSettings(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) def addNext(self, sId, sFunction, sLabel, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon('next.png') oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) #oGuiElement.setDirFanart('next.png') oGuiElement.setCat(5) self.createContexMenuPageSelect(oGuiElement, oOutputParameterHandler) self.createContexMenuFav(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) #utiliser oGui.addText(SITE_IDENTIFIER) def addNone(self, sId): return self.addText(sId) def addText(self, sId, sLabel="", sIcon='none.png'): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction('DoNothing') if not sLabel: sLabel = self.ADDON.VSlang(30204) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oOutputParameterHandler = cOutputParameterHandler() self.addFolder(oGuiElement, oOutputParameterHandler) #non utiliser depuis le 22/04 def addMovieDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler = ''): cGui.CONTENT = "movies" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(1) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) #non utiliser 22/04 def addTVDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler = ''): cGui.CONTENT = "tvshows" oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) #afficher les liens non playable def addFolder(self, oGuiElement, oOutputParameterHandler='', _isFolder=True): #recherche append les reponses if window(10101).getProperty('search') == 'true': import copy cGui.searchResults.append({'guiElement':oGuiElement, 'params':copy.deepcopy(oOutputParameterHandler)}) return #Des infos a rajouter ? params = { "siteUrl": oGuiElement.setSiteUrl,#indispensable "sTmdbId": oGuiElement.setTmdbId, "sImbdId": oGuiElement.setImdbId,#inutile ? "sYear": oGuiElement.setYear, } for sParam, callback in params.iteritems(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) oListItem = self.createListItem(oGuiElement) oListItem.setProperty("IsPlayable", "false") #affiche tag HD # if '1080' in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', { 'aspect': '1.78', 'width':1920, 'height' : 1080 }) # elif '720' in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', { 'aspect': '1.50', 'width':1280, 'height' : 720 }) # elif '2160'in oGuiElement.getTitle(): # oListItem.addStreamInfo('video', { 'aspect': '1.78', 'width':3840, 'height' : 2160 }) #oListItem.addStreamInfo('audio', {'language': 'fr'}) # if oGuiElement.getMeta(): #oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) if oGuiElement.getCat(): oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) #new context prend en charge les metas if (oGuiElement.getMeta() > 0): if cGui.CONTENT == "movies": self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuFav(oGuiElement, oOutputParameterHandler) self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) elif cGui.CONTENT == "tvshows": self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuFav(oGuiElement, oOutputParameterHandler) self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) sPluginHandle = cPluginHandler().getPluginHandle() #modif 22/06 #xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=_isFolder) self.listing.append((sItemUrl, oListItem, _isFolder)) def createListItem(self, oGuiElement): oListItem = listitem(oGuiElement.getTitle()) oListItem.setInfo(oGuiElement.getType(), oGuiElement.getItemValues()) #oListItem.setThumbnailImage(oGuiElement.getThumbnail()) #oListItem.setIconImage(oGuiElement.getIcon()) #krypton et sont comportement oListItem.setArt({'poster': oGuiElement.getPoster(), 'thumb': oGuiElement.getThumbnail(), 'icon': oGuiElement.getIcon(), 'fanart': oGuiElement.getFanart() }) aProperties = oGuiElement.getItemProperties() for sPropertyKey in aProperties.keys(): oListItem.setProperty(sPropertyKey, aProperties[sPropertyKey]) return oListItem #affiche les liens playable def addHost(self, oGuiElement, oOutputParameterHandler=''): if isKrypton(): cGui.CONTENT = 'movies' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) oListItem = self.createListItem(oGuiElement) oListItem.setProperty("IsPlayable", "true") oListItem.setProperty("Video", "true") oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) sPluginHandle = cPluginHandler().getPluginHandle() #modif 13/09 #xbmcplugin.addDirectoryItem(sPluginHandle, sItemUrl, oListItem, isFolder=False) self.listing.append((sItemUrl, oListItem, False)) #Marquer vu/Non vu def createContexMenuWatch(self, oGuiElement, oOutputParameterHandler= ''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'setWatched', self.ADDON.VSlang(30206)) def createContexMenuPageSelect(self, oGuiElement, oOutputParameterHandler): #sSiteUrl = oGuiElement.getSiteName() oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('selectpage') oContext.setTitle('[COLOR azure]Selectionner page[/COLOR]') oOutputParameterHandler.addParameter('OldFunction', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('viewback') oContext.setTitle('[COLOR azure]Retour Site[/COLOR]') oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) #marque page def createContexMenuFav(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sFav', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'setFavorite', self.ADDON.VSlang(30207)) def createContexMenuTrakt(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) sType = cGui.CONTENT.replace('tvshows', 'shows') oOutputParameterHandler.addParameter('sType', sType) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', self.ADDON.VSlang(30214)) def createContexMenuTMDB(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'themoviedb_org', 'themoviedb_org', 'getAction', 'TMDB') def createContexMenuDownload(self, oGuiElement, oOutputParameterHandler= '', status = '0'): if status == '0': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StartDownloadOneFile', self.ADDON.VSlang(30215)) if status == '0' or status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'delDownload', self.ADDON.VSlang(30216)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'DelFile', self.ADDON.VSlang(30217)) if status == '1': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StopDownloadList', self.ADDON.VSlang(30218)) if status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ReadDownload', self.ADDON.VSlang(30219)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ResetDownload', self.ADDON.VSlang(30220)) #Information def createContexMenuinfo(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewinfo', self.ADDON.VSlang(30208)) def createContexMenuba(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewBA', self.ADDON.VSlang(30212)) def createContexMenuSimil(self, oGuiElement, oOutputParameterHandler= ''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewsimil', self.ADDON.VSlang(30213)) def CreateSimpleMenu(self,oGuiElement, oOutputParameterHandler, file, name, function, title): oContext = cContextElement() oContext.setFile(file) oContext.setSiteName(name) oContext.setFunction(function) oContext.setTitle(title) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuDelFav(self, oGuiElement, oOutputParameterHandler= ''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'delFavouritesMenu', self.ADDON.VSlang(30209)) def createContexMenuSettings(self, oGuiElement, oOutputParameterHandler= ''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'globalParametre', 'globalParametre', 'opensetting', self.ADDON.VSlang(30023)) def __createContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] #Menus classiques reglés a la base if (len(oGuiElement.getContextItems()) > 0): for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus+= [ ( oContextItem.getTitle(), "XBMC.RunPlugin(%s)" % (sTest,),)] oListItem.addContextMenuItems(aContextMenus, True) return oListItem def __ContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if (len(oGuiElement.getContextItems()) > 0): for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus+= [ ( oContextItem.getTitle(), "XBMC.RunPlugin(%s)" % (sTest,),)] oListItem.addContextMenuItems(aContextMenus) #oListItem.addContextMenuItems(aContextMenus, True) return oListItem def __ContextMenuPlay(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if (len(oGuiElement.getContextItems()) > 0): for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus+= [ ( oContextItem.getTitle(), "XBMC.RunPlugin(%s)" % (sTest,),)] oListItem.addContextMenuItems(aContextMenus) #oListItem.addContextMenuItems(aContextMenus, True) return oListItem def setEndOfDirectory(self, ForceViewMode = False): iHandler = cPluginHandler().getPluginHandle() #modif 22/06 if not self.listing: self.addText('cGui') xbmcplugin.addDirectoryItems(iHandler, self.listing, len(self.listing)) xbmcplugin.setPluginCategory(iHandler, "") xbmcplugin.setContent(iHandler, cGui.CONTENT) xbmcplugin.addSortMethod(iHandler, xbmcplugin.SORT_METHOD_NONE) xbmcplugin.endOfDirectory(iHandler, succeeded=True, cacheToDisc=True) #reglage vue #50 = liste / 51 grande liste / 500 icone / 501 gallerie / 508 fanart / if (ForceViewMode): xbmc.executebuiltin('Container.SetViewMode(' + str(ForceViewMode) + ')') else: if (self.ADDON.getSetting('active-view') == 'true'): if cGui.CONTENT == "movies": #xbmc.executebuiltin('Container.SetViewMode(507)') xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('movie-view')) elif cGui.CONTENT == "tvshows": xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('serie-view')) elif cGui.CONTENT == "files": xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('default-view')) #bug affichage Kodi 18 del self.listing [:] def updateDirectory(self): xbmc.executebuiltin("Container.Refresh") def viewback(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sTest = '%s?site=%s' % (sPluginPath, sId) xbmc.executebuiltin('XBMC.Container.Update(%s, replace)' % sTest ) def viewsimil(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') sTitle = oInputParameterHandler.getValue('sTitle') sCat = oInputParameterHandler.getValue('sCat') oOutputParameterHandler = cOutputParameterHandler() #oOutputParameterHandler.addParameter('searchtext', sFileName) oOutputParameterHandler.addParameter('searchtext', util.cUtil().CleanName(sTitle)) oOutputParameterHandler.addParameter('sCat', sCat) oOutputParameterHandler.addParameter('readdb', 'False') sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, 'globalSearch', 'globalSearch', sParams) xbmc.executebuiltin('XBMC.Container.Update(%s)' % sTest ) return False def selectpage(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() #sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') oParser = cParser() oldNum = oParser.getNumberFromString(siteUrl) newNum = 0 if oldNum: newNum = self.showNumBoard() if newNum: try: siteUrl = siteUrl.replace(oldNum, newNum) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('XBMC.Container.Update(%s)' % sTest ) except: return False return False def selectpage2(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') siteUrl = oInputParameterHandler.getValue('siteUrl') sFunction = oInputParameterHandler.getValue('OldFunction') selpage = self.showNumBoard() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('Selpage', selpage) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('XBMC.Container.Update(%s, replace)' % sTest ) def setWatched(self): oInputParameterHandler = cInputParameterHandler() aParams = oInputParameterHandler.getAllParameter() # import xbmc # xbmc.log(str(aParams)) sSite = oInputParameterHandler.getValue('siteUrl') sTitle = xbmc.getInfoLabel('ListItem.label') meta = {} meta['title'] = sTitle meta['site'] = sSite row = cDb().get_watched(meta) if row: cDb().del_watched(meta) cDb().del_resume(meta) else: cDb().insert_watched(meta) xbmc.executebuiltin( 'Container.Refresh' ) def viewBA(self): oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') from resources.lib.ba import cShowBA cBA = cShowBA() cBA.SetSearch(sFileName) cBA.SearchBA() def viewinfo(self): from resources.lib.config import WindowsBoxes oGuiElement = cGuiElement() oInputParameterHandler = cInputParameterHandler() sTitle = oInputParameterHandler.getValue('sTitle') sId = oInputParameterHandler.getValue('sId') sFileName = oInputParameterHandler.getValue('sFileName') sYear = oInputParameterHandler.getValue('sYear') sMeta = oInputParameterHandler.getValue('sMeta') #sMeta = 1 >> film sMeta = 2 >> serie sCleanTitle = util.cUtil().CleanName(sFileName) #on vire saison et episode if (True):#sMeta == 2: sCleanTitle = re.sub('(?i).pisode [0-9]+', '', sCleanTitle) sCleanTitle = re.sub('(?i)saison [0-9]+', '', sCleanTitle) sCleanTitle = re.sub('(?i)S[0-9]+E[0-9]+', '', sCleanTitle) sCleanTitle = re.sub('(?i)[S|E][0-9]+', '', sCleanTitle) ui = WindowsBoxes(sTitle, sCleanTitle, sMeta, sYear) def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() #cree une id unique # if oGuiElement.getSiteUrl(): # print str(hash(oGuiElement.getSiteUrl())) sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % (sPluginPath, oGuiElement.getSiteName(), urllib.quote_plus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % (sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), urllib.quote_plus(oGuiElement.getCleanTitle()), sParams) #print sItemUrl return sItemUrl def showKeyBoard(self, sDefaultText='', heading = ''): keyboard = xbmc.Keyboard(sDefaultText) keyboard.setHeading(heading) keyboard.doModal() if (keyboard.isConfirmed()): sSearchText = keyboard.getText() if (len(sSearchText)) > 0: return sSearchText return False def showNumBoard(self, sDefaultNum=''): dialogs = dialog() numboard = dialogs.numeric(0, 'Entrer la page', sDefaultNum) #numboard.doModal() if numboard != None: return numboard return False def openSettings(self): return False def showNofication(self, sTitle, iSeconds=0): return False def showError(self, sTitle, sDescription, iSeconds=0): return False def showInfo(self, sTitle, sDescription, iSeconds=0): return False
class cGui: SITE_NAME = 'cGui' CONTENT = 'files' searchResults = [] listing = [] ADDON = addon() if isKrypton(): CONTENT = 'addons' def addNewDir(self, Type, sId, sFunction, sLabel, sIcon, sThumbnail='', sDesc='', oOutputParameterHandler='', sMeta=0, sCat=None): oGuiElement = cGuiElement() # dir ou link => CONTENT par défaut = files if Type != 'dir' and Type != 'link': cGui.CONTENT = Type oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) if sThumbnail == '': oGuiElement.setThumbnail(oGuiElement.getIcon()) else: oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setMeta(sMeta) oGuiElement.setDescription(sDesc) if sCat is not None: oGuiElement.setCat(sCat) # Pour addLink on recupere le sCat precedent. elif Type == 'link': oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) oOutputParameterHandler.addParameter('sFav', sFunction) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) try: self.addFolder(oGuiElement, oOutputParameterHandler) except: pass def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 1, 1) def addTV(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 2, 2) def addAnime(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 4, 2) def addMisc(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): if sThumbnail or sDesc: type = 'videos' else: type = 'files' self.addNewDir(type, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, 5) def addMoviePack(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 3, 1) def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler='', sDesc=""): self.addNewDir('dir', sId, sFunction, sLabel, sIcon, '', sDesc, oOutputParameterHandler, 0, None) def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler=''): sIcon = sThumbnail self.addNewDir('link', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, None) # Affichage d'un épisode, sans recherche de Métadonnées, et menu adapté def addEpisode(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): self.addNewDir('episodes', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, 2) # Affichage d'une personne (acteur, réalisateur, ..) def addPerson(self, sId, sFunction, sLabel, sIcon, sThumbnail, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' self.addNewDir('artists', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 7, None) # Affichage d'un réseau de distribution du média def addNetwork(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' self.addNewDir('files', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 8, None) def addNext(self, sId, sFunction, sLabel, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle('[COLOR teal]' + sLabel + ' >>>[/COLOR]') oGuiElement.setIcon('next.png') oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oGuiElement.setCat(5) self.createContexMenuPageSelect(oGuiElement, oOutputParameterHandler) self.createContexMenuViewBack(oGuiElement, oOutputParameterHandler) self.addFolder(oGuiElement, oOutputParameterHandler) # utiliser oGui.addText(SITE_IDENTIFIER) def addNone(self, sId): return self.addText(sId) def addText(self, sId, sLabel='', sIcon='none.png'): # Pas de texte lors des recherches globales if window(10101).getProperty('search') == 'true': return oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction('DoNothing') if not sLabel: sLabel = self.ADDON.VSlang(30204) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oOutputParameterHandler = cOutputParameterHandler() self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser depuis le 22/04 def addMovieDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'movies' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(1) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # non utiliser 22/04 def addTVDB(self, sId, sFunction, sLabel, sIcon, sThumbnail, sFanart, oOutputParameterHandler=''): cGui.CONTENT = 'tvshows' oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setMeta(2) oGuiElement.setThumbnail(sThumbnail) oGuiElement.setFanart(sFanart) oGuiElement.setCat(7) if oOutputParameterHandler.getValue('sMovieTitle'): sTitle = oOutputParameterHandler.getValue('sMovieTitle') oGuiElement.setFileName(sTitle) self.addFolder(oGuiElement, oOutputParameterHandler) # afficher les liens non playable def addFolder(self, oGuiElement, oOutputParameterHandler='', _isFolder=True): # recherche append les reponses if window(10101).getProperty('search') == 'true': import copy cGui.searchResults.append({ 'guiElement': oGuiElement, 'params': copy.deepcopy(oOutputParameterHandler) }) return # Des infos a rajouter ? params = { 'siteUrl': oGuiElement.setSiteUrl, 'sTmdbId': oGuiElement.setTmdbId, 'sYear': oGuiElement.setYear } try: for sParam, callback in params.iteritems(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) except AttributeError: for sParam, callback in params.items(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'false') sCat = oGuiElement.getCat() if sCat: cGui.sCat = sCat oOutputParameterHandler.addParameter('sCat', sCat) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) if sCat: # 1 = movies, moviePack; 2 = series, animes, episodes; 5 = MISC if oGuiElement.getMeta(): self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) if not oListItem.getProperty('isBookmark'): self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) if sCat in (1, 2): if self.ADDON.getSetting('bstoken') != '': self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('tmdb_account') != '': self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, _isFolder)) # Vider les paramètres pour être recyclé oOutputParameterHandler.clearParameter() # affiche les liens playable def addHost(self, oGuiElement, oOutputParameterHandler=''): oInputParameterHandler = cInputParameterHandler() cGui.CONTENT = 'files' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) # On récupere le sCat du fichier précédent. sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'true') oListItem.setProperty('Video', 'true') oListItem.addStreamInfo('video', {}) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, False)) def createListItem(self, oGuiElement): oListItem = listitem(oGuiElement.getTitle()) # voir : https://kodi.wiki/view/InfoLabels oListItem.setInfo(oGuiElement.getType(), oGuiElement.getItemValues()) oListItem.setArt({ 'poster': oGuiElement.getPoster(), 'thumb': oGuiElement.getThumbnail(), 'icon': oGuiElement.getIcon(), 'fanart': oGuiElement.getFanart() }) aProperties = oGuiElement.getItemProperties() for sPropertyKey, sPropertyValue in aProperties.items(): oListItem.setProperty(sPropertyKey, str(sPropertyValue)) return oListItem # Marquer vu/Non vu def createContexMenuWatch(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'setWatched', self.ADDON.VSlang(30206)) def createContexMenuPageSelect(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('selectPage') oContext.setTitle(self.ADDON.VSlang(30017)) oOutputParameterHandler.addParameter('OldFunction', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuViewBack(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('viewBack') oContext.setTitle(self.ADDON.VSlang(30018)) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # marque page def createContexMenuBookmark(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sCleanTitle', oGuiElement.getCleanTitle()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sFav', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'setBookmark', self.ADDON.VSlang(30210)) def createContexMenuTrakt(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) sType = cGui.CONTENT.replace('tvshows', 'shows') oOutputParameterHandler.addParameter('sType', sType) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', self.ADDON.VSlang(30214)) def createContexMenuTMDB(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'themoviedb_org', 'themoviedb_org', 'getAction', 'TMDB') def createContexMenuDownload(self, oGuiElement, oOutputParameterHandler='', status='0'): if status == '0': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StartDownloadOneFile', self.ADDON.VSlang(30215)) if status == '0' or status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'delDownload', self.ADDON.VSlang(30216)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'DelFile', self.ADDON.VSlang(30217)) if status == '1': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StopDownloadList', self.ADDON.VSlang(30218)) if status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ReadDownload', self.ADDON.VSlang(30219)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ResetDownload', self.ADDON.VSlang(30220)) # Information def createContexMenuinfo(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewInfo', self.ADDON.VSlang(30208)) # Bande annonce def createContexMenuba(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) oOutputParameterHandler.addParameter('sTrailerUrl', oGuiElement.getTrailer()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewBA', self.ADDON.VSlang(30212)) # Recherche similaire def createContexMenuSimil(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewSimil', self.ADDON.VSlang(30213)) def CreateSimpleMenu(self, oGuiElement, oOutputParameterHandler, sFile, sName, sFunction, sTitle): oContext = cContextElement() oContext.setFile(sFile) oContext.setSiteName(sName) oContext.setFunction(sFunction) oContext.setTitle(sTitle) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuDelFav(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'delBookmarksMenu', self.ADDON.VSlang(30209)) def createContexMenuSettings(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'globalParametre', 'globalParametre', 'opensetting', self.ADDON.VSlang(30023)) def __createContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] # Menus classiques reglés a la base if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus, True) return oListItem def __ContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem def __ContextMenuPlay(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] if len(oGuiElement.getContextItems()) > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) return oListItem def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() sParams = oOutputParameterHandler.getParameterAsUri() sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), QuotePlus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), QuotePlus(oGuiElement.getCleanTitle()), sParams) return sItemUrl def setEndOfDirectory(self, ForceViewMode=False): iHandler = cPluginHandler().getPluginHandle() # modif 22/06 if not self.listing: self.addText('cGui') xbmcplugin.addDirectoryItems(iHandler, self.listing, len(self.listing)) xbmcplugin.setPluginCategory(iHandler, '') xbmcplugin.setContent(iHandler, cGui.CONTENT) xbmcplugin.addSortMethod(iHandler, xbmcplugin.SORT_METHOD_NONE) xbmcplugin.endOfDirectory(iHandler, succeeded=True, cacheToDisc=True) # reglage vue # 50 = liste / 51 grande liste / 500 icone / 501 gallerie / 508 fanart / if ForceViewMode: xbmc.executebuiltin('Container.SetViewMode(' + str(ForceViewMode) + ')') else: if self.ADDON.getSetting('active-view') == 'true': if cGui.CONTENT == 'movies' or cGui.CONTENT == 'artists': # xbmc.executebuiltin('Container.SetViewMode(507)') xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('movie-view')) elif cGui.CONTENT == 'tvshows': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('serie-view')) elif cGui.CONTENT == 'files' or cGui.CONTENT == 'episodes': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('default-view')) # bug affichage Kodi 18 del self.listing[:] def updateDirectory(self): # refresh the content xbmc.executebuiltin('Container.Refresh') xbmc.sleep(600) # Nécessaire pour laisser le temps du refresh def viewBA(self): oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') sYear = oInputParameterHandler.getValue('sYear') sTrailerUrl = oInputParameterHandler.getValue('sTrailerUrl') sMeta = oInputParameterHandler.getValue('sMeta') from resources.lib.ba import cShowBA cBA = cShowBA() cBA.SetSearch(sFileName) cBA.SetYear(sYear) cBA.SetTrailerUrl(sTrailerUrl) cBA.SetMetaType(sMeta) cBA.SearchBA() def viewBack(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sTest = '%s?site=%s' % (sPluginPath, sId) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def viewInfo(self): if addon().getSetting('information-view') == "false": from resources.lib.config import WindowsBoxes oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sMeta = oInputParameterHandler.getValue( 'sMeta') if oInputParameterHandler.exist( 'sMeta') else xbmc.getInfoLabel('ListItem.Property(sMeta)') sYear = oInputParameterHandler.getValue( 'sYear') if oInputParameterHandler.exist( 'sYear') else xbmc.getInfoLabel('ListItem.Year') WindowsBoxes(sCleanTitle, sCleanTitle, sMeta, sYear) else: # On appel la fonction integrer a Kodi pour charger les infos. xbmc.executebuiltin('Action(Info)') def viewSimil(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sCat = oInputParameterHandler.getValue( 'sCat') if oInputParameterHandler.exist( 'sCat') else xbmc.getInfoLabel('ListItem.Property(sCat)') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('searchtext', sCleanTitle) oOutputParameterHandler.addParameter('sCat', sCat) oOutputParameterHandler.addParameter('readdb', 'False') sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, 'globalSearch', 'globalSearch', sParams) # Si lancé depuis la page Home de Kodi, il faut d'abord en sortir pour lancer la recherche if xbmc.getCondVisibility('Window.IsVisible(home)'): xbmc.executebuiltin('ActivateWindow(%d)' % (10028)) xbmc.executebuiltin('Container.Update(%s)' % sTest) return False def selectPage(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') if siteUrl.endswith( '/'): # for the url http.://www.1test.com/annee-2020/page-2/ urlSource = siteUrl.rsplit('/', 2)[0] endOfUrl = siteUrl.rsplit('/', 2)[1] + '/' else: # for the url http.://www.1test.com/annee-2020/page-2 or /page-2.html urlSource = siteUrl.rsplit('/', 1)[0] endOfUrl = siteUrl.rsplit('/', 1)[1] oParser = cParser() oldNum = oParser.getNumberFromString(endOfUrl) newNum = 0 if oldNum: newNum = self.showNumBoard() if newNum: try: siteUrl = urlSource + '/' + endOfUrl.replace(oldNum, newNum, 1) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s)' % sTest) except: return False return False def selectPage2(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') selpage = self.showNumBoard() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('Selpage', selpage) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def setWatched(self): if True: # Use vStream database oInputParameterHandler = cInputParameterHandler() sSite = oInputParameterHandler.getValue('siteUrl') sTitle = oInputParameterHandler.getValue('sTitleWatched') if not sTitle: return meta = {} meta['title'] = sTitle meta['site'] = sSite db = cDb() row = db.get_watched(meta) if row: db.del_watched(meta) db.del_resume(meta) else: db.insert_watched(meta) # To test # updateDirectory() else: # Use kodi buildin feature xbmc.executebuiltin('Action(ToggleWatched)') # Not usefull ? # updateDirectory() def showKeyBoard(self, sDefaultText='', heading=''): keyboard = xbmc.Keyboard(sDefaultText) keyboard.setHeading(heading) keyboard.doModal() if (keyboard.isConfirmed()): sSearchText = keyboard.getText() if (len(sSearchText)) > 0: return sSearchText return False def showNumBoard(self, sDefaultNum=''): dialogs = dialog() numboard = dialogs.numeric(0, self.ADDON.VSlang(30019), sDefaultNum) # numboard.doModal() if numboard is not None: return numboard return False def openSettings(self): return False def showNofication(self, sTitle, iSeconds=0): return False def showError(self, sTitle, sDescription, iSeconds=0): return False def showInfo(self, sTitle, sDescription, iSeconds=0): return False
class cGui: SITE_NAME = 'cGui' CONTENT = 'files' searchResults = [] listing = [] episodeListing = [] # Pour gérer l'enchainement des episodes ADDON = addon() if isKrypton(): CONTENT = 'addons' def getEpisodeListing(self): return self.episodeListing def addNewDir(self, Type, sId, sFunction, sLabel, sIcon, sThumbnail='', sDesc='', oOutputParameterHandler='', sMeta=0, sCat=None): oGuiElement = cGuiElement() # dir ou link => CONTENT par défaut = files if Type != 'dir' and Type != 'link': cGui.CONTENT = Type oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) if sThumbnail == '': oGuiElement.setThumbnail(oGuiElement.getIcon()) else: oGuiElement.setThumbnail(sThumbnail) oGuiElement.setPoster(sThumbnail) oGuiElement.setDescription(sDesc) if sCat is not None: oGuiElement.setCat(sCat) # Pour addLink on recupere le sCat et sMeta precedent. if Type == 'link': oInputParameterHandler = cInputParameterHandler() sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) sMeta = oInputParameterHandler.getValue('sMeta') if sMeta: oGuiElement.setMeta(sMeta) else: oOutputParameterHandler.addParameter('sMeta', sMeta) oGuiElement.setMeta(sMeta) # Si pas d'id TMDB on recupère le précedent if not oOutputParameterHandler.getValue('sTmdbId'): oInputParameterHandler = cInputParameterHandler() sTmdbID = oInputParameterHandler.getValue('sTmdbId') if sTmdbID: oOutputParameterHandler.addParameter('sTmdbId', sTmdbID) oOutputParameterHandler.addParameter('sFav', sFunction) resumeTime = oOutputParameterHandler.getValue('ResumeTime') if resumeTime: oGuiElement.setResumeTime(resumeTime) oGuiElement.setTotalTime( oOutputParameterHandler.getValue('TotalTime')) # Lecture en cours isViewing = oOutputParameterHandler.getValue('isViewing') if isViewing: oGuiElement.addItemProperties('isViewing', True) sTitle = oOutputParameterHandler.getValue('sMovieTitle') if sTitle: oGuiElement.setFileName(sTitle) else: oGuiElement.setFileName(sLabel) try: return self.addFolder(oGuiElement, oOutputParameterHandler) except Exception as e: pass # Categorie sCat Meta CONTENT # Film 1 1 movies # Serie 2 2 tvshows # Anime 3 4 tvshows # Saison 4 5 episodes # Divers 5 0 videos # IPTV (Officiel) 6 0 files # Saga 7 3 movies # Episodes 8 6 episodes # Person / 7 artists # Nerwork / 8 files def addMovie(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): movieUrl = oOutputParameterHandler.getValue('siteUrl') oOutputParameterHandler.addParameter('movieUrl', QuotePlus(movieUrl)) oOutputParameterHandler.addParameter('movieFunc', sFunction) return self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 1, 1) def addTV(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes saisonUrl = oOutputParameterHandler.getValue('siteUrl') if saisonUrl: oOutputParameterHandler.addParameter('saisonUrl', QuotePlus(saisonUrl)) oOutputParameterHandler.addParameter('nextSaisonFunc', sFunction) return self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 2, 2) def addAnime(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes saisonUrl = oOutputParameterHandler.getValue('siteUrl') if saisonUrl: oOutputParameterHandler.addParameter('saisonUrl', QuotePlus(saisonUrl)) oOutputParameterHandler.addParameter('nextSaisonFunc', sFunction) return self.addNewDir('tvshows', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 4, 3) def addMisc(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): if sThumbnail or sDesc: type = 'videos' else: type = 'files' movieUrl = oOutputParameterHandler.getValue('siteUrl') oOutputParameterHandler.addParameter('movieUrl', QuotePlus(movieUrl)) oOutputParameterHandler.addParameter('movieFunc', sFunction) return self.addNewDir(type, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, 5) def addMoviePack(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): return self.addNewDir('movies', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 3, 7) def addDir(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler='', sDesc=""): return self.addNewDir('dir', sId, sFunction, sLabel, sIcon, '', sDesc, oOutputParameterHandler, 0, None) def addLink(self, sId, sFunction, sLabel, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes oInputParameterHandler = cInputParameterHandler() oOutputParameterHandler.addParameter( 'saisonUrl', oInputParameterHandler.getValue('saisonUrl')) oOutputParameterHandler.addParameter( 'nextSaisonFunc', oInputParameterHandler.getValue('nextSaisonFunc')) oOutputParameterHandler.addParameter( 'movieUrl', oInputParameterHandler.getValue('movieUrl')) oOutputParameterHandler.addParameter( 'movieFunc', oInputParameterHandler.getValue('movieFunc')) if not oOutputParameterHandler.getValue('sLang'): oOutputParameterHandler.addParameter( 'sLang', oInputParameterHandler.getValue('sLang')) # # Affichage du pourcentage de lecture en cours, non utilisé car pas très eronomique au niveau des liens lorsqu'il y a beaucoup de liens # oOutputParameterHandler.addParameter('ResumeTime', oInputParameterHandler.getValue('ResumeTime')) # oOutputParameterHandler.addParameter('TotalTime', oInputParameterHandler.getValue('TotalTime')) sIcon = sThumbnail return self.addNewDir('link', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 0, None) def addSeason(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes saisonUrl = oOutputParameterHandler.getValue('siteUrl') oOutputParameterHandler.addParameter('saisonUrl', QuotePlus(saisonUrl)) oOutputParameterHandler.addParameter('nextSaisonFunc', sFunction) return self.addNewDir('episodes', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 5, 4) def addEpisode(self, sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler=''): # Pour gérer l'enchainement des épisodes, l'URL de la saison oInputParameterHandler = cInputParameterHandler() saisonUrl = oInputParameterHandler.getValue('saisonUrl') if saisonUrl: # Retenu depuis "addSeason" oOutputParameterHandler.addParameter('saisonUrl', saisonUrl) oOutputParameterHandler.addParameter( 'nextSaisonFunc', oInputParameterHandler.getValue('nextSaisonFunc')) else: # calculé depuis l'url qui nous a emmené ici sans passé par addSeason oOutputParameterHandler.addParameter( 'saisonUrl', oInputParameterHandler.getValue('siteUrl')) oOutputParameterHandler.addParameter( 'nextSaisonFunc', oInputParameterHandler.getValue('function')) if not oOutputParameterHandler.getValue('sLang'): oOutputParameterHandler.addParameter( 'sLang', oInputParameterHandler.getValue('sLang')) return self.addNewDir('episodes', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 6, 8) # Affichage d'une personne (acteur, réalisateur, ..) def addPerson(self, sId, sFunction, sLabel, sIcon, sThumbnail, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' return self.addNewDir('artists', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 7, None) # Affichage d'un réseau de distribution du média def addNetwork(self, sId, sFunction, sLabel, sIcon, oOutputParameterHandler=''): sThumbnail = '' sDesc = '' return self.addNewDir('files', sId, sFunction, sLabel, sIcon, sThumbnail, sDesc, oOutputParameterHandler, 8, None) def addNext(self, sId, sFunction, sLabel, oOutputParameterHandler): oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction(sFunction) oGuiElement.setTitle('[COLOR teal]' + sLabel + ' >>>[/COLOR]') oGuiElement.setIcon('next.png') oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oGuiElement.setCat(5) self.createContexMenuPageSelect(oGuiElement, oOutputParameterHandler) self.createContexMenuViewBack(oGuiElement, oOutputParameterHandler) return self.addFolder(oGuiElement, oOutputParameterHandler) # utiliser oGui.addText(SITE_IDENTIFIER) def addNone(self, sId): return self.addText(sId) def addText(self, sId, sLabel='', sIcon='none.png'): # Pas de texte lors des recherches globales if window(10101).getProperty('search') == 'true': return oGuiElement = cGuiElement() oGuiElement.setSiteName(sId) oGuiElement.setFunction('DoNothing') if not sLabel: sLabel = self.ADDON.VSlang(30204) oGuiElement.setTitle(sLabel) oGuiElement.setIcon(sIcon) oGuiElement.setThumbnail(oGuiElement.getIcon()) oGuiElement.setMeta(0) oOutputParameterHandler = cOutputParameterHandler() return self.addFolder(oGuiElement, oOutputParameterHandler) # afficher les liens non playable def addFolder(self, oGuiElement, oOutputParameterHandler='', _isFolder=True): # recherche append les reponses if window(10101).getProperty('search') == 'true': import copy cGui.searchResults.append({ 'guiElement': oGuiElement, 'params': copy.deepcopy(oOutputParameterHandler) }) return # Des infos a rajouter ? params = { 'siteUrl': oGuiElement.setSiteUrl, 'sTmdbId': oGuiElement.setTmdbId, 'sYear': oGuiElement.setYear } try: for sParam, callback in params.iteritems(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) except AttributeError: for sParam, callback in params.items(): value = oOutputParameterHandler.getValue(sParam) if value: callback(value) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'false') sCat = oGuiElement.getCat() if sCat: cGui.sCat = sCat oOutputParameterHandler.addParameter('sCat', sCat) sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) if sCat: # 1 = movies, moviePack; 2 = series, animes, episodes; 5 = MISC if oGuiElement.getMeta(): self.createContexMenuinfo(oGuiElement, oOutputParameterHandler) self.createContexMenuba(oGuiElement, oOutputParameterHandler) if not oListItem.getProperty('isBookmark'): self.createContexMenuBookmark(oGuiElement, oOutputParameterHandler) if sCat in (1, 2, 3, 4, 8): if self.ADDON.getSetting('bstoken') != '': self.createContexMenuTrakt(oGuiElement, oOutputParameterHandler) if self.ADDON.getSetting('tmdb_account') != '': self.createContexMenuTMDB(oGuiElement, oOutputParameterHandler) if sCat in (1, 2, 3): self.createContexMenuSimil(oGuiElement, oOutputParameterHandler) if sCat != 6: self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, _isFolder)) # Vider les paramètres pour être recyclé oOutputParameterHandler.clearParameter() return oListItem # affiche les liens playable def addHost(self, oGuiElement, oOutputParameterHandler=''): oInputParameterHandler = cInputParameterHandler() # # Affichage du pourcentage de lecture en cours, non utilisé car pas très eronomique au niveau des liens lorsqu'il y a beaucoup de liens # resumeTime = oInputParameterHandler.getValue('ResumeTime') # if resumeTime: # oGuiElement.setResumeTime(resumeTime) # oGuiElement.setTotalTime(oInputParameterHandler.getValue('TotalTime')) cGui.CONTENT = 'files' if oOutputParameterHandler.getValue('siteUrl'): sSiteUrl = oOutputParameterHandler.getValue('siteUrl') oGuiElement.setSiteUrl(sSiteUrl) sCat = oOutputParameterHandler.getValue('sCat') if not sCat: # On récupere le sCat du niveau précédent sCat = oInputParameterHandler.getValue('sCat') if sCat: oGuiElement.setCat(sCat) oListItem = self.createListItem(oGuiElement) oListItem.setProperty('IsPlayable', 'true') # oListItem.setProperty('Video', 'true') sItemUrl = self.__createItemUrl(oGuiElement, oOutputParameterHandler) oOutputParameterHandler.addParameter('sTitleWatched', oGuiElement.getTitleWatched()) self.createContexMenuWatch(oGuiElement, oOutputParameterHandler) oListItem = self.__createContextMenu(oGuiElement, oListItem) self.listing.append((sItemUrl, oListItem, False)) def createListItem(self, oGuiElement): # Enleve les elements vides data = { key: val for key, val in oGuiElement.getItemValues().items() if val != "" } itemTitle = oGuiElement.getTitle() if oGuiElement.getMeta() == 6 and data.get( 'tagline'): # Nom de l'épisode itemTitle += ' - ' + str(data.get('tagline')) data['title'] = itemTitle # kodi 19 oListItem = listitem(itemTitle) if not isNexus(): # voir : https://kodi.wiki/view/InfoLabels oListItem.setInfo(oGuiElement.getType(), data) else: videoInfoTag = oListItem.getVideoInfoTag() # gestion des valeurs par defaut si non renseignées videoInfoTag.setMediaType(data.get('mediatype')) videoInfoTag.setTitle(itemTitle) videoInfoTag.setOriginalTitle(data.get('originaltitle')) videoInfoTag.setPlot(data.get('plot')) videoInfoTag.setPlotOutline(data.get('plotoutline')) videoInfoTag.setYear(int(data.get('year', 0))) videoInfoTag.setRating(float(data.get('rating', 0.0))) videoInfoTag.setMpaa(data.get('mpaa')) try: videoInfoTag.setDuration(int(data.get('duration', 0))) except: #Pour convertir le temps en seconde. videoInfoTag.setDuration( sum(x * int(t) for x, t in zip([3600, 60, 1], data.get('duration').split(":")))) videoInfoTag.setPlaycount(int(data.get('playcount', 0))) videoInfoTag.setCountries(data.get('country', [""])) videoInfoTag.setTrailer(data.get('trailer')) videoInfoTag.setTagLine(data.get('tagline')) videoInfoTag.setStudios(list(data.get('studio', '').split("/"))) videoInfoTag.setWriters(list(data.get('writer', '').split("/"))) videoInfoTag.setDirectors(list( data.get('director', '').split("/"))) videoInfoTag.setGenres(''.join(data.get('genre', [""])).split('/')) videoInfoTag.setSeason(int(data.get('season', 0))) videoInfoTag.setEpisode(int(data.get('episode', 0))) # TODO Gestion du pourcentage de lecture # v20 Python API changes: # ResumeTime and TotalTime deprecated. Use InfoTagVideo.setResumePoint() instead. try: credits = eval(data.get('credits'))['cast'] except: credits = None cast = [] if credits is not None: for actor in credits: thumbnail = actor['profile_path'] cast.append( xbmc.Actor(actor['name'], actor['character'], actor['order'], thumbnail)) videoInfoTag.setCast(cast) oListItem.setArt({ 'poster': oGuiElement.getPoster(), 'thumb': oGuiElement.getThumbnail(), 'icon': oGuiElement.getIcon(), 'fanart': oGuiElement.getFanart() }) aProperties = oGuiElement.getItemProperties() for sPropertyKey, sPropertyValue in aProperties.items(): oListItem.setProperty(sPropertyKey, str(sPropertyValue)) return oListItem # Marquer vu/Non vu def createContexMenuWatch(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'setWatched', self.ADDON.VSlang(30206)) def createContexMenuPageSelect(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('selectPage') oContext.setTitle(self.ADDON.VSlang(30017)) oOutputParameterHandler.addParameter('OldFunction', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuViewBack(self, oGuiElement, oOutputParameterHandler): oContext = cContextElement() oContext.setFile('cGui') oContext.setSiteName('cGui') oContext.setFunction('viewBack') oContext.setTitle(self.ADDON.VSlang(30018)) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) # marque page def createContexMenuBookmark(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sCleanTitle', oGuiElement.getCleanTitle()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sFav', oGuiElement.getFunction()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'setBookmark', self.ADDON.VSlang(30210)) def createContexMenuTrakt(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) sType = cGui.CONTENT.replace('tvshows', 'shows') oOutputParameterHandler.addParameter('sType', sType) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cTrakt', 'cTrakt', 'getAction', self.ADDON.VSlang(30214)) def createContexMenuTMDB(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler.addParameter('sImdbId', oGuiElement.getImdbId()) oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'themoviedb_org', 'themoviedb_org', 'getAction', 'TMDB') def createContexMenuDownload(self, oGuiElement, oOutputParameterHandler='', status='0'): if status == '0': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StartDownloadOneFile', self.ADDON.VSlang(30215)) if status == '0' or status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'delDownload', self.ADDON.VSlang(30216)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'DelFile', self.ADDON.VSlang(30217)) if status == '1': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'StopDownloadList', self.ADDON.VSlang(30218)) if status == '2': self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ReadDownload', self.ADDON.VSlang(30219)) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cDownload', 'cDownload', 'ResetDownload', self.ADDON.VSlang(30220)) # Information def createContexMenuinfo(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sId', oGuiElement.getSiteName()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewInfo', self.ADDON.VSlang(30208)) # Bande annonce def createContexMenuba(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sYear', oGuiElement.getYear()) oOutputParameterHandler.addParameter('sTrailerUrl', oGuiElement.getTrailer()) oOutputParameterHandler.addParameter('sMeta', oGuiElement.getMeta()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewBA', self.ADDON.VSlang(30212)) # Recherche similaire def createContexMenuSimil(self, oGuiElement, oOutputParameterHandler=''): oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('sFileName', oGuiElement.getFileName()) oOutputParameterHandler.addParameter('sTitle', oGuiElement.getTitle()) oOutputParameterHandler.addParameter('sCat', oGuiElement.getCat()) self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cGui', oGuiElement.getSiteName(), 'viewSimil', self.ADDON.VSlang(30213)) def CreateSimpleMenu(self, oGuiElement, oOutputParameterHandler, sFile, sName, sFunction, sTitle): oContext = cContextElement() oContext.setFile(sFile) oContext.setSiteName(sName) oContext.setFunction(sFunction) oContext.setTitle(sTitle) oContext.setOutputParameterHandler(oOutputParameterHandler) oGuiElement.addContextItem(oContext) def createContexMenuDelFav(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'cFav', 'cFav', 'delBookmarksMenu', self.ADDON.VSlang(30209)) def createContexMenuSettings(self, oGuiElement, oOutputParameterHandler=''): self.CreateSimpleMenu(oGuiElement, oOutputParameterHandler, 'globalParametre', 'globalParametre', 'opensetting', self.ADDON.VSlang(30023)) def __createContextMenu(self, oGuiElement, oListItem): sPluginPath = cPluginHandler().getPluginPath() aContextMenus = [] # Menus classiques reglés a la base nbContextMenu = len(oGuiElement.getContextItems()) if nbContextMenu > 0: for oContextItem in oGuiElement.getContextItems(): oOutputParameterHandler = oContextItem.getOutputParameterHandler( ) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % ( sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] oListItem.addContextMenuItems(aContextMenus) oListItem.setProperty('nbcontextmenu', str(nbContextMenu)) return oListItem # def __ContextMenu(self, oGuiElement, oListItem): # sPluginPath = cPluginHandler().getPluginPath() # aContextMenus = [] # # if len(oGuiElement.getContextItems()) > 0: # for oContextItem in oGuiElement.getContextItems(): # oOutputParameterHandler = oContextItem.getOutputParameterHandler() # sParams = oOutputParameterHandler.getParameterAsUri() # sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) # aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] # # oListItem.addContextMenuItems(aContextMenus) # # return oListItem # # def __ContextMenuPlay(self, oGuiElement, oListItem): # sPluginPath = cPluginHandler().getPluginPath() # aContextMenus = [] # # if len(oGuiElement.getContextItems()) > 0: # for oContextItem in oGuiElement.getContextItems(): # oOutputParameterHandler = oContextItem.getOutputParameterHandler() # sParams = oOutputParameterHandler.getParameterAsUri() # sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, oContextItem.getFile(), oContextItem.getFunction(), sParams) # aContextMenus += [(oContextItem.getTitle(), 'RunPlugin(%s)' % sTest)] # # oListItem.addContextMenuItems(aContextMenus) # # return oListItem def __createItemUrl(self, oGuiElement, oOutputParameterHandler=''): if (oOutputParameterHandler == ''): oOutputParameterHandler = cOutputParameterHandler() # On descend l'id TMDB dans les saisons et les épisodes oOutputParameterHandler.addParameter('sTmdbId', oGuiElement.getTmdbId()) # Pour gérer l'enchainement des épisodes oOutputParameterHandler.addParameter('sSeason', oGuiElement.getSeason()) oOutputParameterHandler.addParameter('sEpisode', oGuiElement.getEpisode()) sParams = oOutputParameterHandler.getParameterAsUri() sPluginPath = cPluginHandler().getPluginPath() if (len(oGuiElement.getFunction()) == 0): sItemUrl = '%s?site=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), QuotePlus(oGuiElement.getCleanTitle()), sParams) else: sItemUrl = '%s?site=%s&function=%s&title=%s&%s' % ( sPluginPath, oGuiElement.getSiteName(), oGuiElement.getFunction(), QuotePlus(oGuiElement.getCleanTitle()), sParams) return sItemUrl def setEndOfDirectory(self, forceViewMode=False): iHandler = cPluginHandler().getPluginHandle() if not self.listing: self.addText('cGui') xbmcplugin.addDirectoryItems(iHandler, self.listing, len(self.listing)) xbmcplugin.setPluginCategory(iHandler, '') xbmcplugin.setContent(iHandler, cGui.CONTENT) xbmcplugin.addSortMethod(iHandler, xbmcplugin.SORT_METHOD_NONE) xbmcplugin.endOfDirectory(iHandler, succeeded=True, cacheToDisc=True) # reglage vue # 50 = liste / 51 grande liste / 500 icone / 501 gallerie / 508 fanart / if forceViewMode: xbmc.executebuiltin('Container.SetViewMode(' + str(forceViewMode) + ')') else: if self.ADDON.getSetting('active-view') == 'true': if cGui.CONTENT == 'movies' or cGui.CONTENT == 'artists': # xbmc.executebuiltin('Container.SetViewMode(507)') xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('movie-view')) elif cGui.CONTENT == 'tvshows': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('serie-view')) elif cGui.CONTENT == 'files' or cGui.CONTENT == 'episodes': xbmc.executebuiltin('Container.SetViewMode(%s)' % self.ADDON.getSetting('default-view')) del self.episodeListing[:] # Pour l'enchainement des episodes self.episodeListing.extend(self.listing) del self.listing[:] def updateDirectory(self): # refresh the content xbmc.executebuiltin('Container.Refresh') xbmc.sleep(600) # Nécessaire pour laisser le temps du refresh def viewBA(self): oInputParameterHandler = cInputParameterHandler() sFileName = oInputParameterHandler.getValue('sFileName') sYear = oInputParameterHandler.getValue('sYear') sTrailerUrl = oInputParameterHandler.getValue('sTrailerUrl') sMeta = oInputParameterHandler.getValue('sMeta') from resources.lib.ba import cShowBA cBA = cShowBA() cBA.SetSearch(sFileName) cBA.SetYear(sYear) cBA.SetTrailerUrl(sTrailerUrl) cBA.SetMetaType(sMeta) cBA.SearchBA() def viewBack(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sTest = '%s?site=%s' % (sPluginPath, sId) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def viewInfo(self): if addon().getSetting('information-view') == "false": from resources.lib.config import WindowsBoxes oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sMeta = oInputParameterHandler.getValue( 'sMeta') if oInputParameterHandler.exist( 'sMeta') else xbmc.getInfoLabel('ListItem.Property(sMeta)') sYear = oInputParameterHandler.getValue( 'sYear') if oInputParameterHandler.exist( 'sYear') else xbmc.getInfoLabel('ListItem.Year') WindowsBoxes(sCleanTitle, sCleanTitle, sMeta, sYear) else: # On appel la fonction integrer a Kodi pour charger les infos. xbmc.executebuiltin('Action(Info)') def viewSimil(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sCleanTitle = oInputParameterHandler.getValue( 'sFileName') if oInputParameterHandler.exist( 'sFileName') else xbmc.getInfoLabel( 'ListItem.Property(sCleanTitle)') sCat = oInputParameterHandler.getValue( 'sCat') if oInputParameterHandler.exist( 'sCat') else xbmc.getInfoLabel('ListItem.Property(sCat)') oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('searchtext', sCleanTitle) oOutputParameterHandler.addParameter('sCat', sCat) oOutputParameterHandler.addParameter('readdb', 'False') sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, 'globalSearch', 'globalSearch', sParams) # Si lancé depuis la page Home de Kodi, il faut d'abord en sortir pour lancer la recherche if xbmc.getCondVisibility('Window.IsVisible(home)'): xbmc.executebuiltin('ActivateWindow(%d)' % (10028)) xbmc.executebuiltin('Container.Update(%s)' % sTest) return False def selectPage(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() # sParams = oInputParameterHandler.getAllParameter() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') if siteUrl.endswith( '/'): # for the url http.://www.1test.com/annee-2020/page-2/ urlSource = siteUrl.rsplit('/', 2)[0] endOfUrl = siteUrl.rsplit('/', 2)[1] + '/' else: # for the url http.://www.1test.com/annee-2020/page-2 or /page-2.html urlSource = siteUrl.rsplit('/', 1)[0] endOfUrl = siteUrl.rsplit('/', 1)[1] oParser = cParser() oldNum = oParser.getNumberFromString(endOfUrl) newNum = 0 if oldNum: newNum = self.showNumBoard() if newNum: try: siteUrl = urlSource + '/' + endOfUrl.replace(oldNum, newNum, 1) oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s)' % sTest) except: return False return False def selectPage2(self): sPluginPath = cPluginHandler().getPluginPath() oInputParameterHandler = cInputParameterHandler() sId = oInputParameterHandler.getValue('sId') sFunction = oInputParameterHandler.getValue('OldFunction') siteUrl = oInputParameterHandler.getValue('siteUrl') selpage = self.showNumBoard() oOutputParameterHandler = cOutputParameterHandler() oOutputParameterHandler.addParameter('siteUrl', siteUrl) oOutputParameterHandler.addParameter('Selpage', selpage) sParams = oOutputParameterHandler.getParameterAsUri() sTest = '%s?site=%s&function=%s&%s' % (sPluginPath, sId, sFunction, sParams) xbmc.executebuiltin('Container.Update(%s, replace)' % sTest) def setWatched(self): if True: # Use vStream database oInputParameterHandler = cInputParameterHandler() sSite = oInputParameterHandler.getValue('siteUrl') sTitle = oInputParameterHandler.getValue('sTitleWatched') sCat = oInputParameterHandler.getValue('sCat') if not sTitle: return meta = {} meta['title'] = sTitle meta['titleWatched'] = sTitle meta['site'] = sSite meta['cat'] = sCat from resources.lib.db import cDb db = cDb() row = db.get_watched(meta) if row: db.del_watched(meta) db.del_resume(meta) else: db.insert_watched(meta) db.del_viewing(meta) # To test # updateDirectory() else: # Use kodi buildin feature xbmc.executebuiltin('Action(ToggleWatched)') self.updateDirectory() def showKeyBoard(self, sDefaultText='', heading=''): keyboard = xbmc.Keyboard(sDefaultText) keyboard.setHeading(heading) keyboard.doModal() if (keyboard.isConfirmed()): sSearchText = keyboard.getText() if (len(sSearchText)) > 0: return sSearchText return False def showNumBoard(self, sDefaultNum=''): dialogs = dialog() numboard = dialogs.numeric(0, self.ADDON.VSlang(30019), sDefaultNum) # numboard.doModal() if numboard is not None: return numboard return False def openSettings(self): return False def showNofication(self, sTitle, iSeconds=0): return False def showError(self, sTitle, sDescription, iSeconds=0): return False def showInfo(self, sTitle, sDescription, iSeconds=0): return False