]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/shahid.py
   2 from __future__ 
import unicode_literals
 
   7 from .common 
import InfoExtractor
 
   8 from ..compat 
import compat_HTTPError
 
  19 class ShahidIE(InfoExtractor
): 
  20     _NETRC_MACHINE 
= 'shahid' 
  21     _VALID_URL 
= r
'https?://shahid\.mbc\.net/ar/(?P<type>episode|movie)/(?P<id>\d+)' 
  23         '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', 
  27             'title': 'الملك عبدالله الإنسان الموسم 1 كليب 3', 
  28             'description': 'الفيلم الوثائقي - الملك عبد الله الإنسان', 
  30             'timestamp': 1422057420, 
  31             'upload_date': '20150123', 
  35             'skip_download': True, 
  38         'url': 'https://shahid.mbc.net/ar/movie/151746/%D8%A7%D9%84%D9%82%D9%86%D8%A7%D8%B5%D8%A9.html', 
  41         # shahid plus subscriber only 
  42         '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', 
  46     def _real_initialize(self
): 
  47         email
, password 
= self
._get
_login
_info
() 
  52             user_data 
= self
._download
_json
( 
  53                 'https://shahid.mbc.net/wd/service/users/login', 
  54                 None, 'Logging in', data
=json
.dumps({ 
  58                 }).encode('utf-8'), headers
={ 
  59                     'Content-Type': 'application/json; charset=UTF-8', 
  61         except ExtractorError 
as e
: 
  62             if isinstance(e
.cause
, compat_HTTPError
): 
  63                 fail_data 
= self
._parse
_json
( 
  64                     e
.cause
.read().decode('utf-8'), None, fatal
=False) 
  66                     faults 
= fail_data
.get('faults', []) 
  67                     faults_message 
= ', '.join([clean_html(fault
['userMessage']) for fault 
in faults 
if fault
.get('userMessage')]) 
  69                         raise ExtractorError(faults_message
, expected
=True) 
  72         self
._download
_webpage
( 
  73             'https://shahid.mbc.net/populateContext', 
  74             None, 'Populate Context', data
=urlencode_postdata({ 
  75                 'firstName': user_data
['firstName'], 
  76                 'lastName': user_data
['lastName'], 
  77                 'userName': user_data
['email'], 
  78                 'csg_user_name': user_data
['email'], 
  79                 'subscriberId': user_data
['id'], 
  80                 'sessionId': user_data
['sessionId'], 
  83     def _get_api_data(self
, response
): 
  84         data 
= response
.get('data', {}) 
  86         error 
= data
.get('error') 
  89                 '%s returned error: %s' % (self
.IE_NAME
, '\n'.join(error
.values())), 
  94     def _real_extract(self
, url
): 
  95         page_type
, video_id 
= re
.match(self
._VALID
_URL
, url
).groups() 
  97         player 
= self
._get
_api
_data
(self
._download
_json
( 
  98             'https://shahid.mbc.net/arContent/getPlayerContent-param-.id-%s.type-player.html' % video_id
, 
  99             video_id
, 'Downloading player JSON')) 
 101         if player
.get('drm'): 
 102             raise ExtractorError('This video is DRM protected.', expected
=True) 
 104         formats 
= self
._extract
_m
3u8_formats
(player
['url'], video_id
, 'mp4') 
 105         self
._sort
_formats
(formats
) 
 107         video 
= self
._get
_api
_data
(self
._download
_json
( 
 108             'http://api.shahid.net/api/v1_1/%s/%s' % (page_type
, video_id
), 
 109             video_id
, 'Downloading video JSON', query
={ 
 110                 'apiKey': 'sh@hid0nlin3', 
 111                 'hash': 'b2wMCTHpSmyxGqQjJFOycRmLSex+BpTK/ooxy6vHaqs=', 
 114         title 
= video
['title'] 
 117             for category 
in video
.get('genres', []) if 'name' in category
] 
 122             'description': video
.get('description'), 
 123             'thumbnail': video
.get('thumbnailUrl'), 
 124             'duration': int_or_none(video
.get('duration')), 
 125             'timestamp': parse_iso8601(video
.get('referenceDate')), 
 126             'categories': categories
, 
 127             'series': video
.get('showTitle') or video
.get('showName'), 
 128             'season': video
.get('seasonTitle'), 
 129             'season_number': int_or_none(video
.get('seasonNumber')), 
 130             'season_id': str_or_none(video
.get('seasonId')), 
 131             'episode_number': int_or_none(video
.get('number')), 
 132             'episode_id': video_id
,