def add_categories(self, records): # get our media item dirItem = DirectoryItem() # set as folder since these our virtual folders to filtered lists dirItem.isFolder = True # FIXME: queue and now playing menu items # universal context menu items for categories # #dirItem.addContextMenuItem( xbmc.getLocalizedString( 13347 ), "XBMC.Action(Queue)" ) # #dirItem.addContextMenuItem( xbmc.getLocalizedString( 13350 ), "XBMC.ActivateWindow(10028)" ) dirItem.addContextMenuItem(xbmc.getLocalizedString(24020), "XBMC.RunScript({addon},task='configure')".format(addon=self.m_addon.getAddonInfo("Id"))) dirItem.addContextMenuItem(xbmc.getLocalizedString(137), u"XBMC.RunScript({addon},search={search}&category=u'')".format(addon=self.m_addon.getAddonInfo("Id"), search=quote_plus(repr(self.m_addon.params.get("search", u""))))) # initialize our categories list categories = [] # enumerate thru and set category for title, icon, thumb, category in records: # check for cached thumb FIXME: only actors (not enabled) if (thumb is None or not os.path.isfile(thumb)): thumb = icon # set the URL dirItem.url = u"{url}?category={category}".format(url=self.m_addon.params["path"], category=category) # create our listitem dirItem.listitem = xbmcgui.ListItem(title, iconImage=icon, thumbnailImage=thumb) # add context menu items to listitem with replaceItems = True so only ours show dirItem.listitem.addContextMenuItems(dirItem.context, replaceItems=True) # add category to our category list categories += [(dirItem.url, dirItem.listitem, dirItem.isFolder,)] # add categories to our media list return self.media_window.addItems(categories)
def _parse_categories( self, xmlSource, category ): try: # encoding encoding = re.findall( "<\?xml version=\"[^\"]*\" encoding=\"([^\"]*)\"\?>", xmlSource[ 0 ] )[ 0 ] # gather all trailer records <movieinfo> trailers = re.findall( "<movieinfo id=\".+?\"><info>.+?<studio>(.*?)</studio>.+?<director>(.*?)</director>.+?(?:<cast>(.+?)</cast>)?<genre>(.+?)</genre>.+?</movieinfo>", xmlSource[ 0 + ( 2 * ( self.settings[ "trailer_quality" ] > 1 and self.settings[ "trailer_hd_only" ] ) ) ] ) # use dictionary method to filter out duplicates; set our item list dupes = {} # enumerate thru the trailers list and create our category list for studio, directors, actors, genres in trailers: # genres category if ( category == "genres" ): # parse genres genres = re.findall( "<name>(.+?)</name>", genres ) # filter out duplicates for x in genres: dupes[ x ] = ( x, "DefaultGenre.png", None, ) elif ( category == "studios" ): # filter out duplicates dupes[ studio ] = ( studio, "DefaultStudios.png", None, ) elif ( category == "directors" ): # parse directors directors = directors.split( ", " ) # filter out duplicates for x in directors: dupes[ x ] = ( x, "DefaultDirector.png", None, ) elif ( category == "actors" ): # parse actors actors = re.findall( "<name>(.+?)</name>", actors ) # filter out duplicates for x in actors: dupes[ x ] = ( x, "DefaultActor.png", "special://profile/Thumbnails/Video/%s/%s" % ( xbmc.getCacheThumbName( "actor" + x )[ 0 ], xbmc.getCacheThumbName( "actor" + x ) ,), ) # grap the categories categories = dupes.values() # sort our list categories.sort() # get our media item dirItem = DirectoryItem() # set total items dirItem.totalItems = len( categories ) # set as folder since these our virtual folders to filtered lists dirItem.isFolder = True # add settings menu item dirItem.addContextMenuItem( "", "DUMMY TO CLEAR CONTEXT MENU" ) # enumerate thru and add our items for title, icon, thumb in categories: # check for cached thumb (only actors) if ( thumb is None or not os.path.isfile( thumb ) ): thumb = icon # create our listitem dirItem.listitem = xbmcgui.ListItem( title, iconImage=icon, thumbnailImage=thumb ) # set the url dirItem.url = "%s?category=%s" % ( sys.argv[ 0 ], urllib.quote_plus( repr( "%s: %s" % ( category, unicode( title, "utf-8" ), ) ) ), ) # add item self.MediaWindow.add( dirItem ) except Exception, e: # oops, notify user what error occurred LOG( str( e ), xbmc.LOGERROR )