2024-06-27 10:07:53 +00:00
import functools
2017-11-17 18:58:58 +00:00
import hashlib
import hmac
2014-07-25 22:05:37 +00:00
import re
2017-11-17 18:58:58 +00:00
import time
2014-07-25 22:05:37 +00:00
from . common import InfoExtractor
2015-08-29 17:08:55 +00:00
from . . utils import (
ExtractorError ,
2024-05-26 19:27:21 +00:00
dict_get ,
2015-08-29 17:11:56 +00:00
int_or_none ,
2024-05-26 19:27:21 +00:00
js_to_json ,
2016-08-21 23:06:39 +00:00
parse_iso8601 ,
2020-08-15 23:30:49 +00:00
str_or_none ,
2023-06-27 21:16:57 +00:00
traverse_obj ,
2017-07-09 10:55:40 +00:00
try_get ,
2018-03-27 15:08:40 +00:00
unescapeHTML ,
2017-12-30 18:22:15 +00:00
update_url_query ,
2023-11-15 23:24:55 +00:00
url_or_none ,
2015-08-29 17:08:55 +00:00
)
2014-07-25 22:05:37 +00:00
class ABCIE ( InfoExtractor ) :
IE_NAME = ' abc.net.au '
2020-08-15 23:31:11 +00:00
_VALID_URL = r ' https?://(?:www \ .)?abc \ .net \ .au/(?:news|btn)/(?:[^/]+/) { 1,4}(?P<id> \ d { 5,}) '
2014-07-25 22:05:37 +00:00
2015-08-29 17:08:55 +00:00
_TESTS = [ {
2014-11-05 13:30:39 +00:00
' url ' : ' http://www.abc.net.au/news/2014-11-05/australia-to-staff-ebola-treatment-centre-in-sierra-leone/5868334 ' ,
' md5 ' : ' cb3dd03b18455a661071ee1e28344d9f ' ,
2014-07-25 22:05:37 +00:00
' info_dict ' : {
2014-11-05 13:30:39 +00:00
' id ' : ' 5868334 ' ,
2014-07-25 22:05:37 +00:00
' ext ' : ' mp4 ' ,
2014-11-05 13:30:39 +00:00
' title ' : ' Australia to help staff Ebola treatment centre in Sierra Leone ' ,
' description ' : ' md5:809ad29c67a05f54eb41f2a105693a67 ' ,
2014-07-25 22:05:37 +00:00
} ,
2015-12-21 12:07:52 +00:00
' skip ' : ' this video has expired ' ,
2015-08-29 17:08:55 +00:00
} , {
' url ' : ' http://www.abc.net.au/news/2015-08-17/warren-entsch-introduces-same-sex-marriage-bill/6702326 ' ,
2020-08-15 23:30:49 +00:00
' md5 ' : ' 4ebd61bdc82d9a8b722f64f1f4b4d121 ' ,
2015-08-29 17:08:55 +00:00
' info_dict ' : {
' id ' : ' NvqvPeNZsHU ' ,
' ext ' : ' mp4 ' ,
' upload_date ' : ' 20150816 ' ,
' uploader ' : ' ABC News (Australia) ' ,
' description ' : ' Government backbencher Warren Entsch introduces a cross-party sponsored bill to legalise same-sex marriage, saying the bill is designed to promote " an inclusive Australia, not a divided one. " . Read more here: http://ab.co/1Mwc6ef ' ,
' uploader_id ' : ' NewsOnABC ' ,
' title ' : ' Marriage Equality: Warren Entsch introduces same sex marriage bill ' ,
} ,
' add_ie ' : [ ' Youtube ' ] ,
2015-12-21 12:07:52 +00:00
' skip ' : ' Not accessible from Travis CI server ' ,
2015-10-23 06:09:41 +00:00
} , {
' url ' : ' http://www.abc.net.au/news/2015-10-23/nab-lifts-interest-rates-following-westpac-and-cba/6880080 ' ,
' md5 ' : ' b96eee7c9edf4fc5a358a0252881cc1f ' ,
' info_dict ' : {
' id ' : ' 6880080 ' ,
' ext ' : ' mp3 ' ,
' title ' : ' NAB lifts interest rates, following Westpac and CBA ' ,
' description ' : ' md5:f13d8edc81e462fce4a0437c7dc04728 ' ,
} ,
2015-10-24 10:31:42 +00:00
} , {
' url ' : ' http://www.abc.net.au/news/2015-10-19/6866214 ' ,
' only_matching ' : True ,
2020-08-15 23:31:11 +00:00
} , {
' url ' : ' https://www.abc.net.au/btn/classroom/wwi-centenary/10527914 ' ,
' info_dict ' : {
' id ' : ' 10527914 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' WWI Centenary ' ,
' description ' : ' md5:c2379ec0ca84072e86b446e536954546 ' ,
2024-06-11 23:09:58 +00:00
} ,
2020-08-15 23:30:49 +00:00
} , {
' url ' : ' https://www.abc.net.au/news/programs/the-world/2020-06-10/black-lives-matter-protests-spawn-support-for/12342074 ' ,
' info_dict ' : {
' id ' : ' 12342074 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Black Lives Matter protests spawn support for Papuans in Indonesia ' ,
' description ' : ' md5:2961a17dc53abc558589ccd0fb8edd6f ' ,
2024-06-11 23:09:58 +00:00
} ,
2020-08-15 23:31:11 +00:00
} , {
' url ' : ' https://www.abc.net.au/btn/newsbreak/btn-newsbreak-20200814/12560476 ' ,
' info_dict ' : {
' id ' : ' tDL8Ld4dK_8 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Fortnite Banned From Apple and Google App Stores ' ,
' description ' : ' md5:a6df3f36ce8f816b74af4bd6462f5651 ' ,
' upload_date ' : ' 20200813 ' ,
' uploader ' : ' Behind the News ' ,
' uploader_id ' : ' behindthenews ' ,
2024-06-11 23:09:58 +00:00
} ,
2023-06-27 21:16:57 +00:00
} , {
' url ' : ' https://www.abc.net.au/news/2023-06-25/wagner-boss-orders-troops-back-to-bases-to-avoid-bloodshed/102520540 ' ,
' info_dict ' : {
' id ' : ' 102520540 ' ,
' title ' : ' Wagner Group retreating from Russia, leader Prigozhin to move to Belarus ' ,
' ext ' : ' mp4 ' ,
' description ' : ' Wagner troops leave Rostov-on-Don and \xa0 Yevgeny Prigozhin will move to Belarus under a deal brokered by Belarusian President Alexander Lukashenko to end the mutiny. ' ,
' thumbnail ' : ' https://live-production.wcms.abc-cdn.net.au/0c170f5b57f0105c432f366c0e8e267b?impolicy=wcms_crop_resize&cropH=2813&cropW=5000&xPos=0&yPos=249&width=862&height=485 ' ,
2024-06-11 23:09:58 +00:00
} ,
2015-08-29 17:08:55 +00:00
} ]
2014-07-25 22:05:37 +00:00
def _real_extract ( self , url ) :
2014-09-28 07:31:58 +00:00
video_id = self . _match_id ( url )
2014-07-25 22:05:37 +00:00
webpage = self . _download_webpage ( url , video_id )
2020-08-15 23:30:49 +00:00
mobj = re . search ( r ' <a \ s+href= " (?P<url>[^ " ]+) " \ s+data-duration= " \ d+ " \ s+title= " Download audio directly " > ' , webpage )
if mobj :
urls_info = mobj . groupdict ( )
youtube = False
video = False
else :
mobj = re . search ( r ' <a href= " (?P<url>http://www \ .youtube \ .com/watch \ ?v=[^ " ]+) " ><span><strong>External Link:</strong> ' ,
webpage )
2020-08-15 23:31:11 +00:00
if mobj is None :
mobj = re . search ( r ' <iframe width= " 100 % " src= " (?P<url>//www \ .youtube-nocookie \ .com/embed/[^? " ]+) ' , webpage )
2020-08-15 23:30:49 +00:00
if mobj :
urls_info = mobj . groupdict ( )
youtube = True
video = True
2015-08-29 17:08:55 +00:00
2020-08-15 23:30:49 +00:00
if mobj is None :
2023-06-27 21:16:57 +00:00
mobj = re . search ( r ' (?P<type>) " (?:sources|files|renditions) " : \ s*(?P<json_data> \ [[^ \ ]]+ \ ]) ' , webpage )
2020-08-15 23:30:49 +00:00
if mobj is None :
mobj = re . search (
r ' inline(?P<type>Video|Audio|YouTube)Data \ .push \ ((?P<json_data>[^)]+) \ ); ' ,
webpage )
if mobj is None :
expired = self . _html_search_regex ( r ' (?s)class= " expired-(?:video|audio) " .+?<span>(.+?)</span> ' , webpage , ' expired ' , None )
if expired :
2024-06-11 23:09:58 +00:00
raise ExtractorError ( f ' { self . IE_NAME } said: { expired } ' , expected = True )
2020-08-15 23:30:49 +00:00
raise ExtractorError ( ' Unable to extract video urls ' )
urls_info = self . _parse_json (
mobj . group ( ' json_data ' ) , video_id , transform_source = js_to_json )
youtube = mobj . group ( ' type ' ) == ' YouTube '
2023-06-27 21:16:57 +00:00
video = mobj . group ( ' type ' ) == ' Video ' or traverse_obj (
urls_info , ( 0 , ( ' contentType ' , ' MIMEType ' ) ) , get_all = False ) == ' video/mp4 '
2015-08-29 17:08:55 +00:00
if not isinstance ( urls_info , list ) :
urls_info = [ urls_info ]
2020-08-15 23:30:49 +00:00
if youtube :
2015-08-29 17:08:55 +00:00
return self . playlist_result ( [
self . url_result ( url_info [ ' url ' ] ) for url_info in urls_info ] )
2020-08-15 23:30:49 +00:00
formats = [ ]
for url_info in urls_info :
height = int_or_none ( url_info . get ( ' height ' ) )
bitrate = int_or_none ( url_info . get ( ' bitrate ' ) )
width = int_or_none ( url_info . get ( ' width ' ) )
format_id = None
mobj = re . search ( r ' _(?:(?P<height> \ d+)|(?P<bitrate> \ d+)k) \ .mp4$ ' , url_info [ ' url ' ] )
if mobj :
height_from_url = mobj . group ( ' height ' )
if height_from_url :
height = height or int_or_none ( height_from_url )
width = width or int_or_none ( url_info . get ( ' label ' ) )
else :
bitrate = bitrate or int_or_none ( mobj . group ( ' bitrate ' ) )
format_id = str_or_none ( url_info . get ( ' label ' ) )
formats . append ( {
' url ' : url_info [ ' url ' ] ,
' vcodec ' : url_info . get ( ' codec ' ) if video else ' none ' ,
' width ' : width ,
' height ' : height ,
' tbr ' : bitrate ,
' filesize ' : int_or_none ( url_info . get ( ' filesize ' ) ) ,
2024-06-11 23:09:58 +00:00
' format_id ' : format_id ,
2020-08-15 23:30:49 +00:00
} )
2015-10-23 06:09:41 +00:00
2014-07-25 22:05:37 +00:00
return {
' id ' : video_id ,
' title ' : self . _og_search_title ( webpage ) ,
' formats ' : formats ,
' description ' : self . _og_search_description ( webpage ) ,
' thumbnail ' : self . _og_search_thumbnail ( webpage ) ,
}
2016-08-21 23:06:39 +00:00
class ABCIViewIE ( InfoExtractor ) :
IE_NAME = ' abc.net.au:iview '
2018-06-12 12:07:20 +00:00
_VALID_URL = r ' https?://iview \ .abc \ .net \ .au/(?:[^/]+/)*video/(?P<id>[^/?#]+) '
2017-12-30 18:22:15 +00:00
_GEO_COUNTRIES = [ ' AU ' ]
2016-08-21 23:06:39 +00:00
_TESTS = [ {
2023-10-06 22:35:11 +00:00
' url ' : ' https://iview.abc.net.au/show/utopia/series/1/video/CO1211V001S00 ' ,
' md5 ' : ' 52a942bfd7a0b79a6bfe9b4ce6c9d0ed ' ,
' info_dict ' : {
' id ' : ' CO1211V001S00 ' ,
' ext ' : ' mp4 ' ,
2024-06-27 08:05:22 +00:00
' title ' : ' Series 1 Episode 1 Wood For The Trees ' ,
2023-10-06 22:35:11 +00:00
' series ' : ' Utopia ' ,
' description ' : ' md5:0cfb2c183c1b952d1548fd65c8a95c00 ' ,
' upload_date ' : ' 20230726 ' ,
' uploader_id ' : ' abc1 ' ,
' series_id ' : ' CO1211V ' ,
' episode_id ' : ' CO1211V001S00 ' ,
' season_number ' : 1 ,
' season ' : ' Season 1 ' ,
' episode_number ' : 1 ,
' episode ' : ' Wood For The Trees ' ,
2024-06-10 02:51:06 +00:00
' duration ' : 1584 ,
' chapters ' : [
{
' start_time ' : 0 ,
' end_time ' : 1 ,
' title ' : ' <Untitled Chapter 1> ' ,
} ,
{
' start_time ' : 1 ,
' end_time ' : 24 ,
' title ' : ' opening-credits ' ,
} ,
2024-06-27 08:05:22 +00:00
{
' start_time ' : 1564 ,
' end_time ' : 1584 ,
' title ' : ' end-credits ' ,
} ,
2024-06-10 02:51:06 +00:00
] ,
2023-10-06 22:35:11 +00:00
' thumbnail ' : ' https://cdn.iview.abc.net.au/thumbs/i/co/CO1211V001S00_5ad8353f4df09_1280.jpg ' ,
' timestamp ' : 1690403700 ,
} ,
' params ' : {
' skip_download ' : True ,
} ,
} , {
' note ' : ' No episode name ' ,
2024-06-27 08:05:22 +00:00
' url ' : ' https://iview.abc.net.au/show/gruen/series/15/video/LE2327H001S00 ' ,
2020-02-13 13:52:00 +00:00
' md5 ' : ' 67715ce3c78426b11ba167d875ac6abf ' ,
2016-08-21 23:06:39 +00:00
' info_dict ' : {
2024-06-27 08:05:22 +00:00
' id ' : ' LE2327H001S00 ' ,
2016-08-21 23:06:39 +00:00
' ext ' : ' mp4 ' ,
2024-06-27 08:05:22 +00:00
' title ' : ' Series 15 Episode 1 ' ,
2023-10-06 22:35:11 +00:00
' series ' : ' Gruen ' ,
2024-06-27 08:05:22 +00:00
' description ' : ' md5:ac3bf529d467d8436954db1e90d2f06d ' ,
' upload_date ' : ' 20230621 ' ,
2020-02-13 13:52:00 +00:00
' uploader_id ' : ' abc1 ' ,
2024-06-27 08:05:22 +00:00
' series_id ' : ' LE2327H ' ,
' episode_id ' : ' LE2327H001S00 ' ,
' season_number ' : 15 ,
' season ' : ' Season 15 ' ,
2023-10-06 22:35:11 +00:00
' episode_number ' : 1 ,
' episode ' : ' Episode 1 ' ,
2024-06-27 08:05:22 +00:00
' thumbnail ' : ' https://cdn.iview.abc.net.au/thumbs/i/le/LE2327H001S00_649279152faea_3600.jpg ' ,
' timestamp ' : 1687379421 ,
' duration ' : 2117 ,
' chapters ' : ' count:2 ' ,
2017-12-30 18:22:15 +00:00
} ,
2023-10-06 22:35:11 +00:00
' expected_warnings ' : [ ' Ignoring subtitle tracks found in the HLS manifest ' ] ,
' params ' : {
' skip_download ' : True ,
} ,
} , {
' note ' : ' No episode number ' ,
' url ' : ' https://iview.abc.net.au/show/four-corners/series/2022/video/NC2203H039S00 ' ,
' md5 ' : ' 77cb7d8434440e3b28fbebe331c2456a ' ,
' info_dict ' : {
' id ' : ' NC2203H039S00 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Series 2022 Locking Up Kids ' ,
' series ' : ' Four Corners ' ,
' description ' : ' md5:54829ca108846d1a70e1fcce2853e720 ' ,
' upload_date ' : ' 20221114 ' ,
' uploader_id ' : ' abc1 ' ,
' series_id ' : ' NC2203H ' ,
' episode_id ' : ' NC2203H039S00 ' ,
' season_number ' : 2022 ,
' season ' : ' Season 2022 ' ,
' episode ' : ' Locking Up Kids ' ,
' thumbnail ' : ' https://cdn.iview.abc.net.au/thumbs/i/nc/NC2203H039S00_636d8a0944a22_1920.jpg ' ,
' timestamp ' : 1668460497 ,
2024-06-27 08:05:22 +00:00
' duration ' : 2802 ,
' chapters ' : ' count:2 ' ,
2023-10-06 22:35:11 +00:00
} ,
' expected_warnings ' : [ ' Ignoring subtitle tracks found in the HLS manifest ' ] ,
' params ' : {
' skip_download ' : True ,
} ,
} , {
' note ' : ' No episode name or number ' ,
' url ' : ' https://iview.abc.net.au/show/landline/series/2021/video/RF2004Q043S00 ' ,
' md5 ' : ' 2e17dec06b13cc81dc119d2565289396 ' ,
' info_dict ' : {
' id ' : ' RF2004Q043S00 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Series 2021 ' ,
' series ' : ' Landline ' ,
' description ' : ' md5:c9f30d9c0c914a7fd23842f6240be014 ' ,
' upload_date ' : ' 20211205 ' ,
' uploader_id ' : ' abc1 ' ,
' series_id ' : ' RF2004Q ' ,
' episode_id ' : ' RF2004Q043S00 ' ,
' season_number ' : 2021 ,
' season ' : ' Season 2021 ' ,
' thumbnail ' : ' https://cdn.iview.abc.net.au/thumbs/i/rf/RF2004Q043S00_61a950639dbc0_1920.jpg ' ,
' timestamp ' : 1638710705 ,
2024-06-27 08:05:22 +00:00
' duration ' : 3381 ,
' chapters ' : ' count:2 ' ,
2023-10-06 22:35:11 +00:00
} ,
' expected_warnings ' : [ ' Ignoring subtitle tracks found in the HLS manifest ' ] ,
2017-12-30 18:22:15 +00:00
' params ' : {
' skip_download ' : True ,
2016-08-21 23:06:39 +00:00
} ,
} ]
def _real_extract ( self , url ) :
video_id = self . _match_id ( url )
2018-06-12 12:07:20 +00:00
video_params = self . _download_json (
2024-06-10 02:36:45 +00:00
' https://api.iview.abc.net.au/v3/video/ ' + video_id , video_id ,
errnote = ' Failed to download API V3 JSON ' , fatal = False )
# fallback to legacy API, which will return some useful info even if the video is unavailable
if not video_params :
video_params = self . _download_json (
' https://iview.abc.net.au/api/programs/ ' + video_id , video_id ,
note = ' Downloading legacy API JSON ' )
stream = traverse_obj ( video_params , (
( ' _embedded ' , None ) , ' playlist ' , lambda _ , v : v [ ' type ' ] in ( ' program ' , ' livestream ' ) ) ,
get_all = False )
2016-08-21 23:06:39 +00:00
2024-06-10 02:36:45 +00:00
house_number = traverse_obj ( video_params , ( ' houseNumber ' , ' episodeHouseNumber ' ) ) or video_id
2024-06-11 23:09:58 +00:00
path = f ' /auth/hls/sign?ts= { int ( time . time ( ) ) } &hn= { house_number } &d=android-tablet '
2017-12-30 18:22:15 +00:00
sig = hmac . new (
2018-06-12 12:07:20 +00:00
b ' android.content.res.Resources ' ,
2024-06-11 23:09:58 +00:00
path . encode ( ) , hashlib . sha256 ) . hexdigest ( )
2017-12-30 18:22:15 +00:00
token = self . _download_webpage (
2024-06-11 23:09:58 +00:00
f ' http://iview.abc.net.au { path } &sig= { sig } ' , video_id )
2017-11-17 18:58:58 +00:00
def tokenize_url ( url , token ) :
2017-12-30 18:22:15 +00:00
return update_url_query ( url , {
' hdnea ' : token ,
} )
2024-06-27 04:54:22 +00:00
for sd_url in traverse_obj ( stream , ( ' streams ' , ' hls-latest ' , ( ' 1080 ' , ' 720 ' , ' sd ' , ' sd-low ' ) , { str } ) ) :
2017-12-30 18:22:15 +00:00
if not sd_url :
continue
formats = self . _extract_m3u8_formats (
tokenize_url ( sd_url , token ) , video_id , ' mp4 ' ,
entry_protocol = ' m3u8_native ' , m3u8_id = ' hls ' , fatal = False )
if formats :
break
2016-08-21 23:06:39 +00:00
subtitles = { }
2024-06-27 10:07:53 +00:00
src_vtt = traverse_obj ( stream , ( ' captions ' , ' src-vtt ' ) )
2016-08-21 23:06:39 +00:00
if src_vtt :
subtitles [ ' en ' ] = [ {
' url ' : src_vtt ,
' ext ' : ' vtt ' ,
} ]
2024-06-27 03:30:04 +00:00
title = unescapeHTML ( traverse_obj ( video_params , ' title ' , ' seriesTitle ' , ' showTitle ' ) )
2016-08-21 23:06:39 +00:00
return {
' id ' : video_id ,
2018-06-12 12:07:20 +00:00
' title ' : title ,
2024-06-27 10:07:53 +00:00
' series_id ' : traverse_obj (
video_params ,
( ' analytics ' , ' oztam ' , ' seriesId ' ) , ' seriesHouseNumber ' ) or video_id [ : 7 ] ,
2018-06-12 13:25:50 +00:00
' season_number ' : int_or_none ( self . _search_regex (
r ' \ bSeries \ s+( \ d+) \ b ' , title , ' season number ' , default = None ) ) ,
' episode_number ' : int_or_none ( self . _search_regex (
2024-06-27 08:05:22 +00:00
r ' \ bEp(?:isode)? \ s+( \ d+) \ b ' , title , ' episode number ' , default = None ) ) ,
2018-06-12 13:25:50 +00:00
' episode_id ' : house_number ,
2023-10-06 22:35:11 +00:00
' episode ' : self . _search_regex (
2024-06-27 08:05:22 +00:00
r ' ^(?:Series \ s+ \ d+)? \ s*(?:Ep(?:isode)? \ s+ \ d+)? \ s*(.*)$ ' , title , ' episode ' , default = ' ' ) or None ,
2024-06-27 10:07:53 +00:00
' is_live ' : video_params . get ( ' livestream ' ) == ' 1 ' or stream [ ' type ' ] == ' livestream ' ,
2016-08-21 23:06:39 +00:00
' formats ' : formats ,
' subtitles ' : subtitles ,
2024-06-27 10:07:53 +00:00
* * traverse_obj ( video_params , {
' description ' : ( ' description ' , { str } ) ,
' thumbnail ' : ( (
( ' images ' , lambda _ , v : v [ ' name ' ] == ' episodeThumbnail ' , ' url ' ) , ' thumbnail ' ) , { str } , any ) ,
' chapters ' : ( ' cuePoints ' , . . . , {
' start_time ' : ( ' start ' , { int_or_none } ) ,
' end_time ' : ( ' end ' , { int_or_none } ) ,
' title ' : ( ' type ' , { str } ) ,
} ) ,
' duration ' : ( ( ' duration ' , ' eventDuration ' ) , { int_or_none } , any ) ,
' timestamp ' : ( ' pubDate ' , { functools . partial ( parse_iso8601 , delimiter = ' ' ) } ) ,
' series ' : ( ( ' seriesTitle ' , ' showTitle ' ) , { unescapeHTML } , any ) ,
' uploader_id ' : ( ' channel ' , { str } ) ,
} ) ,
2016-08-21 23:06:39 +00:00
}
2021-12-20 02:48:41 +00:00
class ABCIViewShowSeriesIE ( InfoExtractor ) :
IE_NAME = ' abc.net.au:iview:showseries '
_VALID_URL = r ' https?://iview \ .abc \ .net \ .au/show/(?P<id>[^/]+)(?:/series/ \ d+)?$ '
_GEO_COUNTRIES = [ ' AU ' ]
_TESTS = [ {
' url ' : ' https://iview.abc.net.au/show/upper-middle-bogan ' ,
' info_dict ' : {
' id ' : ' 124870-1 ' ,
' title ' : ' Series 1 ' ,
' description ' : ' md5:93119346c24a7c322d446d8eece430ff ' ,
' series ' : ' Upper Middle Bogan ' ,
' season ' : ' Series 1 ' ,
2024-06-11 23:09:58 +00:00
' thumbnail ' : r ' re:^https?://cdn \ .iview \ .abc \ .net \ .au/thumbs/.* \ .jpg$ ' ,
2021-12-20 02:48:41 +00:00
} ,
' playlist_count ' : 8 ,
} , {
' url ' : ' https://iview.abc.net.au/show/upper-middle-bogan ' ,
' info_dict ' : {
' id ' : ' CO1108V001S00 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Series 1 Ep 1 I \' m A Swan ' ,
' description ' : ' md5:7b676758c1de11a30b79b4d301e8da93 ' ,
' series ' : ' Upper Middle Bogan ' ,
' uploader_id ' : ' abc1 ' ,
' upload_date ' : ' 20210630 ' ,
' timestamp ' : 1625036400 ,
} ,
' params ' : {
' noplaylist ' : True ,
' skip_download ' : ' m3u8 ' ,
} ,
2023-11-15 23:24:55 +00:00
} , {
# 'videoEpisodes' is a dict with `items` key
' url ' : ' https://iview.abc.net.au/show/7-30-mark-humphries-satire ' ,
' info_dict ' : {
' id ' : ' 178458-0 ' ,
' title ' : ' Episodes ' ,
' description ' : ' Satirist Mark Humphries brings his unique perspective on current political events for 7.30. ' ,
' series ' : ' 7.30 Mark Humphries Satire ' ,
' season ' : ' Episodes ' ,
2024-06-11 23:09:58 +00:00
' thumbnail ' : r ' re:^https?://cdn \ .iview \ .abc \ .net \ .au/thumbs/.* \ .jpg$ ' ,
2023-11-15 23:24:55 +00:00
} ,
' playlist_count ' : 15 ,
2021-12-20 02:48:41 +00:00
} ]
def _real_extract ( self , url ) :
show_id = self . _match_id ( url )
webpage = self . _download_webpage ( url , show_id )
webpage_data = self . _search_regex (
r ' window \ .__INITIAL_STATE__ \ s*= \ s*[ \' " ](.+?)[ \' " ] \ s*; ' ,
webpage , ' initial state ' )
video_data = self . _parse_json (
2024-06-11 23:09:58 +00:00
unescapeHTML ( webpage_data ) . encode ( ) . decode ( ' unicode_escape ' ) , show_id )
2021-12-20 02:48:41 +00:00
video_data = video_data [ ' route ' ] [ ' pageData ' ] [ ' _embedded ' ]
2022-01-23 19:51:39 +00:00
highlight = try_get ( video_data , lambda x : x [ ' highlightVideo ' ] [ ' shareUrl ' ] )
2022-01-23 17:54:24 +00:00
if not self . _yes_playlist ( show_id , bool ( highlight ) , video_label = ' highlight video ' ) :
return self . url_result ( highlight , ie = ABCIViewIE . ie_key ( ) )
2021-12-20 02:48:41 +00:00
series = video_data [ ' selectedSeries ' ]
return {
' _type ' : ' playlist ' ,
2023-11-15 23:24:55 +00:00
' entries ' : [ self . url_result ( episode_url , ABCIViewIE )
for episode_url in traverse_obj ( series , (
' _embedded ' , ' videoEpisodes ' , ( None , ' items ' ) , . . . , ' shareUrl ' , { url_or_none } ) ) ] ,
2021-12-20 02:48:41 +00:00
' id ' : series . get ( ' id ' ) ,
' title ' : dict_get ( series , ( ' title ' , ' displaySubtitle ' ) ) ,
' description ' : series . get ( ' description ' ) ,
' series ' : dict_get ( series , ( ' showTitle ' , ' displayTitle ' ) ) ,
' season ' : dict_get ( series , ( ' title ' , ' displaySubtitle ' ) ) ,
2023-11-15 23:24:55 +00:00
' thumbnail ' : traverse_obj (
series , ' thumbnail ' , ( ' images ' , lambda _ , v : v [ ' name ' ] == ' seriesThumbnail ' , ' url ' ) , get_all = False ) ,
2021-12-20 02:48:41 +00:00
}