3 from .theplatform
import ThePlatformIE
12 class AMCNetworksIE(ThePlatformIE
): # XXX: Do not subclass from concrete IE
13 _VALID_URL
= r
'https?://(?:www\.)?(?P<site>amc|bbcamerica|ifc|(?:we|sundance)tv)\.com/(?P<id>(?:movies|shows(?:/[^/]+)+)/[^/?#&]+)'
15 'url': 'https://www.bbcamerica.com/shows/the-graham-norton-show/videos/tina-feys-adorable-airline-themed-family-dinner--51631',
19 'title': "The Graham Norton Show - Season 28 - Tina Fey's Adorable Airline-Themed Family Dinner",
20 'description': "It turns out child stewardesses are very generous with the wine! All-new episodes of 'The Graham Norton Show' premiere Fridays at 11/10c on BBC America.",
21 'upload_date': '20201120',
22 'timestamp': 1605904350,
27 'skip_download': True,
29 'skip': '404 Not Found',
31 'url': 'http://www.bbcamerica.com/shows/the-hunt/full-episodes/season-1/episode-01-the-hardest-challenge',
32 'only_matching': True,
34 'url': 'http://www.amc.com/shows/preacher/full-episodes/season-01/episode-00/pilot',
35 'only_matching': True,
37 'url': 'http://www.wetv.com/shows/million-dollar-matchmaker/season-01/episode-06-the-dumped-dj-and-shallow-hal',
38 'only_matching': True,
40 'url': 'http://www.ifc.com/movies/chaos',
41 'only_matching': True,
43 'url': 'http://www.bbcamerica.com/shows/doctor-who/full-episodes/the-power-of-the-daleks/episode-01-episode-1-color-version',
44 'only_matching': True,
46 'url': 'http://www.wetv.com/shows/mama-june-from-not-to-hot/full-episode/season-01/thin-tervention',
47 'only_matching': True,
49 'url': 'http://www.wetv.com/shows/la-hair/videos/season-05/episode-09-episode-9-2/episode-9-sneak-peek-3',
50 'only_matching': True,
52 'url': 'https://www.sundancetv.com/shows/riviera/full-episodes/season-1/episode-01-episode-1',
53 'only_matching': True,
59 'sundancetv': 'SUNDANCE',
63 def _real_extract(self
, url
):
64 site
, display_id
= self
._match
_valid
_url
(url
).groups()
65 requestor_id
= self
._REQUESTOR
_ID
_MAP
[site
]
66 page_data
= self
._download
_json
(
67 f
'https://content-delivery-gw.svc.ds.amcn.com/api/v2/content/amcn/{requestor_id.lower()}/url/{display_id}',
69 properties
= page_data
.get('properties') or {}
75 video_player_count
= 0
77 for v
in page_data
['children']:
78 if v
.get('type') == 'video-player':
79 release_pid
= v
['properties']['currentVideo']['meta']['releasePid']
80 tp_path
= 'M_UwQC/' + release_pid
81 media_url
= 'https://link.theplatform.com/s/' + tp_path
82 video_player_count
+= 1
85 if video_player_count
> 1:
87 f
'The JSON data has {video_player_count} video players. Only one will be extracted')
89 # Fall back to videoPid if releasePid not found.
90 # TODO: Fall back to videoPid if releasePid manifest uses DRM.
91 if not video_player_count
:
92 tp_path
= 'M_UwQC/media/' + properties
['videoPid']
93 media_url
= 'https://link.theplatform.com/s/' + tp_path
95 theplatform_metadata
= self
._download
_theplatform
_metadata
(tp_path
, display_id
)
96 info
= self
._parse
_theplatform
_metadata
(theplatform_metadata
)
97 video_id
= theplatform_metadata
['pid']
98 title
= theplatform_metadata
['title']
100 theplatform_metadata
, lambda x
: x
['ratings'][0]['rating'])
101 video_category
= properties
.get('videoCategory')
102 if video_category
and video_category
.endswith('-Auth'):
103 resource
= self
._get
_mvpd
_resource
(
104 requestor_id
, title
, video_id
, rating
)
105 query
['auth'] = self
._extract
_mvpd
_auth
(
106 url
, video_id
, requestor_id
, resource
)
107 media_url
= update_url_query(media_url
, query
)
108 formats
, subtitles
= self
._extract
_theplatform
_smil
(
112 thumbnail_urls
= [properties
.get('imageDesktop')]
113 if 'thumbnail' in info
:
114 thumbnail_urls
.append(info
.pop('thumbnail'))
115 for thumbnail_url
in thumbnail_urls
:
116 if not thumbnail_url
:
118 mobj
= re
.search(r
'(\d+)x(\d+)', thumbnail_url
)
120 'url': thumbnail_url
,
121 'width': int(mobj
.group(1)) if mobj
else None,
122 'height': int(mobj
.group(2)) if mobj
else None,
126 'age_limit': parse_age_limit(rating
),
129 'subtitles': subtitles
,
130 'thumbnails': thumbnails
,
132 ns_keys
= theplatform_metadata
.get('$xmlns', {}).keys()
134 ns
= next(iter(ns_keys
))
135 episode
= theplatform_metadata
.get(ns
+ '$episodeTitle') or None
136 episode_number
= int_or_none(
137 theplatform_metadata
.get(ns
+ '$episode'))
138 season_number
= int_or_none(
139 theplatform_metadata
.get(ns
+ '$season'))
140 series
= theplatform_metadata
.get(ns
+ '$show') or None
143 'episode_number': episode_number
,
144 'season_number': season_number
,