diff options
author | shaun <shaun@bluebit.com.au> | 2018-01-25 08:19:32 +1100 |
---|---|---|
committer | Martijn Kaijser <martijn@xbmc.org> | 2018-01-31 20:19:15 +0100 |
commit | 091ca6e9975d8325e2fb46610e2761391f9a3998 (patch) | |
tree | 24102c5f0a2c83cccfa2db8b0fd8a37e6a3ee563 /plugin.video.embycon/resources/lib/trakttokodi.py | |
parent | df562079c5d2ca5f0c5db8b66cbb78c5d8527e30 (diff) |
[plugin.video.embycon] 1.4.39
Diffstat (limited to 'plugin.video.embycon/resources/lib/trakttokodi.py')
-rw-r--r-- | plugin.video.embycon/resources/lib/trakttokodi.py | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/plugin.video.embycon/resources/lib/trakttokodi.py b/plugin.video.embycon/resources/lib/trakttokodi.py new file mode 100644 index 0000000..3e27740 --- /dev/null +++ b/plugin.video.embycon/resources/lib/trakttokodi.py @@ -0,0 +1,248 @@ +# Gnu General Public License - see LICENSE.TXT + +import urllib +import encodings + +import xbmc +import xbmcgui + +from simple_logging import SimpleLogging +from datamanager import DataManager + +from translation import i18n + +log = SimpleLogging(__name__) +dataManager = DataManager() + +details_string = 'EpisodeCount,SeasonCount,Path,Etag,MediaStreams' +icon = xbmc.translatePath('special://home/addons/plugin.video.embycon/icon.png') + + +def not_found(content_string): + xbmcgui.Dialog().notification('EmbyCon', i18n('not_found_') % content_string, icon=icon, sound=False) + + +def playback_starting(content_string): + xbmcgui.Dialog().notification('EmbyCon', i18n('playback_starting_') % content_string, icon=icon, sound=False) + + +def search(item_type, query): + content_url = ('{server}/emby/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.GetContent(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}/emby/Shows/' + item_id + + '/Seasons' + '?userId={userid}' + + '&Fields=' + details_string + + '&format=json') + + elif video_type == 'movie' or video_type == 'episode': + content_url = ('{server}/emby/Users/{userid}/items' + + '?ParentId=' + parent_id + + '&IsVirtualUnAired=false' + + '&IsMissing=false' + + '&Fields=' + details_string + + '&format=json') + + if content_url: + result = dataManager.GetContent(content_url) + + return result + + +def get_item(item_id): + result = dataManager.GetContent('{server}/emby/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 = urllib.quote(title) + + results = search(item_type, query=query) + results = results.get('SearchHints') + if results is None: + results = [] + log.debug('SearchHints jsonData: {0}', 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}', 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}', 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 = urllib.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.embycon/?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}/emby/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}/emby/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.embycon/?mode=GET_CONTENT&url={url}&media_type={media_type})'.format(url=urllib.quote(url), media_type=media_type)) |