a
    h}                     @   s  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 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(dS )    N   )InfoExtractor   )HEADRequest)	HTTPError)ExtractorErrorfloat_or_noneint_or_none
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)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e fd7d8Zd9d: Zd;d< Z	  Z
S )=CBCIEzcbc.caz@https?://(?:www\.)?cbc\.ca/(?!player/)(?:[^/]+/)+(?P<id>[^/?#]+)zGhttp://www.cbc.ca/22minutes/videos/clips-season-23/don-cherry-play-offsZ 97e24d09672fc4cf56256d6faa6c25bcZ
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XVZ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-4Z 162adfa070274b144f4fdc3c3b8207dbZ
2414435309z*22 Minutes Update: What Not To Wear QuebeczKThis week's latest Canadian top political story is What Not To Wear Quebec.Z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-liveZ 0274a90b51a9b4971fe005c63f592f12Z
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.Z19780210iAz404 Not Foundznhttp://www.cbc.ca/natureofthings/blog/birds-eye-view-from-vancouvers-burrard-street-bridge-how-we-got-the-shotZ 377572d0b49c4ce0c9ad77470e0b96b4Z
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.Z20160201iV)r    r!   r"   r#   r%   r$   r&   )r)   r*   Z 415a0e3f586113894174dfb31aa5bb1aZ
2658915080zFly like an eagle!zFEagle equipped with a mini camera flies from the world's tallest towerZ20150315iU)r(   Zplaylistr+   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                    s   t |rdS t |S )NF)CBCPlayerIEsuitablesuper)clsr(   	__class__ I/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/cbc.pyr/   s   s    zCBCIE.suitablec                 C   s   |  ||t}|d}|sz|d }| jd| d|dd}|rPt|dd t}|sz| d	| |d
 d d dd }| d| d|S )NmediaIdZclipIdzLhttp://tpfeed.cbc.ca/f/ExhSPC/vms_5akSXx4Ng_Zn?byCustomValue={:mpsReleases}{}F)fatalc                 S   s   | d d d S )Nentriesr   Zguidr4   xr4   r4   r5   <lambda>       z,CBCIE._extract_player_init.<locals>.<lambda>z\http://feed.theplatform.com/f/h9dtGB/punlNGjMlc1F?fields=id&byContent=byReleases%3DbyId%253Dr9   r   r    /
cbcplayer:	CBCPlayer)Z_parse_jsonr
   get_download_jsonr   strsplit
url_result)selfplayer_init
display_idZplayer_infomedia_idZclip_idfeedr4   r4   r5   _extract_player_initw   s4    

zCBCIE._extract_player_initc                    s    | | }j|d dp>jd|dd dp>|} fddtd|D }g }dD ]}|t|| qd|fddt|D  	| t
||S )	Ndefaultztwitter:titler"   c                    s   g | ]} | qS r4   )rL   ).0rH   rI   rG   r4   r5   
<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+)c                    s    g | ]}  d | d|qS )r@   rA   )rF   )rO   rJ   rG   r4   r5   rQ      s   )	_match_id_download_webpageZ_og_search_titleZ_html_search_metaZ_html_extract_titlerefindallextendr   playlist_resultr   Z_og_search_description)rG   r(   webpager"   r9   Z	media_idsZmedia_id_rer4   rP   r5   _real_extract   s(    


zCBCIE._real_extract)__name__
__module____qualname__IE_NAME
_VALID_URL_TESTSclassmethodr/   rL   rZ   __classcell__r4   r4   r2   r5   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dddddddg ddgddddddd gd!d"d#d$dd%d&d'd(d)g d*d+d,gd,g d-dd.gd/d0d1id2d3dd4ddd5dddg ddgddddddd gd!d"d6d7dd%d&d'd(d)g d*d+d,gd,g d-dd.gd/d0d1id2d8d9d:dd;d<d=d>d?d@dAdBgidCdDdEg dFdGdHgdIdJd.gdKd"dLdMdNddOdPdQdRdSdTdUdVgidWg dXdHdYdIddZd.gd[d"d\d]dd^d_d`dadbdcdddeg g dfgg dgdIdhd0d1id2didjdkddldmdHddndodpdqg g drg dsdtd"dudvdwddxdydzdd{d|d}d~g d.gd.dgdddd"dddddddddgZdd Zdd ZdS )r.   z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/2683190193Z 64d25f841ddf4ddb28a235338af32e2cZ
2683190193r   zGerry Runs a Sweat Shopz$md5:b457e1c01e8ff408d9d801c1c2cd29b0iVZ20160210r   r   z0Geo-restricted to Canada and no longer availabler'   z:http://www.cbc.ca/i/caffeine/syndicate/?mediaId=2657631896Z e5e708c34ae6fca156aafe17c43e8b75Z
2657631896Zmp3z>CBC Montreal is organizing its first ever community hackathon!z$md5:dd3b692f0a139b0369943150bd1c46a9iЅTZ20150307zChttps://i.cbc.ca/ais/1.2985700,1717262248558/full/max/0/default.jpgg"~@zAll in a Weekend Montrealzcount:11ZQuebeczSeason 2015i  ZExcerptZOther)r    r!   r"   r#   r$   r%   	thumbnailchaptersduration
categoriestagslocationseriesseasonseason_number
media_typegenres)r(   r)   r*   z:http://www.cbc.ca/i/caffeine/syndicate/?mediaId=2164402062Z
2164402062zCancer survivor four times overzNTim Mayer has beaten three different forms of cancer four times in five years.iz޳NZ20111104zChttps://i.cbc.ca/ais/1.1711287,1717139372111/full/max/0/default.jpgg9v[g@zCBC News: Windsor at 6:00Windsor)ZCancerzNews/Canada/Windsorro   News)r    r!   r"   r#   r$   r%   rd   re   rf   rj   rg   ri   rh   rm   rn   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.6424403Z 8025909eaffcf0adf59922904def9a5ez	9.6424403z(The National | N.W.T. wildfire emergencyz$md5:ada33d36d1df69347ed575905bfd496ciofg#~	@zen-USzEnglish Captionsz_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:5Z20240617)rp   The NationalzThe National Latest BroadcastszThe National - Full Showrv   ZCanadazFull Program)r    r!   r"   r#   r$   rf   	subtitlesrd   re   r%   rg   rj   rh   ri   rm   rn   z.https://www.cbc.ca/player/play/video/1.7194274Z 188b96cf6bdcb2540e178a6caa957128z	1.7194274z;#TheMoment a rare white spirit moose was spotted in Albertaz$md5:18ae269a2d0265c5b0bbe4b2e1ac61a3i5fgZdkS@ZengZvttZm3u8_native)r!   protocolzChttps://i.cbc.ca/ais/1.7194274,1717224990425/full/max/0/default.jpgzcount:3zcount:17Z20240504)r    r!   r"   r#   r$   rf   rw   rd   re   rg   rj   rh   ri   rm   r%   rn   z.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   >AZ20240724g     @z2024 Paris Olympic Games)zOlympics Summer SoccerzSummer Olympics ReplayszSummer Olympics Soccer Replays)r    r!   r"   r#   rj   rm   rd   r$   r%   rf   re   rn   rh   rg   ri   z.https://www.cbc.ca/player/play/video/9.6459530Z 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ŨAZ20240726gzG@zcount:23)zNews (FAST)rp   rv   zTV News ShowszThe National )r    r!   r"   r#   rj   rm   rd   r$   r%   rf   re   rn   rh   rg   z.https://www.cbc.ca/player/play/video/9.6420651Z 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}AZ20240612gL7A`q@ZEdmontonzcount:7)r    r!   r"   r#   rj   rm   rd   r$   r%   rf   re   rn   rg   rh   ri   zcbcplayer:1.7159484Tr(   Zonly_matchingzcbcplayer:2164402062z(http://www.cbc.ca/player/play/2657631896c                    s   t |d fdddthtfS )Nrt   c                    s   |d  kS )Nru   r4   _vru   r4   r5   r<   }  r=   z*CBCPlayerIE._parse_param.<locals>.<lambda>value)r   rD   any)rG   
asset_dataru   r4   r}   r5   _parse_param|  s    zCBCPlayerIE._parse_paramc                    s  |  |}| d| |}| d|d|d d }t|dddd	 f}|st|d
thf }rd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 ]0}	||	dpdg |	d |	dd q|D ]}
|
d }|
d }|dkr$| 	d| d |  q| 
||d!| d"}t| |d#}|d$krB| j|d% |d&d' d(\}}|| |s| j||d)  s|sqt|d*d	 ttjtd+d	 d,hd-thfpi }| jd.|d%d/d d0}|rd1|v rq|tt|d% d& }| jt||d2d3d3d4rn|i ||d5d6d d d7 q||d% || |d8d9krdd:nd d; qt|dd<d=d	 d>td?d@hfdAtd?d@hfdBthfdCf}t|dDkr|dE dFs|dE dGsg }i t|dHthfdItjhfdJd%thtd dKhfdLtd?d@hfddMthfdNthfddOthfddPth fdQd	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/window\.__INITIAL_STATE__\s*=initial statevideoZcurrentClipZmediaassetsc                 S   s   t |d o|d S )Nkeytyper   rz   r4   r4   r5   r<     r=   z+CBCPlayerIE._real_extract.<locals>.<lambda>r6   Zurl_transparentZThePlatformz;http://link.theplatform.com/s/ExhSPC/media/guid/2655402169/z?mbr=true&formats=MPEG4,FLV,MP3Zforce_smil_urlT)resproto)_typeZie_keyr(   r    Z_format_sort_fieldsZ
streamTypeZLiveZ
textTracksc                 S   s   t |d S )Nsrcr   rz   r4   r4   r5   r<     r=   languageZundr   label)r(   ru   r   r   Zmedianetz!Skipping unsupported asset type "z": zDownloading z JSONcontentTyperr   r(   r   hls)m3u8_idlive)targetc                 S   s   | ddko|d S )Nvcodecnonetbr)rB   rz   r4   r4   r5   r<     r=   c                 S   s   | d S )Nr   r4   r:   r4   r4   r5   r<     r=   )r   r?   z(https?://[^?#]+?/)hdntl=zbase urlrM   z/live/zChecking for https formatF)Zerrnoter8   z	https-mp4https)r(   	format_idrx   Zmanifest_urlacodecZ	mediaTypeaudior   )r(   r!   r   re   c                 S   s   t |d d uS )N	startTime)floatrz   r4   r4   r5   r<     r=   r   i  )ZscaleZendTimeru   )
start_timeend_timer"   r   r   r   r   r"   r#   imagequeryZpublishedAtZclipTypeZshowNamerk   rf   c                    s    rd S | S Nr4   r:   is_liver4   r5   r<     r=   Zregionrh   .genrerg   )r"   r#   rd   r$   rm   rj   rl   rf   ri   rh   rn   rg   )r    formatsrw   re   r   ) rS   rT   _search_jsonr   rD   r   
setdefaultrB   appendreport_warningrC   r   r   Z#_extract_m3u8_formats_and_subtitlesrW   Z_merge_subtitlesall	functoolspartialsorteddictZ_search_regexr   r   Z_request_webpager   r   lenstripr   r   r	   )rG   r(   video_idrY   datar   rJ   r   rw   subZassetZ	asset_keyZ
asset_typer   r!   ZfmtssubsZbest_video_fmtbase_urlZmp4_urlre   r4   r   r5   rZ     s    










	

.



zCBCPlayerIE._real_extractN)	r[   r\   r]   r^   r_   _GEO_COUNTRIESr`   r   rZ   r4   r4   r4   r5   r.      s  	  [r.   c                   @   s<   e Zd ZdZdZddddiddddd	i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 broadcast)r(   r-   r*   z+https://www.cbc.ca/player/news/Canada/Northznews/canada/northc                    sP   t j| |}d|d  fdd}| S )Nr   r   c                  3   s<   t  ddfdddddfD ]} d|  tV  qd S )	Nr   ZclipsByCategoryc                    s   |    kS r   )lower)kr{   )playlist_idr4   r5   r<     r=   zDCBCPlayerPlaylistIE._real_extract.<locals>.entries.<locals>.<lambda>items.r    r   )r   rF   r.   r   Zjson_contentr   rG   r4   r5   r9     s    
z2CBCPlayerPlaylistIE._real_extract.<locals>.entries)urllibparseunquoterS   r   rT   r   rX   )rG   r(   rY   r9   r4   r   r5   rZ     s    z!CBCPlayerPlaylistIE._real_extractN)r[   r\   r]   r^   r_   r`   rZ   r4   r4   r4   r5   r     s   r   c                   @   s(   e Zd ZdZdgZdddZdd ZdS )	CBCGemBaseIEZcbcgemrc   Nc                 C   s   | j d| |p|ddidS )Nz9https://services.radio-canada.ca/ott/catalog/v2/gem/show/devicewebr   rC   )rG   Zitem_idrI   r4   r4   r5   _call_show_api  s    zCBCGemBaseIE._call_show_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   ZepisodeNumbermetadatarf   airDateZavailabilityDateZratingC)start)	r    
episode_idr#   rd   r   rf   release_timestampr$   	age_limit)r   r"   )r   rD   rU   matchr	   groupr   r   r   r   r   )rG   	item_infor   r"   Zmobjr4   r4   r5   _extract_item_info  s,    



zCBCGemBaseIE._extract_item_info)N)r[   r\   r]   _NETRC_MACHINEr   r   r   r4   r4   r4   r5   r   
  s   
r   c                   @   s   e Zd ZdZdZddddddd	d
g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"dd#ddidd$d%d&gZd'Zd(Zd(Zd(Z	e
jd)d* Zd+d, Zd8d.d/Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd(S )9CBCGemIEz
gem.cbc.cazRhttps?://gem\.cbc\.ca/(?:media/)?(?P<id>[0-9a-z-]+/s(?P<season>[0-9]+)[a-z][0-9]+)z-https://gem.cbc.ca/media/schitts-creek/s06e01zschitts-creek/s06e01r   zSmoke Signalsz$md5:929868d20021c924020641769eb3e7f1z\re:https://images\.radio-canada\.ca/[^#?]+/cbc_schitts_creek_season_06e01_thumbnail_v01\.jpgi,  u   Comédie et humourSchitt's CreekSeason 6r,   r   Z20210618i `Z20200107i ^   )r    r!   r"   r#   rd   rf   rn   rj   rk   rl   r   r   r   r%   r$   release_dater   r   formatZbvrs   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  Z20210617i`Z20151123i WRV)r    r!   r"   r#   rd   rj   rl   rk   r   r   r   rf   rn   r%   r$   r   r   r   z3https://gem.cbc.ca/nadiyas-family-favourites/s01e01Try   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   ZidentityManagementZropcr   rR   r4   r4   r5   _ropc_settingsi  s    zCBCGemIE._ropc_settingsc                 C   s   t |d t  dk S )Nexpi,  )r   time)rG   tokenr4   r4   r5   _is_jwt_expiredo  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(   Z	client_idZscopeZscopes)r   refresh_tokenZaccess_token
token_data)	rC   r   r   
_CLIENT_ID_refresh_token_access_tokencachestorer   )rG   Z
oauth_datanoteresponser4   r4   r5   _call_oauth_apir  s    


zCBCGemIE._call_oauth_apic              
   C   s   | j s&| jj| jdd d gd\| _ | _| j rX| jrX| d | jsT| j| jd| _d S z| jd||ddd W nJ ty } z2t	|j
tr|j
jd	krtd
dd W Y d }~n
d }~0 0 d S )Nr   rM   zUsing cached refresh tokenclaims_tokenpassword)
grant_typeusernamer   z
Logging in)r   i  z Invalid username and/or passwordTexpected)r   r   loadr   r   write_debug_claims_tokenr   r   
isinstancecauser   status)rG   r   r   er4   r4   r5   _perform_login}  s*    

zCBCGemIE._perform_loginc              	   C   sv   |  | jrpz| d| jd W nL tyn   d\| _| _| j| jdd d g | d | j	| 
   Y n0 | jS )Nr   )r   r   )NNr   z=Refresh token has been invalidated; retrying with credentials)r   r   r   r   r   r   r   r   r   r   _get_login_inforR   r4   r4   r5   _fetch_access_token  s    
zCBCGemIE._fetch_access_tokenc              	   C   st   |   d sd S | jr"| | jrd| jdd dddidd|   id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   headersZclaimsTokenr   zUsing cached claims token)	r   r   r   rC   r   r   r   r   r   rR   r4   r4   r5   _fetch_claims_token  s    

zCBCGemIE._fetch_claims_tokenc           
         s  |  |dd\ }|  }t|ddddd fddttd	hf}i }|   }r`||d
< | jd |dddddddd|d d	d}|ddkr| j	dgd nP|ddkr| j
dd n4|ddkrt| j d|d d |d! | j|d"  d#dd$d%id&}| | |D ]`}	|	d'd(kr"|	d)d u rNd*|	d)< |	d+d u rfd,|	d+< d-|	d.  v r"d/|	d0< q"d1t|it|d2thfd3d4d5thfd3d6dthfd7| |  |d8S )9Nr    rk   content.lineupsr   c                    s   |d  kS Nr(   r4   rz   r   r4   r5   r<     r=   z(CBCGemIE._real_extract.<locals>.<lambda>z	item infozx-claims-token5https://services.radio-canada.ca/media/validation/v2/Zgemhdipadtruejsonr   2desktopidMedia)	appCodeconnectionType
deviceTypemultibitrateoutputtechZmanifestVersionmanifestTyper  )r   r   Z	errorCoder   rc   )Z	countries#   r   )methodr   z said: z - messager(   r   r   )r   r   r   r   r!   Zm4ar   z	mp4a.40.2Zdescriptiver   Z
preferencerl   r"   ZstructuredMetadataZpartofSeasonseasonNumberr   )rj   rl   rn   )r    r   r   )_match_valid_urlr   r   r   r   r   r  rC   rB   Zraise_geo_restrictedZraise_login_requiredr   r^   _extract_m3u8_formatsZ_remove_duplicate_formatsr   r	   rD   r   )
rG   r(   rl   
video_infor   r   r   Z	m3u8_infor   fmtr4   r   r5   rZ     sn    

&
zCBCGemIE._real_extract)r   )r[   r\   r]   r^   r_   r`   r   r   r   r   r   cached_propertyr   r   r   r   r   r  rZ   r4   r4   r4   r5   r   ,  s|   5

r   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/s06r   r   r,   )r    r"   rj   rl   rk   )r(   Zplaylist_countr*   z$https://gem.cbc.ca/schitts-creek/s06Try   c                 c   sB   t |ddd fD ]*}| jd|d  tfi | |V  qd S )Nr   c                 S   s   |d S r  r4   rz   r4   r4   r5   r<     r=   z+CBCGemPlaylistIE._entries.<locals>.<lambda>zhttps://gem.cbc.ca/media/r(   )r   rF   r   r   )rG   season_infor   r4   r4   r5   _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    showrk   )rI   r  .r  c                    s   |d t  kS )Nr  )intrz   rk   r4   r5   r<     r=   z0CBCGemPlaylistIE._real_extract.<locals>.<lambda>zseason infor"   r  )r"   rk   rl   rj   )
r  r   r   r   r   r   rX   r"  rD   r	   )rG   r(   Z	season_idr#  Z	show_infor!  r4   r%  r5   rZ     s"    
zCBCGemPlaylistIE._real_extractN)r[   r\   r]   r^   r_   r`   r"  rZ   r4   r4   r4   r5   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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-gZd.d/ Zd0S )1CBCGemLiveIEzgem.cbc.ca:livez1https?://gem\.cbc\.ca/live(?:-event)?/(?P<id>\d+)z$https://gem.cbc.ca/live/920604739687Z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   ZAyqZwxRqh8EHr   iXZ20170413r   )	r"   r#   rd   live_statusr    r!   r   r   r&   zLive might have ended)r(   r*   r+   zhttps://gem.cbc.ca/live/44Z44Tzre:^Ottawa [0-9\-: ]+z/re:https://images.gem.cbc.ca/v1/cbc-gem/live/.*)r    r!   r   r"   r#   r'  rd   rq   )r(   r*   rt   r+   z#https://gem.cbc.ca/live-event/10835Z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dZ20230325)	r    r!   r   r"   r#   r'  rd   r   r   z#https://gem.cbc.ca/live-event/42314Z 297a9600f554f2258aed01514226a697Z42314was_livez&Women's Soccer - Canada vs New Zealandz$md5:36200e5f1a70982277b5a6ecea86155dzre:https://.+default\.jpgi_fZ20240725)r    r!   r'  r"   r#   rd   r   r   z#Replay might no longer be available)r(   r)   r*   rt   r+   z#https://gem.cbc.ca/live-event/43273ry   rc   c           	         sB  |  | | | }| | d d d }|dsnt|d krP|d }nt|dd fd	d
tfpli }|d}|stddd|drdnd}t|dthf}|dkr|r|t krg }d}| j	ddd n<| j
d ddd|dddddd}| j|d  d|dkd } |||d!t|d"thfd#thfd$d%S )&NpropsZ	pagePropsr   ZformattedIdMedia)eventr   r*  )ZfreeTv)Zstreams.r   c                    s   |d  dd  kS )Nr   -r   )	partitionrz   r   r4   r5   r<   l  r=   z,CBCGemLiveIE._real_extract.<locals>.<lambda>zBCouldn't find video metadata, maybe this livestream is now offlineTr   ZisVodEnabledr(  r   r   Zis_upcomingz#This livestream has not yet startedr  Zmedianetliver  r  r  r	  r   r  )r  r  r  r  r  r  r  r  r   r(   r   )r   )r    r   r'  r   r"   r#   )r   r   r(   )r"   r#   rd   )rS   rT   Z_search_nextjs_datarB   r   r   r   r   r   Zraise_no_formatsrC   r  rD   )	rG   r(   rY   r  Zvideo_stream_idr'  r   r   Zstream_datar4   r   r5   rZ   `  sb    



zCBCGemLiveIE._real_extractN)r[   r\   r]   r^   r_   r`   r   rZ   r4   r4   r4   r5   r&    sz   	
Cr&  ))r   rU   r   urllib.parser   commonr   Z
networkingr   Znetworking.exceptionsr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zutils.traversalr   r   r   r   r.   r   r   r   r  r&  r4   r4   r4   r5   <module>   s$   P~  N " D)