summaryrefslogtreecommitdiff
path: root/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py
diff options
context:
space:
mode:
authorSylvain CECCHETTO <cecchetto.sylvain@me.com>2017-03-22 03:24:43 +0100
committerenen92 <enen92@users.noreply.github.com>2017-03-22 02:24:43 +0000
commitaefa7d3d72e3a461ec6db79fe305023395118cf1 (patch)
treed18fbbd269e5372590c3bed3414240adeb48c155 /plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py
parent4802b7e3b5cea3b306712e756226ce37b3e743e9 (diff)
[plugin.video.catchuptvandmore] 0.1.0 (#989)
Diffstat (limited to 'plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py')
-rwxr-xr-xplugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py381
1 files changed, 381 insertions, 0 deletions
diff --git a/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py b/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py
new file mode 100755
index 0000000..d60ebd0
--- /dev/null
+++ b/plugin.video.catchuptvandmore/resources/lib/channels/fr/6play.py
@@ -0,0 +1,381 @@
+# -*- coding: utf-8 -*-
+"""
+ Catch-up TV & More
+ Original work (C) JUL1EN094, SPM, SylvainCecchetto
+ Copyright (C) 2016 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.
+"""
+
+
+import json
+from resources.lib import utils
+from resources.lib import common
+
+
+# Url to get channel's categories
+# e.g. Info, Divertissement, Séries, ...
+# We get an id by category
+url_root = 'http://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/%sreplay/folders?limit=999&offset=0'
+
+# Url to get catgory's programs
+# e.g. Le meilleur patissier, La france à un incroyable talent, ...
+# We get an id by program
+url_category = 'http://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/6play/folders/%s/programs' \
+ '?limit=999&offset=0&csa=9&with=parentcontext'
+
+# Url to get program's subfolders
+# e.g. Saison 5, Les meilleurs moments, les recettes pas à pas, ...
+# We get an id by subfolder
+url_subcategory = 'http://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/6play/programs/%s' \
+ '?with=links,subcats,rights'
+
+
+# Url to get shows list
+# e.g. Episode 1, Episode 2, ...
+url_videos = 'http://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/6play/programs/%s/videos?' \
+ 'csa=6&with=clips,freemiumpacks&type=vi,vc,playlist&limit=999'\
+ '&offset=0&subcat=%s&sort=subcat'
+
+url_videos2 = 'https://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/6play/programs/%s/videos?' \
+ 'csa=6&with=clips,freemiumpacks&type=vi&limit=999&offset=0'
+
+
+url_json_video = 'https://pc.middleware.6play.fr/6play/v2/platforms/' \
+ 'm6group_web/services/6play/videos/%s'\
+ '?csa=9&with=clips,freemiumpacks'
+
+
+url_img = 'https://images.6play.fr/v1/images/%s/raw'
+
+
+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)
+
+
+@common.plugin.cached(common.cache_time)
+def list_shows(params):
+ shows = []
+
+ if params.next == 'list_shows_1':
+ file_path = utils.download_catalog(
+ url_root % (params.channel_name),
+ '%s.json' % (params.channel_name),
+ random_ua=True)
+ file_prgm = open(file_path).read()
+ json_parser = json.loads(file_prgm)
+
+ # do not cache failed catalog fetch
+ # the error format is:
+ # {"error":{"code":403,"message":"Forbidden"}}
+ if isinstance(json_parser, dict) and \
+ 'error' in json_parser.keys():
+ utils.os.remove(file_path)
+ raise Exception('Failed to fetch the 6play catalog')
+
+ for array in json_parser:
+ category_id = str(array['id'])
+ category_name = array['name'].encode('utf-8')
+ shows.append({
+ 'label': category_name,
+ 'url': common.plugin.get_url(
+ action='channel_entry',
+ category_id=category_id,
+ next='list_shows_2',
+ title=category_name
+ )
+ })
+
+ shows = common.plugin.create_listing(
+ shows,
+ sort_methods=(
+ common.sp.xbmcplugin.SORT_METHOD_UNSORTED,
+ common.sp.xbmcplugin.SORT_METHOD_LABEL
+ )
+ )
+
+ elif params.next == 'list_shows_2':
+ file_prgm = utils.get_webcontent(
+ url_category % (params.category_id),
+ random_ua=True)
+ json_parser = json.loads(file_prgm)
+
+ for array in json_parser:
+ program_title = array['title'].encode('utf-8')
+ program_id = str(array['id'])
+ program_desc = array['description'].encode('utf-8')
+ program_imgs = array['images']
+ program_img = ''
+ for img in program_imgs:
+ if img['role'].encode('utf-8') == 'vignette':
+ external_key = img['external_key'].encode('utf-8')
+ program_img = url_img % (external_key)
+ elif img['role'].encode('utf-8') == 'carousel':
+ external_key = img['external_key'].encode('utf-8')
+ program_fanart = url_img % (external_key)
+
+ info = {
+ 'video': {
+ 'title': program_title,
+ 'plot': program_desc
+ }
+ }
+ shows.append({
+ 'label': program_title,
+ 'thumb': program_img,
+ 'fanart': program_fanart,
+ 'url': common.plugin.get_url(
+ action='channel_entry',
+ next='list_shows_3',
+ program_id=program_id,
+ program_img=program_img,
+ program_fanart=program_fanart,
+ program_desc=program_desc,
+ title=program_title
+ ),
+ 'info': info
+ })
+
+ shows = common.plugin.create_listing(
+ shows,
+ sort_methods=(
+ common.sp.xbmcplugin.SORT_METHOD_UNSORTED,
+ common.sp.xbmcplugin.SORT_METHOD_LABEL
+ )
+ )
+
+ elif params.next == 'list_shows_3':
+ program_json = utils.get_webcontent(
+ url_subcategory % (params.program_id),
+ random_ua=True)
+
+ json_parser = json.loads(program_json)
+ for sub_category in json_parser['program_subcats']:
+ sub_category_id = str(sub_category['id'])
+ sub_category_title = sub_category['title'].encode('utf-8')
+
+ info = {
+ 'video': {
+ 'title': sub_category_title,
+ 'plot': params.program_desc
+ }
+ }
+
+ shows.append({
+ 'label': sub_category_title,
+ 'thumb': params.program_img,
+ 'fanart': params.program_fanart,
+ 'url': common.plugin.get_url(
+ action='channel_entry',
+ next='list_videos',
+ program_id=params.program_id,
+ sub_category_id=sub_category_id
+ ),
+ 'info': info
+ })
+
+ info = {
+ 'video': {
+ 'title': common.addon.get_localized_string(30101),
+ 'plot': params.program_desc
+ }
+ }
+ shows.append({
+ 'label': common.addon.get_localized_string(30101),
+ 'thumb': params.program_img,
+ 'fanart': params.program_fanart,
+ 'url': common.plugin.get_url(
+ action='channel_entry',
+ next='list_videos',
+ program_id=params.program_id,
+ sub_category_id='null'
+
+ ),
+ 'info': info
+ })
+
+ shows = common.plugin.create_listing(
+ shows,
+ sort_methods=(
+ common.sp.xbmcplugin.SORT_METHOD_UNSORTED,
+ common.sp.xbmcplugin.SORT_METHOD_LABEL
+ )
+ )
+
+ return shows
+
+
+@common.plugin.cached(common.cache_time)
+def list_videos(params):
+ videos = []
+
+ if params.sub_category_id == 'null':
+ url = url_videos2 % params.program_id
+ else:
+ url = url_videos % (params.program_id, params.sub_category_id)
+ program_json = utils.get_webcontent(
+ url,
+ random_ua=True)
+ json_parser = json.loads(program_json)
+
+ for video in json_parser:
+ video_id = str(video['id'])
+
+ title = video['title'].encode('utf-8')
+ duration = video['clips'][0]['duration']
+ description = video['description'].encode('utf-8')
+ try:
+ aired = video['clips'][0]['product']['last_diffusion']
+ aired = aired.encode('utf-8')
+ aired = aired[:10]
+ year = aired[:4]
+ # date : string (%d.%m.%Y / 01.01.2009)
+ # aired : string (2008-12-07)
+ day = aired.split('-')[2]
+ mounth = aired.split('-')[1]
+ year = aired.split('-')[0]
+ date = '.'.join((day, mounth, year))
+
+ except:
+ aired = ''
+ year = ''
+ date = ''
+ img = ''
+
+ program_imgs = video['clips'][0]['images']
+ program_img = ''
+ for img in program_imgs:
+ if img['role'].encode('utf-8') == 'vignette':
+ external_key = img['external_key'].encode('utf-8')
+ program_img = url_img % (external_key)
+
+ info = {
+ 'video': {
+ 'title': title,
+ 'plot': description,
+ 'aired': aired,
+ 'date': date,
+ 'duration': duration,
+ 'year': year,
+ 'mediatype': 'tvshow'
+ }
+ }
+
+ videos.append({
+ 'label': title,
+ 'thumb': program_img,
+ 'url': common.plugin.get_url(
+ action='channel_entry',
+ next='play',
+ video_id=video_id,
+ ),
+ '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_UNSORTED
+ ),
+ content='tvshows')
+
+
+@common.plugin.cached(common.cache_time)
+def get_video_URL(params):
+ video_json = utils.get_webcontent(
+ url_json_video % (params.video_id),
+ random_ua=True)
+ json_parser = json.loads(video_json)
+
+ video_assets = json_parser['clips'][0]['assets']
+ url = ''
+ url2 = ''
+ url3 = ''
+ for asset in video_assets:
+ if 'ism' in asset['video_container'].encode('utf-8'):
+ url = asset['full_physical_path'].encode('utf-8')
+ if 'mp4' in asset['video_container'].encode('utf-8'):
+ if 'hd' in asset['video_quality'].encode('utf-8'):
+ url2 = asset['full_physical_path'].encode('utf-8')
+ else:
+ url3 = asset['full_physical_path'].encode('utf-8')
+ manifest_url = ''
+ if url:
+ manifest_url = url
+ elif url2:
+ manifest_url = url2
+ else:
+ manifest_url = url3
+
+ manifest = utils.get_webcontent(
+ manifest_url,
+ random_ua=True)
+ if 'drm' in manifest:
+ utils.send_notification(common.addon.get_localized_string(30102))
+ return ''
+
+ desired_quality = common.plugin.get_setting(
+ params.channel_id + '.quality')
+
+ if desired_quality == 'Auto':
+ return manifest_url
+
+ root = common.os.path.dirname(manifest_url)
+
+ url_sd = ''
+ url_hd = ''
+ url_ultra_sd = ''
+ url_ultra_hd = ''
+
+ lines = manifest.splitlines()
+ for k in range(0, len(lines) - 1):
+ if 'RESOLUTION=400' in lines[k]:
+ url_ultra_sd = root + '/' + lines[k + 1]
+ elif 'RESOLUTION=640' in lines[k]:
+ url_sd = root + '/' + lines[k + 1]
+ elif 'RESOLUTION=720' in lines[k]:
+ url_hd = root + '/' + lines[k + 1]
+ elif 'RESOLUTION=1080' in lines[k]:
+ url_ultra_hd = root + '/' + lines[k + 1]
+
+ if desired_quality == 'Force HD':
+ if url_ultra_hd:
+ return url_ultra_hd
+ elif url_hd:
+ return url_hd
+ return manifest_url
+
+ elif desired_quality == 'Force SD':
+ if url_ultra_sd:
+ return url_ultra_sd
+ elif url_sd:
+ return url_sd
+ return manifest_url