def getSettings( self, id="repository.xbmc.builds" ): settings = {} try: from xbmcaddon import Addon addon = Addon( id ) usetempdir = addon.getSetting( "usetempdir" ) == "true" browsedir = addon.getSetting( "browsedir" ) == "true" settings[ "downloadpath" ] = ( addon.getSetting( "downloadpath" ), "" )[ browsedir ] if not usetempdir: #browse for save dir if not settings[ "downloadpath" ] or not os.path.exists( settings[ "downloadpath" ] ): dpath = xbmc.translatePath( self.get_browse_dialog( heading="Recordings folder" ) ) if dpath and os.path.exists( dpath ): settings[ "downloadpath" ] = dpath addon.setSetting( "downloadpath", settings[ "downloadpath" ] ) else: settings[ "downloadpath" ] = "" settings[ "downloadinbackground" ] = addon.getSetting( "downloadinbackground" ) == "true" settings[ "reportpercent" ] = int( "0|5|10|20|25|50|100".split( "|" )[ int( addon.getSetting( "reportpercent" ) ) ] ) PROFILE_PATH = xbmc.translatePath( addon.getAddonInfo( "profile" ) ) settings[ "iddl_data" ] = os.path.join( PROFILE_PATH, "iddl_data" ) if not os.path.exists( settings[ "iddl_data" ] ): os.makedirs( settings[ "iddl_data" ] ) except: pass return settings
def getSettings(self, id="repository.xbmc.builds"): settings = {} try: from xbmcaddon import Addon addon = Addon(id) usetempdir = addon.getSetting("usetempdir") == "true" browsedir = addon.getSetting("browsedir") == "true" settings["downloadpath"] = (addon.getSetting("downloadpath"), "")[browsedir] if not usetempdir: #browse for save dir if not settings["downloadpath"] or not os.path.exists( settings["downloadpath"]): dpath = xbmc.translatePath( self.get_browse_dialog(heading="Recordings folder")) if dpath and os.path.exists(dpath): settings["downloadpath"] = dpath addon.setSetting("downloadpath", settings["downloadpath"]) else: settings["downloadpath"] = "" settings["downloadinbackground"] = addon.getSetting( "downloadinbackground") == "true" settings["reportpercent"] = int( "0|5|10|20|25|50|100".split("|")[int( addon.getSetting("reportpercent"))]) PROFILE_PATH = xbmc.translatePath(addon.getAddonInfo("profile")) settings["iddl_data"] = os.path.join(PROFILE_PATH, "iddl_data") if not os.path.exists(settings["iddl_data"]): os.makedirs(settings["iddl_data"]) except: pass return settings
def migrate_from_3_to_4(addon: xbmcaddon.Addon) -> int: RANGE_ONCE_TIMERS = 7 TIMER_DAYS_PRESETS = [ [], # off [0], # mon [1], # tue [2], # wed [3], # thu [4], # fri [5], # sat [6], # sun [0], # mons [1], # tues [2], # weds [3], # thus [4], # fris [5], # sats [6], # suns [0, 1, 2, 3], # mon-thu [0, 1, 2, 3, 4], # mon-fri [0, 1, 2, 3, 4, 5], # mon-sat [1, 2, 3, 4], # tue-fri [3, 4, 5], # thu-sat [4, 5], # fri-sat [4, 5, 6], # fri-sun [5, 6], # sat-sun [5, 6, 0], # sat-mon [6, 0, 1, 2], # sun-wed [6, 0, 1, 2, 3], # sun-thu [0, 1, 2, 3, 4, 5, 6] # everyday ] xbmc.log("[script.timers] migrate settings to version 4", xbmc.LOGINFO) for i in range(TIMERS): # rename filename -> path path = addon.getSetting("timer_%i_filename" % i) addon.setSetting("timer_%i_path" % i, path) # days: enum -> multiselect schedule = int("0%s" % addon.getSetting("timer_%i" % i)) if schedule > 0: days = "|".join([str(d) for d in TIMER_DAYS_PRESETS[schedule]]) if days and schedule > RANGE_ONCE_TIMERS: days += "|7" addon.setSetting("timer_%i_days" % i, days) else: addon.setSetting("timer_%i_days" % i, "") return 4
def getWeatherSettings( loc_index="1" ): try: location = Addon.getSetting( 'areacode%s' % loc_index ) SetProperty( "Location", location ) for i in range( 1, 4 ): SetProperty( "Location%i" % i, Addon.getSetting( "areacode%i" % i ) ) SetProperty( "Locations", str( i ) ) Addon.setSetting( 'currentlocation', loc_index ) except: print_exc() return location, loc_index
def getWeatherSettings(loc_index="1"): try: location = Addon.getSetting('areacode%s' % loc_index) SetProperty("Location", location) for i in range(1, 4): SetProperty("Location%i" % i, Addon.getSetting("areacode%i" % i)) SetProperty("Locations", str(i)) Addon.setSetting('currentlocation', loc_index) except: print_exc() return location, loc_index
def compatibility(): from xbmcaddon import Addon Addon = Addon( "weather.google" ) # get old settings and if exists delete data xml if Addon.getSetting( 'risingsun_city' ) or Addon.getSetting( 'risingsun1_city' ): icon = Addon.getAddonInfo( "icon" ) xml = Addon.getAddonInfo( 'profile' ) + 'settings.xml' del Addon import xbmcvfs xbmcvfs.delete( xml ) if not xbmcvfs.exists( xml ): #notifie user xbmc.executebuiltin( "XBMC.Notification(Weather Google,Your settings have been renewed! Sorry!,10000,%s)" % icon )
def onInit( self ): self.getControl( 1 ).setLabel( "XBMC Intro Movie" ) try: self.control_list = self.getControl( 6 ) self.getControl( 5 ).setNavigation( self.control_list, self.control_list, self.control_list, self.control_list ) self.getControl( 3 ).setEnabled( 0 ) self.getControl( 3 ).setVisible( 0 ) except: self.control_list = self.getControl( 3 ) print_exc() try: self.getControl( 5 ).setLabel( "Cancel" ) except: print_exc() intros_dir = os.path.join( Addon.getAddonInfo( "path" ), "resources", "intros" ) previews_dir = os.path.join( Addon.getAddonInfo( "path" ), "resources", "previews" ) listitems = [] cur = Addon.getSetting( "intro" ) for intro in os.listdir( intros_dir ): name, ext = os.path.splitext( intro ) listitem = xbmcgui.ListItem( intro, "", "DefaultVideo.png" ) if cur == intro: listitem.setProperty( "Addon.Summary", "Current Intro" ) preview = os.path.join( previews_dir, name + ".jpg" ) if xbmcvfs.exists( preview ): listitem.setIconImage( preview ) listitems.append( listitem ) listitem = xbmcgui.ListItem( "Random", "", "DefaultAddonVisualization.png" ) if cur == "Random": listitem.setProperty( "Addon.Summary", "Current Intro" ) listitems.append( listitem ) self.control_list.reset() self.control_list.addItems( listitems ) self.setFocus( self.control_list )
def Main( settingID=None ): setfocusid = 200 if settingID == "use_intro_movie": xbmc.executebuiltin( "Skin.ToggleSetting(Use_Intro_Movie)" ) xbmc.sleep( 100 ) setting = ( "false", "true" )[ xbmc.getCondVisibility( "Skin.HasSetting(Use_Intro_Movie" ) ] Addon.setSetting( "use_intro_movie", setting ) xbmc.sleep( 100 ) setfocusid = ( 102, 103 )[ setting == "false" ] elif settingID == "splash": toggle = toggle_splash( Addon.getSetting( "splash" ) ) Addon.setSetting( "splash", toggle ) xbmc.sleep( 500 ) setfocusid = ( 110, 111 )[ toggle == "false" ] elif settingID == "intro": w = DialogSelect( "DialogSelect.xml", Addon.getAddonInfo( "path" ) ) w.doModal() del w setfocusid = 104 xbmc.executebuiltin( "Addon.openSettings(script.xbmc.intro.movie)" ) xbmc.executebuiltin( "SetFocus(200)" ) xbmc.executebuiltin( "SetFocus(%i)" % setfocusid )
def compatibility(): from xbmcaddon import Addon Addon = Addon("weather.google") # get old settings and if exists delete data xml if Addon.getSetting('risingsun_city') or Addon.getSetting( 'risingsun1_city'): icon = Addon.getAddonInfo("icon") xml = Addon.getAddonInfo('profile') + 'settings.xml' del Addon import xbmcvfs xbmcvfs.delete(xml) if not xbmcvfs.exists(xml): #notifie user xbmc.executebuiltin( "XBMC.Notification(Weather Google,Your settings have been renewed! Sorry!,10000,%s)" % icon)
def SetProperties(loc_index=None): in_broad_daylight = True try: if loc_index is None: loc_index = Addon.getSetting("currentlocation") ID = Addon.getSetting("areacode%s_code" % loc_index) i_unit = int(Addon.getSetting("dist_unit")) sun = get_sun(ID, i_unit) in_broad_daylight = sun.get("In.Broad.Daylight") == "true" for key, value in sun.items(): SetProperty(key, value) for key, value in get_moon(ID, i_unit).items(): SetProperty(key, value) SetProperty("Weather.ExtraIsFetched", "true") except: print_exc() return in_broad_daylight
def _ia_cdm_path(cls): ''' Return the specified CDM path for inputstream.adaptive, usually ~/.kodi/cdm ''' try: addon = Addon('inputstream.adaptive') except RuntimeError: return None cdm_path = translate_path(addon.getSetting('DECRYPTERPATH')) if not xbmcvfs.exists(cdm_path): xbmcvfs.mkdir(cdm_path) return cdm_path
def SetProperties(loc_index=None): in_broad_daylight = True try: if loc_index is None: loc_index = Addon.getSetting('currentlocation') ID = Addon.getSetting('areacode%s_code' % loc_index) i_unit = int(Addon.getSetting("dist_unit")) sun = get_sun(ID, i_unit) in_broad_daylight = (sun.get("In.Broad.Daylight") == "true") for key, value in sun.items(): SetProperty(key, value) for key, value in get_moon(ID, i_unit).items(): SetProperty(key, value) SetProperty("Weather.ExtraIsFetched", "true") except: print_exc() return in_broad_daylight
def service(): from xml.dom.minidom import parseString has_splash = "true" dom = None try: dom = parseString( open( xbmc.translatePath( "special://userdata/advancedsettings.xml" ) ).read() ) has_splash = dom.getElementsByTagName( "splash" )[ 0 ].firstChild.nodeValue except: print_exc() if dom: dom.unlink() if Addon.getSetting( "splash" ) != has_splash: Addon.setSetting( "splash", has_splash )
def migrate_from_2_to_3(addon: xbmcaddon.Addon) -> int: xbmc.log("[script.timers] migrate settings to version 3", xbmc.LOGINFO) def _migrate_action(timer, system_action: int, media_action: int) -> None: addon.setSetting("timer_%i_system_action" % timer, str(system_action)) addon.setSetting("timer_%i_media_action" % timer, str(media_action)) for i in range(TIMERS): # splitting media and system actions action = int("0%s" % addon.getSetting("timer_%i_action" % i)) if action == 0: _migrate_action(i, 0, 0) elif action == 1: _migrate_action(i, 0, 1) elif action == 2: _migrate_action(i, 0, 2) elif action == 3: _migrate_action(i, 0, 3) elif action == 4: _migrate_action(i, 0, 5) elif action == 5: _migrate_action(i, 0, 6) elif action == 6: _migrate_action(i, 1, 0) elif action == 7: _migrate_action(i, 2, 0) elif action == 8: _migrate_action(i, 3, 0) elif action == 9: _migrate_action(i, 4, 0) elif action == 10: _migrate_action(i, 5, 0) else: xbmc.log( "[script.timers] Unknown action %s in former settings. Set no action at all." % str(action), xbmc.LOGWARNING) _migrate_action(i, 0, 0) return 3
def ia_cdm_path(): """Return the specified CDM path for inputstream.adaptive, usually ~/.kodi/cdm""" from xbmcaddon import Addon try: addon = Addon('inputstream.adaptive') except RuntimeError: return None cdm_path = translate_path(to_unicode(addon.getSetting('DECRYPTERPATH'))) if not exists(cdm_path): mkdirs(cdm_path) return cdm_path
def _get_cdm_file_path(): if common.get_system_platform() == 'linux': lib_filename = 'libwidevinecdm.so' elif common.get_system_platform() in ['windows', 'uwp']: lib_filename = 'widevinecdm.dll' elif common.get_system_platform() == 'osx': lib_filename = 'libwidevinecdm.dylib' # import ctypes.util # lib_filename = util.find_library('libwidevinecdm.dylib') else: lib_filename = None if not lib_filename: raise Exception( 'Widevine library filename not mapped for this operative system') # Get the CDM path from inputstream.adaptive (such as: ../.kodi/cdm) from xbmcaddon import Addon addon = Addon('inputstream.adaptive') cdm_path = xbmcvfs.translatePath(addon.getSetting('DECRYPTERPATH')) if not common.folder_exists(cdm_path): raise Exception(f'The CDM path {cdm_path} not exists') return common.join_folders_paths(cdm_path, lib_filename)
def fix_path( fixpath ): # fix path if fixpath.lower().startswith( "smb://" ) and IsTrue( Addon.getSetting( "smb_share" ) ): #remove share fixpath = fixpath.replace( "smb://", "" ).replace( "SMB://", "" ) # add login and pass login = Addon.getSetting( "smb_login" ) if login and not fixpath.startswith( login ): fixpath = "%s:%s@%s" % ( login, Addon.getSetting("smb_psw"), fixpath ) fixpath = "smb://" + fixpath elif fixpath.lower().startswith( "ftp://" ) and IsTrue( Addon.getSetting( "ftp_share" ) ): #remove share fixpath = fixpath.replace( "ftp://", "" ).replace( "FTP://", "" ) # add login and pass login = Addon.getSetting( "ftp_login" ) if login and not fixpath.startswith( login ): fixpath = "%s:%s@%s" % ( login, Addon.getSetting("ftp_psw"), fixpath ) fixpath = "ftp://" + fixpath return fixpath
DEVICE = "Linux" elif xbmc.getCondVisibility('system.platform.android'): DEVICE = "Android" else: DEVICE = "Unknown" try: MODEL = platform.release() or 'Unknown' except IOError: # E.g. iOS # It seems that Kodi doesn't allow python to spawn subprocesses in order to # determine the system name # See https://github.com/psf/requests/issues/4434 MODEL = 'Unknown' DEVICENAME = try_decode(_ADDON.getSetting('deviceName')) if not DEVICENAME: DEVICENAME = try_decode(xbmc.getInfoLabel('System.FriendlyName')) _ADDON.setSetting('deviceName', DEVICENAME) DEVICENAME = DEVICENAME.replace(":", "") DEVICENAME = DEVICENAME.replace("/", "-") DEVICENAME = DEVICENAME.replace("\\", "-") DEVICENAME = DEVICENAME.replace("<", "") DEVICENAME = DEVICENAME.replace(">", "") DEVICENAME = DEVICENAME.replace("*", "") DEVICENAME = DEVICENAME.replace("?", "") DEVICENAME = DEVICENAME.replace('|', "") DEVICENAME = DEVICENAME.replace('(', "") DEVICENAME = DEVICENAME.replace(')', "") DEVICENAME = DEVICENAME.replace(' ', "")
elif xbmc.getCondVisibility('system.platform.atv2'): PLATFORM = "AppleTV2" elif xbmc.getCondVisibility('system.platform.ios'): PLATFORM = "iOS" elif xbmc.getCondVisibility('system.platform.windows'): PLATFORM = "Windows" elif xbmc.getCondVisibility('system.platform.raspberrypi'): PLATFORM = "RaspberryPi" elif xbmc.getCondVisibility('system.platform.linux'): PLATFORM = "Linux" elif xbmc.getCondVisibility('system.platform.android'): PLATFORM = "Android" else: PLATFORM = "Unknown" DEVICENAME = tryDecode(_ADDON.getSetting('deviceName')) DEVICENAME = DEVICENAME.replace(":", "") DEVICENAME = DEVICENAME.replace("/", "-") DEVICENAME = DEVICENAME.replace("\\", "-") DEVICENAME = DEVICENAME.replace("<", "") DEVICENAME = DEVICENAME.replace(">", "") DEVICENAME = DEVICENAME.replace("*", "") DEVICENAME = DEVICENAME.replace("?", "") DEVICENAME = DEVICENAME.replace('|', "") DEVICENAME = DEVICENAME.replace('(', "") DEVICENAME = DEVICENAME.replace(')', "") DEVICENAME = DEVICENAME.strip() # Database paths _DB_VIDEO_VERSION = { 13: 78, # Gotham
Language = ADDON.getLocalizedString # ADDON strings LangXBMC = xbmc.getLocalizedString # XBMC strings # for more see [$SOURCE/xbmc/interfaces/json-rpc/ServiceDescription.h] VIDEO_FIELDS_MOVIE = [ "title", "genre", "year", "rating", "director", "trailer", "tagline", "plot", "plotoutline", "originaltitle", "lastplayed", "playcount", "writer", "studio", "mpaa", "cast", "country", "imdbnumber", "runtime", "set", "showlink", "streamdetails", "top250", "votes", "fanart", "thumbnail", "file", "sorttitle", "resume", "setid", "dateadded", "tag" ] SORTTITLE = {"method": "sorttitle", "order": "ascending"} #"descending" # get user separator try: separator = " %s " % ADDON.getSetting("separator") except: separator = " / " # get user prefer order try: SORTTITLE["order"] = ("ascending", "descending")[int(ADDON.getSetting("order"))] except: pass def time_took(t): return str(timedelta(seconds=(time.time() - t))) def _encode(text, encoding="utf-8"):
from xbmcaddon import Addon from loggingexception import LoggingException from BeautifulSoup import BeautifulSoup pluginName = u'plugin.video.irishtv' pluginHandle = int(sys.argv[1]) baseURL = sys.argv[0] addon = Addon(pluginName) language = addon.getLocalizedString import mycgi from httpmanager import HttpManager dbg = addon.getSetting(u"debug") == u"true" dbglevel = 3 from utils import log from socket import setdefaulttimeout from socket import getdefaulttimeout import utils import rtmp import providerfactory from provider import Provider xhausUrl = "http://www.xhaus.com/headers" # Use masterprofile rather profile, because we are caching data that may be used by more than one user on the machine
# -*- coding: utf-8 -*- from xbmcaddon import Addon from xbmc import translatePath from os import mkdir from os.path import join, exists from datetime import timedelta try: from resources.lib import strings except ImportError: import strings addon = Addon('plugin.program.super.favourites.xmltv') DEBUG = True if addon.getSetting('debug.mode') == 'true' else False ''' ============================== ''' ''' Global addon infos ''' ''' ============================== ''' def checkMandatorySettings(): # Checking xmltv type try: if getXMLTVSourceType() == AddonConst.XMLTV_SOURCE_URL: if not getXMLTVURLRemote(): return False, strings.XMLTV_NO_URL_PROVIDED elif getXMLTVSourceType() == AddonConst.XMLTV_SOURCE_LOCAL: if not getXMLTVURLLocal(): return False, strings.XMLTV_NO_FILE_PROVIDED if getSFFolder() == 'special://profile':
provider.initialise(httpManager, sys.argv[0], pluginHandle, addon, language, PROFILE_DATA_FOLDER, RESOURCE_PATH) provider.SetSubtitlePaths(SUBTITLE_FILE, NO_SUBTITLE_FILE) success = provider.ExecuteCommand(mycgi) log(u"executeCommand done", xbmc.LOGDEBUG) return success if __name__ == "__main__": try: log(u"Name: %s, Version: %s" % (name, version), xbmc.LOGDEBUG) if addon.getSetting('http_cache_disable_adv') == 'false': httpManager.SetCacheDir(CACHE_FOLDER) InitTimeout() # Each command processes a web page # Get the web page from the cache if it's there # If there is an error when processing the web page from the cache # we want to try again, this time getting the page from the web httpManager.setGetFromCache(True) success = executeCommand() xbmc.log( u"success: %s, getGotFromCache(): %s" % (unicode(success), unicode(httpManager.getGotFromCache())), xbmc.LOGDEBUG)
class MouseTracker: # ( Thread ): def __init__(self): # Thread.__init__( self ) self.winId = None self.window = None self.reload_addon = False self.addon = Addon("script.mouse.tracker.service") self.getMedias() self.current_pos = (0, 0) self.run() # self.start() def getMedias(self): self.sprite = self.addon.getSetting("sprite") # "Dog" self.speed = self.addon.getSetting("speed").split(".")[0] # "300" try: # get control and sprites in xml spriteDir = os.path.join(self.addon.getAddonInfo("path"), "resources", "skins", self.sprite, "media") xml = windowXML("%s.xml" % self.sprite, self.addon.getAddonInfo("path"), self.sprite, spriteDir=spriteDir) # get our controls, before del xml self.image = xml.control self.sprites = xml.sprites # del window object del xml self.imgId = self.image.getId() self.offsetx = 0 # self.image.getPosition()[ 0 ] except: print_exc() raise def getWindow(self): current_win_id = xbmcgui.getCurrentWindowId() if self.winId != current_win_id or not self.window: self.winId = current_win_id self.window = xbmcgui.Window(self.winId) self.getControl() def getControl(self): self.window.addControl(self.image) self.imgId = self.image.getId() self.control = self.window.getControl(self.imgId) self.control.setVisibleCondition("Window.IsActive(Pointer.xml)") self.setAnimation(xbmcgui.getMousePosition()) # , (640,360) )#self.control.getPosition() ) def setAnimation(self, pos, start=""): if start: start = "%i,%i" % start else: start = "%i,%i" % self.current_pos end = "%i,%i" % (pos[0] - self.offsetx, pos[1]) # self.speed = str( self.current_pos[ 0 ] - pos[ 0 ] ).strip( "-" ) self.control.setAnimations( [("conditional", "condition=true effect=slide start=%s end=%s time=%s" % (start, end, self.speed))] ) def run(self): try: play_sfx = False # NB: xbmc.abortRequested not work correctly with threading.Thread while not xbmc.abortRequested: try: self.getWindow() if self.sprite != self.addon.getSetting("sprite"): self.getMedias() if not xbmc.getCondVisibility("Window.IsActive(Pointer.xml)"): time.sleep(0.3) continue pos = xbmcgui.getMousePosition() if ((pos[0] - self.offsetx) == self.current_pos[0]) and (pos[1] == self.current_pos[1]): self.control.setImage(self.sprites["wait"]) if play_sfx: if self.sprites["sfx"] and self.addon.getSetting("playsfx") == "true": xbmc.playSFX(self.sprites["sfx"]) play_sfx = False else: play_sfx = True if pos[0] < self.current_pos[0]: self.control.setImage(self.sprites["left"]) else: self.control.setImage(self.sprites["right"]) # start = "%i,%i" % self.current_pos # end = "%i,%i" % ( pos[ 0 ]-self.offsetx, pos[ 1 ] ) ##self.speed = str( self.current_pos[ 0 ] - pos[ 0 ] ).strip( "-" ) # self.control.setAnimations( [ ( 'conditional', 'condition=true effect=slide start=%s end=%s time=%s' % ( start, end, self.speed ) ) ] ) self.setAnimation(pos) self.current_pos = (pos[0] - self.offsetx, pos[1]) # self.control.setPosition( *self.current_pos ) if xbmc.getCondVisibility("Window.IsActive(addonsettings)"): self.reload_addon = True elif self.reload_addon: self.addon = Addon("script.mouse.tracker.service") self.speed = self.addon.getSetting("speed").split(".")[0] self.reload_addon = False except SystemExit: break except: print_exc() time.sleep(float(int(self.speed)) * 0.001) except SystemExit: pass except: print_exc()
def getTVShows( format="list", isReload=False ): # on recup la liste des series en biblio if isReload: import xbmcaddon globals().update( { "Addon": xbmcaddon.Addon( 'script.tvtunes' ) } ) del xbmcaddon # start time st = time.time() # list of tvshows tvshows = [] # execute JSONRPC if supported if hasattr( xbmc, "executeJSONRPC" ): from utils.jsonrpc import jsonrpcAPI jsonapi = jsonrpcAPI() # json statement for get tvshows tvshows = jsonapi.VideoLibrary.GetTVShows( properties=[ "file", "thumbnail" ], sort={ "method": "label", "order": "ascending" } ).get( "tvshows", [] ) # fixe me: check if file is empty, reset if empty if tvshows and not tvshows[ 0 ].get( "file" ): tvshows = [] # use sql if tvshows is empty or running on XBMC4Xbox if not tvshows: from urllib import quote_plus # sql statement for tv shows sql_data = "SELECT tvshow.c00, path.strPath FROM tvshow, path, tvshowlinkpath WHERE path.idPath=tvshowlinkpath.idPath AND tvshow.idShow=tvshowlinkpath.idShow GROUP BY tvshow.c00" # get tvshows xml_data = xbmc.executehttpapi( "QueryVideoDatabase(%s)" % quote_plus( sql_data ), ) # set list of tvshows for label, file in re.findall( "<field>(.*?)</field><field>(.*?)</field>", xml_data, re.DOTALL ): # get cached thumb c_thumb = xbmc.getCacheThumbName( file ) icon = "special://profile/Thumbnails/Video/%s/%s" % ( c_thumb[ 0 ], c_thumb ) # add show to listing tvshows.append( { "label": _unicode( label ), "file": file, "thumbnail": icon } ) # print time to parse tvshows LOGGER.notice.LOG( "Getting TVShows took %s", time_took( st ) ) st = time.time() path2 = Addon.getSetting( "customtunesfolder" ) # reset custom path if not exists if not path_exists( path2 ): path2 = "" default_folder = IsTrue( Addon.getSetting( "savetuneintvshowfolder" ) ) separate = IsTrue( Addon.getSetting( "saveinseparatefolder" ) ) listitems = [] for tvshow in tvshows: # get tune path tune = getThemePath( tvshow[ "file" ], path2, tvshow[ "label" ], default_folder, separate ) #print "%r" % tune # initialize listitem listitem = xbmcgui.ListItem( tvshow[ "label" ], tvshow[ "file" ], tvshow[ "thumbnail" ] ) listitem.setPath( tvshow[ "file" ] ) # set images properties banner = tvshow[ "file" ] + "banner.jpg" listitem.setProperty( "banner", ( "", banner )[ path_exists( banner ) ] ) logo = tvshow[ "file" ] + "logo.png" listitem.setProperty( "logo", ( "", logo )[ path_exists( logo ) ] ) # set tune properties listitem.setProperty( "tune", tune ) listitem.setProperty( "IsPlayable", ( "", "true" )[ tune != "" ] ) # set music info listitem.setInfo( 'music', { 'title': tvshow[ "label" ], 'Artist': 'TvTunes', 'Album': 'Eden-pre' } ) # add item if format == "dict": listitem = ( tvshow[ "label" ], listitem ) listitems.append( listitem ) if format == "dict": listitems = dict( listitems ) # print time to set list LOGGER.notice.LOG( "Setup listitems took %s", time_took( st ) ) # return listing return listitems
self._close_dialog() except: LOGGER.error.exc_info(sys.exc_info(), self) self._close_dialog() def _close_dialog(self): self.close() xbmc.sleep(600) if (__name__ == "__main__"): mtime = sum([os.path.getmtime(db) for db in DB_PATHS]) w = Manager("script-MovieSets-Manager.xml", ADDON_DIR) w.doModal() del w if ADDON.getSetting("exporting") == "true" and sum( [os.path.getmtime(db) for db in DB_PATHS]) > mtime: if xbmcgui.Dialog().yesno( "Movie Sets changed...", "If you want save your change in NFO files.", LangXBMC(647), "", LangXBMC(222), LangXBMC(650)): xbmc.executebuiltin("ActivateWindow(VideosSettings)") # set Library button xbmc.executebuiltin("SetFocus(-100)") # set Export video library button xbmc.executebuiltin("SetFocus(-73)") # select Export video library xbmc.executebuiltin("Action(Select)")
# Modules General from hashlib import sha1 from base64 import b64encode # Modules XBMC import xbmc import xbmcvfs from xbmcaddon import Addon # get scraper object AddonId = "metadata.passion.xbmc.org" Addon = Addon(AddonId) # set variables token = Addon.getSetting("token" + settingMP) token64 = Addon.getSetting("token64" + settingMP) login = Addon.getSetting("username" + settingMP) passw = Addon.getSetting("password" + settingMP) if settingId == "username" + settingMP: heading = Addon.getLocalizedString(30003) default = login hidden = False elif settingId == "password" + settingMP: heading = Addon.getLocalizedString(30004 + int(bool(settingMP))) default = passw hidden = True # condition pour mettre a jour la base UpdateUserDB = False
up = browser( **browser_attrs ) update = update or up showInfo( idset, update, setfocus ) except: LOGGER.error.print_exc() del w xbmc.executebuiltin( "Skin.Reset(MovieSets.Sleep)" ) return update if ( __name__ == "__main__" ): try: idset = None strListItem = "Container(%s).ListItem" % ADDON.getSetting( "containerId" ) if IsTrue( xbmc.getInfoLabel( "%s.Property(IsSet)" % strListItem ) ): idset = xbmc.getInfoLabel( "%s.Label2" % strListItem ) elif xbmc.getInfoLabel( "ListItem.Path" ).startswith( "videodb://1/7" ): #test path videodb://1/7/1/ from re import search i = search( "videodb://1/7/(.*?)/", xbmc.getInfoLabel( "ListItem.Path" ) ) if i: idset = i.group( 1 ) if idset is not None: if showInfo( idset ): try: xbmcgui.Window( 10025 ).setProperty( "MovieSets.Update", "true" ) except: xbmc.executebuiltin( "SetProperty(MovieSets.Update,true)" ) except: LOGGER.error.print_exc()
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)
)) # recent tracks: artwork.recent_1.setLabel('- [B]{0}[/B] by {1}'.format( recent_tracks['recently_played'][0]['title'], recent_tracks['recently_played'][0]['artist'] )) artwork.recent_2.setLabel('- [B]{0}[/B] by {1}'.format( recent_tracks['recently_played'][1]['title'], recent_tracks['recently_played'][1]['artist'] )) artwork.recent_3.setLabel('- [B]{0}[/B] by {1}'.format( recent_tracks['recently_played'][2]['title'], recent_tracks['recently_played'][2]['artist'] )) sleep(5000) log('Artwork closed') del artwork if __name__ == '__main__': PLUGIN.run() # empty previous thumbnails or create add-on data folder: if os.path.exists(ADDON_DATA_FOLDER): empty_directory(ADDON_DATA_FOLDER) else: os.makedirs(ADDON_DATA_FOLDER) if sys.argv[0] == 'PLUGIN://{0}/'.format(ADDON_ID) and not ADDON.getSetting('username'): executebuiltin('Notification("{0}", "{1}", 6000, "special://home/addons/{2}/icon.png")' .format(ADDON.getLocalizedString(30000), ADDON.getLocalizedString(32202), ADDON_ID))
# -*- coding: utf-8 -*- import os import re import sys import time from traceback import print_exc try: import xbmc import xbmcgui from xbmcaddon import Addon Addon = Addon( "weather.google" ) WEATHER_WINDOW = xbmcgui.Window( 12600 ) ICONS_SET = int( Addon.getSetting( 'icons_set' ) ) CURRENT_LOCATION = int( Addon.getSetting( 'currentlocation' ) ) - 1 WEATHER_ICONS = os.path.join( Addon.getAddonInfo( 'path' ), "resources", "images", "" ) CUSTOM_ICONS = os.path.join( Addon.getSetting( 'custom_icons' ), "" ) DATE_TIME_FORMAT = "%s %s" % ( xbmc.getRegion( "dateshort" ), xbmc.getRegion( "time" ) ) CELSIUS_FORMAT = ( "C" in xbmc.getRegion( "tempunit" ) ) WEATHER_XML = os.path.join( xbmc.translatePath( Addon.getAddonInfo( 'profile' ) ), "weather.xml" ) if not os.path.exists( xbmc.translatePath( Addon.getAddonInfo( 'profile' ) ) ): os.makedirs( xbmc.translatePath( Addon.getAddonInfo( 'profile' ) ) ) except: # NOT RUNNING ON XBMC, ON DEV WEATHER_WINDOW = None ICONS_SET = 2 WEATHER_ICONS = "" CUSTOM_ICONS = ""
import os import sys import xbmc import xbmcgui import xbmcplugin from xbmcaddon import Addon from resources.lib import get_url, metaInfo, extractMY, dbHelper import re import json ADDON = Addon(id='plugin.video.multiplex') ADDON_PATH = ADDON.getAddonInfo("path") addon_handle = int(sys.argv[1]) base_url = sys.argv[0] download_path = ADDON.getSetting("download_path") icon = 'https://image.tmdb.org/t/p/w185' full = 'https://image.tmdb.org/t/p/w780' bgFile = xbmc.translatePath( os.path.join('special://home/addons/plugin.video.multiplex/resources', 'fanart.jpg')) def menu(): """ Creating a listing for Current Downloads. """ listing = dbHelper.show() for item in listing: download = extractMY.extract(item[0]) movie = download['name']
elif xbmc.getCondVisibility('system.platform.atv2'): PLATFORM = "AppleTV2" elif xbmc.getCondVisibility('system.platform.ios'): PLATFORM = "iOS" elif xbmc.getCondVisibility('system.platform.windows'): PLATFORM = "Windows" elif xbmc.getCondVisibility('system.platform.raspberrypi'): PLATFORM = "RaspberryPi" elif xbmc.getCondVisibility('system.platform.linux'): PLATFORM = "Linux" elif xbmc.getCondVisibility('system.platform.android'): PLATFORM = "Android" else: PLATFORM = "Unknown" if _ADDON.getSetting('deviceNameOpt') == "false": # Use Kodi's deviceName DEVICENAME = tryDecode(xbmc.getInfoLabel('System.FriendlyName')) else: DEVICENAME = tryDecode(_ADDON.getSetting('deviceName')) DEVICENAME = DEVICENAME.replace("\"", "_") DEVICENAME = DEVICENAME.replace("/", "_") # Database paths _DB_VIDEO_VERSION = { 13: 78, # Gotham 14: 90, # Helix 15: 93, # Isengard 16: 99, # Jarvis 17: 107, # Krypton 18: 107 # Leia
try: from xbmcaddon import Addon __settings__ = Addon( id="script.calendar" ) __language__ = __settings__.getLocalizedString print "Mode AddOn ON" except : __settings__ = xbmc.Settings(ROOTDIR) __language__ = xbmc.getLocalizedString print "Mode plugin ON" firstWeekDay = __settings__.getSetting("fwday") print firstWeekDay if firstWeekDay == "true" : calendar.setfirstweekday(6) else : calendar.setfirstweekday(0) class Agenda : def __init__(self): self.monthName = calendar.month_name
# Modules General from hashlib import sha1 from base64 import b64encode # Modules XBMC import xbmc import xbmcvfs from xbmcaddon import Addon # get scraper object AddonId = "metadata.passion.xbmc.org" Addon = Addon( AddonId ) # set variables token = Addon.getSetting( "token" + settingMP ) token64 = Addon.getSetting( "token64" + settingMP ) login = Addon.getSetting( "username" + settingMP ) passw = Addon.getSetting( "password" + settingMP ) if settingId == "username" + settingMP: heading = Addon.getLocalizedString( 30003 ) default = login hidden = False elif settingId == "password" + settingMP: heading = Addon.getLocalizedString( 30004 + int( bool( settingMP ) ) ) default = passw hidden = True # condition pour mettre a jour la base UpdateUserDB = False
LangXBMC = xbmc.getLocalizedString # XBMC strings # for more see [$SOURCE/xbmc/interfaces/json-rpc/ServiceDescription.h] VIDEO_FIELDS_MOVIE = [ "title", "genre", "year", "rating", "director", "trailer", "tagline", "plot", "plotoutline", "originaltitle", "lastplayed", "playcount", "writer", "studio", "mpaa", "cast", "country", "imdbnumber", "runtime", "set", "showlink", "streamdetails", "top250", "votes", "fanart", "thumbnail", "file", "sorttitle", "resume", "setid", "dateadded", "tag" ] SORTTITLE = { "method": "sorttitle", "order": "ascending" } #"descending" # get user separator try: separator = " %s " % ADDON.getSetting( "separator" ) except: separator = " / " # get user prefer order try: SORTTITLE[ "order" ] = ( "ascending", "descending" )[ int( ADDON.getSetting( "order" ) ) ] except: pass def time_took( t ): return str( timedelta( seconds=( time.time() - t ) ) ) def _encode( text, encoding="utf-8" ): try: text = text.encode( encoding ) except: pass return text
def getContainerMovieSets(infoSet=None): jsonapi = jsonrpc.jsonrpcAPI() # GET MOVIESETS json = jsonapi.VideoLibrary.GetMovieSets(properties=VIDEO_FIELDS_MOVIESET) movie_sets = json.get("sets", []) total = json.get("limits", {}).get("total") or len(movie_sets) # print total # dico for synchronize main container on VideoLibrary with virtual container of MovieSets moviesets = {} if infoSet is not None: # get only one user want info listitems = [] else: # set dymmy listitem, label: container title , label2: total movie sets listitems = [xbmcgui.ListItem("Container MovieSets", str(total))] # reload addon settings try: ADDON = Addon("script.moviesets") except: pass # get user separator try: separator = " %s " % ADDON.getSetting("separator") except: separator = " / " # get user prefer order try: SORTTITLE["order"] = ("ascending", "descending")[int(ADDON.getSetting("order"))] except: pass # enum movie sets for countset, movieset in enumerate(movie_sets): # print movieset.keys()#[u'title', u'fanart', u'label', u'playcount', u'thumbnail', u'setid'] try: idSet = movieset["setid"] # print ( idSet, infoSet, str( idSet ) != infoSet ) if infoSet is not None and str(idSet) != infoSet: continue # get only one user want info # get saga icon icon = movieset["thumbnail"] icon = ("", icon)[path_exists(translatePath(icon))] # get saga fanart # d, f = os.path.split( movieset[ 'thumbnail' ] ) # c_fanart = "%sFanart/%s" % ( d[ :-1 ], f ) c_fanart = movieset["fanart"] Fanart_Image = ("", c_fanart)[path_exists(translatePath(c_fanart))] # fixe me: xbmc not change/reload/refresh image if path is same if Fanart_Image: Fanart_Image = get_cached_thumb(Fanart_Image) if icon: icon = get_cached_thumb(icon) # set movieset listitem listitem = xbmcgui.ListItem(movieset["label"], str(idSet), icon, icon) # listitem.setPath( "ActivateWindow(10025,videodb://1/7/%i/)" % idSet ) # get movies list of movieset # not good, return only Video.Fields.MovieSet. [use Files.GetDirectory for more fields] # json = jsonapi.VideoLibrary.GetMovieSetDetails( setid=idSet, properties=VIDEO_FIELDS_MOVIESET ) json = jsonapi.Files.GetDirectory( directory="videodb://1/7/%i/" % idSet, properties=VIDEO_FIELDS_MOVIE, sort=SORTTITLE, media="video" ) movies = json.get("files", []) total_movies = json.get("limits", {}).get("total") or len(movies) # set base variables watched, unwatched = 0, total_movies rating, votes = 0.0, 0 plotset = "" mpaa = set() studios = set() genres = set() years = set() # fanartsets = set() countries = set() stackpath = [] stacktrailer = [] duration = 0.1 iWidth = 0 iHeight = 0 aspect = 0.0 # enum movies for count, movie in enumerate(movies): if not bool(movie): continue # print movie.keys()#[u'rating', u'set', u'filetype', u'file', u'year', u'id', u'streamDetails', u'plot', u'votes', u'title', u'fanart', u'mpaa', u'writer', u'label', u'type', u'thumbnail', u'plotoutline', u'resume', u'director', u'imdbnumber', u'studio', u'showlink', u'genre', u'productioncode', u'country', u'premiered', u'originaltitle', u'cast', u'tagline', u'playcount', u'runtime', u'top250', u'trailer'] # for more infos # print jsonapi.VideoLibrary.GetMovieDetails( movieid=int(movie["id"]), properties=VIDEO_FIELDS_MOVIE ) # print movie[ "votes" ] # continue try: # optional try: sdv = movie["streamdetails"].get("video", [{}]) duration += sum(d.get("duration", 0) for d in sdv) iWidth += sum(w.get("width", 0) for w in sdv) iHeight += sum(h.get("height", 0) for h in sdv) aspect += sum(a.get("aspect", 0) for a in sdv) except: pass # update mpaa if movie.get("mpaa"): mpaa.add(movie["mpaa"]) # set watched count # print movie.get( "playcount" ) if bool(movie["playcount"]): watched += 1 # update genres and years if movie["year"] > 0: years.add(str(movie["year"])) try: genres.update(movie["genre"].split(" / ")) except: genres.update(movie["genre"]) genres.discard("") # add country if movie.get("country"): try: countries.update(movie["country"].split(" / ")) except: countries.update(movie["country"]) countries.discard("") # add studio if movie.get("studio"): try: studios.update(movie["studio"].split(" / ")) except: studios.update(movie["studio"]) studios.discard("") # add plot movie to plotset plotset += "[B]%(title)s (%(year)s)[/B][CR]%(plot)s[CR][CR]" % movie # set stack, add movie path and trailer if movie.get("trailer"): stacktrailer.append(movie["trailer"]) stackpath.append(movie["file"]) # use first path if stacked. for prevent this [WARNING: XFILE::CFileFactory::CreateLoader - Unsupported protocol(stack) in path_exists( moviepath + "extrafanart" )] if "stack://" in movie["file"]: movie["file"] = movie["file"][8:].split(" , ")[0] # set RatingAndVotes info rating += movie.get("rating", 0.0) try: votes += int(movie.get("votes", "0").replace(",", "")) except: pass # set movies properties 'plot', 'votes', 'rating', 'fanart', 'title', 'label', # 'file', 'year', 'genre','playcount', 'runtime', 'thumbnail', 'trailer' b_property = "movie.%i." % (count + 1) moviepath = os.path.dirname(movie["file"]) + ("/", "\\")[not movie["file"].count("/")] listitem.setProperty(b_property + "Title", movie["title"]) listitem.setProperty(b_property + "sortTitle", movie.get("sorttitle", "")) listitem.setProperty(b_property + "Filename", os.path.basename(movie["file"])) listitem.setProperty(b_property + "Path", moviepath) listitem.setProperty(b_property + "Plot", movie["plot"]) listitem.setProperty(b_property + "Year", str(movie["year"] or "")) listitem.setProperty(b_property + "Trailer", movie.get("trailer", "")) # set icon property icon = movie["thumbnail"] icon = ("", icon)[path_exists(translatePath(icon))] # print repr( icon ) if not icon: # check for auto- _path, _file = os.path.split(icon) a_icon = os.path.join(_path, "auto-" + _file) icon = ("", a_icon)[path_exists(translatePath(a_icon))] listitem.setProperty(b_property + "Icon", icon) # set fanart property fanart = movie["fanart"] fanart = ("", fanart)[path_exists(translatePath(fanart))] listitem.setProperty(b_property + "Fanart", fanart) if fanart and not Fanart_Image: Fanart_Image = fanart # set extrafanart: if not exists set empty extrafanart = moviepath + "extrafanart" extrafanart = ("", extrafanart)[path_exists(extrafanart)] listitem.setProperty(b_property + "ExtraFanart", extrafanart) # set extrafanart for movieset if exists set first found # fanartsets.add( os.path.dirname( os.path.dirname( moviepath ) ) ) if listitem.getProperty("ExtraFanart"): continue fanartset = os.path.dirname(os.path.dirname(moviepath)) fanartset += ("/", "\\")[not fanartset.count("/")] + "extrafanart" if path_exists(fanartset): listitem.setProperty("ExtraFanart", fanartset) elif extrafanart: listitem.setProperty("ExtraFanart", extrafanart) # print _encode(movie[ "file" ]), _encode(moviepath), _encode(fanartset) # print "-"*100 except: LOGGER.error.print_exc() # set movieset properties listitem.setProperty("IsSet", "true") listitem.setProperty("idSet", str(idSet)) listitem.setProperty("WatchedMovies", str(watched)) listitem.setProperty("UnWatchedMovies", str(unwatched - watched)) listitem.setProperty("TotalMovies", str(total_movies)) listitem.setProperty("Fanart_Image", Fanart_Image) listitem.setProperty("Years", separator.join(sorted(years, reverse=(SORTTITLE["order"] == "descending")))) try: listitem.setProperty("StarRating", getStarRating(rating / float(total_movies))) except: listitem.setProperty("StarRating", "rating0.png") listitem.setProperty("Countries", separator.join(countries)) listitem.setProperty( "VideoResolution", VideoDimsToResolutionDescription(int(iWidth / total_movies), int(iHeight / total_movies)), ) listitem.setProperty("VideoAspect", VideoAspectToAspectDescription(float(aspect / total_movies))) # set stack path stackpath = " ; ".join(stackpath) if " ; " in stackpath: stackpath = "stackset://" + stackpath listitem.setPath(quote_plus(_encode(stackpath))) # set stack trailer stacktrailer = " , ".join(stacktrailer) if " , " in stacktrailer: stacktrailer = "stack://" + stacktrailer # set listitem infoslabels listitem.setInfo( "video", { "plot": plotset, "votes": str(votes), "title": movieset["label"], "studio": separator.join(studios), # "duration": str( round( duration / 60.0, 2 ) ), "duration": str(int(duration / 60.0)), "rating": (rating / float(total_movies)), "genre": separator.join(sorted([g.strip() for g in genres])), "mpaa": separator.join([m.strip() for m in mpaa]), "trailer": stacktrailer, }, ) moviesets[_encode(movieset["label"])] = countset + 1 listitems.append(listitem) if infoSet is not None and idSet == infoSet: moviesets[movieset["label"]] = 0 break # get only one user want info except: LOGGER.error.print_exc() return listitems, moviesets
import json import xbmc import xbmcgui import xbmcplugin import requests from bs4 import BeautifulSoup from xbmcaddon import Addon from urlparse import parse_qsl from resources.lib import extractMY, get_url, metaInfo, dbHelper from resources.lib.custom_api import linkstock, keeplinks import concurrent.futures from concurrent.futures import ThreadPoolExecutor addon_handle = int(sys.argv[1]) ADDON = Addon(id='plugin.video.multiplex') main_url = ADDON.getSetting("main_url") xbetmovies = ADDON.getSetting("xbetmovies") icon = 'https://image.tmdb.org/t/p/w185' full = 'https://image.tmdb.org/t/p/w780' bgFile = xbmc.translatePath( 'special://home/addons/plugin.video.multiplex/resources/fanart.jpg') n = 1 def getPrimaryLinks(url): page = requests.get(url) soup = BeautifulSoup(page.content, 'html.parser') links = (d["href"] for d in soup.select(".bw_thumb a")) return links
class NetflixCommon(object): """ Stuff shared between / used from service and addon""" def __init__(self, plugin_handle, base_url): self.addon = Addon() self.data_path = xbmc.translatePath(self.addon.getAddonInfo('profile')) self.cookie_path = self.data_path + 'COOKIE' self.plugin = self.addon.getAddonInfo('name') self.verb_log = self.addon.getSetting('logging') == 'true' self.plugin_handle = plugin_handle self.base_url = base_url self.version = self.addon.getAddonInfo('version') xbmcvfs.mkdir(path=self.data_path) def get_addon(self): """Return the current addon instance""" return self.addon def get_addon_info(self, name): """Return the current addon instance""" return self.addon.getAddonInfo(name) def set_setting(self, key, value): return self.addon.setSetting(key, value) def get_setting(self, key): return self.addon.getSetting(key) def flush_settings(self): self.addon = Addon() def get_esn(self): """ Returns the esn from settings """ return self.addon.getSetting('esn') def set_esn(self, esn): """ Returns True if MSL reset is required """ stored_esn = self.get_esn() if not stored_esn and esn: self.set_setting('esn', esn) return True return False def get_credentials(self): from NetflixCredentials import NetflixCredentials email = self.get_setting('email') password = self.get_setting('password') if '@' in email: self.set_credentials(email, password) return {'email': email, 'password': password} return NetflixCredentials().decode_credentials(email, password) def set_credentials(self, email, password): from NetflixCredentials import NetflixCredentials encoded = NetflixCredentials().encode_credentials(email, password) self.set_setting('email', encoded['email']) self.set_setting('password', encoded['password']) def log(self, msg, level=xbmc.LOGDEBUG): """Adds a log entry to the Kodi log Parameters ---------- msg : :obj:`str` Entry that should be turned into a list item level : :obj:`int` Kodi log level """ if isinstance(msg, unicode): msg = msg.encode('utf-8') xbmc.log('[%s] %s' % (self.plugin, msg.__str__()), level) @staticmethod def check_folder_path(path): """ Check if folderpath ends with path delimator If not correct it (makes sure xbmcvfs.exists is working correct) """ if isinstance(path, unicode): check = path.encode('ascii', 'ignore') if '/' in check and not str(check).endswith('/'): end = u'/' path = path + end return path if '\\' in check and not str(check).endswith('\\'): end = u'\\' path = path + end return path if '/' in path and not str(path).endswith('/'): path = path + '/' return path if '\\' in path and not str(path).endswith('\\'): path = path + '\\' return path @staticmethod def file_exists(data_path, filename): """ Checks if a given file exists :param filename: The filename :return: True if so """ return xbmcvfs.exists(path=data_path + filename) @staticmethod def save_file(data_path, filename, content): """ Saves the given content under given filename :param filename: The filename :param content: The content of the file """ file_handle = xbmcvfs.File(filepath=data_path + filename, mode='w') file_content = file_handle.write(content) file_handle.close() @staticmethod def load_file(data_path, filename): """ Loads the content of a given filename :param filename: The file to load :return: The content of the file """ file_handle = xbmcvfs.File(filepath=data_path + filename) file_content = file_handle.read() file_handle.close() return file_content @staticmethod def list_dir(data_path): return xbmcvfs.listdir(data_path)
import os import re import sys from urllib import quote_plus, unquote_plus from traceback import print_exc #modules XBMC import xbmc import xbmcgui from xbmcaddon import Addon ADDON = Addon("plugin.video.tou.tv") ADDON_NAME = ADDON.getAddonInfo("name") ADDON_CACHE = xbmc.translatePath(ADDON.getAddonInfo("profile")) CACHE_EXPIRE_TIME = float( ADDON.getSetting("expiretime").replace("0", ".5").replace("25", "0")) SCRIPT_REFRESH = os.path.join(ADDON.getAddonInfo('path'), "resources", "lib", "refresh.py") LangXBMC = xbmc.getLocalizedString import scraper STRING_FOR_ALL = "[B]CONTENU accessible à TOUS[/B] - Cette émission peut être regardée partout dans le monde." FAVOURITES_XML = os.path.join(ADDON_CACHE, "favourites.xml") G_GENRE = unicode(xbmc.getInfoLabel("ListItem.Genre"), "utf-8") #ACTION_INFO = not bool( xbmc.getInfoLabel( "ListItem.Episode" ) ) WINDOW_PROGRESS = None
from loggingexception import LoggingException from BeautifulSoup import BeautifulSoup pluginName = u'plugin.video.irishtv' pluginHandle = int(sys.argv[1]) baseURL = sys.argv[0] addon = Addon(pluginName) language = addon.getLocalizedString import mycgi from httpmanager import HttpManager dbg = addon.getSetting(u"debug") == u"true" dbglevel = 3 from utils import log from socket import setdefaulttimeout from socket import getdefaulttimeout import utils import rtmp import providerfactory from provider import Provider xhausUrl = "http://www.xhaus.com/headers" # Use masterprofile rather profile, because we are caching data that may be used by more than one user on the machine
# Modules General from hashlib import sha1 from base64 import b64encode # Modules XBMC import xbmc import xbmcvfs from xbmcaddon import Addon # get scraper object AddonId = "metadata.media.passion.org" Addon = Addon( AddonId ) # set variables token = Addon.getSetting( "token" ) token64 = Addon.getSetting( "token64" ) login = Addon.getSetting( "username" ) passw = Addon.getSetting( "password" ) if settingId == "username": heading = Addon.getLocalizedString( 30001 ) default = login hidden = False elif settingId == "password": heading = Addon.getLocalizedString( 30002 ) default = passw hidden = True # condition pour mettre a jour la base UpdateUserDB = False
# -*- coding: utf-8 -*- import os import sys import xbmc from xbmcaddon import Addon SCRIPT = None ARGS = "".join( sys.argv[ 1:2 ] ) ADDON = Addon( 'script.tvtunes' ) if "backend" in ARGS.lower(): if xbmc.getInfoLabel( "Window(10025).Property(TvTunesIsRunning)" ).lower() != "true": SCRIPT = ( "tvtunes_backend", "tunesplayer" )[ ADDON.getSetting( "useplayerv2" ).lower() == "true" ] else: SCRIPT = "tvtunes" if SCRIPT: xbmc.executebuiltin( 'RunScript(%s.py,%s)' % ( os.path.join( ADDON.getAddonInfo( 'path' ), "resources", "lib", SCRIPT ), ARGS ) )
import os import re import sys from urllib import quote_plus, unquote_plus from traceback import print_exc #modules XBMC import xbmc import xbmcgui from xbmcaddon import Addon ADDON = Addon( "plugin.video.tou.tv" ) ADDON_NAME = ADDON.getAddonInfo( "name" ) ADDON_CACHE = xbmc.translatePath( ADDON.getAddonInfo( "profile" ) ) CACHE_EXPIRE_TIME = float( ADDON.getSetting( "expiretime" ).replace( "0", ".5" ).replace( "25", "0" ) ) SCRIPT_REFRESH = os.path.join( ADDON.getAddonInfo( 'path' ), "resources", "lib", "refresh.py" ) LangXBMC = xbmc.getLocalizedString import scraper STRING_FOR_ALL = "[B]CONTENU accessible à TOUS[/B] - Cette émission peut être regardée partout dans le monde." FAVOURITES_XML = os.path.join( ADDON_CACHE, "favourites.xml" ) G_GENRE = unicode( xbmc.getInfoLabel( "ListItem.Genre" ), "utf-8" ) #ACTION_INFO = not bool( xbmc.getInfoLabel( "ListItem.Episode" ) ) WINDOW_PROGRESS = None
import os import sys import xbmc import xbmcgui import xbmcplugin from xbmcaddon import Addon from resources.lib import get_url, dbHelper, extractMY from urlparse import parse_qsl import re import json base_url = sys.argv[0] addon_handle = int(sys.argv[1]) settings = Addon(id='plugin.video.multiplex') main_url = settings.getSetting("main_url") download_path = settings.getSetting("download_path") icon = 'https://image.tmdb.org/t/p/w185' full = 'https://image.tmdb.org/t/p/w780' bgFile = xbmc.translatePath( os.path.join('special://home/addons/plugin.video.multiplex/resources', 'fanart.jpg')) def menu(links): params = dict(parse_qsl(sys.argv[2][1:])) fname = params['filename'] if os.path.exists(os.path.join(download_path, fname)): dl_context = 'Resume' else: dl_context = 'Download' for link in links:
imdb_id = SearchMovie(query=item['title'], year=item['year']) MyLog("Search IMDB:%s" % imdb_id) if not imdb_id[:2] == "tt": imdb_id = SearchMovie(query=item['title'], year=(int(item['year']) - 1)) MyLog("Search IMDB(2):%s" % imdb_id) if imdb_id[:2] == "tt": GetJson(imdb_id, 0, 0, item['file_original_path']) except: pass # Search Local File if not imdb_id: ManualSearch(item['title']) endOfDirectory(int(sys.argv[1])) if MyAddon.getSetting("Debug") == "true": if imdb_id[:2] == "tt": Dialog().ok("Debug " + MyVersion, str(item), "imdb: " + str(imdb_id)) else: Dialog().ok("Debug " + MyVersion, str(item), "NO IDS") elif action == 'manualsearch': searchstring = getParam("searchstring", params) ManualSearch(searchstring) endOfDirectory(int(sys.argv[1])) elif action == 'download': id = getParam("id", params) MyLog("Download ID:%s" % id) subs = download(id)
# * along with XBMC; see the file COPYING. If not, write to # * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. # * http://www.gnu.org/copyleft/gpl.html import os import sys import xbmc import xbmcgui import time from traceback import print_exc from xbmcaddon import Addon ADDON = Addon( "plugin.video.illicoweb" ) ADDON_CACHE = xbmc.translatePath( ADDON.getAddonInfo( "profile" ) ) DEBUG = ADDON.getSetting('debug') LANGUAGE = ADDON.getLocalizedString def addon_log(string): #if DEBUG == 'true': xbmc.log("[Illico-Service]: %s" %(string)) def format_time(seconds): minutes, seconds = divmod(seconds, 60) if minutes > 60: hours, minutes = divmod(minutes, 60) return "%02d:%02d:%02d" % (hours, minutes, seconds) else: return "%02d:%02d" % (minutes, seconds)
from xbmcaddon import Addon import requests import xbmc import xbmcgui import os import re from resources.lib import extractMY, dbHelper ADDON = Addon(id='plugin.video.multiplex') api_key = '01aa40b064d705f0b7a530f5df35b2b4' fetch_info = ADDON.getSetting("fetch_info") thumb = 'https://image.tmdb.org/t/p/w154' icon = 'https://image.tmdb.org/t/p/w185' full = 'https://image.tmdb.org/t/p/w780' iconFile = 'DefaultVideo.png' bgFile = xbmc.translatePath( os.path.join('special://home/addons/plugin.video.multiplex/resources', 'fanart.jpg')) def get(movie): title = movie['name'] year = movie['year'] if re.search('s\d', title): stype = 'tv' else: stype = 'movie' response = requests.get( 'https://api.themoviedb.org/3/search/{}?api_key={}&query={}&year={}'. format(stype, api_key, re.sub('s\d', '', title), year)) data = response.json()
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
class NetflixCommon(object): """ Stuff shared between / used from service and addon""" def __init__(self, plugin_handle, base_url): self.addon = Addon() self.data_path = xbmc.translatePath(self.addon.getAddonInfo('profile')) self.cookie_path = self.data_path + 'COOKIE' self.plugin = self.addon.getAddonInfo('name') self.verb_log = self.addon.getSetting('logging') == 'true' self.plugin_handle = plugin_handle self.base_url = base_url self.version = self.addon.getAddonInfo('version') xbmcvfs.mkdir(path=self.data_path) def get_addon(self): """Return the current addon instance""" return self.addon def get_addon_info(self, name): """Return the current addon instance""" return self.addon.getAddonInfo(name) def set_setting(self, key, value): return self.addon.setSetting(key, value) def get_setting(self, key): return self.addon.getSetting(key) def flush_settings(self): self.addon = Addon() def get_esn(self): """ Returns the esn from settings """ return self.addon.getSetting('esn') def set_esn(self, esn): """ Returns True if MSL reset is required """ stored_esn = self.get_esn() if not stored_esn and esn: self.set_setting('esn', esn) return True return False def get_credentials(self): from NetflixCredentials import NetflixCredentials email = self.get_setting('email') password = self.get_setting('password') if '@' in email: self.set_credentials(email, password) return {'email' : email, 'password' : password } return NetflixCredentials().decode_credentials(email, password) def set_credentials(self, email, password): from NetflixCredentials import NetflixCredentials encoded = NetflixCredentials().encode_credentials(email, password) self.set_setting('email',encoded['email']) self.set_setting('password',encoded['password']) def log(self, msg, level=xbmc.LOGDEBUG): """Adds a log entry to the Kodi log Parameters ---------- msg : :obj:`str` Entry that should be turned into a list item level : :obj:`int` Kodi log level """ if isinstance(msg, unicode): msg = msg.encode('utf-8') xbmc.log('[%s] %s' % (self.plugin, msg.__str__()), level) @staticmethod def check_folder_path(path): """ Check if folderpath ends with path delimator If not correct it (makes sure xbmcvfs.exists is working correct) """ if isinstance(path, unicode): check = path.encode('ascii', 'ignore') if '/' in check and not str(check).endswith('/'): end = u'/' path = path + end return path if '\\' in check and not str(check).endswith('\\'): end = u'\\' path = path + end return path if '/' in path and not str(path).endswith('/'): path = path + '/' return path if '\\' in path and not str(path).endswith('\\'): path = path + '\\' return path @staticmethod def file_exists(data_path, filename): """ Checks if a given file exists :param filename: The filename :return: True if so """ return xbmcvfs.exists(path=data_path + filename) @staticmethod def save_file(data_path, filename, content): """ Saves the given content under given filename :param filename: The filename :param content: The content of the file """ file_handle = xbmcvfs.File( filepath=data_path + filename, mode='w') file_content = file_handle.write(content) file_handle.close() @staticmethod def load_file(data_path, filename): """ Loads the content of a given filename :param filename: The file to load :return: The content of the file """ file_handle = xbmcvfs.File( filepath=data_path + filename) file_content = file_handle.read() file_handle.close() return file_content @staticmethod def list_dir(data_path): return xbmcvfs.listdir(data_path)
# Si elle est visible faut la fermer avant toutes modifs, # sinon toute modification sera annuler lors de la fermeture du content settings!!! if ContentSettingsIsVisible: xbmc.executebuiltin( "Dialog.Close(contentsettings)" ) xbmc.executebuiltin( "Dialog.Close(addonsettings)" ) CloseDialogs = True xbmc.sleep( 800 ) # get scraper object AddonId = "metadata.cine.passion-xbmc.org" Addon = Addon( AddonId ) # set variables login = Addon.getSetting( "username" ) passw = Addon.getSetting( "password" ) if settingId == "username": default = login heading = 30003 hidden = False elif settingId == "password": default = passw heading = 30004 hidden = True # condition pour la compatibiliter, si aucun token n'est trouve cela veut surement dire que c'est une vielle version du scraper hasToken = ( bool( Addon.getSetting( "token" ) ) == bool( Addon.getSetting( "tokenb64" ) ) == True )
except IOError as ioe: log("removing unresponsive light %s" % light.label, level=LOGWARNING) unresponsive.append(light) for light in unresponsive: del self.lights[light] def log(msg, level=LOGNOTICE): xbmc.log("lifxbmc - %s" % msg.replace("\0", ""), level=level) # strings returned from lights sometimes have null chars if __name__ == '__main__': monitor = Monitor() player = LifxPlayer() log("inited") while not monitor.abortRequested(): if monitor.waitForAbort(10): break try: lifx = LifxLAN() for light, color in lifx.get_color_all_lights(): if len(addon.getSetting("group_filter")) > 0: pass if light not in player: log("discovered new light %s" % light.get_label()) player.add_light(light, color) except Exception as e: log("Exception while discovering lights: %s" % e, level=LOGERROR)
log (u"pluginHandle: " + repr(pluginHandle), xbmc.LOGDEBUG) provider = VineProvider() provider.initialise(httpManager, sys.argv[0], pluginHandle) success = provider.ExecuteCommand(mycgi) log (u"executeCommand done", xbmc.LOGDEBUG) return success if __name__ == "__main__": try: log (u"Name: %s, Version: %s" % (name, version), xbmc.LOGDEBUG) if addon.getSetting('http_cache_disable_adv') == 'false': httpManager.SetCacheDir( CACHE_FOLDER ) InitTimeout() # Each command processes a web page # Get the web page from the cache if it's there # If there is an error when processing the web page from the cache # we want to try again, this time getting the page from the web httpManager.setGetFromCache(True) success = executeCommand() xbmc.log(u"success: %s, getGotFromCache(): %s" % (unicode(success), unicode(httpManager.getGotFromCache())), xbmc.LOGDEBUG) if success is not None and success == False and httpManager.getGotFromCache() == True: httpManager.setGetFromCache(False)
self.container_all_movies.reset() self.setFocusId( self.CONTAINER_MOVIESETS_ID ) else: self._close_dialog() except: LOGGER.error.exc_info( sys.exc_info(), self ) self._close_dialog() def _close_dialog( self ): self.close() xbmc.sleep( 600 ) if ( __name__ == "__main__" ): mtime = sum( [ os.path.getmtime( db ) for db in DB_PATHS ] ) w = Manager( "script-MovieSets-Manager.xml", ADDON_DIR ) w.doModal() del w if ADDON.getSetting( "exporting" ) == "true" and sum( [ os.path.getmtime( db ) for db in DB_PATHS ] ) > mtime: if xbmcgui.Dialog().yesno( "Movie Sets changed...", "If you want save your change in NFO files.", LangXBMC( 647 ), "", LangXBMC( 222 ), LangXBMC( 650 ) ): xbmc.executebuiltin( "ActivateWindow(VideosSettings)" ) # set Library button xbmc.executebuiltin( "SetFocus(-100)" ) # set Export video library button xbmc.executebuiltin( "SetFocus(-73)" ) # select Export video library xbmc.executebuiltin( "Action(Select)" )
# 6- emptying pending file # 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 = "{}"
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
xmlPath = os.path.join( xmlUserDir, xmlName ) #Parse xml file document = xml.dom.minidom.parse(xmlPath) for item in document.getElementsByTagName('fav'): name = item.getElementsByTagName('title')[0].firstChild.data url = item.getElementsByTagName('link')[0].firstChild.data imgPath = item.getElementsByTagName('image')[0].firstChild.data thumbnail = "%s.jpg" % imgPath thumbnail = os.path.join(imgUserDir, thumbnail) addLink(name.encode("utf-8"),url,thumbnail,imgPath) #INIT #Init Parameter if __settings__.getSetting('cmdline') == "" and __settings__.getSetting('path') == "": pass #__settings__.openSettings(url=sys.argv[0]) elif __settings__.getSetting('cmdline') != "" : cmd = __settings__.getSetting('cmdline') else: cmd = __settings__.getSetting('path') #Variable params = get_params() url = None name = None mode = None #Language TextLanguage = __language__ #Recup Parameter try: