]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/amcnetworks.py
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 ,
30 'url' : 'http://www.bbcamerica.com/shows/the-hunt/full-episodes/season-1/episode-01-the-hardest-challenge' ,
31 'only_matching' : True ,
33 'url' : 'http://www.amc.com/shows/preacher/full-episodes/season-01/episode-00/pilot' ,
34 'only_matching' : True ,
36 'url' : 'http://www.wetv.com/shows/million-dollar-matchmaker/season-01/episode-06-the-dumped-dj-and-shallow-hal' ,
37 'only_matching' : True ,
39 'url' : 'http://www.ifc.com/movies/chaos' ,
40 'only_matching' : True ,
42 'url' : 'http://www.bbcamerica.com/shows/doctor-who/full-episodes/the-power-of-the-daleks/episode-01-episode-1-color-version' ,
43 'only_matching' : True ,
45 'url' : 'http://www.wetv.com/shows/mama-june-from-not-to-hot/full-episode/season-01/thin-tervention' ,
46 'only_matching' : True ,
48 'url' : 'http://www.wetv.com/shows/la-hair/videos/season-05/episode-09-episode-9-2/episode-9-sneak-peek-3' ,
49 'only_matching' : True ,
51 'url' : 'https://www.sundancetv.com/shows/riviera/full-episodes/season-1/episode-01-episode-1' ,
52 'only_matching' : True ,
58 'sundancetv' : 'SUNDANCE' ,
62 def _real_extract ( self
, url
):
63 site
, display_id
= self
._ match
_ valid
_u rl
( url
). groups ()
64 requestor_id
= self
._ REQUESTOR
_ ID
_ MAP
[ site
]
65 page_data
= self
._ download
_ json
(
66 'https://content-delivery-gw.svc.ds.amcn.com/api/v2/content/amcn/ %s /url/ %s '
67 % ( requestor_id
. lower (), display_id
), display_id
)[ 'data' ]
68 properties
= page_data
. get ( 'properties' ) or {}
74 video_player_count
= 0
76 for v
in page_data
[ 'children' ]:
77 if v
. get ( 'type' ) == 'video-player' :
78 releasePid
= v
[ 'properties' ][ 'currentVideo' ][ 'meta' ][ 'releasePid' ]
79 tp_path
= 'M_UwQC/' + releasePid
80 media_url
= 'https://link.theplatform.com/s/' + tp_path
81 video_player_count
+= 1
84 if video_player_count
> 1 :
86 'The JSON data has %d video players. Only one will be extracted' % video_player_count
)
88 # Fall back to videoPid if releasePid not found.
89 # TODO: Fall back to videoPid if releasePid manifest uses DRM.
90 if not video_player_count
:
91 tp_path
= 'M_UwQC/media/' + properties
[ 'videoPid' ]
92 media_url
= 'https://link.theplatform.com/s/' + tp_path
94 theplatform_metadata
= self
._ download
_ theplatform
_ metadata
( tp_path
, display_id
)
95 info
= self
._ parse
_ theplatform
_ metadata
( theplatform_metadata
)
96 video_id
= theplatform_metadata
[ 'pid' ]
97 title
= theplatform_metadata
[ 'title' ]
99 theplatform_metadata
, lambda x
: x
[ 'ratings' ][ 0 ][ 'rating' ])
100 video_category
= properties
. get ( 'videoCategory' )
101 if video_category
and video_category
. endswith ( '-Auth' ):
102 resource
= self
._ get
_ mvpd
_ resource
(
103 requestor_id
, title
, video_id
, rating
)
104 query
[ 'auth' ] = self
._ extract
_ mvpd
_ auth
(
105 url
, video_id
, requestor_id
, resource
)
106 media_url
= update_url_query ( media_url
, query
)
107 formats
, subtitles
= self
._ extract
_ theplatform
_ smil
(
111 thumbnail_urls
= [ properties
. get ( 'imageDesktop' )]
112 if 'thumbnail' in info
:
113 thumbnail_urls
. append ( info
. pop ( 'thumbnail' ))
114 for thumbnail_url
in thumbnail_urls
:
115 if not thumbnail_url
:
117 mobj
= re
. search ( r
'(\d+)x(\d+)' , thumbnail_url
)
119 'url' : thumbnail_url
,
120 'width' : int ( mobj
. group ( 1 )) if mobj
else None ,
121 'height' : int ( mobj
. group ( 2 )) if mobj
else None ,
125 'age_limit' : parse_age_limit ( rating
),
128 'subtitles' : subtitles
,
129 'thumbnails' : thumbnails
,
131 ns_keys
= theplatform_metadata
. get ( '$xmlns' , {}). keys ()
133 ns
= list ( ns_keys
)[ 0 ]
134 episode
= theplatform_metadata
. get ( ns
+ '$episodeTitle' ) or None
135 episode_number
= int_or_none (
136 theplatform_metadata
. get ( ns
+ '$episode' ))
137 season_number
= int_or_none (
138 theplatform_metadata
. get ( ns
+ '$season' ))
139 series
= theplatform_metadata
. get ( ns
+ '$show' ) or None
142 'episode_number' : episode_number
,
143 'season_number' : season_number
,