]>
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 ,
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
_u rl
( url
). groups ()
65 requestor_id
= self
._ REQUESTOR
_ ID
_ MAP
[ site
]
66 page_data
= self
._ download
_ json
(
67 'https://content-delivery-gw.svc.ds.amcn.com/api/v2/content/amcn/ %s /url/ %s '
68 % ( requestor_id
. lower (), display_id
), display_id
)[ 'data' ]
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 releasePid
= v
[ 'properties' ][ 'currentVideo' ][ 'meta' ][ 'releasePid' ]
80 tp_path
= 'M_UwQC/' + releasePid
81 media_url
= 'https://link.theplatform.com/s/' + tp_path
82 video_player_count
+= 1
85 if video_player_count
> 1 :
87 'The JSON data has %d video players. Only one will be extracted' % video_player_count
)
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
= list ( ns_keys
)[ 0 ]
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
,