def __init__(self, session, params={}):
        # params: vk_title, movie_title
        self.session = session
        Screen.__init__(self, session)
        
        self.params = params
        self.params['login']    = config.plugins.iptvplayer.opensuborg_login.value
        self.params['password'] = config.plugins.iptvplayer.opensuborg_password.value
        
        self.searchPattern = CParsingHelper.getNormalizeStr( self.params.get('movie_title', '') )
        
        # try to guess season and episode number
        try:
            tmp = CParsingHelper.getSearchGroups(self.searchPattern + ' ', 's([0-9]+?)e([0-9]+?)[^0-9]', 2)
            self.episodeData = {'season': int(tmp[0]), 'episode':int(tmp[1])}
        except:
            self.episodeData = {'season':-1, 'episode':-1}

        self.onShown.append(self.onStart)
        self.onClose.append(self.__onClose)
        
        self.subProvider = OpenSubOrgProvider()
        
        self["title"]         = Label(" ")
        self["console"]       = Label(" ")
        
        self["label_red"]     = Label(_("Cancel"))
        self["label_yellow"]  = Label(_("Move group"))
        self["label_green"]   = Label(_("Apply"))
        
        self["icon_red"]     = Cover3()
        self["icon_yellow"]  = Cover3()
        self["icon_green"]   = Cover3()
        
        self["list"] = IPTVMainNavigatorList()
        self["list"].connectSelChanged(self.onSelectionChanged)
        
        self["actions"] = ActionMap(["ColorActions", "SetupActions", "WizardActions", "ListboxActions"],
            {
                "cancel": self.keyExit,
                "ok"    : self.keyOK,
                "red"   : self.keyRed,
                "yellow": self.keyYellow,
                "green" : self.keyGreen,
            }, -2)
        
        self.iconPixmap = {}
        for icon in ['red', 'yellow', 'green']:
            self.iconPixmap[icon] = LoadPixmap(GetIconDir(icon+'.png'))
            
        self.movieTitle = ''
        self.stackList  = []
        self.stackItems = []
        
        self.defaultLanguage = GetDefaultLang()
    
        self.listMode = False
        self.downloadedSubFilePath = ''
        self.loginPassed = False
        self.tmpItem = None
    def __init__(self, session, params={}):
        # params: vk_title, movie_title
        self.session = session
        Screen.__init__(self, session)

        self.params = params
        self.params['login'] = config.plugins.iptvplayer.opensuborg_login.value
        self.params[
            'password'] = config.plugins.iptvplayer.opensuborg_password.value

        self.searchPattern = CParsingHelper.getNormalizeStr(
            self.params.get('movie_title', ''))

        # try to guess season and episode number
        try:
            tmp = CParsingHelper.getSearchGroups(self.searchPattern + ' ',
                                                 's([0-9]+?)e([0-9]+?)[^0-9]',
                                                 2)
            self.episodeData = {'season': int(tmp[0]), 'episode': int(tmp[1])}
        except:
            self.episodeData = {'season': -1, 'episode': -1}

        self.onShown.append(self.onStart)
        self.onClose.append(self.__onClose)

        self.subProvider = OpenSubOrgProvider()

        self["title"] = Label(" ")
        self["console"] = Label(" ")

        self["label_red"] = Label(_("Cancel"))
        self["label_yellow"] = Label(_("Move group"))
        self["label_green"] = Label(_("Apply"))

        self["icon_red"] = Cover3()
        self["icon_yellow"] = Cover3()
        self["icon_green"] = Cover3()

        self["list"] = IPTVMainNavigatorList()
        self["list"].connectSelChanged(self.onSelectionChanged)

        self["actions"] = ActionMap(
            [
                "ColorActions", "SetupActions", "WizardActions",
                "ListboxActions"
            ], {
                "cancel": self.keyExit,
                "ok": self.keyOK,
                "red": self.keyRed,
                "yellow": self.keyYellow,
                "green": self.keyGreen,
            }, -2)

        self.iconPixmap = {}
        for icon in ['red', 'yellow', 'green']:
            self.iconPixmap[icon] = LoadPixmap(GetIconDir(icon + '.png'))

        self.movieTitle = ''
        self.stackList = []
        self.stackItems = []

        self.defaultLanguage = GetDefaultLang()

        self.listMode = False
        self.downloadedSubFilePath = ''
        self.loginPassed = False
        self.tmpItem = None
class IPTVSubDownloaderWidget(Screen):
    sz_w = getDesktop(0).size().width() - 190
    sz_h = getDesktop(0).size().height() - 195
    if sz_h < 500: sz_h += 4
    skin = """
        <screen name="IPTVSubDownloaderWidget" position="center,center" title="%s" size="%d,%d">
         <widget name="icon_red"    position="5,9"   zPosition="4" size="30,30" transparent="1" alphatest="on" />
         <widget name="icon_yellow" position="180,9" zPosition="4" size="30,30" transparent="1" alphatest="on" />
         <widget name="icon_green"  position="355,9" zPosition="4" size="30,30" transparent="1" alphatest="on" />
         
         <widget name="label_red"     position="45,9"  size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         <widget name="label_yellow"  position="220,9" size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         <widget name="label_green"   position="395,9" size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         
         <widget name="list"  position="5,80"  zPosition="2" size="%d,%d" scrollbarMode="showOnDemand" transparent="1"  backgroundColor="#00000000" />
         <widget name="title" position="5,47"  zPosition="1" size="%d,23" font="Regular;20"            transparent="1"  backgroundColor="#00000000"/>
         
         <widget name="console"      position="10,%d"   zPosition="2" size="%d,160" valign="center" halign="center"   font="Regular;24" transparent="0" foregroundColor="white" backgroundColor="black"/>
        </screen>""" %(
            _("Subtitles downloader"),
            sz_w, sz_h, # size
            sz_w - 10, sz_h - 105, # size list
            sz_w - 135, # size title
            (sz_h - 160)/2, sz_w - 20, # console
            )
            
    def __init__(self, session, params={}):
        # params: vk_title, movie_title
        self.session = session
        Screen.__init__(self, session)
        
        self.params = params
        self.params['login']    = config.plugins.iptvplayer.opensuborg_login.value
        self.params['password'] = config.plugins.iptvplayer.opensuborg_password.value
        
        self.searchPattern = CParsingHelper.getNormalizeStr( self.params.get('movie_title', '') )
        
        # try to guess season and episode number
        try:
            tmp = CParsingHelper.getSearchGroups(self.searchPattern + ' ', 's([0-9]+?)e([0-9]+?)[^0-9]', 2)
            self.episodeData = {'season': int(tmp[0]), 'episode':int(tmp[1])}
        except:
            self.episodeData = {'season':-1, 'episode':-1}

        self.onShown.append(self.onStart)
        self.onClose.append(self.__onClose)
        
        self.subProvider = OpenSubOrgProvider()
        
        self["title"]         = Label(" ")
        self["console"]       = Label(" ")
        
        self["label_red"]     = Label(_("Cancel"))
        self["label_yellow"]  = Label(_("Move group"))
        self["label_green"]   = Label(_("Apply"))
        
        self["icon_red"]     = Cover3()
        self["icon_yellow"]  = Cover3()
        self["icon_green"]   = Cover3()
        
        self["list"] = IPTVMainNavigatorList()
        self["list"].connectSelChanged(self.onSelectionChanged)
        
        self["actions"] = ActionMap(["ColorActions", "SetupActions", "WizardActions", "ListboxActions"],
            {
                "cancel": self.keyExit,
                "ok"    : self.keyOK,
                "red"   : self.keyRed,
                "yellow": self.keyYellow,
                "green" : self.keyGreen,
            }, -2)
        
        self.iconPixmap = {}
        for icon in ['red', 'yellow', 'green']:
            self.iconPixmap[icon] = LoadPixmap(GetIconDir(icon+'.png'))
            
        self.movieTitle = ''
        self.stackList  = []
        self.stackItems = []
        
        self.defaultLanguage = GetDefaultLang()
    
        self.listMode = False
        self.downloadedSubFilePath = ''
        self.loginPassed = False
        self.tmpItem = None
        
    def __onClose(self):
        self["list"].disconnectSelChanged(self.onSelectionChanged)
        self.subProvider.terminate()
        self.tmpItem = None
        
    def loadIcons(self):
        try:
            for icon in self.iconPixmap:
                self['icon_'+icon].setPixmap(self.iconPixmap[icon])
        except: printExc()
        
    def hideButtons(self, buttons=['red', 'yellow', 'green']):
        try:
            for button in buttons:
                self['icon_'+button].hide()
                self['label_'+button].hide()
        except: printExc()
        
    def showButtons(self, buttons=['red', 'yellow', 'green']):
        try:
            for button in buttons:
                self['icon_'+button].show()
                self['label_'+button].show()
        except: printExc()
    
    def onStart(self):
        self.onShown.remove(self.onStart)
        self.setTitle( _("Subtitles provider: %s") % self.subProvider.getName() )
        self.loadIcons()
        self.doLogin()
        
    def setListMode(self, sts=False):
        if False == sts:
            self['list'].hide()
            self["title"].hide()
            self.hideButtons()
            self.showButtons(['red'])
        else:
            self["console"].hide()
            self["console"].setText(" ")
            
        self.listMode = sts
            
    def doLogin(self):
        self.loginPassed = False
        self.setListMode(False)
        if '' != self.params.get('login', ''):
            user, password = self.params.get('login', ''), self.params.get('password', '')
            self["console"].setText(_('Login user "%s" into %s') % (self.params.get('login', ''), self.subProvider.getName()))
        else: 
            user, password = '', ''
            self["console"].setText(_('Request token from %s') % self.subProvider.getName())
        self["console"].show()
        
        self.subProvider.doLogin(self.doLoginCallback, user, password, self.defaultLanguage)
        
    def doLoginCallback(self, sts):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        else:
            self.loginPassed = True
            self.session.openWithCallback(self.getMovieTitleCallBack, VirtualKeyBoard, title=self.params.get('vk_title', _("Confirm title of the movie")), text=self.searchPattern)
        
        
    def getMovieTitleCallBack(self, title):
        if isinstance(title, basestring): 
            self.searchPattern = title
            self.movieTitle = title
            self.doSearchMovie()
        else:
            self.close(None)
    
    def doSearchMovie(self):
        self.setListMode(False)
        self.stackItems = []
        self.stackList  = []
        self["console"].setText(_('Search for movie "%s"') % self.movieTitle)
        self["console"].show()
        self.subProvider.doSearchMovie(self.doSearchMovieCallback, self.movieTitle)
        
    def doSearchMovieCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        elif len(data):
            self.stackList.append({'type':'movie', 'list':data})
            self.displayList()
        else:
            self["console"].setText(_('Movie "%s" has not been found.') % self.movieTitle)
            
    def doGetItemType(self, item):
        self.setListMode(False)
        self["console"].setText(_('Get item type.'))
        self["console"].show()
        self.tmpItem = item
        self.subProvider.doGetItemType(self.doGetItemTypeCallback, item)
    
    def doGetItemTypeCallback(self, sts, type='movie'):
        if not sts or type != 'series':
            self.doGetLanguageForSubtitle()
        else:
            self.doGetEpisodes(self.tmpItem)
            
    def doGetEpisodes(self, item):
        self.setListMode(False)
        self["console"].setText(_('Get episodes list.'))
        self["console"].show()
        self.subProvider.doGetEpisodes(self.doGetEpisodesCallback, item, self.episodeData)
        
    def doGetEpisodesCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        elif len(data):
            self.stackList.append({'type':'episode', 'list':data})
            self.displayList()
        else:
            self["console"].setText(_('An unknown error has occurred.'))
    
    def doGetLanguageForSubtitle(self):
        self.setListMode(False)
        self["console"].setText(_('Get supported languages list.'))
        self["console"].show()
        self.subProvider.doGetLanguages(self.doGetLanguageForSubtitleCallback, self.defaultLanguage)
        
    def doGetLanguageForSubtitleCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        elif len(data):
            self.stackList.append({'type':'lang', 'list':data})
            self.displayList()
        else:
            self["console"].setText(_('An unknown error has occurred.'))
            
    def doSearchSubtitle(self, item, lang):
        self.setListMode(False)
        self["console"].setText(_('Search for subitile for "%s"') % item.name)
        self["console"].show()
        self.subProvider.doSearchSubtitle(self.doSearchSubtitleCallback, item.privateData, lang)
        
    def doSearchSubtitleCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        elif len(data):
            self.stackList.append({'type':'sub', 'list':data})
            self.displayList()
        else:
            self["console"].setText(_('Subtitles not found.'))
            
    def doDownloadSubtitle(self, item):
        self.setListMode(False)
        self["console"].setText(_('Download subtitle "%s"') % item.name)
        self["console"].show()
        tmpDir = GetTmpDir()
        subDir = GetSubtitlesDir() 
        self.subProvider.doDowanloadSubtitle(self.doDownloadSubtitleCallback, item.privateData, tmpDir, subDir)
        
    def doDownloadSubtitleCallback(self, sts, fileName):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText( _('Error occurs.\n[%s]') % (sts['message']) )
        elif len(fileName) > 0:
            self["console"].setText(_('Subtitles downloaded successfully. [%s]') % fileName)
            self.downloadedSubFilePath = fileName
            self.showButtons(['green'])
        else:
            self["console"].setText(_('An unknown error has occurred.'))

    def displayList(self, activeIdx=0):
        list = []
        tmpList = self.stackList[-1]['list']
        type    = self.stackList[-1]['type']
        
        iconType = CDisplayListItem.TYPE_CATEGORY
        if type == 'movie':
            self["title"].setText(_("Select movie"))
        if type == 'episode':
            self["title"].setText(_("Select episode"))
        elif type == "lang":
            self["title"].setText(_("Select language"))
        elif type == "sub":
            iconType = CDisplayListItem.TYPE_ARTICLE
            self["title"].setText(_("Select subtitles to download"))
        
        self["title"].show()
        
        for item in tmpList:
            dItem = CDisplayListItem(name = clean_html(item['title']), type=iconType)
            dItem.privateData = item['private_data']
            list.append( (dItem,) )
        self["list"].setList(list)
        self["list"].show()
        try: self["list"].moveToIndex(activeIdx)
        except: pass
        
        self.setListMode(True)
        
    def onSelectionChanged(self):
        pass
        
    def keyExit(self):
        printDBG(">>>>>>>>>>>>>>>>>>>>>>>>> len(self.stackList)[%d] self.listMode[%r]" % (len(self.stackList), self.listMode))
        if False == self.listMode:
            self.subProvider.cancelRequest()
            self.setListMode(False)
            if len(self.stackItems):
                activeIdx = self.stackItems[-1]['idx']
                del self.stackItems[-1]
                self.displayList(activeIdx)
                return
            elif self.loginPassed:
                self.doLoginCallback(True)
                return
        elif 1 < len(self.stackList):
            activeIdx = self.stackItems[-1]['idx']
            del self.stackItems[-1]
            del self.stackList[-1]
            self.displayList(activeIdx)
            return
        elif self.loginPassed:
            self.doLoginCallback(True)
            return
        self.close(None)
            
    def keyOK(self):
        if False == self.listMode: return
        printDBG(">>>>>>>>>>>>>>>>>>>>>>>>> len(self.stackList)[%d]" % (len(self.stackList)))
        idx, item = self.getSelectedItem()
        if None != item:
            type = self.stackList[-1]['type']
            printDBG(">>>>>>>>>>>>>>>>>>>>>>>>> type[%s]" % type);
            self.stackItems.append({'item':item, 'idx':idx, 'type':type})
            if type == 'episode':
                self.doGetLanguageForSubtitle()
            elif type == 'movie':
                self.doGetItemType(item.privateData)
            elif type == 'lang':
                self.doSearchSubtitle(self.stackItems[-2]['item'], item.privateData)
            elif type == 'sub':
                self.doDownloadSubtitle(item)
            else:
                printExc(type)
            
    def keyRed(self):
        self.close(None)
    
    def keyYellow(self):
        pass
        
    def keyGreen(self):
        try: 
            if self["icon_green"].visible:
                track = {'title':'', 'lang':'', 'path':self.downloadedSubFilePath}
                for item in self.stackItems:
                    printDBG(">>>>>>>>>> item[%s]" % item)
                    type = item['type']
                    data = item['item']
                    if type == 'lang':
                        track['lang'] = data.privateData.get('SubLanguageID', '')
                    elif type == 'sub':
                        track['title'] = data.name
                        track['id']    = data.privateData.get('IDSubtitle', '')
                self.close(track)
        except: printExc()
    
    def getSelectedItem(self):
        try: idx = self["list"].getCurrentIndex()
        except: idx = 0
        sel = None
        try: 
            if self["list"].visible:
                sel = self["list"].l.getCurrentSelection()[0]
                if None != sel:
                    return idx, sel
        except: 
            printExc()
            sel = None
        return -1, None
class IPTVSubDownloaderWidget(Screen):
    sz_w = getDesktop(0).size().width() - 190
    sz_h = getDesktop(0).size().height() - 195
    if sz_h < 500: sz_h += 4
    skin = """
        <screen name="IPTVSubDownloaderWidget" position="center,center" title="%s" size="%d,%d">
         <widget name="icon_red"    position="5,9"   zPosition="4" size="30,30" transparent="1" alphatest="on" />
         <widget name="icon_yellow" position="180,9" zPosition="4" size="30,30" transparent="1" alphatest="on" />
         <widget name="icon_green"  position="355,9" zPosition="4" size="30,30" transparent="1" alphatest="on" />
         
         <widget name="label_red"     position="45,9"  size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         <widget name="label_yellow"  position="220,9" size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         <widget name="label_green"   position="395,9" size="175,27" zPosition="5" valign="center" halign="left" backgroundColor="black" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
         
         <widget name="list"  position="5,80"  zPosition="2" size="%d,%d" scrollbarMode="showOnDemand" transparent="1"  backgroundColor="#00000000" />
         <widget name="title" position="5,47"  zPosition="1" size="%d,23" font="Regular;20"            transparent="1"  backgroundColor="#00000000"/>
         
         <widget name="console"      position="10,%d"   zPosition="2" size="%d,160" valign="center" halign="center"   font="Regular;24" transparent="0" foregroundColor="white" backgroundColor="black"/>
        </screen>""" % (
        _("Subtitles downloader"),
        sz_w,
        sz_h,  # size
        sz_w - 10,
        sz_h - 105,  # size list
        sz_w - 135,  # size title
        (sz_h - 160) / 2,
        sz_w - 20,  # console
    )

    def __init__(self, session, params={}):
        # params: vk_title, movie_title
        self.session = session
        Screen.__init__(self, session)

        self.params = params
        self.params['login'] = config.plugins.iptvplayer.opensuborg_login.value
        self.params[
            'password'] = config.plugins.iptvplayer.opensuborg_password.value

        self.searchPattern = CParsingHelper.getNormalizeStr(
            self.params.get('movie_title', ''))

        # try to guess season and episode number
        try:
            tmp = CParsingHelper.getSearchGroups(self.searchPattern + ' ',
                                                 's([0-9]+?)e([0-9]+?)[^0-9]',
                                                 2)
            self.episodeData = {'season': int(tmp[0]), 'episode': int(tmp[1])}
        except:
            self.episodeData = {'season': -1, 'episode': -1}

        self.onShown.append(self.onStart)
        self.onClose.append(self.__onClose)

        self.subProvider = OpenSubOrgProvider()

        self["title"] = Label(" ")
        self["console"] = Label(" ")

        self["label_red"] = Label(_("Cancel"))
        self["label_yellow"] = Label(_("Move group"))
        self["label_green"] = Label(_("Apply"))

        self["icon_red"] = Cover3()
        self["icon_yellow"] = Cover3()
        self["icon_green"] = Cover3()

        self["list"] = IPTVMainNavigatorList()
        self["list"].connectSelChanged(self.onSelectionChanged)

        self["actions"] = ActionMap(
            [
                "ColorActions", "SetupActions", "WizardActions",
                "ListboxActions"
            ], {
                "cancel": self.keyExit,
                "ok": self.keyOK,
                "red": self.keyRed,
                "yellow": self.keyYellow,
                "green": self.keyGreen,
            }, -2)

        self.iconPixmap = {}
        for icon in ['red', 'yellow', 'green']:
            self.iconPixmap[icon] = LoadPixmap(GetIconDir(icon + '.png'))

        self.movieTitle = ''
        self.stackList = []
        self.stackItems = []

        self.defaultLanguage = GetDefaultLang()

        self.listMode = False
        self.downloadedSubFilePath = ''
        self.loginPassed = False
        self.tmpItem = None

    def __onClose(self):
        self["list"].disconnectSelChanged(self.onSelectionChanged)
        self.subProvider.terminate()
        self.tmpItem = None

    def loadIcons(self):
        try:
            for icon in self.iconPixmap:
                self['icon_' + icon].setPixmap(self.iconPixmap[icon])
        except:
            printExc()

    def hideButtons(self, buttons=['red', 'yellow', 'green']):
        try:
            for button in buttons:
                self['icon_' + button].hide()
                self['label_' + button].hide()
        except:
            printExc()

    def showButtons(self, buttons=['red', 'yellow', 'green']):
        try:
            for button in buttons:
                self['icon_' + button].show()
                self['label_' + button].show()
        except:
            printExc()

    def onStart(self):
        self.onShown.remove(self.onStart)
        self.setTitle(_("Subtitles provider: %s") % self.subProvider.getName())
        self.loadIcons()
        self.doLogin()

    def setListMode(self, sts=False):
        if False == sts:
            self['list'].hide()
            self["title"].hide()
            self.hideButtons()
            self.showButtons(['red'])
        else:
            self["console"].hide()
            self["console"].setText(" ")

        self.listMode = sts

    def doLogin(self):
        self.loginPassed = False
        self.setListMode(False)
        if '' != self.params.get('login', ''):
            user, password = self.params.get('login', ''), self.params.get(
                'password', '')
            self["console"].setText(
                _('Login user "%s" into %s') %
                (self.params.get('login', ''), self.subProvider.getName()))
        else:
            user, password = '', ''
            self["console"].setText(
                _('Request token from %s') % self.subProvider.getName())
        self["console"].show()

        self.subProvider.doLogin(self.doLoginCallback, user, password,
                                 self.defaultLanguage)

    def doLoginCallback(self, sts):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        else:
            self.loginPassed = True
            self.session.openWithCallback(self.getMovieTitleCallBack,
                                          VirtualKeyBoard,
                                          title=self.params.get(
                                              'vk_title',
                                              _("Confirm title of the movie")),
                                          text=self.searchPattern)

    def getMovieTitleCallBack(self, title):
        if isinstance(title, basestring):
            self.searchPattern = title
            self.movieTitle = title
            self.doSearchMovie()
        else:
            self.close(None)

    def doSearchMovie(self):
        self.setListMode(False)
        self.stackItems = []
        self.stackList = []
        self["console"].setText(_('Search for movie "%s"') % self.movieTitle)
        self["console"].show()
        self.subProvider.doSearchMovie(self.doSearchMovieCallback,
                                       self.movieTitle)

    def doSearchMovieCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        elif len(data):
            self.stackList.append({'type': 'movie', 'list': data})
            self.displayList()
        else:
            self["console"].setText(
                _('Movie "%s" has not been found.') % self.movieTitle)

    def doGetItemType(self, item):
        self.setListMode(False)
        self["console"].setText(_('Get item type.'))
        self["console"].show()
        self.tmpItem = item
        self.subProvider.doGetItemType(self.doGetItemTypeCallback, item)

    def doGetItemTypeCallback(self, sts, type='movie'):
        if not sts or type != 'series':
            self.doGetLanguageForSubtitle()
        else:
            self.doGetEpisodes(self.tmpItem)

    def doGetEpisodes(self, item):
        self.setListMode(False)
        self["console"].setText(_('Get episodes list.'))
        self["console"].show()
        self.subProvider.doGetEpisodes(self.doGetEpisodesCallback, item,
                                       self.episodeData)

    def doGetEpisodesCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        elif len(data):
            self.stackList.append({'type': 'episode', 'list': data})
            self.displayList()
        else:
            self["console"].setText(_('An unknown error has occurred.'))

    def doGetLanguageForSubtitle(self):
        self.setListMode(False)
        self["console"].setText(_('Get supported languages list.'))
        self["console"].show()
        self.subProvider.doGetLanguages(self.doGetLanguageForSubtitleCallback,
                                        self.defaultLanguage)

    def doGetLanguageForSubtitleCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        elif len(data):
            self.stackList.append({'type': 'lang', 'list': data})
            self.displayList()
        else:
            self["console"].setText(_('An unknown error has occurred.'))

    def doSearchSubtitle(self, item, lang):
        self.setListMode(False)
        self["console"].setText(_('Search for subitile for "%s"') % item.name)
        self["console"].show()
        self.subProvider.doSearchSubtitle(self.doSearchSubtitleCallback,
                                          item.privateData, lang)

    def doSearchSubtitleCallback(self, sts, data):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        elif len(data):
            self.stackList.append({'type': 'sub', 'list': data})
            self.displayList()
        else:
            self["console"].setText(_('Subtitles not found.'))

    def doDownloadSubtitle(self, item):
        self.setListMode(False)
        self["console"].setText(_('Download subtitle "%s"') % item.name)
        self["console"].show()
        tmpDir = GetTmpDir()
        subDir = GetSubtitlesDir()
        self.subProvider.doDowanloadSubtitle(self.doDownloadSubtitleCallback,
                                             item.privateData, tmpDir, subDir)

    def doDownloadSubtitleCallback(self, sts, fileName):
        if not sts:
            sts = self.subProvider.getLastApiError()
            self["console"].setText(
                _('Error occurs.\n[%s]') % (sts['message']))
        elif len(fileName) > 0:
            self["console"].setText(
                _('Subtitles downloaded successfully. [%s]') % fileName)
            self.downloadedSubFilePath = fileName
            self.showButtons(['green'])
        else:
            self["console"].setText(_('An unknown error has occurred.'))

    def displayList(self, activeIdx=0):
        list = []
        tmpList = self.stackList[-1]['list']
        type = self.stackList[-1]['type']

        iconType = CDisplayListItem.TYPE_CATEGORY
        if type == 'movie':
            self["title"].setText(_("Select movie"))
        if type == 'episode':
            self["title"].setText(_("Select episode"))
        elif type == "lang":
            self["title"].setText(_("Select language"))
        elif type == "sub":
            iconType = CDisplayListItem.TYPE_ARTICLE
            self["title"].setText(_("Select subtitles to download"))

        self["title"].show()

        for item in tmpList:
            dItem = CDisplayListItem(name=clean_html(item['title']),
                                     type=iconType)
            dItem.privateData = item['private_data']
            list.append((dItem, ))
        self["list"].setList(list)
        self["list"].show()
        try:
            self["list"].moveToIndex(activeIdx)
        except:
            pass

        self.setListMode(True)

    def onSelectionChanged(self):
        pass

    def keyExit(self):
        printDBG(
            ">>>>>>>>>>>>>>>>>>>>>>>>> len(self.stackList)[%d] self.listMode[%r]"
            % (len(self.stackList), self.listMode))
        if False == self.listMode:
            self.subProvider.cancelRequest()
            self.setListMode(False)
            if len(self.stackItems):
                activeIdx = self.stackItems[-1]['idx']
                del self.stackItems[-1]
                self.displayList(activeIdx)
                return
            elif self.loginPassed:
                self.doLoginCallback(True)
                return
        elif 1 < len(self.stackList):
            activeIdx = self.stackItems[-1]['idx']
            del self.stackItems[-1]
            del self.stackList[-1]
            self.displayList(activeIdx)
            return
        elif self.loginPassed:
            self.doLoginCallback(True)
            return
        self.close(None)

    def keyOK(self):
        if False == self.listMode: return
        printDBG(">>>>>>>>>>>>>>>>>>>>>>>>> len(self.stackList)[%d]" %
                 (len(self.stackList)))
        idx, item = self.getSelectedItem()
        if None != item:
            type = self.stackList[-1]['type']
            printDBG(">>>>>>>>>>>>>>>>>>>>>>>>> type[%s]" % type)
            self.stackItems.append({'item': item, 'idx': idx, 'type': type})
            if type == 'episode':
                self.doGetLanguageForSubtitle()
            elif type == 'movie':
                self.doGetItemType(item.privateData)
            elif type == 'lang':
                self.doSearchSubtitle(self.stackItems[-2]['item'],
                                      item.privateData)
            elif type == 'sub':
                self.doDownloadSubtitle(item)
            else:
                printExc(type)

    def keyRed(self):
        self.close(None)

    def keyYellow(self):
        pass

    def keyGreen(self):
        try:
            if self["icon_green"].visible:
                track = {
                    'title': '',
                    'lang': '',
                    'path': self.downloadedSubFilePath
                }
                for item in self.stackItems:
                    printDBG(">>>>>>>>>> item[%s]" % item)
                    type = item['type']
                    data = item['item']
                    if type == 'lang':
                        track['lang'] = data.privateData.get(
                            'SubLanguageID', '')
                    elif type == 'sub':
                        track['title'] = data.name
                        track['id'] = data.privateData.get('IDSubtitle', '')
                self.close(track)
        except:
            printExc()

    def getSelectedItem(self):
        try:
            idx = self["list"].getCurrentIndex()
        except:
            idx = 0
        sel = None
        try:
            if self["list"].visible:
                sel = self["list"].l.getCurrentSelection()[0]
                if None != sel:
                    return idx, sel
        except:
            printExc()
            sel = None
        return -1, None