
    bi                        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-dS )    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d9S ):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                    |                      ||t                    }|                    d          }|s|d         }|                     d| d|d          }|rt	          |d t
                    }|sD|                     d|z   |          d	         d
         d                             d          d         }|                     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    N/DATA/AppData/hermes/venv/lib/python3.11/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K??9-- 
	@!(+G&&mbimmmu ' & &D  Q"4)J)JCPP @..ru|| &(()++/116sB@ 6H66XNNNrP   c                    	                       |          	                     |	          }                     |d           p-                     d|dd           p                     |          }                     d|dd|          }                     d|d	i t          	          }	 fd
t          j	        d|          D             }g }dD ]*}|
                    t          j	        ||                     +|
                    t          |dddddd ddt          hf	                     t          |ddt          hf          x}r|                    |           |
                     fdt          |          D                                             |	t!          |                               |                    S )Ndefaultztwitter:titler)   u'   ^(?P<title>.+?)(?:\s*[|–-]\s*CBC.*)?$zcleaned title)groupre   window\.__INITIAL_STATE__\s*=initial state)re   transform_sourcec                 <    g | ]}                     |          S rK   )rb   ).0r\   r]   r[   s     rN   
<listcomp>z'CBCIE._real_extract.<locals>.<listcomp>   s?     e e e %%k:>>e e erP   z,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	contentIdc                 D    g | ]}                     d | d|          S )rS   rT   )rZ   )rk   r_   r[   s     rN   rl   z'CBCIE._real_extract.<locals>.<listcomp>   sB     3 3 3 OO333[(KK3 3 3rP   )	_match_id_download_webpage_og_search_title_html_search_meta_html_extract_title_search_regex_search_jsonr   refindallextendr   rX   appendr   playlist_resultr   _og_search_description)
r[   r/   webpager)   datarI   	media_idsmedia_id_re
content_idr]   s
   `        @rN   _real_extractzCBCIE._real_extract   sP   ^^C((
((j99&&w&== 6**?GWVZ*[[6,,W55 	 ""6?'5 # B B   ,gZj ! R Re e e e e!z*Y[bcce e e 	/ 	? 	?K RZW==>>>>dii66	:PSu-V W W 	X 	X 	X &dUK#,GHHH: 	)Z((( 3 3 3 3&y113 3 3 	4 	4 	4 ##Zu!5!5''002 2 	2rP   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 O O  2  2  2  2  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dS )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                 J    t          |dfddt          ht          f          S )Nr   c                     |d         k    S )Nr   rK   )rt   ru   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3Q3Q3Q3QSZ]`\acf(ghhhrP   c                    |                      |          }|                     d| |          }|                     d|d|t                    d         d         }t	          |ddd	 f          }|s6t	          |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 ]\}	|                    |	                    d          pdg           	                    |	d         |	                    d          d           ]|D ]}
|
d         }|
d         }|dk    r| 
                    d| d |            5|                     ||d!| d"          }t          |                     |d#                    }|d$k    r6|                     |d%         |d&d'(          \  }}|                    |           |s|                     ||)           s|st	          |d* t"          t%          j        t(          d+ ,          hd-t*          hf          pi }|                     d.|                    d%          d/d 0          }|rd1|v rB|t/          t1          |d%                   d&          z   }|                     t5          |          |d2d3d34          r|	                    i ||d5d6d d d7           |	                    |d%         ||                     |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    r8|dE                             dF          s|dE                             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                   o|d         S )Nkeyrq   r   rs   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    ;qx3H3H3VQvY 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   rs   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    ;WXY^W_K`K` rP   languageundr   label)r/   r   r   rq   medianetz!Skipping unsupported asset type "z": zDownloading z JSONcontentTyper   r/   r#   hls)m3u8_idlive)targetc                 D    |                     d          dk    o|d         S )Nvcodecnonetbr)rV   rs   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                 0    t          |d                   d uS )N	startTime)floatrs   s     rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    eAkN.C.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 n| S NrK   )rM   is_lives    rN   rO   z+CBCPlayerIE._real_extract.<locals>.<lambda>  s    V]Ndddcd rP   regionr   .genrer   )r)   r*   r   r+   r   r   r   r   r   r   r   r   )r'   formatsr   r   r  )!rz   r{   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   >>#&&(()U8)U)UW_``  ,gX
 ! D DDKMMZ\ 7H&V&VWY Y  	|D9se:L'M'MM8 	 +'"{RZ{{{($~  '7	 	 	 tg|cU%CDDNw>`>`&abb 	 	C  !4!4!=rBBII5z((K K    
  *	 *	EeIvJZ''##$b
$b$bW`$b$bccc,,YBbQ[BbBbBbccJt00]KKLLCf}}!EEu%xG F U U
dt$$$  B))$y)AAA $ !-dGG&v3E3EFFFGdV5U "V "V "\Y[   --0.2D2DU2K2KZae . g g 8x#7#7"%6|NSXDY7Z7Z\a%b%bb((#G,,h8S %U ) 4 4 
 NN $($&%0$+(,"&$ $ $    %e,(,(9(9*k(R(RV](](]ffcg         Z!O!O*]-F-F-F,GH&T)B)B)B(CD 3%R R'   x==Ax{|'D'DQRXbHcHcH
4!C5) -	{;%u{mjt>T>T>T=UV+m$.G.G.G-HI&
SE:%u-")8k]!C$j=/DdDdDdDdCe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      s1       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TT!
" 0#
$ ^$%
& '
( .)
* vh+
 < @1
+
5
 R
 A	

 
 
 %%]"K"K!LM
 ^
 
 )
 n
 J
 
 )
 :
  vh!
 , @;d"*y%%/0qqq 
 
" ,"F+) , @1DA$#y'%ccc
 
 ( @1UA)#y'%h!:."
 
 * %  &  : mYFvi i ii
 i
 i
 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dS )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                 6    t           j                                                 |                                                                         |          }                     d|d           fd}                      |                      S )Nrg   rh   c            	   3      K   t          ddfddddf          D ]"}                     d|  t                    V  #d S )Nr   clipsByCategoryc                 4    |                                  k    S r
  )lower)krt   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  sy      (*,Q,Q,Q,QSZ\_ae8   a a oo&R&R&RT_``````a arP   )urllibparseunquoterz   r-  r{   r   r   )r[   r/   r   rI   r1  r/  s   `   @@rN   r   z!CBCPlayerPlaylistIE._real_extract	  s    l**4>>#+>+>??EEGG((k::((,gU U	a 	a 	a 	a 	a 	a 	a ##GGII{;;;rP   Nr   r   r   r   r   r   r   rK   rP   rN   r'  r'    sv        &GQJ\?
 /  =%
 / F < < < < <rP   r'  c                   .    e Zd ZdZdgZddZd	dZd ZdS )
CBCGemBaseIEcbcgemr   Nc                 @    |                      d| |p|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  s9    ""QQQ!'(E): # < < 	<rP   gemc                    |                      d|p|||ddddddd|d		
          }t          |dt          hf          }|dk    r|                     | j                   |dk    r|                     d           |dk    r>t          ||                    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]   rP  
media_data
error_codeerror_messages           rN   _call_media_apizCBCGemBaseIE._call_media_api!  s    ((C"(G#"&$ & #& )#
< 
< )  
 "*{SE.BCC
??%%0C%DDD%%Z%888??)*jnnY6O6OW\]]]M DL!H!H!H!HIIIrP   c                    d }t          |dt          hf          }|rNt          j        d|          x}r7t	          |                    d                    }|                    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   rb  r   release_timestampr+   	age_limit)ra  r)   )r   rX   r   matchr
   rf   r   r   r   r   r   )r[   	item_inforb  r)   mobjs        rN   _extract_item_infozCBCGemBaseIE._extract_item_info;  s9   Y3%(899 	(bh'JERRRd 	((I)>)>??NJJw''E n
9sen$sen -u5&}zX\G]G]G]F^_#2[M"B'k]C&0)>O=P%Q(*<?P>QR((XC5H5H5H4IOK\]
' 
' 
 

 
 
 
 	
rP   r
  )r?  NN)r   r   r   _NETRC_MACHINEr%  r>  r_  rr  rK   rP   rN   r7  r7    sW        NVN< < < <
   4
 
 
 
 
rP   r7  c                   t   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dAd<Zd= Zd> Zd? Zd@ Zd8S )B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@   ra  rb  r   rl  r,   20210618r+   i `release_date20200107rm  i ^rn     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                 P    |                      dd dddi          d         d         S )Nz<https://services.radio-canada.ca/ott/catalog/v1/gem/settingszDownloading site settingsr:  r;  r  identityManagementropcr<  r[   s    rN   _ropc_settingszCBCGemIE._ropc_settings  sC    ""JD'%/@ # B BBVXX^` 	`rP   c                 \    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   Refreshing access tokenc                 &   |                      | j        d         d |t          d| j        i|d| j        d         i                    }|d         | _        |d         | _        | j                            | j        d| j        | j        g           d S )	Nr/   	client_idscopescopes)r   refresh_tokenaccess_token
token_data)	rW   r  r   
_CLIENT_ID_refresh_token_access_tokencachestorers  )r[   
oauth_datanoteresponses       rN   _call_oauth_apizCBCGemIE._call_oauth_api  s    &&&d9KT_MM ,X6M M : : '   '7%n5
,lT=PRVRd<efffffrP   c                    | j         s1| j                            | j        dd d g          \  | _         | _        | j         rJ| j        rC|                     d           | j        s%| j                            | j        d          | _        d S 	 |                     d||dd           d S # t          $ rA}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_tokenrT  )
grant_typeusernamerT  z
Logging in)r  i  z Invalid username and/or passwordTexpected)r  r  loadrs  r  write_debug_claims_tokenr  r   
isinstancecauser   status)r[   r  rT  es       rN   _perform_loginzCBCGemIE._perform_login  s<   " 	I6:joo#\D$< 7F 7I 7I3D!3  	4#5 	9:::% Z%)Z__T5H.%Y%Y"F		  ($$" " !	 ! " " " " "
  	 	 	!'9-- X!'.C2G2G$%GRVWWWW	s   B( (
C32<C..C3c                 h   |                      | j                  r	 |                     d| j        d           ns# t          $ rf d\  | _        | _        | j                            | j        dd d g           |                     d            | j	        | 
                                  Y nw xY w| j        S )Nr  )r  r  )NNr  z=Refresh token has been invalidated; retrying with credentials)r  r  r  r  r   r  r  rs  r  r  _get_login_infor  s    rN   _fetch_access_tokenzCBCGemIE._fetch_access_token  s     233 
	=	=$$"1%)%8& &     " = = =:D7#T%7
  !4lT4LQQQ##$cddd##T%9%9%;%;<<<<	= !!s   : A-B*)B*c           
      ~   |                                  d         sd S | j        r|                     | j                  re|                     dd dddidd|                                  i          d	         | _        | j                            | j        d
| j                   n|                     d           | j        S )Nr   zKhttps://services.radio-canada.ca/ott/subscription/v2/gem/Subscriber/profilezDownloading claims tokenr:  r;  AuthorizationzBearer )r  rP  claimsTokenr  zUsing cached claims token)	r  r  r  rW   r  r  r  rs  r  r  s    rN   _fetch_claims_tokenzCBCGemIE._fetch_claims_token  s    ##%%a( 	4! 	:T%9%9$:L%M%M 	:!%!4!4]058I(*PD4L4L4N4N*P*PQ "5 "S "S Ta"bD JT0.$BTUUUU8999!!rP   c                 d  
 |                      |                              dd          \  
}|                     
          }t          |ddddd
fdt          t          d          hf          }i }|                                 x}r||d	<   |                     |d
         
|          d         }|                     |
ddddi          }| 	                    |           |D ]p}	|	
                    d          dk    rU|	
                    d          d|	d<   |	
                    d          d|	d<   d|	d                                         v rd|	d<   qdt          |          it          |dt          hfddd t          hfdd!dt          hfd"          |                     |          

|d#S )$Nr'   r   rn   .lineupsr0  c                     |d         k    S Nr/   rK   rt   ru   r  s     rN   rO   z(CBCGemIE._real_extract.<locals>.<lambda>  s    5X- rP   	item infozx-claims-tokenrO  )r]   rP  r/   r#   r   rN   )r   r  r   r   r(   m4ar   z	mp4a.40.2descriptiver   
preferencer   r)   structuredMetadatapartofSeasonseasonNumberr  )r   r   r   )r'   rl  r  )_match_valid_urlrf   r>  r   r   r   r  r_  _extract_m3u8_formats_remove_duplicate_formatsrV   r-  r
   rX   rr  )r[   r/   r   
video_inforp  rP  r  m3u8_urlr  fmtr  s             @rN   r   zCBCGemIE._real_extract  s-   "&"7"7"<"<"B"B4"R"R-((22
 sIsG----sW[5I5I4J.L M M	 33555< 	5(4G$%''i Xw ( H HHMO,,hu^R<P - R R&&w/// 
	+ 
	+Cwwx  F**775>>)!&CJ778$$,$/CM !C$4$:$:$<$<<<(*C% [77
:"SE*"6YdXe!f/#uE( (  
 %%i00
 "
 
 
 	
rP   )r  )r   r   r   r   r   r   r  r  r  r  r  cached_propertyr  r  r  r  r  r  r   rK   rP   rN   ru  ru  T  s       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 B B	g 	g 	g 	g  ," " "" " "(
 (
 (
 (
 (
rP   ru  c                   D    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dS )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/s06rw  rv  r@   )r'   r)   r   r   r   r/   playlist_countr1   z$https://gem.cbc.ca/schitts-creek/s06Tr   c              #      K   t          |dd f          D ]4} | j        d|d          t          fi |                     |          V  5d S )Nr0  c                     |d         S r  rK   rs   s     rN   rO   z+CBCGemPlaylistIE._entries.<locals>.<lambda>  s
    % rP   zhttps://gem.cbc.ca/media/r/   )r   rZ   ru  rr  )r[   season_infora  s      rN   _entrieszCBCGemPlaylistIE._entries  s      #K';P;P1QRR 	4 	4G!$/<GEN<<h4 4))'224 4 4 4 4 4	4 	4rP   c                    |                      |                              ddd          \  }}|                     ||          }t          |dddfdt          t          d	          hf          } | 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]   rn   .r  c                 6    |d         t                    k    S )Nr  )rX  )rt   ru   r   s     rN   rO   z0CBCGemPlaylistIE._real_extract.<locals>.<lambda>"  s    >*c&kk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"Z	4'''CC	"9sI99993AWAW@X/Z [ [ $t#MM+&&	B B;!C5)"SE*"0;-!@) )  B B $I#/?@@B B B 	BrP   N)r   r   r   r   r   r   r  r   rK   rP   rN   r  r    s        #GqJ <%' 
 
	  6 F 4 4 4B B B B BrP   r  c                   d    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dS )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   rm  ry  live_statusr/   r1   zhttps://gem.cbc.ca/copa-71Tr   c           
      0                          |          }                     ||          }                     ||          d         d         d         d         }                     d| d           |dk    rwt	          dd	d
dt          d          hf          }t                              |          r                     |t                    S                      d| dt                    S  fd} 
                     |            |          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 ]}                     | t                    V   d S )Nrn   .r  r/   r  c                 >    t                               |           r| nd S r
  )r  suitablerL   s    rN   rO   z@CBCGemContentIE._real_extract.<locals>.entries.<locals>.<lambda>g  s     0 9 9! < <F11$ rP   )r   r   rZ   r  )playlist_urlr   r[   s    rN   rI   z.CBCGemContentIE._real_extract.<locals>.entriesd  sw       ,T3	3@U8V8V7WFFG4 ! ! F F ool4DEEEEEE	F FrP   )rz   r{   _search_nextjs_datar  r   r   CBCGemOlympicsIEr  rZ   ru  r   )r[   r/   r]   r   content_typenew_urlrI   r   s   `      @rN   r   zCBCGemContentIE._real_extractS  sD   ^^C((
((j99''<<WEkRSYZM*ElEEEFFF<''"4%%':O2P2P1Q*S T TG((11 Bw0@AAA ??#L#L#L#LhWWW	F 	F 	F 	F 	F 	F ##GGIIz:::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dS )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                   	 |                      |                              dd          \  }	|                     |          }t          |ddddd	fdt          t          d          hf          }d	d
d                    |                    d                    }t          |ddt          ht          f          }|d	k    r5|r3|t          j                    k    rg }d}| 	                    dd           n:| 
                    	d|          d         }|                     ||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_   rn   .r  r0  c                     |d         k    S )NformattedIdMediarK   )rt   ru   r_   s     rN   rO   z0CBCGemOlympicsIE._real_extract.<locals>.<lambda>  s    -.(: rP   r  r  r  )	LiveEventReplayrq   rf  ))r   	startDate)replayrg  is_upcoming#This livestream has not yet startedTr  medianetliver/   r#   r   r'   r  r  rm  r)   r*   rc  rd  r  r   )r)   r*   r   r   )r  rf   r>  r   r   r   rV   r   r  raise_no_formatsr_  r  rX   r   r
   )
r[   r/   r  r  rp  r  rm  r  r  r_   s
            @rN   r   zCBCGemOlympicsIE._real_extract  s   !22377==dJOO(((22
 sIsG::::C'+BVBVAW.Y Z Z	
 # 
 
 #immF##
$
$ 	
 )FY\5^ _ _ )##(9#>ORVR[R]R]>]>]G'K!!"GRV!WWWW++HnhOOPUVH008UQ\`iQi0jjG &!2	
 

 9!C5) -u5&}E':}M	' '  
 	
rP   Nr5  rK   rP   rN   r  r  n  sf        #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d.S )/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(   rm  ry  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   rm  ry  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   rm  ry  z#Replay might no longer be available)r/   r0   r1   r   r2   z#https://gem.cbc.ca/live-event/43273r   c                 <  	 |                      |          	|                     |	          }|                     |	          d         d         d         }|                    d          s;t	          |d          	k    r	|d         }nt	          |dd	fd	t
          f          pi }|                    d          }|st          d
d          |                    d          rdnd}t	          |dt          hf          }|dk    r5|r3|t          j                    k    rg }d}| 	                    dd           n:| 
                    |d	          d         }|                     |	d|dk              }	|||dt	          |dt          hfdt          hfdd          S )Nr  r  r   r  )eventr   r  )freeTv)streams.r0  c                 N    |d                              d          d         k    S )Nr   -r   )	partitionr  s     rN   rO   z,CBCGemLiveIE._real_extract.<locals>.<lambda>  s#    5!3!3C!8!8!;x!G rP   zBCouldn't find video metadata, maybe this livestream is now offlineTr  isVodEnabledr  r  rg  r  r  r  r/   r#   r  r  r)   r*   )rc  rd  r/   )r)   r*   r   )rz   r{   r  rV   r   r   r   r   r  r  r_  r  rX   )
r[   r/   r   r  video_stream_idr  rm  r  r  r  s
            @rN   r   zCBCGemLiveIE._real_extract  s   >>#&&((h77--gx@@I+VW]^
 ~~011 	UJ(899XEE'0

)*0'GGGG7N O O URT  %..);<< 	f U`df f f f %/NN>$B$BQjj	(i-5QRR)##(9#>ORVR[R]R]>]>]G'K!!"GRV!WWWW++O^XVVW\]H008UQ\`iQi0jjG &!2	

 


 :!C5) -u56( (  

 
	
rP   Nr5  rK   rP   rN   r  r    sE       GEJ :!V M($%/ *&
 
 ,	
 	
  01V(O  '-+	
 	
 9o  z(O%/ *
 
 '-+	
 	
" 95)BE9%/ *	 	 '-9	
 	
" 9!	
 	
}BFH(
 (
 (
 (
 (
rP   r  c                   X    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dS )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+   rm  ry  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   |                      |          |                     d d          }t          |dt          hf          }|sv|                     d           |                     |          }|                     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                 6    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*   rm  r+   r   )rz   rW   r   r  r  r{   r   r   r   r   r   rX   r
   )r[   r/   r  r   r   preloaded_stater  s         @rN   r   zCBCListenIE._real_extract7  sr   >>#&&&&@h@@(RW ' Y YHvv&677 	\ \]]],,S(;;G"//2G=N: 0 7 7O  7j99993AXAX@Y2[ \ \D
 (

4&s;!C5) -u5&2[t5L5L5L4M%N'+D*A*A*A)BC'+7" "  

 
	
rP   Nr5  rK   rP   rN   r  r    s        GkJ NFA#!+&%

 

  yIA#!+&%

 

 F8
 
 
 
 
rP   r  ).r  r   r  urllib.parser2  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'  r7  ru  r  r  r  r  r  rK   rP   rN   <module>r+     s@       				      ! ! ! ! ! ! $ $ $ $ $ $ - - - - - -                                           , > = = = = = = = = =C2 C2 C2 C2 C2M C2 C2 C2LK
 K
 K
 K
 K
- K
 K
 K
\
< < < < <- < < <D9
 9
 9
 9
 9
= 9
 9
 9
xm
 m
 m
 m
 m
| m
 m
 m
`&B &B &B &B &B| &B &B &BR>; >; >; >; >;l >; >; >;B5
 5
 5
 5
 5
| 5
 5
 5
po
 o
 o
 o
 o
< o
 o
 o
d9
 9
 9
 9
 9
- 9
 9
 9
 9
 9
rP   