Correzioni videoteca

This commit is contained in:
Alhaziel01
2021-05-21 17:35:03 +02:00
parent 6b8305f7ae
commit 529e24e4c1
7 changed files with 206 additions and 370 deletions

View File

@@ -451,7 +451,7 @@ def get_season_and_episode(title):
except:
pass
logger.debug("'" + title + "' -> '" + filename + "'")
logger.debug(title, ' -> ', filename)
return filename

View File

@@ -1208,7 +1208,7 @@ def server(item, data='', itemlist=[], headers='', AutoPlay=True, CheckLinks=Tru
item.title = typo(item.contentTitle.strip(), 'bold') if item.contentType == 'movie' and item.contentTitle or (config.get_localized_string(30161) in item.fulltitle) else item.fulltitle
quality = videoitem.quality if videoitem.quality else item.quality if item.quality else ''
videoitem.contentLanguage = videoitem.contentLanguage if videoitem.contentLanguage else item.contentLanguage
videoitem.contentLanguage = videoitem.contentLanguage if videoitem.contentLanguage else item.contentLanguage if item.contentLanguage else 'ITA'
videoitem.title = (item.title if item.channel not in ['url'] else '')\
+ (typo(videoitem.title, '_ color kod [] bold') if videoitem.title else "")\
+ (typo(videoitem.quality, '_ color kod []') if videoitem.quality else "")\

View File

@@ -396,7 +396,6 @@ def save_tvshow(item, episodelist, silent=False):
return 0, 0, -1, path
# set base name
base_name = set_base_name(item, _id)
path = filetools.join(TVSHOWS_PATH, base_name)
@@ -488,7 +487,7 @@ def save_tvshow(item, episodelist, silent=False):
return inserted, overwritten, failed, path
def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=True):
def save_episodes(item, episodelist, extra_info, host, silent=False):
"""
saves in the indicated path all the chapters included in the episodelist
@type Item: str
@@ -509,20 +508,24 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
@return: the number of failed episodes
"""
# support.dbg()
def save_episode(item, seasons, current_seasons, episodes, e, inserted, overwritten, failed):
def save_episode(item, episodes, e):
inserted = 0
overwritten = 0
failed = 0
episode = None
season_episode = None
season_episode = scrapertools.get_season_and_episode(e.title)
if season_episode:
# local = True if season_episode in included_files else False
# if local:
# strm_path = filetools.join(item.base_name, included_files[season_episode])
# else:
strm_path = filetools.join(item.base_name, "{}.strm".format(season_episode))
nfo_path = filetools.join(item.base_name, "{}.nfo".format(season_episode))
e.contentSeason = int(season_episode.split('x')[0])
e.contentEpisodeNumber = int(season_episode.split('x')[1])
if item.infoLabels.get('imdb_id'): e.infoLabels['imdb_id'] = item.infoLabels['imdb_id']
if item.infoLabels.get('tmdb_id'): e.infoLabels['tmdb_id'] = item.infoLabels['tmdb_id']
if item.infoLabels.get('tvdb_id'): e.infoLabels['tvdb_id'] = item.infoLabels['tvdb_id']
tmdb.set_infoLabels_item(e)
if not e.infoLabels.get('playcount'): e.infoLabels['playcount'] = 0
@@ -544,40 +547,6 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
episode = episodes.get(season_episode, {})
try:
if e.contentSeason not in current_seasons:
tmdb_info = tmdb.Tmdb(id_Tmdb = e.infoLabels['tmdb_id'], search_type='tv')
seasoninfo = tmdb.get_season_dic(tmdb_info.get_season(e.contentSeason))
infoLabels = {}
if seasoninfo.get('season_posters'): infoLabels['posters'] = seasoninfo.get('season_posters') + extra_info['poster'].get(str(e.contentSeason), [])
if seasoninfo.get('season_fanarts'): infoLabels['fanarts'] = seasoninfo.get('season_fanarts') + extra_info['fanart'].get(str(e.contentSeason), [])
if seasoninfo.get('season_trailer'): infoLabels['trailer'] = seasoninfo.get('season_trailer')
infoLabels['landscapes'] = extra_info['landscape'].get(str(e.contentSeason), [])
infoLabels['banners'] = extra_info['banner'].get(str(e.contentSeason), [])
infoLabels['clearlogos'] = item.infoLabels.get('clearlogos', [])
infoLabels['cleararts'] = item.infoLabels.get('cleararts', [])
if e.contentSeason in seasons: infoLabels['playcount'] = seasons[e.contentSeason].infoLabels.get('playcount', 0)
season_item = Item(action="get_episodes",
channel='videolibrary',
title=seasoninfo.get('season_title'),
thumbnail = seasoninfo.get('season_poster') if seasoninfo.get('season_poster') else item.thumbnail,
fanart = item.fanart,
plot = seasoninfo.get('season_plot') if seasoninfo.get('season_plot') else item.infoLabels.get('plot'),
contentType = 'season',
infoLabels = infoLabels,
contentSeason = e.contentSeason,
videolibrary_id = item.videolibrary_id,
playcount=0)
if infoLabels['clearlogos']: season_item.clearlogo = infoLabels['clearlogos'][0]
if infoLabels['cleararts']: season_item.clearart = infoLabels['cleararts'][0]
if infoLabels['landscapes']: season_item.landscape = infoLabels['landscapes'][0]
if infoLabels['banners']: season_item.banner = infoLabels['banners'][0]
seasons[e.contentSeason] = season_item
current_seasons.append(e.contentSeason)
if not episode:
inserted += 1
episode['item'] = episode_item
@@ -589,7 +558,9 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
remove_host(e)
e.contentTitle = e.infoLabels['title']
contentType = e.contentType
e.infoLabels = {}
e.contentType = contentType
if e.channel in epchannels and e.channel != 'download':
channels_url = [u.url for u in epchannels[e.channel]]
@@ -603,7 +574,6 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
epchannels[e.channel] = [e]
episode['channels'] = epchannels
episodes[season_episode] = episode
if not filetools.exists(filetools.join(TVSHOWS_PATH, strm_path)):
logger.debug("Creating .strm: " + strm_path)
@@ -612,8 +582,43 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
# if not filetools.exists(filetools.join(TVSHOWS_PATH, nfo_path)):
# filetools.write(filetools.join(TVSHOWS_PATH, nfo_path), head_nfo)
except:
logger.error(traceback.format_exc())
failed += 1
return item, seasons, episodes, e, inserted, overwritten, failed
return item, episode, season_episode, e.contentLanguage, inserted, overwritten, failed
def save_season(item, seasons, s):
tmdb_info = tmdb.Tmdb(id_Tmdb = item.infoLabels['tmdb_id'], search_type='tv')
seasoninfo = tmdb.get_season_dic(tmdb_info.get_season(s))
infoLabels = {}
if seasoninfo.get('season_posters'): infoLabels['posters'] = seasoninfo.get('season_posters') + extra_info['poster'].get(str(s), [])
if seasoninfo.get('season_fanarts'): infoLabels['fanarts'] = seasoninfo.get('season_fanarts') + extra_info['fanart'].get(str(s), [])
if seasoninfo.get('season_trailer'): infoLabels['trailer'] = seasoninfo.get('season_trailer')
infoLabels['landscapes'] = extra_info['landscape'].get(str(s), [])
infoLabels['banners'] = extra_info['banner'].get(str(s), [])
infoLabels['clearlogos'] = item.infoLabels.get('clearlogos', [])
infoLabels['cleararts'] = item.infoLabels.get('cleararts', [])
if s in seasons: infoLabels['playcount'] = seasons[s].infoLabels.get('playcount', 0)
season_item = Item(action="get_episodes",
channel='videolibrary',
title=seasoninfo.get('season_title'),
thumbnail = seasoninfo.get('season_poster') if seasoninfo.get('season_poster') else item.thumbnail,
fanart = item.fanart,
plot = seasoninfo.get('season_plot') if seasoninfo.get('season_plot') else item.infoLabels.get('plot'),
contentType = 'season',
infoLabels = infoLabels,
contentSeason = s,
videolibrary_id = item.videolibrary_id,
playcount=0)
if infoLabels['clearlogos']: season_item.clearlogo = infoLabels['clearlogos'][0]
if infoLabels['cleararts']: season_item.clearart = infoLabels['cleararts'][0]
if infoLabels['landscapes']: season_item.landscape = infoLabels['landscapes'][0]
if infoLabels['banners']: season_item.banner = infoLabels['banners'][0]
return s, season_item
logger.debug()
# from core import tmdb
@@ -640,23 +645,37 @@ def save_episodes(item, episodelist, extra_info, host, silent=False, overwrite=T
# support.dbg()
# for i, e in enumerate(episodelist):
# item, seasons, episodes, e, inserted, overwritten, failed = save_episode(item, seasons, current_seasons, episodes, e, inserted, overwritten, failed)
# if not e.contentLanguage: e.contentLanguage = item.contentLanguage if item.contentLanguage else 'ITA'
# if not e.contentLanguage in item.lang_list: item.lang_list.append(e.contentLanguage)
# if not silent:
# p_dialog.update(int(math.ceil((i + 1) * t)), e.title)
# item, seasons, episodes, e, inserted, overwritten, failed = save_episode(item, episodes, e)
# if not e.contentLanguage: e.contentLanguage = item.contentLanguage if item.contentLanguage else 'ITA'
# if not e.contentLanguage in item.lang_list: item.lang_list.append(e.contentLanguage)
# if not silent:
# p_dialog.update(int(math.ceil((i + 1) * t)), e.title)
i = 0
with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(save_episode, item, seasons, current_seasons, episodes, e, inserted, overwritten, failed) for e in episodelist]
itlist = [executor.submit(save_episode, item, episodes, e) for e in episodelist]
for res in futures.as_completed(itlist):
if res.result():
item, seasons, episodes, e, inserted, overwritten, failed = res.result()
if not e.contentLanguage: e.contentLanguage = item.contentLanguage if item.contentLanguage else 'ITA'
if not e.contentLanguage in item.lang_list: item.lang_list.append(e.contentLanguage)
if not silent:
i += 1
p_dialog.update(int(math.ceil(i * t)), e.title)
item, episode, season_episode, lang, I, O, F = res.result()
inserted += I
overwritten += O
failed += F
if episode:
episodes[season_episode] = episode
e = episode['item']
if not e.contentSeason in current_seasons: current_seasons.append(e.contentSeason)
if not lang: lang = item.contentLanguage if item.contentLanguage else 'ITA'
if not lang in item.lang_list: item.lang_list.append(lang)
if not silent:
i += 1
p_dialog.update(int(math.ceil(i * t)), message=e.title)
with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(save_season, item, seasons, s) for s in current_seasons]
for res in futures.as_completed(itlist):
if res.result():
s, season_item = res.result()
seasons[s] = season_item
if not silent:
if len(item.lang_list) > 1:
@@ -882,6 +901,7 @@ def add_tvshow(item, channel=None):
global magnet_caching
magnet_caching = False
inserted, overwritten, failed, path = save_tvshow(item, itemlist)
if not path:

View File

@@ -278,11 +278,11 @@ def dialog_select_group(heading, _list, preselect=0):
return dialog
def itemlist_refresh():
def itemlist_refresh(offset=0):
win = xbmcgui.Window(xbmcgui.getCurrentWindowId())
cid = win.getFocusId()
ctl = win.getControl(cid)
pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition
pos = Item().fromurl(xbmc.getInfoLabel('ListItem.FileNameAndPath')).itemlistPosition + offset
xbmc.executebuiltin("Container.Refresh")
@@ -503,29 +503,20 @@ def set_infolabels(listitem, item, player=False):
@type item: item
"""
infoLabels_dict = {'aired': 'aired', 'album': 'album', 'artist': 'artist', 'cast': 'cast',
'castandrole': 'castandrole', 'tmdb_id': 'code', 'code': 'code', 'country': 'country',
'credits': 'credits', 'release_date': 'dateadded', 'dateadded': 'dateadded', 'dbid': 'dbid',
'director': 'director', 'duration': 'duration', 'episode': 'episode',
'episodio_sinopsis': 'episodeguide', 'episodio_air_date': 'None', 'episodio_imagen': 'None',
'episodio_titulo': 'title', 'episodio_vote_average': 'rating', 'episodio_vote_count': 'votes',
'fanart': 'None', 'genre': 'genre', 'homepage': 'None', 'imdb_id': 'imdbnumber',
'imdbnumber': 'imdbnumber', 'in_production': 'None', 'last_air_date': 'lastplayed',
'mediatype': 'mediatype', 'mpaa': 'mpaa', 'number_of_episodes': 'None',
'number_of_seasons': 'None', 'original_language': 'None', 'originaltitle': 'originaltitle',
'overlay': 'overlay', 'poster_path': 'path', 'popularity': 'None', 'playcount': 'playcount',
'plot': 'plot', 'plotoutline': 'plotoutline', 'premiered': 'premiered', 'quality': 'None',
'rating': 'rating', 'season': 'season', 'set': 'set', 'setid': 'setid',
'setoverview': 'setoverview', 'showlink': 'showlink', 'sortepisode': 'sortepisode',
'sortseason': 'sortseason', 'sorttitle': 'sorttitle', 'status': 'status', 'studio': 'studio',
'tag': 'tag', 'tagline': 'tagline', 'temporada_air_date': 'None', 'temporada_nombre': 'None',
'temporada_num_episodios': 'None', 'temporada_poster': 'None', 'title': 'title',
'top250': 'top250', 'tracknumber': 'tracknumber', 'trailer': 'trailer', 'thumbnail': 'None',
'tvdb_id': 'None', 'tvshowtitle': 'tvshowtitle', 'type': 'None', 'userrating': 'userrating',
'url_scraper': 'None', 'votes': 'votes', 'writer': 'writer', 'year': 'year'}
infoLabels_dict = {'aired': 'aired', 'album': 'album', 'artist': 'artist', 'cast': 'cast', 'castandrole': 'castandrole',
'tmdb_id': 'code', 'code': 'code', 'country': 'country', 'credits': 'credits', 'release_date': 'dateadded',
'dateadded': 'dateadded', 'dbid': 'dbid', 'director': 'director', 'duration': 'duration', 'episode': 'episode',
'episode_plot': 'episodeguide', 'episode_title': 'title', 'episode_vote_average': 'rating', 'episode_vote_count': 'votes',
'genre': 'genre', 'imdb_id': 'imdbnumber', 'imdbnumber': 'imdbnumber', 'last_air_date': 'lastplayed', 'mediatype': 'mediatype',
'mpaa': 'mpaa', 'originaltitle': 'originaltitle', 'overlay': 'overlay', 'poster_path': 'path', 'playcount': 'playcount',
'plot': 'plot', 'plotoutline': 'plotoutline', 'premiered': 'premiered', 'rating': 'rating', 'season': 'season', 'set': 'set',
'setid': 'setid', 'setoverview': 'setoverview', 'showlink': 'showlink', 'sortepisode': 'sortepisode', 'sortseason': 'sortseason',
'sorttitle': 'sorttitle', 'status': 'status', 'studio': 'studio', 'tag': 'tag', 'tagline': 'tagline', 'title': 'title',
'top250': 'top250', 'tracknumber': 'tracknumber', 'trailer': 'trailer', 'tvshowtitle': 'tvshowtitle', 'userrating': 'userrating',
'votes': 'votes', 'writer': 'writer', 'year': 'year'}
# if item.infoLabels:
try:
infoLabels_kodi = {infoLabels_dict[label_tag]: item.infoLabels[label_tag] for label_tag, label_value in list(item.infoLabels.items()) if infoLabels_dict[label_tag] != 'None' and label_tag in infoLabels_dict}
infoLabels_kodi = {infoLabels_dict[label_tag]: item.infoLabels[label_tag] for label_tag, label_value in list(item.infoLabels.items()) if label_tag in infoLabels_dict}
listitem.setInfo("video", infoLabels_kodi)
except:
listitem.setInfo("video", item.infoLabels)

View File

@@ -263,6 +263,7 @@ def mark_content_as_watched_on_kodi(item, value=1):
@param value: > 0 for seen, 0 for not seen
"""
logger.debug()
conn = sqlite3.connect(get_file_db())
view = 'episode' if item.contentType != 'movie' else 'movie'
path = '%{}%'.format(item.strm_path.split('\\')[0].split('/')[0] if item.strm_path else item.base_name)
@@ -272,13 +273,12 @@ def mark_content_as_watched_on_kodi(item, value=1):
if item.contentEpisodeNumber: request_episode = ' and strFileName= "{}"'.format(item.strm_path.split('\\')[-1].split('/')[-1])
sql = 'select idFile from {}_view where strPath like "{}"{}{}'.format(view, path, request_episode, request_season)
n, r = execute_sql_kodi(sql)
n, r = execute_sql_kodi(sql, conn=conn)
if r:
sql = 'update files set playCount= {} where idFile= {}'
sql_actions = [sql.format(value, i[0]) for i in r]
conn = sqlite3.connect(get_file_db())
cursor = conn.cursor()
cursor = conn.cursor()
for sql in sql_actions:
if type(sql) == list:
cursor.executemany(sql)
@@ -286,36 +286,9 @@ def mark_content_as_watched_on_kodi(item, value=1):
cursor.execute(sql)
conn.commit()
conn.close()
platformtools.itemlist_refresh()
def mark_season_as_watched_on_kodi(item, value=1):
"""
mark the entire season as seen or unseen in the Kodi library
@type item: item
@param item: element to mark
@type value: int
@param value: > 0 for seen, 0 for not seen
"""
logger.debug()
# support.dbg()
# logger.debug("item:\n" + item.tostring('\n'))
# We can only mark the season as seen in the Kodi database if the database is local, in case of sharing database this functionality will not work
if config.get_setting("db_mode", "videolibrary"):
return
if value == 0:
value = 'Null'
request_season = ''
if item.contentSeason > -1:
request_season = ' and c12= %s' % item.contentSeason
tvshows_path = filetools.join(config.config.get_videolibrary_config_path(), config.get_setting("folder_tvshows"))
sql = 'update files set playCount= %s where idFile in (select idfile from episode_view where (strPath like "%s" or strPath like "%s")%s)' % (value, request_season)
execute_sql_kodi(sql)
def set_watched_on_kod(data):
from specials import videolibrary
@@ -380,8 +353,6 @@ def set_watched_on_kod(data):
def mark_content_as_watched_on_kod(path):
from specials import videolibrary
from core import videolibrarytools
"""
mark the entire series or movie as viewed or unseen in the Alpha Video Library based on their status in the Kodi Video Library
@type str: path

View File

@@ -115,175 +115,9 @@ def update(path, p_dialog, i, t, serie, overwrite):
return insertados_total > 0
def check_for_update(overwrite=True):
logger.debug("Update Series...")
p_dialog = None
serie_actualizada = False
update_when_finished = False
hoy = datetime.date.today()
estado_verify_playcount_series = False
try:
if config.get_setting("update", "videolibrary") != 0 or overwrite:
config.set_setting("updatelibrary_last_check", hoy.strftime('%Y-%m-%d'), "videolibrary")
heading = config.get_localized_string(60389)
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), heading)
p_dialog.update(0, '')
show_list = []
# show_ep_num = []
for path, folders, files in filetools.walk(videolibrarytools.TVSHOWS_PATH):
if 'tvshow.nfo' in files:
show_list.extend([filetools.join(path, f) for f in files if f == "tvshow.nfo"])
# show_ep_num.append(len([f for f in files if f.endswith('.nfo') and f != 'tvshow.nfo']))
if show_list:
t = float(100) / len(show_list)
for i, tvshow_file in enumerate(show_list):
head_nfo, serie = videolibrarytools.read_nfo(tvshow_file)
# ep_count = show_ep_num[i] + (len(serie.local_episodes_list) if serie.local_episodes_path else 0)
# if serie.infoLabels['status'].lower() == 'ended' and \
# ep_count >= serie.infoLabels['number_of_episodes']:
# serie.active = 0
# filetools.write(tvshow_file, head_nfo + serie.tojson())
path = filetools.dirname(tvshow_file)
logger.debug("serie=" + serie.contentSerieName)
# Check the status of the series.library_playcounts of the Series in case it is incomplete
try:
estado = False
# If we have not done the verification or do not have a playcount, we enter
estado = config.get_setting("verify_playcount", "videolibrary")
if not estado or estado == False or not serie.library_playcounts: # If it hasn't happened before, we do it now
serie, estado = videolibrary.verify_playcount_series(serie, path) # Also happens if a PlayCount is missing completely
except:
logger.error(traceback.format_exc())
else:
if estado: # If the update was successful ...
estado_verify_playcount_series = True # ... is checked to change the Video Library option
try:
interval = int(serie.active) # Could be the bool type
except:
interval = 1
if not serie.active:
# if the series is not active discard
if not overwrite:
# Synchronize the episodes seen from the Kodi video library with that of Alpha, even if the series is deactivated
try:
if config.is_xbmc(): # If it's Kodi, we do it
from platformcode import xbmc_videolibrary
xbmc_videolibrary.mark_content_as_watched_on_kod(filetools.join(path,'tvshow.nfo'))
except:
logger.error(traceback.format_exc())
continue
p_dialog.update(int(math.ceil((i + 1) * t)), heading, serie.contentSerieName)
# Obtain the update date and the next scheduled for this series
update_next = serie.update_next
if update_next:
y, m, d = update_next.split('-')
update_next = datetime.date(int(y), int(m), int(d))
else:
update_next = hoy
update_last = serie.update_last
if update_last:
y, m, d = update_last.split('-')
update_last = datetime.date(int(y), int(m), int(d))
else:
update_last = hoy
# if the series is active ...
if overwrite or config.get_setting("updatetvshows_interval", "videolibrary") == 0:
# ... force update regardless of interval
serie_actualizada = update(path, p_dialog, i, t, serie, overwrite)
if not serie_actualizada:
update_next = hoy + datetime.timedelta(days=interval)
elif interval == 1 and update_next <= hoy:
# ...daily update
serie_actualizada = update(path, p_dialog, i, t, serie, overwrite)
if not serie_actualizada and update_last <= hoy - datetime.timedelta(days=7):
# if it hasn't been updated for a week, change the interval to weekly
interval = 7
update_next = hoy + datetime.timedelta(days=interval)
elif interval == 7 and update_next <= hoy:
# ... weekly update
serie_actualizada = update(path, p_dialog, i, t, serie, overwrite)
if not serie_actualizada:
if update_last <= hoy - datetime.timedelta(days=14):
# if it has not been updated for 2 weeks, change the interval to monthly
interval = 30
update_next += datetime.timedelta(days=interval)
elif interval == 30 and update_next <= hoy:
# ... monthly update
serie_actualizada = update(path, p_dialog, i, t, serie, overwrite)
if not serie_actualizada:
update_next += datetime.timedelta(days=interval)
if serie_actualizada:
update_last = hoy
update_next = hoy + datetime.timedelta(days=interval)
head_nfo, serie = videolibrarytools.read_nfo(tvshow_file) # Reread the .nfo, which has been modified
if interval != int(serie.active) or update_next.strftime('%Y-%m-%d') != serie.update_next or update_last.strftime('%Y-%m-%d') != serie.update_last:
serie.update_last = update_last.strftime('%Y-%m-%d')
if update_next > hoy:
serie.update_next = update_next.strftime('%Y-%m-%d')
serie.active = interval
serie.channel = "videolibrary"
serie.action = "get_seasons"
filetools.write(tvshow_file, head_nfo + serie.tojson())
if serie_actualizada:
if config.get_setting("search_new_content", "videolibrary") == 0:
# We update the Kodi video library: Find content in the series folder
if config.is_xbmc() and config.get_setting("videolibrary_kodi"):
from platformcode import xbmc_videolibrary
xbmc_videolibrary.update(folder=filetools.basename(path))
else:
update_when_finished = True
if estado_verify_playcount_series: # If any playcount has been changed, ...
estado = config.set_setting("verify_playcount", True, "videolibrary") # ... we update the Videolibrary option
if config.get_setting("search_new_content", "videolibrary") == 1 and update_when_finished:
# We update the Kodi video library: Find content in all series
if config.is_xbmc() and config.get_setting("videolibrary_kodi"):
from platformcode import xbmc_videolibrary
xbmc_videolibrary.update()
p_dialog.close()
else:
logger.debug("Not update the video library, it is disabled")
except Exception as ex:
logger.error("An error occurred while updating the series")
template = "An exception of type %s occured. Arguments:\n%r"
message = template % (type(ex).__name__, ex.args)
logger.error(message)
if p_dialog:
p_dialog.close()
from core.item import Item
item_dummy = Item()
videolibrary.list_movies(item_dummy, silent=True)
if config.get_setting('trakt_sync'):
from core import trakt_tools
trakt_tools.update_all()
def check_for_update():
if config.get_setting("update", "videolibrary"):
videolibrary.update_videolibrary()
def updaterCheck():

View File

@@ -8,12 +8,13 @@ PY3 = False
if sys.version_info[0] >= 3: PY3 = True; unicode = str; unichr = chr; long = int
import xbmc, os, traceback
from time import time
from core import filetools, scrapertools, videolibrarytools
from core.support import typo, thumb, videolibrary
from core.support import typo, thumb
from core.item import Item
from platformcode import config, launcher, logger, platformtools
from core.videolibrarytools import videolibrarydb
if PY3:
from concurrent import futures
import urllib.parse as urlparse
@@ -21,7 +22,7 @@ else:
from concurrent_py2 import futures
import urlparse
from core.videolibrarytools import videolibrarydb
def mainlist(item):
@@ -31,7 +32,7 @@ def mainlist(item):
category=config.get_localized_string(70270), thumbnail=thumb("videolibrary_movie")),
Item(channel=item.channel, action="list_tvshows",title=config.get_localized_string(60600),
category=config.get_localized_string(70271), thumbnail=thumb("videolibrary_tvshow"),
context=[{"channel":"videolibrary", "action":"update_videolibrary", "title":config.get_localized_string(70269)}]),
context=[{"channel":"videolibrary", "action":"update_videolibrary", "title":config.get_localized_string(70269), 'forced':True}]),
Item(channel='shortcuts', action="SettingOnPosition", title=typo(config.get_localized_string(70287),'bold color kod'),
category=2, setting=1, thumbnail = thumb("setting_0"),folder=False)]
return itemlist
@@ -197,7 +198,7 @@ def list_tvshows(item):
itemlist = sorted(itemlist, key=lambda it: it.title.lower())
itemlist += [Item(channel=item.channel, action="update_videolibrary", thumbnail=item.thumbnail,
fanart=item.thumbnail, landscape=item.thumbnail,
fanart=item.thumbnail, landscape=item.thumbnail, forced=True,
title=typo(config.get_localized_string(70269), 'bold color kod'), folder=False)]
return itemlist
@@ -471,15 +472,21 @@ def findvideos(item):
else:
videolibrary_items[key] = values
with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(servers, ch, value) for ch, value in videolibrary_items.items() if ch not in disabled]
itlist = [executor.submit(servers, item, ch, value) for ch, value in videolibrary_items.items() if ch not in disabled]
for res in futures.as_completed(itlist):
itemlist += res.result()
pl = [s for s in itemlist if s.contentLanguage in [prefered_lang, '']]
if pl: itemlist = pl
if len(itlist) > 1:
for it in itemlist:
it.title = '[{}] {}'.format(it.ch_name, it.title)
if autoplay.play_multi_channel(item, itemlist): # hideserver
return []
@@ -489,12 +496,23 @@ def findvideos(item):
return itemlist
def servers(ch, items):
def servers(item, ch, items):
serverlist = []
from core import channeltools
ch_params = channeltools.get_channel_parameters(ch)
ch_name = ch_params.get('title', '')
def channel_servers(item, it, channel, ch_name):
serverlist = []
it.contentChannel = 'videolibrary'
it = get_host(it, channel)
it.contentTitle = it.fulltitle = item.title
for item in getattr(channel, it.action)(it):
if item.server and item.channel:
item.ch_name = ch_name
serverlist.append(item)
return serverlist
if ch_params.get('active', False):
if os.path.isfile(os.path.join(config.get_runtime_path(), 'channels', ch + ".py")): CHANNELS = 'channels'
@@ -502,19 +520,10 @@ def servers(ch, items):
try: channel = __import__('%s.%s' % (CHANNELS, ch), None, None, ['%s.%s' % (CHANNELS, ch)])
except ImportError: exec("import " + CHANNELS + "." + ch + " as channel")
with futures.ThreadPoolExecutor() as executor:
itlist = [executor.submit(channel_servers, it, channel, ch_name) for it in items]
itlist = [executor.submit(channel_servers, item, it, channel, ch_name) for it in items]
for res in futures.as_completed(itlist):
serverlist += res.result()
return serverlist
def channel_servers(it, channel, ch_name):
serverlist = []
it.contentChannel = 'videolibrary'
it = get_host(it, channel)
for item in getattr(channel, it.action)(it):
if item.server and item.channel:
item.ch_name = ch_name
serverlist.append(item)
return serverlist
@@ -562,101 +571,112 @@ def play(item):
return itemlist
def update_videolibrary(item=''):
logger.debug()
check_for_update(item)
def check_for_update(ITEM = None):
def update_videolibrary(item=None):
logger.debug("Update Series...")
from core import channeltools
import datetime
p_dialog = None
update_when_finished = False
now = datetime.date.today()
try:
if config.get_setting("update", "videolibrary") != 0:
config.set_setting("updatelibrary_last_check", now.strftime('%Y-%m-%d'), "videolibrary")
config.set_setting("updatelibrary_last_check", now.strftime('%Y-%m-%d'), "videolibrary")
heading = config.get_localized_string(60389)
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60037))
p_dialog.update(0, '')
show_list = []
message = config.get_localized_string(60389)
p_dialog = platformtools.dialog_progress_bg(config.get_localized_string(20000), config.get_localized_string(60037))
p_dialog.update(0, '')
show_list = []
if ITEM and ITEM.videolibrary_id:
show = videolibrarydb['tvshow'][ITEM.videolibrary_id]
if item and item.videolibrary_id:
show = videolibrarydb['tvshow'][item.videolibrary_id]
for s in show['channels'].values():
for s in show['channels'].values():
show_list += s
else:
shows = dict(videolibrarydb['tvshow']).values()
else:
shows = dict(videolibrarydb['tvshow']).values()
for show in shows:
if show['item'].active or item.forced:
for s in show['channels'].values():
show_list += s
for show in shows:
if show['item'].active:
for s in show['channels'].values():
show_list += s
t = float(100) / len(show_list)
i = 0
for it in show_list:
i += 1
chname = channeltools.get_channel_parameters(it.channel)['title']
p_dialog.update(int(i * t), message=message % (it.fulltitle, chname))
it = get_host(it)
try: channel = __import__('channels.%s' % it.channel, fromlist=["channels.%s" % it.channel])
except: channel = __import__('specials.%s' % it.channel, fromlist=["specials.%s" % it.channel])
itemlist = getattr(channel, it.action)(it)
videolibrarytools.save_tvshow(it, itemlist, True)
p_dialog.close()
t = float(100) / len(show_list)
i = 0
for item in show_list:
i += 1
p_dialog.update(int(i * t), heading % (item.fulltitle, item.channel) )
item = get_host(item)
try: channel = __import__('channels.%s' % item.channel, fromlist=["channels.%s" % item.channel])
except: channel = __import__('specials.%s' % item.channel, fromlist=["specials.%s" % item.channel])
itemlist = getattr(channel, item.action)(item)
videolibrarytools.save_tvshow(item, itemlist)
p_dialog.close()
except:
p_dialog.close()
logger.error(traceback.format_exc())
videolibrarydb.close()
if ITEM:
if item and item.videolibrary_id:
update_when_finished = set_active_tvshow(show)
else:
for show in shows:
update_when_finished = set_active_tvshow(show)
else :
update_when_finished = set_active_tvshow(list(shows))
if update_when_finished:
platformtools.itemlist_refresh()
# if config.get_setting('trakt_sync'):
# from core import trakt_tools
# trakt_tools.update_all()
def set_active_tvshow(show):
update_when_finished = False
if show['item'].active:
prefered_lang = show['item'].prefered_lang
active = False if show['item'].infoLabels['status'].lower() == 'ended' else True
episodes = videolibrarydb['episode'][show['item'].videolibrary_id]
videolibrarydb.close()
if not active:
total_episodes = show['item'].infoLabels['number_of_episodes']
episodes_list = []
for episode in episodes.values():
for ep in episode['channels'].values():
ep_list = [e for e in ep if e.contentLanguage == prefered_lang]
if ep_list: episodes_list.append(ep_list)
if len(episodes_list) == total_episodes:
a = False
update_when_finished = True
for i in range(len(episodes_list) - 1):
if len(episodes_list[i]) == len(episodes_list[i + 1]):
a = False
update_when_finished = True
else:
a = True
break
if not a:
show['item'].active = a
videolibrarydb['tvshow'][show['item'].videolibrary_id] = show
videolibrarydb.close()
def set_active_tvshow(value):
update_when_finished = False
def sub_thread(show, update_when_finished):
ret = None
if show['item'].active:
prefered_lang = show['item'].prefered_lang
active = False if show['item'].infoLabels['status'].lower() == 'ended' else True
episodes = videolibrarydb['episode'][show['item'].videolibrary_id]
if not active:
total_episodes = show['item'].infoLabels['number_of_episodes']
episodes_list = []
for episode in episodes.values():
for ep in episode['channels'].values():
ep_list = [e for e in ep if e.contentLanguage == prefered_lang]
if ep_list: episodes_list.append(ep_list)
if len(episodes_list) == total_episodes:
a = False
update_when_finished = True
for i in range(len(episodes_list) - 1):
if len(episodes_list[i]) == len(episodes_list[i + 1]):
a = False
update_when_finished = True
else:
a = True
break
if not a:
show['item'].active = a
ret = show
return show, ret, update_when_finished
if type(value) == list:
with futures.ThreadPoolExecutor() as executor:
_list = [executor.submit(sub_thread, s, update_when_finished) for s in value]
for res in futures.as_completed(_list):
if res.result() and res.result()[1]:
videolibrarydb['tvshow'][res.result()[0]['item'].videolibrary_id] = res.result()[1]
if res.result()[2]:
update_when_finished = True
else:
show, ret, update_when_finished = sub_thread(value, update_when_finished)
if ret:
videolibrarydb['tvshow'][show['item'].videolibrary_id] = ret
return update_when_finished
@@ -948,7 +968,7 @@ def delete(item):
if config.is_xbmc() and config.get_setting("videolibrary_kodi"):
from platformcode import xbmc_videolibrary
xbmc_videolibrary.clean_by_id(item)
platformtools.itemlist_refresh()
platformtools.itemlist_refresh(-1)
if select and select > 0:
channel_name = channels[select - 1]
@@ -960,7 +980,7 @@ def delete(item):
seasons_dict = dict(seasons)
for key, episode in episodes_dict.items():
if len(episode['channels']) > 1:
if len(episode['channels']) > 1 and channel_name in episode['channels']:
del episode['channels'][channel_name]
elif channel_name in episode['channels']:
xbmc_videolibrary.clean_by_id(episodes[key]['item'])