diff options
72 files changed, 2181 insertions, 633 deletions
diff --git a/plugin.video.catchuptvandmore/LICENSE.txt b/plugin.video.catchuptvandmore/LICENSE.txt index 0d6e108..0d6e108 100755..100644 --- a/plugin.video.catchuptvandmore/LICENSE.txt +++ b/plugin.video.catchuptvandmore/LICENSE.txt diff --git a/plugin.video.catchuptvandmore/README.md b/plugin.video.catchuptvandmore/README.md index f4e066d..c4d3ff0 100755..100644 --- a/plugin.video.catchuptvandmore/README.md +++ b/plugin.video.catchuptvandmore/README.md @@ -28,6 +28,12 @@ Catch-Up TV & More est compatible avec la dernière version de Kodi (Kodi 17 Kry - i-Télé - CStar - Gulli +- France Ô +- HD1 +- L'Équipe +- 6ter +- Numéro 23 +- Chérie 25 ### Belgique — *Belgium* - *à venir* — *coming soon* @@ -38,3 +44,6 @@ Catch-Up TV & More est compatible avec la dernière version de Kodi (Kodi 17 Kry ## Bugs et améliorations — *Bugs and improvements* Retours de bugs, propositions d'améliorations ou d'ajout de contenus sont les bienvenue ! GitHub ou e-mail. *Bug reports, suggestions for improvements or content additions are welcome! GitHub or e-mail.* + +## French Forum +<https://forum.mpdb.tv/index.php/topic,35713.0.html> diff --git a/plugin.video.catchuptvandmore/addon.py b/plugin.video.catchuptvandmore/addon.py index 6591a5b..229d7d2 100755..100644 --- a/plugin.video.catchuptvandmore/addon.py +++ b/plugin.video.catchuptvandmore/addon.py @@ -56,6 +56,7 @@ def root(params): for category_id, string_id in skeleton.categories.iteritems(): if common.plugin.get_setting(category_id): last_category_id = category_id + last_window_title = _(string_id) context_menu = [] hide = ( _('Hide'), @@ -68,13 +69,16 @@ def root(params): 'label': _(string_id), 'url': common.plugin.get_url( action='list_channels', - category_id=category_id), + category_id=category_id, + window_title=_(string_id) + ), 'context_menu': context_menu }) # If only one category is present, directly open this category if len(listing) == 1: params['category_id'] = last_category_id + params['window_title'] = last_window_title return list_channels(params) return common.plugin.create_listing( @@ -178,7 +182,8 @@ def list_channels(params): channel_name=channel_name, channel_module=channel_module, channel_id=channel_id, - channel_country=channel_country + channel_country=channel_country, + window_title=title ), 'context_menu': context_menu }) @@ -273,4 +278,5 @@ def hide(params): if __name__ == '__main__': - common.plugin.run(common.plugin_name) + window_title = common.get_window_title() + common.plugin.run(window_title) diff --git a/plugin.video.catchuptvandmore/addon.xml b/plugin.video.catchuptvandmore/addon.xml index d01f76c..902f222 100755..100644 --- a/plugin.video.catchuptvandmore/addon.xml +++ b/plugin.video.catchuptvandmore/addon.xml @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <addon id="plugin.video.catchuptvandmore" name="Catch-up TV & More" - version="0.1.0" + version="0.1.2" provider-name="SylvainCecchetto"> <requires> <import addon="xbmc.python" version="2.25.0"/> @@ -26,7 +26,17 @@ <email>catch.up.tv.and.more [AT] gmail [DOT] com</email> <source>https://github.com/SylvainCecchetto/plugin.video.catchuptvandmore</source> <news> -This is the first released with some french channels. More contents will be added, stay tuned! +[Add channel] RTL-TVI +[Add channel] 6ter +[Bug] NRJ 12: No video +[Improvement] NRJ 12: Add listing for categories and seasons +[Improvement] France Télévision (pluzz): Add search feature and "last videos" categories +[Bug] TF1: Video URL failed +[Bug] Gulli: Doesn't work +[Add channel] Numéro 23 +[Add channel] Chérie 25 +[Bug] Arte: Doesn't work +[Bug] Canal+: Bug with subcategories </news> <assets> <icon>icon.png</icon> @@ -38,4 +48,4 @@ This is the first released with some french channels. More contents will be adde <screenshot>resources/screenshots/screenshot-05.jpg</screenshot> </assets> </extension> -</addon>
\ No newline at end of file +</addon> diff --git a/plugin.video.catchuptvandmore/resources/__init__.py b/plugin.video.catchuptvandmore/resources/__init__.py index e69de29..e69de29 100755..100644 --- a/plugin.video.catchuptvandmore/resources/__init__.py +++ b/plugin.video.catchuptvandmore/resources/__init__.py diff --git a/plugin.video.catchuptvandmore/resources/language/resource.language.en_gb/strings.po b/plugin.video.catchuptvandmore/resources/language/resource.language.en_gb/strings.po index abd4300..0b6f701 100755..100644 --- a/plugin.video.catchuptvandmore/resources/language/resource.language.en_gb/strings.po +++ b/plugin.video.catchuptvandmore/resources/language/resource.language.en_gb/strings.po @@ -19,7 +19,7 @@ msgstr "" # Settings categories (from 30000 to 30009) msgctxt "#30000" msgid "Main menu" -msgstr "Menu principal" +msgstr "" msgctxt "#30001" msgid "Channels" @@ -29,6 +29,7 @@ msgctxt "#30002" msgid "Quality and content" msgstr "" + # Settings line separators (from 30010 to 30019) msgctxt "#30010" msgid "Hide main menu categories" @@ -122,6 +123,33 @@ msgctxt "#30081" msgid "BFM TV: Video quality" msgstr "" +msgctxt "#30082" +msgid "TMC: Show bonus videos" +msgstr "" + +msgctxt "#30083" +msgid "NT1: Show bonus videos" +msgstr "" + +msgctxt "#30084" +msgid "HD1: Show bonus videos" +msgstr "" + +msgctxt "#30085" +msgid "NRJ 12: Video quality" +msgstr "" + +msgctxt "#30086" +msgid "L'Équipe: Video quality" +msgstr "" + +msgctxt "#30087" +msgid "TF1: Video quality" +msgstr "" + +msgctxt "#30088" +msgid "Numéro 23: Video quality" +msgstr "" # Others (from 30100 to 30140) msgctxt "#30100" @@ -134,4 +162,28 @@ msgstr "" msgctxt "#30102" msgid "DRM protected video" -msgstr "Vidéo protégée par DRM"
\ No newline at end of file +msgstr "" + +msgctxt "#30103" +msgid "Search" +msgstr "" + +msgctxt "#30104" +msgid "Last videos" +msgstr "" + +msgctxt "#30105" +msgid "From A to Z" +msgstr "" + +msgctxt "#30106" +msgid "Ascending" +msgstr "" + +msgctxt "#30107" +msgid "Descending" +msgstr "" + +msgctxt "#30108" +msgid "More programs..." +msgstr ""
\ No newline at end of file diff --git a/plugin.video.catchuptvandmore/resources/language/resource.language.fr_fr/strings.po b/plugin.video.catchuptvandmore/resources/language/resource.language.fr_fr/strings.po index 00433d9..35ee599 100755..100644 --- a/plugin.video.catchuptvandmore/resources/language/resource.language.fr_fr/strings.po +++ b/plugin.video.catchuptvandmore/resources/language/resource.language.fr_fr/strings.po @@ -123,6 +123,34 @@ msgctxt "#30081" msgid "BFM TV: Video quality" msgstr "BFM TV : Qualité vidéo" +msgctxt "#30082" +msgid "TMC: Show bonus videos" +msgstr "TMC : Afficher les vidéos bonus" + +msgctxt "#30083" +msgid "NT1: Show bonus videos" +msgstr "NT1 : Afficher les vidéos bonus" + +msgctxt "#30084" +msgid "HD1: Show bonus videos" +msgstr "HD1 : Afficher les vidéos bonus" + +msgctxt "#30085" +msgid "NRJ 12: Video quality" +msgstr "NRJ 12 : Qualité vidéo" + +msgctxt "#30086" +msgid "L'Équipe: Video quality" +msgstr "L'Équipe : Qualité vidéo" + +msgctxt "#30087" +msgid "TF1: Video quality" +msgstr "TF1 : Qualité vidéo" + +msgctxt "#30088" +msgid "Numéro 23: Video quality" +msgstr "Numéro 23 : Qualité vidéo" + # Others (from 30100 to 30140) msgctxt "#30100" @@ -137,4 +165,28 @@ msgctxt "#30102" msgid "DRM protected video" msgstr "Vidéo protégée par DRM" +msgctxt "#30103" +msgid "Search" +msgstr "Rechercher" + +msgctxt "#30104" +msgid "Last videos" +msgstr "Dernières vidéos" + +msgctxt "#30105" +msgid "From A to Z" +msgstr "De A à Z" + +msgctxt "#30106" +msgid "Ascending" +msgstr "Ascendant" + +msgctxt "#30107" +msgid "Descending" +msgstr "Descendant" + +msgctxt "#30108" +msgid "More programs..." +msgstr "Plus de programes..." + diff --git a/plugin.video.catchuptvandmore/resources/lib/__init__.py b/plugin.video.catchuptvandmore/resources/lib/__init__.py index e69de29..e69de29 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/__init__.py +++ b/plugin.video.catchuptvandmore/resources/lib/__init__.py diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/__init__.py b/plugin.video.catchuptvandmore/resources/lib/channels/__init__.py index e69de29..e69de29 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/__init__.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/__init__.py diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py index d60ebd0..4a62a9d 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py @@ -106,7 +106,8 @@ def list_shows(params): action='channel_entry', category_id=category_id, next='list_shows_2', - title=category_name + title=category_name, + window_title=category_name ) }) @@ -155,7 +156,8 @@ def list_shows(params): program_img=program_img, program_fanart=program_fanart, program_desc=program_desc, - title=program_title + title=program_title, + window_title=program_title ), 'info': info }) @@ -193,7 +195,8 @@ def list_shows(params): action='channel_entry', next='list_videos', program_id=params.program_id, - sub_category_id=sub_category_id + sub_category_id=sub_category_id, + window_title=sub_category_title ), 'info': info }) @@ -212,7 +215,8 @@ def list_shows(params): action='channel_entry', next='list_videos', program_id=params.program_id, - sub_category_id='null' + sub_category_id='null', + window_title=params.window_title ), 'info': info diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/__init__.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/__init__.py index e69de29..e69de29 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/__init__.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/__init__.py diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/arte.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/arte.py index f2b7a2b..02aa6c4 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/arte.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/arte.py @@ -24,14 +24,14 @@ import json from resources.lib import utils from resources.lib import common -authorization_key = 'Bearer OTE3NjJhOTYwNzQzNWY0MGE0OGI5MGQ0YmVm' \ - 'MWY2Y2JiYzc5NDQzY2IxMmYxYjQ0NDVlYmEyOTBmYjVkMDg3OQ' +# TODO +# List emissions +# Most recent +# Most viewed -headers = {'Authorization': authorization_key} - -url_categories = 'https://api-cdn.arte.tv/api/opa/v2/categories?' \ - 'language=%s&limit=100&sort=order' -# Valid languages list : fr|de|en|es|pl +url_replay = 'https://www.arte.tv/papi/tvguide/videos/' \ + 'ARTE_PLUS_SEVEN/%s.json?includeLongRights=true' +# Valid languages: F or D def channel_entry(params): @@ -40,49 +40,82 @@ def channel_entry(params): elif 'list_videos' in params.next: return list_videos(params) elif 'play' in params.next: - return get_video_URL(params) + return get_video_url(params) @common.plugin.cached(common.cache_time) def list_shows(params): shows = [] + emissions_list = [] + categories = {} - disered_language = common.plugin.get_setting( + desired_language = common.plugin.get_setting( params.channel_id + '.language') - if disered_language == 'Auto': - disered_language = params.channel_country + if desired_language == 'Auto': + if params.channel_country == 'fr': + desired_language = 'F' + elif params.channel_country == 'de': + desired_language = 'D' + elif desired_language == 'fr': + desired_language = 'F' + elif desired_language == 'de': + desired_language = 'D' + else: + desired_language = 'F' file_path = utils.download_catalog( - url_categories % disered_language, - '%s.json' % params.channel_name, - specific_headers=headers) - file_categories = open(file_path).read() - json_parser = json.loads(file_categories) - - for category in json_parser['categories']: - label = category['label'].encode('utf-8') - desc = category['description'].encode('utf-8') - href = category['links']['videos']['href'].encode('utf-8') - code = category['code'].encode('utf-8') - - info = { - 'video': { - 'title': label, - 'plot': desc - } - } + url_replay % desired_language, + '%s_%s.json' % (params.channel_name, desired_language) + ) + file_replay = open(file_path).read() + json_parser = json.loads(file_replay) + + for emission in json_parser['paginatedCollectionWrapper']['collection']: + emission_dict = {} + emission_dict['duration'] = emission['videoDurationSeconds'] + emission_dict['video_url'] = emission['videoPlayerUrl'].encode('utf-8') + emission_dict['image'] = emission['programImage'].encode('utf-8') + try: + emission_dict['genre'] = emission['genre'].encode('utf-8') + except: + emission_dict['genre'] = 'Unknown' + try: + emission_dict['director'] = emission['director'].encode('utf-8') + except: + emission_dict['director'] = '' + emission_dict['production_year'] = emission['productionYear'] + emission_dict['program_title'] = emission['VTI'].encode('utf-8') + try: + emission_dict['emission_title'] = emission['VSU'].encode('utf-8') + except: + emission_dict['emission_title'] = '' + + emission_dict['category'] = emission['VCH'][0]['label'].encode('utf-8') + categories[emission_dict['category']] = emission_dict['category'] + emission_dict['aired'] = emission['VDA'].encode('utf-8') + emission_dict['playcount'] = emission['VVI'] + + try: + emission_dict['desc'] = emission['VDE'].encode('utf-8') + except: + emission_dict['desc'] = '' + + emissions_list.append(emission_dict) + + with common.plugin.get_storage() as storage: + storage['emissions_list'] = emissions_list + + for category in categories.keys(): shows.append({ - 'label': label, + 'label': category, 'url': common.plugin.get_url( action='channel_entry', - code=code, - href=href, - next='list_videos', - title=label + next='list_videos_cat', + category=category, + window_title=category ), - 'info': info }) return common.plugin.create_listing( @@ -97,107 +130,70 @@ def list_shows(params): @common.plugin.cached(common.cache_time) def list_videos(params): videos = [] - - params_url = { - 'geoblockingZone': 'EUR_DE_FR,ALL,SAT,DE_FR', - 'imageSize': '1920x1080,625x224,940x530,720x406,400x225', - 'kind': 'SHOW', - 'limit': '100', - 'platform': 'ARTEPLUS7', - 'sort': '-broadcastBegin', - 'videoLibrary': 'true' - } - file_path = utils.download_catalog( - params.href, - '%s.json' % (params.channel_name + params.code), - specific_headers=headers, - params=params_url) - file_shows = open(file_path).read() - json_parser = json.loads(file_shows) - - for video in json_parser['videos']: - title = video['title'].encode('utf-8') - subtitle = '' - if video['subtitle'] is not None: - subtitle = video['subtitle'].encode('utf-8') - - original_title = video['originalTitle'].encode('utf-8') - plotoutline = '' - if video['shortDescription'] is not None: - plotoutline = video['shortDescription'].encode('utf-8') - plot = '' - if video['fullDescription'] is not None: - plot = video['fullDescription'].encode('utf-8') - duration = video['durationSeconds'] - year_prod = video['productionYear'] - genre = video['genrePresse'].encode('utf-8') - season = video['season'] - episode = video['episode'] - total_episodes = video['totalEpisodes'] - href = video['links']['videoStreams']['href'].encode('utf-8') - views = video['views'] - director = video['director'] - aired = video['arteSchedulingDay'] # year-mounth-day - day = aired.split('-')[2] - mounth = aired.split('-')[1] - year = aired.split('-')[0] - date = '.'.join((day, mounth, year)) - fanart = video['mainImage']['url'].encode('utf-8') - thumb = video['mainImage']['alternateResolutions'][1]['url'].encode('utf-8') - - if subtitle: - title = title + ' - [I]' + subtitle + '[/I]' - - info = { - 'video': { - 'title': title, - 'originaltitle': original_title, - 'plot': plot, - 'plotoutline': plotoutline, - 'aired': aired, - 'date': date, - 'duration': duration, - 'year': year_prod, - 'genre': genre, - 'season': season, - 'episode': episode, - 'playcount': views, - 'director': director, - 'mediatype': 'tvshow' - } - } - - videos.append({ - 'label': title, - 'fanart': fanart, - 'thumb': thumb, - 'url': common.plugin.get_url( - action='channel_entry', - next='play', - href=href, + with common.plugin.get_storage() as storage: + emissions_list = storage['emissions_list'] + + if params.next == 'list_videos_cat': + for emission in emissions_list: + if emission['category'] == params.category: + if emission['emission_title']: + title = emission['program_title'] + ' - [I]' + \ + emission['emission_title'] + '[/I]' + else: + title = emission['program_title'] + aired = emission['aired'].split(' ')[0] + aired_splited = aired.split('/') + day = aired_splited[0] + mounth = aired_splited[1] + year = aired_splited[2] + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) + date = '.'.join((day, mounth, year)) + aired = '-'.join((year, mounth, day)) + info = { + 'video': { + 'title': title, + 'plot': emission['desc'], + 'aired': aired, + 'date': date, + 'duration': emission['duration'], + 'year': emission['production_year'], + 'genre': emission['genre'], + 'playcount': emission['playcount'], + 'director': emission['director'], + 'mediatype': 'tvshow' + } + } + + videos.append({ + 'label': title, + 'thumb': emission['image'], + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + url=emission['video_url'], + ), + 'is_playable': True, + 'info': info + }) + + return common.plugin.create_listing( + videos, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_DATE, + common.sp.xbmcplugin.SORT_METHOD_DURATION, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, + common.sp.xbmcplugin.SORT_METHOD_GENRE, + common.sp.xbmcplugin.SORT_METHOD_PLAYCOUNT, + common.sp.xbmcplugin.SORT_METHOD_UNSORTED ), - 'is_playable': True, - 'info': info - }) - - return common.plugin.create_listing( - videos, - sort_methods=( - common.sp.xbmcplugin.SORT_METHOD_DATE, - common.sp.xbmcplugin.SORT_METHOD_DURATION, - common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, - common.sp.xbmcplugin.SORT_METHOD_GENRE, - common.sp.xbmcplugin.SORT_METHOD_PLAYCOUNT, - common.sp.xbmcplugin.SORT_METHOD_UNSORTED - ), - content='tvshows') + content='tvshows') @common.plugin.cached(common.cache_time) -def get_video_URL(params): +def get_video_url(params): file_medias = utils.get_webcontent( - params.href, - specific_headers=headers) + params.url) json_parser = json.loads(file_medias) url_auto = '' @@ -205,31 +201,22 @@ def get_video_URL(params): url_hd = '' url_sd = '' url_sd_minus = '' - for video_stream in json_parser['videoStreams']: - if video_stream['audioSlot'] == 1: - if video_stream['quality'] == 'AQ' or \ - video_stream['quality'] == 'XQ': - url_auto = video_stream['url'].encode('utf-8') - - elif video_stream['quality'] == 'SQ' and \ - video_stream['mediaType'] == 'mp4' and \ - video_stream['protocol'] == 'HTTP': - url_hd_plus = video_stream['url'].encode('utf-8') - - elif video_stream['quality'] == 'EQ' and \ - video_stream['mediaType'] == 'mp4' and \ - video_stream['protocol'] == 'HTTP': - url_hd = video_stream['url'].encode('utf-8') - - elif video_stream['quality'] == 'HQ' and \ - video_stream['mediaType'] == 'mp4' and \ - video_stream['protocol'] == 'HTTP': - url_sd = video_stream['url'].encode('utf-8') - - elif video_stream['quality'] == 'MQ' and \ - video_stream['mediaType'] == 'mp4' and \ - video_stream['protocol'] == 'HTTP': - url_sd_minus = video_stream['url'].encode('utf-8') + video_streams = json_parser['videoJsonPlayer']['VSR'] + + if 'HLS_SQ_1' in video_streams: + url_auto = video_streams['HLS_SQ_1']['url'].encode('utf-8') + + if 'HTTP_MP4_SQ_1' in video_streams: + url_hd_plus = video_streams['HTTP_MP4_SQ_1']['url'].encode('utf-8') + + if 'HTTP_MP4_EQ_1' in video_streams: + url_hd = video_streams['HTTP_MP4_EQ_1']['url'].encode('utf-8') + + if 'HTTP_MP4_HQ_1' in video_streams: + url_sd = video_streams['HTTP_MP4_HQ_1']['url'].encode('utf-8') + + if 'HTTP_MP4_MQ_1' in video_streams: + url_sd_minus = video_streams['HTTP_MP4_MQ_1']['url'].encode('utf-8') desired_quality = common.plugin.get_setting( params.channel_id + '.quality') diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/bfmtv.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/bfmtv.py index f88615b..7bd7a93 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/bfmtv.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/bfmtv.py @@ -23,6 +23,7 @@ import json from resources.lib import utils from resources.lib import common +import ast url_token = 'http://api.nextradiotv.com/bfmtv-applications/' @@ -85,7 +86,8 @@ def list_shows(params): category=category, next='list_videos_1', title=title, - page='1' + page='1', + window_title=title ) }) @@ -101,6 +103,9 @@ def list_shows(params): @common.plugin.cached(common.cache_time) def list_videos(params): videos = [] + if 'previous_listing' in params: + videos = ast.literal_eval(params['previous_listing']) + if params.next == 'list_videos_1': file_path = utils.download_catalog( url_show % ( @@ -158,7 +163,10 @@ def list_videos(params): category=params.category, next='list_videos_1', title=title, - page=str(int(params.page) + 1) + page=str(int(params.page) + 1), + window_title=params.window_title, + update_listing=True, + previous_listing=str(videos) ) }) @@ -172,7 +180,9 @@ def list_videos(params): common.sp.xbmcplugin.SORT_METHOD_GENRE, common.sp.xbmcplugin.SORT_METHOD_UNSORTED ), - content='tvshows') + content='tvshows', + update_listing='update_listing' in params, + ) @common.plugin.cached(common.cache_time) diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/c.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/c.py index 84d3b2d..07bd241 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/c.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/c.py @@ -77,7 +77,8 @@ def list_shows(params): action='channel_entry', slug=slug, next='list_shows_2', - title=title + title=title, + window_title=title ) }) @@ -113,7 +114,8 @@ def list_shows(params): id=id, videos_recent=videos_recent, slug=slug, - title=title + title=title, + window_title=title ) }) @@ -199,7 +201,6 @@ def list_videos(params): content='tvshows') - @common.plugin.cached(common.cache_time) def get_video_URL(params): file_video = utils.get_webcontent( @@ -207,4 +208,3 @@ def get_video_URL(params): ) video_json = json.loads(file_video) return video_json['main']['MEDIA']['VIDEOS']['HLS'].encode('utf-8') - diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/canalplus.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/canalplus.py index 12240ef..d0e7dff 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/canalplus.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/canalplus.py @@ -24,6 +24,7 @@ import json from resources.lib import utils from resources.lib import common +import ast url_auth = 'http://service.mycanal.fr/authenticate.json/iphone/' \ @@ -51,78 +52,183 @@ def get_token(): @common.plugin.cached(common.cache_time) def list_shows(params): - # Create categories list shows = [] - if params.next == 'list_shows_1': - file_path = utils.download_catalog( - url_categories % get_token(), - '%s.json' % (params.channel_name)) - file_categories = open(file_path).read() - json_categories = json.loads(file_categories) - - for strate in json_categories['strates']: - if strate['type'] == 'textList': - for content in strate['contents']: - title = content['title'].encode('utf-8') - url_page = content['onClick']['URLPage'].encode('utf-8') - - shows.append({ - 'label': title, - 'url': common.plugin.get_url( - action='channel_entry', - url_page=url_page, - next='list_shows_2', - title=title - ) - }) - - shows = common.plugin.create_listing( - shows, - sort_methods=( - common.sp.xbmcplugin.SORT_METHOD_UNSORTED, - common.sp.xbmcplugin.SORT_METHOD_LABEL - ) - ) + if 'url_page' not in params: + params.url_page = url_categories % get_token() + if 'title' not in params: + params.title = 'root' + if 'fanart' in params: + fanart = params.fanart + else: + fanart = '' - elif params.next == 'list_shows_2': - # Create category's programs list file_path = utils.download_catalog( params.url_page, - '%s.json' % (params.title)) + '%s_%s_%s.json' % ( + params.channel_name, + params.title, + common.sp.md5(params.url_page).hexdigest())) file_shows = open(file_path).read() shows_json = json.loads(file_shows) + if 'strates' in shows_json: + strates = shows_json['strates'] + if len(strates) == 1 and 'textList_like' not in params: + params['title'] = strates[0]['title'].encode('utf-8') + params['next'] = 'list_shows_2' + return list_shows(params) + elif len(strates) == 2 and 'textList_like' not in params: + for strate in strates: + if strate['type'].encode('utf-8') != 'carrousel': + params['title'] = strate['title'].encode('utf-8') + params['next'] = 'list_shows_2' + return list_shows(params) + + for strate in strates: + if strate['type'] == 'carrousel': + for content in strate['contents']: + fanart = content['URLImage'].encode('utf-8') + # Main categories e.g. Séries, Humour, Sport + if 'textList_like' in params and params.textList_like is True: + if 'title' in strate and \ + strate['title'].encode('utf-8') == params.title: + for content in strate['contents']: + title = content['title'].encode('utf-8') + url_page = content[ + 'onClick']['URLPage'].encode('utf-8') + try: + subtitle = content['subtitle'].encode('utf-8') + except: + subtitle = '' + try: + img = content['URLImage'].encode('utf-8') + except: + img = '' + + info = { + 'video': { + 'title': title, + 'plot': subtitle, + } + } - for strate in shows_json['strates']: - if strate['type'] == 'contentGrid': - for content in strate['contents']: - title = content['title'].encode('utf-8') - try: - subtitle = content['subtitle'].encode('utf-8') - except: - subtitle = '' + shows.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + url_page=url_page, + next='list_shows_1', + title=title, + window_title=title, + fanart=fanart + ), + 'info': info + }) + else: + if strate['type'] == 'textList': + for content in strate['contents']: + title = content['title'].encode('utf-8') + url_page = content[ + 'onClick']['URLPage'].encode('utf-8') + try: + subtitle = content['subtitle'].encode('utf-8') + except: + subtitle = '' + try: + img = content['URLImage'].encode('utf-8') + except: + img = '' + + info = { + 'video': { + 'title': title, + 'plot': subtitle, + } + } + + shows.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + url_page=url_page, + next='list_shows_1', + title=title, + window_title=title, + fanart=fanart + ), + 'info': info + }) + # Videos, e.g. "Ne manquez pas" + elif strate['type'] == 'contentGrid': + title = strate['title'].encode('utf-8') + shows.append({ + 'label': title, + 'url': common.plugin.get_url( + action='channel_entry', + url_page=params.url_page, + next='list_shows_2', + title=title, + window_title=title, + ) + }) + # Other levels (subcategories, ...) e.g. "Top emissions" + elif strate['type'] == 'contentRow': + title = strate['title'].encode('utf-8') + shows.append({ + 'label': title, + 'url': common.plugin.get_url( + action='channel_entry', + url_page=params.url_page, + next='list_shows_2', + title=title, + window_title=title, + ) + }) + elif 'textList_like' not in params: + for content in shows_json['contents']: + title = content['title'].encode('utf-8') + params['title'] = title + params['next'] = 'list_shows_2' + return list_shows(params) + + else: + for content in shows_json['contents']: + title = content['title'].encode('utf-8') + url_page = content[ + 'onClick']['URLPage'].encode('utf-8') + try: + subtitle = content['subtitle'].encode('utf-8') + except: + subtitle = '' + try: img = content['URLImage'].encode('utf-8') - url_page = content['onClick']['URLPage'].encode('utf-8') + except: + img = '' - info = { - 'video': { - 'title': title, - 'plot': subtitle, - } + info = { + 'video': { + 'title': title, + 'plot': subtitle, } - shows.append({ - 'label': title, - 'thumb': img, - 'url': common.plugin.get_url( - action='channel_entry', - next='list_shows_3', - url_page=url_page, - title=title - ), - 'info': info - }) - - shows = common.plugin.create_listing( + } + + shows.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + url_page=url_page, + next='list_shows_1', + title=title, + window_title=title, + fanart=fanart + ), + 'info': info + }) + + return common.plugin.create_listing( shows, sort_methods=( common.sp.xbmcplugin.SORT_METHOD_UNSORTED, @@ -130,89 +236,104 @@ def list_shows(params): ) ) - elif params.next == 'list_shows_3': - # Check if there is any folder for this program + elif params.next == 'list_shows_2': file_path = utils.download_catalog( params.url_page, - '%s.json' % (params.title)) + '%s_%s_%s.json' % ( + params.channel_name, + params.title, + common.sp.md5(params.url_page).hexdigest())) file_shows = open(file_path).read() shows_json = json.loads(file_shows) - if 'strates' not in shows_json or len(shows_json['strates']) <= 2: - params.next = 'list_videos' - params.title = 'none' - params.index_page = 1 - return list_videos(params) + if 'strates' in shows_json: + strates = shows_json['strates'] + for strate in strates: + if 'title' in strate and \ + strate['title'].encode('utf-8') == params.title: + contents = strate['contents'] else: - fanart = '' - for strate in shows_json['strates']: - if strate['type'] == 'carrousel': - for content in strate['contents']: - fanart = content['URLImage'].encode('utf-8') - elif strate['type'] == 'contentRow': - title = strate['title'].encode('utf-8') - - info = { - 'video': { - 'title': title, - } - } - - shows.append({ - 'label': title, - 'fanart': fanart, - 'url': common.plugin.get_url( - action='channel_entry', - next='list_videos', - url_page=params.url_page, - title=title, - index_page=1 - ), - 'info': info - }) - - shows = common.plugin.create_listing( - shows, - sort_methods=( - common.sp.xbmcplugin.SORT_METHOD_UNSORTED, - common.sp.xbmcplugin.SORT_METHOD_LABEL - ) - ) - - return shows + contents = shows_json['contents'] + for content in contents: + if 'type' in content and \ + content['type'].encode('utf-8') == 'quicktime': + return list_videos(params) + else: + params['textList_like'] = True + params['title'] = params.title + params['next'] = 'list_shows_1' + return list_shows(params) @common.plugin.cached(common.cache_time) def list_videos(params): videos = [] + if 'previous_listing' in params: + videos = ast.literal_eval(params['previous_listing']) file_path = utils.download_catalog( params.url_page, - '%s.json' % (params.url_page)) + '%s_%s_%s.json' % ( + params.channel_name, + params.title, + common.sp.md5(params.url_page).hexdigest())) file_videos = open(file_path).read() videos_json = json.loads(file_videos) - - more_videos = False - no_strates = False + more_videos = True fanart = '' - if 'strates' not in videos_json: - no_strates = True - else: + if 'strates' in videos_json: for strate in videos_json['strates']: if strate['type'] == 'carrousel': for content in strate['contents']: fanart = content['URLImage'].encode('utf-8') - if strate['type'] == 'contentRow' or strate['type'] == 'contentGrid': - if strate['title'].encode('utf-8') == params.title or params.title == 'none': - if 'URLPage' in strate['paging']: - url = strate['paging']['URLPage'].encode('utf-8') - url = url + '&indexPage=' + params.index_page - params.index_page = int(params.index_page) + 1 - more_videos = True - file_videos = utils.get_webcontent(url) - videos_json = json.loads(file_videos) - - if more_videos or no_strates: + + # Check if we are in the correct cotegory + if 'title' in strate and \ + strate['title'].encode('utf-8') == params.title: + + # If we have lot of videos ... + if 'URLPage' in strate['paging']: + url = strate['paging']['URLPage'].encode('utf-8') + url = url + '&indexPage=1' + params['url_page'] = url + params['fanart'] = fanart + return list_videos(params) + + # Else show only this videos + else: + for content in strate['contents']: + title = content['title'].encode('utf-8') + try: + subtitle = content['subtitle'].encode('utf-8') + except: + subtitle = '' + img = content['URLImage'].encode('utf-8') + url_media = content['onClick']['URLPage'].encode('utf-8') + + info = { + 'video': { + 'title': title, + 'plot': subtitle, + 'mediatype': 'tvshow' + + } + } + + videos.append({ + 'label': title, + 'thumb': img, + 'fanart': fanart, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + url_media=url_media, + url_page=params.url_page, + title=title + ), + 'info': info, + 'is_playable': True + }) + else: if len(videos_json['contents']) == 0: more_videos = False for content in videos_json['contents']: @@ -229,86 +350,54 @@ def list_videos(params): 'title': title, 'plot': subtitle, 'mediatype': 'tvshow' + } } videos.append({ 'label': title, 'thumb': img, - 'fanart': fanart, + 'fanart': params.fanart, 'url': common.plugin.get_url( action='channel_entry', next='play', url_media=url_media, - url_page=params.url_page, title=title, - index_page=params.index_page + fanart=params.fanart ), 'info': info, 'is_playable': True }) - else: - for strate in videos_json['strates']: - if strate['type'] == 'contentRow' or strate['type'] == 'contentGrid': - if strate['title'].encode('utf-8') == params.title or params.title == 'none': - for content in strate['contents']: - title = content['title'].encode('utf-8') - try: - subtitle = content['subtitle'].encode('utf-8') - except: - subtitle = '' - img = content['URLImage'].encode('utf-8') - url_media = content['onClick']['URLPage'].encode('utf-8') - info = { - 'video': { - 'title': title, - 'plot': subtitle, - 'mediatype': 'tvshow' - } - } + if more_videos is True: + # More videos... + current_index_page = int(params.url_page[-1]) + videos.append({ + 'fanart': params.fanart, + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_videos', + title=params.title, + url_page=params.url_page[:-1] + str( + current_index_page + 1), + update_listing=True, + previous_listing=str(videos), + fanart=params.fanart + ), - videos.append({ - 'label': title, - 'thumb': img, - 'fanart': fanart, - 'url': common.plugin.get_url( - action='channel_entry', - next='play', - url_media=url_media, - url_page=params.url_page, - title=title, - index_page=params.index_page - ), - 'info': info, - 'is_playable': True - }) + }) - if more_videos: - videos.append({ - 'label': common.addon.get_localized_string(30100), - 'url': common.plugin.get_url( - action='channel_entry', - next='list_videos', - url_media=url_media, - title=params.title, - url_page=params.url_page, - index_page=params.index_page - ), - - }) - - videos = common.plugin.create_listing( + return common.plugin.create_listing( videos, content='tvshows', sort_methods=( common.sp.xbmcplugin.SORT_METHOD_UNSORTED, common.sp.xbmcplugin.SORT_METHOD_LABEL - ) + ), + update_listing='update_listing' in params ) - return videos - @common.plugin.cached(common.cache_time) def get_video_URL(params): diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/gulli.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/gulli.py index b7ab8ee..ac6986d 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/gulli.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/gulli.py @@ -23,6 +23,7 @@ import json from resources.lib import utils from resources.lib import common +import time def channel_entry(params): @@ -34,34 +35,41 @@ def channel_entry(params): return get_video_URL(params) +secret_key = '19nBVBxv791Xs' + + +def get_api_key(): + date = time.strftime("%Y%m%d") + key = secret_key + date + key = common.sp.md5(key).hexdigest() + return 'iphoner_' + key + + categories = {} categories['Dessins animés'] = 'http://sslreplay.gulli.fr/replay/api?' \ - 'call=%7B%22api_key%22:%22iphoner_a140e' \ - 'e8cb4b10fcd8b12a7fe688b34de%22,%22method' \ - '%22:%22programme.getLatestEpisodes%22,%' \ - '22params%22:%7B%22program_image_thumb%' \ - '22:%5B310,230%5D,%22category_id%22:%22' \ - 'dessins-animes%22%7D%7D' + 'call=%%7B%%22api_key%%22:%%22%s%%22,%%22method' \ + '%%22:%%22programme.getLatestEpisodes%%22,%%' \ + '22params%%22:%%7B%%22program_image_thumb%%' \ + '22:%%5B310,230%%5D,%%22category_id%%22:%%22' \ + 'dessins-animes%%22%%7D%%7D' categories['Émissions'] = 'https://sslreplay.gulli.fr/replay/api?' \ - 'call=%7B%22api_key%22:%22iphoner_a140e' \ - 'e8cb4b10fcd8b12a7fe688b34de%22,%22method' \ - '%22:%22programme.getLatestEpisodes%22,%' \ - '22params%22:%7B%22program_image_thumb%' \ - '22:%5B310,230%5D,%22category_id%22:%22' \ - 'emissions%22%7D%7D' + 'call=%%7B%%22api_key%%22:%%22%s%%22,%%22method' \ + '%%22:%%22programme.getLatestEpisodes%%22,%%' \ + '22params%%22:%%7B%%22program_image_thumb%%' \ + '22:%%5B310,230%%5D,%%22category_id%%22:%%22' \ + 'emissions%%22%%7D%%7D' categories['Séries & films'] = 'https://sslreplay.gulli.fr/replay/api?' \ - 'call=%7B%22api_key%22:%22iphoner_a140e' \ - 'e8cb4b10fcd8b12a7fe688b34de%22,%22method' \ - '%22:%22programme.getLatestEpisodes%22,%' \ - '22params%22:%7B%22program_image_thumb%' \ - '22:%5B310,230%5D,%22category_id%22:%22' \ - 'series%22%7D%7D' + 'call=%%7B%%22api_key%%22:%%22%s%%22,%%22method' \ + '%%22:%%22programme.getLatestEpisodes%%22,%%' \ + '22params%%22:%%7B%%22program_image_thumb%%' \ + '22:%%5B310,230%%5D,%%22category_id%%22:%%22' \ + 'series%%22%%7D%%7D' url_list_show = 'https://sslreplay.gulli.fr/replay/api?call=%%7B%%22api_key' \ - '%%22:%%22iphoner_a140ee8cb4b10fcd8b12a7fe688b34de%%22,%%22' \ + '%%22:%%22%s%%22,%%22' \ 'method%%22:%%22programme.getEpisodesByProgramIds%%22,%%22' \ 'params%%22:%%7B%%22program_id_list%%22:%%5B%%22%s%%22%%5D' \ '%%7D%%7D' @@ -79,9 +87,10 @@ def list_shows(params): 'label': category_title, 'url': common.plugin.get_url( action='channel_entry', - category_url=category_url, + category_url=category_url % get_api_key(), next='list_shows_cat', - title=category_title + title=category_title, + window_title=category_title ) }) @@ -114,7 +123,8 @@ def list_shows(params): action='channel_entry', program_id=program_id, next='list_videos', - title=program_title + title=program_title, + window_title=program_title ) }) @@ -132,7 +142,7 @@ def list_videos(params): videos = [] file_path = utils.download_catalog( - url_list_show % params.program_id, + url_list_show % (get_api_key(), params.program_id), '%s_%s.json' % (params.channel_name, params.program_id)) file = open(file_path).read() json_show = json.loads(file) @@ -148,7 +158,7 @@ def list_videos(params): episode_number = show['episode_number'] season_number = show['season_number'] # total_episodes_in_season = show['total_episodes_in_season'] - url_ipad = show['url_ipad'].encode('utf-8') + url_streaming = show['url_streaming'].encode('utf-8') # url_streaming = show['url_streaming'].encode('utf-8') short_desc = show['short_desc'].encode('utf-8') note = float(show['note'].encode('utf-8')) * 2 @@ -182,7 +192,7 @@ def list_videos(params): 'url': common.plugin.get_url( action='channel_entry', next='play', - url_ipad=url_ipad + url_streaming=url_streaming ), 'is_playable': True, 'info': info @@ -200,4 +210,12 @@ def list_videos(params): @common.plugin.cached(common.cache_time) def get_video_URL(params): - return params.video_urlhd + url_root = params.url_streaming.replace('playlist.m3u8', '') + m3u8_content = utils.get_webcontent(params.url_streaming) + last_url = '' + + for line in m3u8_content.splitlines(): + if 'm3u8' in line and 'video' in line: + last_url = line + + return url_root + last_url diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/itele.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/itele.py index 0963fb3..3b32c65 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/itele.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/itele.py @@ -49,7 +49,8 @@ categories = { url_category_query + 'INSOLITE': 'Insolite' } -#@common.plugin.cached(common.cache_time) + +@common.plugin.cached(common.cache_time) def list_shows(params): # Create categories list shows = [] @@ -62,7 +63,8 @@ def list_shows(params): action='channel_entry', category_url=category_url, next='list_videos_cat', - title=category_title + title=category_title, + window_title=category_title ) }) @@ -72,7 +74,8 @@ def list_shows(params): action='channel_entry', category_url='emissions', next='list_shows_emissions', - title='Les Émissions' + title='Les Émissions', + window_title='Les Émissions' ) }) @@ -91,7 +94,8 @@ def list_shows(params): action='channel_entry', category_url='http://service.itele.fr/iphone/dernieres_emissions?query=', next='list_videos_cat', - title='À la Une' + title='À la Une', + window_title='À la Une' ) }) @@ -101,7 +105,8 @@ def list_shows(params): action='channel_entry', category_url='http://service.itele.fr/iphone/emissions?query=magazines', next='list_videos_cat', - title='Magazines' + title='Magazines', + window_title='Magazines' ) }) @@ -111,7 +116,8 @@ def list_shows(params): action='channel_entry', category_url='http://service.itele.fr/iphone/emissions?query=chroniques', next='list_videos_cat', - title='Chroniques' + title='Chroniques', + window_title='Chroniques' ) }) @@ -124,6 +130,7 @@ def list_shows(params): ) +@common.plugin.cached(common.cache_time) def list_videos(params): videos = [] if params.next == 'list_videos_cat': @@ -142,7 +149,17 @@ def list_videos(params): for video in json_category: video_id = video['id_pfv'].encode('utf-8') category = video['category'].encode('utf-8') - date_time = video['date'].encode('utf-8') # 2017-02-10 22:05:02 + date_time = video['date'].encode('utf-8') + # 2017-02-10 22:05:02 + date_time = date_time.split(' ')[0] + date_splited = date_time.split('-') + year = date_splited[0] + mounth = date_splited[1] + day = date_splited[2] + aired = '-'.join((year, mounth, day)) + date = '.'.join((day, mounth, year)) + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) title = video['title'].encode('utf-8') description = video['description'].encode('utf-8') thumb = video['preview169'].encode('utf-8') @@ -154,10 +171,10 @@ def list_videos(params): 'video': { 'title': title, 'plot': description, - # 'aired': aired, - # 'date': date, + 'aired': aired, + 'date': date, #'duration': duration, - #'year': year, + 'year': year, 'genre': category, 'mediatype': 'tvshow' } @@ -182,11 +199,10 @@ def list_videos(params): common.sp.xbmcplugin.SORT_METHOD_DATE, common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, common.sp.xbmcplugin.SORT_METHOD_GENRE, - common.sp.xbmcplugin.SORT_METHOD_UNSORTED + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, ), content='tvshows') def get_video_URL(params): return params.video_urlhd - diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/lequipe.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/lequipe.py new file mode 100644 index 0000000..01ea101 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/lequipe.py @@ -0,0 +1,249 @@ +# -*- coding: utf-8 -*- +""" + Catch-up TV & More + Copyright (C) 2017 SylvainCecchetto + + This file is part of Catch-up TV & More. + + Catch-up TV & More is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Catch-up TV & More is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Catch-up TV & More; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" + +from bs4 import BeautifulSoup as bs +from resources.lib import utils +from resources.lib import common +import re +import ast + +auth = '?auth=1487366549-2688-mbe66p57-9b64a7bdc99718f9fc20facf756f8be9' + +dailymotion_url = 'https://www.dailymotion.com/cdn/manifest/video/' + +url_root = 'https://www.lequipe.fr' + +categories = { + 'https://www.lequipe.fr/lachainelequipe/morevideos/0/': 'Tout', + 'https://www.lequipe.fr/lachainelequipe/morevideos/1/': 'L\'Équipe du soir', + 'https://www.lequipe.fr/lachainelequipe/morevideos/62/': 'L\'Équipe Type', + 'https://www.lequipe.fr/lachainelequipe/morevideos/88/': 'L\'Équipe Enquête', + 'https://www.lequipe.fr/lachainelequipe/morevideos/46/': 'Esprit Bleu' +} + +correct_mounth = { + 'JANV.': '01', + 'FÉVR.': '02', + 'MARS.': '03', + 'AVRI': '04', + 'MAI': '05', + 'JUIN': '06', + 'JUIL.': '07', + 'AOÛT': '08', + 'SEPT.': '09', + 'OCTO.': '10', + 'NOVE.': '11', + 'DECE.': '12' +} + + +def channel_entry(params): + if 'list_shows' in params.next: + return list_shows(params) + elif 'list_videos' in params.next: + return list_videos(params) + elif 'play' in params.next: + return get_video_url(params) + else: + return None + + +@common.plugin.cached(common.cache_time) +def list_shows(params): + shows = [] + + for category_url, category_name in categories.iteritems(): + + shows.append({ + 'label': category_name, + 'url': common.plugin.get_url( + action='channel_entry', + category_url=category_url, + page='1', + category_name=category_name, + next='list_videos', + window_title=category_name + ) + }) + + return common.plugin.create_listing( + shows, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_LABEL)) + + +@common.plugin.cached(common.cache_time) +def list_videos(params): + videos = [] + if 'previous_listing' in params: + videos = ast.literal_eval(params['previous_listing']) + + + url = params.category_url + params.page + file_path = utils.download_catalog( + url, + '%s_%s_%s.html' % ( + params.channel_name, + params.category_name, + params.page)) + root_html = open(file_path).read() + root_soup = bs(root_html, 'html.parser') + + category_soup = root_soup.find_all( + 'a', + class_='colead') + + for program in category_soup: + url = program['href'].encode('utf-8') + + title = program.find( + 'h2').get_text().encode('utf-8') + colead__image = program.find( + 'div', + class_='colead__image') + img = colead__image.find( + 'img')['data-src'].encode('utf-8') + + views = colead__image.find( + 'span', + class_='colead__layerText--topright' + ).get_text().encode('utf-8') + + views = [int(s) for s in views.split() if s.isdigit()] + views = views[0] + + date = colead__image.find( + 'span', + class_='colead__layerText--bottomleft' + ).get_text().encode('utf-8') # 10 FÉVR. 2017 | 08:20 + date = date.split(' ') + day = date[0] + try: + mounth = correct_mounth[date[1]] + except: + mounth = '00' + year = date[2] + + date = '.'.join((day, mounth, year)) + aired = '-'.join((year, mounth, day)) + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) + + duration_string = colead__image.find( + 'span', + class_='colead__layerText--bottomright' + ).get_text().encode('utf-8') + duration_list = duration_string.split(':') + duration = int(duration_list[0]) * 60 + int(duration_list[1]) + + info = { + 'video': { + 'title': title, + 'playcount': views, + 'aired': aired, + 'date': date, + 'duration': duration, + 'year': year, + 'mediatype': 'tvshow' + } + } + + videos.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + url=url + ), + 'is_playable': True, + 'info': info + }) + + # More videos... + videos.append({ + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + category_url=params.category_url, + category_name=params.category_name, + next='list_videos', + page=str(int(params.page) + 1), + update_listing=True, + previous_listing=str(videos) + ), + }) + + return common.plugin.create_listing( + videos, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_PLAYCOUNT, + common.sp.xbmcplugin.SORT_METHOD_DATE, + common.sp.xbmcplugin.SORT_METHOD_DURATION, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE + ), + content='tvshows', + update_listing='update_listing' in params, + ) + + +@common.plugin.cached(common.cache_time) +def get_video_url(params): + url = url_root + params.url + html_video_equipe = utils.get_webcontent( + url) + + url_daily = re.compile( + r'<iframe src="//(.*?)"', re.DOTALL).findall(html_video_equipe)[0] + + url_daily = 'http://' + url_daily + + html_daily = utils.get_webcontent( + url_daily,) + + html_daily = html_daily.replace('\\', '') + + urls_mp4 = re.compile( + r'{"type":"video/mp4","url":"(.*?)"}],"(.*?)":').findall(html_daily) + + for url, quality in urls_mp4: + if quality == '480': + url_sd = url + elif quality == '720': + url_hd = url + elif quality == '1080': + url_hdplus = url + url_default = url + + desired_quality = common.plugin.get_setting( + params.channel_id + '.quality') + + if desired_quality == 'HD+' and url_hdplus is not None: + return url_hdplus + elif desired_quality == 'HD' and url_hd is not None: + return url_hd + elif desired_quality == 'SD' and url_sd is not None: + return url_sd + else: + return url_default diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/nrj.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/nrj.py new file mode 100644 index 0000000..e038c21 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/nrj.py @@ -0,0 +1,392 @@ +# -*- coding: utf-8 -*- +""" + Catch-up TV & More + Copyright (C) 2017 SylvainCecchetto + + This file is part of Catch-up TV & More. + + Catch-up TV & More is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Catch-up TV & More is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Catch-up TV & More; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" + +from resources.lib import utils +from resources.lib import common +from bs4 import BeautifulSoup as bs + +url_replay = 'http://www.nrj-play.fr/%s/replay' +# channel_name (nrj12, ...) + +url_root = 'http://www.nrj-play.fr' + + +def channel_entry(params): + if 'list_shows' in params.next: + return list_shows(params) + elif 'list_videos' in params.next: + return list_videos(params) + elif 'play' in params.next: + return get_video_url(params) + else: + return None + + +@common.plugin.cached(common.cache_time) +def list_shows(params): + shows = [] + + if 'list_shows_1' in params.next: + # Build categories list (Tous les programmes, Séries, ...) + file_path = utils.download_catalog( + url_replay % params.channel_name, + '%s_replay.html' % params.channel_name, + ) + replay_html = open(file_path).read() + replay_soup = bs(replay_html, 'html.parser') + + categories_soup = replay_soup.find_all( + 'li', + class_='subNav-menu-item') + + for category in categories_soup: + url_category = category.find('a')['href'].encode('utf-8') + title_category = category.find('a').get_text().encode('utf-8') + + shows.append({ + 'label': title_category, + 'url': common.plugin.get_url( + action='channel_entry', + url_category=url_category, + next='list_shows_programs', + title_category=title_category, + window_title=title_category + ) + }) + + elif 'list_shows_programs' in params.next: + # Build category's programs list + # (Crimes, tellement vrai, Le mad mag, ...) + file_path = utils.download_catalog( + url_root + params.url_category, + '%s_%s_category.html' % ( + params.channel_name, + params.title_category), + ) + category_html = open(file_path).read() + category_soup = bs(category_html, 'html.parser') + + programs_soup = category_soup.find_all( + 'div', + class_='linkProgram') + + for program in programs_soup: + title = program.find( + 'h2', + class_='linkProgram-title').get_text().encode('utf-8') + + title = ' '.join(title.split()) + + url = program.find('a')['href'].encode('utf-8') + img = program.find('img')['src'].encode('utf-8') + + shows.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_seasons', + url_program=url, + title_program=title, + window_title=title + ), + }) + + elif 'list_shows_seasons' in params.next: + file_path = utils.download_catalog( + url_root + params.url_program, + '%s_%s_program.html' % ( + params.channel_name, + params.title_program), + ) + program_html = open(file_path).read() + program_soup = bs(program_html, 'html.parser') + program_url = program_soup.find( + 'a', + class_='pushProgram-link')['href'].encode('utf-8') + + file_path = utils.download_catalog( + url_root + program_url, + '%s_%s_program_fiche.html' % ( + params.channel_name, + params.title_program), + ) + program_html = open(file_path).read() + program_soup = bs(program_html, 'html.parser') + + seasons_soup = program_soup.find( + 'ul', + class_='seasonsBox-list') + + if seasons_soup is not None: + for season in seasons_soup.find_all('li'): + title_season = season.find( + 'a').get_text().encode('utf-8') + season_url = season.find('a')['href'].encode('utf-8') + + shows.append({ + 'label': title_season, + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_season_categories', + season_url=season_url, + title_program=params.title_program, + title_season=title_season, + window_title=title_season + ), + }) + + else: + params['next'] = 'list_shows_season_categories' + params['season_url'] = program_url + params['title_program'] = params.title_program + params['title_season'] = 'no_season' + params['window_title'] = params.window_title + return list_shows(params) + + elif 'list_shows_season_categories': + # Build program's categories + # (Les vidéos, les actus, les bonus, ...) + file_path = utils.download_catalog( + url_root + params.season_url, + '%s_%s_%s_program_season.html' % ( + params.channel_name, + params.title_program, + params.title_season), + ) + program_html = open(file_path).read() + program_soup = bs(program_html, 'html.parser') + + # We have to find all 'flag-category' tag and all title h2 + + season_categories = {} + flag_categories_soup = program_soup.find_all( + 'a', + attrs={'class': 'flag-category'}) + for flag_category in flag_categories_soup: + season_category_title = flag_category.get_text().encode('utf-8') + if season_category_title == '': + season_category_title = 'No name' + season_categories[season_category_title] = 'flag_category' + + titles_h2 = program_soup.find_all( + 'h2', + attrs={'class': 'title-2'}) + + for title_h2 in titles_h2: + if 'itemprop' not in title_h2.attrs: + separator = title_h2.parent.find( + 'div', + class_='separator-wrap') + if separator: + url = separator.find('a')['href'].encode('utf-8') + season_categories[title_h2.get_text().encode( + 'utf-8')] = url + + for season_category_title, \ + season_category_url in season_categories.iteritems(): + shows.append({ + 'label': season_category_title, + 'url': common.plugin.get_url( + action='channel_entry', + next='list_videos', + season_category_url=season_category_url, + season_url=params.season_url, + season_category_title=season_category_title, + page='1', + window_title=season_category_title + ), + }) + + return common.plugin.create_listing( + shows, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE + ), + ) + + +@common.plugin.cached(common.cache_time) +def list_videos(params): + videos = [] + + # flag_category case + if 'flag_category' in params.season_category_url: + program_html = utils.get_webcontent( + url_root + params.season_url + ) + program_soup = bs(program_html, 'html.parser') + + videos_soup = program_soup.find_all( + 'div', + attrs={'class': 'thumbnail', 'itemprop': 'video'}) + for video in videos_soup: + current_flag_category = video.find( + 'a', + attrs={'class': 'flag-category'}).get_text().encode('utf-8') + if current_flag_category == '': + current_flag_category = 'No name' + if current_flag_category and current_flag_category \ + == params.season_category_title: + + title_soup = video.find( + 'h3', + class_='thumbnail-title') + url = title_soup.find('a')['href'].encode('utf-8') + + title = title_soup.get_text().encode('utf-8') + title = ' '.join(title.split()) + + img = video.find('img')['src'].encode('utf-8') + try: + date = video.find('time').get_text() + date = date.encode('utf-8').split(' ')[1] + date_splited = date.split('/') + day = date_splited[0] + mounth = date_splited[1] + year = date_splited[2] + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) + date = '.'.join((day, mounth, year)) + aired = '-'.join((year, mounth, day)) + except: + date = '' + aired = '' + year = '' + + info = { + 'video': { + 'title': title, + 'aired': aired, + 'date': date, + 'year': year, + 'mediatype': 'tvshow' + } + } + + videos.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + url_video=url + ), + 'is_playable': True, + 'info': info + }) + # others url case + else: + program_html = utils.get_webcontent( + url_root + params.season_category_url + '?page=' + params.page + ) + program_soup = bs(program_html, 'html.parser') + + videos_soup = program_soup.find_all( + 'div', + attrs={'class': 'item col-xs-6 col-md-4'}) + for video in videos_soup: + + title_soup = video.find( + 'h3', + class_='thumbnail-title') + url = title_soup.find('a')['href'].encode('utf-8') + + title = title_soup.get_text().encode('utf-8') + title = ' '.join(title.split()) + + img = video.find('img')['src'].encode('utf-8') + try: + date = video.find('time').get_text() + date = date.encode('utf-8').split(' ')[1] + except: + date = video.find('time').get_text().encode('utf-8') + + date_splited = date.split('/') + day = date_splited[0] + mounth = date_splited[1] + year = date_splited[2] + + date = '.'.join((day, mounth, year)) + aired = '-'.join((year, mounth, day)) + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) + info = { + 'video': { + 'title': title, + 'aired': aired, + 'date': date, + 'year': year, + 'mediatype': 'tvshow' + } + } + + videos.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + url_video=url + ), + 'is_playable': True, + 'info': info + }) + + # More videos... + videos.append({ + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_videos', + season_category_url=params.season_category_url, + season_url=params.season_url, + season_category_title=params.season_category_title, + page=str(int(params.page) + 1), + window_title=params.window_title + ) + + }) + + return common.plugin.create_listing( + videos, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_DATE, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE + ), + content='tvshows') + + +@common.plugin.cached(common.cache_time) +def get_video_url(params): + if url_root in params.url_video: + url_video = params.url_video + else: + url_video = url_root + params.url_video + video_html = utils.get_webcontent( + url_video) + video_soup = bs(video_html, 'html.parser') + return video_soup.find( + 'meta', + attrs={'itemprop': 'contentUrl'})['content'].encode('utf-8') diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/numero23.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/numero23.py new file mode 100644 index 0000000..8f20db7 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/numero23.py @@ -0,0 +1,234 @@ +# -*- coding: utf-8 -*- +""" + Catch-up TV & More + Copyright (C) 2017 SylvainCecchetto + + This file is part of Catch-up TV & More. + + Catch-up TV & More is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + Catch-up TV & More is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with Catch-up TV & More; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +""" + +from bs4 import BeautifulSoup as bs +from resources.lib import utils +from resources.lib import common +import ast +import re + +url_root = 'http://www.numero23.fr/replay/' + + +def channel_entry(params): + if 'list_shows' in params.next: + return list_shows(params) + elif 'list_videos' in params.next: + return list_videos(params) + elif 'play' in params.next: + return get_video_url(params) + else: + return None + + +@common.plugin.cached(common.cache_time) +def list_shows(params): + shows = [] + if 'previous_listing' in params: + shows = ast.literal_eval(params['previous_listing']) + unique_item = {} + if 'unique_item' in params: + unique_item = ast.literal_eval(params['unique_item']) + + if params.next == 'list_shows_1': + file_path = utils.download_catalog( + url_root, + params.channel_name + '.html') + root_html = open(file_path).read() + root_soup = bs(root_html, 'html.parser') + + categories_soup = root_soup.find( + 'div', + class_='nav-programs' + ) + + for category in categories_soup.find_all('a'): + category_name = category.find('span').get_text().encode('utf-8') + category_url = category['href'].encode('utf-8') + + shows.append({ + 'label': category_name, + 'url': common.plugin.get_url( + action='channel_entry', + category_url=category_url, + next='list_shows_cat', + window_title=category_name, + category_name=category_name, + page='1' + ) + }) + + elif params.next == 'list_shows_cat': + url_splited = params.category_url.split('?') + url_category = url_splited[0] + 'page/' + \ + params.page + '/?' + url_splited[1] + file_path = utils.download_catalog( + url_category, + '%s_%s.html' % (params.channel_name, params.category_name) + ) + category_html = open(file_path).read() + category_soup = bs(category_html, 'html.parser') + + programs_soup = category_soup.find( + 'div', + class_='videos replay' + ) + for program in programs_soup.find_all('div', class_='program'): + program_name_url = program.find('h3').find('a') + program_name = program_name_url.get_text().encode('utf-8') + if program_name not in unique_item: + unique_item[program_name] = program_name + program_url = program_name_url['href'].encode('utf-8') + program_img = program.find('img')['src'].encode('utf-8') + + shows.append({ + 'label': program_name, + 'thumb': program_img, + 'url': common.plugin.get_url( + action='channel_entry', + program_url=program_url, + next='list_videos', + window_title=program_name, + program_name=program_name + ) + }) + + # More videos... + shows.append({ + 'label': common.addon.get_localized_string(30108), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_cat', + page=str(int(params.page) + 1), + window_title=params.window_title, + update_listing=True, + unique_item=str(unique_item), + category_url=params.category_url, + category_name=params.category_name, + previous_listing=str(shows) + + ) + }) + + return common.plugin.create_listing( + shows, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_LABEL + ), + update_listing='update_listing' in params, + ) + + +@common.plugin.cached(common.cache_time) +def list_videos(params): + videos = [] + + file_path = utils.download_catalog( + params.program_url, + '%s_%s.html' % (params.channel_name, params.program_name) + ) + program_html = open(file_path).read() + program_soup = bs(program_html, 'html.parser') + + videos_soup = program_soup.find_all('div', class_='box program') + + if len(videos_soup) == 0: + videos_soup = program_soup.find_all( + 'div', class_='program sticky video') + + for video in videos_soup: + video_title = video.find( + 'p').get_text().encode('utf-8').replace( + '\n', ' ').replace('\r', ' ').rstrip('\r\n') + video_img = video.find('img')['src'].encode('utf-8') + video_url = video.find('a')['href'].encode('utf-8') + + info = { + 'video': { + 'title': video_title, + 'mediatype': 'tvshow' + } + } + + videos.append({ + 'label': video_title, + 'thumb': video_img, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + video_url=video_url + ), + 'is_playable': True, + 'info': info + }) + + return common.plugin.create_listing( + videos, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE + ), + content='tvshows') + + +@common.plugin.cached(common.cache_time) +def get_video_url(params): + video_html = utils.get_webcontent( + params.video_url + ) + video_soup = bs(video_html, 'html.parser') + video_id = video_soup.find( + 'div', class_='video')['data-video-id'].encode('utf-8') + + url_daily = 'http://www.dailymotion.com/embed/video/' + video_id + + html_daily = utils.get_webcontent( + url_daily,) + + html_daily = html_daily.replace('\\', '') + + urls_mp4 = re.compile( + r'{"type":"video/mp4","url":"(.*?)"}],"(.*?)"').findall(html_daily) + + for url, quality in urls_mp4: + if quality == '480': + url_sd = url + elif quality == '720': + url_hd = url + elif quality == '1080': + url_hdplus = url + else: + continue + url_default = url + + desired_quality = common.plugin.get_setting( + params.channel_id + '.quality') + + if desired_quality == 'HD+' and url_hdplus is not None: + return url_hdplus + elif desired_quality == 'HD' and url_hd is not None: + return url_hd + elif desired_quality == 'SD' and url_sd is not None: + return url_sd + else: + return url_default diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/pluzz.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/pluzz.py index 2c1ddaf..a64d7d0 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/pluzz.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/pluzz.py @@ -21,41 +21,91 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ +# Liste A à Z +# Si FR3 ou FR1 : Régions + + import json from resources.lib import utils from resources.lib import common - -channelCatalog = 'http://pluzz.webservices.francetelevisions.fr/' \ - 'pluzz/liste/type/replay/nb/10000/chaine/%s' - -showInfo = 'http://webservices.francetelevisions.fr/tools/getInfosOeuvre/v2/' \ - '?idDiffusion=%s&catalogue=Pluzz' - -imgURL = 'http://refonte.webservices.francetelevisions.fr%s' - -categories = {"france2": "France 2", - "france3": "France 3", - "france4": "France 4", - "france5": "France 5", - "franceo": "France Ô", - "guadeloupe": "Guadeloupe 1ère", - "guyane": "Guyane 1ère", - "martinique": "Martinique 1ère", - "mayotte": "Mayotte 1ère", - "nouvellecaledonie": "Nouvelle Calédonie 1ère", - "polynesie": "Polynésie 1ère", - "reunion": "Réunion 1ère", - "saintpierreetmiquelon": "St-Pierre et Miquelon 1ère", - "wallisetfutuna": "Wallis et Futuna 1ère", - "sport": "Sport", - "info": "Info", - "documentaire": "Documentaire", - "seriefiction": "Série & fiction", - "magazine": "Magazine", - "jeunesse": "Jeunesse", - "divertissement": "Divertissement", - "jeu": "Jeu", - "culture": "Culture"} +import ast + +channel_catalog = 'http://pluzz.webservices.francetelevisions.fr/' \ + 'pluzz/liste/type/replay/nb/10000/chaine/%s' +# channel_catalog = 'https://pluzz.webservices.francetelevisions.fr/' \ +# 'mobile/liste/type/replay/chaine/%s/nb/20/debut/%s' +# page inc: 20 + +show_info = 'http://webservices.francetelevisions.fr/tools/' \ + 'getInfosOeuvre/v2/?idDiffusion=%s&catalogue=Pluzz' + +url_img = 'http://refonte.webservices.francetelevisions.fr%s' + +url_search = 'https://pluzz.webservices.francetelevisions.fr/' \ + 'mobile/recherche/nb/20/tri/date/requete/%s/debut/%s' + +url_alpha = 'https://pluzz.webservices.francetelevisions.fr/' \ + 'mobile/liste/type/replay/tri/alpha/sens/%s/nb/100/' \ + 'debut/%s/lastof/1' +# sens: asc or desc +# page inc: 100 + +categories_display = { + "france2": "France 2", + "france3": "France 3", + "france4": "France 4", + "france5": "France 5", + "franceo": "France Ô", + "guadeloupe": "Guadeloupe 1ère", + "guyane": "Guyane 1ère", + "martinique": "Martinique 1ère", + "mayotte": "Mayotte 1ère", + "nouvellecaledonie": "Nouvelle Calédonie 1ère", + "polynesie": "Polynésie 1ère", + "reunion": "Réunion 1ère", + "saintpierreetmiquelon": "St-Pierre et Miquelon 1ère", + "wallisetfutuna": "Wallis et Futuna 1ère", + "sport": "Sport", + "info": "Info", + "documentaire": "Documentaire", + "seriefiction": "Série & fiction", + "magazine": "Magazine", + "jeunesse": "Jeunesse", + "divertissement": "Divertissement", + "jeu": "Jeu", + "culture": "Culture" +} + +categories = { + 'Toutes catégories': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/chaine/%s/nb/20/debut/%s', + 'Info': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/info/nb/20/debut/%s', + 'Documentaire': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/documentaire/nb/20/debut/%s', + 'Série & Fiction': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/seriefiction/nb/20/debut/%s', + 'Magazine': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/magazine/nb/20/debut/%s', + 'Culture': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/culture/nb/20/debut/%s', + 'Jeunesse': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/jeunesse/nb/20/debut/%s', + 'Divertissement': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/divertissement/nb/20/debut/%s', + 'Sport': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/sport/nb/20/debut/%s', + 'Jeu': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/rubrique/jeu/nb/20/debut/%s', + 'Version multilingue (VM)': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/filtre/multilingue/type/replay/nb/20/debut/%s', + 'Sous-titrés': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/filtre/soustitrage/type/replay/nb/20/debut/%s', + 'Audiodescription (AD)': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/filtre/audiodescription/type/replay/nb/20/debut/%s', + 'Tous publics': 'https://pluzz.webservices.francetelevisions.fr/' + 'mobile/liste/type/replay/filtre/touspublics/nb/20/debut/%s' +} def channel_entry(params): @@ -65,38 +115,51 @@ def channel_entry(params): return list_videos(params) elif 'play' in params.next: return get_video_URL(params) + elif 'search' in params.next: + return search(params) + + +@common.plugin.cached(common.cache_time) +def change_to_nicer_name(original_name): + if original_name in categories_display: + return categories_display[original_name] + return original_name @common.plugin.cached(common.cache_time) def list_shows(params): shows = [] - uniqueItem = dict() + if 'previous_listing' in params: + shows = ast.literal_eval(params['previous_listing']) - realChannel = params.channel_name - if params.channel_name == 'la_1ere': - realChannel = 'la_1ere_reunion%2C' \ - 'la_1ere_guyane%2C' \ - 'la_1ere_polynesie%2C' \ - 'la_1ere_martinique%2C' \ - 'la_1ere_mayotte%2C' \ - 'la_1ere_nouvellecaledonie%2C' \ - 'la_1ere_guadeloupe%2C' \ - 'la_1ere_wallisetfutuna%2C' \ - 'la_1ere_saintpierreetmiquelon' - - url_json = channelCatalog % (realChannel) - filePath = utils.download_catalog( - url_json, - '%s.json' % (params.channel_name)) - filPrgm = open(filePath).read() - jsonParser = json.loads(filPrgm) - emissions = jsonParser['reponse']['emissions'] + unique_item = dict() + real_channel = params.channel_name + if params.channel_name == 'la_1ere': + real_channel = 'la_1ere_reunion%2C' \ + 'la_1ere_guyane%2C' \ + 'la_1ere_polynesie%2C' \ + 'la_1ere_martinique%2C' \ + 'la_1ere_mayotte%2C' \ + 'la_1ere_nouvellecaledonie%2C' \ + 'la_1ere_guadeloupe%2C' \ + 'la_1ere_wallisetfutuna%2C' \ + 'la_1ere_saintpierreetmiquelon' + + # Level 0 if params.next == 'list_shows_1': + url_json = channel_catalog % (real_channel) + file_path = utils.download_catalog( + url_json, + '%s.json' % ( + params.channel_name)) + file_prgm = open(file_path).read() + json_parser = json.loads(file_prgm) + emissions = json_parser['reponse']['emissions'] for emission in emissions: rubrique = emission['rubrique'].encode('utf-8') - if rubrique not in uniqueItem: - uniqueItem[rubrique] = rubrique + if rubrique not in unique_item: + unique_item[rubrique] = rubrique rubrique_title = change_to_nicer_name(rubrique) shows.append({ @@ -104,32 +167,121 @@ def list_shows(params): 'url': common.plugin.get_url( action='channel_entry', rubrique=rubrique, - next='list_shows_2' + next='list_shows_2_cat', + window_title=rubrique_title ) }) - sort_methods = ( - common.sp.xbmcplugin.SORT_METHOD_UNSORTED, - common.sp.xbmcplugin.SORT_METHOD_LABEL - ) - - shows = common.plugin.create_listing( - shows, - sort_methods=sort_methods - ) - - elif params.next == 'list_shows_2': + # Last videos + shows.append({ + 'label': common.addon.get_localized_string(30104), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_last', + page='0', + window_title=common.addon.get_localized_string(30104) + ) + }) + + # Search + shows.append({ + 'label': common.addon.get_localized_string(30103), + 'url': common.plugin.get_url( + action='channel_entry', + next='search', + page='0', + window_title=common.addon.get_localized_string(30103) + ) + }) + + # from A to Z + shows.append({ + 'label': common.addon.get_localized_string(30105), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_from_a_to_z', + window_title=common.addon.get_localized_string(30105) + ) + }) + + # level 1 + elif 'list_shows_from_a_to_z' in params.next: + shows.append({ + 'label': common.addon.get_localized_string(30106), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_2_from_a_to_z_categories', + page='0', + url=url_alpha % ('asc', '%s'), + sens='asc', + rubrique='no_rubrique', + window_title=params.window_title + ) + }) + shows.append({ + 'label': common.addon.get_localized_string(30107), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_2_from_a_to_z_categories', + page='0', + url=url_alpha % ('desc', '%s'), + sens='desc', + rubrique='no_rubrique', + window_title=params.window_title + ) + }) + + # level 1 + elif 'list_shows_last' in params.next: + for title, url in categories.iteritems(): + if 'Toutes catégories' in title: + url = url % (params.channel_name, '%s') + shows.append({ + 'label': title, + 'url': common.plugin.get_url( + action='channel_entry', + next='list_videos_last', + page='0', + url=url, + title=title, + window_title=title + ) + }) + + # level 1 or 2 + elif 'list_shows_2' in params.next: + if 'list_shows_2_cat' in params.next: + url_json = channel_catalog % (real_channel) + file_path = utils.download_catalog( + url_json, + '%s.json' % ( + params.channel_name)) + elif 'list_shows_2_from_a_to_z_categories' in params.next: + url_json = url_alpha % (params.sens, params.page) + file_path = utils.download_catalog( + url_json, + '%s_%s_%s_alpha.json' % ( + params.channel_name, + params.sens, + params.page)) + + file_prgm = open(file_path).read() + json_parser = json.loads(file_prgm) + emissions = json_parser['reponse']['emissions'] for emission in emissions: rubrique = emission['rubrique'].encode('utf-8') - if rubrique == params.rubrique: + chaine_id = emission['chaine_id'].encode('utf-8') + if ('from_a_to_z' in params.next and + chaine_id == params.channel_name) or \ + rubrique == params.rubrique: titre_programme = emission['titre_programme'].encode('utf-8') if titre_programme != '': id_programme = emission['id_programme'].encode('utf-8') if id_programme == '': id_programme = emission['id_emission'].encode('utf-8') - if id_programme not in uniqueItem: - uniqueItem[id_programme] = id_programme - icon = imgURL % (emission['image_large']) + if id_programme not in unique_item: + unique_item[id_programme] = id_programme + icon = url_img % (emission['image_large']) genre = emission['genre'] accroche_programme = emission['accroche_programme'] @@ -143,78 +295,154 @@ def list_shows(params): shows.append({ 'label': titre_programme, 'thumb': icon, + 'fanart': icon, 'url': common.plugin.get_url( action='channel_entry', next='list_videos_1', id_programme=id_programme, + search=False, + page='0', + window_title=titre_programme, + fanart=icon ), 'info': info }) + if params.next == 'list_shows_2_from_a_to_z_categories': + # More videos... + shows.append({ + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_shows_2_from_a_to_z_categories', + sens=params.sens, + page=str(int(params.page) + 100), + window_title=params.window_title, + rubrique='no_rubrique', + update_listing=True, + previous_listing=str(shows) + ) + }) - sort_methods = ( + return common.plugin.create_listing( + shows, + sort_methods=( common.sp.xbmcplugin.SORT_METHOD_UNSORTED, common.sp.xbmcplugin.SORT_METHOD_LABEL - ) + ), + update_listing='update_listing' in params, + ) - shows = common.plugin.create_listing( - shows, - sort_methods=sort_methods - ) - return shows +@common.plugin.cached(common.cache_time) +def list_videos(params): + videos = [] + if 'previous_listing' in params: + videos = ast.literal_eval(params['previous_listing']) + + if 'search' in params.next: + file_path = utils.download_catalog( + url_search % (params.query, params.page), + '%s_%s_search.json' % (params.channel_name, params.query), + force_dl=True + ) + elif 'last' in params.next: + file_path = utils.download_catalog( + params.url % params.page, + '%s_%s_%s_last.json' % ( + params.channel_name, + params.page, + params.title) + ) -@common.plugin.cached(common.cache_time) -def change_to_nicer_name(original_name): - if original_name in categories: - return categories[original_name] - return original_name + elif 'from_a_to_z' in params.next: + file_path = utils.download_catalog( + params.url % params.page, + '%s_%s_%s_last.json' % ( + params.channel_name, + params.page, + params.sens) + ) + else: + file_path = utils.download_catalog( + channel_catalog % params.channel_name, + '%s.json' % params.channel_name + ) + file_prgm = open(file_path).read() + json_parser = json.loads(file_prgm) + emissions = json_parser['reponse']['emissions'] -@common.plugin.cached(common.cache_time) -def list_videos(params): - videos = [] - filePath = utils.download_catalog( - channelCatalog % (params.channel_name), - '%s.json' % (params.channel_name) - ) - filPrgm = open(filePath).read() - jsonParser = json.loads(filPrgm) - emissions = jsonParser['reponse']['emissions'] for emission in emissions: id_programme = emission['id_programme'].encode('utf-8') if id_programme == '': id_programme = emission['id_emission'].encode('utf-8') - if id_programme == params.id_programme: + if 'search' in params.next \ + or 'last' in params.next \ + or 'from_a_to_z' in params.next \ + or id_programme == params.id_programme: title = '' plot = '' duration = 0 date = '' genre = '' id_diffusion = emission['id_diffusion'] - filPrgm = utils.get_webcontent( - showInfo % (emission['id_diffusion'])) - if(filPrgm != ''): - jsonParserShow = json.loads(filPrgm) - if jsonParserShow['synopsis']: - plot = jsonParserShow['synopsis'].encode('utf-8') - if jsonParserShow['diffusion']['date_debut']: - date = jsonParserShow['diffusion']['date_debut'] + chaine_id = emission['chaine_id'].encode('utf-8') + + # If we are in search or alpha or last videos cases, + # only add channel's shows + if 'search' in params.next or\ + 'from_a_to_z' in params.next or\ + 'last' in params.next: + if chaine_id != params.channel_name: + continue + + file_prgm = utils.get_webcontent( + show_info % (emission['id_diffusion'])) + if(file_prgm != ''): + json_parserShow = json.loads(file_prgm) + if json_parserShow['synopsis']: + plot = json_parserShow['synopsis'].encode('utf-8') + if json_parserShow['diffusion']['date_debut']: + date = json_parserShow['diffusion']['date_debut'] date = date.encode('utf-8') - if jsonParserShow['real_duration']: - duration = int(jsonParserShow['real_duration']) - if jsonParserShow['titre']: - title = jsonParserShow['titre'].encode('utf-8') - if jsonParserShow['sous_titre']: + if json_parserShow['real_duration']: + duration = int(json_parserShow['real_duration']) + if json_parserShow['titre']: + title = json_parserShow['titre'].encode('utf-8') + if json_parserShow['sous_titre']: title = ' '.join(( title, '- [I]', - jsonParserShow['sous_titre'].encode('utf-8'), + json_parserShow['sous_titre'].encode('utf-8'), '[/I]')) - if jsonParserShow['genre'] != '': + if json_parserShow['genre'] != '': genre = \ - jsonParserShow['genre'].encode('utf-8') + json_parserShow['genre'].encode('utf-8') + + episode = 0 + if 'episode' in json_parserShow: + episode = json_parserShow['episode'] + + season = 0 + if 'saison' in json_parserShow: + season = json_parserShow['saison'] + + cast = [] + director = '' + personnes = json_parserShow['personnes'] + for personne in personnes: + fonctions = ' '.join( + x.encode('utf-8') for x in personne['fonctions']) + if 'Acteur' in fonctions: + cast.append( + personne['nom'].encode( + 'utf-8') + ' ' + personne['prenom'].encode( + 'utf-8')) + elif 'Réalisateur' in fonctions: + director = personne['nom'].encode( + 'utf-8') + ' ' + personne['prenom'].encode('utf-8') year = int(date[6:10]) day = date[:2] @@ -223,7 +451,10 @@ def list_videos(params): aired = '-'.join((str(year), month, day)) # date : string (%d.%m.%Y / 01.01.2009) # aired : string (2008-12-07) - image = imgURL % (jsonParserShow['image']) + + # image = url_img % (json_parserShow['image']) + image = json_parserShow['image_secure'] + info = { 'video': { 'title': title, @@ -233,12 +464,17 @@ def list_videos(params): 'duration': duration, 'year': year, 'genre': genre, - 'mediatype': 'tvshow' + 'mediatype': 'tvshow', + 'season': season, + 'episode': episode, + 'cast': cast, + 'director': director } } videos.append({ 'label': title, + 'fanart': image, 'thumb': image, 'url': common.plugin.get_url( action='channel_entry', @@ -249,25 +485,61 @@ def list_videos(params): 'info': info }) - sort_methods = ( - common.sp.xbmcplugin.SORT_METHOD_DATE, - common.sp.xbmcplugin.SORT_METHOD_DURATION, - common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, - common.sp.xbmcplugin.SORT_METHOD_UNSORTED - ) + if 'search' in params.next: + # More videos... + videos.append({ + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + next='list_videos_search', + query=params.query, + page=str(int(params.page) + 20), + window_title=params.window_title, + update_listing=True, + previous_listing=str(videos) + + ) + }) + + elif 'last' in params.next: + # More videos... + videos.append({ + 'label': common.addon.get_localized_string(30100), + 'url': common.plugin.get_url( + action='channel_entry', + url=params.url, + next=params.next, + page=str(int(params.page) + 20), + title=params.title, + window_title=params.window_title, + update_listing=True, + previous_listing=str(videos) + ) + + }) + return common.plugin.create_listing( videos, - sort_methods=sort_methods, - content='tvshows') + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_DATE, + common.sp.xbmcplugin.SORT_METHOD_DURATION, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, + common.sp.xbmcplugin.SORT_METHOD_EPISODE + + ), + content='tvshows', + update_listing='update_listing' in params, + ) @common.plugin.cached(common.cache_time) def get_video_URL(params): - filPrgm = utils.get_webcontent(showInfo % (params.id_diffusion)) - jsonParser = json.loads(filPrgm) + file_prgm = utils.get_webcontent(show_info % (params.id_diffusion)) + json_parser = json.loads(file_prgm) url_HD = '' url_SD = '' - for video in jsonParser['videos']: + for video in json_parser['videos']: if video['format'] == 'hls_v5_os': url_HD = video['url'] if video['format'] == 'm3u8-download': @@ -280,3 +552,20 @@ def get_video_URL(params): return url_HD else: return url_SD + + +def search(params): + keyboard = common.sp.xbmc.Keyboard( + default='', + title='', + hidden=False) + keyboard.doModal() + if keyboard.isConfirmed(): + query = keyboard.getText() + params['next'] = 'list_videos_search' + params['page'] = '0' + params['query'] = query + return list_videos(params) + + else: + return None diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/tf1.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/tf1.py index c10c181..ae6053c 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/channels/fr/tf1.py +++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/tf1.py @@ -24,13 +24,24 @@ from bs4 import BeautifulSoup as bs from resources.lib import utils from resources.lib import common +import json url_root = "http://www.tf1.fr/" +url_time = 'http://www.wat.tv/servertime2/' +url_token = 'http://api.wat.tv/services/Delivery' + +secret_key = 'W3m0#1mFI' +app_name = 'sdk/Iphone/1.0' +version = '2.1.3' +hosting_application_name = 'com.tf1.applitf1' +hosting_application_version = '7.0.4' def channel_entry(params): if 'list_shows' in params.next: return list_shows(params) + elif 'list_videos_categories' in params.next: + return list_videos_categories(params) elif 'list_videos' in params.next: return list_videos(params) elif 'play' in params.next: @@ -66,15 +77,10 @@ def list_shows(params): 'url': common.plugin.get_url( action='channel_entry', category=category_url, - next='list_shows_2')}) - - sort_methods = ( - common.sp.xbmcplugin.SORT_METHOD_UNSORTED, - common.sp.xbmcplugin.SORT_METHOD_LABEL) - - shows = common.plugin.create_listing( - shows, - sort_methods=sort_methods) + next='list_shows_2', + window_title=category_name + ) + }) elif params.next == 'list_shows_2': programs_soup = root_soup.find( @@ -104,17 +110,54 @@ def list_shows(params): 'url': common.plugin.get_url( action='channel_entry', program_url=program_url, - next='list_videos')}) + next='list_videos_categories', + window_title=program_name + ) + }) - sort_methods = ( + return common.plugin.create_listing( + shows, + sort_methods=( common.sp.xbmcplugin.SORT_METHOD_UNSORTED, - common.sp.xbmcplugin.SORT_METHOD_LABEL) + common.sp.xbmcplugin.SORT_METHOD_LABEL + ) + ) + + +@common.plugin.cached(common.cache_time) +def list_videos_categories(params): + videos_categories = [] + url = ''.join(( + url_root, + params.program_url, + '/videos')) + program_html = utils.get_webcontent(url) + program_soup = bs(program_html, 'html.parser') - shows = common.plugin.create_listing( - shows, - sort_methods=sort_methods) + filters_1_soup = program_soup.find( + 'ul', + class_='filters_1') + for li in filters_1_soup.find_all('li'): + category_title = li.get_text().encode('utf-8') + category_id = li.find('a')['data-filter'].encode('utf-8') + videos_categories.append({ + 'label': category_title, + 'url': common.plugin.get_url( + action='channel_entry', + program_url=params.program_url, + next='list_videos', + window_title=category_title, + category_id=category_id + ) + }) + return common.plugin.create_listing( + videos_categories, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_UNSORTED, + common.sp.xbmcplugin.SORT_METHOD_LABEL + ) + ) - return shows @common.plugin.cached(common.cache_time) @@ -124,7 +167,9 @@ def list_videos(params): url = ''.join(( url_root, params.program_url, - '/videos')) + '/videos/', + '?filter=', + params.category_id)) program_html = utils.get_webcontent(url) program_soup = bs(program_html, 'html.parser') @@ -133,91 +178,85 @@ def list_videos(params): class_='grid') for li in grid.find_all('li'): - video_type_string = li.find('strong').get_text().encode('utf-8') - video_type = video_type_string.lower() + video_type_string = li.find('div', class_='description').find('a')['data-xiti-libelle'].encode('utf-8') + video_type_string = video_type_string.split('-')[0] - if 'playlist' not in video_type: - if 'replay' in video_type or \ - 'video' in video_type or \ - common.plugin.get_setting(params.channel_id + '.bonus'): + if 'Playlist' not in video_type_string: + title = li.find( + 'p', + class_='title').get_text().encode('utf-8') - title = li.find( + try: + stitle = li.find( 'p', - class_='title').get_text().encode('utf-8') + class_='stitle').get_text().encode('utf-8') + except: + stitle = '' - try: - stitle = li.find( - 'p', - class_='stitle').get_text().encode('utf-8') - except: - stitle = '' - - try: - duration = li.find( - 'span', - attrs={'data-format': 'duration'}) - duration = int(duration.get_text().encode('utf-8')) - except: - duration = 0 - - img = li.find('img') - try: - img = img['data-srcset'].encode('utf-8') - except: - img = img['srcset'].encode('utf-8') - - img = 'http:' + img.split(',')[-1].split(' ')[0] - - aired = li.find( + try: + duration = li.find( 'span', - attrs={'data-format': None, 'class': 'momentDate'}) - aired = aired.get_text().encode('utf-8') - aired = aired.split('T')[0] - - day = aired.split('-')[2] - mounth = aired.split('-')[1] - year = aired.split('-')[0] - date = '.'.join((day, mounth, year)) - # date : string (%d.%m.%Y / 01.01.2009) - # aired : string (2008-12-07) - program_id = li.find('a')['href'].encode('utf-8') - - if 'replay' not in video_type and 'video' not in video_type: - title = title + ' - [I]' + video_type_string + '[/I]' - - info = { - 'video': { - 'title': title, - 'plot': stitle, - 'aired': aired, - 'date': date, - 'duration': duration, - 'year': int(aired[:4]), - 'mediatype': 'tvshow' - } + attrs={'data-format': 'duration'}) + duration = int(duration.get_text().encode('utf-8')) + except: + duration = 0 + + img = li.find('img') + try: + img = img['data-srcset'].encode('utf-8') + except: + img = img['srcset'].encode('utf-8') + + img = 'http:' + img.split(',')[-1].split(' ')[0] + + # aired = li.find( + # 'span', + # attrs={'data-format': None, 'class': 'momentDate'}) + # aired = aired.get_text().encode('utf-8') + # aired = aired.split('T')[0] + aired = '' + + # day = aired.split('-')[2] + # mounth = aired.split('-')[1] + # year = aired.split('-')[0] + # date = '.'.join((day, mounth, year)) + date ='' + # date : string (%d.%m.%Y / 01.01.2009) + # aired : string (2008-12-07) + program_id = li.find('a')['href'].encode('utf-8') + + info = { + 'video': { + 'title': title, + 'plot': stitle, + 'aired': aired, + 'date': date, + 'duration': duration, + #'year': int(aired[:4]), + 'mediatype': 'tvshow' } + } - videos.append({ - 'label': title, - 'thumb': img, - 'url': common.plugin.get_url( - action='channel_entry', - next='play', - program_id=program_id, - ), - 'is_playable': True, - 'info': info - }) + videos.append({ + 'label': title, + 'thumb': img, + 'url': common.plugin.get_url( + action='channel_entry', + next='play', + program_id=program_id, + ), + 'is_playable': True, + 'info': info + }) - sort_methods = ( - common.sp.xbmcplugin.SORT_METHOD_DATE, - common.sp.xbmcplugin.SORT_METHOD_DURATION, - common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, - common.sp.xbmcplugin.SORT_METHOD_UNSORTED - ) return common.plugin.create_listing( videos, - sort_methods=sort_methods, + sort_methods=( + common.sp.xbmcplugin.SORT_METHOD_DATE, + common.sp.xbmcplugin.SORT_METHOD_DURATION, + common.sp.xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE, + common.sp.xbmcplugin.SORT_METHOD_UNSORTED + ), content='tvshows') @@ -235,4 +274,43 @@ def get_video_url(params): video_id = data_src[-8:] - return 'http://wat.tv/get/ipad/' + video_id + '.m3u8' + timeserver = str(utils.get_webcontent(url_time)) + + auth_key = '%s-%s-%s-%s-%s' % ( + video_id, + secret_key, + app_name, + secret_key, + timeserver + ) + + auth_key = common.sp.md5(auth_key).hexdigest() + auth_key = auth_key + '/' + timeserver + + post_data = { + 'appName': app_name, + 'method': 'getUrl', + 'mediaId': video_id, + 'authKey': auth_key, + 'version': version, + 'hostingApplicationName': hosting_application_name, + 'hostingApplicationVersion': hosting_application_version + } + + url_video = utils.get_webcontent( + url=url_token, + request_type='post', + post_dic=post_data) + url_video = json.loads(url_video) + url_video = url_video['message'].replace('\\', '') + + desired_quality = common.plugin.get_setting( + params.channel_id + '.quality') + + if desired_quality == 'Force HD': + try: + url_video = url_video.split('&bwmax')[0] + except: + pass + + return url_video
\ No newline at end of file diff --git a/plugin.video.catchuptvandmore/resources/lib/common.py b/plugin.video.catchuptvandmore/resources/lib/common.py index 5705b7f..aea8366 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/common.py +++ b/plugin.video.catchuptvandmore/resources/lib/common.py @@ -28,3 +28,12 @@ addon = sp.Addon() cache_time = 10 plugin_name = 'Catch-up TV & More' + + +def get_window_title(): + query = sp.sys.argv[2][1:] + params = plugin.get_params(query) + if 'window_title' in params: + return params.window_title + else: + return plugin_name diff --git a/plugin.video.catchuptvandmore/resources/lib/simpleplugin.py b/plugin.video.catchuptvandmore/resources/lib/simpleplugin.py index f3b6f9d..f3b6f9d 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/simpleplugin.py +++ b/plugin.video.catchuptvandmore/resources/lib/simpleplugin.py diff --git a/plugin.video.catchuptvandmore/resources/lib/skeleton.py b/plugin.video.catchuptvandmore/resources/lib/skeleton.py index cf1c510..d8546d4 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/skeleton.py +++ b/plugin.video.catchuptvandmore/resources/lib/skeleton.py @@ -23,7 +23,7 @@ categories = { 'main_menu.fr': 'French channels' -# 'main_menu.be': 'Belgian channels' + # 'main_menu.be': 'Belgian channels' } channels = { @@ -39,12 +39,18 @@ channels = { 'channels.fr.6play.w9': 'W9', 'channels.fr.tf1.tmc': 'TMC', 'channels.fr.tf1.nt1': 'NT1', - 'channels.fr.6play.nrj12': 'NRJ 12', + 'channels.fr.nrj.nrj12': 'NRJ 12', 'channels.fr.pluzz.france4': 'France 4', 'channels.fr.bfmtv.bfmtv': 'BFM TV', 'channels.fr.itele.itele': 'i-Télé', 'channels.fr.c.cstar': 'CStar', - 'channels.fr.gulli.gulli': 'Gulli' + 'channels.fr.gulli.gulli': 'Gulli', + 'channels.fr.pluzz.franceo': 'France Ô', + 'channels.fr.tf1.hd1': 'HD1', + 'channels.fr.lequipe.lequipe': 'L\'Équipe', + 'channels.fr.6play.6ter': '6ter', + 'channels.fr.numero23.numero23': 'Numéro 23', + 'channels.fr.nrj.cherie25': 'Chérie 25' } diff --git a/plugin.video.catchuptvandmore/resources/lib/utils.py b/plugin.video.catchuptvandmore/resources/lib/utils.py index 7545aa4..5123afb 100755..100644 --- a/plugin.video.catchuptvandmore/resources/lib/utils.py +++ b/plugin.video.catchuptvandmore/resources/lib/utils.py @@ -102,7 +102,7 @@ def download_catalog( r = requests.get(url, headers=headers, params=params) elif request_type == 'post': - r = requests.get( + r = requests.post( url, headers=headers, data=post_dic, params=params) with open(file_path, 'wb') as f: @@ -141,7 +141,7 @@ def get_webcontent( r = requests.get(url, headers=headers, params=params) elif request_type == 'post': - r = requests.get(url, headers=headers, data=post_dic, params=params) + r = requests.post(url, headers=headers, data=post_dic, params=params) return r.content diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter.png Binary files differnew file mode 100644 index 0000000..320cf16 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter_fanart.png Binary files differnew file mode 100644 index 0000000..0fdefb5 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/6ter_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/arte.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/arte.png Binary files differindex 3c003a2..3c003a2 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/arte.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/arte.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv.png Binary files differindex 3ca5f2a..3ca5f2a 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv_fanart.png Binary files differindex 226487f..226487f 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/bfmtv_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/c8.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/c8.png Binary files differindex e18d86c..e18d86c 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/c8.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/c8.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/c8_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/c8_fanart.png Binary files differindex 05a9a6c..05a9a6c 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/c8_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/c8_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus.png Binary files differindex 6829f23..6829f23 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus_fanart.png Binary files differindex 2a2e3b4..2a2e3b4 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/canalplus_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/cherie25.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/cherie25.png Binary files differnew file mode 100644 index 0000000..f4f9d60 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/cherie25.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar.png Binary files differindex 4d3a463..4d3a463 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar_fanart.png Binary files differindex f7c45db..f7c45db 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/cstar_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france2.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france2.png Binary files differindex 6f741cd..6f741cd 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france2.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france2.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france2_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france2_fanart.png Binary files differindex 8184c2a..8184c2a 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france2_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france2_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france3.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france3.png Binary files differindex 3309012..3309012 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france3.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france3.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france3_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france3_fanart.png Binary files differindex dede4f8..dede4f8 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france3_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france3_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france4.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france4.png Binary files differindex a8a1bba..a8a1bba 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france4.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france4.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france5.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france5.png Binary files differindex bc1f6ea..bc1f6ea 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france5.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/france5.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/france5_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/france5_fanart.png Binary files differdeleted file mode 100755 index 3380814..0000000 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/france5_fanart.png +++ /dev/null diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/franceo.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/franceo.png Binary files differnew file mode 100644 index 0000000..b2de049 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/franceo.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli.png Binary files differindex b2e1522..b2e1522 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli_fanart.png Binary files differindex 94739ab..94739ab 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/gulli_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1.png Binary files differnew file mode 100644 index 0000000..c33450f --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1_fanart.png Binary files differnew file mode 100644 index 0000000..665dc6c --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/hd1_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/itele.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/itele.png Binary files differindex 2e1d937..2e1d937 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/itele.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/itele.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/itele_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/itele_fanart.png Binary files differindex 1bca166..1bca166 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/itele_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/itele_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe.png Binary files differnew file mode 100644 index 0000000..90b5b46 --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe_fanart.png Binary files differnew file mode 100644 index 0000000..bfc2dbe --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/lequipe_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/m6.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/m6.png Binary files differindex 24852b7..24852b7 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/m6.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/m6.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/m6_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/m6_fanart.png Binary files differindex f5e8e8e..f5e8e8e 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/m6_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/m6_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12.png Binary files differindex 0c4c9f4..0c4c9f4 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12_fanart.png Binary files differindex 848d9c6..848d9c6 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/nrj12_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1.png Binary files differindex 59c8e33..59c8e33 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1_fanart.png Binary files differindex bc00729..bc00729 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/nt1_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/numero23.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/numero23.png Binary files differnew file mode 100644 index 0000000..c6f154f --- /dev/null +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/numero23.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1.png Binary files differindex 18b7490..18b7490 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1_fanart.png Binary files differindex e23d730..e23d730 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/tf1_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc.png Binary files differindex 2ad9872..2ad9872 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc_fanart.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc_fanart.png Binary files differindex de8fef7..de8fef7 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc_fanart.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/tmc_fanart.png diff --git a/plugin.video.catchuptvandmore/resources/media/channels/fr/w9.png b/plugin.video.catchuptvandmore/resources/media/channels/fr/w9.png Binary files differindex a0c27c4..a0c27c4 100755..100644 --- a/plugin.video.catchuptvandmore/resources/media/channels/fr/w9.png +++ b/plugin.video.catchuptvandmore/resources/media/channels/fr/w9.png diff --git a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-01.jpg b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-01.jpg Binary files differindex 11c6c33..11c6c33 100755..100644 --- a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-01.jpg +++ b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-01.jpg diff --git a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-02.jpg b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-02.jpg Binary files differindex da9e325..da9e325 100755..100644 --- a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-02.jpg +++ b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-02.jpg diff --git a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-03.jpg b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-03.jpg Binary files differindex a5c6b9c..a5c6b9c 100755..100644 --- a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-03.jpg +++ b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-03.jpg diff --git a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-04.jpg b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-04.jpg Binary files differindex 05ee326..05ee326 100755..100644 --- a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-04.jpg +++ b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-04.jpg diff --git a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-05.jpg b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-05.jpg Binary files differindex f7d309f..f7d309f 100755..100644 --- a/plugin.video.catchuptvandmore/resources/screenshots/screenshot-05.jpg +++ b/plugin.video.catchuptvandmore/resources/screenshots/screenshot-05.jpg diff --git a/plugin.video.catchuptvandmore/resources/settings.xml b/plugin.video.catchuptvandmore/resources/settings.xml index 31e8a65..af6fdaa 100755..100644 --- a/plugin.video.catchuptvandmore/resources/settings.xml +++ b/plugin.video.catchuptvandmore/resources/settings.xml @@ -6,7 +6,7 @@ <!-- Hide main menu categories --> <setting label="30010" type="lsep"/> <setting label="30020" type="bool" id="main_menu.fr" default="true"/> -<!-- <setting label="30021" type="bool" id="main_menu.be" default="true"/> --> + <!-- <setting label="30021" type="bool" id="main_menu.be" default="true"/> --> </category> @@ -50,8 +50,8 @@ <setting label="NT1" type="bool" id="channels.fr.tf1.nt1" default="true" visible="eq(-21,true)"/> <setting label="" type="number" visible="false" id="channels.fr.tf1.nt1.order" default="11"/> - <setting label="NRJ 12" type="bool" id="channels.fr.6play.nrj12" default="true" visible="eq(-23,true)"/> - <setting label="" type="number" visible="false" id="channels.fr.6play.nrj12.order" default="12"/> + <setting label="NRJ 12" type="bool" id="channels.fr.nrj.nrj12" default="true" visible="eq(-23,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.nrj.nrj12.order" default="12"/> <setting label="France 4" type="bool" id="channels.fr.pluzz.france4" default="true" visible="eq(-25,true)"/> <setting label="" type="number" visible="false" id="channels.fr.pluzz.france4.order" default="14"/> @@ -68,6 +68,23 @@ <setting label="Gulli" type="bool" id="channels.fr.gulli.gulli" default="true" visible="eq(-33,true)"/> <setting label="" type="number" visible="false" id="channels.fr.gulli.gulli.order" default="18"/> + <setting label="France Ô" type="bool" id="channels.fr.pluzz.franceo" default="true" visible="eq(-35,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.pluzz.franceo.order" default="19"/> + + <setting label="HD1" type="bool" id="channels.fr.tf1.hd1" default="true" visible="eq(-37,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.tf1.hd1.order" default="20"/> + + <setting label="L'Équipe" type="bool" id="channels.fr.lequipe.lequipe" default="true" visible="eq(-39,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.lequipe.lequipe.order" default="21"/> + + <setting label="6ter" type="bool" id="channels.fr.6play.6ter" default="true" visible="eq(-41,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.6play.6ter.order" default="22"/> + + <setting label="Numéro 23" type="bool" id="channels.fr.numero23.numero23" default="true" visible="eq(-43,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.numero23.numero23.order" default="23"/> + + <setting label="Chérie 25" type="bool" id="channels.fr.nrj.cherie25" default="true" visible="eq(-45,true)"/> + <setting label="" type="number" visible="false" id="channels.fr.nrj.cherie25.order" default="25"/> <!-- <setting label="30021" type="lsep" subsetting="true" visible="eq(1,true)"/> <setting label="30021" type="bool" id="main_menu.be" default="true" visible="false"/> <setting label="RTBF" type="bool" id="channels.be.rtbf.rtbf" default="true" visible="eq(-1,true)"/> --> @@ -82,38 +99,59 @@ <setting label="30020" type="bool" id="main_menu.fr" default="true" visible="false"/> <setting label="TF1" type="bool" id="channels.fr.tf1.tf1" default="true" visible="false"/> - <setting label="30070" type="bool" id="channels.fr.tf1.tf1.bonus" default="true" visible="eq(-1,true) + eq(-2,true)"/> + <!-- <setting label="30070" type="bool" id="channels.fr.tf1.tf1.bonus" default="true" visible="eq(-1,true) + eq(-2,true)"/> --> + <setting label="30070" type="bool" id="channels.fr.tf1.tf1.bonus" default="true" visible="false"/> + <setting label="30087" type="labelenum" id="channels.fr.tf1.tf1.quality" visible="eq(-2,true) + eq(-3,true)" values="Force HD|Auto"/> <setting label="France 2" type="bool" id="channels.fr.pluzz.france2" default="true" visible="false"/> - <setting label="30071" type="labelenum" id="channels.fr.pluzz.france2.quality" visible="eq(-1,true) + eq(-4,true)" values="HD|SD"/> + <setting label="30071" type="labelenum" id="channels.fr.pluzz.france2.quality" visible="eq(-1,true) + eq(-5,true)" values="HD|SD"/> <setting label="France 3" type="bool" id="channels.fr.pluzz.france3" default="true" visible="false"/> - <setting label="30072" type="labelenum" id="channels.fr.pluzz.france3.quality" visible="eq(-1,true) + eq(-6,true)" values="HD|SD"/> - - <setting label="France 4" type="bool" id="channels.fr.pluzz.france4" default="true" visible="false"/> - <setting label="30073" type="labelenum" id="channels.fr.pluzz.france4.quality" visible="eq(-1,true) + eq(-8,true)" values="HD|SD"/> - - <setting label="BFM TV" type="bool" id="channels.fr.bfmtv.bfmtv" default="true" visible="false"/> - <setting label="30081" type="labelenum" id="channels.fr.bfmtv.bfmtv.quality" visible="eq(-1,true) + eq(-10,true)" values="HD+|HD|SD|SD-"/> + <setting label="30072" type="labelenum" id="channels.fr.pluzz.france3.quality" visible="eq(-1,true) + eq(-7,true)" values="HD|SD"/> <setting label="France 5" type="bool" id="channels.fr.pluzz.france5" default="true" visible="false"/> - <setting label="30074" type="labelenum" id="channels.fr.pluzz.france5.quality" visible="eq(-1,true) + eq(-12,true)" values="HD|SD"/> - - <setting label="France Ô" type="bool" id="channels.fr.pluzz.franceo" default="true" visible="false"/> - <setting label="30075" type="labelenum" id="channels.fr.pluzz.franceo.quality" visible="eq(-1,true) + eq(-14,true)" values="HD|SD"/> - + <setting label="30074" type="labelenum" id="channels.fr.pluzz.france5.quality" visible="eq(-1,true) + eq(-9,true)" values="HD|SD"/> + <setting label="M6" type="bool" id="channels.fr.6play.m6" default="true" visible="false"/> - <setting label="30076" type="labelenum" id="channels.fr.6play.m6.quality" visible="eq(-1,true) + eq(-16,true)" values="Auto|Force HD|Force SD"/> + <setting label="30076" type="labelenum" id="channels.fr.6play.m6.quality" visible="eq(-1,true) + eq(-11,true)" values="Auto|Force HD|Force SD"/> <setting label="Arte" type="bool" id="channels.fr.arte.arte" default="true" visible="false"/> - <setting label="30079" type="labelenum" id="channels.fr.arte.arte.quality" visible="eq(-1,true) + eq(-18,true)" values="Auto|HD+|HD|SD|SD-"/> - <setting label="30080" type="labelenum" id="channels.fr.arte.arte.language" visible="eq(-2,true) + eq(-19,true)" values="Auto|fr|de|en|es|pl"/> + <setting label="30079" type="labelenum" id="channels.fr.arte.arte.quality" visible="eq(-1,true) + eq(-13,true)" values="Auto|HD+|HD|SD|SD-"/> + + <setting label="30080" type="labelenum" id="channels.fr.arte.arte.language" visible="eq(-2,true) + eq(-14,true)" values="Auto|fr|de"/> <setting label="W9" type="bool" id="channels.fr.6play.w9" default="true" visible="false"/> - <setting label="30077" type="labelenum" id="channels.fr.6play.W9.quality" visible="eq(-1,true) + eq(-21,true)" values="Auto|Force HD|Force SD"/> + <setting label="30077" type="labelenum" id="channels.fr.6play.W9.quality" visible="eq(-1,true) + eq(-16,true)" values="Auto|Force HD|Force SD"/> + + <setting label="TMC" type="bool" id="channels.fr.tf1.tmc" default="true" visible="false"/> + <setting label="30082" type="bool" id="channels.fr.tf1.tmc.bonus" default="true" visible="eq(-1,true) + eq(-18,true)"/> + + <setting label="NT1" type="bool" id="channels.fr.tf1.nt1" default="true" visible="false"/> + <setting label="30083" type="bool" id="channels.fr.tf1.nt1.bonus" default="true" visible="eq(-1,true) + eq(-20,true)"/> + + <setting label="NRJ 12" type="bool" id="channels.fr.nrj.nrj12" default="true" visible="false"/> + <setting label="30085" type="labelenum" id="channels.fr.nrj.nrj12.quality" visible="eq(-1,true) + eq(-22,true)" values="Auto|Force HD|Force SD"/> + + <setting label="France 4" type="bool" id="channels.fr.pluzz.france4" default="true" visible="false"/> + <setting label="30073" type="labelenum" id="channels.fr.pluzz.france4.quality" visible="eq(-1,true) + eq(-24,true)" values="HD|SD"/> + + <setting label="BFM TV" type="bool" id="channels.fr.bfmtv.bfmtv" default="true" visible="false"/> + <setting label="30081" type="labelenum" id="channels.fr.bfmtv.bfmtv.quality" visible="eq(-1,true) + eq(-26,true)" values="HD+|HD|SD|SD-"/> + + <setting label="France Ô" type="bool" id="channels.fr.pluzz.franceo" default="true" visible="false"/> + <setting label="30075" type="labelenum" id="channels.fr.pluzz.franceo.quality" visible="eq(-1,true) + eq(-28,true)" values="HD|SD"/> + + <setting label="HD1" type="bool" id="channels.fr.tf1.hd1" default="true" visible="false"/> + <setting label="30084" type="bool" id="channels.fr.tf1.hd1.bonus" default="true" visible="eq(-1,true) + eq(-30,true)"/> <setting label="6ter" type="bool" id="channels.fr.6play.6ter" default="true" visible="false"/> - <setting label="30078" type="labelenum" id="channels.fr.6play.6ter.quality" visible="eq(-1,true) + eq(-23,true)" values="Auto|Force HD|Force SD"/> + <setting label="30078" type="labelenum" id="channels.fr.6play.6ter.quality" visible="eq(-1,true) + eq(-32,true)" values="Auto|Force HD|Force SD"/> + + <setting label="L'Équipe" type="bool" id="channels.fr.lequipe.lequipe" default="true" visible="false"/> + <setting label="30086" type="labelenum" id="channels.fr.lequipe.lequipe.quality" visible="eq(-1,true) + eq(-34,true)" values="HD+|HD|SD"/> + + <setting label="Numéro 23" type="bool" id="channels.fr.numero23.numero23" default="true" visible="false"/> + <setting label="30088" type="labelenum" id="channels.fr.numero23.numero23.quality" visible="eq(-1,true) + eq(-36,true)" values="HD+|HD|SD"/> <setting label="" type="bool" id="show_hidden_items_information" default="true" visible="false"/> </category> |