diff --git a/addon.xml b/addon.xml index 46296624..dc06e2f4 100644 --- a/addon.xml +++ b/addon.xml @@ -12,10 +12,6 @@ - - - String.IsEqual(ListItem.dbtype,tvshow) - !String.StartsWith(ListItem.FileNameAndPath, plugin://plugin.video.kod/) + [ String.IsEqual(ListItem.dbtype, tvshow) | String.IsEqual(ListItem.dbtype, movie) | String.IsEqual(ListItem.dbtype, season) | String.IsEqual(ListItem.dbtype, episode) ] diff --git a/contextmenu.py b/contextmenu.py index 8ef69684..585c9f98 100644 --- a/contextmenu.py +++ b/contextmenu.py @@ -1,4 +1,3 @@ -import os from platformcode import config, logger import xbmc, sys, xbmcgui, os @@ -11,17 +10,11 @@ addon_id = config.get_addon_core().getAddonInfo('id') LOCAL_FILE = os.path.join(config.get_runtime_path(), "platformcode/contextmenu/contextmenu.json") f = open(LOCAL_FILE) -try: - contextmenu_settings = jsontools.load( f.read() ) -except: - contextmenu_settings = [] +contextmenu_settings = jsontools.load(open(LOCAL_FILE).read()) f.close() - - def build_menu(): - tmdbid = xbmc.getInfoLabel('ListItem.Property(tmdb_id)') mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') title = xbmc.getInfoLabel('ListItem.Title') @@ -35,41 +28,28 @@ def build_menu(): logger.info(filePath) logger.info(containerPath) - contextmenumodules = [] - contextmenu = [] - - for itemmodule in contextmenu_settings: - logger.debug('check contextmenu', itemmodule ) - module = __import__(itemmodule, None, None, [ itemmodule] ) - - # if module.check_condition(): - logger.info('Add contextmenu item ->',itemmodule ) - contextmenumodules.append( module ) - - contextmenuitems = [] contextmenuactions = [] - empty = False - if len(contextmenumodules) == 0: + + for itemmodule in contextmenu_settings: + logger.debug('check contextmenu', itemmodule) + module = __import__(itemmodule, None, None, [itemmodule]) + + logger.info('Add contextmenu item ->', itemmodule) + module_item_actions = module.get_menu_items() + contextmenuitems.extend([item for item, fn in module_item_actions]) + contextmenuactions.extend([fn for item, fn in module_item_actions]) + + if len(contextmenuitems) == 0: logger.info('No contextmodule found, build an empty one') - contextmenucontextmenuitems.append( empty_item() ) - empty = True - else: - support.dbg() - for itemmodule in contextmenumodules: - module_item_actions = itemmodule.get_menu_items() - contextmenuitems = contextmenuitems + [item for item, fn in module_item_actions ] - contextmenuactions = contextmenuactions + [fn for item, fn in module_item_actions ] + contextmenuitems.append(empty_item()) + contextmenuactions.append(lambda: None) - ret = xbmcgui.Dialog().contextmenu( contextmenuitems ) + ret = xbmcgui.Dialog().contextmenu(contextmenuitems) - if not empty and ret > -1: - module_function = contextmenuactions[ ret ] - logger.info( 'Contextmenu module index', ret, 'for -> {}', itemmodule ) - if module_function: - module_function() - else: - logger.warn('No function for menu item: {}'.format(contextmenuitems[ret]) ) + if ret > -1: + logger.info('Contextmenu module index', ret, ', label=' + contextmenuitems[ret]) + contextmenuactions[ret]() def empty_item(): diff --git a/externalsearch.py b/externalsearch.py deleted file mode 100644 index 2b837e08..00000000 --- a/externalsearch.py +++ /dev/null @@ -1,80 +0,0 @@ -import xbmc, sys, xbmcgui, os -from platformcode import config, logger - -# incliuding folder libraries -librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) -sys.path.insert(0, librerias) - - -from core import tmdb -from core.item import Item - -def execute_search(): - """ - Gather the selected ListItem's attributes in order to compute the `Item` parameters - and perform the KOD's globalsearch. - Globalsearch will be executed specifing the content-type of the selected ListItem - - NOTE: this method needs the DBTYPE and TMDB_ID specified as ListItem's properties - """ - - # These following lines are commented and keep in the code just as reminder. - # In future, they could be used to filter the search outcome - - # ADDON: maybe can we know if the current windows is related to a specific addon? - # we could skip the ContextMenu if we already are in KOD's window - - tmdbid = xbmc.getInfoLabel('ListItem.Property(tmdb_id)') - mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') - title = xbmc.getInfoLabel('ListItem.Title') - year = xbmc.getInfoLabel('ListItem.Year') - imdb = xbmc.getInfoLabel('ListItem.IMDBNumber') - # folderPath = xbmc.getInfoLabel('Container.FolderPath') - # filePath = xbmc.getInfoLabel('ListItem.FileNameAndPath') - # logger.info("****") - # logger.info( xbmc.getCondVisibility("String.Contains(Container.FolderPath, 'plugin.video.kod')") ) - # logger.info( xbmc.getCondVisibility("String.Contains(ListItem.FileNameAndPath, 'plugin.video.kod')") ) - # logger.info( xbmc.getCondVisibility("String.IsEqual(ListItem.dbtype,tvshow)") ) - # logger.info( xbmc.getCondVisibility("String.IsEqual(ListItem.dbtype,movie)") ) - # logger.info("****") - - # visible = xbmc.getCondVisibility("!String.StartsWith(ListItem.FileNameAndPath, 'plugin://plugin.video.kod/') + [String.IsEqual(ListItem.dbtype,tvshow) | String.IsEqual(ListItem.dbtype,movie)]") - - logstr = "Selected ListItem is: 'IMDB: {}' - TMDB: {}' - 'Title: {}' - 'Year: {}'' - 'Type: {}'".format(imdb, tmdbid, title, year, mediatype) - logger.info(logstr) - - if not tmdbid and imdb: - logger.info('No TMDBid found. Try to get by IMDB') - it = Item(contentType= mediatype, infoLabels={'imdb_id' : imdb}) - tmdb.set_infoLabels(it) - tmdbid = it.infoLabels.get('tmdb_id', '') - - if not tmdbid: - logger.info('No TMDBid found. Try to get by Title/Year') - it = Item(contentTitle= title, contentType= mediatype, infoLabels={'year' : year}) - tmdb.set_infoLabels(it) - tmdbid = it.infoLabels.get('tmdb_id', '') - - - item = Item( - action="Search", - channel="globalsearch", - contentType= mediatype, - mode="search", - text= title, - type= mediatype, - infoLabels= { - 'tmdb_id': tmdbid, - 'year': year - }, - folder= False - ) - - logger.info("Invoking Item: {}".format(item.tostring())) - - itemurl = item.tourl() - xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + itemurl + ")") - - -if __name__ == '__main__': - execute_search() diff --git a/platformcode/contextmenu/contextmenu.json b/platformcode/contextmenu/contextmenu.json index 0fac1b25..f0d9b60c 100644 --- a/platformcode/contextmenu/contextmenu.json +++ b/platformcode/contextmenu/contextmenu.json @@ -1,5 +1,4 @@ [ - "platformcode.contextmenu.search_on_kod", - "platformcode.contextmenu.search_on_channels", + "platformcode.contextmenu.search", "platformcode.contextmenu.update_tv_show" ] \ No newline at end of file diff --git a/platformcode/contextmenu/search_on_channels.py b/platformcode/contextmenu/search.py similarity index 90% rename from platformcode/contextmenu/search_on_channels.py rename to platformcode/contextmenu/search.py index a254cefa..b7203520 100644 --- a/platformcode/contextmenu/search_on_channels.py +++ b/platformcode/contextmenu/search.py @@ -10,9 +10,11 @@ from core import tmdb from core.item import Item addon_id = config.get_addon_core().getAddonInfo('id') +global item_is_coming_from_kod def check_condition(): + global item_is_coming_from_kod logger.debug('check item condition') mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') @@ -33,17 +35,15 @@ def check_condition(): item_is_coming_from_kod = pattern.search(filePath) if item_is_coming_from_kod: - logger.debug("item IS already managed by KOD", item_is_coming_from_kod) + logger.debug("item IS already managed by KOD") - # logger.info('container is KOD? {}'.format(we_are_in_kod) ) - - return mediatype and item_is_coming_from_kod # and not we_are_in_kod + return mediatype def get_menu_items(): logger.debug('get menu item') if check_condition(): - return config.get_localized_string(90003) , execute + return [(config.get_localized_string(90003 if item_is_coming_from_kod else 90005), execute)] else: return [] @@ -69,6 +69,10 @@ def execute(): year = xbmc.getInfoLabel('ListItem.Year') imdb = xbmc.getInfoLabel('ListItem.IMDBNumber') + if mediatype in ('episode', 'season'): + mediatype = 'tvshow' + title = xbmc.getInfoLabel('ListItem.TVShowTitle') + logstr = "Selected ListItem is: 'IMDB: {}' - TMDB: {}' - 'Title: {}' - 'Year: {}'' - 'Type: {}'".format(imdb, tmdbid, title, year, mediatype) logger.info(logstr) @@ -90,13 +94,10 @@ def execute(): except: logger.info("Cannot find TMDB via title/year") - if not tmdbid: # We can continue searching by 'title (year)' logger.info( "No TMDB found, proceed with title/year:", title , "(" , year, ")" ) - - # User wants to search on other channels logger.info("Search on other channels") diff --git a/platformcode/contextmenu/search_on_kod.py b/platformcode/contextmenu/search_on_kod.py deleted file mode 100644 index cdbf37a8..00000000 --- a/platformcode/contextmenu/search_on_kod.py +++ /dev/null @@ -1,121 +0,0 @@ -import xbmc, sys, xbmcgui, os -from platformcode import config, logger - -# incliuding folder libraries -librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) -sys.path.insert(0, librerias) -import re - -from core import tmdb -from core.item import Item - -addon_id = config.get_addon_core().getAddonInfo('id') - - -def check_condition(): - logger.debug('[SOK] check item condition') - mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') - - folderPath = xbmc.getInfoLabel('Container.FolderPath') - filePath = xbmc.getInfoLabel('ListItem.Path') - fileNameAndPath = xbmc.getInfoLabel('ListItem.FileNameAndPath') - - logger.debug('Container:',folderPath ) - logger.debug('listitem mediatype:',mediatype ) - logger.debug('filenamepath:', fileNameAndPath ) - logger.info('filepath:', filePath ) - - item_is_coming_from_kod = addon_id in filePath - if not item_is_coming_from_kod: - videolibpath = config.get_setting("videolibrarypath") - if filePath.startswith(videolibpath): - pattern = re.compile("\[.*\][\\\/]?$") - item_is_coming_from_kod = pattern.search(filePath) - - if item_is_coming_from_kod: - logger.debug("item IS already managed by KOD", item_is_coming_from_kod) - - # logger.info('[SOK] container is KOD? {}'.format(we_are_in_kod) ) - - return mediatype and not item_is_coming_from_kod # and not we_are_in_kod - -def get_menu_items(): - logger.debug('get menu item') - if check_condition(): - return config.get_localized_string(90005) , execute - else: - return [] - - -def execute(): - """ - Gather the selected ListItem's attributes in order to compute the `Item` parameters - and perform the KOD's globalsearch. - Globalsearch will be executed specifing the content-type of the selected ListItem - - NOTE: this method needs the DBTYPE and TMDB_ID specified as ListItem's properties - """ - - # These following lines are commented and keep in the code just as reminder. - # In future, they could be used to filter the search outcome - - # ADDON: maybe can we know if the current windows is related to a specific addon? - # we could skip the ContextMenu if we already are in KOD's window - - tmdbid = xbmc.getInfoLabel('ListItem.Property(tmdb_id)') - mediatype = xbmc.getInfoLabel('ListItem.DBTYPE') - title = xbmc.getInfoLabel('ListItem.Title') - year = xbmc.getInfoLabel('ListItem.Year') - imdb = xbmc.getInfoLabel('ListItem.IMDBNumber') - - logstr = "Selected ListItem is: 'IMDB: {}' - TMDB: {}' - 'Title: {}' - 'Year: {}'' - 'Type: {}'".format(imdb, tmdbid, title, year, mediatype) - logger.info(logstr) - - if not tmdbid and imdb: - logger.info('No TMDBid found. Try to get by IMDB') - it = Item(contentType= mediatype, infoLabels={'imdb_id' : imdb}) - try: - tmdb.set_infoLabels(it) - tmdbid = it.infoLabels.get('tmdb_id', '') - except: - logger.info("Cannot find TMDB via imdb") - - if not tmdbid: - logger.info('No TMDBid found. Try to get by Title/Year') - it = Item(contentTitle= title, contentType= mediatype, infoLabels={'year' : year}) - try: - tmdb.set_infoLabels(it) - tmdbid = it.infoLabels.get('tmdb_id', '') - except: - logger.info("Cannot find TMDB via title/year") - - - if not tmdbid: - # We can continue searching by 'title (year)' - logger.info( "No TMDB found, proceed with title/year:", title , "(" , year, ")" ) - - - logger.info("Search on KOD (gobalsearch)") - - item = Item( - action="Search", - channel="globalsearch", - contentType= mediatype, - mode="search", - text= title, - type= mediatype, - infoLabels= { - 'tmdb_id': tmdbid, - 'year': year - }, - folder= False - ) - - logger.info("Invoking Item:", item.tostring() ) - - itemurl = item.tourl() - xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + itemurl + ")") - - - - diff --git a/platformcode/contextmenu/update_tv_show.py b/platformcode/contextmenu/update_tv_show.py index f98c3177..3f44530e 100644 --- a/platformcode/contextmenu/update_tv_show.py +++ b/platformcode/contextmenu/update_tv_show.py @@ -107,8 +107,8 @@ def execute_sql(sql): def check_condition(): # support.dbg() - dbid = xbmc.getInfoLabel('ListItem.DBID') - path = search_paths( dbid ) + dbid = xbmc.getInfoLabel('ListItem.TvShowDBID') + path = search_paths(dbid) if path: return True return False @@ -117,15 +117,15 @@ def check_condition(): def get_menu_items(): logger.debug('get menu item') if check_condition(): - return config.get_localized_string(70269) , execute + return [(config.get_localized_string(70269), execute)] else: return [] def execute(): - dbid = xbmc.getInfoLabel('ListItem.DBID') - path = search_paths( dbid ) + dbid = xbmc.getInfoLabel('ListItem.TvShowDBID') + path = search_paths(dbid) if path: item = Item(action="update_tvshow", channel="videolibrary", path=path) # Why? I think it is not necessary, just commented diff --git a/updatetvshow.py b/updatetvshow.py deleted file mode 100644 index 159009a3..00000000 --- a/updatetvshow.py +++ /dev/null @@ -1,118 +0,0 @@ -# -*- coding: utf-8 -*- -import xbmc, sys, xbmcgui, os, xbmcvfs, traceback -from platformcode import config, logger - -librerias = xbmc.translatePath(os.path.join(config.get_runtime_path(), 'lib')) -sys.path.insert(0, librerias) - -from core.item import Item -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.debug() - 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 - try: - import sqlite3 - conn = sqlite3.connect(file_db) - cursor = conn.cursor() - - logger.debug("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.debug("Query executed. Records: %s" % len(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 = Item(action="update_tvshow", channel="videolibrary", path=path) - # Why? I think it is not necessary, just commented - # item.tourl() - xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?" + item.tourl() + ")") - 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 = Item(action="new_search", channel="search", mode="tvshow", search_text=sys.listitem.getVideoInfoTag().getTitle()) - xbmc.executebuiltin("ActivateWindow(10025,plugin://plugin.video.kod/?" + item.tourl() + ")")