
    i                        d dl Z d dlZd dlZd dlZddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z#  G d	 d
e      Z$ G d de      Z% G d de      Z& G d de      Z' G d de'      Z( G d de'      Z) G d de'      Z* G d de'      Z+ G d de'      Z, G d de      Z-y)    N   )InfoExtractor   )HEADRequest)	HTTPError)ExtractorErrorfloat_or_noneint_or_nonejoin_nonempty
js_to_jsonjwt_decode_hs256mimetype2ext
orderedSetparse_age_limitparse_iso8601replace_extensionsmuggle_urlstrip_or_nonetry_getunified_timestamp
update_urlurl_basenameurl_or_noneurlencode_postdataurljoin)requiretraverse_objtrim_strc                       e Zd ZdZdZddddddd	d
ddddddddddddddddddddddddddddd d!d"dd#d$d%d&dd'd(d)d*dd+d,d-d.dd'd(gdd/d0d1d2d3d4d5d6gZd7 Zd8 Zy9):CBCIEzcbc.caz`https?://(?:www\.)?cbc\.ca/(?!player/|listen/|i/caffeine/syndicate/)(?:[^/?#]+/)+(?P<id>[^/?#]+)zGhttp://www.cbc.ca/22minutes/videos/clips-season-23/don-cherry-play-offs 97e24d09672fc4cf56256d6faa6c25bc
2682904050mp4u   Don Cherry – All-Starsu^   Don Cherry has a bee in his bonnet about AHL player John Scott because that guy’s got heart.iXV20160203CBCC-NEWidexttitledescription	timestampupload_dateuploaderzGeo-restricted to Canadaurlmd5	info_dictskipzPhttp://www.cbc.ca/22minutes/videos/22-minutes-update/22-minutes-update-episode-4 162adfa070274b144f4fdc3c3b8207db
2414435309z*22 Minutes Update: What Not To Wear QuebeczKThis week's latest Canadian top political story is What Not To Wear Quebec.20131025iәjR)r'   r(   r)   r*   r,   r-   r+   zNo longer availablezRhttp://www.cbc.ca/archives/entry/1978-robin-williams-freestyles-on-90-minutes-live 0274a90b51a9b4971fe005c63f592f12
2487345465z,Robin Williams freestyles on 90 Minutes LivezWacky American comedian Robin Williams shows off his infamous "freestyle" comedic talents while being interviewed on CBC's 90 Minutes Live.19780210iAz404 Not Foundznhttp://www.cbc.ca/natureofthings/blog/birds-eye-view-from-vancouvers-burrard-street-bridge-how-we-got-the-shot 377572d0b49c4ce0c9ad77470e0b96b4
2680832926z&An Eagle's-Eye View Off Burrard BridgezwHercules the eagle flies from Vancouver's Burrard Bridge down to a nearby park with a mini-camera strapped to his back.20160201iV)r'   r(   r)   r*   r,   r+   r-   )r0   r1    415a0e3f586113894174dfb31aa5bb1a
2658915080zFly like an eagle!zFEagle equipped with a mini camera flies from the world's tallest tower20150315iU)r/   playlistr2   zJhttp://www.cbc.ca/news/canada/calgary/dog-indoor-exercise-winter-1.3928238zWKeep Rover active during the deep freeze with doggie pushups and other fun indoor tasksz$dog-indoor-exercise-winter-1.3928238z$md5:c18552e41726ee95bd75210d1ca9194c)r)   r'   r*      )r/   r1   playlist_mincountc                 H   | j                  ||t              }|j                  d      }|sc|d   }| j                  d| d|d      }|rt	        |d t
              }|s0| j                  d|z   |      d	   d
   d   j                  d      d   }| j                  d| d|      S )NmediaIdclipIdzLhttp://tpfeed.cbc.ca/f/ExhSPC/vms_5akSXx4Ng_Zn?byCustomValue={:mpsReleases}{}Ffatalc                     | d   d   d   S )Nentriesr   guid xs    G/var/www/files/kim/lib/python3.12/site-packages/yt_dlp/extractor/cbc.py<lambda>z,CBCIE._extract_player_init.<locals>.<lambda>~   s    1Y<?63J     z\http://feed.theplatform.com/f/h9dtGB/punlNGjMlc1F?fields=id&byContent=byReleases%3DbyId%253DrI   r   r'   /
cbcplayer:	CBCPlayer)_parse_jsonr   get_download_jsonr   strsplit
url_result)selfplayer_init
display_idplayer_infomedia_idclip_idfeeds          rN   _extract_player_initzCBCIE._extract_player_initu   s    &&{J
K??9-!(+G&&abiajjlmu ' &D "4)JCP..ru||&(()++/116sB@ H:6XNNrP   c                 l   | j                  |      }| j                  ||      }| j                  |d       xs( | j                  d|dd       xs | j	                  |      }| j                  d|dd|      }| j                  d|d|i t        	      }t        j                  d
|      D cg c]  }| j                  ||       }}g }dD ]'  }	|j                  t        j                  |	|             ) |j                  t        |dddddd ddt        hf	             t        |ddt        hf      x}
r|j                  |
       |j                  t        |      D cg c]  }| j!                  d| d|       c}       | j#                  ||t%        |      | j'                  |            S c c}w c c}w )Ndefaultztwitter:titler)   u'   ^(?P<title>.+?)(?:\s*[|–-]\s*CBC.*)?$zcleaned title)groupre   window\.__INITIAL_STATE__\s*=initial state)re   transform_sourcez,CBC\.APP\.Caffeine\.initInstance\(({.+?})\);)z%<iframe[^>]+src="[^"]+?mediaId=(\d+)"z<div[^>]+\bid=["\']player-(\d+)zguid["\']\s*:\s*["\'](\d+)detailcontentbody.c                     |d   dk(  S )Ntypepolopoly_mediarK   _vs     rN   rO   z%CBCIE._real_extract.<locals>.<lambda>   s    6&66 rP   sourceIdapp	contentIdrS   rT   )	_match_id_download_webpage_og_search_title_html_search_meta_html_extract_title_search_regex_search_jsonr   refindallrb   extendr   rX   appendr   rZ   playlist_resultr   _og_search_description)r[   r/   r]   webpager)   datar\   rI   	media_idsmedia_id_re
content_idr_   s               rN   _real_extractzCBCIE._real_extract   s   ^^C(
((j9&&w&= 6**?GWVZ*[6,,W5 	 ""6?'5 # B   ,gZj ! R  "zz*Y[bce %%k:>e e 	/ 	?K RZZW=>		?
 	dii6	:PSu-V W 	X &dUK#,GHH:HZ(&y13 OOj
3[(K3 	4 ##Zu!5''02 	2#e3s   *F,F1N)__name__
__module____qualname__IE_NAME
_VALID_URL_TESTSrb   r   rK   rP   rN   r    r    "   s'   GtJ Y1/{#%"
 +  b1Ah%"#
 &  d1C j%""
    @5"B  Z)'&
 6"-h)'&
. +5: \n8A

 	KNF`O  2rP   r    c                   :   e Zd ZdZdZdgZdddddd	d
dddddddi ddddddddddddddd g d!d"d#d$gd%d&d'd(d)d$d*d+d,d-d.d/d0d1gd2d3d4dd5d6d7d8d9g d:d;d<gd<g d=d/d>gd?d@dAidBdCdi ddDddddddEddddddd g d!d"d#d$gd%d&d'd(d)d$d*d+d,d-d.d/d0d1gd2dFdGdd5d6d7d8d9g d:d;d<gd<g d=d/d>gd?d@dAidBdHdIi ddJddddKddLddMd!dNdOdPdQdRdSgiddTd dUddVd#g dWd)dXd%dYgd'dZd.d[d0d>gd2d\d]i dd^dddd_dd`ddad!dbdOdcdddedfgiddgd g d#dhd)dYd%did'dZd.d/ddjd0d>gd2dkdlddmdndodpdqdrdsdtg g dugg dvdZdwdxd@dAidydzd{d|dd}d~dYd/ddddg g dg ddd2dddddddd/ddddg d>gd>dgdddd2dddddddddgZd Zd Zy)CBCPlayerIEzcbc.ca:playerzy(?:cbcplayer:|https?://(?:www\.)?cbc\.ca/(?:player/play/(?:video/)?|i/caffeine/syndicate/\?mediaId=))(?P<id>(?:\d\.)?\d+)CAz(http://www.cbc.ca/player/play/2683190193 64d25f841ddf4ddb28a235338af32e2c
2683190193r#   zGerry Runs a Sweat Shopz$md5:b457e1c01e8ff408d9d801c1c2cd29b0iV20160210r%   r&   z0Geo-restricted to Canada and no longer availabler.   z:http://www.cbc.ca/i/caffeine/syndicate/?mediaId=2657631896 e5e708c34ae6fca156aafe17c43e8b75r'   
2657631896r(   mp3r)   z>CBC Montreal is organizing its first ever community hackathon!r*   z$md5:dd3b692f0a139b0369943150bd1c46a9r+   iЅTr,   20150307	thumbnailzChttps://i.cbc.ca/ais/1.2985700,1717262248558/full/max/0/default.jpgchaptersdurationg"~@
categorieszAll in a Weekend Montrealtagszcount:11locationQuebecseriesseasonzSeason 2015season_numberi  
media_typeExcerptgenresOther)r/   r0   r1   z:http://www.cbc.ca/i/caffeine/syndicate/?mediaId=2164402062
2164402062zCancer survivor four times overzNTim Mayer has beaten three different forms of cancer four times in five years.iz޳N20111104zChttps://i.cbc.ca/ais/1.1711287,1717139372111/full/max/0/default.jpgg9v[g@zCBC News: Windsor at 6:00Windsor)CancerzNews/Canada/Windsorr   News)r'   r(   r)   r*   r+   r,   r   r   r   r   r   r   r   r   r   skip_downloadm3u8r/   r1   paramsz(https://www.cbc.ca/player/play/1.2985700z	1.2985700zThe modern technology we tend to depend on so heavily, is never without it's share of hiccups and headaches. Next weekend - CBC Montreal will be getting members of the public for its first Hackathon.z(https://www.cbc.ca/player/play/1.1711287z	1.1711287z.https://www.cbc.ca/player/play/video/9.6424403 8025909eaffcf0adf59922904def9a5ez	9.6424403z(The National | N.W.T. wildfire emergencyz$md5:ada33d36d1df69347ed575905bfd496ciofg#~	@	subtitleszen-USz
re:Englishz_https://cbchls.akamaized.net/delivery/news-shows/2024/06/17/NAT_JUN16-00-55-00/NAT_JUN16_cc.vtt)namer/   z^https://i.cbc.ca/ais/6272b5c6-5e78-4c05-915d-0e36672e33d1,1714756287822/full/max/0/default.jpgzcount:520240617)r   The NationalzThe National Latest BroadcastszThe National - Full Showr   CanadazFull Programz.https://www.cbc.ca/player/play/video/1.7194274 188b96cf6bdcb2540e178a6caa957128z	1.7194274z;#TheMoment a rare white spirit moose was spotted in Albertaz$md5:18ae269a2d0265c5b0bbe4b2e1ac61a3i5fgZdkS@engvttm3u8_native)r(   protocolzChttps://i.cbc.ca/ais/1.7194274,1717224990425/full/max/0/default.jpgzcount:3zcount:1720240504z.https://www.cbc.ca/player/play/video/9.6427282z	9.6427282z#Men's Soccer - Argentina vs MoroccozGArgentina faces Morocco on the football pitch at Saint Etienne Stadium.z
CBC SportszEvent Coveragez^https://i.cbc.ca/ais/a4c5c0c2-99fa-4bd3-8061-5a63879c1b33,1718828053500/full/max/0/default.jpgg   >A20240724g     @z2024 Paris Olympic Games)zOlympics Summer SoccerzSummer Olympics ReplayszSummer Olympics Soccer Replays)r'   r(   r)   r*   r   r   r   r+   r,   r   r   r   r   r   r   zVideo no longer available)r/   r1   r2   r   z.https://www.cbc.ca/player/play/video/9.6459530 6c1bb76693ab321a2e99c347a1d5ecbcz	9.6459530z-Parts of Jasper incinerated as wildfire ragesz$md5:6f1caa8d128ad3f629257ef5fecf0962z^https://i.cbc.ca/ais/507c0086-31a2-494d-96e4-bffb1048d045,1721953984375/full/max/0/default.jpggŨA20240726gzG@zcount:23)zNews (FAST)r   r   zTV News ShowszThe National )r'   r(   r)   r*   r   r   r   r+   r,   r   r   r   r   r   z.https://www.cbc.ca/player/play/video/9.6420651 71a850c2c6ee5e912de169f5311bb533z	9.6420651z>Is it a breath of fresh air? Measuring air quality in Edmontonz$md5:3922b92cc8b69212d739bd9dd095b1c3zCBC News Edmontonz^https://i.cbc.ca/ais/73c4ab9c-7ad4-46ee-bb9b-020fdc01c745,1718214547576/full/max/0/default.jpgg&qH}A20240612gL7A`q@Edmontonzcount:7)r'   r(   r)   r*   r   r   r   r+   r,   r   r   r   r   r   r   zcbcplayer:1.7159484Tr/   only_matchingzcbcplayer:2164402062z(http://www.cbc.ca/player/play/2657631896c                 >    t        |dfddt        ht        f      S )Nr   c                     |d   k(  S )Nr   rK   )rq   rr   r   s     rN   rO   z*CBCPlayerIE._parse_param.<locals>.<lambda>  s    &	T@Q rP   value)r   rX   any)r[   
asset_datar   s     `rN   _parse_paramzCBCPlayerIE._parse_param  s"    J3QSZ]`\acf(ghhrP   c                 X   | j                  |      }| j                  d| |      }| j                  d|d|t              d   d   }t	        |ddd	 f      }|s-t	        |d
t
        hf      x}rddt        d| dddi      |ddS t	        |ddt
        hf      dk(  g i }}t	        |ddd f      D ]K  }	|j                  |	j                  d      xs dg       j                  |	d   |	j                  d      d       M |D ]  }
|
d   }|
d   }|dk7  r| j                  d| d |        +| j                  ||d!| d"      }t        | j                  |d#            }|d$k(  r| j                  |d%   |d&d'(      \  }}|j                  |       |s| j!                  ||)       s|st	        |d* t"        t%        j&                  t(        d+ ,      hd-t*        hf      xs i }| j-                  d.|j                  d%      d/d 0      }|rd1|v r|t/        t1        |d%         d&      z   }| j3                  t5        |      |d2d3d34      sL|j                  i ||d5d6d d d7       i|j                  |d%   || j                  |d8      d9k(  rd:nd d;        t	        |dd<d= d>t7        d?@      hfdAt7        d?@      hfdBt
        hfdCf      }t9        |      dDk(  r*|dE   j                  dF      s|dE   j                  dG      sg }i t	        |dHt
        hfdIt
        j:                  hfdJd%t<        ht?        d K      hfdLt7        d?@      hfddMt
        hfdNt
        hfddOt@        hfddPt6        hfdQhfddRt
        hfdSdTdBt
        hfddUt"        fdVdTdBt
        hfdW      ||||dXS )YNhttps://www.cbc.ca/player/play/rg   rh   ri   videocurrentClipmediaassetsc                 ,    t        |d         xr |d   S )Nkeyrn   r   rp   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    ;qx3H3VQvY rP   rC   url_transparentThePlatformz;http://link.theplatform.com/s/ExhSPC/media/guid/2655402169/z?mbr=true&formats=MPEG4,FLV,MP3force_smil_urlT)resproto)_typeie_keyr/   r'   _format_sort_fields
streamTypeLive
textTracksc                     t        |d         S )Nsrcr   rp   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    ;WXY^W_K` rP   languageundr   label)r/   r   r   rn   medianetz!Skipping unsupported asset type "z": zDownloading z JSONcontentTyper   r/   r#   hls)m3u8_idlive)targetc                 8    |j                  d      dk7  xr |d   S )Nvcodecnonetbr)rV   rp   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    xF!:!Gqx rP   c                     | d   S )Nr   rK   rL   s    rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s
    QuX rP   )r   rR   z(https?://[^?#]+?/)hdntl=zbase urlrd   z/live/zChecking for https formatF)errnoterG   z	https-mp4https)r/   	format_idr   manifest_urlacodec	mediaTypeaudior   )r/   r(   r   r   c                 "    t        |d         d uS )N	startTime)floatrp   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    eAkN.C4.O rP   r     scaleendTimer   )
start_timeend_timer)   r   r   r   r   r)   r*   imagequerypublishedAtclipTypeshowNamer   r   c                     rd S | S NrK   )rM   is_lives    rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    V]d cd rP   regionr   .genrer   )r)   r*   r   r+   r   r   r   r   r   r   r   r   )r'   formatsr   r   r  )!rv   rw   r|   r   r   rX   r   
setdefaultrV   r   report_warningrW   r   r   #_extract_m3u8_formats_and_subtitlesr   _merge_subtitlesall	functoolspartialsorteddictr{   r   r   _request_webpager   r	   lenstripr   r   r
   )r[   r/   video_idr   r   r   r_   r
  r   subasset	asset_key
asset_typer   r(   fmtssubsbest_video_fmtbase_urlmp4_urlr   r  s                        @rN   r   zCBCPlayerIE._real_extract  s   >>#&((+J8*)UW_`  ,gX
 ! DDKMMZ\ 7H&VWY |D9se:L'MM8M +'"QRZQ[[z{($~ '7	 	 tg|cU%CDNw>`&ab 	C  !4!=rBII5z(K 	  *	EeIvJZ'##&G
|SVW`Va$bc,,YLQ[P\\aBbcJt00]KLCf}!EEu%xG F U
dt$ ))$y)A$!-dG&&v3EFGdV5U "V "\Y[   --0.2D2DU2KZae . g8x#7"%6|NSXDY7Z\a%bb((#G,h8S %U ) 4 NN $($&%0$+(,"&$  %e,(,(9(9*k(RV](]fcg  M*	X  Z!O*]-F,GH&T)B(CD 3%R'  x=Ax{|'DQRXbHcH
4!C5) -		{;%u{mjt>T=UV+m$.G-HI&
SE:%u-")8k]!C$j=/DdCef$h6fse4"GS1+S&3%@" 
 " '
 	
rP   N)	r   r   r   r   r   _GEO_COUNTRIESr   r   r   rK   rP   rN   r   r      s   G NJVN91.A#%"
 C L1
,
5
 U
 A	

 
 :
 ^
 
 
 67
 J
 
 1
 m
 T
  )!
" wi#
. L6k#%^1$+!@#h
" #F+', :1
+
5
 U
   f	

 
 :
 ^
 
 
 67
 J
 
 1
 m
 T
  )!
" wi#
	0 :6k#%^1$+!@#h
" #F+'0 @1
+
5
 ?
 A	

 
 
 )| 
 y
 	
 :
  T!
" 0#
$ ^$%
& '
( .)
* vh+
< @1
+
5
 R
 A	

 
 
 %%]"K!LM
 ^
 
 )
 n
 J
 
 )
 :
  vh!
, @;d"*y%%/0q 
" ,"F+), @1DA$#y'%c
( @1UA)#y'%h!:."
* % & :mYFvii
rP   r   c                   >    e Zd ZdZdZddddiddd	ddd
iddgZd Zy)CBCPlayerPlaylistIEzcbc.ca:player:playlistz=https?://(?:www\.)?cbc\.ca/(?:player/)(?!play/)(?P<id>[^?#]+)zKhttps://www.cbc.ca/player/news/TV%20Shows/The%20National/Latest%20Broadcast   r'   z+news/tv shows/the national/latest broadcastzPlaylist no longer available)r/   rA   r1   r2   z+https://www.cbc.ca/player/news/Canada/Northznews/canada/northc                     t         j                  j                   j                  |            j	                          j                  |      } j                  d|d       fd} j                   |             S )Nrg   rh   c            	   3   x   K   t        ddfddddf      D ]  } j                  d|  t                y w)Nr   clipsByCategoryc                 *    | j                         k(  S r  )lower)krq   playlist_ids     rN   rO   zDCBCPlayerPlaylistIE._real_extract.<locals>.entries.<locals>.<lambda>  s    k9Q rP   items.r'   r   )r   rZ   r   )r  json_contentr+  r[   s    rN   rI   z2CBCPlayerPlaylistIE._real_extract.<locals>.entries  sR     (*,QSZ\_ae8  a oo(Gz&RT_``as   7:)urllibparseunquoterv   r)  rw   r|   r   )r[   r/   r   rI   r-  r+  s   `   @@rN   r   z!CBCPlayerPlaylistIE._real_extract	  sr    ll**4>>#+>?EEG((k:((,gU	a ##GI{;;rP   Nr   r   r   r   r   r   r   rK   rP   rN   r#  r#    sP    &GQJ\?
 / =%
 /F <rP   r#  c                   ,    e Zd ZdZdgZddZddZd Zy)	CBCGemBaseIEcbcgemr   Nc                 <    | j                  d| |xs |ddi      S )Nz9https://services.radio-canada.ca/ott/catalog/v2/gem/show/devicewebr   rW   )r[   item_idr]   s      rN   _call_show_apizCBCGemBaseIE._call_show_api  s3    ""GyQ!'(E): # < 	<rP   c                 Z   | j                  d|xs |||ddddddd|d		
      }t        |dt        hf      }|dk(  r| j                  | j                         |dk(  r| j                  d       |dk7  r7t        ||j                  d      d      }t        | j                   d|       |S )Nz5https://services.radio-canada.ca/media/validation/v2/hdipadtruejsonr   2desktop)	appCodeconnectionType
deviceTypemultibitrateoutputtechmanifestVersionmanifestTypeidMedia)headersr  	errorCoder   )	countries#   password)methodr   messagez - )delimz said: )
rW   r   intraise_geo_restrictedr!  raise_login_requiredr   rV   r   r   )r[   r_   app_coder]   rK  
media_data
error_codeerror_messages           rN   _call_media_apizCBCGemBaseIE._call_media_api!  s    ((C"(G#"&$ & #& )#
< ) 
 "*{SE.BC
?%%0C0C%D%%Z%8?)*jnnY6OW\]M DLL>!HIIrP   c                    d }t        |dt        hf      }|rCt        j                  d|      x}r+t	        |j                  d            }|j                  d      }d|it        |dt        hfdt        hfdt        hfdddt        ht        d 	      hfd
t        hfddt        hfddt        hfddt        hfddt        d      ht        hfd	      ||dS )Nr)   z (?P<episode>\d+)\. (?P<title>.+)episodeepisode_numberr/   r*   imagescardr   episodeNumbermetadatar   airDateavailabilityDateratingC)start)	r'   
episode_idr*   r   r]  r   release_timestampr+   	age_limit)r\  r)   )r   rX   r}   matchr
   rf   r   r   r   r   r   )r[   	item_infor]  r)   mobjs        rN   _extract_item_infozCBCGemBaseIE._extract_item_info;  s   Y3%(89bhh'JERRdR(I)>?NJJw'E n
9sen$sen -u5&}zX\G]F^_#2[M"B'k]C&0)>O=P%Q(*<?P>QR((XC5H4IOK\]
' 

 
 	
rP   r  )gemNN)r   r   r   _NETRC_MACHINEr!  r:  rZ  rm  rK   rP   rN   r3  r3    s    NVN<
4
rP   r3  c                   v   e Zd ZdZdZdi dddddd	d
dddddddgdddddddd	ddddddddd d!d"d#d$d%id&d'id(d)i dd*dddd+d
d,dd-dddddd.dddd+dd*dd/ddgdd0dd1d d2d"d3d$d%id&d'id(d4d5d6gZd7Zd8Zd8Zd8Z	e
j                  d9        Zd: Zd@d;Zd< Zd= Zd> Zd? Zy8)ACBCGemIEz
gem.cbc.cazbhttps?://gem\.cbc\.ca/(?:media/)?(?P<id>[0-9a-z-]+/s(?P<season>[0-9]+)[a-z][0-9]{2,4})/?(?:[?#]|$)z-https://gem.cbc.ca/media/schitts-creek/s06e01r'   zschitts-creek/s06e01r(   r#   r)   zSmoke Signalsr*   z$md5:929868d20021c924020641769eb3e7f1r   z\re:https://images\.radio-canada\.ca/[^#?]+/cbc_schitts_creek_season_06e01_thumbnail_v01\.jpgr   i,  r   u   Comédie et humourr   Schitt's Creekr   Season 6r   r@   r\  r]  r   rg  r,   20210618r+   i `release_date20200107rh  i ^ri     formatbvr   z-https://gem.cbc.ca/media/schitts-creek/s01e01zschitts-creek/s01e01zThe Cup Runneth Overz$md5:9bca14ea49ab808097530eb05a29e797z\re:https://images\.radio-canada\.ca/[^#?]+/cbc_schitts_creek_season_01e01_thumbnail_v01\.jpgzSeason 1i  20210617i`20151123i WRVz3https://gem.cbc.ca/nadiyas-family-favourites/s01e01Tr   z$fc05b0ee-3865-4400-a3cc-3da82c330c23Nc                 <    | j                  dd dddi      d   d   S )Nz<https://services.radio-canada.ca/ott/catalog/v1/gem/settingszDownloading site settingsr6  r7  r   identityManagementropcr8  r[   s    rN   _ropc_settingszCBCGemIE._ropc_settings  s=    ""JD'%/@ # BBVXX^` 	`rP   c                 N    t        |      d   t        j                         z
  dk  S )Nexpi,  )r   time)r[   tokens     rN   _is_jwt_expiredzCBCGemIE._is_jwt_expired  s"    &u-		;cAArP   c                 :   | j                  | j                  d   d |t        d| j                  i|d| j                  d   i            }|d   | _        |d   | _        | j                  j                  | j                  d| j                  | j
                  g       y )	Nr/   	client_idscopescopes)r   refresh_tokenaccess_token
token_data)	rW   r  r   
_CLIENT_ID_refresh_token_access_tokencachestorero  )r[   
oauth_datanoteresponses       rN   _call_oauth_apizCBCGemIE._call_oauth_api  s    &&&d9KT__MM ,,X6M : '  '7%n5

,,lT=P=PRVRdRd<efrP   c                     | j                   s7| j                  j                  | j                  dd d g      \  | _         | _        | j                   rU| j                  rI| j                  d       | j                  s+| j                  j                  | j                  d      | _        y 	 | j                  d||dd       y # t        $ rF}t        |j                  t              r&|j                  j                  d	k(  rt        d
d       d }~ww xY w)Nr  rd   zUsing cached refresh tokenclaims_tokenrO  )
grant_typeusernamerO  z
Logging in)r  i  z Invalid username and/or passwordTexpected)r  r  loadro  r  write_debug_claims_tokenr  r   
isinstancecauser   status)r[   r  rO  es       rN   _perform_loginzCBCGemIE._perform_login  s    ""6:jjoo##\D$< 7F 7I3D!3 4#5#59:%%%)ZZ__T5H5H.%Y"		  ($$" !	 ! "
  	!''9-!''..C2G$%GRVWW	s   &B> >	DADDc                    | j                  | j                        r+	 | j                  d| j                  d       | j                  S | j                  S # t        $ rt d\  | _        | _        | j
                  j                  | j                  dd d g       | j                  d        | j                  | j                           Y | j                  S w xY w)Nr  )r  r  )NNr  z=Refresh token has been invalidated; retrying with credentials)r  r  r  r  r   r  r  ro  r  r  _get_login_infor  s    rN   _fetch_access_tokenzCBCGemIE._fetch_access_token  s     2 23	=$$"1%)%8%8&  !!!t!!! " =:D7#T%7

  !4!4lT4LQ##$cd###T%9%9%;<!!!=s   A A/CCc           
         | j                         d   sy | j                  r| j                  | j                        rp| j                  dd dddidd| j	                          i      d	   | _        | j
                  j                  | j                  d
| j                         | j                  S | j                  d       | j                  S )Nr   zKhttps://services.radio-canada.ca/ott/subscription/v2/gem/Subscriber/profilezDownloading claims tokenr6  r7  AuthorizationzBearer )r  rK  claimsTokenr  zUsing cached claims token)	r  r  r  rW   r  r  r  ro  r  r  s    rN   _fetch_claims_tokenzCBCGemIE._fetch_claims_token  s    ##%a(!!T%9%9$:L:L%M!%!4!4]058I(GD4L4L4N3O*PQ "5 "S Ta"bD JJT00.$BTBTU !!! 89!!!rP   c                   
 | j                  |      j                  dd      \  
}| j                  
      }t        |ddddd
fdt        t        d      hf      }i }| j                         x}r||d	<   | j                  |d
   
|      d   }| j                  |
ddddi      }| j                  |       |D ]^  }	|	j                  d      dk(  s|	j                  d      d|	d<   |	j                  d      d|	d<   d|	d   j                         v sZd|	d<   ` dt        |      it        |dt        hfddd t        hfdd!dt        hfd"      | j                  |      

|d#S )$Nr'   r   rk   .lineupsr,  c                     |d   k(  S Nr/   rK   rq   rr   r  s     rN   rO   z(CBCGemIE._real_extract.<locals>.<lambda>  s    5X- rP   	item infozx-claims-tokenrJ  )r]   rK  r/   r#   r   rI   )r   r  r   r   r(   m4ar   z	mp4a.40.2descriptiver   
preferencer   r)   structuredMetadatapartofSeasonseasonNumberr	  )r   r   r   )r'   rg  r
  )_match_valid_urlrf   r:  r   r   r   r  rZ  _extract_m3u8_formats_remove_duplicate_formatsrV   r)  r
   rX   rm  )r[   r/   r   
video_infork  rK  r  m3u8_urlr
  fmtr  s             @rN   r   zCBCGemIE._real_extract  s   "&"7"7"<"B"B4"R-((2
 sIsG-sW[5I4J.L M	 3355<5(4G$%''i Xw ( HHMO,,hu^R<P - R&&w/ 
	+Cwwx F*775>)!&CJ778$,$/CM !C$4$:$:$<<(*C%
	+ [7
:"SE*"6YdXe!f/#uE( 
 %%i0
 "
 	
rP   )zRefreshing access token)r   r   r   r   r   r   r  r  r  r  r  cached_propertyr  r  r  r  r  r  r   rK   rP   rN   rq  rq  T  sa   GvJ ?
(
5
 _
 A	

 x
 
 +,
 '
 j
 Q
 
 a
 0
 :
 
  J!
"  #
$ %
( T"/4 ?
(
5
 +
 A	

 x
 '
 Q
 j
 a
 -
 0
 
 +,
 :
 
  J!
"  #
$ %
( T"/2 Ea3Fj 8JNMM` `
B	g,""(
rP   rq  c                   B    e Zd ZdZdZdddddddd	d
dddgZd Zd Zy)CBCGemPlaylistIEzgem.cbc.ca:playlistz]https?://gem\.cbc\.ca/(?:media/)?(?P<id>(?P<show>[0-9a-z-]+)/s(?P<season>[0-9]+))/?(?:[?#]|$)z*https://gem.cbc.ca/media/schitts-creek/s06   zschitts-creek/s06rs  rr  r@   )r'   r)   r   r   r   r/   playlist_countr1   z$https://gem.cbc.ca/schitts-creek/s06Tr   c              #      K   t        |dd f      D ]1  } | j                  d|d    t        fi | j                  |       3 y w)Nr,  c                     |d   S r  rK   rp   s     rN   rO   z+CBCGemPlaylistIE._entries.<locals>.<lambda>  s
    % rP   zhttps://gem.cbc.ca/media/r/   )r   rZ   rq  rm  )r[   season_infor\  s      rN   _entrieszCBCGemPlaylistIE._entries  sY     #K';P1QR 	4G!$//+GEN+;<h4))'24 4	4s   AAc                 r   | j                  |      j                  ddd      \  }}| j                  ||      }t        |dddfdt        t        d	      hf      } | j                  | j                  |      |fi t        |d
t        hfd
t        hfdt        hfd      dt        |d
t        hf      iS )Nr'   showr   )r]   rk   .r  c                 &    |d   t              k(  S )Nr  )rS  )rq   rr   r   s     rN   rO   z0CBCGemPlaylistIE._real_extract.<locals>.<lambda>"  s    >*c&k9 rP   zseason infor)   r  )r)   r   r   r   )
r  rf   r:  r   r   r   r   r  rX   r
   )r[   r/   	season_idr  	show_infor  r   s         @rN   r   zCBCGemPlaylistIE._real_extract  s    "&"7"7"<"B"B4QY"Z	4'''C	"9sI93AW@X/Z [ $t##MM+&	B;!C5)"SE*"0;-!@) B $I#/?@B 	BrP   N)r   r   r   r   r   r   r  r   rK   rP   rN   r  r    sL    #GqJ <%' 
	 6F 4BrP   r  c                   b    e Zd ZdZdZdZddddidd	d
ddidddddddddddd	ddddgZd Zy)CBCGemContentIEzgem.cbc.ca:contentFz4https?://gem\.cbc\.ca/(?P<id>[0-9a-z-]+)/?(?:[?#]|$)zhttps://gem.cbc.ca/the-tunnel   r'   z
the-tunnelr  zhttps://gem.cbc.ca/summit-72r   z	summit-72z?https://gem.cbc.ca/ski-jumping-nh-individual-womens-final-30086,ski-jumping-nh-individual-womens-final-30086r#   ,Ski Jumping: NH Individual (Women's) - Final$md5:411c07c8a9a4a36344530b0c726bf8ab1  !re:https://[^.]+\.cbc\.ca/.+\.jpgii20260207was_live	r'   r(   r)   r*   r   r   rh  ru  live_statusr/   r1   zhttps://gem.cbc.ca/copa-71Tr   c           
           j                  |      } j                  ||      } j                  ||      d   d   d   d   } j                  d| d       |dk(  r`t	        dd	d
dt        d      hf      }t        j                  |      r j                  |t              S  j                  d| dt              S  fd} j                   |       |      S )Nprops	pagePropsr   r   zRouting for content type ""
Standaloneheaderctar   r/   https://gem.cbc.ca/z/s01e01c               3      K   t        dddddt        d      hd hf      D ]  } j                  | t                y w)Nrk   .r  r/   r  c                 4    t         j                  |       r| S d S r  )r  suitablerL   s    rN   rO   z@CBCGemContentIE._real_extract.<locals>.entries.<locals>.<lambda>g  s     0 9 9! <1 $ rP   )r   r   rZ   r  )playlist_urlr   r[   s    rN   rI   z.CBCGemContentIE._real_extract.<locals>.entriesd  sT      ,T3	3@U8V7WFG4 ! F ool4DEE	Fs   >A)rv   rw   _search_nextjs_datar  r   r   CBCGemOlympicsIEr  rZ   rq  r   )r[   r/   r]   r   content_typenew_urlrI   r   s   `      @rN   r   zCBCGemContentIE._real_extractS  s    ^^C(
((j9''<WEkRSYZM*5l^1EF<'"4%%':O2P1Q*S TG((1w0@AA ??%8G#LhWW	F ##GIz::rP   N)r   r   r   r   IE_DESCr   r   r   rK   rP   rN   r  r  -  s    "GGHJ /,
	 .+
	 Q@DA=!+&%

  ,9 FD;rP   r  c                   :    e Zd ZdZdZddddddd	d
ddd	dgZd Zy)r  zgem.cbc.ca:olympicszRhttps?://gem\.cbc\.ca/(?P<id>(?:[0-9a-z]+-)+[0-9]{5,})/s01e(?P<media_id>[0-9]{5,})zIhttps://gem.cbc.ca/ski-jumping-nh-individual-womens-final-30086/s01e30086r  r#   r  r  r  r  r  r  r  r  r  c                 h  	 | j                  |      j                  dd      \  }	| j                  |      }t        |ddddd	fdt        t        d      hf      }d	d
dj                  |j                  d            }t        |ddt        ht        f      }|d	k(  r1|r/|t        j                         kD  rg }d}| j                  dd       n.| j                  	d|      d   }| j                  ||d|d	k(        }||||dt        |dt        hfdt        hfdddt        hfdddt        hfd      S )Nr'   r_   rk   .r  r,  c                     |d   k(  S )NformattedIdMediarK   )rq   rr   r_   s     rN   rO   z0CBCGemOlympicsIE._real_extract.<locals>.<lambda>  s    -.(: rP   r  r  r  )	LiveEventReplayrn   ra  ))r   	startDate)replayrb  is_upcoming#This livestream has not yet startedTr  medianetliver/   r#   r   r'   r
  r  rh  r)   r*   r^  r_  r  r   )r)   r*   r   r   )r  rf   r:  r   r   r   rV   r   r  raise_no_formatsrZ  r  rX   r   r
   )
r[   r/   r  r  rk  r  rh  r
  r  r_   s
            @rN   r   zCBCGemOlympicsIE._real_extract  s   !2237==dJO(((2
 sIsG:C'+BVAW.Y Z	
 # 
 #immF#
$ 	
 )FY\5^ _ )#(9>ORVR[R[R]>]G'K!!"GRV!W++HnhOPUVH008UQ\`iQi0jG &!2	

 9!C5) -u5&}E':}M	' 
 	
rP   Nr1  rK   rP   rN   r  r  n  s@    #GfJZ@DA=!+&%

 F#
rP   r  c                       e Zd ZdZdZddddddd	d
ddd	ddddd	ddddddddiddddd	dddddddd	ddidddd d!d	d"d#d$d%d&d'd(ddid)d*d+dd,gZd- Zy.)/CBCGemLiveIEzgem.cbc.ca:livez1https?://gem\.cbc\.ca/live(?:-event)?/(?P<id>\d+)z$https://gem.cbc.ca/live/920604739687Ottawaz5The live TV channel and local programming from Ottawazmhttps://thumbnails.cbc.ca/maven_legacy/thumbnails/CBC_OTT_VMS/Live_Channel_Static_Images/Ottawa_2880x1620.jpgr  AyqZwxRqh8EHr#   iX20170413r%   )	r)   r*   r   r  r'   r(   rh  ru  r-   zLive might have ended)r/   r1   r2   zhttps://gem.cbc.ca/live/4444Tzre:^Ottawa [0-9\-: ]+z/re:https://images.gem.cbc.ca/v1/cbc-gem/live/.*)r'   r(   r  r)   r*   r  r   r   )r/   r1   r   r2   z#https://gem.cbc.ca/live-event/1083510835uS   re:^The National \| Biden’s trip wraps up, Paltrow testifies, Bird flu [0-9\-: ]+u   March 24, 2023 | President Biden’s Ottawa visit ends with big pledges from both countries. Plus, Gwyneth Paltrow testifies in her ski collision trial.iGd20230325)	r'   r(   r  r)   r*   r  r   rh  ru  z#https://gem.cbc.ca/live-event/42314 297a9600f554f2258aed01514226a69742314r  z&Women's Soccer - Canada vs New Zealandz$md5:36200e5f1a70982277b5a6ecea86155dzre:https://.+default\.jpgi_f20240725)r'   r(   r  r)   r*   r   rh  ru  z#Replay might no longer be available)r/   r0   r1   r   r2   z#https://gem.cbc.ca/live-event/43273r   c                   	 | j                  |      	| j                  |	      }| j                  |	      d   d   d   }|j                  d      s0t	        |d      	k(  r|d   }nt	        |dd	fd	t
        f      xs i }|j                  d      }|st        d
d      |j                  d      rdnd}t	        |dt        hf      }|dk(  r1|r/|t        j                         kD  rg }d}| j                  dd       n.| j                  |d	      d   }| j                  |	d|dk(        }	|||dt	        |dt        hfdt        hfdd      S )Nr  r  r   r  )eventr   r  )freeTv)streams.r,  c                 8    |d   j                  d      d   k(  S )Nr   -r   )	partitionr  s     rN   rO   z,CBCGemLiveIE._real_extract.<locals>.<lambda>  s     5!3!3C!8!;x!G rP   zBCouldn't find video metadata, maybe this livestream is now offlineTr  isVodEnabledr  r  rb  r  r  r  r/   r#   r  r  r)   r*   )r^  r_  r/   )r)   r*   r   )rv   rw   r  rV   r   r   r   r   r  r  rZ  r  rX   )
r[   r/   r   r  video_stream_idr  rh  r
  r  r  s
            @rN   r   zCBCGemLiveIE._real_extract  s   >>#&((h7--gx@I+VW]^
 ~~01J(89XE'0
)*0'G7N O URT  %..);< U`df f %/NN>$Bj	(i-5QR)#(9>ORVR[R[R]>]G'K!!"GRV!W++O^XVW\]H008UQ\`iQi0jG &!2	


 :!C5) -u56( 

 
	
rP   Nr1  rK   rP   rN   r  r    s    GEJ :!V M($%/ *&
 ,	
  01V(O '-+	
 9o  z(O%/ *
 '-+	
" 95)BE9%/ *	 '-9	
" 9!	
}BFH(
rP   r  c                   V    e Zd ZdZdZddddddd	d
ddd	dddddddddddd	dgZd Zy)CBCListenIEzcbc.ca:listenzWhttps?://(?:www\.)?cbc\.ca/listen/(?:cbc-podcasts|live-radio)/[\w-]+/[\w-]+/(?P<id>\d+)z|https://www.cbc.ca/listen/cbc-podcasts/1353-the-naked-emperor/episode/16142603-introducing-understood-who-broke-the-internet16142603z/Introducing Understood: Who Broke the Internet?r   z$md5:c605117500084e43f08a950adc6a708c   i@hi5h20250428)	r'   r)   r(   r*   r   r+   rh  ru  r,   r  zghttps://www.cbc.ca/listen/live-radio/1-64-the-house/clip/16170773-should-canada-suck-stand-donald-trump16170773z2Should Canada suck up or stand up to Donald Trump?z$md5:7385194f1cdda8df27ba3764b35e7976iW  i&hi@h2025091920250920c                    | j                  |      | j                  d d      }t        |dt        hf      }|s`| j	                  d       | j                  |      }| j                  d|dt              }t        |d	d
dfdt        t        d      hf      }dit        |dt        ht        fdt        hfdt        hfdt        d      hfdt        d      hfdt        hfd      S )Nz'https://www.cbc.ca/listen/api/v1/clips/FrF   r   z:API failed to return data. Falling back to webpage parsingzwindow\.__PRELOADED_STATE__\s*=zpreloaded stater   )podcastDetailDatashowDetailData.episodesc                 &    t        |d         k(  S )NclipID)rX   r  s     rN   rO   z+CBCListenIE._real_extract.<locals>.<lambda>E  s    S8-9 rP   zepisode datar'   )r   r/   r)   r*   
releasedAtr   r   airdater   )r/   r)   r*   rh  r+   r   )rv   rW   r   r  r  rw   r|   r   r   r   r   rX   r
   )r[   r/   r  r   r   preloaded_stater  s         @rN   r   zCBCListenIE._real_extract7  s)   >>#&&&5hZ@(RW ' YHvv&67 \],,S(;G"//2G=N: 0 7O  7j93AX@Y2[ \D
 (

4&s;!C5) -u5&2[t5L4M%N'+D*A)BC'+7" 

 
	
rP   Nr1  rK   rP   rN   r  r    sn    GkJ NFA#!+&%

 yIA#!+&%

F8
rP   r  ).r  r}   r  urllib.parser.  commonr   
networkingr   networking.exceptionsr   utilsr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r    r   r#  r3  rq  r  r  r  r  r  rK   rP   rN   <module>r&     s     	   ! $ -     , > =C2M C2LK
- K
\
<- <D9
= 9
xm
| m
`&B| &BR>;l >;B5
| 5
po
< o
d9
- 9
rP   