Example #1
0
class Translator( xbmcgui.WindowXML ):
    CONTROL_LIST_A = 50

    def __init__( self, *args, **kwargs ):
        self.RestartXBMC_ReloadLanguage = False
        self.IsModified = False
        self.googleTrans = False
        self.listitems = []

        self.Addon = Addon( AddonId )
        self._get_settings()

    def _get_settings( self ):
        self.settings = {}
        self.settings[ "LanguagePath" ] = self.Addon.getSetting( "LanguagePath" )

        self.settings[ "viewmode" ]     = int( self.Addon.getSetting( "viewmode" ) )
        self.settings[ "sortmethod" ]   = int( self.Addon.getSetting( "sortmethod" ) )
        self.settings[ "sortorder" ]    = int( self.Addon.getSetting( "sortorder" ) )
        self.settings[ "savefolderviews" ] = ( self.Addon.getSetting( "savefolderviews" ) == "true" )

    def setListItems( self ):
        self.DefaultLanguage = "English"
        self.CurrentLanguage = xbmc.getLanguage()
        self.FolderLanguage  = self.settings[ "LanguagePath" ]
        self.DefaultFolderLanguage = "special://xbmc/language/"
        if not os.path.exists( xbmc.translatePath( self.FolderLanguage ) ):
            print "Folder language not exists! '%s'" % self.FolderLanguage
            self.FolderLanguage = self.DefaultFolderLanguage

        if not self.FolderLanguage.startswith( "special" ):
            for folder in [ "profile", "home", "xbmc" ]:
                special = "special://%s/" % folder
                self.FolderLanguage = self.FolderLanguage.replace( xbmc.translatePath( special ), special )

        if ( xbmc.translatePath( "special://skin/" ) in xbmc.translatePath( self.FolderLanguage ) ):
            self.FolderLanguage = "special://skin/language/"
        self.FolderLanguage = self.FolderLanguage.replace( "\\", "/" ).rstrip( "/" )

        self.setContainerProperties()
        # get languages source
        self.language = Language( self )
        self.listitems = self.language.listitems

    def onInit( self ):
        xbmc.executebuiltin( "ActivateWindow(busydialog)" )
        self.setSortMethodControl()
        self.setContainer( setviewmode=self.settings[ "viewmode" ] )
        LOG( "notice", "initialized took %s", time_took( START_TIME ) )
        xbmc.executebuiltin( "Dialog.Close(busydialog)" )

    def setSortMethodControl( self ):
        label = ( 20316, 103 )[ self.settings[ "sortmethod" ] ]
        self.getControl( 13 ).setLabel( xbmc.getLocalizedString( label ) )

    def setContainerProperties( self ):
        self.setProperty( "IsModified", ( "", "Language file has been changed!" )[ self.IsModified ] )
        self.setProperty( "CurrentLanguage", self.CurrentLanguage )
        self.setProperty( "FolderLanguage", self.FolderLanguage )
        self.setProperty( "CurrentEnglishString", "" )
        self.Addon = Addon( AddonId )
        self.setProperty( "ExtraKeyboard_TopOrBottom", ( "top", "bottom" )[ int( self.Addon.getSetting( "ExtraKB" ) ) ] )

    def setContainer( self, filter="", SelectId="", setviewmode=None ):
        if setviewmode is not None:
            self.ContainerId = ( 50, 51 )[ setviewmode ]
            if setviewmode: xbmc.executebuiltin( "SendClick(2)" )
        else:
            self.ContainerId = ( 50, 51 )[ xbmc.getCondVisibility( "Control.IsVisible(51)" ) ]
        try:

            if not bool( self.listitems ):
                if self.IsModified:
                    # ask for save change
                    self._save_change()
                self.IsModified = False
                self.googleTrans = False
                self.getControl( self.ContainerId ).reset()
                self.setListItems()

            self.setContainerProperties()
            if self.listitems:
                selectitem = 0

                additems = []
                if not filter:
                    additems = self.listitems
                else:
                    for li in self.listitems:
                        if filter == "UnTranslated" and li.getProperty( "UnTranslated" ) == "false":
                            continue
                        if filter == "Translated" and li.getProperty( "IsModified" ) != "true":
                            continue
                        additems.append( li )

                if additems:
                    if self.settings[ "sortmethod" ]:
                        additems = sorted( additems, key=lambda li: normalize_string( li.getLabel(), True ) )
                    if self.settings[ "sortorder" ]:
                        additems = list( reversed( additems ) )
                    for count, li in enumerate( additems ):
                        if li.getProperty( "id" ) == SelectId:
                            selectitem = count

                # add listitems
                self.getControl( self.ContainerId ).reset()
                self.getControl( self.ContainerId ).addItems( additems )
                if additems: #self.getControl( self.ContainerId ).size():
                    self.getControl( self.ContainerId ).selectItem( selectitem )
                    self.setFocusId( self.ContainerId )

            # fixe view on xbox
            if UNDER_XBOX and setviewmode is not None:
                xbmc.executebuiltin( "Container.SetViewMode(%i)" % self.ContainerId )
                xbmc.sleep( 20 )
                self.setFocusId( self.ContainerId )
        except:
            print_exc()

    def onFocus( self, controlID ):
        pass

    def sendClick( self, controlID ):
        try: self.onClick( controlID )
        except: print_exc()

    def getTranslate( self, text, minimal=2 ):
        translated = ""
        if text:
            if ( len( text ) <= minimal ) or text.isdigit():
                translated = text
            else:
                country = self.Addon.getSetting( "country" )
                if country.lower() == "auto": country = self.CurrentLanguage
                pDialog = xbmcgui.DialogProgress()
                pDialog.create( "Google Translate", "English to %s" % country, text, "Please wait..." )
                try:
                    import LanguageTools
                    translated = LanguageTools.translate_text( text, country, "google" )
                except:
                    print_exc()
        self.googleTrans = False
        xbmc.executebuiltin( "Dialog.Close(progressdialog)" )
        return translated

    def onClick( self, controlID ):
        try:
            self.ContainerId = ( 50, 51 )[ xbmc.getCondVisibility( "Control.IsVisible(51)" ) ]
            if controlID == self.ContainerId:
                # get clicked listitem
                listitem = self.getControl( self.ContainerId ).getSelectedItem()
                # get position
                pos = int( listitem.getProperty( "Position" ) )
                # get id
                id = listitem.getProperty( "id" )
                if id:
                    CurrentEnglishString = fixe_line_return( listitem.getLabel2(), True )
                    
                    DefaultText = fixe_line_return( listitem.getLabel(), True )
                    old_text = DefaultText
                    if self.googleTrans: old_text = self.getTranslate( CurrentEnglishString )
                    old_text = old_text or DefaultText

                    if ( self.Addon.getSetting( "BoldKB" ) == "true" ):
                        CurrentEnglishString = "[B]%s[/B]" % CurrentEnglishString
                    self.setProperty( "CurrentEnglishString", CurrentEnglishString )
                    self.setProperty( "ShowCurrentEnglishString", "true" )
                    
                    kb = xbmc.Keyboard( old_text, self.CurrentLanguage + " (Enter desired string)", False )
                    kb.doModal()
                    if kb.isConfirmed():
                        new_text = kb.getText()
                        if new_text != DefaultText:
                            new_text = fixe_line_return( new_text )
                            self.listitems[ pos ].setLabel( new_text )
                            self.listitems[ pos ].setProperty( "IsModified", "true" )
                            self.setProperty( "IsModified", "Language file has been changed!" )
                            self.IsModified = True
                    self.setProperty( "ShowCurrentEnglishString", "" )

            # PAS TRES BON COMME FILTRE :(
            UnTranslated = self.getControl( 19 ).isSelected()
            Translated = self.getControl( 20 ).isSelected()
            Changed = self.getControl( 21 ).isSelected()
            filter = ( "", "UnTranslated" )[ UnTranslated ]
            filter = ( filter, "Translated" )[ Translated ]
            filter = ( filter, "Changed" )[ Changed ]
            
            # get selected id for selectitem again, if controlID 22 clicked
            SelectId = xbmc.getInfoLabel( "Container(50).ListItem.Property(id)" ) or xbmc.getInfoLabel( "Container(51).ListItem.Property(id)" )
            if controlID == 19:
                # UNTRANSLATED BUTTON
                filter = ( "", "UnTranslated" )[ UnTranslated ]
                self.setContainer( filter, SelectId )
                self.getControl( 19 ).setSelected( UnTranslated )
                self.getControl( 20 ).setSelected( False )
                self.getControl( 21 ).setSelected( False )

            elif controlID == 20:
                # TRANSLATED BUTTON
                filter = ( "", "Translated" )[ Translated ]
                self.setContainer( filter, SelectId )
                self.getControl( 20 ).setSelected( Translated )
                self.getControl( 19 ).setSelected( False )
                self.getControl( 21 ).setSelected( False )

            elif controlID == 21:
                # CHANGED BUTTON
                filter = ( "", "Changed" )[ Changed ]
                self.setContainer( filter, SelectId )
                self.getControl( 21 ).setSelected( Changed )
                self.getControl( 19 ).setSelected( False )
                self.getControl( 20 ).setSelected( False )

            elif controlID == 22:
                # VIEW AS BUTTON
                self.settings[ "viewmode" ] = ( 1, 0 )[ self.settings[ "viewmode" ] ]
                xbmc.sleep( 50 )
                self.setContainer( filter, SelectId )

            elif controlID == 13:
                # SORT BY BUTTON
                self.settings[ "sortmethod" ] = ( 1, 0 )[ self.settings[ "sortmethod" ] ]
                self.setSortMethodControl()
                self.setContainer( filter, SelectId )

            elif controlID == 14:
                # SORT ASC BUTTON
                self.settings[ "sortorder" ] = ( 1, 0 )[ self.settings[ "sortorder" ] ]
                self.setContainer( filter, SelectId )

            elif controlID == 32:
                # SETTINGS BUTTON
                self.Addon = Addon( AddonId )
                self.Addon.openSettings()
                xbmc.sleep( 10 )
                if self.settings[ "LanguagePath" ] != self.Addon.getSetting( "LanguagePath" ):
                    self.settings[ "LanguagePath" ] = self.Addon.getSetting( "LanguagePath" )
                    self.listitems = []
                self.setContainer( filter, SelectId )

            elif controlID == 33:
                # FIND BUTTON
                default = self.getControl( 33 ).getLabel2()
                kb = xbmc.Keyboard( default, "Find what ...", False )
                kb.doModal()
                if kb.isConfirmed():
                    find_text = kb.getText()
                    #self.getControl( 33 ).setLabel( "Find", label2=find_text )
                    self.setProperty( "FindText", find_text )
                    if find_text:# and find_text != default:
                        for count, li in enumerate( self.listitems ):
                            #l_text = find_text.lower()
                            #match = ( l_text in li.getLabel().lower() ) or ( l_text in li.getLabel2().lower() ) or ( l_text == li.getProperty( "id" ) )
                            #match = match or ( l_text == li.getLabel().lower() ) or ( l_text == li.getLabel2().lower() )
                            #if not match: continue
                            if self.findText( find_text, li ):
                                self.getControl( self.ContainerId ).selectItem( count )
                                self.setFocusId( self.ContainerId )
                                break

            elif controlID == 34:
                # FIND NEXT BUTTON
                find_next = self.getControl( 33 ).getLabel2().encode( "utf-8" )
                pos = self.getControl( self.ContainerId ).getSelectedPosition()
                for count, li in enumerate( self.listitems ):
                    if count <= pos: continue
                    #if find_next in li.getLabel() or find_next == li.getProperty( "id" ):
                    if self.findText( find_next, li ):
                        self.getControl( self.ContainerId ).selectItem( count )
                        break

        except:
            print_exc()

    def findText( self, text, listitem ):
        return re.search( text.lower(), "|".join(
            [ listitem.getLabel(), listitem.getLabel2(), listitem.getProperty( "id" ) ]
            ).lower() )

    def onAction( self, action ):
        if action in [ 9, 10 ]:
            self._close_window()

        elif action == 117:
            try:
                cm = DialogContextMenu( "Translator-DialogContextMenu.xml", CWD, parent=self )
                cm.doModal()
                del cm
            except:
                print_exc()
        else:
            try:
                bcode = action.getButtonCode()
                # keyboard press F3
                if bcode == 127138: self.sendClick( 34 )
                #
            except:
                print_exc()

    def _close_window( self ):
        xbmc.executebuiltin( "ActivateWindow(busydialog)" )
        if self.settings[ "savefolderviews" ]:
            self.Addon.setSetting( "viewmode",   str( self.settings[ "viewmode" ] ) )
            self.Addon.setSetting( "sortmethod", str( self.settings[ "sortmethod" ] ) )
            self.Addon.setSetting( "sortorder",  str( self.settings[ "sortorder" ] ) )
            xbmc.sleep( 10 )

        if self.IsModified:
            # ask for save change
            xbmc.executebuiltin( "Dialog.Close(busydialog)" )
            self._save_change()

        try: del self.language
        except: pass
        self.close()

    def _save_change( self ):
        if xbmcgui.Dialog().yesno( "Confirm file save", "Language file has been changed!", self.language.current_xml, "Do you want save your change?", "" ):
            xbmc.executebuiltin( "ActivateWindow(busydialog)" )
            OK = self.language.save_strings()
            xbmc.executebuiltin( "Dialog.Close(busydialog)" )

            if ( self.DefaultFolderLanguage.rstrip( "/" ) == self.FolderLanguage ) or ( xbmc.translatePath( "special://skin/" ) in xbmc.translatePath( self.FolderLanguage ) ):
                # if default xbmc language file has been changed,
                # set True, XBMC require Restart or reload language
                self.RestartXBMC_ReloadLanguage = OK or self.RestartXBMC_ReloadLanguage
Example #2
0
 def ia_settings(self):
     """Open InputStream Adaptive settings."""
     ia_addon = Addon('inputstream.adaptive')
     ia_addon.openSettings()
Example #3
0
                line2 = "Progress1 [B]%i%%[/B]   |   Progress2 [B]%i%%[/B]" % (
                    percent1, percent2)

                # update dialog ( [ percent1=int, percent2=int, line1=str, line2=str ] ) all args is optional
                scan.update(percent1, percent2, line2=line2)

                # if is canceled stop
                if scan.iscanceled():
                    break

                sleep(.1)

            # close dialog and auto destroy all controls
            scan.close()
        except xbmcguiWindowError:
            print_exc()
        except:
            print_exc()

    elif selected == 1:
        __settings__.openSettings()


if (__name__ == "__main__"):
    try:
        # settings called from other addon
        if sys.argv[1].lower() == "opensettins":
            __settings__.openSettings()
    except:
        print_exc()
Example #4
0
 def ia_settings(self):
     """Open InputStream Adaptive settings."""
     ia_addon = Addon('inputstream.adaptive')
     ia_addon.openSettings()
                line2 = "Progress1 [B]%i%%[/B]   |   Progress2 [B]%i%%[/B]" % ( percent1, percent2 )

                # update dialog ( [ percent1=int, percent2=int, line1=str, line2=str ] ) all args is optional
                scan.update( percent1, percent2, line2=line2 )

                # if is canceled stop 
                if scan.iscanceled():
                    break

                sleep( .1 )

            # close dialog and auto destroy all controls
            scan.close()
        except xbmcguiWindowError:
            print_exc()
        except:
            print_exc()

    elif selected == 1:
        __settings__.openSettings()



if ( __name__ == "__main__" ):
    try:
        # settings called from other addon
        if sys.argv[ 1 ].lower() == "opensettins":
            __settings__.openSettings()
    except:
        print_exc()
Example #6
0
class Translator(xbmcgui.WindowXML):
    CONTROL_LIST_A = 50

    def __init__(self, *args, **kwargs):
        self.RestartXBMC_ReloadLanguage = False
        self.IsModified = False
        self.googleTrans = False
        self.listitems = []

        self.Addon = Addon(AddonId)
        self._get_settings()

    def _get_settings(self):
        self.settings = {}
        self.settings["LanguagePath"] = self.Addon.getSetting("LanguagePath")

        self.settings["viewmode"] = int(self.Addon.getSetting("viewmode"))
        self.settings["sortmethod"] = int(self.Addon.getSetting("sortmethod"))
        self.settings["sortorder"] = int(self.Addon.getSetting("sortorder"))
        self.settings["savefolderviews"] = (
            self.Addon.getSetting("savefolderviews") == "true")

    def setListItems(self):
        self.DefaultLanguage = "English"
        self.CurrentLanguage = xbmc.getLanguage()
        self.FolderLanguage = self.settings["LanguagePath"]
        self.DefaultFolderLanguage = "special://xbmc/language/"
        if not os.path.exists(xbmc.translatePath(self.FolderLanguage)):
            print "Folder language not exists! '%s'" % self.FolderLanguage
            self.FolderLanguage = self.DefaultFolderLanguage

        if not self.FolderLanguage.startswith("special"):
            for folder in ["profile", "home", "xbmc"]:
                special = "special://%s/" % folder
                self.FolderLanguage = self.FolderLanguage.replace(
                    xbmc.translatePath(special), special)

        if (xbmc.translatePath("special://skin/")
                in xbmc.translatePath(self.FolderLanguage)):
            self.FolderLanguage = "special://skin/language/"
        self.FolderLanguage = self.FolderLanguage.replace("\\",
                                                          "/").rstrip("/")

        self.setContainerProperties()
        # get languages source
        self.language = Language(self)
        self.listitems = self.language.listitems

    def onInit(self):
        xbmc.executebuiltin("ActivateWindow(busydialog)")
        self.setSortMethodControl()
        self.setContainer(setviewmode=self.settings["viewmode"])
        LOG("notice", "initialized took %s", time_took(START_TIME))
        xbmc.executebuiltin("Dialog.Close(busydialog)")

    def setSortMethodControl(self):
        label = (20316, 103)[self.settings["sortmethod"]]
        self.getControl(13).setLabel(xbmc.getLocalizedString(label))

    def setContainerProperties(self):
        self.setProperty("IsModified",
                         ("",
                          "Language file has been changed!")[self.IsModified])
        self.setProperty("CurrentLanguage", self.CurrentLanguage)
        self.setProperty("FolderLanguage", self.FolderLanguage)
        self.setProperty("CurrentEnglishString", "")
        self.Addon = Addon(AddonId)
        self.setProperty("ExtraKeyboard_TopOrBottom",
                         ("top",
                          "bottom")[int(self.Addon.getSetting("ExtraKB"))])

    def setContainer(self, filter="", SelectId="", setviewmode=None):
        if setviewmode is not None:
            self.ContainerId = (50, 51)[setviewmode]
            if setviewmode: xbmc.executebuiltin("SendClick(2)")
        else:
            self.ContainerId = (
                50, 51)[xbmc.getCondVisibility("Control.IsVisible(51)")]
        try:

            if not bool(self.listitems):
                if self.IsModified:
                    # ask for save change
                    self._save_change()
                self.IsModified = False
                self.googleTrans = False
                self.getControl(self.ContainerId).reset()
                self.setListItems()

            self.setContainerProperties()
            if self.listitems:
                selectitem = 0

                additems = []
                if not filter:
                    additems = self.listitems
                else:
                    for li in self.listitems:
                        if filter == "UnTranslated" and li.getProperty(
                                "UnTranslated") == "false":
                            continue
                        if filter == "Translated" and li.getProperty(
                                "IsModified") != "true":
                            continue
                        additems.append(li)

                if additems:
                    if self.settings["sortmethod"]:
                        additems = sorted(additems,
                                          key=lambda li: normalize_string(
                                              li.getLabel(), True))
                    if self.settings["sortorder"]:
                        additems = list(reversed(additems))
                    for count, li in enumerate(additems):
                        if li.getProperty("id") == SelectId:
                            selectitem = count

                # add listitems
                self.getControl(self.ContainerId).reset()
                self.getControl(self.ContainerId).addItems(additems)
                if additems:  #self.getControl( self.ContainerId ).size():
                    self.getControl(self.ContainerId).selectItem(selectitem)
                    self.setFocusId(self.ContainerId)

            # fixe view on xbox
            if UNDER_XBOX and setviewmode is not None:
                xbmc.executebuiltin("Container.SetViewMode(%i)" %
                                    self.ContainerId)
                xbmc.sleep(20)
                self.setFocusId(self.ContainerId)
        except:
            print_exc()

    def onFocus(self, controlID):
        pass

    def sendClick(self, controlID):
        try:
            self.onClick(controlID)
        except:
            print_exc()

    def getTranslate(self, text, minimal=2):
        translated = ""
        if text:
            if (len(text) <= minimal) or text.isdigit():
                translated = text
            else:
                country = self.Addon.getSetting("country")
                if country.lower() == "auto": country = self.CurrentLanguage
                pDialog = xbmcgui.DialogProgress()
                pDialog.create("Google Translate", "English to %s" % country,
                               text, "Please wait...")
                try:
                    import LanguageTools
                    translated = LanguageTools.translate_text(
                        text, country, "google")
                except:
                    print_exc()
        self.googleTrans = False
        xbmc.executebuiltin("Dialog.Close(progressdialog)")
        return translated

    def onClick(self, controlID):
        try:
            self.ContainerId = (
                50, 51)[xbmc.getCondVisibility("Control.IsVisible(51)")]
            if controlID == self.ContainerId:
                # get clicked listitem
                listitem = self.getControl(self.ContainerId).getSelectedItem()
                # get position
                pos = int(listitem.getProperty("Position"))
                # get id
                id = listitem.getProperty("id")
                if id:
                    CurrentEnglishString = fixe_line_return(
                        listitem.getLabel2(), True)

                    DefaultText = fixe_line_return(listitem.getLabel(), True)
                    old_text = DefaultText
                    if self.googleTrans:
                        old_text = self.getTranslate(CurrentEnglishString)
                    old_text = old_text or DefaultText

                    if (self.Addon.getSetting("BoldKB") == "true"):
                        CurrentEnglishString = "[B]%s[/B]" % CurrentEnglishString
                    self.setProperty("CurrentEnglishString",
                                     CurrentEnglishString)
                    self.setProperty("ShowCurrentEnglishString", "true")

                    kb = xbmc.Keyboard(
                        old_text,
                        self.CurrentLanguage + " (Enter desired string)",
                        False)
                    kb.doModal()
                    if kb.isConfirmed():
                        new_text = kb.getText()
                        if new_text != DefaultText:
                            new_text = fixe_line_return(new_text)
                            self.listitems[pos].setLabel(new_text)
                            self.listitems[pos].setProperty(
                                "IsModified", "true")
                            self.setProperty(
                                "IsModified",
                                "Language file has been changed!")
                            self.IsModified = True
                    self.setProperty("ShowCurrentEnglishString", "")

            # PAS TRES BON COMME FILTRE :(
            UnTranslated = self.getControl(19).isSelected()
            Translated = self.getControl(20).isSelected()
            Changed = self.getControl(21).isSelected()
            filter = ("", "UnTranslated")[UnTranslated]
            filter = (filter, "Translated")[Translated]
            filter = (filter, "Changed")[Changed]

            # get selected id for selectitem again, if controlID 22 clicked
            SelectId = xbmc.getInfoLabel(
                "Container(50).ListItem.Property(id)") or xbmc.getInfoLabel(
                    "Container(51).ListItem.Property(id)")
            if controlID == 19:
                # UNTRANSLATED BUTTON
                filter = ("", "UnTranslated")[UnTranslated]
                self.setContainer(filter, SelectId)
                self.getControl(19).setSelected(UnTranslated)
                self.getControl(20).setSelected(False)
                self.getControl(21).setSelected(False)

            elif controlID == 20:
                # TRANSLATED BUTTON
                filter = ("", "Translated")[Translated]
                self.setContainer(filter, SelectId)
                self.getControl(20).setSelected(Translated)
                self.getControl(19).setSelected(False)
                self.getControl(21).setSelected(False)

            elif controlID == 21:
                # CHANGED BUTTON
                filter = ("", "Changed")[Changed]
                self.setContainer(filter, SelectId)
                self.getControl(21).setSelected(Changed)
                self.getControl(19).setSelected(False)
                self.getControl(20).setSelected(False)

            elif controlID == 22:
                # VIEW AS BUTTON
                self.settings["viewmode"] = (1, 0)[self.settings["viewmode"]]
                xbmc.sleep(50)
                self.setContainer(filter, SelectId)

            elif controlID == 13:
                # SORT BY BUTTON
                self.settings["sortmethod"] = (1,
                                               0)[self.settings["sortmethod"]]
                self.setSortMethodControl()
                self.setContainer(filter, SelectId)

            elif controlID == 14:
                # SORT ASC BUTTON
                self.settings["sortorder"] = (1, 0)[self.settings["sortorder"]]
                self.setContainer(filter, SelectId)

            elif controlID == 32:
                # SETTINGS BUTTON
                self.Addon = Addon(AddonId)
                self.Addon.openSettings()
                xbmc.sleep(10)
                if self.settings["LanguagePath"] != self.Addon.getSetting(
                        "LanguagePath"):
                    self.settings["LanguagePath"] = self.Addon.getSetting(
                        "LanguagePath")
                    self.listitems = []
                self.setContainer(filter, SelectId)

            elif controlID == 33:
                # FIND BUTTON
                default = self.getControl(33).getLabel2()
                kb = xbmc.Keyboard(default, "Find what ...", False)
                kb.doModal()
                if kb.isConfirmed():
                    find_text = kb.getText()
                    #self.getControl( 33 ).setLabel( "Find", label2=find_text )
                    self.setProperty("FindText", find_text)
                    if find_text:  # and find_text != default:
                        for count, li in enumerate(self.listitems):
                            #l_text = find_text.lower()
                            #match = ( l_text in li.getLabel().lower() ) or ( l_text in li.getLabel2().lower() ) or ( l_text == li.getProperty( "id" ) )
                            #match = match or ( l_text == li.getLabel().lower() ) or ( l_text == li.getLabel2().lower() )
                            #if not match: continue
                            if self.findText(find_text, li):
                                self.getControl(
                                    self.ContainerId).selectItem(count)
                                self.setFocusId(self.ContainerId)
                                break

            elif controlID == 34:
                # FIND NEXT BUTTON
                find_next = self.getControl(33).getLabel2().encode("utf-8")
                pos = self.getControl(self.ContainerId).getSelectedPosition()
                for count, li in enumerate(self.listitems):
                    if count <= pos: continue
                    #if find_next in li.getLabel() or find_next == li.getProperty( "id" ):
                    if self.findText(find_next, li):
                        self.getControl(self.ContainerId).selectItem(count)
                        break

        except:
            print_exc()

    def findText(self, text, listitem):
        return re.search(
            text.lower(), "|".join([
                listitem.getLabel(),
                listitem.getLabel2(),
                listitem.getProperty("id")
            ]).lower())

    def onAction(self, action):
        if action in [9, 10]:
            self._close_window()

        elif action == 117:
            try:
                cm = DialogContextMenu("Translator-DialogContextMenu.xml",
                                       CWD,
                                       parent=self)
                cm.doModal()
                del cm
            except:
                print_exc()
        else:
            try:
                bcode = action.getButtonCode()
                # keyboard press F3
                if bcode == 127138: self.sendClick(34)
                #
            except:
                print_exc()

    def _close_window(self):
        xbmc.executebuiltin("ActivateWindow(busydialog)")
        if self.settings["savefolderviews"]:
            self.Addon.setSetting("viewmode", str(self.settings["viewmode"]))
            self.Addon.setSetting("sortmethod",
                                  str(self.settings["sortmethod"]))
            self.Addon.setSetting("sortorder", str(self.settings["sortorder"]))
            xbmc.sleep(10)

        if self.IsModified:
            # ask for save change
            xbmc.executebuiltin("Dialog.Close(busydialog)")
            self._save_change()

        try:
            del self.language
        except:
            pass
        self.close()

    def _save_change(self):
        if xbmcgui.Dialog().yesno("Confirm file save",
                                  "Language file has been changed!",
                                  self.language.current_xml,
                                  "Do you want save your change?", ""):
            xbmc.executebuiltin("ActivateWindow(busydialog)")
            OK = self.language.save_strings()
            xbmc.executebuiltin("Dialog.Close(busydialog)")

            if (self.DefaultFolderLanguage.rstrip("/") == self.FolderLanguage
                ) or (xbmc.translatePath("special://skin/")
                      in xbmc.translatePath(self.FolderLanguage)):
                # if default xbmc language file has been changed,
                # set True, XBMC require Restart or reload language
                self.RestartXBMC_ReloadLanguage = OK or self.RestartXBMC_ReloadLanguage
Example #7
0
    # 7- change last sync date
    # 8- write back data
    #


def getFolders():
    global watched_db, watched_pending_db
    watched_pending_db = os.path.join(
        ADDON_CACHE,
        "watched_pending_" + str(ADDON.getSetting("username")) + ".db")
    watched_db = os.path.join(
        ADDON_CACHE, "watched_" + str(ADDON.getSetting("username")) + ".db")


if not ADDON.getSetting("setupOK"):
    ADDON.openSettings()
    ADDON.setSetting("setupOK", "True")


def getPendingWatchFile():
    global watched_db, watched_pending_db

    if os.path.exists(watched_pending_db):
        pendWatched = open(watched_pending_db).read()
    else:
        f = open(watched_pending_db, "w")
        f.write("{}")
        f.close()
        pendWatched = "{}"

    data = None
Example #8
0

# Définition des variables des dossiers

if os.name == "posix":
    # Linux case
    ROOTDIR = os.path.abspath(os.curdir).replace(";", "")
else:
    # Xbox and Windows case
    ROOTDIR = os.getcwd().replace(";", "")

imgDir = os.path.join(ROOTDIR, "resources", "Icons")


if __settings__.getSetting("FAI") == "":
    __settings__.openSettings(url=sys.argv[0])


def _unicode(s, encoding="utf-8"):
    """ customized unicode, don't raise UnicodeDecodeError exception, return no unicode str instead """
    try:
        s = unicode(s, encoding)
    except:
        pass
    return s


def download(url):
    download_path = "special://temp/playlist.m3u"
    urllib.urlretrieve(url, download_path)
    return download_path
Example #9
0
    print "Mode plugin ON"
    print PLUGIN_DATA_PATH

#Définition des variables des dossiers

if os.name == 'posix':
    # Linux case
    ROOTDIR = os.path.abspath(os.curdir).replace(';', '')
else:
    # Xbox and Windows case
    ROOTDIR = os.getcwd().replace(';', '')

imgDir = os.path.join(ROOTDIR, "resources", "Icons")

if __settings__.getSetting('FAI') == "":
    __settings__.openSettings(url=sys.argv[0])


def _unicode(s, encoding="utf-8"):
    """ customized unicode, don't raise UnicodeDecodeError exception, return no unicode str instead """
    try:
        s = unicode(s, encoding)
    except:
        pass
    return s


def download(url):
    download_path = "special://temp/playlist.m3u"
    urllib.urlretrieve(url, download_path)
    return download_path
Example #10
0
class KodiWrapper:
    """ A wrapper around all Kodi functionality """
    def __init__(self, routing=None):
        """ Initialize the Kodi wrapper """
        self.routing = None
        if routing:
            self.routing = routing
            self._handle = self.routing.handle
            self._url = self.routing.base_url
        self._addon = Addon()
        self._system_locale_works = None
        self._addon_name = self._addon.getAddonInfo('name')
        self._addon_id = self._addon.getAddonInfo('id')
        self._global_debug_logging = self.get_global_setting(
            'debug.showloginfo')  # Returns a boolean
        self._debug_logging = self.get_setting_as_bool('debug_logging')
        self._cache_path = self.get_userdata_path() + 'cache/'

    def show_listing(self,
                     title_items,
                     category=None,
                     sort='unsorted',
                     content=None,
                     cache=True):
        """ Show a virtual directory in Kodi """
        if content:
            # content is one of: files, songs, artists, albums, movies, tvshows, episodes, musicvideos, videos, images, games
            xbmcplugin.setContent(self._handle, content=content)

        # Jump through hoops to get a stable breadcrumbs implementation
        category_label = ''
        if category:
            if not content:
                category_label = self._addon_name + ' / '
            if self.kids_mode():
                category_label += 'KIDS / '
            if isinstance(category, int):
                category_label += self.localize(category)
            else:
                category_label += category
        elif not content:
            category_label = self._addon_name
            if self.kids_mode():
                category_label += ' / KIDS'

        xbmcplugin.setPluginCategory(handle=self._handle,
                                     category=category_label)

        # Add all sort methods to GUI (start with preferred)
        xbmcplugin.addSortMethod(handle=self._handle,
                                 sortMethod=SORT_METHODS[sort])
        for key in sorted(SORT_METHODS):
            if key != sort:
                xbmcplugin.addSortMethod(handle=self._handle,
                                         sortMethod=SORT_METHODS[key])

        # Add the listings
        listing = []
        for title_item in title_items:
            list_item = self._generate_listitem(title_item)

            is_folder = bool(not title_item.is_playable and title_item.path)
            url = title_item.path if title_item.path else None
            listing.append((url, list_item, is_folder))

        succeeded = xbmcplugin.addDirectoryItems(self._handle, listing,
                                                 len(listing))
        xbmcplugin.endOfDirectory(self._handle, succeeded, cacheToDisc=cache)

    @staticmethod
    def _generate_listitem(title_item):
        """ Generate a ListItem from a TitleItem """
        from xbmcgui import ListItem

        # Three options:
        #  - item is a virtual directory/folder (not playable, path)
        #  - item is a playable file (playable, path)
        #  - item is non-actionable item (not playable, no path)
        is_folder = bool(not title_item.is_playable and title_item.path)
        is_playable = bool(title_item.is_playable and title_item.path)

        list_item = ListItem(label=title_item.title, path=title_item.path)

        if title_item.prop_dict:
            list_item.setProperties(title_item.prop_dict)
        list_item.setProperty(key='IsPlayable',
                              value='true' if is_playable else 'false')

        list_item.setIsFolder(is_folder)

        if title_item.art_dict:
            list_item.setArt(title_item.art_dict)

        if title_item.info_dict:
            # type is one of: video, music, pictures, game
            list_item.setInfo(type='video', infoLabels=title_item.info_dict)

        if title_item.stream_dict:
            # type is one of: video, audio, subtitle
            list_item.addStreamInfo('video', title_item.stream_dict)

        if title_item.context_menu:
            list_item.addContextMenuItems(title_item.context_menu)

        return list_item

    def play(self, title_item, license_key=None):
        """ Play the passed TitleItem.
        :type title_item: TitleItem
        :type license_key: string
        """
        play_item = self._generate_listitem(title_item)
        play_item.setProperty('inputstreamaddon', 'inputstream.adaptive')
        play_item.setProperty('inputstream.adaptive.max_bandwidth',
                              str(self.get_max_bandwidth() * 1000))
        play_item.setProperty('network.bandwidth',
                              str(self.get_max_bandwidth() * 1000))
        play_item.setProperty('inputstream.adaptive.manifest_type', 'mpd')
        play_item.setMimeType('application/dash+xml')
        play_item.setContentLookup(False)

        if license_key is not None:
            play_item.setProperty('inputstream.adaptive.license_type',
                                  'com.widevine.alpha')
            play_item.setProperty('inputstream.adaptive.license_key',
                                  license_key)

        if title_item.subtitles_path:
            play_item.setSubtitles(title_item.subtitles_path)

        # To support video playback directly from RunPlugin() we need to use xbmc.Player().play instead of
        # setResolvedUrl that only works with PlayMedia() or with internal playable menu items
        xbmcplugin.setResolvedUrl(self._handle, True, listitem=play_item)

        if self.get_setting_as_bool('showsubtitles'):
            while not xbmc.Player().isPlaying() and not xbmc.Monitor(
            ).abortRequested():
                xbmc.sleep(100)
            xbmc.Player().showSubtitles(True)

    @staticmethod
    def get_search_string(heading='', message=''):
        """ Ask the user for a search string """
        search_string = None
        keyboard = xbmc.Keyboard(message, heading)
        keyboard.doModal()
        if keyboard.isConfirmed():
            search_string = to_unicode(keyboard.getText())
        return search_string

    def show_ok_dialog(self, heading='', message=''):
        """ Show Kodi's OK dialog """
        from xbmcgui import Dialog
        if not heading:
            heading = self._addon.getAddonInfo('name')
        return Dialog().ok(heading=heading, line1=message)

    def show_notification(self,
                          heading='',
                          message='',
                          icon='info',
                          time=4000):
        """ Show a Kodi notification """
        from xbmcgui import Dialog
        if not heading:
            heading = self._addon.getAddonInfo('name')
        Dialog().notification(heading=heading,
                              message=message,
                              icon=icon,
                              time=time)

    def show_multiselect(self,
                         heading='',
                         options=None,
                         autoclose=0,
                         preselect=None,
                         use_details=False):
        """ Show a Kodi multi-select dialog """
        from xbmcgui import Dialog
        if not heading:
            heading = self._addon.getAddonInfo('name')
        return Dialog().multiselect(heading=heading,
                                    options=options,
                                    autoclose=autoclose,
                                    preselect=preselect,
                                    useDetails=use_details)

    def show_progress(self, heading='', message=''):
        """ Show a Kodi progress dialog """
        from xbmcgui import DialogProgress
        if not heading:
            heading = self._addon.getAddonInfo('name')
        progress = DialogProgress()
        progress.create(heading=heading, line1=message)
        return progress

    def show_progress_background(self, heading='', message=''):
        """ Show a Kodi progress dialog """
        from xbmcgui import DialogProgressBG
        if not heading:
            heading = self._addon.getAddonInfo('name')
        progress = DialogProgressBG()
        progress.create(heading=heading, message=message)
        return progress

    def set_locale(self):
        """ Load the proper locale for date strings """
        import locale
        locale_lang = self.get_global_setting('locale.language').split('.')[-1]
        try:
            # NOTE: This only works if the platform supports the Kodi configured locale
            locale.setlocale(locale.LC_ALL, locale_lang)
            return True
        except Exception as exc:  # pylint: disable=broad-except
            if locale_lang == 'en_gb':
                return True
            self.log("Your system does not support locale '{locale}': {error}",
                     LOG_DEBUG,
                     locale=locale_lang,
                     error=exc)
            return False

    def localize(self, string_id, **kwargs):
        """ Return the translated string from the .po language files, optionally translating variables """
        if kwargs:
            import string
            return string.Formatter().vformat(
                self._addon.getLocalizedString(string_id), (),
                SafeDict(**kwargs))

        return self._addon.getLocalizedString(string_id)

    def get_setting(self, setting_id, default=None):
        """ Get an add-on setting """
        value = to_unicode(self._addon.getSetting(setting_id))
        if value == '' and default is not None:
            return default
        return value

    def get_setting_as_bool(self, setting):
        """ Get an add-on setting as a boolean value """
        return self.get_setting(setting).lower() == "true"

    def set_setting(self, setting_id, setting_value):
        """ Set an add-on setting """
        return self._addon.setSetting(setting_id, setting_value)

    def open_settings(self):
        """ Open the add-in settings window """
        self._addon.openSettings()

    @staticmethod
    def get_global_setting(setting):
        """ Get a Kodi setting """
        import json
        json_result = xbmc.executeJSONRPC(
            '{"jsonrpc": "2.0", "method": "Settings.GetSettingValue", "params": {"setting": "%s"}, "id": 1}'
            % setting)
        return json.loads(json_result).get('result', dict()).get('value')

    def get_cache(self, key, ttl=None):
        """ Get an item from the cache
        :type key: list[str]
        :type ttl: int
        """
        import time

        fullpath = self._cache_path + '.'.join(key)

        if not self.check_if_path_exists(fullpath):
            return None

        if ttl and time.mktime(
                time.localtime()) - self.stat_file(fullpath).st_mtime() > ttl:
            return None

        with self.open_file(fullpath, 'r') as fdesc:
            try:
                import json
                value = json.load(fdesc)
                self.log('Fetching {file} from cache', file=fullpath)
                return value
            except (ValueError, TypeError):
                return None

    def set_cache(self, key, data):
        """ Store an item in the cache
        :type key: list[str]
        :type data: str
        """
        if not self.check_if_path_exists(self._cache_path):
            self.mkdirs(self._cache_path)

        fullpath = self._cache_path + '.'.join(key)
        with self.open_file(fullpath, 'w') as fdesc:
            import json
            self.log('Storing to cache as {file}', file=fullpath)
            json.dump(data, fdesc)

    def invalidate_cache(self, ttl=None):
        """ Clear the cache """
        if not self.check_if_path_exists(self._cache_path):
            return
        _, files = self.listdir(self._cache_path)
        import time
        now = time.mktime(time.localtime())
        for filename in files:
            fullpath = self._cache_path + filename
            if ttl and now - self.stat_file(fullpath).st_mtime() < ttl:
                continue
            self.delete_file(fullpath)

    def get_max_bandwidth(self):
        """ Get the max bandwidth based on Kodi and add-on settings """
        addon_max_bandwidth = int(self.get_setting('max_bandwidth', '0'))
        global_max_bandwidth = int(
            self.get_global_setting('network.bandwidth'))
        if addon_max_bandwidth != 0 and global_max_bandwidth != 0:
            return min(addon_max_bandwidth, global_max_bandwidth)
        if addon_max_bandwidth != 0:
            return addon_max_bandwidth
        if global_max_bandwidth != 0:
            return global_max_bandwidth
        return 0

    def get_proxies(self):
        """ Return a usable proxies dictionary from Kodi proxy settings """
        usehttpproxy = self.get_global_setting('network.usehttpproxy')
        if usehttpproxy is not True:
            return None

        try:
            httpproxytype = int(
                self.get_global_setting('network.httpproxytype'))
        except ValueError:
            httpproxytype = 0

        socks_supported = has_socks()
        if httpproxytype != 0 and not socks_supported:
            # Only open the dialog the first time (to avoid multiple popups)
            if socks_supported is None:
                self.show_ok_dialog('',
                                    self.localize(30966))  # Requires PySocks
            return None

        proxy_types = ['http', 'socks4', 'socks4a', 'socks5', 'socks5h']
        if 0 <= httpproxytype < 5:
            httpproxyscheme = proxy_types[httpproxytype]
        else:
            httpproxyscheme = 'http'

        httpproxyserver = self.get_global_setting('network.httpproxyserver')
        httpproxyport = self.get_global_setting('network.httpproxyport')
        httpproxyusername = self.get_global_setting(
            'network.httpproxyusername')
        httpproxypassword = self.get_global_setting(
            'network.httpproxypassword')

        if httpproxyserver and httpproxyport and httpproxyusername and httpproxypassword:
            proxy_address = '%s://%s:%s@%s:%s' % (
                httpproxyscheme, httpproxyusername, httpproxypassword,
                httpproxyserver, httpproxyport)
        elif httpproxyserver and httpproxyport and httpproxyusername:
            proxy_address = '%s://%s@%s:%s' % (httpproxyscheme,
                                               httpproxyusername,
                                               httpproxyserver, httpproxyport)
        elif httpproxyserver and httpproxyport:
            proxy_address = '%s://%s:%s' % (httpproxyscheme, httpproxyserver,
                                            httpproxyport)
        elif httpproxyserver:
            proxy_address = '%s://%s' % (httpproxyscheme, httpproxyserver)
        else:
            return None

        return dict(http=proxy_address, https=proxy_address)

    @staticmethod
    def get_cond_visibility(condition):
        """ Test a condition in XBMC """
        return xbmc.getCondVisibility(condition)

    def has_inputstream_adaptive(self):
        """ Whether InputStream Adaptive is installed and enabled in add-on settings """
        return self.get_setting(
            'useinputstreamadaptive',
            'true') == 'true' and xbmc.getCondVisibility(
                'System.HasAddon(inputstream.adaptive)') == 1

    def credentials_filled_in(self):
        """ Whether the add-on has credentials filled in """
        return bool(
            self.get_setting('username') and self.get_setting('password'))

    @staticmethod
    def kodi_version():
        """ Returns major Kodi version """
        return int(xbmc.getInfoLabel('System.BuildVersion').split('.')[0])

    def can_play_drm(self):
        """ Whether this Kodi can do DRM using InputStream Adaptive """
        return self.get_setting('usedrm',
                                'true') == 'true' and self.get_setting(
                                    'useinputstreamadaptive',
                                    'true') == 'true' and self.supports_drm()

    def supports_drm(self):
        """ Whether this Kodi version supports DRM decryption using InputStream Adaptive """
        return self.kodi_version() > 17

    def get_userdata_path(self):
        """ Return the profile's userdata path """
        return to_unicode(
            xbmc.translatePath(self._addon.getAddonInfo('profile')))

    def get_addon_path(self):
        """ Return the profile's addon path """
        return to_unicode(xbmc.translatePath(self._addon.getAddonInfo('path')))

    def get_addon_info(self, key):
        """ Return addon information """
        return self._addon.getAddonInfo(key)

    @staticmethod
    def listdir(path):
        """ Return all files in a directory (using xbmcvfs)"""
        from xbmcvfs import listdir
        return listdir(path)

    def mkdir(self, path):
        """ Create a directory (using xbmcvfs) """
        from xbmcvfs import mkdir
        self.log("Create directory '{path}'.", LOG_DEBUG, path=path)
        return mkdir(path)

    def mkdirs(self, path):
        """ Create directory including parents (using xbmcvfs) """
        from xbmcvfs import mkdirs
        self.log("Recursively create directory '{path}'.",
                 LOG_DEBUG,
                 path=path)
        return mkdirs(path)

    @staticmethod
    def check_if_path_exists(path):
        """ Whether the path exists (using xbmcvfs)"""
        from xbmcvfs import exists
        return exists(path)

    @staticmethod
    @contextmanager
    def open_file(path, flags='r'):
        """ Open a file (using xbmcvfs) """
        from xbmcvfs import File
        fdesc = File(path, flags)
        yield fdesc
        fdesc.close()

    @staticmethod
    def stat_file(path):
        """ Return information about a file (using xbmcvfs) """
        from xbmcvfs import Stat
        return Stat(path)

    def delete_file(self, path):
        """ Remove a file (using xbmcvfs) """
        from xbmcvfs import delete
        self.log("Delete file '{path}'.", LOG_DEBUG, path=path)
        return delete(path)

    def end_of_directory(self):
        """ Close a virtual directory, required to avoid a waiting Kodi """
        xbmcplugin.endOfDirectory(handle=self._handle,
                                  succeeded=False,
                                  updateListing=False,
                                  cacheToDisc=False)

    def log(self, message, log_level=LOG_INFO, **kwargs):
        """ Log info messages to Kodi """
        if not self._global_debug_logging and self._debug_logging and log_level in [
                LOG_DEBUG, LOG_INFO
        ]:
            # If Debug Logging is not enabled, Kodi filters everything up to NOTICE out
            log_level = LOG_NOTICE
        if kwargs:
            import string
            message = string.Formatter().vformat(message, (),
                                                 SafeDict(**kwargs))
        message = '[{addon}] {message}'.format(addon=self._addon_id,
                                               message=message)
        xbmc.log(msg=from_unicode(message), level=log_level)

    def kids_mode(self):
        """ Returns if kids zone is active """
        if self.get_setting_as_bool('force_kids_zone'):
            return True

        if self.routing and self.routing.path.startswith('/kids'):
            return True
        return False