o
    i                     @   sT  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
 d
eZ$G dd deZ%G dd deZ&G dd deZ'G dd de'Z(G dd de'Z)G dd de'Z*G dd de'Z+G dd de'Z,G d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                   @   s   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d7d8 Zd9d: Zd;S )<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+   )r.   r/    415a0e3f586113894174dfb31aa5bb1a
2658915080zFly like an eagle!zFEagle equipped with a mini camera flies from the world's tallest tower20150315iU)r-   playlistr0   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-   r/   playlist_mincountc                 C   s   |  ||t}|d}|s=|d }| jd| d|dd}|r(t|dd t}|s=| d	| |d
 d d dd }| d| d|S )NmediaIdclipIdzLhttp://tpfeed.cbc.ca/f/ExhSPC/vms_5akSXx4Ng_Zn?byCustomValue={:mpsReleases}{}Ffatalc                 S   s   | d d d S )Nentriesr   guid xrG   rG   H/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/cbc.py<lambda>~       z,CBCIE._extract_player_init.<locals>.<lambda>z\http://feed.theplatform.com/f/h9dtGB/punlNGjMlc1F?fields=id&byContent=byReleases%3DbyId%253DrE   r   r%   /
cbcplayer:	CBCPlayer)_parse_jsonr   get_download_jsonr   strsplit
url_result)selfplayer_init
display_idplayer_infomedia_idclip_idfeedrG   rG   rJ   _extract_player_initu   s0   

zCBCIE._extract_player_initc           	         s$   | | }j|d dpjd|dd dp|}jd|dd|d}jd|d i td	} fd
dt	d|D }g }dD ]}|
t	|| qG|
t|ddddddd ddthf	 t|ddthf }rw|| |
fddt|D  | t||S )Ndefaultztwitter:titler'   u'   ^(?P<title>.+?)(?:\s*[|–-]\s*CBC.*)?$zcleaned title)groupr`   window\.__INITIAL_STATE__\s*=initial state)r`   transform_sourcec                    s   g | ]} | qS rG   )r^   ).0rX   rY   rW   rG   rJ   
<listcomp>   s    
z'CBCIE._real_extract.<locals>.<listcomp>z,CBC\.APP\.Caffeine\.initInstance\(({.+?})\);)z%<iframe[^>]+src="[^"]+?mediaId=(\d+)"z<div[^>]+\bid=["\']player-(\d+)zguid["\']\s*:\s*["\'](\d+)detailcontentbody.c                 S   s   |d dkS )Ntypepolopoly_mediarG   _vrG   rG   rJ   rK          z%CBCIE._real_extract.<locals>.<lambda>sourceIdapp	contentIdc                    s    g | ]}  d | d|qS )rO   rP   )rV   )re   r[   rW   rG   rJ   rg      s    )	_match_id_download_webpage_og_search_title_html_search_meta_html_extract_title_search_regex_search_jsonr   refindallextendr   rT   appendr   playlist_resultr   _og_search_description)	rW   r-   webpager'   datarE   	media_idsmedia_id_re
content_idrG   rf   rJ   _real_extract   sD   




zCBCIE._real_extractN)__name__
__module____qualname__IE_NAME
_VALID_URL_TESTSr^   r   rG   rG   rG   rJ   r   "   s    			Pr   c                   @   s>  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dd Zdd 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-   r.   r/   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-   r/   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-   r/   r0   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                    s   t |d fdddthtfS )Nr   c                       |d  kS )Nr   rG   rm   r   rG   rJ   rK     rp   z*CBCPlayerIE._parse_param.<locals>.<lambda>value)r   rT   any)rW   
asset_datar   rG   r   rJ   _parse_param  s   zCBCPlayerIE._parse_paramc                    s  |  |}| d| |}| jd|d|tdd d }t|ddd	d
 f}|sCt|dthf }rCddtd| dddi|ddS t|ddthfdk g i }}t|dddd
 fD ]}	||	dpgdg 	|	d |	dd q]|D ]}
|
d }|
d }|dkr| 
d | d!|  qx| ||d"| d#}t| |d$}|d%kr| j|d& |d'd( d)\}}|| |s| j||d*  s|sqxt|d+d
 ttjtd,d
 d-hd.thfpi }| jd/|d&d0d d1}|rd2|v rqx|tt|d& d' }| jt||d3d4d4d5r|	i ||d6d7d d d8 qx|	|d& || |d9d:kr.d;nd d< qxt|dd=d>d
 d?td@dAhfdBtd@dAhfdCthfdDf}t|dEkrk|dF dGsk|dF dHskg }i t|dIthfdJtjhfdKd&thtd dLhfdMtd@dAhfddNthfdOthfddPt hfddQth fdRd
hfddSthfdTdUdCthfddVtfdWdUdCthfdX|||| dYS )ZNhttps://www.cbc.ca/player/play/rb   rc   rd   videocurrentClipmediaassetsc                 S   s   t |d o	|d S )Nkeyrk   r   rm   rG   rG   rJ   rK     s    z+CBCPlayerIE._real_extract.<locals>.<lambda>r@   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                 S   s   t |d S )Nsrcr   rm   rG   rG   rJ   rK     rp   languageundr   label)r-   r   r   rk   medianetz!Skipping unsupported asset type "z": zDownloading z JSONcontentTyper   r-   r!   hls)m3u8_idlive)targetc                 S   s   | ddko
|d S )Nvcodecnonetbr)rR   rm   rG   rG   rJ   rK         c                 S   s   | d S )Nr   rG   rH   rG   rG   rJ   rK         )r   rN   z(https?://[^?#]+?/)hdntl=zbase urlr_   z/live/zChecking for https formatF)errnoterD   z	https-mp4https)r-   	format_idr   manifest_urlacodec	mediaTypeaudior   )r-   r&   r   r   c                 S   s   t |d d uS )N	startTime)floatrm   rG   rG   rJ   rK     rL   r     scaleendTimer   )
start_timeend_timer'   r   r   r   r   r'   r(   imagequerypublishedAtclipTypeshowNamer   r   c                    s    rd S | S NrG   rH   is_liverG   rJ   rK     rp   regionr   .genrer   )r'   r(   r   r)   r   r   r   r   r   r   r   r   )r%   formatsr   r   r  )!ru   rv   r{   r   r   rT   r   
setdefaultrR   r   report_warningrS   r   r   #_extract_m3u8_formats_and_subtitlesr~   _merge_subtitlesall	functoolspartialsorteddictrz   r   r   _request_webpager   r   lenstripr   r   r	   )rW   r-   video_idr   r   r   r[   r  r   subasset	asset_key
asset_typer   r&   fmtssubsbest_video_fmtbase_urlmp4_urlr   rG   r   rJ   r     s   








	

.



zCBCPlayerIE._real_extractN)	r   r   r   r   r   _GEO_COUNTRIESr   r   r   rG   rG   rG   rJ   r      s,   		
	
	
  \r   c                   @   s@   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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-   r?   r/   r0   z+https://www.cbc.ca/player/news/Canada/Northznews/canada/northc                    sP   t j| |}d|d  fdd}| S )Nrb   rc   c                  3   s>    t  ddfdddddfD ]} d|  tV  qd S )	Nr   clipsByCategoryc                    s   |    kS r   )lower)krn   )playlist_idrG   rJ   rK     rp   zDCBCPlayerPlaylistIE._real_extract.<locals>.entries.<locals>.<lambda>items.r%   r   )r   rV   r   r  json_contentr!  rW   rG   rJ   rE     s   
z2CBCPlayerPlaylistIE._real_extract.<locals>.entries)urllibparseunquoteru   r  rv   r{   r   )rW   r-   r   rE   rG   r$  rJ   r   	  s   z!CBCPlayerPlaylistIE._real_extractNr   r   r   r   r   r   r   rG   rG   rG   rJ   r    s"    r  c                   @   s2   e Zd ZdZdgZdddZdddZd	d
 ZdS )CBCGemBaseIEcbcgemr   Nc                 C   s   | j d| |p	|ddidS )Nz9https://services.radio-canada.ca/ott/catalog/v2/gem/show/devicewebr   rS   )rW   item_idrY   rG   rG   rJ   _call_show_api  s   zCBCGemBaseIE._call_show_apigemc                 C   s   | j d|p|||ddddddd|d		d
}t|dthf}|dkr(| j| jd |dkr2| jdd |dkrJt||d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: )
rS   r   intraise_geo_restrictedr  raise_login_requiredr
   rR   r   r   )rW   r[   app_coderY   rA  
media_data
error_codeerror_messagerG   rG   rJ   _call_media_api!  s.   zCBCGemBaseIE._call_media_apic                 C   s   d }t |dthf}|r td| }r t|d}|d}d|it |dthfdthfdthfdddthtd 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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   rR  r   release_timestampr)   	age_limit)rQ  r'   )r   rT   r|   matchr	   ra   r   r   r   r   r   )rW   	item_inforR  r'   mobjrG   rG   rJ   _extract_item_info;  s,   



zCBCGemBaseIE._extract_item_infor   )r1  NN)r   r   r   _NETRC_MACHINEr  r0  rP  rb  rG   rG   rG   rJ   r*    s    

r*  c                   @   sl  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d9d: Zd;d< ZdHd>d?Zd@dA ZdBdC ZdDdE ZdFdG Zd8S )I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>   rQ  rR  r   r\  r*   20210618r)   i `release_date20200107r]  i ^r^     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                 C   s   | j dd dddidd d S )Nz<https://services.radio-canada.ca/ott/catalog/v1/gem/settingszDownloading site settingsr,  r-  r   identityManagementropcr.  rt   rG   rG   rJ   _ropc_settings  s   zCBCGemIE._ropc_settingsc                 C   s   t |d t  dk S )Nexpi,  )r   time)rW   tokenrG   rG   rJ   _is_jwt_expired  s   zCBCGemIE._is_jwt_expiredRefreshing access tokenc              	   C   sf   | j | jd d |td| ji|d| jd id}|d | _|d | _| j| jd| j| jg d S )	Nr-   	client_idscopescopes)r   refresh_tokenaccess_token
token_data)	rS   rq  r   
_CLIENT_ID_refresh_token_access_tokencachestorerc  )rW   
oauth_datanoteresponserG   rG   rJ   _call_oauth_api  s   


zCBCGemIE._call_oauth_apic              
   C   s   | j s| jj| jdd d gd\| _ | _| j r,| jr,| d | js*| j| jd| _d S z| jd||ddd W d S  tyY } zt	|j
trT|j
jd	krTtd
dd d }~ww )Nr|  r_   zUsing cached refresh tokenclaims_tokenrE  )
grant_typeusernamerE  z
Logging in)r  i  z Invalid username and/or passwordTexpected)r~  r  loadrc  r  write_debug_claims_tokenr  r   
isinstancecauser   status)rW   r  rE  erG   rG   rJ   _perform_login  s.   
zCBCGemIE._perform_loginc              	   C   s~   |  | jr<z| d| jd W | jS  ty;   d\| _| _| j| jdd d g | d | j	| 
   Y | jS w | jS )Nrz  )r  rz  )NNr|  z=Refresh token has been invalidated; retrying with credentials)ru  r  r  r~  r   r  r  rc  r  r  _get_login_infort   rG   rG   rJ   _fetch_access_token  s   


zCBCGemIE._fetch_access_tokenc              	   C   sx   |   d sd S | jr| | jr4| jdd dddidd|   idd	 | _| j| jd
| j | jS | d | jS )Nr   zKhttps://services.radio-canada.ca/ott/subscription/v2/gem/Subscriber/profilezDownloading claims tokenr,  r-  AuthorizationzBearer )r   rA  claimsTokenr  zUsing cached claims token)	r  r  ru  rS   r  r  r  rc  r  rt   rG   rG   rJ   _fetch_claims_token  s   

zCBCGemIE._fetch_claims_tokenc           
         sD  |  |dd\ }|  }t|ddddd fddttd	hf}i }|   }r0||d
< | j|d  |dd }| j| ddddid}| 	| |D ]+}	|	
ddkrz|	
dd u rcd|	d< |	
dd u rnd|	d< d|	d  v rzd|	d< qOdt|it|dthfdd d!thfdd"dthfd#| |  |d$S )%Nr%   r   ri   .lineupsr"  c                    r   Nr-   rG   rm   r#  rG   rJ   rK     rp   z(CBCGemIE._real_extract.<locals>.<lambda>	item infozx-claims-tokenr@  )rY   rA  r-   r!   r   r?   )r   r   r   r   r&   m4ar   z	mp4a.40.2descriptiver   
preferencer   r'   structuredMetadatapartofSeasonseasonNumberr  )r   r   r   )r%   r\  r  )_match_valid_urlra   r0  r   r   r   r  rP  _extract_m3u8_formats_remove_duplicate_formatsrR   r  r	   rT   rb  )
rW   r-   r   
video_infor`  rA  r  m3u8_urlr  fmtrG   r#  rJ   r     sR   



zCBCGemIE._real_extract)rv  )r   r   r   r   r   r   r}  r~  r  r  r
  cached_propertyrq  ru  r  r  r  r  r   rG   rG   rG   rJ   rd  T  s    	
	
5

rd  c                   @   sF   e Zd ZdZdZdddddddd	d
dddgZdd Zd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/s06rf  re  r>   )r%   r'   r   r   r   r-   playlist_countr/   z$https://gem.cbc.ca/schitts-creek/s06Tr   c                 c   sD    t |ddd fD ]}| jd|d  tfi | |V  q
d S )Nr"  c                 S   s   |d S r  rG   rm   rG   rG   rJ   rK     r   z+CBCGemPlaylistIE._entries.<locals>.<lambda>zhttps://gem.cbc.ca/media/r-   )r   rV   rd  rb  )rW   season_inforQ  rG   rG   rJ   _entries  s   
zCBCGemPlaylistIE._entriesc              	      s   |  |ddd\}} | j||d}t|ddd fd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   )rY   ri   .r  c                    s   |d t  kS )Nr  )rI  rm   r   rG   rJ   rK   "  rL   z0CBCGemPlaylistIE._real_extract.<locals>.<lambda>zseason infor'   r  )r'   r   r   r   )
r  ra   r0  r   r   r   r   r  rT   r	   )rW   r-   	season_idr  	show_infor  rG   r  rJ   r     s"   
zCBCGemPlaylistIE._real_extractN)r   r   r   r   r   r   r  r   rG   rG   rG   rJ   r    s$    r  c                   @   sd   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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   r]  rh  live_statusr-   r/   zhttps://gem.cbc.ca/copa-71Tr   c                    s    |}||}||d d d   d }d| d |dkrJt dd	d
dtdhf}t|r@|tS d| dt	S  fdd}
| |S )Nprops	pagePropsr   r   zRouting for content type ""
Standaloneheaderctar   r-   https://gem.cbc.ca/z/s01e01c               
   3   s>    t  dddddtdhdd hfD ]	} | tV  qd S )Nri   .r  r-   r  c                 S   s   t | r| S d S r   )r  suitablerH   rG   rG   rJ   rK   g  s    z@CBCGemContentIE._real_extract.<locals>.entries.<locals>.<lambda>)r   r   rV   r  )playlist_urlr   rW   rG   rJ   rE   d  s   
z.CBCGemContentIE._real_extract.<locals>.entries)ru   rv   _search_nextjs_datar  r   r   CBCGemOlympicsIEr  rV   rd  r   )rW   r-   rY   r   content_typenew_urlrE   rG   r  rJ   r   S  s   

zCBCGemContentIE._real_extractN)r   r   r   r   IE_DESCr   r   r   rG   rG   rG   rJ   r  -  s>    		"r  c                   @   s<   e Zd ZdZdZddddddd	d
ddd	dgZd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           	         s  |  |dd\} | |}t|ddddd fddttd	hf}d
dd|d}t|ddthtf}|d
krQ|rQ|t krQg }d}| j	ddd n| 
 d|d }| j||d|d
kd}||||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[   ri   .r  r"  c                    r   )NformattedIdMediarG   rm   r[   rG   rJ   rK     rp   z0CBCGemOlympicsIE._real_extract.<locals>.<lambda>r  r  r  )	LiveEventReplayrk   rV  ))r   	startDate)replayrW  is_upcoming#This livestream has not yet startedTr  medianetliver-   r!   r   r%   r  r  r]  r'   r(   rS  rT  r  r   )r'   r(   r   r   )r  ra   r0  r   r   r   rR   r   rs  raise_no_formatsrP  r  rT   r   r	   )	rW   r-   r  r  r`  r  r]  r  r  rG   r  rJ   r     s@   


zCBCGemOlympicsIE._real_extractNr)  rG   rG   rG   rJ   r  n  s     r  c                   @   s   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-d. Zd/S )0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&   r]  rh  r+   zLive might have ended)r-   r/   r0   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-   r/   r   r0   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   r]  rh  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   r]  rh  z#Replay might no longer be available)r-   r.   r/   r   r0   z#https://gem.cbc.ca/live-event/43273r   c           	         s.  |  | | | }| | d d d }|ds7t|d kr(|d }nt|dd fd	d
tfp6i }|d}|sDtddd|drKdnd}t|dthf}|dkrm|rm|t krmg }d}| j	ddd n| 
|d d }| j| d|dkd} |||dt|dthfdthfddS )Nr  r  r   r  )eventr   r  )freeTv)streams.r"  c                    s   |d  dd  kS )Nr   -r   )	partitionrm   r#  rG   rJ   rK     r   z,CBCGemLiveIE._real_extract.<locals>.<lambda>zBCouldn't find video metadata, maybe this livestream is now offlineTr  isVodEnabledr  r  rW  r  r  r  r-   r!   r  r  r'   r(   )rS  rT  r-   )r'   r(   r   )ru   rv   r  rR   r   r   r   r   rs  r  rP  r  rT   )	rW   r-   r   r  video_stream_idr  r]  r  r  rG   r#  rJ   r     sH   



zCBCGemLiveIE._real_extractNr)  rG   rG   rG   rJ   r    sz    	
Dr  c                   @   sX   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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)   r]  rh  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                    s   |  | | jd   dd}t|dthf}|sA| d | | }| jd|d td}t|d	d
d fd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dhfdtddhfdthfdS )Nz'https://www.cbc.ca/listen/api/v1/clips/FrC   r   z:API failed to return data. Falling back to webpage parsingzwindow\.__PRELOADED_STATE__\s*=zpreloaded stater   )podcastDetailDatashowDetailData.episodesc                    s   t |d  kS )NclipID)rT   rm   r#  rG   rJ   rK   E  rL   z+CBCListenIE._real_extract.<locals>.<lambda>zepisode datar%   )r   r-   r'   r(   
releasedAtr   r   airdater   )r-   r'   r(   r]  r)   r   )ru   rS   r   r  r  rv   r{   r   r   r   r   rT   r	   )rW   r-   r  r   r   preloaded_staterG   r#  rJ   r   7  s6   


zCBCListenIE._real_extractNr)  rG   rG   rG   rJ   r    s:    r  ).r
  r|   rs  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  r*  rd  r  r  r  r  r  rG   rG   rG   rJ   <module>   s.    X   P"< 1)A8r