From 775eaea7ea31c5248c232692e665615439c7790c Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Sun, 3 Jan 2021 20:08:28 +0100 Subject: [PATCH 01/21] Create README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..508f7f4 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# script.movielib + +Dieser Fork soll Phyton 3 kompitabel werden..... From 3fbfca1f9b308bae82f03851a463ab171f42ddbf Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Wed, 13 Jan 2021 11:21:32 +0100 Subject: [PATCH 02/21] Update addon.xml --- addon.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addon.xml b/addon.xml index fead130..4a2f750 100644 --- a/addon.xml +++ b/addon.xml @@ -1,10 +1,10 @@ - + @@ -34,4 +34,4 @@ regss84@gmail.com https://github.com/Regss/script.movielib - \ No newline at end of file + From 7d255effa3fed9e4c61ebe59ab02a97aa4f3ed9b Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Wed, 13 Jan 2021 11:22:53 +0100 Subject: [PATCH 03/21] Update service.py --- service.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/service.py b/service.py index 9476607..a9da0a2 100644 --- a/service.py +++ b/service.py @@ -21,25 +21,25 @@ def __init__(self): # start Movielib on KODI start if 'true' in __addon__.getSetting('OnStart'): - xbmc.executebuiltin('XBMC.RunScript(' + __addon_id__ + ', 1)') + xbmc.executebuiltin('RunScript(' + __addon_id__ + ', 1)') def onNotification(self, sender, method, data): data = json.loads(data) # start Movielib for update banner (Now Playing) if method == 'Player.OnPlay': if 'item' in data and 'type' in data['item'] and 'id' in data['item']: - xbmc.executebuiltin('XBMC.RunScript(' + __addon_id__ + ', 2, ' + str(data['item']['id']) + ', ' + data['item']['type'] + ')') + xbmc.executebuiltin('RunScript(' + __addon_id__ + ', 2, ' + str(data['item']['id']) + ', ' + data['item']['type'] + ')') # start Movielib on trigger if method in __trigger__.keys() and 'true' in __trigger__[method]: if method == 'Player.OnStop': if 'item' in data and 'type' in data['item'] and 'id' in data['item']: - xbmc.executebuiltin('XBMC.RunScript(' + __addon_id__ + ', 3, ' + str(data['item']['id']) + ', ' + data['item']['type'] + ')') + xbmc.executebuiltin('RunScript(' + __addon_id__ + ', 3, ' + str(data['item']['id']) + ', ' + data['item']['type'] + ')') else: - xbmc.executebuiltin('XBMC.RunScript(' + __addon_id__ + ', 1)') + xbmc.executebuiltin('RunScript(' + __addon_id__ + ', 1)') monitor = Monitor() -while(not xbmc.abortRequested): +while(not xbmc.Monitor().abortRequested()): xbmc.sleep(100) - \ No newline at end of file + From 52ee028510773075cc984843c5918d57c4b64f7f Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Wed, 13 Jan 2021 11:24:23 +0100 Subject: [PATCH 04/21] Update sync.py --- resources/lib/sync.py | 270 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 269 insertions(+), 1 deletion(-) diff --git a/resources/lib/sync.py b/resources/lib/sync.py index da02e2e..a17ac55 100644 --- a/resources/lib/sync.py +++ b/resources/lib/sync.py @@ -189,6 +189,210 @@ def check(self): 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: +# -*- coding: utf-8 -*- + +# runing mode +# 0 - start from program section (force sync all data) +# 1 - normal start +# 2 - only generate banner +# 3 - sync only played item + +import xbmc +import xbmcgui +import xbmcaddon +import xbmcvfs +import sys +import os +import hashlib +import time +import json +import re + +__addon__ = xbmcaddon.Addon() +__addon_id__ = __addon__.getAddonInfo('id') +__addonname__ = __addon__.getAddonInfo('name') +__datapath__ = xbmc.translatePath(os.path.join('special://profile/addon_data/', __addon_id__)).replace('\\', '/') +__lang__ = __addon__.getLocalizedString + +import debug +import bar +import sendRequest +import art +import syncVideo +import syncImage + +def start(self): + # check if exists addon data folder + if xbmcvfs.exists(__datapath__ + '/') == 0: + xbmcvfs.mkdir(__datapath__ ) + + # open settings if frist run + if xbmcvfs.exists(__datapath__ + '/settings.xml') == 0: + __addon__.openSettings() + + # check mode + try: + self.mode = int(str(sys.argv[1])) + except: + self.mode = 0 + debug.debug('=== FORCED START ===') + debug.debug('MODE: ' + str(self.mode)) + + # get other args + try: + self.itemID = str(sys.argv[2]) + self.itemTYPE = str(sys.argv[3]) + except: + self.itemID = '' + self.itemTYPE = '' + + self.setXBMC = {} + self.setXBMC['URL'] = __addon__.getSetting('url') + self.setXBMC['Token'] = __addon__.getSetting('token') + self.setXBMC['CheckSource'] = __addon__.getSetting('checkSource') + self.setXBMC['Notify'] = __addon__.getSetting('notify') + self.setXBMC['Auth'] = __addon__.getSetting('auth') + self.setXBMC['AuthLogin'] = __addon__.getSetting('authLogin') + self.setXBMC['AuthPass'] = __addon__.getSetting('authPass') + + self.versionWebScript = '2.8.0' + + self.progBar = bar.Bar() + + # debug settings + for n, s in self.setXBMC.items(): + debug.debug('XBMC: ' + n + ': ' + s) + + # prepare URL + if self.setXBMC['URL'][-1:] != '/': + self.setXBMC['URL'] = self.setXBMC['URL'] + '/' + if self.setXBMC['URL'][:7] != 'http://' and self.setXBMC['URL'][:8] != 'https://': + self.setXBMC['URL'] = 'http://' + self.setXBMC['URL'] + self.setXBMC['URL'] = self.setXBMC['URL'] + 'sync.php?' + 'token=' + self.setXBMC['Token'] + '&option=' + + check(self) + +# check connection +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 ===') @@ -322,4 +526,68 @@ def getDataFromXBMC(self, dataSORT): debug.debug('[' + t + type.title() + 'XBMC]: ' + str(val)) return dataXBMC - \ No newline at end of file + + self.namesXBMC = { 'movies': {}, 'tvshows': {}, 'episodes': {}, 'actors': {}, 'exthumb': {} } + + self.progBar.create(__lang__(32200), __addonname__ + ', ' + __lang__(32206) + '...') + p = 0 + + for table in dataSORT['videos']: + + p += 33 + self.progBar.update(p, __lang__(32206) + ' - ' + __lang__(self.lang[table])) + + jsonGetData = xbmc.executeJSONRPC(self.tn[table]['json']) + jsonGetData = unicode(jsonGetData, 'utf-8', errors='ignore') + jsonGetDataResponse = json.loads(jsonGetData) + + # prepare array + dataXBMC['videos'][table] = {} + if ('result' in jsonGetDataResponse) and (table in jsonGetDataResponse['result'] or table[0:-1]+'details' in jsonGetDataResponse['result']): + + if len(dataSORT['videos']) == 1: + jsonDATA = [jsonGetDataResponse['result'][table[0:-1]+'details']] + else: + jsonDATA = jsonGetDataResponse['result'][table] + + for data in jsonDATA: + + # prepare array for videos + dataXBMC['videos'][table][str(data[table[0:-1]+'id'])] = data + self.namesXBMC[table][data[table[0:-1]+'id']] = data['title'] + + # prepare array for images + if 'art' in data: + if 'poster' in data['art'] and data['art']['poster'] != '': + dataXBMC['images'][table]['poster'][data[table[0:-1]+'id']] = data['art']['poster'] + else: + if 'thumb' in data['art'] and data['art']['thumb'] != '': + dataXBMC['images'][table]['poster'][data[table[0:-1]+'id']] = data['art']['thumb'] + if 'fanart' in data['art'] and data['art']['fanart'] != '' and 'fanart' in dataXBMC['images'][table]: + dataXBMC['images'][table]['fanart'][data[table[0:-1]+'id']] = data['art']['fanart'] + if 'cast' in data: + for actor in data['cast']: + if 'thumbnail' in actor: + hash = hashlib.md5(actor['name'].encode('utf-8')).hexdigest()[0:10] + dataXBMC['images']['actors']['thumb'][hash] = actor['thumbnail'] + self.namesXBMC['actors'][hash] = actor['name'] + if 'file' in data: + extrathumbs_path = os.path.dirname(data['file'].replace('\\', '/')) + '/extrathumbs/' + if xbmcvfs.exists(extrathumbs_path): + ex_dir = xbmcvfs.listdir(extrathumbs_path) + for thumb in ex_dir[1]: + m = re.search('thumb([0-9]).jpg', thumb) + if m and 'exthumb' in dataXBMC['images'][table]: + id = str(data[table[0:-1]+'id']) + '_t' + m.group(1) + dataXBMC['images'][table]['exthumb'][id] = extrathumbs_path + thumb + self.namesXBMC[table][id] = data['title'] + + self.progBar.close() + + # debug + for t, v in dataXBMC.items(): + for type, val in v.items(): + debug.debug('[' + t + type.title() + 'XBMC]: ' + str(val)) + + return dataXBMC + From dde97897a9e5976a477837841b3e091a43f88a57 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Wed, 13 Jan 2021 11:27:35 +0100 Subject: [PATCH 05/21] Update changelog.txt --- changelog.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index d07e1e7..f8a46e7 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,9 @@ +[B]1.5.X BETA - has no sync in Kodi for urllib-Errors[/B] +- new User: me! +- Phytoncode upgraded from Version 2 to Version 3 with Phyton Script "2to3" +- Kodi intern Flags corrected +- Debug Code changed + [B]1.4.11[/B] - sync trigger "on player stop" now sync only movie that stopped - Fixed: allow to sync when server var POST_MAX_SIZE is set to 0 @@ -140,4 +146,4 @@ - Added: Sync Watched, LastPlayed, RecentlyAdded [B]1.0.0[/B] -- Initial \ No newline at end of file +- Initial From c13c8d0652cbf605483964bb35151a7bf84a68e9 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:47:14 +0100 Subject: [PATCH 06/21] Update debug.py --- resources/lib/debug.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/debug.py b/resources/lib/debug.py index 133a9ee..9e56f88 100644 --- a/resources/lib/debug.py +++ b/resources/lib/debug.py @@ -10,9 +10,9 @@ def debug(msg): xbmc.log('>>>> Movielib <<<< ' + msg, level=xbmc.LOGDEBUG) def notice(msg): - xbmc.log('>>>> Movielib <<<< ' + msg, level=xbmc.LOGNOTICE) + xbmc.log('>>>> Movielib <<<< ' + msg, level=xbmc.LOGLOGNOTICE) def notify(msg): if 'true' in __addon__.getSetting('notify'): xbmc.executebuiltin('Notification(Movielib, ' + msg + ', 4000, ' + __icon__ + ')') - \ No newline at end of file + From 9e3801f43c00c18e06a852d3cb7158f4f91f02ae Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:47:44 +0100 Subject: [PATCH 07/21] Update prepareValues.py --- resources/lib/prepareValues.py | 53 ++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/resources/lib/prepareValues.py b/resources/lib/prepareValues.py index b913342..54ab802 100644 --- a/resources/lib/prepareValues.py +++ b/resources/lib/prepareValues.py @@ -2,10 +2,8 @@ import xbmcvfs import os -import urllib2 import base64 import hashlib - import art import debug @@ -92,4 +90,53 @@ def prep(self, m, t): values[q] = val[q] debug.debug(str(values)) - return values \ No newline at end of file + return values + 'runtime': str(m['runtime'] / 60) if 'runtime' in m else '', + 'genre[]': panelsValue['genre'] if 'genre' in m else '', + 'director[]': panelsValue['director'] if 'director' in m else '', + 'originaltitle': m['originaltitle'].encode('utf-8') if 'originaltitle' in m else '', + 'country[]': panelsValue['country'] if 'country' in m else '', + 'set': m['set'].encode('utf-8') if 'set' in m else '', + 'imdbid': m['imdbnumber'] if 'imdbnumber' in m else '', + 'actor[]': panelsValue['actor'] if 'cast' in m else '', + 'studio[]': panelsValue['studio'] if 'studio' in m else '', + 'premiered': m['premiered'] if 'premiered' in m else '', + 'episode': str(m['episode']) if 'episode' in m else '', + 'season': str(m['season']) if 'season' in m else '', + 'tvshow': str(m['tvshowid']) if 'tvshowid' in m else '', + 'firstaired': m['firstaired'] if 'firstaired' in m else '', + 'file': m['file'].replace('\\', '/').encode('utf-8') if 'file' in m else '', + 'play_count': str(m['playcount']), + 'last_played': m['lastplayed'], + 'date_added': m['dateadded'], + 'trailer': trailer, + 'hash': hashlib.md5(str(m)).hexdigest() + } + + # streamdetails + if 'streamdetails' in m: + stream = [] + if len(m['streamdetails']['video']) > 0: + for s in m['streamdetails']['video']: + stream.append(';'.join(['v',s['codec'], str(s['aspect']), str(s['width']), str(s['height']), str(s['duration'] / 60), '', '', '', ''])) + + if len(m['streamdetails']['audio']) > 0: + for s in m['streamdetails']['audio']: + stream.append(';'.join(['a', '', '', '', '', '', s['codec'], str(s['channels']), s['language'], ''])) + + if len(m['streamdetails']['subtitle']) > 0: + for s in m['streamdetails']['subtitle']: + stream.append(';'.join(['s', '', '', '', '', '', '', '', '', s['language']])) + + val.update({ + 'stream[]': stream + }) + + # add only values support for this video type + values = {} + for q in self.tn[t]['values']: + if q in val and len(val[q]) > 0: + values[q] = val[q] + + debug.debug(str(values)) + return values From 71190235206e824e40d27d9b6ba9d17c336fdec8 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:48:10 +0100 Subject: [PATCH 08/21] Update sendRequest.py --- resources/lib/sendRequest.py | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index c10b366..cc98c27 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -3,11 +3,11 @@ import xbmc import xbmcaddon import urllib -import urllib2 import json import time import base64 + __addon__ = xbmcaddon.Addon() __lang__ = __addon__.getLocalizedString @@ -23,7 +23,7 @@ def send(self, option, values=''): debug.debug('[REQUEST]: ' + str(values)) # try send data - data = urllib.urlencode(values, True) + data = urllib.parse.urlencode(values, True) data_len = len(data) debug.debug('[REQUEST DATA SIZE]: ' + str(data_len) + ' bytes') @@ -73,4 +73,34 @@ def send(self, option, values=''): return False return output - \ No newline at end of file + + debug.debug('[REQUEST ERROR]: ' + str(Error)) + if l < 3: + debug.debug('[REQUEST]: Wait 5 secs and retring ' + str(l)) + time.sleep(15) + else: + conn = True + break; + + if conn != True: + debug.notify(__lang__(32100).encode('utf-8')) + return False + + debug.debug('[RESPONSE]: ' + str(output)) + + # if no values return json + if values == '': + try: + output = unicode(output, 'utf-8', errors='ignore') + output = json.loads(output) + except Exception as Error: + debug.debug('[GET JSON ERROR]: ' + str(Error)) + return False + else: + #get errors + if len(output) > 0 and 'ERROR:' in output: + debug.notify(__lang__(32102).encode('utf-8')) + return False + + return output + From d291f4dbc2f1798f0ad44e26d811b6064ad16ca2 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:49:34 +0100 Subject: [PATCH 09/21] Update sync.py --- resources/lib/sync.py | 268 ------------------------------------------ 1 file changed, 268 deletions(-) diff --git a/resources/lib/sync.py b/resources/lib/sync.py index a17ac55..1663727 100644 --- a/resources/lib/sync.py +++ b/resources/lib/sync.py @@ -189,210 +189,6 @@ def check(self): 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: -# -*- coding: utf-8 -*- - -# runing mode -# 0 - start from program section (force sync all data) -# 1 - normal start -# 2 - only generate banner -# 3 - sync only played item - -import xbmc -import xbmcgui -import xbmcaddon -import xbmcvfs -import sys -import os -import hashlib -import time -import json -import re - -__addon__ = xbmcaddon.Addon() -__addon_id__ = __addon__.getAddonInfo('id') -__addonname__ = __addon__.getAddonInfo('name') -__datapath__ = xbmc.translatePath(os.path.join('special://profile/addon_data/', __addon_id__)).replace('\\', '/') -__lang__ = __addon__.getLocalizedString - -import debug -import bar -import sendRequest -import art -import syncVideo -import syncImage - -def start(self): - # check if exists addon data folder - if xbmcvfs.exists(__datapath__ + '/') == 0: - xbmcvfs.mkdir(__datapath__ ) - - # open settings if frist run - if xbmcvfs.exists(__datapath__ + '/settings.xml') == 0: - __addon__.openSettings() - - # check mode - try: - self.mode = int(str(sys.argv[1])) - except: - self.mode = 0 - debug.debug('=== FORCED START ===') - debug.debug('MODE: ' + str(self.mode)) - - # get other args - try: - self.itemID = str(sys.argv[2]) - self.itemTYPE = str(sys.argv[3]) - except: - self.itemID = '' - self.itemTYPE = '' - - self.setXBMC = {} - self.setXBMC['URL'] = __addon__.getSetting('url') - self.setXBMC['Token'] = __addon__.getSetting('token') - self.setXBMC['CheckSource'] = __addon__.getSetting('checkSource') - self.setXBMC['Notify'] = __addon__.getSetting('notify') - self.setXBMC['Auth'] = __addon__.getSetting('auth') - self.setXBMC['AuthLogin'] = __addon__.getSetting('authLogin') - self.setXBMC['AuthPass'] = __addon__.getSetting('authPass') - - self.versionWebScript = '2.8.0' - - self.progBar = bar.Bar() - - # debug settings - for n, s in self.setXBMC.items(): - debug.debug('XBMC: ' + n + ': ' + s) - - # prepare URL - if self.setXBMC['URL'][-1:] != '/': - self.setXBMC['URL'] = self.setXBMC['URL'] + '/' - if self.setXBMC['URL'][:7] != 'http://' and self.setXBMC['URL'][:8] != 'https://': - self.setXBMC['URL'] = 'http://' + self.setXBMC['URL'] - self.setXBMC['URL'] = self.setXBMC['URL'] + 'sync.php?' + 'token=' + self.setXBMC['Token'] + '&option=' - - check(self) - -# check connection -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 ===') @@ -527,67 +323,3 @@ def getDataFromXBMC(self, dataSORT): return dataXBMC - self.namesXBMC = { 'movies': {}, 'tvshows': {}, 'episodes': {}, 'actors': {}, 'exthumb': {} } - - self.progBar.create(__lang__(32200), __addonname__ + ', ' + __lang__(32206) + '...') - p = 0 - - for table in dataSORT['videos']: - - p += 33 - self.progBar.update(p, __lang__(32206) + ' - ' + __lang__(self.lang[table])) - - jsonGetData = xbmc.executeJSONRPC(self.tn[table]['json']) - jsonGetData = unicode(jsonGetData, 'utf-8', errors='ignore') - jsonGetDataResponse = json.loads(jsonGetData) - - # prepare array - dataXBMC['videos'][table] = {} - if ('result' in jsonGetDataResponse) and (table in jsonGetDataResponse['result'] or table[0:-1]+'details' in jsonGetDataResponse['result']): - - if len(dataSORT['videos']) == 1: - jsonDATA = [jsonGetDataResponse['result'][table[0:-1]+'details']] - else: - jsonDATA = jsonGetDataResponse['result'][table] - - for data in jsonDATA: - - # prepare array for videos - dataXBMC['videos'][table][str(data[table[0:-1]+'id'])] = data - self.namesXBMC[table][data[table[0:-1]+'id']] = data['title'] - - # prepare array for images - if 'art' in data: - if 'poster' in data['art'] and data['art']['poster'] != '': - dataXBMC['images'][table]['poster'][data[table[0:-1]+'id']] = data['art']['poster'] - else: - if 'thumb' in data['art'] and data['art']['thumb'] != '': - dataXBMC['images'][table]['poster'][data[table[0:-1]+'id']] = data['art']['thumb'] - if 'fanart' in data['art'] and data['art']['fanart'] != '' and 'fanart' in dataXBMC['images'][table]: - dataXBMC['images'][table]['fanart'][data[table[0:-1]+'id']] = data['art']['fanart'] - if 'cast' in data: - for actor in data['cast']: - if 'thumbnail' in actor: - hash = hashlib.md5(actor['name'].encode('utf-8')).hexdigest()[0:10] - dataXBMC['images']['actors']['thumb'][hash] = actor['thumbnail'] - self.namesXBMC['actors'][hash] = actor['name'] - if 'file' in data: - extrathumbs_path = os.path.dirname(data['file'].replace('\\', '/')) + '/extrathumbs/' - if xbmcvfs.exists(extrathumbs_path): - ex_dir = xbmcvfs.listdir(extrathumbs_path) - for thumb in ex_dir[1]: - m = re.search('thumb([0-9]).jpg', thumb) - if m and 'exthumb' in dataXBMC['images'][table]: - id = str(data[table[0:-1]+'id']) + '_t' + m.group(1) - dataXBMC['images'][table]['exthumb'][id] = extrathumbs_path + thumb - self.namesXBMC[table][id] = data['title'] - - self.progBar.close() - - # debug - for t, v in dataXBMC.items(): - for type, val in v.items(): - debug.debug('[' + t + type.title() + 'XBMC]: ' + str(val)) - - return dataXBMC - From 00f56c04537fbb6ff20fc3ccddfccc263f7dafaa Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:50:02 +0100 Subject: [PATCH 10/21] Update syncImage.py --- resources/lib/syncImage.py | 89 +++++++++++++++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/resources/lib/syncImage.py b/resources/lib/syncImage.py index c40aa86..b5cbaba 100644 --- a/resources/lib/syncImage.py +++ b/resources/lib/syncImage.py @@ -4,9 +4,9 @@ import xbmcaddon import os import urllib -import urllib2 import hashlib import base64 +from urllib.request import urlopen __addon__ = xbmcaddon.Addon() __addonname__ = __addon__.getAddonInfo('name') @@ -106,6 +106,93 @@ def addImg(self, ImagesXBMC, ImagesToAdd, ImagesSORT): 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 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 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 removeImg(self, ImagesToRemove): # removing images toRemove = {} From e3d313e361babc3f4bc066a1b33d5361656c3f00 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:50:29 +0100 Subject: [PATCH 11/21] Update syncVideo.py --- resources/lib/syncVideo.py | 76 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/resources/lib/syncVideo.py b/resources/lib/syncVideo.py index b8e9158..86077d6 100644 --- a/resources/lib/syncVideo.py +++ b/resources/lib/syncVideo.py @@ -103,6 +103,82 @@ def add(self, videosXBMC, videoToAdd, table, opt): 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 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)) + + + # 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 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 remove(self, videoToRemove, table): removedCount = 0 From 52b464d14544d70488791d1887f070290e157aa9 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:50:48 +0100 Subject: [PATCH 12/21] Update service.py From 98f4dbae0be7cc93815a5e7fea5aeb68e5efc501 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 22 Jan 2021 22:51:48 +0100 Subject: [PATCH 13/21] Update art.py --- resources/lib/art.py | 46 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/resources/lib/art.py b/resources/lib/art.py index 667632d..6c62d43 100644 --- a/resources/lib/art.py +++ b/resources/lib/art.py @@ -5,10 +5,12 @@ import xbmcaddon import os from PIL import Image -import cStringIO +from io import StringIO +from urllib.request import urlopen import json import urllib + __addon__ = xbmcaddon.Addon() __addon_id__ = __addon__.getAddonInfo('id') __datapath__ = xbmc.translatePath(os.path.join('special://profile/addon_data/', __addon_id__)).replace('\\', '/') @@ -42,7 +44,7 @@ def create(source, i, width, height, q): if file_path[8:12] == 'http': try: link = urllib.unquote(file_path[8:][:-1]).encode('utf-8') - file = cStringIO.StringIO(urllib.urlopen(link).read()) + file = cStringIO.StringIO(urllib.request.urlopen(link).read()) except: file = '' else: @@ -81,4 +83,42 @@ def create(source, i, width, height, q): debug.debug(str(Error)) return output - \ No newline at end of file + + file = '' + else: + f = xbmcvfs.File(file_path) + file = cStringIO.StringIO(f.read()) + f.close() + + # read image + try: + image = Image.open(file) + if image.mode != 'RGB': + image = image.convert('RGB') + h = image.size[1] + if h > 10: + if (h > height): + image.load() + image = image.resize((width, height), Image.ANTIALIAS) + image_bin = cStringIO.StringIO() + image.save(image_bin, 'JPEG', quality=int(q)) + output = image_bin.getvalue() + image_bin.close() + + except Exception as Error: + debug.debug(str(jsonGetResponse)) + debug.debug(source) + debug.debug(str(Error)) + + # try only copy image without using PIL + debug.debug('Trying to just copy...') + try: + f = xbmcvfs.File(file_path) + output = f.read() + f.close() + + except Exception as Error: + debug.debug(str(Error)) + + return output + From 7ed47c46ba584c034f7814d7d30f43bdfe8f51af Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Sat, 23 Jan 2021 15:13:16 +0100 Subject: [PATCH 14/21] Update sendRequest.py --- resources/lib/sendRequest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index cc98c27..730bc95 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -35,11 +35,11 @@ def send(self, option, values=''): for l in range(1, 4): try: - request = urllib2.Request(self.setXBMC['URL'] + option, data) + request = urllib.Request(self.setXBMC['URL'] + option, data) if 'true' in self.setXBMC['Auth']: base64string = base64.encodestring(self.setXBMC['AuthLogin'] + ':' + self.setXBMC['AuthPass']).replace('\n', '') request.add_header('Authorization', 'Basic ' + base64string) - result = urllib2.urlopen(request) + result = urllib.urlopen(request) output = result.read() except Exception as Error: conn = False From ba81c5d16151d8c29c8f2527d2db34519354dfe3 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Sat, 23 Jan 2021 22:01:12 +0100 Subject: [PATCH 15/21] Update sendRequest.py --- resources/lib/sendRequest.py | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index 730bc95..6fc52f0 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -3,11 +3,14 @@ import xbmc import xbmcaddon import urllib +import urllib.request +import urllib.urlopen import json import time import base64 + __addon__ = xbmcaddon.Addon() __lang__ = __addon__.getLocalizedString @@ -35,7 +38,7 @@ def send(self, option, values=''): for l in range(1, 4): try: - request = urllib.Request(self.setXBMC['URL'] + option, data) + request = urllib.request(self.setXBMC['URL'] + option, data) if 'true' in self.setXBMC['Auth']: base64string = base64.encodestring(self.setXBMC['AuthLogin'] + ':' + self.setXBMC['AuthPass']).replace('\n', '') request.add_header('Authorization', 'Basic ' + base64string) @@ -88,6 +91,36 @@ def send(self, option, values=''): debug.debug('[RESPONSE]: ' + str(output)) + # if no values return json + if values == '': + try: + output = unicode(output, 'utf-8', errors='ignore') + output = json.loads(output) + except Exception as Error: + debug.debug('[GET JSON ERROR]: ' + str(Error)) + return False + else: + #get errors + if len(output) > 0 and 'ERROR:' in output: + debug.notify(__lang__(32102).encode('utf-8')) + return False + + return output + + debug.debug('[REQUEST ERROR]: ' + str(Error)) + if l < 3: + debug.debug('[REQUEST]: Wait 5 secs and retring ' + str(l)) + time.sleep(15) + else: + conn = True + break; + + if conn != True: + debug.notify(__lang__(32100).encode('utf-8')) + return False + + debug.debug('[RESPONSE]: ' + str(output)) + # if no values return json if values == '': try: From db417736aa1c4dca00fbdab46b07fc44a3fa4c10 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Wed, 27 Jan 2021 11:33:19 +0100 Subject: [PATCH 16/21] Update sendRequest.py --- resources/lib/sendRequest.py | 69 +++--------------------------------- 1 file changed, 4 insertions(+), 65 deletions(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index 6fc52f0..297ef93 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -2,9 +2,8 @@ import xbmc import xbmcaddon -import urllib import urllib.request -import urllib.urlopen +import urllib.parse import json import time import base64 @@ -26,7 +25,7 @@ def send(self, option, values=''): debug.debug('[REQUEST]: ' + str(values)) # try send data - data = urllib.parse.urlencode(values, True) + data = urllib.parse(values, True) data_len = len(data) debug.debug('[REQUEST DATA SIZE]: ' + str(data_len) + ' bytes') @@ -38,11 +37,11 @@ def send(self, option, values=''): for l in range(1, 4): try: - request = urllib.request(self.setXBMC['URL'] + option, data) + request = urllib.request.urlopen(self.setXBMC['URL'] + option, data) if 'true' in self.setXBMC['Auth']: base64string = base64.encodestring(self.setXBMC['AuthLogin'] + ':' + self.setXBMC['AuthPass']).replace('\n', '') request.add_header('Authorization', 'Basic ' + base64string) - result = urllib.urlopen(request) + result = urllib.request(request) output = result.read() except Exception as Error: conn = False @@ -61,66 +60,6 @@ def send(self, option, values=''): debug.debug('[RESPONSE]: ' + str(output)) - # if no values return json - if values == '': - try: - output = unicode(output, 'utf-8', errors='ignore') - output = json.loads(output) - except Exception as Error: - debug.debug('[GET JSON ERROR]: ' + str(Error)) - return False - else: - #get errors - if len(output) > 0 and 'ERROR:' in output: - debug.notify(__lang__(32102).encode('utf-8')) - return False - - return output - - debug.debug('[REQUEST ERROR]: ' + str(Error)) - if l < 3: - debug.debug('[REQUEST]: Wait 5 secs and retring ' + str(l)) - time.sleep(15) - else: - conn = True - break; - - if conn != True: - debug.notify(__lang__(32100).encode('utf-8')) - return False - - debug.debug('[RESPONSE]: ' + str(output)) - - # if no values return json - if values == '': - try: - output = unicode(output, 'utf-8', errors='ignore') - output = json.loads(output) - except Exception as Error: - debug.debug('[GET JSON ERROR]: ' + str(Error)) - return False - else: - #get errors - if len(output) > 0 and 'ERROR:' in output: - debug.notify(__lang__(32102).encode('utf-8')) - return False - - return output - - debug.debug('[REQUEST ERROR]: ' + str(Error)) - if l < 3: - debug.debug('[REQUEST]: Wait 5 secs and retring ' + str(l)) - time.sleep(15) - else: - conn = True - break; - - if conn != True: - debug.notify(__lang__(32100).encode('utf-8')) - return False - - debug.debug('[RESPONSE]: ' + str(output)) - # if no values return json if values == '': try: From 059e7cdf5f017bd41ddaba9e6ac5671486ea1862 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Thu, 18 Feb 2021 09:17:50 +0100 Subject: [PATCH 17/21] Update art.py --- resources/lib/art.py | 38 -------------------------------------- 1 file changed, 38 deletions(-) diff --git a/resources/lib/art.py b/resources/lib/art.py index 6c62d43..8315c5d 100644 --- a/resources/lib/art.py +++ b/resources/lib/art.py @@ -82,43 +82,5 @@ def create(source, i, width, height, q): except Exception as Error: debug.debug(str(Error)) - return output - - file = '' - else: - f = xbmcvfs.File(file_path) - file = cStringIO.StringIO(f.read()) - f.close() - - # read image - try: - image = Image.open(file) - if image.mode != 'RGB': - image = image.convert('RGB') - h = image.size[1] - if h > 10: - if (h > height): - image.load() - image = image.resize((width, height), Image.ANTIALIAS) - image_bin = cStringIO.StringIO() - image.save(image_bin, 'JPEG', quality=int(q)) - output = image_bin.getvalue() - image_bin.close() - - except Exception as Error: - debug.debug(str(jsonGetResponse)) - debug.debug(source) - debug.debug(str(Error)) - - # try only copy image without using PIL - debug.debug('Trying to just copy...') - try: - f = xbmcvfs.File(file_path) - output = f.read() - f.close() - - except Exception as Error: - debug.debug(str(Error)) - return output From 2162ed6784b4f4670ba5008bf202f558f250125e Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Thu, 18 Feb 2021 09:21:04 +0100 Subject: [PATCH 18/21] Update sendRequest.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wenn Kodi gestartet wird kommt zwar keine Fehlermeldung mehr - aber in der LOG steht REQUEST ERROR]: 'module' object is not callable die Seite oder das Script können keine Verbindung trotz richtiger IP bzw Freigabe aufbauen --- resources/lib/sendRequest.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index 297ef93..594e030 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -8,8 +8,6 @@ import time import base64 - - __addon__ = xbmcaddon.Addon() __lang__ = __addon__.getLocalizedString @@ -25,7 +23,7 @@ def send(self, option, values=''): debug.debug('[REQUEST]: ' + str(values)) # try send data - data = urllib.parse(values, True) + data = urllib.parse.urlencode(values, True) data_len = len(data) debug.debug('[REQUEST DATA SIZE]: ' + str(data_len) + ' bytes') @@ -37,11 +35,11 @@ def send(self, option, values=''): for l in range(1, 4): try: - request = urllib.request.urlopen(self.setXBMC['URL'] + option, data) + request = urllib.request(self.setXBMC['URL'] + option, data) if 'true' in self.setXBMC['Auth']: base64string = base64.encodestring(self.setXBMC['AuthLogin'] + ':' + self.setXBMC['AuthPass']).replace('\n', '') request.add_header('Authorization', 'Basic ' + base64string) - result = urllib.request(request) + result = urllib.urlopen(request) output = result.read() except Exception as Error: conn = False From 8fe30a3086715e721268417cda6e80abd4fa7ce0 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Mon, 26 Jul 2021 06:18:17 +0200 Subject: [PATCH 19/21] Update syncVideo.py --- resources/lib/syncVideo.py | 76 -------------------------------------- 1 file changed, 76 deletions(-) diff --git a/resources/lib/syncVideo.py b/resources/lib/syncVideo.py index 86077d6..b8e9158 100644 --- a/resources/lib/syncVideo.py +++ b/resources/lib/syncVideo.py @@ -103,82 +103,6 @@ def add(self, videosXBMC, videoToAdd, table, opt): 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 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)) - - - # 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 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 remove(self, videoToRemove, table): removedCount = 0 From 14c6f6dc872ef50070bb19fea000277750995b95 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 30 Jul 2021 08:31:51 +0200 Subject: [PATCH 20/21] Update sendRequest.py >>>> Movielib <<<< [REQUEST ERROR]: 'module' object is not callable did anyone why?? --- resources/lib/sendRequest.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/lib/sendRequest.py b/resources/lib/sendRequest.py index 594e030..c72c9d0 100644 --- a/resources/lib/sendRequest.py +++ b/resources/lib/sendRequest.py @@ -35,11 +35,11 @@ def send(self, option, values=''): for l in range(1, 4): try: - request = urllib.request(self.setXBMC['URL'] + option, data) + request = urllib.request.Request(self.setXBMC['URL'] + option, data) if 'true' in self.setXBMC['Auth']: base64string = base64.encodestring(self.setXBMC['AuthLogin'] + ':' + self.setXBMC['AuthPass']).replace('\n', '') request.add_header('Authorization', 'Basic ' + base64string) - result = urllib.urlopen(request) + result = urllib.request(request) output = result.read() except Exception as Error: conn = False From c03e3f5d7d066ac2bba6af82728d80e1ee86d938 Mon Sep 17 00:00:00 2001 From: agarnele <76904352+agarnele@users.noreply.github.com> Date: Fri, 30 Jul 2021 08:33:21 +0200 Subject: [PATCH 21/21] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 508f7f4..a7a70ee 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ # script.movielib -Dieser Fork soll Phyton 3 kompitabel werden..... +Readme kommt