def removeImg(self, ImagesToRemove): # removing images toRemove = {} removedCount = 0 for type, vals in ImagesToRemove.items(): for img_type, v in vals.items(): if len(v) > 0: debug.debug('=== REMOVING ' + type.upper() + ' ' + img_type.upper() + ' IMAGES ===') for file in v: if 'poster' == img_type: toRemove[removedCount] = type + '_' + str( file) + '.jpg' if 'fanart' == img_type: toRemove[removedCount] = type + '_' + str( file) + '_f.jpg' if 'thumb' == img_type: toRemove[removedCount] = 'actors/' + str(file) + '.jpg' if 'exthumb' == img_type: toRemove[removedCount] = type + '_' + str( file) + '.jpg' removedCount += 1 toRemove[removedCount] = type + '_' + str( file) + 'm.jpg' removedCount += 1 if len(toRemove) > 0: if sendRequest.send(self, 'removeimages', toRemove) is False: return False debug.notify( __lang__(32105).encode('utf-8') + ' ' + __lang__(32121).encode('utf-8') + ': ' + str(removedCount))
def removeImg(self, ImagesToRemove): # removing images toRemove = {} removedCount = 0 for type, vals in ImagesToRemove.items(): for img_type, v in vals.items(): if len(v) > 0: debug.debug('=== REMOVING ' + type.upper() + ' ' + img_type.upper() + ' IMAGES ===') for file in v: if 'poster' == img_type: toRemove[removedCount] = type + '_' + str( file) + '.jpg' if 'fanart' == img_type: toRemove[removedCount] = type + '_' + str( file) + '_f.jpg' if 'thumb' == img_type: toRemove[removedCount] = 'actors/' + str(file) + '.jpg' if 'exthumb' == img_type: toRemove[removedCount] = type + '_' + str( file) + '.jpg' removedCount += 1 toRemove[removedCount] = type + '_' + str( file) + 'm.jpg' removedCount += 1 if len(toRemove) > 0: if sendRequest.send(self, 'removeimages', toRemove) is False: return False debug.notify( __lang__(32105).encode('utf-8') + ' ' + __lang__(32121).encode('utf-8') + ': ' + str(removedCount)) ImagesToRemove = {} for v_type in ImagesXBMC.keys(): ImagesToRemove[v_type] = {} for img_type in ImagesXBMC[v_type].keys(): ImagesToRemove[v_type][img_type] = set( ImagesSite[v_type][img_type]) - set( ImagesXBMC[v_type][img_type].keys()) debug.debug('[ImagesToRemove]: ' + str(ImagesToRemove)) removeImg(self, ImagesToRemove) # update hash value = {'images': str(hashImagesXBMC)} if sendRequest.send(self, 'updatehash', value) is False: return False
def sync(self, ImagesXBMC, ImagesSORT, onlyAdd=False): # get panels list from XBMC ImagesSite = sendRequest.send(self, 'showimages') debug.debug('[ImagesSITE]: ' + str(ImagesSite)) # prepare hash hashImagesXBMC = hashlib.md5(str(ImagesXBMC)).hexdigest() debug.debug('[hashImagesXBMC]: ' + str(hashImagesXBMC)) if hashImagesXBMC != self.hashSITE['images'] or self.imageNeeded == True: debug.debug('[IMAGES UPDATE NEEDED]') else: debug.debug('[IMAGES UPDATE NOT NEEDED]') return False #prepare images to add ImagesToAdd = {} for v_type in ImagesXBMC.keys(): ImagesToAdd[v_type] = {} for img_type in ImagesXBMC[v_type].keys(): # check if user want sync images if self.setSITE['xbmc_' + img_type + 's'] == '1': ImagesToAdd[v_type][img_type] = set( ImagesXBMC[v_type][img_type].keys()) - set( ImagesSite[v_type][img_type]) debug.debug('[ImagesToAdd]: ' + str(ImagesToAdd)) addImg(self, ImagesXBMC, ImagesToAdd, ImagesSORT) #prepare images to remove if onlyAdd is False: ImagesToRemove = {} for v_type in ImagesXBMC.keys(): ImagesToRemove[v_type] = {} for img_type in ImagesXBMC[v_type].keys(): ImagesToRemove[v_type][img_type] = set( ImagesSite[v_type][img_type]) - set( ImagesXBMC[v_type][img_type].keys()) debug.debug('[ImagesToRemove]: ' + str(ImagesToRemove)) removeImg(self, ImagesToRemove) # update hash value = {'images': str(hashImagesXBMC)} if sendRequest.send(self, 'updatehash', value) is False: return False
def remove(self, videoToRemove, table): removedCount = 0 # get values values = {} for video in videoToRemove: removedCount += 1 values[removedCount] = video # send requst if sendRequest.send(self, 'removevideo&t=' + table, values) is False: return False if removedCount > 0: debug.notify( __lang__(32105).encode('utf-8') + ' ' + __lang__(self.lang[table]).encode('utf-8') + ': ' + str(removedCount))
def add(self, videosXBMC, videoToAdd, table, opt): # init progres bar addedCount = 0 countToAdd = len(videoToAdd) self.progBar.create( __lang__(32200), __addonname__ + ', ' + __lang__(32204 if opt == 'add' else 32209) + ' ' + __lang__(self.lang[table])) for video in videoToAdd: start_time = time.time() # progress bar update p = int((float(100) / float(countToAdd)) * float(addedCount)) progYear = ' (' + str( videosXBMC[table][video] ['year']) + ')' if 'year' in videosXBMC[table][video] else '' self.progBar.update( p, str(addedCount + 1) + '/' + str(countToAdd) + ' - ' + videosXBMC[table][video]['title'] + progYear) # get values values = prepareValues.prep(self, videosXBMC[table][video], table) # send requst if sendRequest.send(self, opt + 'video&t=' + table, values) is False: return False else: addedCount += 1 debug.debug('[TIME]: ' + str(time.time() - start_time)[0:5]) if addedCount > 0: debug.notify( __lang__(32104 if opt == 'add' else 32103).encode('utf-8') + ' ' + __lang__(self.lang[table]).encode('utf-8') + ': ' + str(addedCount))
def sync(self, videosXBMC, videosSORT): for table in videosSORT: # check hash video library if hashlib.md5(str( videosXBMC[table])).hexdigest() == self.hashSITE[table]: debug.debug('[' + table.upper() + ' UPDATE NOT NEEDED]') else: debug.debug('[' + table.upper() + ' UPDATE NEEDED]') # if video has been updated force clean database and sync images self.cleanNeeded = True self.imageNeeded = True # get id and hash from site videosSite = sendRequest.send(self, 'showvideo&table=' + table, '') debug.debug('[' + table + 'SITE]: ' + str(videosSite)) # prepare videos to add and remove videoToAdd = set(videosXBMC[table].keys()) - set(videosSite.keys()) debug.debug('[' + table + 'ToAdd]: ' + str(videoToAdd)) videoToRemove = set(videosSite.keys()) - set( videosXBMC[table].keys()) debug.debug('[' + table + 'ToRemove]: ' + str(videoToRemove)) # prepare videos to update videoToUpdate = {} for m in videosXBMC[table].keys(): if m in videosSite: # if hashes not match update video if hashlib.md5(str(videosXBMC[table] [m])).hexdigest() != videosSite[m]: # add hash to video array videoToUpdate[m] = videosXBMC[table][m] debug.debug('[' + table + 'ToUpdate]: ' + str(videoToUpdate.keys())) # add videos if len(videoToAdd) > 0: debug.debug('=== ADDING ' + table.upper() + ' VIDEOS ===') if add(self, videosXBMC, videoToAdd, table, 'add') is False: self.progBar.close() return False self.progBar.close() # remove videos if len(videoToRemove) > 0: debug.debug('=== REMOVING ' + table.upper() + ' VIDEOS ===') if remove(self, videoToRemove, table) is False: return False # update videos if len(videoToUpdate) > 0: debug.debug('=== UPDATING ' + table.upper() + ' VIDEOS ===') if add(self, videosXBMC, videoToUpdate, table, 'update') is False: self.progBar.close() return False self.progBar.close() # update hash value = {table: hashlib.md5(str(videosXBMC[table])).hexdigest()} sendRequest.send(self, 'updatehash', value)
def addImg(self, ImagesXBMC, ImagesToAdd, ImagesSORT): # adding new images for type in ImagesSORT['images']: for img_type in ImagesSORT[type]: if len(ImagesToAdd[type][img_type]) > 0: debug.debug('=== ADDING ' + type.upper() + ' ' + img_type.upper() + ' IMAGES ===') countToAdd = len(ImagesToAdd[type][img_type]) addedCount = 0 self.progBar.create( __lang__(32200), __addonname__ + ', ' + __lang__(32204) + ' ' + __lang__(32121) + ' (' + __lang__(self.lang[type]) + ' - ' + __lang__(self.lang[img_type]) + ')') for id in ImagesToAdd[type][img_type]: # progress bar update p = int( (float(100) / float(countToAdd)) * float(addedCount)) self.progBar.update( p, str(addedCount + 1) + '/' + str(countToAdd) + ' - ' + self.namesXBMC[type][id]) if 'poster' == img_type and 'episodes' in type: t = art.create(ImagesXBMC[type][img_type][id], 'p', 200, 113, 70) if 'poster' == img_type and 'episodes' not in type: t = art.create(ImagesXBMC[type][img_type][id], 'p', 200, 294, 70) if 'fanart' == img_type: t = art.create(ImagesXBMC[type][img_type][id], 'f', 1280, 720, 70) if 'thumb' == img_type: t = art.create(ImagesXBMC[type][img_type][id], 'a', 75, 100, 70) if 'exthumb' == img_type: ex_size = self.setSITE['xbmc_exthumbs_q'].split('x') t = art.create( 'image://' + urllib.quote_plus( ImagesXBMC[type][img_type][id].encode('utf-8')) + '/', 'e', int(ex_size[0]), int(ex_size[1]), 70) if len(t) > 0: if 'actors' in type: name = 'actors/' + str(id) + '.jpg' else: f = '_f' if 'fanart' in img_type else '' name = type + '_' + str(id) + f + '.jpg' value = {'name': name, 'img': base64.b64encode(t)} if sendRequest.send(self, 'addimages', value) is False: self.progBar.close() return False addedCount += 1 self.progBar.close() if addedCount > 0: debug.notify( __lang__(32104).encode('utf-8') + ' ' + __lang__(32121).encode('utf-8') + ' (' + __lang__(self.lang[type]).encode('utf-8') + ' - ' + __lang__(self.lang[img_type]).encode('utf-8') + '): ' + str(addedCount))
def check(self): # get settings self.setSITE = sendRequest.send(self, 'checksettings') if self.setSITE is False: debug.notify(__lang__(32100).encode('utf-8')) return False if len(self.setSITE) > 0: for n, s in self.setSITE.items(): debug.debug('Server: ' + n + ': ' + s) # post_max_size in bytes post_l = self.setSITE['POST_MAX_SIZE'].strip()[:-1] post_r = self.setSITE['POST_MAX_SIZE'].strip().lower()[-1:] v = { 'g': 3, 'm': 2, 'k': 1 } if post_r in v.keys(): self.setSITE['POST_MAX_SIZE_B'] = int(post_l) * 1024 ** int(v[post_r]) else: self.setSITE['POST_MAX_SIZE_B'] = int(post_l + post_r) debug.debug('Server: POST_MAX_SIZE_B: ' + str(self.setSITE['POST_MAX_SIZE_B'])) # check master mode if self.setSITE['xbmc_master'] == '1': isMaster = xbmc.getCondVisibility('System.IsMaster') if isMaster == 0: return False # check version if 'version' not in self.setSITE or self.setSITE['version'] < self.versionWebScript: debug.notify(__lang__(32109).encode('utf-8')) debug.debug('Wrong Version of web script. Update is needed to version ' + self.versionWebScript + ' or higher') return False else: debug.debug('Version is valid') # check token if hashlib.md5(self.setXBMC['Token']).hexdigest() != self.setSITE['token_md5']: debug.notify(__lang__(32101).encode('utf-8')) debug.debug('Wrong Token') return False else: debug.debug('Token is valid') # only banner (mode = 2) if self.mode == 2: debug.debug('=== GENREATE BANNER (ONLY MODE) ===') if self.itemID != '' and self.itemTYPE != '': sendRequest.send(self, 'generatebanner', { 'id': self.itemID, 'type': self.itemTYPE }) return False # get hash tables from site self.hashSITE = sendRequest.send(self, 'showhash') if self.hashSITE is False: return False # reset hash if forced start (mode = 0) if self.mode == 0: for t in self.hashSITE: self.hashSITE[t] = "" debug.debug('[hashSITE]: ' + str(self.hashSITE)) self.lang = { 'movies': 32201, 'tvshows': 32202, 'episodes': 32203, 'poster': 32117, 'fanart': 32118, 'thumb': 32119, 'exthumb': 32120, 'actors': 32110 } self.panels = ['actor', 'genre', 'country', 'studio', 'director'] self.tn = { 'movies': { 'json': '{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": {"properties": ["cast", "title", "plot", "rating", "year", "art", "runtime", "genre", "director", "originaltitle", "country", "set", "imdbnumber", "studio", "trailer", "playcount", "lastplayed", "dateadded", "streamdetails", "file"]}, "id": "1"}', 'values' : ['id', 'table', 'title', 'originaltitle', 'year', 'rating', 'plot', 'set', 'imdbid', 'studio[]', 'genre[]', 'actor[]', 'runtime', 'country[]', 'director[]', 'trailer', 'file', 'last_played', 'play_count', 'date_added', 'stream[]', 'hash'] }, 'tvshows': { 'json': '{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"properties": ["title", "originaltitle", "plot", "genre", "cast", "art", "rating", "premiered", "playcount", "lastplayed", "dateadded"]}, "id": 1}', 'values' : ['id', 'table', 'title', 'originaltitle', 'rating', 'plot', 'genre[]', 'actor[]', 'premiered', 'last_played', 'play_count', 'date_added', 'hash'] }, 'episodes': { 'json': '{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": {"properties": ["title", "plot", "episode", "season", "tvshowid", "art", "file", "firstaired", "playcount", "lastplayed", "dateadded", "streamdetails"]}, "id": 1}', 'values' : ['id', 'table', 'title', 'plot', 'episode', 'season', 'tvshow', 'firstaired', 'last_played', 'play_count', 'date_added', 'file', 'stream[]', 'hash'] } } # check source if 'true' in self.setXBMC['CheckSource']: jsonGetSource = '{"jsonrpc": "2.0", "method": "Files.GetSources", "params": {"media": "video"}, "id": 1}' jsonGetSource = xbmc.executeJSONRPC(jsonGetSource) jsonGetSource = unicode(jsonGetSource, 'utf-8', errors='ignore') jsonGetSourceResponse = json.loads(jsonGetSource) if 'result' in jsonGetSourceResponse and 'sources' in jsonGetSourceResponse['result']: for s in jsonGetSourceResponse['result']['sources']: if xbmcvfs.exists(s['file']) == 0: debug.notify(__lang__(32123).encode('utf-8') + ': ' + s['file'].encode('utf-8')) debug.debug('Source inaccessible: ' + s['file'].encode('utf-8')) return False # get videos from XBMC dataSORT = {} dataSORT['videos'] = ['movies', 'tvshows', 'episodes'] dataSORT['images'] = ['movies', 'tvshows', 'episodes', 'actors'] dataSORT['movies'] = ['poster', 'fanart', 'exthumb'] dataSORT['tvshows'] = ['poster', 'fanart'] dataSORT['episodes'] = ['poster'] dataSORT['actors'] = ['thumb'] if self.mode == 3 and self.itemID != '' and self.itemTYPE != '': debug.debug('=== UPDATE ONE VIDEO MODE ===') dataSORT['videos'] = [self.itemTYPE+'s'] tnMovies = json.loads(self.tn[self.itemTYPE+'s']['json']) tnMovies['method'] = 'VideoLibrary.GetMovieDetails' if self.itemTYPE == 'movie' else 'VideoLibrary.GetEpisodeDetails' tnMovies['params'][self.itemTYPE+'id'] = int(self.itemID) self.tn[self.itemTYPE+'s']['json'] = json.dumps(tnMovies) dataXBMC = getDataFromXBMC(self, dataSORT) if syncVideo.add(self, dataXBMC['videos'], [self.itemID], self.itemTYPE+'s', 'update') is False: self.progBar.close() return False self.progBar.close() syncImage.sync(self, dataXBMC['images'], dataSORT, True) return dataXBMC = getDataFromXBMC(self, dataSORT) # sync videos debug.debug('=== SYNC VIDEOS ===') self.cleanNeeded = False self.imageNeeded = False if syncVideo.sync(self, dataXBMC['videos'], dataSORT['videos']) is False: return False # sync images debug.debug('=== SYNC IMAGES ===') syncImage.sync(self, dataXBMC['images'], dataSORT) # send webserver settings if self.setSITE['xbmc_auto_conf_remote'] == '1': debug.debug('=== SYNC WEBSERVER SETTINGS ===') conf_remote = ['services.webserver', 'services.webserverport', 'services.webserverusername', 'services.webserverpassword'] send_conf = {} for s in conf_remote: jsonGet = xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"Settings.GetSettingValue", "params":{"setting": "' + s + '"},"id":1}') jsonGet = unicode(jsonGet, 'utf-8', errors='ignore') jsonGetResponse = json.loads(jsonGet) send_conf[s.replace('services.', '')] = jsonGetResponse['result']['value'] if send_conf['webserver'] == False: debug.notify(__lang__(32122).encode('utf-8')) debug.debug('Webserver is disabled') else: sendRequest.send(self, 'autoconfremote', send_conf) # start generate banner debug.debug('=== GENREATE BANNER ===') sendRequest.send(self, 'generatebanner', {'banner': ''}) # start clean database if self.cleanNeeded is True: debug.debug('=== CLEAN DATABASE ===') sendRequest.send(self, 'cleandb', {'clean': ''})
def sync(self, ImagesXBMC, ImagesSORT): # get panels list from XBMC ImagesSite = sendRequest.send(self, 'showimages') debug.debug('[ImagesSITE]: ' + str(ImagesSite)) # prepare hash hashImagesXBMC = hashlib.md5(str(ImagesXBMC)).hexdigest() debug.debug('[hashImagesXBMC]: ' + str(hashImagesXBMC)) if hashImagesXBMC != self.hashSITE['images'] or self.imageNeeded == True: debug.debug('[IMAGES UPDATE NEEDED]') else: debug.debug('[IMAGES UPDATE NOT NEEDED]') return False #prepare images to add ImagesToAdd = {} for v_type in ImagesXBMC.keys(): ImagesToAdd[v_type] = {} for img_type in ImagesXBMC[v_type].keys(): # check if user want sync images if self.setSITE['xbmc_'+img_type+'s'] == '1': ImagesToAdd[v_type][img_type] = set(ImagesXBMC[v_type][img_type].keys()) - set(ImagesSite[v_type][img_type]) debug.debug('[ImagesToAdd]: ' + str(ImagesToAdd)) #prepare images to remove ImagesToRemove = {} for v_type in ImagesXBMC.keys(): ImagesToRemove[v_type] = {} for img_type in ImagesXBMC[v_type].keys(): ImagesToRemove[v_type][img_type] = set(ImagesSite[v_type][img_type]) - set(ImagesXBMC[v_type][img_type].keys()) debug.debug('[ImagesToRemove]: ' + str(ImagesToRemove)) # adding new images for type in ImagesSORT['images']: for img_type in ImagesSORT[type]: if len(ImagesToAdd[type][img_type]) > 0: debug.debug('=== ADDING ' + type.upper() + ' ' + img_type.upper() + ' IMAGES ===') countToAdd = len(ImagesToAdd[type][img_type]) addedCount = 0 self.progBar.create(__lang__(32200), __addonname__ + ', ' + __lang__(32204) + ' ' + __lang__(32121) + ' (' + __lang__(self.lang[type]) + ' - ' + __lang__(self.lang[img_type]) + ')') for id in ImagesToAdd[type][img_type]: # progress bar update p = int((float(100) / float(countToAdd)) * float(addedCount)) self.progBar.update(p, str(addedCount + 1) + '/' + str(countToAdd) + ' - ' + self.namesXBMC[type][id]) if 'poster' == img_type and 'episodes' in type: t = art.create(ImagesXBMC[type][img_type][id], 'p', 200, 113, 70) if 'poster' == img_type and 'episodes' not in type: t = art.create(ImagesXBMC[type][img_type][id], 'p', 200, 294, 70) if 'fanart' == img_type: t = art.create(ImagesXBMC[type][img_type][id], 'f', 1280, 720, 70) if 'thumb' == img_type: t = art.create(ImagesXBMC[type][img_type][id], 'a', 75, 100, 70) if 'exthumb' == img_type: ex_size = self.setSITE['xbmc_exthumbs_q'].split('x') t = art.create('image://' + urllib.quote_plus(ImagesXBMC[type][img_type][id].encode('utf-8')) + '/', 'e', int(ex_size[0]), int(ex_size[1]), 70) if len(t) > 0: if 'actors' in type: name = 'actors/' + str(id) + '.jpg' else: f = '_f' if 'fanart' in img_type else '' name = type + '_' + str(id) + f + '.jpg' value = { 'name': name, 'img': base64.b64encode(t) } if sendRequest.send(self, 'addimages', value) is False: self.progBar.close() return False addedCount += 1 self.progBar.close() if addedCount > 0: debug.notify(__lang__(32104).encode('utf-8') + ' ' + __lang__(32121).encode('utf-8') + ' (' + __lang__(self.lang[type]).encode('utf-8') + ' - ' + __lang__(self.lang[img_type]).encode('utf-8') + '): ' + str(addedCount)) # removing images toRemove = {} removedCount = 0 for type, vals in ImagesToRemove.items(): for img_type, v in vals.items(): if len(v) > 0: debug.debug('=== REMOVING ' + type.upper() + ' ' + img_type.upper() + ' IMAGES ===') for file in v: if 'poster' == img_type: toRemove[removedCount] = type + '_' + str(file) + '.jpg' if 'fanart' == img_type: toRemove[removedCount] = type + '_' + str(file) + '_f.jpg' if 'thumb' == img_type: toRemove[removedCount] = 'actors/' + str(file) + '.jpg' if 'exthumb' == img_type: toRemove[removedCount] = type + '_' + str(file) + '.jpg' removedCount += 1 toRemove[removedCount] = type + '_' + str(file) + 'm.jpg' removedCount += 1 if len(toRemove) > 0: if sendRequest.send(self, 'removeimages', toRemove) is False: return False debug.notify(__lang__(32105).encode('utf-8') + ' ' + __lang__(32121).encode('utf-8') + ': ' + str(removedCount)) # update hash value = { 'images': str(hashImagesXBMC) } if sendRequest.send(self, 'updatehash', value) is False: return False