Files
DevOps/Kodi/Lenovo/addons/metadata.tvshows.thetvdb.com.v4.python/resources/lib/nfo.py

87 lines
2.8 KiB
Python

import re
from collections import namedtuple
import xbmcgui
import xbmcplugin
from .simple_requests import HTTPError
from .tvdb import Request
from .utils import logger
SHOW_ID_FROM_EPISODE_GUIDE_REGEXPS = (
r'(thetvdb)\.com[\w=&\?/{}\":,]+\"id\":(\d+)',
r'(thetvdb)\.com/.*?series/(\d+)',
r'(thetvdb)\.com[\w=&\?/]*[&\?]+id=(\d+)',
)
SHOW_ID_REGEXPS = (
r'<uniqueid type=\"(tvdb)\".*>(\d+)</uniqueid>',
r'(thetvdb)\.com/.*?series/([\w\s\d()-]+)',
r'(thetvdb)\.com[\w=&\?/]*[&\?]+id=(\d+)',
)
SERIES_URL_REGEX = re.compile(r'https?://[w.]*?thetvdb.com/series/([\w-]+)', re.I)
TVDB_ID_REGEX = re.compile(r'<strong>TheTVDB\.com Series ID</strong>\s+?<span>(\d+?)</span>', re.I)
UrlParseResult = namedtuple('UrlParseResult', ['provider', 'show_id'])
def get_show_id_from_nfo(nfo, settings, plugin_handle):
"""
Get show info by NFO file contents
This function is called first instead of find_show
if a NFO file is found in a TV show folder
:param nfo: the contents of a NFO file
"""
logger.debug(f'Parsing NFO file:\n{nfo}')
if '<episodedetails>' in nfo:
return # skip episode NFOs
parse_result = _parse_nfo_url(nfo)
if parse_result is not None:
if parse_result.provider in ('tvdb', 'thetvdb'):
list_item = xbmcgui.ListItem(offscreen=True)
list_item.setUniqueIDs({'tvdb': parse_result.show_id}, 'tvdb')
xbmcplugin.addDirectoryItem(
handle=plugin_handle,
url=parse_result.show_id,
listitem=list_item,
isFolder=True
)
def parse_episode_guide_url(episode_guide):
"""Extract show ID from episode guide string"""
for regexp in SHOW_ID_FROM_EPISODE_GUIDE_REGEXPS:
show_id_match = re.search(regexp, episode_guide, re.I)
if show_id_match:
return UrlParseResult(show_id_match.group(1), show_id_match.group(2))
return None
def _parse_nfo_url(nfo):
"""Extract show ID from NFO file contents"""
series_url_match = SERIES_URL_REGEX.search(nfo)
if series_url_match is not None:
result = _get_tvdb_id_from_slug(series_url_match.group(0))
if result is not None:
return result
for regexp in SHOW_ID_REGEXPS:
show_id_match = re.search(regexp, nfo, re.I)
if show_id_match:
return UrlParseResult(show_id_match.group(1), show_id_match.group(2))
return None
def _get_tvdb_id_from_slug(series_url):
try:
html = Request.make_web_request(series_url)
except HTTPError as exc:
logger.error(f'Error {exc.response.status_code} for URL {series_url}')
return None
match = TVDB_ID_REGEX.search(html)
if match is not None:
return UrlParseResult('thetvdb', match.group(1))
return None