diff --git a/addon.xml b/addon.xml index d461e1ac..c3332f13 100644 --- a/addon.xml +++ b/addon.xml @@ -6,6 +6,14 @@ + + + + + String.IsEqual(ListItem.dbtype,tvshow) + + + video diff --git a/core/videolibrarytools.py b/core/videolibrarytools.py index 7f17e490..4a4616e3 100644 --- a/core/videolibrarytools.py +++ b/core/videolibrarytools.py @@ -578,10 +578,11 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): update = False nfo_path = filetools.join(path, "tvshow.nfo") head_nfo, item_nfo = read_nfo(nfo_path) + if item_nfo.update_last: local_episodes_path = item_nfo.local_episodes_path elif config.get_setting("local_episodes", "videolibrary"): - done, local_episodes_path = config_local_episodes_path(path, serie.show) + done, local_episodes_path = config_local_episodes_path(path, serie) if done < 0: logger.info("An issue has occurred while configuring local episodes, going out without creating strm") return 0, 0, done @@ -884,23 +885,25 @@ def save_episodes(path, episodelist, serie, silent=False, overwrite=True): return insertados, sobreescritos, fallidos -def config_local_episodes_path(path, title, silent=False): - logger.info() - - local_episodes_path = '' - if not silent: - silent = platformtools.dialog_yesno(config.get_localized_string(30131), config.get_localized_string(80044) % title) - if silent: - if config.is_xbmc() and not config.get_setting("videolibrary_kodi"): - platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80043)) - local_episodes_path = platformtools.dialog_browse(0, config.get_localized_string(80046)) - if local_episodes_path == '': - logger.info("User has canceled the dialog") - return -2, local_episodes_path - elif path in local_episodes_path: - platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80045)) - logger.info("Selected folder is the same of the TV show one") - return -2, local_episodes_path +def config_local_episodes_path(path, item, silent=False): + logger.info(item) + from platformcode.xbmc_videolibrary import search_local_path + local_episodes_path=search_local_path(item) + if not local_episodes_path: + title = item.contentSerieName if item.contentSerieName else item.show + if not silent: + silent = platformtools.dialog_yesno(config.get_localized_string(30131), config.get_localized_string(80044) % title) + if silent: + if config.is_xbmc() and not config.get_setting("videolibrary_kodi"): + platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80043)) + local_episodes_path = platformtools.dialog_browse(0, config.get_localized_string(80046)) + if local_episodes_path == '': + logger.info("User has canceled the dialog") + return -2, local_episodes_path + elif path in local_episodes_path: + platformtools.dialog_ok(config.get_localized_string(30131), config.get_localized_string(80045)) + logger.info("Selected folder is the same of the TV show one") + return -2, local_episodes_path if local_episodes_path: # import artwork diff --git a/platformcode/platformtools.py b/platformcode/platformtools.py index 7db365ea..98ab5799 100644 --- a/platformcode/platformtools.py +++ b/platformcode/platformtools.py @@ -52,7 +52,7 @@ def dialog_notification(heading, message, icon=3, time=5000, sound=True): dialog_ok(heading, message) -def dialog_yesno(heading, line1, line2="", line3="", nolabel="No", yeslabel="Si", autoclose=0, customlabel=None): +def dialog_yesno(heading, line1, line2="", line3="", nolabel=config.get_localized_string(70170), yeslabel=config.get_localized_string(30022), autoclose=0, customlabel=None): # customlabel only on kodi 19 dialog = xbmcgui.Dialog() if config.get_platform() == 'kodi-matrix': diff --git a/platformcode/xbmc_videolibrary.py b/platformcode/xbmc_videolibrary.py index 299fc60b..d03b8190 100644 --- a/platformcode/xbmc_videolibrary.py +++ b/platformcode/xbmc_videolibrary.py @@ -525,6 +525,21 @@ def search_library_path(): return None +def search_local_path(item): + ids = [item.infoLabels['imdb_id'], item.infoLabels['tmdb_id'], item.infoLabels['tvdb_id']] + for Id in ids: + nun_ids, ids = execute_sql_kodi('SELECT idShow FROM tvshow_view WHERE uniqueid_value LIKE "%s"' % Id) + if nun_ids >= 1: + nun_records, records = execute_sql_kodi('SELECT idPath FROM tvshowlinkpath WHERE idShow LIKE "%s"' % ids[0][0]) + if nun_records >= 1: + for record in records: + num_path, path_records = execute_sql_kodi('SELECT strPath FROM path WHERE idPath LIKE "%s"' % record[0]) + for path in path_records: + if config.get_setting('videolibrarypath') not in path[0]: + return path[0] + return '' + + def set_content(content_type, silent=False, custom=False): """ Procedure to auto-configure the kodi video library with the default values diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index 2fb1987b..f6a9433d 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -6029,15 +6029,15 @@ msgstr "" msgctxt "#70807" msgid "Elementum does not support network folder downloads, do you want to change the download location?" -msgstr "Elementum non supporta i download su cartella di rete, vuoi cambiare il percorso di download?" +msgstr "" msgctxt "#70808" msgid "In order to view this content you need to install [B]Widevine CDM[/B]. Do you want to install it?" -msgstr "Per poter visionare questo contenuto devi installare [B]Widevine CDM[/B]. Vuoi installarlo?" +msgstr "" msgctxt "#70809" msgid "An update of [B]Widevine CDM[/B] is available. Do you want to install it?" -msgstr "È disponibile un aggiornamento di [B]Widevine CDM[/B]. Vuoi installarlo?" +msgstr "" msgctxt "#70810" msgid "Update available" @@ -6045,27 +6045,31 @@ msgstr "Aggiornamento disponibile" msgctxt "#70811" msgid "Extracting Widevine CDM" -msgstr "Estrazione di Widevine CDM" +msgstr "" msgctxt "#70812" msgid "Preparing downloaded image..." -msgstr "Preparazione dell'immagine scaricata..." +msgstr "" msgctxt "#70813" msgid "Identifying wanted partition..." -msgstr "Identificazione della partizione desiderata..." +msgstr "" msgctxt "#70814" msgid "Scanning the filesystem for the Widevine CDM..." -msgstr "Scansione del filesystem per Widevine CDM..." +msgstr "." msgctxt "#70815" msgid "Widevine CDM found, analyzing..." -msgstr "Widevine CDM trovato, analisi..." +msgstr "W" msgctxt "#70816" msgid "Extracting Widevine CDM from image..." -msgstr "Estrazione di Widevine CDM dall'immagine..." +msgstr "" + +msgctxt "#70817" +msgid "La Serie "%s" non è gestita da KoD, Vuoi cercarla?" +msgstr "" # DNS start [ settings and declaration ] msgctxt "#707401" diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po index 94b35f69..a4e88eaa 100644 --- a/resources/language/resource.language.it_it/strings.po +++ b/resources/language/resource.language.it_it/strings.po @@ -6067,6 +6067,10 @@ msgctxt "#70816" msgid "Extracting Widevine CDM from image..." msgstr "Estrazione di Widevine CDM dall'immagine..." +msgctxt "#70817" +msgid "La Serie "%s" non è gestita da KoD, Vuoi cercarla?" +msgstr "La Serie "%s" non è gestita da KoD, Vuoi cercarla?" + # DNS start [ settings and declaration ] msgctxt "#707401" msgid "Enable DNS check alert" @@ -6406,4 +6410,4 @@ msgstr "Rimuovi episodi in locale" msgctxt "#80050" msgid "Downloading..." -msgstr "Download in corso..." \ No newline at end of file +msgstr "Download in corso..." diff --git a/service.py b/service.py index a12dda24..70ec7bc5 100644 --- a/service.py +++ b/service.py @@ -21,10 +21,12 @@ from servers import torrent def update(path, p_dialog, i, t, serie, overwrite): logger.info("Updating " + path) insertados_total = 0 + nfo_file = xbmc.translatePath(filetools.join(path, 'tvshow.nfo')) - head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') - # videolibrarytools.check_renumber_options(it) + head_nfo, it = videolibrarytools.read_nfo(nfo_file) videolibrarytools.update_renumber_options(it, head_nfo, path) + + if not serie.library_url: serie = it category = serie.category # logger.debug("%s: %s" %(serie.contentSerieName,str(list_canales) )) @@ -34,7 +36,7 @@ def update(path, p_dialog, i, t, serie, overwrite): ###### Redirección al canal NewPct1.py si es un clone, o a otro canal y url si ha intervención judicial try: - head_nfo, it = videolibrarytools.read_nfo(path + '/tvshow.nfo') #Refresca el .nfo para recoger actualizaciones + head_nfo, it = videolibrarytools.read_nfo(nfo_file) #Refresca el .nfo para recoger actualizaciones if it.emergency_urls: serie.emergency_urls = it.emergency_urls serie.category = category diff --git a/specials/videolibrary.py b/specials/videolibrary.py index 38bef66f..c42d62bb 100644 --- a/specials/videolibrary.py +++ b/specials/videolibrary.py @@ -727,7 +727,7 @@ def update_tvshow(item): def add_local_episodes(item): logger.info() - done, local_episodes_path = videolibrarytools.config_local_episodes_path(item.path, item.contentSerieName, silent=True) + done, local_episodes_path = videolibrarytools.config_local_episodes_path(item.path, item, silent=True) if done < 0: logger.info("An issue has occurred while configuring local episodes") elif local_episodes_path: diff --git a/updatetvshow.py b/updatetvshow.py new file mode 100644 index 00000000..7227ec72 --- /dev/null +++ b/updatetvshow.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +import xbmc, sys, base64, json, xbmcgui, os, xbmcvfs, traceback +from platformcode import config, logger +from lib.sambatools import libsmb as samba +from core import scrapertools + + +def exists(path, silent=False, vfs=True): + path = xbmc.translatePath(path) + try: + if vfs: + result = bool(xbmcvfs.exists(path)) + if not result and not path.endswith('/') and not path.endswith('\\'): + result = bool(xbmcvfs.exists(join(path, ' ').rstrip())) + return result + elif path.lower().startswith("smb://"): + return samba.exists(path) + else: + return os.path.exists(path) + except: + logger.error("ERROR when checking the path: %s" % path) + if not silent: + logger.error(traceback.format_exc()) + return False + +def join(*paths): + list_path = [] + if paths[0].startswith("/"): + list_path.append("") + for path in paths: + if path: + list_path += path.replace("\\", "/").strip("/").split("/") + + if scrapertools.find_single_match(paths[0], r'(^\w+:\/\/)'): + return str("/".join(list_path)) + else: + return str(os.sep.join(list_path)) + + +def search_paths(Id): + records = execute_sql('SELECT idPath FROM tvshowlinkpath WHERE idShow LIKE "%s"' % Id) + if len(records) >= 1: + for record in records: + path_records = execute_sql('SELECT strPath FROM path WHERE idPath LIKE "%s"' % record[0]) + for path in path_records: + if config.get_setting('videolibrarypath') in path[0] and exists(join(path[0], 'tvshow.nfo')): + return path[0] + return '' + + +def execute_sql(sql): + logger.info() + 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.info("DB file: %s" % file_db) + conn = None + try: + import sqlite3 + conn = sqlite3.connect(file_db) + cursor = conn.cursor() + + logger.info("Running sql: %s" % sql) + cursor.execute(sql) + conn.commit() + + records = cursor.fetchall() + if sql.lower().startswith("select"): + if len(records) == 1 and records[0][0] is None: + records = [] + + conn.close() + logger.info("Query executed. Records: %s" % nun_records) + + except: + logger.error("Error executing sql query") + if conn: + conn.close() + + else: + logger.debug("Database not found") + + return records + +if __name__ == '__main__': + path = search_paths(sys.listitem.getVideoInfoTag().getDbId()) + if path: + item = {"action": "update_tvshow", "channel": "videolibrary", 'path':path} + xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + base64.b64encode(json.dumps(item).encode()) + ")") + else: + dialog = xbmcgui.Dialog() + title = sys.listitem.getVideoInfoTag().getTitle() + if dialog.yesno(title, config.get_localized_string(70817) % title, nolabel=config.get_localized_string(70170), yeslabel=config.get_localized_string(30022)): + item = {"action": "new_search", "channel": "search", "mode":"tvshow", "search_text": sys.listitem.getVideoInfoTag().getTitle()} + xbmc.executebuiltin("ActivateWindow(10025,plugin://plugin.video.kod/?" + base64.b64encode(json.dumps(item).encode()) + ")") \ No newline at end of file