- Aggiunto menu globale opzioni di KoD\n- Aggiunto canale tapmovie e server annessi\n- Notifica quando il tipo di vista viene salvata (con indicazione del tipo di contenuto)\n\n
215 lines
9.2 KiB
Python
215 lines
9.2 KiB
Python
# -*- 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, support
|
|
|
|
path = ''
|
|
mediatype = ''
|
|
|
|
|
|
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
|
|
|
|
|
|
def get_id():
|
|
global mediatype
|
|
|
|
mediatype = xbmc.getInfoLabel('ListItem.DBTYPE')
|
|
if mediatype == 'tvshow':
|
|
dbid = xbmc.getInfoLabel('ListItem.DBID')
|
|
elif mediatype in ('season', 'episode'):
|
|
dbid = xbmc.getInfoLabel('ListItem.TvShowDBID')
|
|
else:
|
|
dbid = ''
|
|
return dbid
|
|
|
|
def check_condition():
|
|
# support.dbg()
|
|
global path
|
|
path = search_paths(get_id())
|
|
return path
|
|
|
|
|
|
def get_menu_items():
|
|
logger.debug('get menu item')
|
|
if check_condition():
|
|
items = [(config.get_localized_string(70269), update)]
|
|
from core import videolibrarytools
|
|
nfo = path + 'tvshow.nfo'
|
|
item = videolibrarytools.read_nfo(nfo)[1]
|
|
if item:
|
|
item.nfo = nfo
|
|
item_url = item.tourl()
|
|
# Context menu: Automatically search for new episodes or not
|
|
if item.active and int(item.active) > 0:
|
|
update_text = config.get_localized_string(60022)
|
|
value = 0
|
|
else:
|
|
update_text = config.get_localized_string(60023)
|
|
value = 1
|
|
items.append((update_text,
|
|
lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?{}&title={}&action=mark_tvshow_as_updatable&channel=videolibrary&active={})".format(item_url, update_text, str(value)))))
|
|
if item.local_episodes_path == "":
|
|
items.append((config.get_localized_string(80048), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?{}&action=add_local_episodes&channel=videolibrary&path={})".format(item_url, path))))
|
|
else:
|
|
items.append((config.get_localized_string(80049), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?{}&action=remove_local_episodes&channel=videolibrary&path={})".format(item_url, path))))
|
|
|
|
# Context menu: Delete series / channel
|
|
channels_num = len(item.library_urls)
|
|
if channels_num > 1:
|
|
delete_text = config.get_localized_string(60024)
|
|
multichannel = True
|
|
else:
|
|
delete_text = config.get_localized_string(60025)
|
|
multichannel = False
|
|
items.append((delete_text, lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?{}&action=delete&channel=videolibrary&multichannel={}&path={})".format(item_url, str(multichannel), path))))
|
|
# if config.get_setting('downloadenabled'):
|
|
# from core import videolibrarytools
|
|
# from core import filetools
|
|
# if xbmc.getInfoLabel('ListItem.FilenameAndPath'):
|
|
# item = Item().fromurl(filetools.read(xbmc.getInfoLabel('ListItem.FilenameAndPath')))
|
|
# else:
|
|
# item = videolibrarytools.read_nfo(path + 'tvshow.nfo')[1]
|
|
# if item:
|
|
# item_url = item.tourl()
|
|
#
|
|
# Download movie
|
|
# if mediatype == "movie":
|
|
# items.append((config.get_localized_string(60354), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (item_url,
|
|
# 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
#
|
|
# elif item.contentSerieName:
|
|
# Download series
|
|
# if mediatype == "tvshow" and item.action not in ['findvideos']:
|
|
# if item.channel == 'videolibrary':
|
|
# items.append((config.get_localized_string(60003), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (
|
|
# item_url,
|
|
# 'channel=downloads&action=save_download&unseen=true&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
# items.append((config.get_localized_string(60355), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (
|
|
# item_url,
|
|
# 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
# items.append((config.get_localized_string(60357), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (
|
|
# item_url,
|
|
# 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
# Download episode
|
|
# elif mediatype == "episode" and item.action in ['findvideos']:
|
|
# items.append((config.get_localized_string(60356), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (
|
|
# item_url,
|
|
# 'channel=downloads&action=save_download&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
# Download season
|
|
# elif mediatype == "season":
|
|
# items.append((config.get_localized_string(60357), lambda: xbmc.executebuiltin("RunPlugin(plugin://plugin.video.kod/?%s&%s)" % (
|
|
# item_url,
|
|
# 'channel=downloads&action=save_download&download=season&from_channel=' + item.channel + '&from_action=' + item.action))))
|
|
|
|
return items
|
|
else:
|
|
return []
|
|
|
|
|
|
def update():
|
|
dbid = get_id()
|
|
path = search_paths(dbid)
|
|
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() + ")")
|