270 lines
10 KiB
Python
270 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import re
|
|
import string
|
|
import urllib
|
|
from unicodedata import normalize
|
|
|
|
import xbmc
|
|
import xbmcgui
|
|
|
|
from platformcode import config, logger
|
|
|
|
allchars = string.maketrans('', '')
|
|
deletechars = ',\\/:*"<>|?'
|
|
|
|
|
|
# Extraemos el nombre de la serie, temporada y numero de capitulo ejemplo: 'fringe 1x01'
|
|
def regex_tvshow(compare, file, sub=""):
|
|
regex_expressions = ['[Ss]([0-9]+)[][._-]*[Ee]([0-9]+)([^\\\\/]*)$',
|
|
'[\._ \-]([0-9]+)x([0-9]+)([^\\/]*)', # foo.1x09
|
|
'[\._ \-]([0-9]+)([0-9][0-9])([\._ \-][^\\/]*)', # foo.109
|
|
'([0-9]+)([0-9][0-9])([\._ \-][^\\/]*)',
|
|
'[\\\\/\\._ -]([0-9]+)([0-9][0-9])[^\\/]*',
|
|
'Season ([0-9]+) - Episode ([0-9]+)[^\\/]*',
|
|
'Season ([0-9]+) Episode ([0-9]+)[^\\/]*',
|
|
'[\\\\/\\._ -][0]*([0-9]+)x[0]*([0-9]+)[^\\/]*',
|
|
'[[Ss]([0-9]+)\]_\[[Ee]([0-9]+)([^\\/]*)', # foo_[s01]_[e01]
|
|
'[\._ \-][Ss]([0-9]+)[\.\-]?[Ee]([0-9]+)([^\\/]*)', # foo, s01e01, foo.s01.e01, foo.s01-e01
|
|
's([0-9]+)ep([0-9]+)[^\\/]*', # foo - s01ep03, foo - s1ep03
|
|
'[Ss]([0-9]+)[][ ._-]*[Ee]([0-9]+)([^\\\\/]*)$',
|
|
'[\\\\/\\._ \\[\\(-]([0-9]+)x([0-9]+)([^\\\\/]*)$',
|
|
'[\\\\/\\._ \\[\\(-]([0-9]+)X([0-9]+)([^\\\\/]*)$'
|
|
]
|
|
sub_info = ""
|
|
tvshow = 0
|
|
|
|
for regex in regex_expressions:
|
|
response_file = re.findall(regex, file)
|
|
if len(response_file) > 0:
|
|
print "Regex File Se: %s, Ep: %s," % (str(response_file[0][0]), str(response_file[0][1]),)
|
|
tvshow = 1
|
|
if not compare:
|
|
title = re.split(regex, file)[0]
|
|
for char in ['[', ']', '_', '(', ')', '.', '-']:
|
|
title = title.replace(char, ' ')
|
|
if title.endswith(" "): title = title.strip()
|
|
print "title: %s" % title
|
|
return title, response_file[0][0], response_file[0][1]
|
|
else:
|
|
break
|
|
|
|
if (tvshow == 1):
|
|
for regex in regex_expressions:
|
|
response_sub = re.findall(regex, sub)
|
|
if len(response_sub) > 0:
|
|
try:
|
|
sub_info = "Regex Subtitle Ep: %s," % (str(response_sub[0][1]),)
|
|
if (int(response_sub[0][1]) == int(response_file[0][1])):
|
|
return True
|
|
except:
|
|
pass
|
|
return False
|
|
if compare:
|
|
return True
|
|
else:
|
|
return "", "", ""
|
|
|
|
# Obtiene el nombre de la pelicula o capitulo de la serie guardado previamente en configuraciones del plugin
|
|
# y luego lo busca en el directorio de subtitulos, si los encuentra los activa.
|
|
|
|
|
|
def set_Subtitle():
|
|
logger.info()
|
|
|
|
exts = [".srt", ".sub", ".txt", ".smi", ".ssa", ".ass"]
|
|
subtitle_folder_path = os.path.join(config.get_data_path(), "subtitles")
|
|
|
|
subtitle_type = config.get_setting("subtitle_type")
|
|
|
|
if subtitle_type == "2":
|
|
subtitle_path = config.get_setting("subtitlepath_file")
|
|
logger.info("Con subtitulo : " + subtitle_path)
|
|
xbmc.Player().setSubtitles(subtitle_path)
|
|
else:
|
|
if subtitle_type == "0":
|
|
subtitle_path = config.get_setting("subtitlepath_folder")
|
|
if subtitle_path == "":
|
|
subtitle_path = subtitle_folder_path
|
|
config.set_setting("subtitlepath_folder", subtitle_path)
|
|
else:
|
|
subtitle_path = config.get_setting("subtitlepath_keyboard")
|
|
long = len(subtitle_path)
|
|
if long > 0:
|
|
if subtitle_path.startswith("http") or subtitle_path[long - 4, long] in exts:
|
|
logger.info("Con subtitulo : " + subtitle_path)
|
|
xbmc.Player().setSubtitles(subtitle_path)
|
|
return
|
|
else:
|
|
subtitle_path = subtitle_folder_path
|
|
config.set_setting("subtitlepath_keyboard", subtitle_path)
|
|
|
|
import glob
|
|
|
|
subtitle_name = config.get_setting("subtitle_name").replace("amp;", "")
|
|
tvshow_title, season, episode = regex_tvshow(False, subtitle_name)
|
|
try:
|
|
if episode != "":
|
|
Subnames = glob.glob(os.path.join(subtitle_path, "Tvshows", tvshow_title,
|
|
"%s %sx%s" % (tvshow_title, season, episode) + "*.??.???"))
|
|
else:
|
|
Subnames = glob.glob(os.path.join(subtitle_path, "Movies", subtitle_name + "*.??.???"))
|
|
for Subname in Subnames:
|
|
if os.path.splitext(Subname)[1] in exts:
|
|
logger.info("Con subtitulo : " + os.path.split(Subname)[1])
|
|
xbmc.Player().setSubtitles((Subname))
|
|
except:
|
|
logger.error("error al cargar subtitulos")
|
|
|
|
# Limpia los caracteres unicode
|
|
|
|
|
|
def _normalize(title, charset='utf-8'):
|
|
'''Removes all accents and illegal chars for titles from the String'''
|
|
if isinstance(title, unicode):
|
|
title = string.translate(title, allchars, deletechars)
|
|
try:
|
|
title = title.encode("utf-8")
|
|
title = normalize('NFKD', title).encode('ASCII', 'ignore')
|
|
except UnicodeEncodeError:
|
|
logger.error("Error de encoding")
|
|
else:
|
|
title = string.translate(title, allchars, deletechars)
|
|
try:
|
|
# iso-8859-1
|
|
title = title.decode(charset).encode('utf-8')
|
|
title = normalize('NFKD', unicode(title, 'utf-8'))
|
|
title = title.encode('ASCII', 'ignore')
|
|
except UnicodeEncodeError:
|
|
logger.error("Error de encoding")
|
|
return title
|
|
|
|
#
|
|
|
|
|
|
def searchSubtitle(item):
|
|
if config.get_setting("subtitle_type") == 0:
|
|
subtitlepath = config.get_setting("subtitlepath_folder")
|
|
if subtitlepath == "":
|
|
subtitlepath = os.path.join(config.get_data_path(), "subtitles")
|
|
config.set_setting("subtitlepath_folder", subtitlepath)
|
|
|
|
elif config.get_setting("subtitle_type") == 1:
|
|
subtitlepath = config.get_setting("subtitlepath_keyboard")
|
|
if subtitlepath == "":
|
|
subtitlepath = os.path.join(config.get_data_path(), "subtitles")
|
|
config.set_setting("subtitlepathkeyboard", subtitlepath)
|
|
elif subtitlepath.startswith("http"):
|
|
subtitlepath = config.get_setting("subtitlepath_folder")
|
|
|
|
else:
|
|
subtitlepath = config.get_setting("subtitlepath_folder")
|
|
if subtitlepath == "":
|
|
subtitlepath = os.path.join(config.get_data_path(), "subtitles")
|
|
config.set_setting("subtitlepath_folder", subtitlepath)
|
|
if not os.path.exists(subtitlepath):
|
|
try:
|
|
os.mkdir(subtitlepath)
|
|
except:
|
|
logger.error("error no se pudo crear path subtitulos")
|
|
return
|
|
|
|
path_movie_subt = xbmc.translatePath(os.path.join(subtitlepath, "Movies"))
|
|
if not os.path.exists(path_movie_subt):
|
|
try:
|
|
os.mkdir(path_movie_subt)
|
|
except:
|
|
logger.error("error no se pudo crear el path Movies")
|
|
return
|
|
full_path_tvshow = ""
|
|
path_tvshow_subt = xbmc.translatePath(os.path.join(subtitlepath, "Tvshows"))
|
|
if not os.path.exists(path_tvshow_subt):
|
|
try:
|
|
os.mkdir(path_tvshow_subt)
|
|
except:
|
|
logger.error("error no pudo crear el path Tvshows")
|
|
return
|
|
if item.show in item.title:
|
|
title_new = title = urllib.unquote_plus(item.title)
|
|
else:
|
|
title_new = title = urllib.unquote_plus(item.show + " - " + item.title)
|
|
path_video_temp = xbmc.translatePath(os.path.join(config.get_runtime_path(), "resources", "subtitle.mp4"))
|
|
if not os.path.exists(path_video_temp):
|
|
logger.error("error : no existe el video temporal de subtitulos")
|
|
return
|
|
# path_video_temp = xbmc.translatePath(os.path.join( ,video_temp + ".mp4" ))
|
|
|
|
title_new = _normalize(title_new)
|
|
tvshow_title, season, episode = regex_tvshow(False, title_new)
|
|
if episode != "":
|
|
full_path_tvshow = xbmc.translatePath(os.path.join(path_tvshow_subt, tvshow_title))
|
|
if not os.path.exists(full_path_tvshow):
|
|
os.mkdir(full_path_tvshow) # title_new + ".mp4"
|
|
full_path_video_new = xbmc.translatePath(
|
|
os.path.join(full_path_tvshow, "%s %sx%s.mp4" % (tvshow_title, season, episode)))
|
|
logger.info(full_path_video_new)
|
|
listitem = xbmcgui.ListItem(title_new, iconImage="DefaultVideo.png", thumbnailImage="")
|
|
listitem.setInfo("video",
|
|
{"Title": title_new, "Genre": "Tv shows", "episode": int(episode), "season": int(season),
|
|
"tvshowtitle": tvshow_title})
|
|
|
|
else:
|
|
full_path_video_new = xbmc.translatePath(os.path.join(path_movie_subt, title_new + ".mp4"))
|
|
listitem = xbmcgui.ListItem(title, iconImage="DefaultVideo.png", thumbnailImage="")
|
|
listitem.setInfo("video", {"Title": title_new, "Genre": "Movies"})
|
|
|
|
import shutil, time
|
|
|
|
try:
|
|
shutil.copy(path_video_temp, full_path_video_new)
|
|
copy = True
|
|
logger.info("nuevo path =" + full_path_video_new)
|
|
time.sleep(2)
|
|
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
|
|
playlist.clear()
|
|
playlist.add(full_path_video_new, listitem)
|
|
# xbmcPlayer = xbmc.Player( xbmc.PLAYER_CORE_AUTO )
|
|
xbmcPlayer = xbmc.Player()
|
|
xbmcPlayer.play(playlist)
|
|
|
|
# xbmctools.launchplayer(full_path_video_new,listitem)
|
|
except:
|
|
copy = False
|
|
logger.error("Error : no se pudo copiar")
|
|
|
|
time.sleep(1)
|
|
|
|
if copy:
|
|
if xbmc.Player().isPlayingVideo():
|
|
xbmc.executebuiltin("RunScript(script.xbmc.subtitles)")
|
|
while xbmc.Player().isPlayingVideo():
|
|
continue
|
|
|
|
time.sleep(1)
|
|
os.remove(full_path_video_new)
|
|
try:
|
|
if full_path_tvshow != "":
|
|
os.rmdir(full_path_tvshow)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
def saveSubtitleName(item):
|
|
if not item.show or item.show in item.title:
|
|
title = item.title
|
|
else:
|
|
title = item.show + " - " + item.title
|
|
try:
|
|
title = _normalize(title)
|
|
except:
|
|
pass
|
|
|
|
tvshow_title, season, episode = regex_tvshow(False, title)
|
|
if episode != "":
|
|
# title = "% %sx%s" %(tvshow_title,season,episode)
|
|
config.set_setting("subtitle_name", title)
|
|
else:
|
|
config.set_setting("subtitle_name", title)
|
|
return
|