################################################################################################# # utils ################################################################################################# import xbmc import xbmcgui import xbmcaddon import xbmcvfs import json import os import sqlite3 import inspect from xml.etree.ElementTree import Element, SubElement, Comment, tostring from xml.etree import ElementTree from xml.dom import minidom import xml.etree.cElementTree as ET from API import API from PlayUtils import PlayUtils from DownloadUtils import DownloadUtils downloadUtils = DownloadUtils() addonSettings = xbmcaddon.Addon(id='plugin.video.mb3sync') language = addonSettings.getLocalizedString def logMsg(title, msg, level = 1): #todo --> get this from a setting logLevel = 0 if(logLevel >= level): if(logLevel == 1): try: xbmc.log(title + " -> " + inspect.stack()[1][3] + " : " + str(msg)) except UnicodeEncodeError: xbmc.log(title + " -> " + inspect.stack()[1][3] + " : " + str(msg.encode('utf-8'))) else: try: xbmc.log(title + " -> " + str(msg)) except UnicodeEncodeError: xbmc.log(title + " -> " + str(msg.encode('utf-8'))) def checkKodiSources(): print "All sources in Kodi -->" addon = xbmcaddon.Addon(id='plugin.video.mb3sync') addondir = xbmc.translatePath( addon.getAddonInfo('profile') ) dataPath = os.path.join(addondir,"library") movieLibrary = os.path.join(dataPath,'movies') tvLibrary = os.path.join(dataPath,'tvshows') if not xbmcvfs.exists(dataPath): xbmcvfs.mkdir(dataPath) if not xbmcvfs.exists(movieLibrary): xbmcvfs.mkdir(movieLibrary) if not xbmcvfs.exists(tvLibrary): xbmcvfs.mkdir(tvLibrary) allKodiSources = list() json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "Files.GetSources", "params": { "media": "video"}, "id": 1 }') jsonobject = json.loads(json_response.decode('utf-8','replace')) if(jsonobject.has_key('result')): result = jsonobject['result'] if(result.has_key('sources')): for source in result["sources"]: allKodiSources.append(source["label"]) allKodiSources = set(allKodiSources) rebootRequired = False if not "mediabrowser_movies" in allKodiSources: addKodiSource("mediabrowser_movies",movieLibrary,"movies") rebootRequired = True if not "mediabrowser_tvshows" in allKodiSources: addKodiSource("mediabrowser_tvshows",tvLibrary,"tvshows") rebootRequired = True if rebootRequired: ret = xbmcgui.Dialog().yesno(heading="MediaBrowser Sync service", line1="A restart of Kodi is needed to apply changes. Do you want to reboot now ?") if ret: xbmc.executebuiltin("RestartApp") def addKodiSource(name, path, type): userDataPath = xbmc.translatePath( "special://profile" ) sourcesFile = os.path.join(userDataPath,'sources.xml') print "####parsing sources file #####" + sourcesFile tree = ET.ElementTree(file=sourcesFile) root = tree.getroot() videosources = root.find("video") #remove any existing entries allsources = videosources.findall("source") if allsources != None: for source in allsources: if source.find("name").text == name: videosources.remove(source) # add new source source = SubElement(videosources,'source') SubElement(source, "name").text = name SubElement(source, "path").text = path tree.write(sourcesFile) #add new source to database dbPath = xbmc.translatePath("special://userdata/Database/MyVideos90.db") connection = sqlite3.connect(dbPath) cursor = connection.cursor( ) cursor.execute("select coalesce(max(idPath),0) as pathId from path") pathId = cursor.fetchone()[0] pathId = pathId + 1 pathsql="insert into path(idPath, strPath, strContent, strScraper, strHash, scanRecursive) values(?, ?, ?, ?, ?, ?)" cursor.execute(pathsql, (pathId,path + "\\",type,"metadata.local",None,2147483647)) connection.commit() cursor.close() def checkAuthentication(): #check authentication if addonSettings.getSetting('username') != "" and addonSettings.getSetting('ipaddress') != "": try: downloadUtils.authenticate() except Exception, e: logMsg("MB3 Syncer authentication failed",e) pass def prettifyXml(elem): rough_string = etree.tostring(elem, "utf-8") reparsed = minidom.parseString(rough_string) return reparsed.toprettyxml(indent="\t") def doKodiCleanup(): #remove old testdata and remove missing files json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": {"properties" : ["file"], "sort": { "order": "ascending", "method": "label", "ignorearticle": true } }, "id": "libMovies"}') jsonobject = json.loads(json_response.decode('utf-8','replace')) if(jsonobject.has_key('result')): result = jsonobject['result'] if(result.has_key('movies')): movies = result['movies'] for movie in movies: if (xbmcvfs.exists(movie["file"]) == False) or ("plugin.video.xbmb3c" in movie["file"]): print "deleting --> " + movie["file"] xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.RemoveMovie", "params": { "movieid": %i}, "id": 1 }' %(movie["movieid"])) def get_params( paramstring ): xbmc.log("Parameter string: " + paramstring) param={} if len(paramstring)>=2: params=paramstring if params[0] == "?": cleanedparams=params[1:] else: cleanedparams=params if (params[len(params)-1]=='/'): params=params[0:len(params)-2] pairsofparams=cleanedparams.split('&') for i in range(len(pairsofparams)): splitparams={} splitparams=pairsofparams[i].split('=') if (len(splitparams))==2: param[splitparams[0]]=splitparams[1] elif (len(splitparams))==3: param[splitparams[0]]=splitparams[1]+"="+splitparams[2] xbmc.log("XBMB3C -> Detected parameters: " + str(param)) return param