diff --git a/core/tmdb.py b/core/tmdb.py
index 74c58e62..e1ea6962 100644
--- a/core/tmdb.py
+++ b/core/tmdb.py
@@ -129,7 +129,7 @@ def cache_response(fn):
result = fn(*args)
else:
- url = args[0].replace('&year=-', '')
+ url = args[0].replace('&year=-', '').replace('&primary_release_year=-', '').replace('&first_air_date_year=-', '')
# if PY3: url = str.encode(url)
row = db['tmdb_cache'].get(url)
@@ -994,7 +994,10 @@ class Tmdb(object):
url = ('{}/search/{}?api_key={}&query={}&language={}&include_adult={}&page={}'.format(host, self.search_type, api, text_quote, self.search_language, True, page))
if self.search_year:
- url += '&year=%s' % self.search_year
+ if self.search_type == 'movie':
+ url += '&primary_release_year=%s' % self.search_year
+ else:
+ url += '&first_air_date_year=%s' % self.search_year
searching = self.search_text.capitalize()
logger.debug("[Tmdb.py] Searching %s on page %s:\n%s" % (searching, page, url))
diff --git a/core/videolibrarytools.py b/core/videolibrarytools.py
index 995930fe..58d71161 100644
--- a/core/videolibrarytools.py
+++ b/core/videolibrarytools.py
@@ -3,7 +3,6 @@
# Common Library Tools
# ------------------------------------------------------------
-from platformcode.dbconverter import addVideo
from platformcode.xbmc_videolibrary import execute_sql_kodi
import sys
PY3 = False
@@ -431,9 +430,9 @@ def save_tvshow(item, episodelist, silent=False):
logger.debug()
inserted, overwritten, failed = save_episodes(tvshow_item, episodelist, extra_info, item.host, local_files, silent=silent)
videolibrarydb.close()
- # if config.is_xbmc() and config.get_setting("videolibrary_kodi") and not silent and inserted:
- # # from platformcode.dbconverter import add_video
- # # add_video(tvshow_item)
+ if config.is_xbmc() and config.get_setting("videolibrary_kodi") and not silent:# and inserted:
+ from platformcode.dbconverter import add_video
+ add_video(tvshow_item)
# from platformcode.xbmc_videolibrary import update
# update(TVSHOWS_PATH, tvshow_item.basename)
@@ -540,8 +539,8 @@ def save_episodes(item, episodelist, extra_info, host, local_files, silent=False
filetools.write(filetools.join(TVSHOWS_PATH, strm_path), '{}?{}'.format(addon_name, item_strm.tourl()))
# update db if episode added
- if failed == 0 and config.get_setting('kod_scraper'):
- add_video(episode_item)
+ # if failed == 0 and config.get_setting('kod_scraper'):
+ # add_video(episode_item)
return item, episode, season_episode, e.contentLanguage, inserted, overwritten, failed
@@ -658,8 +657,8 @@ def save_episodes(item, episodelist, extra_info, host, local_files, silent=False
seasons[s] = season_item
# Add to Kodi DB if Kod is set to add information
- if config.get_setting('kod_scraper'):
- add_video(season_item)
+ # if config.get_setting('kod_scraper'):
+ # add_video(season_item)
if not silent:
diff --git a/platformcode/dbconverter.py b/platformcode/dbconverter.py
index 3225e7c7..4e965987 100644
--- a/platformcode/dbconverter.py
+++ b/platformcode/dbconverter.py
@@ -8,9 +8,113 @@ from time import time, strftime, localtime
import sqlite3
conn = sqlite3.connect(get_file_db())
+date = strftime('%Y-%m-%d %H:%M:%S', localtime(float(time())))
+
+def add_video(item):
+ progress = platformtools.dialog_progress_bg('Sincronizzazione Libreria', item.title)
+ progress.update(0)
+ if item.contentType == 'movie':
+ start = time()
+ addMovie(item=item)
+ logger.debug('TOTAL TIME:', time() - start)
+ else:
+ start = time()
+ addTvShow(item=item)
+ logger.debug('TOTAL TIME:', time() - start)
+ videolibrarydb.close()
+ progress.close()
-class addVideo(object):
+def get_path(item):
+ logger.debug(item)
+ p = item.strm_path if item.strm_path else item.nfo_path
+ path = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)), p.split('\\')[0].split('/')[0])
+ parent = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)))
+ if item.contentType == 'movie':
+ filepath = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)), p)
+ file = item.strm_path.split('\\')[-1].split('/')[-1]
+ return process_path(path), process_path(parent), file, filepath
+ else:
+ return process_path(path), process_path(parent)
+
+def process_path(path):
+ if '\\' in path: path += '\\'
+ else: path += '/'
+ return path
+
+def get_id(column, table):
+ sql = 'SELECT MAX({}) FROM {}'.format(column, table)
+ nun_records, records = execute_sql_kodi(sql, conn=conn)
+ if nun_records == 1: _id = records[0][0] + 1
+ else: _id = 1
+ return _id
+
+def get_images(item):
+
+ pstring = '{}'
+ fstring = '{}'
+
+ posters = ''
+ fanarts = ''
+
+ videoposters = [item.thumbnail] + item.infoLabels.get('posters',[])
+ videofanarts = [item.fanart] + item.infoLabels.get('fanarts',[])
+ videoclearlogos = item.infoLabels.get('clearlogos',[])
+ videocleararts = item.infoLabels.get('cleararts',[])
+ videolanscapes = item.infoLabels.get('lanscapes',[])
+ videobanners = item.infoLabels.get('banners',[])
+ videodiscs = item.infoLabels.get('discs',[])
+
+ for p in videoposters:
+ if p: posters += pstring.format('poster', p.replace('original', 'w500'), p)
+ for p in videoclearlogos:
+ if p: posters += pstring.format('clearlogo', '', p)
+ for p in videocleararts:
+ if p: posters += pstring.format('clearart', '', p)
+ for p in videolanscapes:
+ if p: posters += pstring.format('lanscape', '', p)
+ for p in videobanners:
+ if p: posters += pstring.format('banner', '', p)
+ for p in videodiscs:
+ if p: posters += pstring.format('disc', '', p)
+
+ if item.infoLabels['setid']:
+ collection = videolibrarydb['collection'].get(item.infoLabels['setid'], {})
+ setposters = collection.infoLabels.get('posters',[])
+ setfanarts = collection.infoLabels.get('fanarts',[])
+ setclearlogos = collection.infoLabels.get('clearlogos',[])
+ setcleararts = collection.infoLabels.get('cleararts',[])
+ setlanscapes = collection.infoLabels.get('lanscapes',[])
+ setbanners = collection.infoLabels.get('banners',[])
+ setdiscs = collection.infoLabels.get('discs',[])
+
+ for p in setposters:
+ if p: posters += pstring.format('set.poster', p.replace('original', 'w500'), p)
+ for p in setfanarts:
+ if p: posters += pstring.format('set.fanart', p.replace('original', 'w500'), p)
+ for p in setclearlogos:
+ if p: posters += pstring.format('set.clearlogo', '', p)
+ for p in setcleararts:
+ if p: posters += pstring.format('set.clearart', '', p)
+ for p in setlanscapes:
+ if p: posters += pstring.format('set.lanscape', '', p)
+ for p in setbanners:
+ if p: posters += pstring.format('set.banner', '', p)
+ for p in setdiscs:
+ if p: posters += pstring.format('set.disc', '', p)
+
+
+
+
+ fanarts += ''
+ for f in videofanarts:
+ if f: fanarts += fstring.format(f.replace('original', 'w780'), f)
+ fanarts += ''
+
+ return posters, fanarts
+
+
+class addMovie(object):
def __init__(self, *args, **kwargs):
self.art = []
self.item = kwargs.get('item', None)
@@ -22,12 +126,9 @@ class addVideo(object):
if not self.videoExist:
logger.debug('Add {}: {} to Kodi Library'.format(self.item.contentType, self.item.title))
self.strPath, self.parentPath, self.strFilename, self.path = get_path(self.item)
- self.date = strftime('%Y-%m-%d %H:%M:%S', localtime(float(time())))
-
- if self.item.contentType == 'movie':
- self.set_path()
- self.set_sets()
+ self.set_path()
+ self.set_sets()
self.set_files()
self.set_rating()
self.set_ids()
@@ -35,12 +136,7 @@ class addVideo(object):
self.set_info('country')
self.set_info('genre')
self.set_info('studio')
-
- if self.item.contentType == 'movie': self.set_movie()
- elif self.item.contentType == 'tvshow': self.set_tvshow()
- elif self.item.contentType == 'season': self.set_season()
- else: self.set_episode()
-
+ self.set_movie()
self.set_art()
cursor = conn.cursor()
@@ -92,7 +188,7 @@ class addVideo(object):
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)
+ params = (self.idPath, self.strPath, date, self.idParentPath, 1)
self.sql_actions.append([sql, params])
def set_sets(self):
@@ -127,10 +223,10 @@ class addVideo(object):
self.idFile = get_id('idFile', 'files')
if self.item.playcount:
sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) VALUES ( ?, ?, ?, ?, ?, ?)'
- params = (self.idFile, self.idPath, self.strFilename, self.item.playcount, self.item.lastplayed, self.date)
+ params = (self.idFile, self.idPath, self.strFilename, self.item.playcount, self.item.lastplayed, date)
else:
sql = 'INSERT OR IGNORE INTO files (idFile, idPath, strFilename, dateAdded) VALUES ( ?, ?, ?, ?)'
- params = (self.idFile, self.idPath, self.strFilename, self.date)
+ params = (self.idFile, self.idPath, self.strFilename, date)
self.sql_actions.append([sql, params])
def set_rating(self):
@@ -166,9 +262,11 @@ class addVideo(object):
writer_params = []
writer_link_params = []
directors = self.info.get('director', '').split(', ')
- directors_image = self.info.get('director_image', ['' for d in directors])
+ directors_image = self.info.get('director_image', [])
+ if not directors_image: writers_image = ['' for d in directors]
writers = self.info.get('writer', '').split(', ')
- writers_image = self.info.get('writer_image', ['' for w in writers])
+ writers_image = self.info.get('writer_image', [])
+ if not writers_image: writers_image = ['' for w in writers]
actor_sql = 'INSERT OR IGNORE INTO actor (name, art_urls) VALUES (?, ?)'
actor_link_sql = 'INSERT OR IGNORE INTO actor_link (actor_id, media_id, media_type, role, cast_order) VALUES (?, ?, ?, ?, ?)'
@@ -263,13 +361,346 @@ class addVideo(object):
self.sql_actions.append([sql, params])
+ def set_art(self):
+ params = []
+ art_urls = []
+ _id = get_id('art_id', 'art')
+ art_urls = [[u[0], u[1], u[2]] for u in execute_sql_kodi('select media_id, media_type, type from art', conn=conn)[1]]
+ for art in self.art:
+ if [art ['media_id'], art['media_type'], art['type']] not in art_urls:
+ params.append((_id, art['media_id'], art['media_type'], art['type'], art['url']))
+ _id += 1
+ if params:
+ sql = 'INSERT OR IGNORE INTO art (art_id, media_id, media_type, type, url) VALUES (?, ?, ?, ?, ?)'
+ self.sql_actions.append([sql, params])
+class addTvShow(object):
+ def __init__(self, *args, **kwargs):
+ self.item = kwargs.get('item', None)
+ self.info = self.item.infoLabels
+ self.seasons = videolibrarydb['season'][self.item.videolibrary_id]
+ self.episodes = videolibrarydb['episode'][self.item.videolibrary_id]
+ self.imdb_id, self.tmdb_id, self.tvdb_id = self.info['code']
+ self.exist, self.idShow = self.get_idShow()
+ self.idSeasons = self.get_idSeasons()
+ self.idEpisodes = self.get_idEpisodes()
+ self.strPath, self.parentPath = get_path(self.item)
+ self.art = []
+ self.sql_actions = []
+ logger.debug('Add {}: {} to Kodi Library'.format(self.item.contentType, self.item.title))
+
+ self.set_path()
+ self.set_files()
+ self.set_rating()
+ self.set_ids()
+ self.set_season()
+ self.set_actors()
+ self.set_episode_actors()
+ self.set_info('country')
+ self.set_info('genre')
+ self.set_info('studio')
+ self.set_tvshow()
+ self.set_episodes()
+ self.set_art()
+
+ cursor = conn.cursor()
+ for sql, params in self.sql_actions:
+ if type(params) == list:
+ cursor.executemany(sql, params)
+ else:
+ cursor.execute(sql, params)
+ conn.commit()
+
+ # need if no movie in kodi library
+ if self.idShow == 1:
+ payload = {
+ "jsonrpc": "2.0",
+ "method": "VideoLibrary.Scan",
+ "directory": self.strPath,
+ "id": 1
+ }
+ get_data(payload)
+ else:
+ xbmc.executebuiltin('ReloadSkin()')
+ conn.close()
+
+ def get_idShow(self):
+ sql = 'select idShow from tvshow_view where uniqueid_value = {} and uniqueid_type = "kod"'.format(self.info['tmdb_id'])
+ n, records = execute_sql_kodi(sql)
+ if n: return True, records[0][0]
+ else: return False, get_id('idShow', 'tvshow_view')
+
+ def get_idSeasons(self):
+ r = {}
+ sql = 'select idSeason, season from seasons_view where idShow = {}'.format(self.idShow)
+ n, records = execute_sql_kodi(sql)
+ maxId = get_id('idSeason', 'seasons')
+
+ if n:
+ seasons = [s[1] for s in records]
+ for season in self.seasons.keys():
+ if season.contentSeason not in seasons:
+ r[season] = maxId
+
+ maxId += 1
+ else:
+ for season in self.seasons:
+ r[season] = maxId
+ maxId += 1
+ return r
+
+ def get_idEpisodes(self):
+ sql = 'select idEpisode, c12, c13 from episode_view where idShow = {}'.format(self.idShow)
+ n, records = execute_sql_kodi(sql)
+ r = {}
+ episodes = [v['item'] for v in videolibrarydb['episode'][self.item.videolibrary_id].values()]
+ maxId = get_id('idEpisode', 'episode_view')
+ if n:
+ record_episodes = ['{}x{:02d}'.format(int(s[1]), int(s[2])) for s in records]
+ for episode in episodes:
+ e = '{}x{:02d}'.format(episode.contentSeason, episode.contentEpisodeNumber)
+ if e not in record_episodes:
+ r[e] = maxId
+ maxId += 1
+
+ else:
+ for episode in episodes:
+ e = '{}x{:02d}'.format(episode.contentSeason, episode.contentEpisodeNumber)
+ r[e] = maxId
+ maxId += 1
+ return r
+
+ def set_path(self):
+ sql = 'select idPath from path where (strPath = "{}") limit 1'.format(self.parentPath)
+ 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 = "{}") limit 1'.format(self.strPath)
+ nun_records, records = execute_sql_kodi(sql, conn=conn)
+ if records:
+ 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, date, self.idParentPath, 1)
+ self.sql_actions.append([sql, params])
+
+ def set_files(self):
+ files = {}
+ sql = 'select idFile, strFilename from files where idPath={}'.format(self.idPath)
+ nun_records, records = execute_sql_kodi(sql, conn=conn)
+ if records:
+ files = {r[1].replace('.strm',''):r[0] for r in records}
+ self.idFiles = {}
+ idFile = get_id('idFile', 'files')
+ for episode in self.idEpisodes.keys():
+ if episode in files.keys():
+ self.idFiles[episode] = files[episode]
+ else:
+ if self.item.playcount:
+ sql = 'INSERT INTO files (idFile, idPath, strFilename, playCount, lastPlayed, dateAdded) VALUES ( ?, ?, ?, ?, ?, ?)'
+ params = (idFile, self.idPath, episode + 'strm', self.item.playcount, self.item.lastplayed, date)
+ else:
+ sql = 'INSERT INTO files (idFile, idPath, strFilename, dateAdded) VALUES ( ?, ?, ?, ?)'
+ params = (idFile, self.idPath, episode + 'strm', date)
+ self.idFiles[episode] = idFile
+ idFile += 1
+ self.sql_actions.append([sql, params])
+
+ def set_rating(self):
+ self.rating_id = get_id('rating_id', 'rating')
+ if not self.exist:
+ rating = self.info.get('rating', None)
+ votes = self.info.get('votes', None)
+ sql = 'INSERT OR IGNORE INTO rating (rating_id, media_id, media_type, rating_type, rating, votes) VALUES ( ?, ?, ?, ?, ?, ?)'
+ params = (self.rating_id, self.idShow, 'tvshow', 'tmdb', rating, votes)
+ self.sql_actions.append([sql, params])
+
+ self.episodes_rating_id = {}
+ rating_id = self.rating_id
+ if not self.exist: rating_id += 1
+ for episode, _id in self.idEpisodes.items():
+ item = self.episodes[episode]['item']
+ info = item.infoLabels
+ rating = info.get('rating', None)
+ votes = info.get('votes', None)
+ sql = 'INSERT OR IGNORE INTO rating (rating_id, media_id, media_type, rating_type, rating, votes) VALUES ( ?, ?, ?, ?, ?, ?)'
+ params = (rating_id, self.idShow, 'episode', 'tmdb', rating, votes)
+ self.sql_actions.append([sql, params])
+ self.episodes_rating_id[episode] = _id
+
+ def set_ids(self):
+ self.uniqueIDs = {}
+ uniqueID = get_id('uniqueid_id', 'uniqueid')
+ self.uniqueID = uniqueID
+ if not self.exist:
+ sql = 'INSERT OR IGNORE INTO uniqueid (uniqueid_id, media_id, media_type, value, type) VALUES ( ?, ?, ?, ?, ?)'
+ params = [(uniqueID, self.idShow, 'tvshow', self.item.videolibrary_id, 'kod')]
+
+ uniqueID += 1
+
+ for _id in ['imdb', 'tmdb', 'tvdb']:
+ if _id +'_id' in self.info:
+ params.append((uniqueID, self.idShow, 'tvshow', self.info[_id + '_id'], _id))
+ uniqueID += 1
+ self.sql_actions.append([sql, params])
+
+ for episode, _id in self.idEpisodes.items():
+ item = self.episodes[episode]['item']
+ info = item.infoLabels
+ sql = 'INSERT OR IGNORE INTO uniqueid (uniqueid_id, media_id, media_type, value, type) VALUES ( ?, ?, ?, ?, ?)'
+ params = [(uniqueID, _id, 'episode', info['episode_id'], 'kod')]
+ self.uniqueIDs[episode] = uniqueID
+ uniqueID += 1
+
+ for t in ['imdb', '', 'tvdb']:
+ if 'episode{}_id'.format(t) in self.info:
+ params.append((uniqueID, t, 'episode', self.info[t + 'episode{}_id'.format(t)], t if t else 'tmdb'))
+ uniqueID += 1
+ self.sql_actions.append([sql, params])
+
+ def set_season(self):
+ sql = 'INSERT OR IGNORE INTO seasons (idSeason, idShow, season, name) VALUES ( ?, ?, ?, ?)'
+ params = []
+ for season, _id in self.idSeasons.items():
+ item = self.seasons[season]
+ name = item.title
+ params.append((_id, self.idShow, season, name))
+ self.sql_actions.append([sql, params])
+
+ def set_actors(self):
+ actors = self.info.get('castandrole', [])
+ if actors: actors.sort(key=lambda a: a[3])
+ actor_params = []
+ actor_link_params = []
+ director_link_params = []
+ writer_params = []
+ writer_link_params = []
+ directors = self.info.get('director', '').split(', ')
+ directors_image = self.info.get('director_image', [])
+ if not directors_image: directors_image = ['' for d in directors]
+ writers = self.info.get('writer', '').split(', ')
+ writers_image = self.info.get('writer_image',[])
+ if not writers_image: writers_image = ['' for w in writers]
+
+ actor_sql = 'INSERT OR IGNORE INTO actor (name, art_urls) VALUES (?, ?)'
+ actor_link_sql = 'INSERT OR IGNORE INTO actor_link (actor_id, media_id, media_type, role, cast_order) VALUES (?, ?, ?, ?, ?)'
+ for actor in actors:
+ actor_params.append((actor[0], actor[2]))
+ for d, director in enumerate(directors):
+ actor_params.append((director, directors_image[d]))
+ for w, writer in enumerate(writers):
+ actor_params.append((writer, writers_image[w]))
+
+ if actor_params:
+ nun_records, records = execute_sql_kodi(actor_sql, actor_params, conn)
+
+ for actor in actors:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(actor[0]))[1][0][0]
+ actor_link_params.append((actor_id, self.idShow, 'tvshow', actor[1], actor[3]))
+ if actor[2]:
+ self.art.append({'media_id': actor_id, 'media_type': 'actor', 'type': 'thumb', 'url': actor[2]})
+
+ for director in directors:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(director))[1][0][0]
+ director_link_params.append((actor_id, self.idShow, 'tvshow'))
+
+ for writer in writers:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(writer))[1][0][0]
+ writer_link_params.append((actor_id, self.idShow, 'tvshow'))
+
+ if actor_link_params:
+ self.sql_actions.append([actor_link_sql, actor_link_params])
+ if director_link_params:
+ sql = 'INSERT OR IGNORE INTO director_link (actor_id, media_id, media_type) VALUES (?, ?, ?)'
+ self.sql_actions.append([sql, director_link_params])
+
+ if writer_params:
+ self.sql_actions.append([actor_sql, writer_params])
+ if writer_link_params:
+ sql = 'INSERT OR IGNORE INTO director_link (actor_id, media_id, media_type) VALUES (?, ?, ?)'
+ self.sql_actions.append([sql, writer_link_params])
+
+ def set_episode_actors(self):
+ actors = []
+ directors = []
+ directors_image = []
+ writers = []
+ writers_image = []
+
+ for ep in self.episodes.values():
+ info = ep['item'].infoLabels
+ actors += info.get('castandrole', [])
+ directors += self.info.get('director', '').split(', ')
+ directors_image += self.info.get('director_image') if self.info.get('director_image') else ['' for d in directors]
+ writers += self.info.get('writer', '').split(', ')
+ writers_image += self.info.get('writer_image') if self.info.get('writer_image') else ['' for w in writers]
+
+ if actors: actors.sort(key=lambda a: a[3])
+ actor_params = []
+ actor_link_params = []
+ director_link_params = []
+ writer_params = []
+ writer_link_params = []
+
+
+ actor_sql = 'INSERT OR IGNORE INTO actor (name, art_urls) VALUES (?, ?)'
+ actor_link_sql = 'INSERT OR IGNORE INTO actor_link (actor_id, media_id, media_type, role, cast_order) VALUES (?, ?, ?, ?, ?)'
+ for actor in actors:
+ actor_params.append((actor[0], actor[2]))
+ for d, director in enumerate(directors):
+ actor_params.append((director, directors_image[d]))
+ for w, writer in enumerate(writers):
+ actor_params.append((writer, writers_image[w]))
+
+ if actor_params:
+ nun_records, records = execute_sql_kodi(actor_sql, actor_params, conn)
+
+ for actor in actors:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(actor[0]))[1][0][0]
+ actor_link_params.append((actor_id, self.idShow, 'episode', actor[1], actor[3]))
+ if actor[2]:
+ self.art.append({'media_id': actor_id, 'media_type': 'actor', 'type': 'thumb', 'url': actor[2]})
+
+ for director in directors:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(director))[1][0][0]
+ director_link_params.append((actor_id, self.idShow, 'episode'))
+
+ for writer in writers:
+ actor_id = execute_sql_kodi('select actor_id from actor where name="{}" limit 1'.format(writer))[1][0][0]
+ writer_link_params.append((actor_id, self.idShow, 'episode'))
+
+ if actor_link_params:
+ self.sql_actions.append([actor_link_sql, actor_link_params])
+ if director_link_params:
+ sql = 'INSERT OR IGNORE INTO director_link (actor_id, media_id, media_type) VALUES (?, ?, ?)'
+ self.sql_actions.append([sql, director_link_params])
+
+ if writer_params:
+ self.sql_actions.append([actor_sql, writer_params])
+ if writer_link_params:
+ sql = 'INSERT OR IGNORE INTO director_link (actor_id, media_id, media_type) VALUES (?, ?, ?)'
+ self.sql_actions.append([sql, writer_link_params])
+
+ def set_info(self, info_name):
+ info_list = self.info.get(info_name, '').split(', ')
+ if info_list:
+ sql = 'INSERT OR IGNORE INTO {} (name) VALUES (?)'.format(info_name)
+ params = [(info,) for info in info_list]
+ nun_records, records = execute_sql_kodi(sql, params, conn)
+ sql = 'INSERT OR IGNORE INTO {}_link ({}_id, media_id, media_type) VALUES (?, ?, ?)'.format(info_name, info_name)
+ params = [(execute_sql_kodi('select {}_id from {} where name = "{}" limit 1'.format(info_name, info_name, info))[1][0][0],
+ self.idShow, self.item.contentType) for info in info_list]
def set_tvshow(self):
posters, fanarts = get_images(self.item)
sql = 'INSERT OR IGNORE INTO tvshow (idShow, c00, c01, c02, c04, c05, c06, c08, c09, c11, c12, c13, c14, c16)'
sql += 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
- params = (self.VideoId, # idShow
+ params = (self.idShow, # idShow
self.item.title, # c00
self.item.plot, # c01
self.info.get('status'), # c02
@@ -286,56 +717,50 @@ class addVideo(object):
)
if self.item.thumbnail:
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'poster', 'url':self.item.thumbnail})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'poster', 'url':self.item.thumbnail})
if self.item.fanart:
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'fanart', 'url':self.item.fanart})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'fanart', 'url':self.item.fanart})
if self.info.get('landscape'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'landscape', 'url':self.info.get('landscape')})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'landscape', 'url':self.info.get('landscape')})
if self.info.get('banner'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'banner', 'url':self.info.get('banner')})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'banner', 'url':self.info.get('banner')})
if self.info.get('clearlogo'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'clearlogo', 'url':self.info.get('clearlogo')})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'clearlogo', 'url':self.info.get('clearlogo')})
if self.info.get('clearart'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'clearart', 'url':self.info.get('clearart')})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'clearart', 'url':self.info.get('clearart')})
if self.info.get('disc'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'disc', 'url':self.info.get('disc')})
+ self.art.append({'media_id':self.idShow, 'media_type': 'tvshow', 'type':'disc', 'url':self.info.get('disc')})
self.sql_actions.append([sql, params])
-
- def set_season(self):
- posters, fanarts = get_images(self.item)
- sql = 'INSERT OR IGNORE INTO tvshow (idShow, c00, c01, c02, c04, c05, c06, c08, c09, c11, c12, c13, c14, c16)'
- sql += 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
- params = (self.VideoId, # idShow
- self.item.title, # c00
- self.item.plot, # c01
- self.info.get('status'), # c02
- self.rating_id, # c04
- self.info.get('premiered'), # c05
- posters, # c06
- self.info.get('genre','').replace(',', ' /') if self.info.get('genre') else None, # c08
- self.info.get('originaltitle'), # c09
- fanarts, # c11
- self.uniqueID, #c12
- self.info.get('mpaa'), # c13
- self.info.get('studio'), # c14
- self.info.get('trailer'), # c16
- )
- if self.item.thumbnail:
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'poster', 'url':self.item.thumbnail})
- if self.item.fanart:
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'fanart', 'url':self.item.fanart})
- if self.info.get('landscape'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'landscape', 'url':self.info.get('landscape')})
- if self.info.get('banner'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'banner', 'url':self.info.get('banner')})
- if self.info.get('clearlogo'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'clearlogo', 'url':self.info.get('clearlogo')})
- if self.info.get('clearart'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'clearart', 'url':self.info.get('clearart')})
- if self.info.get('disc'):
- self.art.append({'media_id':self.VideoId, 'media_type': 'movie', 'type':'disc', 'url':self.info.get('disc')})
+ def set_episodes(self):
+ params = []
+ sql = 'INSERT OR IGNORE INTO episode (idEpisode, idFile, c00, c01, c03, c04, c05, c06, c10, c12, c13, c14, c15, c16, c17, c18, c19, c20, idShow, idSeason)'
+ sql += 'VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
+ for episode, _id in sorted(self.idEpisodes.items()):
+ item = self.episodes[episode]['item']
+ info = item.infoLabels
+ params.append((_id, # idEpisode
+ self.idFiles[episode], # idFile
+ item.title, # c00
+ info['plot'], # c01
+ self.episodes_rating_id[episode], # c03
+ info.get('writer'), # c04
+ info.get('aired'), # c05
+ '{}'.format(info.get('poster_path')), # c06
+ info.get('director'), # c10
+ info.get('season'), # c12
+ info.get('episode'), # c13
+ info.get('originaltitle'), # c14
+ -1, -1, -1, # c15 c16, c17
+ '{}{}.strm'.format(self.strPath, episode), # c18
+ self.idPath, # c19
+ self.uniqueIDs[episode], # 20
+ self.idShow, # idShow
+ self.idSeasons[info.get('season')]
+ ))
+
+ self.art.append({'media_id':_id, 'media_type': 'episode', 'type':'thumb', 'url':info.get('poster_path')})
self.sql_actions.append([sql, params])
@@ -353,107 +778,14 @@ class addVideo(object):
self.sql_actions.append([sql, params])
-def add_video(item):
- if item.contentType == 'movie':
- start = time()
- addVideo(item=item)
- logger.debug('TOTAL TIME:', time() - start)
- else:
- i = 0
- seasons = videolibrarydb['season'][item.videolibrary_id]
- episodes = videolibrarydb['episode'][item.videolibrary_id]
- t = len(seasons) + len(episodes) + 1
- # progress = platformtools.dialog_progress_bg('Sincronizzazione Libreria', item.title)
- # progress.update(0)
- addVideo(item=item)
- # progress.update(int(math.ceil((i + 1) * t)))
- for season in seasons:
- addVideo(item=season)
- # progress.update(int(math.ceil((i + 1) * t)))
- for episode in episodes:
- addVideo(item=episode['item'])
- # progress.update(int(math.ceil((i + 1) * t)))
- # progress.close()
-
-def get_path(item):
- filepath = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)), item.strm_path)
- path = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)), item.strm_path.split('\\')[0].split('/')[0])
- parent = filetools.join(config.get_videolibrary_config_path(), config.get_setting("folder_{}s".format(item.contentType)))
- file = item.strm_path.split('\\')[-1].split('/')[-1]
- return process_path(path), process_path(parent), file, filepath
-
-def process_path(path):
- if '\\' in path: path += '\\'
- else: path += '/'
- return path
-
-def get_id(column, table):
- sql = 'SELECT MAX({}) FROM {}'.format(column, table)
- nun_records, records = execute_sql_kodi(sql, conn=conn)
- if nun_records == 1: _id = records[0][0] + 1
- else: _id = 1
- return _id
-
-def get_images(item):
-
- pstring = '{}'
- fstring = '{}'
-
- posters = ''
- fanarts = ''
-
- videoposters = [item.thumbnail] + item.infoLabels.get('posters',[])
- videofanarts = [item.fanart] + item.infoLabels.get('fanarts',[])
- videoclearlogos = item.infoLabels.get('clearlogos',[])
- videocleararts = item.infoLabels.get('cleararts',[])
- videolanscapes = item.infoLabels.get('lanscapes',[])
- videobanners = item.infoLabels.get('banners',[])
- videodiscs = item.infoLabels.get('discs',[])
-
- for p in videoposters:
- if p: posters += pstring.format('poster', p.replace('original', 'w500'), p)
- for p in videoclearlogos:
- if p: posters += pstring.format('clearlogo', '', p)
- for p in videocleararts:
- if p: posters += pstring.format('clearart', '', p)
- for p in videolanscapes:
- if p: posters += pstring.format('lanscape', '', p)
- for p in videobanners:
- if p: posters += pstring.format('banner', '', p)
- for p in videodiscs:
- if p: posters += pstring.format('disc', '', p)
-
- if item.infoLabels['setid']:
- collection = videolibrarydb['collection'].get(item.infoLabels['setid'], {})
- setposters = collection.infoLabels.get('posters',[])
- setfanarts = collection.infoLabels.get('fanarts',[])
- setclearlogos = collection.infoLabels.get('clearlogos',[])
- setcleararts = collection.infoLabels.get('cleararts',[])
- setlanscapes = collection.infoLabels.get('lanscapes',[])
- setbanners = collection.infoLabels.get('banners',[])
- setdiscs = collection.infoLabels.get('discs',[])
-
- for p in setposters:
- if p: posters += pstring.format('set.poster', p.replace('original', 'w500'), p)
- for p in setfanarts:
- if p: posters += pstring.format('set.fanart', p.replace('original', 'w500'), p)
- for p in setclearlogos:
- if p: posters += pstring.format('set.clearlogo', '', p)
- for p in setcleararts:
- if p: posters += pstring.format('set.clearart', '', p)
- for p in setlanscapes:
- if p: posters += pstring.format('set.lanscape', '', p)
- for p in setbanners:
- if p: posters += pstring.format('set.banner', '', p)
- for p in setdiscs:
- if p: posters += pstring.format('set.disc', '', p)
- fanarts += ''
- for f in videofanarts:
- if f: fanarts += fstring.format(f.replace('original', 'w780'), f)
- fanarts += ''
- return posters, fanarts
\ No newline at end of file
+
+
+
+
+
+