summaryrefslogtreecommitdiff
path: root/plugin.video.viaplay/addon.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin.video.viaplay/addon.py')
-rw-r--r--plugin.video.viaplay/addon.py943
1 files changed, 382 insertions, 561 deletions
diff --git a/plugin.video.viaplay/addon.py b/plugin.video.viaplay/addon.py
index a2a0a98..8d881b6 100644
--- a/plugin.video.viaplay/addon.py
+++ b/plugin.video.viaplay/addon.py
@@ -3,601 +3,415 @@
A Kodi add-on for Viaplay
"""
import sys
-import os
-import urllib
import urlparse
from datetime import datetime
-from resources.lib.vialib import vialib
-
-import xbmc
-import xbmcaddon
-import xbmcvfs
-import xbmcgui
-import xbmcplugin
-
-addon = xbmcaddon.Addon()
-addon_path = xbmc.translatePath(addon.getAddonInfo('path'))
-addon_profile = xbmc.translatePath(addon.getAddonInfo('profile'))
-language = addon.getLocalizedString
-logging_prefix = '[%s-%s]' % (addon.getAddonInfo('id'), addon.getAddonInfo('version'))
-
-if not xbmcvfs.exists(addon_profile):
- xbmcvfs.mkdir(addon_profile)
-
-_url = sys.argv[0] # get the plugin url in plugin:// notation
-_handle = int(sys.argv[1]) # get the plugin handle as an integer number
-
-username = addon.getSetting('email')
-password = addon.getSetting('password')
-
-if addon.getSetting('country') == '0':
- country = 'se'
-elif addon.getSetting('country') == '1':
- country = 'dk'
-elif addon.getSetting('country') == '2':
- country = 'no'
-else:
- country = 'fi'
-
-vp = vialib(username, password, addon_profile, country, debug=True)
-
-
-def addon_log(string):
- msg = '%s: %s' % (logging_prefix, string)
- xbmc.log(msg=msg, level=xbmc.LOGDEBUG)
-
-
-def main_menu():
- items = []
- data = vp.make_request(url=vp.base_url, method='get')
- categories = vp.get_categories(input=data, method='data')
-
- for category in categories:
- category_name = category['name']
- title = category['title']
- if category['type'] != 'editorial':
- if category_name == 'sport':
- parameters = {
- 'action': 'sports_menu',
- 'url': category['href']
- }
- else:
- parameters = {
- 'action': 'list_categories',
- 'url': category['href'],
- 'category_name': category_name
- }
-
- items = add_item(title, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- list_search(data)
- xbmcplugin.endOfDirectory(_handle)
-
-
-def list_categories(url, category_name):
- items = []
- categories = vp.get_categories(url)
-
- for category in categories:
- if category_name == 'kids':
- title = '%s: %s' % (category['group']['title'].title(), category['title'])
+from resources.lib.kodihelper import KodiHelper
+
+base_url = sys.argv[0]
+handle = int(sys.argv[1])
+helper = KodiHelper(base_url, handle)
+
+
+def run():
+ try:
+ router(sys.argv[2][1:]) # trim the leading '?' from the plugin call paramstring
+ except helper.vp.ViaplayError as error:
+ if error.value == 'MissingSessionCookieError':
+ if helper.authorize():
+ router(sys.argv[2][1:])
else:
- title = category['title']
+ show_error(error.value)
- parameters = {
- 'action': 'list_sortings',
- 'url': category['href']
- }
- items = add_item(title, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
-
-
-def list_sortings(url):
- items = []
- sortings = vp.get_sortings(url)
- if sortings:
- for sorting in sortings:
- title = sorting['title']
- sorting_url = sorting['href']
- try:
- if sorting['id'] == 'alphabetical':
- parameters = {
- 'action': 'list_alphabetical_letters',
- 'url': sorting_url
- }
- else:
- parameters = {
- 'action': 'list_products',
- 'url': sorting_url
- }
- except TypeError:
- parameters = {
- 'action': 'list_products',
- 'url': sorting_url
- }
-
- items = add_item(title, parameters, items=items)
- list_products_alphabetical(url)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
-
-
-def list_products_alphabetical(url):
- """List all products in alphabetical order."""
- title = language(30013)
- parameters = {
- 'action': 'list_products',
- 'url': url + '?sort=alphabetical'
- }
- add_item(title, parameters)
+def root_page():
+ pages = helper.vp.get_root_page()
+ for page in pages:
+ params = {
+ 'action': page['name'],
+ 'url': page['href']
+ }
+ helper.add_item(page['title'], params)
+ helper.eod()
-def list_alphabetical_letters(url):
- items = []
- letters = vp.get_letters(url)
- for letter in letters:
- if letter == '0-9':
- query = '#' # 0-9 needs to be sent as a number sign
- else:
- query = letter.lower()
+def start_page(url):
+ collections = helper.vp.get_collections(url)
- parameters = {
+ for i in collections:
+ params = {
'action': 'list_products',
- 'url': url + '&letter=' + urllib.quote(query)
+ 'url': i['_links']['self']['href']
}
+ helper.add_item(i['title'], params)
+ helper.eod()
- items = add_item(letter, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
+def vod_page(url):
+ """List categories and collections from the VOD pages (movies, series, kids, store)."""
+ collections = helper.vp.get_collections(url)
-def list_next_page(data):
- if vp.get_next_page(data):
- title = language(30018)
- parameters = {
+ categories_item(url)
+ for i in collections:
+ params = {
'action': 'list_products',
- 'url': vp.get_next_page(data)
+ 'url': i['_links']['self']['href']
}
+ helper.add_item(i['title'], params)
+ helper.eod()
- add_item(title, parameters)
+def categories_page(url):
+ categories = helper.vp.make_request(url, 'get')['_links']['viaplay:categoryFilters']
-def list_products(url, filter_event=False):
- items = []
- data = vp.make_request(url=url, method='get')
- if filter_event:
- filter_event = filter_event.split(', ')
+ for i in categories:
+ params = {
+ 'action': 'sortings_page',
+ 'url': i['href']
+ }
+ helper.add_item(i['title'], params)
+ helper.eod()
- products = vp.get_products(input=data, method='data', filter_event=filter_event)
-
- for product in products:
- content = product['type']
- try:
- playid = product['system']['guid']
- streamtype = 'guid'
- except KeyError:
- """The guid is not always available from the category listing.
- Send the self URL and let play_video grab the guid from there instead
- as it always provides more detailed data about each product."""
- playid = product['_links']['self']['href']
- streamtype = 'url'
-
- parameters = {
- 'action': 'play_video',
- 'playid': playid.encode('utf-8'),
- 'streamtype': streamtype,
- 'content': content
+
+def sortings_page(url):
+ sortings = helper.vp.make_request(url, 'get')['_links']['viaplay:sortings']
+
+ for i in sortings:
+ params = {
+ 'action': 'list_products',
+ 'url': i['href']
}
+ helper.add_item(i['title'], params)
+ helper.eod()
- if content == 'episode':
- title = product['content']['series']['episodeTitle']
- playable = True
- watched = True
- set_content = 'episodes'
-
- elif content == 'sport':
- now = datetime.now()
- date_today = now.date()
- product_name = unicode(product['content']['title'])
-
- if date_today == product['event_date'].date():
- start_time = '%s %s' % (language(30027), product['event_date'].strftime('%H:%M'))
- else:
- start_time = product['event_date'].strftime('%Y-%m-%d %H:%M')
-
- title = '[B]%s:[/B] %s' % (coloring(start_time, product['event_status']), product_name)
-
- if product['event_status'] == 'upcoming':
- parameters = {
- 'action': 'dialog',
- 'dialog_type': 'ok',
- 'heading': language(30017),
- 'message': '%s [B]%s[/B].' % (language(30016), start_time)
- }
- playable = False
- else:
- playable = True
-
- watched = False
- set_content = 'movies'
-
- elif content == 'movie':
- movie_name = product['content']['title'].encode('utf-8')
- movie_year = str(product['content']['production']['year'])
- title = '%s (%s)' % (movie_name, movie_year)
-
- if product['system']['availability']['planInfo']['isRental']:
- title = title + ' *' # mark rental products with an asterisk
-
- playable = True
- watched = True
- set_content = 'movies'
-
- elif content == 'series':
- title = product['content']['series']['title'].encode('utf-8')
- season_url = product['_links']['viaplay:page']['href']
- parameters = {
- 'action': 'list_seasons',
- 'url': season_url
+
+def sports_page(url):
+ collections = helper.vp.get_collections(url)
+ schedule_added = False
+
+ for i in collections:
+ if 'viaplay:seeTableau' in i['_links'] and not schedule_added:
+ params = {
+ 'action': 'sports_schedule_page',
+ 'url': i['_links']['viaplay:seeTableau']['href']
}
- playable = False
- watched = True
- set_content = 'tvshows'
+ helper.add_item(i['_links']['viaplay:seeTableau']['title'], params)
+ schedule_added = True
- items = add_item(title, parameters, items=items, playable=playable, watched=watched, set_content=set_content,
- set_info=return_info(product, content), set_art=return_art(product, content))
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- list_next_page(data)
- xbmcplugin.endOfDirectory(_handle)
+ if i['totalProductCount'] < 1:
+ continue # hide empty collections
+ params = {
+ 'action': 'list_products',
+ 'url': i['_links']['self']['href']
+ }
+ helper.add_item(i['title'], params)
+ helper.eod()
-def list_seasons(url):
- """List all series seasons."""
- seasons = vp.get_seasons(url)
- if len(seasons) == 1:
- # list products if there's only one season
- season_url = seasons[0]['_links']['self']['href']
- list_products(season_url)
- else:
- items = []
- for season in seasons:
- season_url = season['_links']['self']['href']
- title = '%s %s' % (language(30014), season['title'])
- parameters = {
- 'action': 'list_products',
- 'url': season_url
- }
+def sports_schedule_page(url):
+ dates = helper.vp.make_request(url=url, method='get')['_links']['viaplay:days']
- items = add_item(title, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
-
-
-def return_info(product, content):
- """Return the product information in a xbmcgui.setInfo friendly dict.
- Supported content types: episode, series, movie, sport"""
- cast = []
- mediatype = None
- title = None
- tvshowtitle = None
- season = None
- episode = None
- plot = None
- director = None
- try:
- duration = int(product['content']['duration']['milliseconds']) / 1000
- except KeyError:
- duration = None
- try:
- imdb_code = product['content']['imdb']['id']
- except KeyError:
- imdb_code = None
- try:
- rating = float(product['content']['imdb']['rating'])
- except KeyError:
- rating = None
- try:
- votes = str(product['content']['imdb']['votes'])
- except KeyError:
- votes = None
- try:
- year = int(product['content']['production']['year'])
- except KeyError:
- year = None
- try:
- genres = []
- for genre in product['_links']['viaplay:genres']:
- genres.append(genre['title'])
- genre = ', '.join(genres)
- except KeyError:
- genre = None
- try:
- mpaa = product['content']['parentalRating']
- except KeyError:
- mpaa = None
-
- if content == 'episode':
- mediatype = 'episode'
- title = product['content']['series']['episodeTitle'].encode('utf-8')
- tvshowtitle = product['content']['series']['title'].encode('utf-8')
- season = int(product['content']['series']['season']['seasonNumber'])
- episode = int(product['content']['series']['episodeNumber'])
- plot = product['content']['synopsis'].encode('utf-8')
-
- elif content == 'series':
- mediatype = 'tvshow'
- title = product['content']['series']['title'].encode('utf-8')
- tvshowtitle = product['content']['series']['title'].encode('utf-8')
- try:
- plot = product['content']['series']['synopsis'].encode('utf-8')
- except KeyError:
- plot = product['content']['synopsis'].encode('utf-8') # needed for alphabetical listing
-
- elif content == 'movie':
- mediatype = 'movie'
- title = product['content']['title'].encode('utf-8')
- plot = product['content']['synopsis'].encode('utf-8')
- try:
- for actor in product['content']['people']['actors']:
- cast.append(actor)
- except KeyError:
- pass
- try:
- directors = []
- for director in product['content']['people']['directors']:
- directors.append(director)
- director = ', '.join(directors)
- except KeyError:
- pass
-
- elif content == 'sport':
- mediatype = 'video'
- title = product['content']['title'].encode('utf-8')
- plot = product['content']['synopsis'].encode('utf-8')
-
- info = {
- 'mediatype': mediatype,
- 'title': title,
- 'tvshowtitle': tvshowtitle,
- 'season': season,
- 'episode': episode,
- 'year': year,
- 'plot': plot,
- 'duration': duration,
- 'code': imdb_code,
- 'rating': rating,
- 'votes': votes,
- 'genre': genre,
- 'director': director,
- 'mpaa': mpaa,
- 'cast': cast
+ for date in dates:
+ params = {
+ 'action': 'list_products',
+ 'url': date['href']
+ }
+ helper.add_item(date['date'], params)
+ helper.eod()
+
+
+def channels_page(url):
+ channels_dict = helper.vp.get_channels(url)
+
+ for channel in channels_dict['channels']:
+ params = {
+ 'action': 'list_products',
+ 'url': channel['_links']['self']['href']
+ }
+ art = {
+ 'thumb': channel['content']['images']['fallback']['template'].split('{')[0],
+ 'fanart': channel['content']['images']['fallback']['template'].split('{')[0]
+ }
+
+ for program in channel['_embedded']['viaplay:products']: # get current live program
+ if helper.vp.get_event_status(program) == 'live':
+ if 'content' in program:
+ current_program_title = coloring(program['content']['title'].encode('utf-8'), 'live')
+ else: # no broadcast
+ current_program_title = coloring(helper.language(30049).encode('utf-8'), 'no_broadcast')
+ break
+
+ list_title = '[B]{0}[/B]: {1}'.format(channel['content']['title'], current_program_title)
+
+ helper.add_item(list_title, params, art=art)
+
+ if channels_dict['next_page']:
+ list_next_page(channels_dict['next_page'], 'tve')
+ helper.eod()
+
+
+def categories_item(url):
+ title = helper.language(30041)
+ params = {
+ 'action': 'categories_page',
+ 'url': url
}
+ helper.add_item(title, params)
- return info
+def list_next_page(url, action):
+ title = helper.language(30018)
+ params = {
+ 'action': action,
+ 'url': url
+ }
+ helper.add_item(title, params)
-def return_art(product, content):
- """Return the available art in a xbmcgui.setArt friendly dict."""
- try:
- boxart = product['content']['images']['boxart']['url'].split('.jpg')[0] + '.jpg'
- except KeyError:
- boxart = None
- try:
- hero169 = product['content']['images']['hero169']['template'].split('.jpg')[0] + '.jpg'
- except KeyError:
- hero169 = None
- try:
- coverart23 = product['content']['images']['coverart23']['template'].split('.jpg')[0] + '.jpg'
- except KeyError:
- coverart23 = None
- try:
- coverart169 = product['content']['images']['coverart23']['template'].split('.jpg')[0] + '.jpg'
- except KeyError:
- coverart169 = None
- try:
- landscape = product['content']['images']['landscape']['url'].split('.jpg')[0] + '.jpg'
- except KeyError:
- landscape = None
- if content == 'episode' or content == 'sport':
- thumbnail = landscape
- else:
- thumbnail = boxart
- fanart = hero169
- banner = landscape
- cover = coverart23
- poster = boxart
+def list_products(url, filter_event=False, search_query=None):
+ if filter_event:
+ filter_event = filter_event.split(', ')
- art = {
- 'thumb': thumbnail,
- 'fanart': fanart,
- 'banner': banner,
- 'cover': cover,
- 'poster': poster
+ products_dict = helper.vp.get_products(url, filter_event=filter_event, search_query=search_query)
+ for product in products_dict['products']:
+ if product['type'] == 'series':
+ add_series(product)
+ elif product['type'] == 'episode':
+ add_episode(product)
+ elif product['type'] == 'movie':
+ add_movie(product)
+ elif product['type'] == 'sport':
+ add_sports_event(product)
+ elif product['type'] == 'tvEvent':
+ add_tv_event(product)
+ else:
+ helper.log('product type: {0} is not (yet) supported.'.format(product['type']))
+ return False
+
+ if products_dict['next_page']:
+ list_next_page(products_dict['next_page'], 'list_products')
+ helper.eod()
+
+
+def add_movie(movie):
+ params = {}
+ if movie['system'].get('guid'):
+ params['guid'] = movie['system']['guid']
+ else:
+ params['url'] = movie['_links']['self']['href']
+ params['action'] = 'play'
+
+ details = movie['content']
+
+ movie_info = {
+ 'mediatype': 'movie',
+ 'title': details['title'],
+ 'plot': details.get('synopsis'),
+ 'genre': ', '.join([x['title'] for x in movie['_links']['viaplay:genres']]),
+ 'year': details['production'].get('year'),
+ 'duration': int(details['duration'].get('milliseconds')) // 1000 if 'duration' in details else None,
+ 'cast': details['people'].get('actors', []) if 'people' in details else [],
+ 'director': ', '.join(details['people'].get('directors', [])) if 'people' in details else [],
+ 'mpaa': details.get('parentalRating'),
+ 'rating': float(details['imdb'].get('rating')) if 'imdb' in details else None,
+ 'votes': str(details['imdb'].get('votes')) if 'imdb' in details else None,
+ 'code': details['imdb'].get('id') if 'imdb' in details else None
}
- return art
+ helper.add_item(movie_info['title'], params=params, info=movie_info, art=add_art(details['images'], 'movie'),
+ content='movies', playable=True)
-def list_search(data):
- title = data['_links']['viaplay:search']['title']
- parameters = {
- 'action': 'search',
- 'url': data['_links']['viaplay:search']['href']
+def add_series(show):
+ params = {
+ 'action': 'seasons_page',
+ 'url': show['_links']['viaplay:page']['href']
}
- add_item(title, parameters)
+ details = show['content']
+
+ series_info = {
+ 'mediatype': 'tvshow',
+ 'title': details['series']['title'],
+ 'tvshowtitle': details['series']['title'],
+ 'plot': details['synopsis'] if details.get('synopsis') else details['series'].get('synopsis'),
+ 'genre': ', '.join([x['title'] for x in show['_links']['viaplay:genres']]),
+ 'year': details['production'].get('year') if 'production' in details else None,
+ 'cast': details['people'].get('actors', []) if 'people' in details else [],
+ 'director': ', '.join(details['people'].get('directors', [])) if 'people' in details else None,
+ 'mpaa': details.get('parentalRating'),
+ 'rating': float(details['imdb'].get('rating')) if 'imdb' in details else None,
+ 'votes': str(details['imdb'].get('votes')) if 'imdb' in details else None,
+ 'code': details['imdb'].get('id') if 'imdb' in details else None,
+ 'season': int(details['series']['seasons']) if details['series'].get('seasons') else None
+ }
+ helper.add_item(series_info['title'], params=params, folder=True, info=series_info,
+ art=add_art(details['images'], 'series'), content='tvshows')
-def get_user_input(heading):
- keyboard = xbmc.Keyboard('', heading)
- keyboard.doModal()
- if keyboard.isConfirmed():
- user_input = keyboard.getText()
- addon_log('User input string: %s' % user_input)
- else:
- user_input = None
- if user_input and len(user_input) > 0:
- return user_input
- else:
- return None
+def add_episode(episode):
+ params = {
+ 'action': 'play',
+ 'guid': episode['system']['guid']
+ }
+
+ details = episode['content']
+
+ episode_info = {
+ 'mediatype': 'episode',
+ 'title': details.get('title'),
+ 'list_title': details['series']['episodeTitle'] if details['series'].get('episodeTitle') else details.get(
+ 'title'),
+ 'tvshowtitle': details['series'].get('title'),
+ 'plot': details['synopsis'] if details.get('synopsis') else details['series'].get('synopsis'),
+ 'duration': details['duration']['milliseconds'] // 1000 if 'duration' in details else None,
+ 'genre': ', '.join([x['title'] for x in episode['_links']['viaplay:genres']]),
+ 'year': details['production'].get('year') if 'production' in details else None,
+ 'cast': details['people'].get('actors', []) if 'people' in details else [],
+ 'director': ', '.join(details['people'].get('directors', [])) if 'people' in details else None,
+ 'mpaa': details.get('parentalRating'),
+ 'rating': float(details['imdb'].get('rating')) if 'imdb' in details else None,
+ 'votes': str(details['imdb'].get('votes')) if 'imdb' in details else None,
+ 'code': details['imdb'].get('id') if 'imdb' in details else None,
+ 'season': int(details['series']['season'].get('seasonNumber')),
+ 'episode': int(details['series'].get('episodeNumber'))
+ }
+
+ helper.add_item(episode_info['list_title'], params=params, info=episode_info,
+ art=add_art(details['images'], 'episode'), content='episodes', playable=True)
-def get_numeric_input(heading):
- dialog = xbmcgui.Dialog()
- numeric_input = dialog.numeric(0, heading)
+def add_sports_event(event):
+ now = datetime.now()
+ date_today = now.date()
+ event_date = helper.vp.parse_datetime(event['epg']['start'], localize=True)
+ event_status = helper.vp.get_event_status(event)
- if len(numeric_input) > 0:
- return str(numeric_input)
+ if date_today == event_date.date():
+ start_time = '{0} {1}'.format(helper.language(30027), event_date.strftime('%H:%M'))
else:
- return None
+ start_time = event_date.strftime('%Y-%m-%d %H:%M')
+
+ if event_status == 'upcoming':
+ params = {
+ 'action': 'dialog',
+ 'dialog_type': 'ok',
+ 'heading': helper.language(30017),
+ 'message': helper.language(30016).format(start_time)
+ }
+ playable = False
+ else:
+ params = {
+ 'action': 'play',
+ 'guid': event['system']['guid']
+ }
+ playable = True
+
+ details = event['content']
+
+ event_info = {
+ 'mediatype': 'video',
+ 'title': details.get('title'),
+ 'plot': details['synopsis'],
+ 'year': int(details['production'].get('year')),
+ 'genre': details['format'].get('title'),
+ 'list_title': '[B]{0}:[/B] {1}'.format(coloring(start_time, event_status),
+ details.get('title').encode('utf-8'))
+ }
+ helper.add_item(event_info['list_title'], params=params, playable=playable, info=event_info,
+ art=add_art(details['images'], 'sport'), content='episodes')
-def search(url):
- query = get_user_input(language(30015))
- if query:
- url = '%s?query=%s' % (url, urllib.quote(query))
- list_products(url)
+def add_tv_event(event):
+ now = datetime.now()
+ date_today = now.date()
+ start_time_obj = helper.vp.parse_datetime(event['epg']['startTime'], localize=True)
+ event_status = helper.vp.get_event_status(event)
-def play_video(input, streamtype, content, pincode=None):
- if streamtype == 'url':
- url = input
- guid = vp.get_products(input=url, method='url')['system']['guid']
+ if date_today == start_time_obj.date():
+ start_time = '{0} {1}'.format(helper.language(30027), start_time_obj.strftime('%H:%M'))
+ else:
+ start_time = start_time_obj.strftime('%Y-%m-%d %H:%M')
+
+ if event_status == 'upcoming':
+ params = {
+ 'action': 'dialog',
+ 'dialog_type': 'ok',
+ 'heading': helper.language(30017),
+ 'message': helper.language(30016).format(start_time)
+ }
+ playable = False
else:
- guid = input
+ params = {
+ 'action': 'play',
+ 'guid': event['system']['guid']
+ }
+ playable = True
+
+ details = event['content']
+ event_info = {
+ 'mediatype': 'video',
+ 'title': details.get('title'),
+ 'plot': details.get('synopsis'),
+ 'year': details['production'].get('year'),
+ 'list_title': '[B]{0}:[/B] {1}'.format(coloring(start_time, event_status),
+ details.get('title').encode('utf-8'))
+ }
+ art = {
+ 'thumb': event['content']['images']['landscape']['template'].split('{')[0] if 'landscape' in details['images'] else None,
+ 'fanart': event['content']['images']['landscape']['template'].split('{')[0] if 'landscape' in details['images'] else None
+ }
- try:
- video_urls = vp.get_video_urls(guid, pincode=pincode)
- if video_urls:
- playitem = xbmcgui.ListItem(path=video_urls['manifest_url'])
- playitem.setProperty('IsPlayable', 'true')
- if addon.getSetting('subtitles') == 'true':
- playitem.setSubtitles(vp.download_subtitles(video_urls['subtitle_urls']))
- xbmcplugin.setResolvedUrl(_handle, True, listitem=playitem)
- else:
- dialog(dialog_type='ok', heading=language(30005), message=language(30038))
-
- except vp.AuthFailure as error:
- if error.value == 'ParentalGuidancePinChallengeNeededError':
- if pincode:
- dialog(dialog_type='ok', heading=language(30033), message=language(30034))
- else:
- pincode = get_numeric_input(language(30032))
- if pincode:
- play_video(input, streamtype, content, pincode)
- else:
- show_auth_error(error.value)
- except vp.LoginFailure:
- dialog(dialog_type='ok', heading=language(30005), message=language(30006))
+ helper.add_item(event_info['list_title'], params=params, playable=playable, info=event_info, art=art, content='episodes')
-def sports_menu(url):
- items = []
- event_date = ['today', 'upcoming', 'archive']
- for date in event_date:
- if date == 'today':
- title = language(30027)
- elif date == 'upcoming':
- title = language(30028)
- else:
- title = language(30029)
- if date == 'today':
- parameters = {
- 'action': 'list_sports_today',
- 'url': url
- }
- else:
+def seasons_page(url):
+ """List all series seasons."""
+ seasons = helper.vp.get_seasons(url)
+ if len(seasons) == 1: # list products if there's only one season
+ list_products(seasons[0]['_links']['self']['href'])
+ else:
+ for season in seasons:
+ title = helper.language(30014).format(season['title'])
parameters = {
- 'action': 'list_sports_dates',
- 'url': url,
- 'event_date': date
+ 'action': 'list_products',
+ 'url': season['_links']['self']['href']
}
- items = add_item(title, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
+ helper.add_item(title, parameters)
+ helper.eod()
-def list_sports_today(url):
- items = []
- event_status = [language(30037), language(30031)]
- for status in event_status:
- if status == language(30037):
- filter = 'live, upcoming'
- else:
- filter = 'archive'
- parameters = {
- 'action': 'list_products_sports_today',
- 'url': url,
- 'filter_sports_event': filter
- }
+def add_art(images, content_type):
+ artwork = {}
- items = add_item(status, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
+ for i in images:
+ image_url = images[i]['template'].split('{')[0] # get rid of template
+ if i == 'landscape':
+ if content_type == 'episode' or 'sport':
+ artwork['thumb'] = image_url
+ artwork['banner'] = image_url
+ elif i == 'hero169':
+ artwork['fanart'] = image_url
+ elif i == 'coverart23':
+ artwork['cover'] = image_url
+ elif i == 'boxart':
+ if content_type != 'episode' or 'sport':
+ artwork['thumb'] = image_url
+ artwork['poster'] = image_url
-def list_sports_dates(url, event_date):
- items = []
- dates = vp.get_sports_dates(url, event_date)
- for date in dates:
- title = date['date']
- parameters = {
- 'action': 'list_products',
- 'url': date['href']
- }
-
- items = add_item(title, parameters, items=items)
- xbmcplugin.addDirectoryItems(_handle, items, len(items))
- xbmcplugin.endOfDirectory(_handle)
-
-
-def dialog(dialog_type, heading, message=None, options=None, nolabel=None, yeslabel=None):
- dialog = xbmcgui.Dialog()
- if dialog_type == 'ok':
- dialog.ok(heading, message)
- elif dialog_type == 'yesno':
- return dialog.yesno(heading, message, nolabel=nolabel, yeslabel=yeslabel)
- elif dialog_type == 'select':
- ret = dialog.select(heading, options)
- if ret > -1:
- return ret
- else:
- return None
+ return artwork
-def add_item(title, parameters, items=False, folder=True, playable=False, set_info=False, set_art=False,
- watched=False, set_content=False):
- listitem = xbmcgui.ListItem(label=title)
- if playable:
- listitem.setProperty('IsPlayable', 'true')
- folder = False
- if set_art:
- listitem.setArt(set_art)
- else:
- listitem.setArt({'icon': addon.getAddonInfo('icon')})
- listitem.setArt({'fanart': addon.getAddonInfo('fanart')})
- if set_info:
- listitem.setInfo('video', set_info)
- if not watched:
- listitem.addStreamInfo('video', {'duration': 0})
- if set_content:
- xbmcplugin.setContent(_handle, set_content)
-
- recursive_url = _url + '?' + urllib.urlencode(parameters)
-
- if items is False:
- xbmcplugin.addDirectoryItem(_handle, recursive_url, listitem, folder)
- else:
- items.append((recursive_url, listitem, folder))
- return items
+def search(url):
+ query = helper.get_user_input(helper.language(30015))
+ if query:
+ list_products(url, search_query=query)
def coloring(text, meaning):
@@ -608,54 +422,61 @@ def coloring(text, meaning):
color = 'FFF16C00'
elif meaning == 'archive':
color = 'FFFF0EE0'
+ elif meaning == 'no_broadcast':
+ color = 'FFFF3333'
colored_text = '[COLOR=%s]%s[/COLOR]' % (color, text)
return colored_text
-def show_auth_error(error):
+def show_error(error):
if error == 'UserNotAuthorizedForContentError':
- message = language(30020)
+ message = helper.language(30020)
elif error == 'PurchaseConfirmationRequiredError':
- message = language(30021)
+ message = helper.language(30021)
elif error == 'UserNotAuthorizedRegionBlockedError':
- message = language(30022)
+ message = helper.language(30022)
+ elif error == 'ConcurrentStreamsLimitReachedError':
+ message = helper.language(30050)
else:
message = error
- dialog(dialog_type='ok', heading=language(30017), message=message)
+ helper.dialog(dialog_type='ok', heading=helper.language(30017), message=message)
def router(paramstring):
"""Router function that calls other functions depending on the provided paramstring."""
params = dict(urlparse.parse_qsl(paramstring))
- if params:
- if params['action'] == 'list_categories':
- list_categories(params['url'], params['category_name'])
- elif params['action'] == 'sports_menu':
- sports_menu(params['url'])
- elif params['action'] == 'list_seasons':
- list_seasons(params['url'])
- elif params['action'] == 'list_products':
+ vod_pages = ['series', 'movie', 'kids', 'rental']
+ products_pages = ['viaplay:starred', 'viaplay:watched', 'viaplay:purchased']
+
+ if 'action' in params:
+ if params['action'] in vod_pages:
+ vod_page(params['url'])
+ elif params['action'] in products_pages:
list_products(params['url'])
- elif params['action'] == 'list_sports_today':
- list_sports_today(params['url'])
- elif params['action'] == 'list_products_sports_today':
- list_products(params['url'], params['filter_sports_event'])
- elif params['action'] == 'play_video':
- play_video(params['playid'], params['streamtype'], params['content'])
- elif params['action'] == 'list_sortings':
- list_sortings(params['url'])
- elif params['action'] == 'list_alphabetical_letters':
- list_alphabetical_letters(params['url'])
- elif params['action'] == 'search':
+ elif params['action'] == 'sport':
+ sports_page(params['url'])
+ elif params['action'] == 'tve':
+ channels_page(params['url'])
+ elif params['action'] == 'categories_page':
+ categories_page(params['url'])
+ elif params['action'] == 'sortings_page':
+ sortings_page(params['url'])
+ if params['action'] == 'viaplay:root':
+ start_page(params['url'])
+ elif params['action'] == 'viaplay:search':
search(params['url'])
- elif params['action'] == 'list_sports_dates':
- list_sports_dates(params['url'], params['event_date'])
+ elif params['action'] == 'viaplay:logout':
+ helper.log_out()
+ elif params['action'] == 'sports_schedule_page':
+ sports_schedule_page(params['url'])
+ elif params['action'] == 'play':
+ helper.play(guid=params.get('guid'), url=params.get('url'))
+ elif params['action'] == 'seasons_page':
+ seasons_page(params['url'])
+ elif params['action'] == 'list_products':
+ list_products(params['url'])
elif params['action'] == 'dialog':
- dialog(params['dialog_type'], params['heading'], params['message'])
+ helper.dialog(params['dialog_type'], params['heading'], params['message'])
else:
- main_menu()
-
-
-def run():
- router(sys.argv[2][1:]) # trim the leading '?' from the plugin call paramstring
+ root_page()