Files
jellycon/resources/lib/trakttokodi.py
2021-01-26 22:34:51 -05:00

250 lines
7.8 KiB
Python

# Gnu General Public License - see LICENSE.TXT
from __future__ import division, absolute_import, print_function, unicode_literals
from six.moves.urllib.parse import quote, unquote
import encodings
import xbmc
import xbmcgui
from .loghandler import LazyLogger
from .datamanager import DataManager
from .translation import string_load
log = LazyLogger(__name__)
dataManager = DataManager()
details_string = 'EpisodeCount,SeasonCount,Path,Etag,MediaStreams'
icon = xbmc.translatePath('special://home/addons/plugin.video.jellycon/icon.png')
def not_found(content_string):
xbmcgui.Dialog().notification('JellyCon', '{}: {}'.format(string_load(30305), content_string), icon=icon, sound=False)
def playback_starting(content_string):
xbmcgui.Dialog().notification('JellyCon', '{}: {}'.format(string_load(30306), content_string), icon=icon, sound=False)
def search(item_type, query):
content_url = ('{server}/Search/Hints?searchTerm=' + query +
'&IncludeItemTypes=' + item_type +
'&UserId={userid}'
'&StartIndex=0' +
'&Limit=25' +
'&IncludePeople=false&IncludeMedia=true&IncludeGenres=false&IncludeStudios=false&IncludeArtists=false')
result = dataManager.get_content(content_url)
return result
def get_items(video_type, item_id=None, parent_id=None):
content_url = None
result = dict()
if video_type == 'season':
content_url = ('{server}/Shows/' + item_id +
'/Seasons'
'?userId={userid}' +
'&Fields=' + details_string +
'&format=json')
elif video_type == 'movie' or video_type == 'episode':
content_url = ('{server}/Users/{userid}/items' +
'?ParentId=' + parent_id +
'&IsVirtualUnAired=false' +
'&IsMissing=false' +
'&Fields=' + details_string +
'&format=json')
if content_url:
result = dataManager.get_content(content_url)
return result
def get_item(item_id):
result = dataManager.get_content('{server}/Users/{userid}/Items/' + item_id + '?Fields=ProviderIds&format=json')
return result
def get_imdb_id(item_id):
item = get_item(item_id)
imdb = item.get('ProviderIds', {}).get('Imdb')
return imdb
def get_season_id(parent_id, season):
season_items = get_items('season', parent_id)
season_items = season_items.get('Items')
if season_items is None:
season_items = []
for season_item in season_items:
if season_item.get('IndexNumber') == int(season):
season_id = season_item.get('Id')
return season_id
return None
def get_episode_id(parent_id, episode):
episode_items = get_items('episode', parent_id=parent_id)
episode_items = episode_items.get('Items')
if episode_items is None:
episode_items = []
for episode_item in episode_items:
if episode_item.get('IndexNumber') == int(episode):
episode_id = episode_item.get('Id')
return episode_id
return None
def get_match(item_type, title, year, imdb_id):
query = quote(title)
results = search(item_type, query=query)
results = results.get('SearchHints')
if results is None:
results = []
log.debug('SearchHints jsonData: {0}'.format(results))
potential_matches = []
for item in results:
name = item.get('Name')
production_year = item.get('ProductionYear')
if (name == title and int(year) == production_year) or (int(year) == production_year):
potential_matches.append(item)
log.debug('Potential matches: {0}'.format(potential_matches))
for item in potential_matches:
item_imdb_id = get_imdb_id(item.get('ItemId'))
if item_imdb_id == imdb_id:
log.debug('Found match: {0}'.format(item))
return item
return None
def entry_point(parameters):
item_type = None
action = parameters.get('action', None)
video_type = parameters.get('video_type', None)
title = unquote(parameters.get('title', ''))
year = parameters.get('year', '')
episode = parameters.get('episode', '')
season = parameters.get('season', '')
imdb_id = parameters.get('imdb_id', '')
if video_type == 'show' or video_type == 'season' or video_type == 'episode':
item_type = 'Series'
elif video_type == 'movie':
item_type = 'Movie'
if not item_type:
return
match = get_match(item_type, title, year, imdb_id)
if not match:
title_search_word = ''
title_words = title.split(' ')
for word in title_words:
if len(word) > len(title_search_word):
title_search_word = word
title_search_word = title_search_word.replace(':', '')
if title_search_word:
match = get_match(item_type, title_search_word, year, imdb_id)
str_season = str(season)
if len(str_season) == 1:
str_season = '0' + str_season
str_episode = str(episode)
if len(str_episode) == 1:
str_episode = '0' + str_episode
if action == 'play':
play_item_id = None
if video_type == 'movie':
if match:
play_item_id = match.get('ItemId')
if not play_item_id:
not_found('{title} ({year})'.format(title=title, year=year))
elif video_type == 'episode':
if not season or not episode:
return
if match:
item_id = match.get('ItemId')
season_id = get_season_id(item_id, season)
if season_id:
episode_id = get_episode_id(season_id, episode)
if episode_id:
play_item_id = episode_id
if not play_item_id:
not_found('{title} ({year}) - S{season}E{episode}'.format(title=title, year=year, season=str_season, episode=str_episode))
if play_item_id:
if video_type == 'episode':
playback_starting('{title} ({year}) - S{season}E{episode}'.format(title=title, year=year, season=str_season, episode=str_episode))
else:
playback_starting('{title} ({year})'.format(title=title, year=year))
xbmc.executebuiltin('RunPlugin(plugin://plugin.video.jellycon/?mode=PLAY&item_id={item_id})'.format(item_id=play_item_id))
elif action == 'open':
url = media_type = None
if video_type == 'show':
if match:
item_id = match.get('ItemId')
media_type = 'series'
url = ('{server}/Shows/' + item_id +
'/Seasons'
'?userId={userid}' +
'&Fields=' + details_string +
'&format=json')
if not url:
not_found('{title} ({year})'.format(title=title, year=year))
elif video_type == 'season':
if not season:
return
if match:
item_id = match.get('ItemId')
season_id = get_season_id(item_id, season)
if season_id:
media_type = 'episodes'
url = ('{server}/Users/{userid}/items' +
'?ParentId=' + season_id +
'&IsVirtualUnAired=false' +
'&IsMissing=false' +
'&Fields=' + details_string +
'&format=json')
if not url:
not_found('{title} ({year}) - S{season}'.format(title=title, year=year, season=str_season))
if url and media_type:
xbmc.executebuiltin('ActivateWindow(Videos, plugin://plugin.video.jellycon/?mode=GET_CONTENT&url={url}&media_type={media_type})'.format(url=quote(url), media_type=media_type))