aboutsummaryrefslogtreecommitdiffstats
path: root/hypervideo_dl/extractor/sonyliv.py
diff options
context:
space:
mode:
Diffstat (limited to 'hypervideo_dl/extractor/sonyliv.py')
-rw-r--r--hypervideo_dl/extractor/sonyliv.py72
1 files changed, 61 insertions, 11 deletions
diff --git a/hypervideo_dl/extractor/sonyliv.py b/hypervideo_dl/extractor/sonyliv.py
index fedfceb..c3ed442 100644
--- a/hypervideo_dl/extractor/sonyliv.py
+++ b/hypervideo_dl/extractor/sonyliv.py
@@ -9,15 +9,22 @@ from ..compat import compat_HTTPError
from ..utils import (
ExtractorError,
int_or_none,
+ try_get,
)
class SonyLIVIE(InfoExtractor):
- _VALID_URL = r'https?://(?:www\.)?sonyliv\.com/(?:s(?:how|port)s/[^/]+|movies|clip|trailer|music-videos)/[^/?#&]+-(?P<id>\d+)'
+ _VALID_URL = r'''(?x)
+ (?:
+ sonyliv:|
+ https?://(?:www\.)?sonyliv\.com/(?:s(?:how|port)s/[^/]+|movies|clip|trailer|music-videos)/[^/?#&]+-
+ )
+ (?P<id>\d+)
+ '''
_TESTS = [{
'url': 'https://www.sonyliv.com/shows/bachelors-delight-1700000113/achaari-cheese-toast-1000022678?watch=true',
'info_dict': {
- 'title': 'Bachelors Delight - Achaari Cheese Toast',
+ 'title': 'Achaari Cheese Toast',
'id': '1000022678',
'ext': 'mp4',
'upload_date': '20200411',
@@ -25,7 +32,7 @@ class SonyLIVIE(InfoExtractor):
'timestamp': 1586632091,
'duration': 185,
'season_number': 1,
- 'episode': 'Achaari Cheese Toast',
+ 'series': 'Bachelors Delight',
'episode_number': 1,
'release_year': 2016,
},
@@ -75,8 +82,8 @@ class SonyLIVIE(InfoExtractor):
video_id = self._match_id(url)
content = self._call_api(
'1.5', 'IN/CONTENT/VIDEOURL/VOD/' + video_id, video_id)
- if content.get('isEncrypted'):
- raise ExtractorError('This video is DRM protected.', expected=True)
+ if not self.get_param('allow_unplayable_formats') and content.get('isEncrypted'):
+ self.report_drm(video_id)
dash_url = content['videoURL']
headers = {
'x-playback-session-id': '%s-%d' % (uuid.uuid4().hex, time.time() * 1000)
@@ -92,11 +99,15 @@ class SonyLIVIE(InfoExtractor):
metadata = self._call_api(
'1.6', 'IN/DETAIL/' + video_id, video_id)['containers'][0]['metadata']
- title = metadata['title']
- episode = metadata.get('episodeTitle')
- if episode and title != episode:
- title += ' - ' + episode
-
+ title = metadata['episodeTitle']
+ subtitles = {}
+ for sub in content.get('subtitle', []):
+ sub_url = sub.get('subtitleUrl')
+ if not sub_url:
+ continue
+ subtitles.setdefault(sub.get('subtitleLanguageName', 'ENG'), []).append({
+ 'url': sub_url,
+ })
return {
'id': video_id,
'title': title,
@@ -106,7 +117,46 @@ class SonyLIVIE(InfoExtractor):
'timestamp': int_or_none(metadata.get('creationDate'), 1000),
'duration': int_or_none(metadata.get('duration')),
'season_number': int_or_none(metadata.get('season')),
- 'episode': episode,
+ 'series': metadata.get('title'),
'episode_number': int_or_none(metadata.get('episodeNumber')),
'release_year': int_or_none(metadata.get('year')),
+ 'subtitles': subtitles,
+ }
+
+
+class SonyLIVSeriesIE(InfoExtractor):
+ _VALID_URL = r'https?://(?:www\.)?sonyliv\.com/shows/[^/?#&]+-(?P<id>\d{10})$'
+ _TESTS = [{
+ 'url': 'https://www.sonyliv.com/shows/adaalat-1700000091',
+ 'playlist_mincount': 456,
+ 'info_dict': {
+ 'id': '1700000091',
+ },
+ }]
+ _API_SHOW_URL = "https://apiv2.sonyliv.com/AGL/1.9/R/ENG/WEB/IN/DL/DETAIL/{}?kids_safe=false&from=0&to=49"
+ _API_EPISODES_URL = "https://apiv2.sonyliv.com/AGL/1.4/R/ENG/WEB/IN/CONTENT/DETAIL/BUNDLE/{}?from=0&to=1000&orderBy=episodeNumber&sortOrder=asc"
+ _API_SECURITY_URL = 'https://apiv2.sonyliv.com/AGL/1.4/A/ENG/WEB/ALL/GETTOKEN'
+
+ def _entries(self, show_id):
+ headers = {
+ 'Accept': 'application/json, text/plain, */*',
+ 'Referer': 'https://www.sonyliv.com',
}
+ headers['security_token'] = self._download_json(
+ self._API_SECURITY_URL, video_id=show_id, headers=headers,
+ note='Downloading security token')['resultObj']
+ seasons = try_get(
+ self._download_json(self._API_SHOW_URL.format(show_id), video_id=show_id, headers=headers),
+ lambda x: x['resultObj']['containers'][0]['containers'], list)
+ for season in seasons or []:
+ season_id = season['id']
+ episodes = try_get(
+ self._download_json(self._API_EPISODES_URL.format(season_id), video_id=season_id, headers=headers),
+ lambda x: x['resultObj']['containers'][0]['containers'], list)
+ for episode in episodes or []:
+ video_id = episode.get('id')
+ yield self.url_result('sonyliv:%s' % video_id, ie=SonyLIVIE.ie_key(), video_id=video_id)
+
+ def _real_extract(self, url):
+ show_id = self._match_id(url)
+ return self.playlist_result(self._entries(show_id), playlist_id=show_id)