|
@@ -1,17 +1,24 @@
|
|
# coding: utf-8
|
|
# coding: utf-8
|
|
from __future__ import unicode_literals
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
+import re
|
|
|
|
+import json
|
|
|
|
+
|
|
from .common import InfoExtractor
|
|
from .common import InfoExtractor
|
|
|
|
+from ..compat import compat_HTTPError
|
|
from ..utils import (
|
|
from ..utils import (
|
|
ExtractorError,
|
|
ExtractorError,
|
|
int_or_none,
|
|
int_or_none,
|
|
parse_iso8601,
|
|
parse_iso8601,
|
|
str_or_none,
|
|
str_or_none,
|
|
|
|
+ urlencode_postdata,
|
|
|
|
+ clean_html,
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
class ShahidIE(InfoExtractor):
|
|
class ShahidIE(InfoExtractor):
|
|
- _VALID_URL = r'https?://shahid\.mbc\.net/ar/episode/(?P<id>\d+)/?'
|
|
|
|
|
|
+ _NETRC_MACHINE = 'shahid'
|
|
|
|
+ _VALID_URL = r'https?://shahid\.mbc\.net/ar/(?P<type>episode|movie)/(?P<id>\d+)'
|
|
_TESTS = [{
|
|
_TESTS = [{
|
|
'url': 'https://shahid.mbc.net/ar/episode/90574/%D8%A7%D9%84%D9%85%D9%84%D9%83-%D8%B9%D8%A8%D8%AF%D8%A7%D9%84%D9%84%D9%87-%D8%A7%D9%84%D8%A5%D9%86%D8%B3%D8%A7%D9%86-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D9%83%D9%84%D9%8A%D8%A8-3.html',
|
|
'url': 'https://shahid.mbc.net/ar/episode/90574/%D8%A7%D9%84%D9%85%D9%84%D9%83-%D8%B9%D8%A8%D8%AF%D8%A7%D9%84%D9%84%D9%87-%D8%A7%D9%84%D8%A5%D9%86%D8%B3%D8%A7%D9%86-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D9%83%D9%84%D9%8A%D8%A8-3.html',
|
|
'info_dict': {
|
|
'info_dict': {
|
|
@@ -27,18 +34,54 @@ class ShahidIE(InfoExtractor):
|
|
# m3u8 download
|
|
# m3u8 download
|
|
'skip_download': True,
|
|
'skip_download': True,
|
|
}
|
|
}
|
|
|
|
+ }, {
|
|
|
|
+ 'url': 'https://shahid.mbc.net/ar/movie/151746/%D8%A7%D9%84%D9%82%D9%86%D8%A7%D8%B5%D8%A9.html',
|
|
|
|
+ 'only_matching': True
|
|
}, {
|
|
}, {
|
|
# shahid plus subscriber only
|
|
# shahid plus subscriber only
|
|
'url': 'https://shahid.mbc.net/ar/episode/90511/%D9%85%D8%B1%D8%A7%D9%8A%D8%A7-2011-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1.html',
|
|
'url': 'https://shahid.mbc.net/ar/episode/90511/%D9%85%D8%B1%D8%A7%D9%8A%D8%A7-2011-%D8%A7%D9%84%D9%85%D9%88%D8%B3%D9%85-1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1.html',
|
|
'only_matching': True
|
|
'only_matching': True
|
|
}]
|
|
}]
|
|
|
|
|
|
- def _call_api(self, path, video_id, note):
|
|
|
|
- data = self._download_json(
|
|
|
|
- 'http://api.shahid.net/api/v1_1/' + path, video_id, note, query={
|
|
|
|
- 'apiKey': 'sh@hid0nlin3',
|
|
|
|
- 'hash': 'b2wMCTHpSmyxGqQjJFOycRmLSex+BpTK/ooxy6vHaqs=',
|
|
|
|
- }).get('data', {})
|
|
|
|
|
|
+ def _real_initialize(self):
|
|
|
|
+ email, password = self._get_login_info()
|
|
|
|
+ if email is None:
|
|
|
|
+ return
|
|
|
|
+
|
|
|
|
+ try:
|
|
|
|
+ user_data = self._download_json(
|
|
|
|
+ 'https://shahid.mbc.net/wd/service/users/login',
|
|
|
|
+ None, 'Logging in', data=json.dumps({
|
|
|
|
+ 'email': email,
|
|
|
|
+ 'password': password,
|
|
|
|
+ 'basic': 'false',
|
|
|
|
+ }).encode('utf-8'), headers={
|
|
|
|
+ 'Content-Type': 'application/json; charset=UTF-8',
|
|
|
|
+ })['user']
|
|
|
|
+ except ExtractorError as e:
|
|
|
|
+ if isinstance(e.cause, compat_HTTPError):
|
|
|
|
+ fail_data = self._parse_json(
|
|
|
|
+ e.cause.read().decode('utf-8'), None, fatal=False)
|
|
|
|
+ if fail_data:
|
|
|
|
+ faults = fail_data.get('faults', [])
|
|
|
|
+ faults_message = ', '.join([clean_html(fault['userMessage']) for fault in faults if fault.get('userMessage')])
|
|
|
|
+ if faults_message:
|
|
|
|
+ raise ExtractorError(faults_message, expected=True)
|
|
|
|
+ raise
|
|
|
|
+
|
|
|
|
+ self._download_webpage(
|
|
|
|
+ 'https://shahid.mbc.net/populateContext',
|
|
|
|
+ None, 'Populate Context', data=urlencode_postdata({
|
|
|
|
+ 'firstName': user_data['firstName'],
|
|
|
|
+ 'lastName': user_data['lastName'],
|
|
|
|
+ 'userName': user_data['email'],
|
|
|
|
+ 'csg_user_name': user_data['email'],
|
|
|
|
+ 'subscriberId': user_data['id'],
|
|
|
|
+ 'sessionId': user_data['sessionId'],
|
|
|
|
+ }))
|
|
|
|
+
|
|
|
|
+ def _get_api_data(self, response):
|
|
|
|
+ data = response.get('data', {})
|
|
|
|
|
|
error = data.get('error')
|
|
error = data.get('error')
|
|
if error:
|
|
if error:
|
|
@@ -49,11 +92,11 @@ class ShahidIE(InfoExtractor):
|
|
return data
|
|
return data
|
|
|
|
|
|
def _real_extract(self, url):
|
|
def _real_extract(self, url):
|
|
- video_id = self._match_id(url)
|
|
|
|
|
|
+ page_type, video_id = re.match(self._VALID_URL, url).groups()
|
|
|
|
|
|
- player = self._call_api(
|
|
|
|
- 'Content/Episode/%s' % video_id,
|
|
|
|
- video_id, 'Downloading player JSON')
|
|
|
|
|
|
+ player = self._get_api_data(self._download_json(
|
|
|
|
+ 'https://shahid.mbc.net/arContent/getPlayerContent-param-.id-%s.type-player.html' % video_id,
|
|
|
|
+ video_id, 'Downloading player JSON'))
|
|
|
|
|
|
if player.get('drm'):
|
|
if player.get('drm'):
|
|
raise ExtractorError('This video is DRM protected.', expected=True)
|
|
raise ExtractorError('This video is DRM protected.', expected=True)
|
|
@@ -61,9 +104,12 @@ class ShahidIE(InfoExtractor):
|
|
formats = self._extract_m3u8_formats(player['url'], video_id, 'mp4')
|
|
formats = self._extract_m3u8_formats(player['url'], video_id, 'mp4')
|
|
self._sort_formats(formats)
|
|
self._sort_formats(formats)
|
|
|
|
|
|
- video = self._call_api(
|
|
|
|
- 'episode/%s' % video_id, video_id,
|
|
|
|
- 'Downloading video JSON')['episode']
|
|
|
|
|
|
+ video = self._get_api_data(self._download_json(
|
|
|
|
+ 'http://api.shahid.net/api/v1_1/%s/%s' % (page_type, video_id),
|
|
|
|
+ video_id, 'Downloading video JSON', query={
|
|
|
|
+ 'apiKey': 'sh@hid0nlin3',
|
|
|
|
+ 'hash': 'b2wMCTHpSmyxGqQjJFOycRmLSex+BpTK/ooxy6vHaqs=',
|
|
|
|
+ }))[page_type]
|
|
|
|
|
|
title = video['title']
|
|
title = video['title']
|
|
categories = [
|
|
categories = [
|