Пример #1
0
 def __init__( self ):
     # parse argv for any params
     params = self._parse_argv()
     # get users preference
     self._get_settings()
     # sort methods
     sortmethods = ( xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_SIZE, xbmcplugin.SORT_METHOD_DATE,
                              xbmcplugin.SORT_METHOD_VIDEO_RUNTIME, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE,
                              xbmcplugin.SORT_METHOD_MPAA_RATING, xbmcplugin.SORT_METHOD_STUDIO, )
     # initialize buttons, we only need to set these once
     buttons = None
     # fetch items
     if ( params[ "category" ] is None ):
         # skin buttons
         buttons = ( 21866,
                             ( 
                                 ( "Recently Added", "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"recent: Recently Added" ) ), ), None, None, None, ),
                                 ( 135, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"genres" ) ), ), None, None, None, ),
                                 ( 20388, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"studios" ) ), ), None, None, None, ),
                                 ( 20348, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"directors" ) ), ), None, None, None, ),
                                 ( 344, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"actors" ) ), ), None, None, None, ),
                             ),
                         )
     # set category
     else:
         self.PluginCategory = params[ "category" ].replace( "genres", xbmc.getLocalizedString( 135 ) ).replace( "studios", xbmc.getLocalizedString( 20388 ) ).replace( "directors", xbmc.getLocalizedString( 20348 ) ).replace( "actors", xbmc.getLocalizedString( 344 ) ).replace( "recent: ", "" )
     # helper functions
     self.MediaWindow = MediaWindow( int( sys.argv[ 1 ] ), category=self.PluginCategory, content="movies", sortmethods=sortmethods, fanart=( self.settings[ "fanart_image" ], self.Fanart, ), buttons=buttons )
     # fetch videos
     self.MediaWindow.end( self.fetch_trailers( params[ "category" ] ) )
 def __init__(self, *args, **kwargs):
     # set our passed addon object
     self.m_addon = kwargs["addon"]
     # set database object
     self.m_database = Database(addon=self.m_addon)
     # setup
     self._setup()
     # get default category
     category, categories = self._set_category(
         self.m_addon.params.get("category", None)
     )
     # media window helper functions
     self.media_window = MediaWindow(
         hId=self.m_addon.params["handle"],
         addon=self.m_addon,
         content=["movies", "addoncategories"][categories],
         links=self._get_quick_links(category)
     )
     # fetch list and end directory
     self.media_window.end(
         succeeded=self._set_list(category),
         cacheToDisc=categories
     )
     # close database
     self.m_database.close()
    def __init__( self , url_source, item):
        # get users preference
        self.BASE_CURRENT_URL = url_source
        self.ITEM_CURRENT_URL = item
        self._get_settings()

        # sort methods
        sortmethods = ( xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_SIZE, xbmcplugin.SORT_METHOD_DATE,
                        xbmcplugin.SORT_METHOD_VIDEO_RUNTIME, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE,
                        xbmcplugin.SORT_METHOD_STUDIO, )
        # skin buttons
        buttons = ( ( 1045, "XBMC.RunPlugin(%s?OpenSettings)" % ( sys.argv[ 0 ], ), None, None, 2, ), )
        # helper functions
        self.MediaWindow = MediaWindow( int( sys.argv[ 1 ] ),
                                        category=self.PluginCategory,
                                        content="movies",
                                        sortmethods=sortmethods,
                                        fanart=self.settings[ "fanart_image" ], buttons=buttons )
        # fetch videos
        self.MediaWindow.end( self.get_videos() )
class Main:
    Addon = xbmcaddon.Addon( id=__plugin__)
    # base paths
    BASE_CURRENT_URL = ""
    ITEM_CURRENT_URL = ""
    BASE_DATA_PATH = os.path.join( xbmc.translatePath( "special://profile/" ), "addon_data", os.path.basename( Addon.getAddonInfo('path') ), "cache" )
    BASE_CURRENT_SOURCE_PATH = os.path.join( xbmc.translatePath( "special://profile/" ), "addon_data", os.path.basename( Addon.getAddonInfo('path')),  "cache" , "trailer_%s.xml" )
    title_option = ""
    type_filter = ""
    quality_filter = ""
    debug_on = False

    def __init__( self , url_source, item):
        # get users preference
        self.BASE_CURRENT_URL = url_source
        self.ITEM_CURRENT_URL = item
        self._get_settings()

        # sort methods
        sortmethods = ( xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_SIZE, xbmcplugin.SORT_METHOD_DATE,
                        xbmcplugin.SORT_METHOD_VIDEO_RUNTIME, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE,
                        xbmcplugin.SORT_METHOD_STUDIO, )
        # skin buttons
        buttons = ( ( 1045, "XBMC.RunPlugin(%s?OpenSettings)" % ( sys.argv[ 0 ], ), None, None, 2, ), )
        # helper functions
        self.MediaWindow = MediaWindow( int( sys.argv[ 1 ] ),
                                        category=self.PluginCategory,
                                        content="movies",
                                        sortmethods=sortmethods,
                                        fanart=self.settings[ "fanart_image" ], buttons=buttons )
        # fetch videos
        self.MediaWindow.end( self.get_videos() )

    def _get_settings( self ):
        self.settings = {}
        self.settings[ "channel_id" ] = "391100379-1"
        self.settings[ "product" ] = "Cinema"
        self.PluginCategory = ( self.Addon.getLocalizedString( 30800 ), self.Addon.getLocalizedString( 30801 ), self.Addon.getLocalizedString( 30802 ), self.Addon.getLocalizedString( 30803 ), self.Addon.getLocalizedString( 30804 ),self.Addon.getLocalizedString( 30805 ),self.Addon.getLocalizedString( 30806 ),self.Addon.getLocalizedString( 30807 ),self.Addon.getLocalizedString( 30808 ),self.Addon.getLocalizedString( 30809 ), )[ int( self.Addon.getSetting( "quality" ) ) ]
        self.Fanart = ( "normal", "normal", "normal", "normal", "normal", "HD", "HD", "HD", "max", )[ int( self.Addon.getSetting( "quality" ) ) ]
        self.settings[ "fanart_image" ] = None
        self.settings[ "quality" ] = ( "small", "medium", "large", "xlarge", "xxlarge", "HD 480p", "HD 720p", "HD 1080p", "max", )[ int( self.Addon.getSetting( "quality" ) ) ]
        self.settings[ "type" ] = ( "flv", "mov", "wmv", "mp4", "3gp", "all", )[ int( self.Addon.getSetting( "type" ) ) ]
        self.settings[ "poster" ] = int( self.Addon.getSetting( "poster" ) )
        self.settings[ "download_path" ] = self.Addon.getSetting( "download_path" )
        self.settings[ "play_mode" ] = int( self.Addon.getSetting( "play_mode" ) )
        if ( self.settings[ "play_mode" ] == 2 and self.settings[ "download_path" ] == "" ):
            self.settings[ "play_mode" ] = 1
        self.settings[ "use_title" ] = ( self.Addon.getSetting( "use_title" ) == "true")
        self.settings[ "use_trailer" ] = ( self.settings[ "download_path" ] != "" )
        self.settings[ "play_existing" ] = ( self.Addon.getSetting( "play_existing" ) == "true" and self.settings[ "download_path" ] != "" )
        self.settings[ "extra" ] = ( self.Addon.getSetting( "extra" ) == "true" )
        self.settings[ "originaltitle" ] = ( self.Addon.getSetting( "originaltitle" ) == "true" )
        self.settings[ "showtype" ] = ( self.Addon.getSetting( "showtype" ) == "true" )
        self.settings[ "max_previews" ] = self.Addon.getSetting( "max_previews" )
        if (self.settings[ "type" ] == "all" and self.settings[ "quality" ] == "all"):
            self.settings[ "showtype" ] = True
        self.settings[ "country" ] = [ int( self.Addon.getSetting( "country" ) ) ]
        self.settings[ "region" ] = ( "uk", "fr", "de", "es", "it", "ch", "ch-fr", "nl", "dk", "se", "fi", )[ int( self.Addon.getSetting( "country" ) ) ]
        if ( self.Addon.getSetting( "hdplus" ) == "true" ):
            self.settings[ "hdplus" ] = "hdplus"
        else:
            self.settings[ "hdplus" ] = "feed"
        self.settings[ "debug" ] = ( self.Addon.getSetting( "debug" ) == "true")

    def getKeyboard(self, default = '', heading = '', hidden = False):
        kboard = xbmc.Keyboard(default, heading, hidden)
        kboard.doModal()
        if kboard.isConfirmed():
            return urllib.quote_plus(kboard.getText())
        return ''

    def get_videos( self ):
        ok = False
        # fetch xml source
        xmlSource = self.get_xml_source()
        # parse source and add our items
        if ( xmlSource ):
            ok = self.parse_xml_source( xmlSource )
        return ok

    def get_xml_source( self ):
        try:
            ok = True
            debug_on = self.settings["debug"]
            # set proper source
            extension = self.settings[ "region" ]+self.settings[ "product" ]+self.ITEM_CURRENT_URL
            base_path = self.BASE_CURRENT_SOURCE_PATH % extension
            if debug_on:
                print "DEBUG: base_current_url= %s" % self.BASE_CURRENT_URL
            if self.ITEM_CURRENT_URL == '99':
                curr_phrase = ''
                search_phrase = self.getKeyboard(default = curr_phrase, heading = self.Addon.getLocalizedString(30102))
                if search_phrase == '':
                    return -1
                curr_phrase = search_phrase
                base_url = self.BASE_CURRENT_URL % (self.settings[ "region" ],self.settings[ "hdplus" ],self.settings[ "product" ],self.settings[ "max_previews" ],self.settings[ "channel_id" ],search_phrase)
            else:
                base_url = self.BASE_CURRENT_URL % (self.settings[ "region" ],self.settings[ "hdplus" ],self.settings[ "product" ],self.settings[ "max_previews" ],self.settings[ "channel_id" ])
            # print di url for get lists of video previews
            if debug_on:
                print "DEBUG: base_url= %s" % base_url
            # get the source files date if it exists
            try: date = os.path.getmtime( base_path )
            except: date = 0
            # we only refresh if it's been more than a day, 24hr * 60min * 60sec
            if self.ITEM_CURRENT_URL == '99':
                refresh = True
            else:
                refresh = ( ( time.time() - ( 24 * 60 * 60 ) ) >= date )
            # only fetch source if it's been more than a day
            if debug_on:
                print "DEBUG: open  %s" % time.asctime ()
            if ( refresh or debug_on):
                # open url
                user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
                headers = { 'User-Agent' : user_agent }
                req = urllib2.Request(base_url, None, headers)
                try:
                    usock = urllib2.urlopen( req , timeout = 60)
                except urllib2.HTTPError, e:
                    print "URLLIB2 HTTPError: code=%s msg=%s header=%s fp.read=%s" % (e.code , e.msg , e.headers , e.fp.read())
                # save file versione
                # urllib.urlretrieve(base_url,base_path)
                # usock = open( base_path, "r" )
            else:
Пример #5
0
class Main:
    # base url
    BASE_CURRENT_URL = "http://www.apple.com/trailers/home/xml/%s"
    # base paths
    BASE_CURRENT_SOURCE_PATH = os.path.join( xbmc.translatePath( "special://profile/" ), "plugin_data", "video", os.path.basename( os.getcwd() ) )

    def __init__( self ):
        # parse argv for any params
        params = self._parse_argv()
        # get users preference
        self._get_settings()
        # sort methods
        sortmethods = ( xbmcplugin.SORT_METHOD_LABEL, xbmcplugin.SORT_METHOD_SIZE, xbmcplugin.SORT_METHOD_DATE,
                                 xbmcplugin.SORT_METHOD_VIDEO_RUNTIME, xbmcplugin.SORT_METHOD_VIDEO_YEAR, xbmcplugin.SORT_METHOD_GENRE,
                                 xbmcplugin.SORT_METHOD_MPAA_RATING, xbmcplugin.SORT_METHOD_STUDIO, )
        # initialize buttons, we only need to set these once
        buttons = None
        # fetch items
        if ( params[ "category" ] is None ):
            # skin buttons
            buttons = ( 21866,
                                ( 
                                    ( "Recently Added", "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"recent: Recently Added" ) ), ), None, None, None, ),
                                    ( 135, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"genres" ) ), ), None, None, None, ),
                                    ( 20388, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"studios" ) ), ), None, None, None, ),
                                    ( 20348, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"directors" ) ), ), None, None, None, ),
                                    ( 344, "Container.Update(%s?category=%s,replace)" % ( sys.argv[ 0 ], urllib.quote_plus( repr( u"actors" ) ), ), None, None, None, ),
                                ),
                            )
        # set category
        else:
            self.PluginCategory = params[ "category" ].replace( "genres", xbmc.getLocalizedString( 135 ) ).replace( "studios", xbmc.getLocalizedString( 20388 ) ).replace( "directors", xbmc.getLocalizedString( 20348 ) ).replace( "actors", xbmc.getLocalizedString( 344 ) ).replace( "recent: ", "" )
        # helper functions
        self.MediaWindow = MediaWindow( int( sys.argv[ 1 ] ), category=self.PluginCategory, content="movies", sortmethods=sortmethods, fanart=( self.settings[ "fanart_image" ], self.Fanart, ), buttons=buttons )
        # fetch videos
        self.MediaWindow.end( self.fetch_trailers( params[ "category" ] ) )

    def _parse_argv( self ):
        try:
            # parse sys.argv for params and return result
            params = dict( urllib.unquote_plus( arg ).split( "=" ) for arg in sys.argv[ 2 ][ 1 : ].split( "&" ) )
            # we need to do this as quote_plus and unicode do not work well together
            params[ "category" ] = eval( params[ "category" ] )
        except:
            # no params passed
            params = { "category": None }
        # return params
        return params

    def _get_settings( self ):
        self.settings = {}
        self.PluginCategory = ( xbmc.getLocalizedString( 30800 ), xbmc.getLocalizedString( 30801 ), xbmc.getLocalizedString( 30802 ), xbmc.getLocalizedString( 30803 ), )[ int( xbmcplugin.getSetting( "trailer_quality" ) ) ]
        self.Fanart = ( "standard", "480p", "720p", "1080p", )[ int( xbmcplugin.getSetting( "trailer_quality" ) ) ]
        self.settings[ "trailer_quality" ] = int( xbmcplugin.getSetting( "trailer_quality" ) )
        self.settings[ "trailer_hd_only" ] = ( xbmcplugin.getSetting( "trailer_hd_only" ) == "true" )
        ##self.settings[ "poster" ] = ( xbmcplugin.getSetting( "poster" ) == "true" )
        self.settings[ "rating" ] = int( xbmcplugin.getSetting( "rating" ) )
        self.settings[ "not_rated_rating" ] = int( xbmcplugin.getSetting( "not_rated_rating" ) )
        self.settings[ "download_path" ] = xbmcplugin.getSetting( "download_path" )
        self.settings[ "play_mode" ] = int( xbmcplugin.getSetting( "play_mode" ) )
        if ( self.settings[ "play_mode" ] == 2 and self.settings[ "download_path" ] == "" ):
            self.settings[ "play_mode" ] = 1
        self.settings[ "use_title" ] = ( xbmcplugin.getSetting( "use_title" ) == "true" and self.settings[ "play_mode" ] == 2 )
        self.settings[ "use_trailer" ] = ( xbmcplugin.getSetting( "use_trailer" ) == "true" and self.settings[ "play_mode" ] == 2 )
        self.settings[ "create_nfo" ] = ( xbmcplugin.getSetting( "create_nfo" ) == "true" )
        self.settings[ "play_existing" ] = ( xbmcplugin.getSetting( "play_existing" ) == "true" and self.settings[ "download_path" ] != "" )
        self.settings[ "fanart_image" ] = xbmcplugin.getSetting( "fanart_image" )

    def fetch_trailers( self, category=None ):
        # spam log file
        LOG( ">>> fetch_trailers(category: %s, rating: %s, quality: %s)" % ( repr( category ), ( "G", "PG", "PG-13", "R", "NC-17", "No Limit", )[ self.settings[ "rating" ] ], self.Fanart, ), heading=True )
        ok = False
        # initialize trailers list
        trailers = []
        # fetch source
        xmlSource = self._get_xml_source()
        # parse source and add our items
        if ( xmlSource ):
            ok = self._parse_xml_source( xmlSource, category )
        # spam log file
        LOG( "<<< fetch_trailers()", heading=True )
        # return result
        return ok

    def _get_xml_source( self ):
        try:
            xmlSource = []
            # grab all xml sources
            for source in ( "current.xml", "current_480p.xml", "current_720p.xml", ):
                # set path and url
                base_path = os.path.join( self.BASE_CURRENT_SOURCE_PATH, source )
                base_url = self.BASE_CURRENT_URL % ( source, )
                # get the source files date if it exists
                try: date = os.path.getmtime( base_path )
                except: date = 0
                # we only refresh if it's been more than a day, 24hr * 60min * 60sec
                refresh = ( ( time.time() - ( 24 * 60 * 60 ) ) >= date )
                # only fetch source if it's been more than a day
                if ( refresh ):
                    # open url
                    usock = urllib.urlopen( base_url )
                else:
                    # open path
                    usock = open( base_path, "r" )
                # read source
                xmlSource += [ usock.read() ]
                # close socket
                usock.close()
                # save the xmlSource for future parsing
                if ( refresh ):
                    ok = self._save_xml_source( xmlSource[ -1 ], base_path )
            # return source
            return xmlSource
        except Exception, e:
            # oops, notify user what error occurred
            LOG( str( e ), xbmc.LOGERROR )
            # error so return empty string
            return []
class Trailers(object):
    """Trailers Class: List trailers and categories

    """

    def __init__(self, *args, **kwargs):
        # set our passed addon object
        self.m_addon = kwargs["addon"]
        # set database object
        self.m_database = Database(addon=self.m_addon)
        # setup
        self._setup()
        # get default category
        category, categories = self._set_category(
            self.m_addon.params.get("category", None)
        )
        # media window helper functions
        self.media_window = MediaWindow(
            hId=self.m_addon.params["handle"],
            addon=self.m_addon,
            content=["movies", "addoncategories"][categories],
            links=self._get_quick_links(category)
        )
        # fetch list and end directory
        self.media_window.end(
            succeeded=self._set_list(category),
            cacheToDisc=categories
        )
        # close database
        self.m_database.close()

    def _setup(self):
        # categories
        self.root_category_list = [
            u"recent: ",
            u"studio",
            u"director",
            u"writer",
            u"actor",
            u"genre",
            u"showtimes: ",
            u"hd: ",
            u"intheaters: ",
            u"comingsoon: ",
            u"downloaded: ",
            u"downloadedrecently: ",
            u"rootlist"
        ]

    def _set_category(self, category):
        search = u""
        if (self.m_addon.params.has_key("search")):
            search = u" - ({search})".format(
                search=self.m_addon.params["search"]
            )
        # if no category, get default
        if (category is None):
            # set default category
            category = self.root_category_list[
                self.m_addon.getSetting("startup.category")
            ]
            # set default subcategory
            if (self.m_addon.getSetting("startup.category") in [1, 2, 3, 4, 5] and
                self.m_addon.getSetting("startup.category.text")):
                    category = u"{category}: {subcategory}".format(
                        category=category,
                        subcategory=self.m_addon.getSetting("startup.category.text")
                    )
        # localize search category
        self.m_addon.setSetting(
            id="plugin.category",
            value=category.replace(
                u"search", self.m_addon.getLocalizedString(30730)
            ) + search
        )
        # iterate thru and localize category
        for idx, cat in enumerate(self.root_category_list):
            self.m_addon.setSetting(
                id="plugin.category",
                value=self.m_addon.getSetting("plugin.category").replace(
                    cat, self.m_addon.getLocalizedString(30111 + idx)
                )
            )

        return (
            category,
            category in
            [u"studio", u"director", u"writer", u"actor", u"genre", u"rootlist"]
        )

    def _get_quick_links(self, category):
        # set search quick link
        if (self.m_addon.getSetting("search.current.list")):
            search = u"XBMC.RunScript({addon},search={search}&category={category})".format(
                addon=self.m_addon.getAddonInfo("Id"),
                search=quote_plus(repr(self.m_addon.params.get("search", u""))),
                category=quote_plus(repr(category))
            )
        else:
            search = 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"")))
            )
        # set universal links
        links = [
            self.m_addon.getLocalizedString(30502),
            [],
            search,
            u"XBMC.RunScript({addon},task='configure')".format(
                addon=self.m_addon.getAddonInfo("Id")
            )
        ]
        # loop thru and add preferred button
        for id_ in range(1, 6):
            # get quick link category
            category = int(self.m_addon.getSetting(u"quick.link{id}".format(id=id_)))
            # if not disabled add quick link
            if (category > 0):
                links[1] += [[
                    self.m_addon.getLocalizedString(30110 + category),
                    "Container.Update({url}?category={category},replace)".format(
                        url=self.m_addon.params["path"],
                        category=quote_plus(repr(self.root_category_list[category - 1]))
                    ),
                    None,
                    None
                ]]

        return links

    def _set_list(self, category):
        # update source if necessary FIXME: is this where we want this
        self._update_source()
        # root list
        if (category == u"rootlist"):
            ok = self._get_root_list()
        # scraper dependent lists
        else:
            # categories
            if (category in
                [u"studio", u"director", u"writer", u"actor", u"genre"]):
                    ok = self._get_categories(category)
            # trailer listing
            else:
                ok = self._get_movies(category)

        return ok

    def _update_source(self):
        # check if scraper exists and source date
        record = self.m_database.scraper(self.m_addon.getSetting("trailer.scraper"))
        # update source if no scraper info or if user preference to update on first run
        if ((record is not None and
                self.m_addon.getSetting("source.schedule.when") == 0 and
                self.m_addon.getSetting("source.last.checked") < today(format_="%Y-%m-%d") and
                get_refresh(date=record[1], expires=record[2]))
            or record is None
            ):
                print "UPDATING SOURCE................................................................"
                # set new refresh date
                self.m_addon.setSetting(
                    "source.last.checked",
                    today(format_="%Y-%m-%d")
                )
                # import preferred scraper and fetch new trailers
                exec "from resources.scrapers.trailers import {scraper} as scraper".format(
                    scraper=self.m_addon.getSetting("trailer.scraper").replace(" - ", "_").replace(" ", "_").lower()
                )
                # update source
                scraper.Scraper(self.m_addon, self.m_database).update()

    def _get_root_list(self):
        # set thumbs
        thumbs = [
            "DefaultRecentlyAddedMovies.png",
            "DefaultFolder.png",
            "DefaultFolder.png",
            "DefaultFolder.png",
            "DefaultFolder.png",
            "DefaultMusicArtists.png",
            "DefaultFolder.png",
            "DefaultMovies.png",
            "DefaultMovies.png",
            "DefaultMovies.png",
            "DefaultMovies.png",
            "DefaultRecentlyAddedMovies.png"
        ]
        # initialize out list
        categories = []
        # iterate thru and create our category list, skipping rootlist
        for idx, cat in enumerate(self.root_category_list[:-1]):
            # only include category if enabled and trailers exist for category
            if (self.m_addon.getSetting("category{idx}".format(idx=idx + 1,)) == True and self.m_database.check_category(cat) is not None):
                categories += [[self.m_addon.getLocalizedString(30111 + idx), thumbs[idx], None, quote_plus(repr(self.root_category_list[idx]))]]

        # add categories to our media list
        return self.add_categories(categories)

    def _get_categories(self, category):
        # fetch records
        records = self.m_database.get_categories(category)
        # initialize out list
        categories = []
        # iterate thru and create our category list
        for record in records:
            categories += [[record[1], u"Default{category}.png".format(category=category.title()), None, quote_plus(repr(u"{category}: {subcategory}".format(category=category, subcategory=record[1])))]]

        # add categories to our media list
        return self.add_categories(categories)

    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 _get_movies(self, category):
        # showtimes list
        if (category.startswith("showtimes:")):
            print "FETCH showtimes and set list"
            ####################
            from resources.scrapers.showtimes.googleapi import Scraper
            movies = Scraper.fetch_movies()
            return True
        else:
            # add movies to our media list
            return self.add_movies(self.m_database.get_movies(category, self.m_addon.params.get("search", None)), category)

    def add_movies(self, records, category):
        # get our media item
        dirItem = DirectoryItem()
        # FIXME: queue and now playing menu items
        # universal context menu items for trailer lists
        # #dirItem.addContextMenuItem( xbmc.getLocalizedString( 13347 ), "XBMC.Action(Queue)" )
        dirItem.addContextMenuItem(self.m_addon.getLocalizedString(30903), u"XBMC.Action(Info)")
        # #dirItem.addContextMenuItem( xbmc.getLocalizedString( 13350 ), "XBMC.ActivateWindow(10028)" )
        dirItem.addContextMenuItem(xbmc.getLocalizedString(24020), u"XBMC.RunScript({addon},task='configure')".format(addon=self.m_addon.getAddonInfo("Id")))
        #print ["PSPSPSPSPSPSPSPS", self.m_addon.params]
        dirItem.addContextMenuItem(xbmc.getLocalizedString(137), u"XBMC.RunScript({addon},search={search}&category={category})".format(addon=self.m_addon.getAddonInfo("Id"), search=quote_plus(repr(self.m_addon.params.get("search", u""))), category=quote_plus(repr([u"", category][self.m_addon.getSetting("search.current.list")]))))
        # initialize our movies list
        movies = []
        # video and audio stream details used by some skins to display flagging
        stream_details = {
            "video": {
                "Standard": {"codec": "h264", "aspect": 1.78, "width": 720, "height": 480},
                "480p": {"codec": "h264", "aspect": 1.78, "width": 720, "height": 480},
                "720p": {"codec": "h264", "aspect": 1.78, "width": 1280, "height": 720},
                "1080p": {"codec": "h264", "aspect": 1.78, "width": 1920, "height": 1080}
            },
            "audio": {
                "Standard": {"codec": "aac", "language": "en", "channels": 2},
                "480p": {"codec": "aac", "language": "en", "channels": 2},
                "720p": {"codec": "aac", "language": "en", "channels": 2},
                "1080p": {"codec": "aac", "language": "en", "channels": 2}
            }
        }
        # iterate thru and set trailer
        for movie in records:
            # set downloaded based on all trailers available
            downloaded = (
                sum([
                     tlr in movie[27] for tlr in movie[25].split(",")
                     if (movie[27] is not None)
                ]) == len(movie[25].split(","))
            )
            # set playcount based on all trailers available
            playcount = int(
                sum([
                     tlr in movie[26] for tlr in movie[25].split(",")
                     if (movie[26] is not None)
                ]) == len(movie[25].split(","))
            )

            # set URL and play parameter
            dirItem.url = u"{url}?play={id}".format(
                url=self.m_addon.params["path"],
                id=movie[0]
            )

            # Play Trailer
            context = [(
                self.m_addon.getLocalizedString(30902),
                u"XBMC.RunPlugin({url})".format(url=dirItem.url),
            )]
            # Download & Play
            if (self.m_addon.getSetting("trailer.play.mode") == 0 and
                sum([tlr in movie[27] for tlr in movie[25].split(",")
                if (movie[27] is not None)]) < len(movie[24].split(","))):
                    context += [(
                        self.m_addon.getLocalizedString(30901),
                        u"XBMC.RunPlugin({url}&download=True)".format(
                            url=dirItem.url
                        ),
                    )]
            # Check Showtimes
            context += [(
                self.m_addon.getLocalizedString(30900),
                u"XBMC.RunScript({id},showtimes={title})".format(
                    id=self.m_addon.getAddonInfo("Id"),
                    title=quote_plus(repr(movie[1].split(" | ")[0])),
                )
            )]

            # overlay
            overlay = [
                xbmcgui.ICON_OVERLAY_UNWATCHED,
                xbmcgui.ICON_OVERLAY_WATCHED
            ][playcount]

            # tagline
            tagline = [
                "",
                "In Theaters {date}".format(
                    date=format_date(movie[4])
                )
            ][movie[4] != ""]

            # year
            year = int(movie[4][: 4] or 0)

            # format duration, sum of all available trailers
            # #duration = "{0:1.0f}:{1:02.0f}".format(*divmod(movie[23], 60))#movie[15]

            # set proper date for sorting, we use downloaded date for downloaded lists
            # and release date for in theaters and coming soon lists
            if (category.startswith("downloaded")):
                date = movie[21].split(" ")[0]
            elif (category.startswith("intheaters:") or category.startswith("comingsoon:")):
                date = movie[4]
            else:
                date = movie[16]

            # set our listitem
            dirItem.listitem = xbmcgui.ListItem(
                movie[1].split(" | ")[-1],
                iconImage="DefaultVideo.png",
                thumbnailImage="{url}|User-Agent={ua}".format(
                    url=movie[11],
                    ua=quote_plus(movie[30])
                )
            )
            # set info
            dirItem.listitem.setInfo("video", {
                "Count": movie[0],
                "PlayCount": playcount,
                "SortTitle": movie[1].split(" | ")[0],
                "Title": u"{downloaded}{title}{trailers}".format(
                    downloaded=[u"", u"* "][downloaded],
                    title=movie[1].split(" | ")[-1],
                    trailers=["", " - ({trailers})".format(
                            trailers=len(movie[24].split(","))
                        )
                    ][len(movie[24].split(",")) > 1]
                ),
                "MPAA": movie[2],
                "Studio": movie[3],
                "Date": "{day}-{month}-{year}".format(
                    day=date[8 :],
                    month=date[5 : 7],
                    year=date[: 4]
                ),
                "Year": year,
                "Director": movie[6],
                "Writer": movie[7],
                "Plot": movie[8] or "No plot available",
                "Cast": movie[9].split(" / "),
                "Genre": movie[10],
                "TagLine": tagline,
                "Size": movie[17],
                "lastplayed": movie[20] or "",
                "Overlay": overlay
            })
            # set stream details
            stream_details["video"][movie[14]]["duration"] = movie[23]
            dirItem.listitem.addStreamInfo("video", stream_details["video"][movie[14]])
            dirItem.listitem.addStreamInfo("audio", stream_details["audio"][movie[14]])
            # set additional properties
            dirItem.listitem.setProperty("ReleaseDate", format_date(movie[4]))
            dirItem.listitem.setProperty("Copyright", movie[5])
            dirItem.listitem.setProperty("AvailableTrailers", movie[24].replace(",", " / "))
            ###############################################
            # dirItem.listitem.setProperty("fanart_image", self.m_addon.getSetting("fanart")[0])
            ###############################################
            # dirItem.listitem.setProperty("Poster", movie[11])
            # used for video info dialog to search on trailers not database
            # dirItem.listitem.setProperty("Addon.Actor", movie[9].split(" / ")[0])
            # dirItem.listitem.setProperty("Addon.OnClick", "XBMC.RunScript(%s,search=%s)" % (self.m_addon.getAddonInfo("Id"), quote_plus(movie[9].split(" / ")[0].encode("UTF-8")),))
            # add context menu items to listitem with replaceItems = True so only ours show
            dirItem.listitem.addContextMenuItems(dirItem.context + context, replaceItems=True)
            # add the movie to our movie list
            movies += [(dirItem.url, dirItem.listitem, dirItem.isFolder,)]

        # add movies to our media list
        return self.media_window.addItems(movies)