diff --git a/platformcode/dbconverter.py b/platformcode/dbconverter.py index 04f6fbd1..17ca8e21 100644 --- a/platformcode/dbconverter.py +++ b/platformcode/dbconverter.py @@ -3,10 +3,11 @@ import xbmc, os, math from core import filetools, support from core.videolibrarydb import videolibrarydb from platformcode import config, logger, platformtools -from platformcode.xbmc_videolibrary import execute_sql_kodi, get_data +from platformcode.xbmc_videolibrary import execute_sql_kodi, get_data, get_file_db from time import time, strftime, localtime +import sqlite3 - +conn = sqlite3.connect(get_file_db()) class addVideo(object): @@ -62,56 +63,57 @@ class addVideo(object): payload = { "jsonrpc": "2.0", "method": "VideoLibrary.Scan", - "directory" : self.strPath, + "directory": self.strPath, "id": 1 } get_data(payload) - + + conn.close() def get_id(self): Type = 'id' + self.item.contentType.replace('tv','').capitalize() sql = 'select {} from {}_view where (uniqueid_value like "{}" and uniqueid_type like "kod")'.format(Type, self.item.contentType, self.item.videolibrary_id) - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if n: return True, records[0][0] sql = 'SELECT MAX({}) FROM {}_view'.format(Type, self.item.contentType) - nun_records, records = execute_sql_kodi(sql) + nun_records, records = execute_sql_kodi(sql, conn=conn) if nun_records == 1: _id = records[0][0] + 1 else: _id = 1 return False, _id def set_path(self): sql = 'select idPath from path where (strPath like "{}")'.format(self.parentPath) - nun_records, records = execute_sql_kodi(sql) + nun_records, records = execute_sql_kodi(sql, conn=conn) if records: self.idParentPath = records[0][0] else: return sql = 'select idPath from path where (strPath like "{}")'.format(self.strPath) - nun_records, records = execute_sql_kodi(sql) + nun_records, records = execute_sql_kodi(sql, conn=conn) if records: - self.idPath = records[0][0] + self.idPath = records[0][0] else: self.idPath = get_id('idPath', 'path') sql = 'INSERT OR IGNORE INTO path (idPath, strPath, dateAdded, idParentPath, noUpdate) VALUES ( ?, ?, ?, ?, ?)' params = (self.idPath, self.strPath, self.date, self.idParentPath, 1) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_sets(self): self.idSet = None if self.info.get('set'): sql = 'SELECT idSet from sets where (strSet like "{}")'.format(self.info.get('set')) # params = self.info.get('set') - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if records: self.idSet = records[0][0] else: self.idSet = get_id('idSet', 'sets') sql = 'INSERT OR IGNORE INTO sets (idSet, strSet, strOvervieW) VALUES ( ?, ?, ?)' params = (self.idSet, self.info.get('set'), self.info.get('setoverview')) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) if self.info.get('setposters'): self.art.append({'media_id':self.idSet, 'media_type': 'set', 'type':'poster', 'url':self.info.get('setposters')[0]}) if self.info.get('setfanarts'): @@ -125,7 +127,7 @@ class addVideo(object): else: sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, dateAdded) VALUES ( ?, ?, ?, ?)' params = (self.idFile, self.idPath, self.strFilename, self.date) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_rating(self): self.rating_id = get_id('rating_id', 'rating') @@ -134,7 +136,7 @@ class addVideo(object): media_type = self.item.contentType sql = 'INSERT OR IGNORE INTO rating (rating_id, media_id, media_type, rating_type, rating, votes) VALUES ( ?, ?, ?, ?, ?, ?)' params = (self.rating_id, self.VideoId, media_type, 'tmdb', rating, votes) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_ids(self): self.uniqueID = get_id('uniqueid_id', 'uniqueid') @@ -142,14 +144,14 @@ class addVideo(object): self.uniqueIDType = 'kod' sql = 'INSERT OR IGNORE INTO uniqueid (uniqueid_id, media_id, media_type, value, type) VALUES ( ?, ?, ?, ?, ?)' params = [(self.uniqueID, self.VideoId, self.item.contentType, self.uniqueIdValue, self.uniqueIDType)] - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) i = self.uniqueID + 1 for _id in ['imdb', 'tmdb', 'tvdb']: if _id +'_id' in self.info: params.append((i, self.VideoId, self.item.contentType, self.info[_id + '_id'], _id)) if params: - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_actors(self): actor_id = get_id('actor_id', 'actor') @@ -157,7 +159,7 @@ class addVideo(object): if actors: actors.sort(key=lambda a: a[3]) l_actors = [] sql = 'select actor_id, name from actor' - n, current_actors = execute_sql_kodi(sql) + n, current_actors = execute_sql_kodi(sql, conn=conn) if current_actors: l_actors = [a[1] for a in current_actors] actor_params = [] actor_link_params = [] @@ -230,51 +232,51 @@ class addVideo(object): if countrys: for country in countrys: sql = 'select country_id from country where name = "{}"'.format(country) - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if records: _id = records[0][0] else: _id = get_id('country_id', 'country') sql = 'INSERT OR IGNORE INTO country (country_id, name) VALUES (?, ?)' params = (_id, country) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) sql = 'INSERT OR IGNORE INTO country_link (country_id, media_id, media_type) VALUES (?, ?, ?)' params = (_id, self.VideoId, self.item.contentType) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_genre(self): genres = self.info.get('genre','').split(', ') if genres: for genre in genres: sql = 'select genre_id from genre where name = "{}"'.format(genre) - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if records: _id = records[0][0] else: _id = get_id('genre_id', 'genre') sql = 'INSERT OR IGNORE INTO genre (genre_id, name) VALUES (?, ?)' params = (_id, genre) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) sql = 'INSERT OR IGNORE INTO genre_link (genre_id, media_id, media_type) VALUES (?, ?, ?)' params = (_id, self.VideoId, self.item.contentType) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_studio(self): studios = self.info.get('studio','').split(', ') if studios: for studio in studios: sql = 'select studio_id from studio where name = "{}"'.format(studio) - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if records: _id = records[0][0] else: _id = get_id('studio_id', 'studio') sql = 'INSERT OR IGNORE INTO studio (studio_id, name) VALUES (?, ?)' params = (_id, studio) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) sql = 'INSERT OR IGNORE INTO studio_link (studio_id, media_id, media_type) VALUES (?, ?, ?)' params = (_id, self.VideoId, self.item.contentType) - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_movie(self): posters, fanarts = get_images(self.item) @@ -302,7 +304,7 @@ class addVideo(object): self.idPath, # c23 self.idSet, # idSet self.info.get('premiered')) # premiered - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) if self.item.thumbnail: self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'poster', 'url':self.item.thumbnail}) if self.item.fanart: @@ -341,14 +343,14 @@ class addVideo(object): self.idPath, # c23 self.idSet, # idSet self.info.get('premiered')) # premiered - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def set_art(self): params = [] art_urls = [] _id = get_id('art_id', 'art') sql = 'select media_id, media_type, type from art' - n, records = execute_sql_kodi(sql) + n, records = execute_sql_kodi(sql, conn=conn) if records: art_urls = [[u[0], u[1], u[2]] for u in records] for art in self.art: @@ -357,7 +359,7 @@ class addVideo(object): _id += 1 if params: sql = 'INSERT OR IGNORE INTO art (art_id, media_id, media_type, type, url) VALUES (?, ?, ?, ?, ?)' - n, records = execute_sql_kodi(sql, params) + n, records = execute_sql_kodi(sql, params, conn) def add_video(item): @@ -394,7 +396,7 @@ def process_path(path): def get_id(column, table): sql = 'SELECT MAX({}) FROM {}'.format(column, table) - nun_records, records = execute_sql_kodi(sql) + nun_records, records = execute_sql_kodi(sql, conn=conn) if nun_records == 1: _id = records[0][0] + 1 else: _id = 1 return _id diff --git a/platformcode/launcher.py b/platformcode/launcher.py index b18b5ff1..cf5b8427 100644 --- a/platformcode/launcher.py +++ b/platformcode/launcher.py @@ -506,7 +506,7 @@ def play_from_library(item): path = filetools.join(config.get_runtime_path(), 'servers', item.server.lower() + '.json') name = jsontools.load(open(path, "rb").read())['name'] if name.startswith('@'): name = config.get_localized_string(int(name.replace('@',''))) - it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s [%s]' % (name, quality, item.contentTitle, get_channel_parameters(item.contentChannel)['title'])) + it = xbmcgui.ListItem('\n[B]%s[/B] %s - %s [%s]' % (name, quality, item.contentTitle, get_channel_parameters(item.channel).get('title', ''))) it.setArt({'thumb':item.thumbnail}) options.append(it) else: diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index 3dfb1e89..ae817ebf 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -399,7 +399,7 @@ def set_watched_on_kod(data): season = records[0][0] seasons = videolibrarydb['seasons'].get(_id, {}) item = seasons.get(season, None) - item.all_ep + # item.all_ep else: # support.dbg() @@ -1170,21 +1170,11 @@ def check_db(path): return ret -def execute_sql_kodi(sql, params=None): +def get_file_db(): """ - Run sql query against kodi database - @param sql: Valid sql query - @type sql: str - @return: Number of records modified or returned by the query - @rtype nun_records: int - @return: list with the query result - @rtype records: list of tuples + Return the path of MyVideos kodi db """ - logger.debug() - file_db = "" - nun_records = 0 - records = None - + file_db = '' # We look for the archive of the video database according to the version of kodi video_db = config.get_platform(True)['video_db'] if video_db: @@ -1199,14 +1189,38 @@ def execute_sql_kodi(sql, params=None): if filetools.isfile(path_f) and f.lower().startswith('myvideos') and f.lower().endswith('.db'): file_db = path_f break + return file_db + + +def execute_sql_kodi(sql, params=None, conn=None): + """ + Run sql query against kodi database + @param sql: Valid sql query + @type sql: str + @param params: Parameters to insert instead of ? in sql + @type params: list, tuple + @param conn: sqlite3 connection to use, reusing same one increase performance on multiple calls + @type conn: sqlite3.Connection + @return: Number of records modified or returned by the query + @rtype nun_records: int + @return: list with the query result + @rtype records: list of tuples + """ + logger.debug() + file_db = get_file_db() + nun_records = 0 + records = None if file_db: logger.debug("DB file: %s" % file_db) - conn = None + conn_internal = None try: - import sqlite3 - conn = sqlite3.connect(file_db) - cursor = conn.cursor() + if not conn: + import sqlite3 + conn_internal = sqlite3.connect(file_db) + else: + conn_internal = conn + cursor = conn_internal.cursor() logger.debug("Running sql: %s" % sql) if params: @@ -1216,7 +1230,7 @@ def execute_sql_kodi(sql, params=None): cursor.execute(sql, params) else: cursor.execute(sql) - conn.commit() + conn_internal.commit() records = cursor.fetchall() if sql.lower().startswith("select"): @@ -1227,13 +1241,14 @@ def execute_sql_kodi(sql, params=None): else: nun_records = conn.total_changes - conn.close() + if not conn: + conn_internal.close() logger.debug("Query executed. Records: %s" % nun_records) except: logger.error("Error executing sql query") - if conn: - conn.close() + if not conn and conn_internal: + conn_internal.close() else: logger.debug("Database not found") diff --git a/updatetvshow.py b/updatetvshow.py index 159009a3..0e09541b 100644 --- a/updatetvshow.py +++ b/updatetvshow.py @@ -55,24 +55,10 @@ def search_paths(Id): def execute_sql(sql): logger.debug() - file_db = "" + from platformcode.xbmc_videolibrary import get_file_db + file_db = get_file_db() records = None - # We look for the archive of the video database according to the version of kodi - video_db = config.get_platform(True)['video_db'] - if video_db: - file_db = os.path.join(xbmc.translatePath("special://userdata/Database"), video_db) - - # alternative method to locate the database - if not file_db or not os.path.exists(file_db): - file_db = "" - for f in os.path.listdir(xbmc.translatePath("special://userdata/Database")): - path_f = os.path.join(xbmc.translatePath("special://userdata/Database"), f) - - if os.path.pathoos.pathols.isfile(path_f) and f.lower().startswith('myvideos') and f.lower().endswith('.db'): - file_db = path_f - break - if file_db: logger.debug("DB file: %s" % file_db) conn = None