U
    Mfy                     @   s   d dl Z d dlZ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mZmZmZmZmZmZ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dS )    N   )InfoExtractor   )
ExtractorErrorint_or_nonejoin_nonempty
js_to_json
orderedSetparse_iso8601smuggle_urlstrip_or_nonetraverse_objtry_getc                       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uploader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   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__ 8/tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/extractor/cbc.pyr$   j   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guidr)   )xr)   r)   r*   <lambda>w       z,CBCIE._extract_player_init.<locals>.<lambda>z\http://feed.theplatform.com/f/h9dtGB/punlNGjMlc1F?fields=id&byContent=byReleases%3DbyId%253Dr.   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feedr)   r)   r*   _extract_player_initn   s6    

 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 r)   )r@   ).0r<   r=   r;   r)   r*   
<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 )r4   r5   )r:   )rB   r>   r;   r)   r*   rD      s   )	_match_id_download_webpageZ_og_search_titleZ_html_search_metaZ_html_extract_titlerefindallextendr	   playlist_resultr   Z_og_search_description)r;   r   webpager   r.   Z	media_idsZmedia_id_rer)   rC   r*   _real_extract~   s,    

  zCBCIE._real_extract)__name__
__module____qualname__IE_NAME
_VALID_URL_TESTSclassmethodr$   r@   rM   __classcell__r)   r)   r'   r*   r      s   			P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g ddgddddddd d!d"d#d$dd%d&d'd(dd)g d*d+d,gd-d.gd/gdd0d!d1ddddd2ddddg ddgddddddd d!d3d#d$dd%d&d'd(dd)g d*d+d,gd-d.gd/gdd0d!d4d5d6dd7d8d9d:d;d<d=d>gid?dd@dAdBdCdDdEgdFdGdHd!dIdJdKddLdMdNdOd;d<d=d>gidPddQdRdSdTdUdVgdFddHd!dWdXdYdZdXdYd[dXdYg
Zd\d] Zd^S )_r#   zcbc.ca:playerzy(?:cbcplayer:|https?://(?:www\.)?cbc\.ca/(?:player/play/(?:video/)?|i/caffeine/syndicate/\?mediaId=))(?P<id>(?:\d\.)?\d+)z(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20150307zGhttp://thumbnails.cbc.ca/maven_legacy/thumbnails/sonali-karnick-220.jpgg"~@z%AudioMobile/All in a Weekend Montrealzcount:8ZQuebeczAll in a Weekend MontrealzSeason 2015i  ZExcerpt)r   r   r   r   r   r   r   	thumbnailchaptersduration
categoriestagslocationseriesseasonseason_number
media_type)r   r   r   z:http://www.cbc.ca/i/caffeine/syndicate/?mediaId=2164402062Z 33fcd8f6719b9dd60a5e73adcb83b9f6Z
2164402062zCancer survivor four times overzNTim Mayer has beaten three different forms of cancer four times in five years.iz޳NZ20111104zVhttps://thumbnails.cbc.ca/maven_legacy/thumbnails/277/67/cancer_852x480_2164412612.jpgg9v[g@zCBC News: Windsor at 6:00zNews/Canada/WindsorZWindsorZcancerzAllison Johnson)r   r   r   r   r   r   r   rV   rW   rX   r\   rY   r[   rZ   creatorsr_   z(https://www.cbc.ca/player/play/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(https://www.cbc.ca/player/play/1.7159484Z 6ed6cd0fc2ef568d2297ba68a763d455Z2324213316001z4The National | School boards sue social media giantsz$md5:4b4db69322fa32186c3ce426da07402ci.fgn@ZengZvttZm3u8_native)r   protocolzHhttps://thumbnails.cbc.ca/maven_legacy/thumbnails/607/559/thumbnail.jpegzcount:5Z20240329zcount:4zThe National - Full Showzcount:1ZNewsZCanadazFull Program)r   r   r   r   r   rX   Z	subtitlesrV   r   rW   r   rY   r\   rZ   r`   r[   r_   z.https://www.cbc.ca/player/play/video/1.7194274Z 188b96cf6bdcb2540e178a6caa957128Z2334524995812z;#TheMoment a rare white spirit moose was spotted in Albertaz$md5:18ae269a2d0265c5b0bbe4b2e1ac61a3i5fgZdkS@zHhttps://thumbnails.cbc.ca/maven_legacy/thumbnails/201/543/THE_MOMENT.jpgzcount:0Z20240504zcount:3zThe Nationalzcount:15encoderzcbcplayer:1.7159484Tr   Zonly_matchingzcbcplayer:2164402062z(http://www.cbc.ca/player/play/2657631896c                 C   sb   |  |}d|kr@| d| |}| d|d|d d d }dd	td
| dddi|ddS )N.https://www.cbc.ca/player/play/window\.__INITIAL_STATE__\s*=initial statevideoZcurrentClipr+   url_transparentZThePlatformz;http://link.theplatform.com/s/ExhSPC/media/guid/2655402169/z?mbr=true&formats=MPEG4,FLV,MP3Zforce_smil_urlT)resproto)_typeie_keyr   r   Z_format_sort_fields)rF   rG   _search_jsonr   )r;   r   video_idrL   r)   r)   r*   rM   6  s4    
  
 zCBCPlayerIE._real_extractNrN   rO   rP   rQ   rR   rS   rM   r)   r)   r)   r*   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 )Nrf   rg   c                  3   s<   t  ddfdddddfD ]} d|  tV  qd S )	Nrh   ZclipsByCategoryc                    s   |    kS N)lower)k_)playlist_idr)   r*   r0   c  r1   zDCBCPlayerPlaylistIE._real_extract.<locals>.entries.<locals>.<lambda>items.r   re   )r   r:   r#   ro   Zjson_contentrw   r;   r)   r*   r.   a  s      
   
z2CBCPlayerPlaylistIE._real_extract.<locals>.entries)urllibparseunquoterF   rt   rG   rn   rK   )r;   r   rL   r.   r)   rz   r*   rM   [  s       z!CBCPlayerPlaylistIE._real_extractNrp   r)   r)   r)   r*   rq   J  s      rq   c                   @   s   e Zd ZdZdZddddddd	d
dg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ddgdddiddddd gZd!gZd"Zd#Zd$Z	d%d& Z
d'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd$S )5CBCGemIEz
gem.cbc.cazFhttps?://gem\.cbc\.ca/(?:media/)?(?P<id>[0-9a-z-]+/s[0-9]+[a-z][0-9]+)z-https://gem.cbc.ca/media/schitts-creek/s06e01Z 93dbb31c74a8e45b378cf13bd3f6f11ezschitts-creek/s06e01r   zSmoke Signalsz$md5:929868d20021c924020641769eb3e7f1z{https://images.radio-canada.ca/v1/synps-cbc/episode/perso/cbc_schitts_creek_season_06e01_thumbnail_v01.jpg?im=Resize=(Size)i"  ZcomedySchitt's CreekSeason 6r!   r   )r   r   r   r   rV   rX   rY   r\   r]   r^   episodeepisode_number
episode_idformatZbvr   )r   r   r   paramsr   z-https://gem.cbc.ca/media/schitts-creek/s01e01Z 297a9600f554f2258aed01514226a697zschitts-creek/s01e01zThe Cup Runneth Overz$md5:9bca14ea49ab808097530eb05a29e797z{https://images.radio-canada.ca/v1/synps-cbc/episode/perso/cbc_schitts_creek_season_01e01_thumbnail_v01.jpg?im=Resize=(Size)zSeason 1i  )r   r   r   r   rV   r\   r^   r]   r   r   r   rX   rY   z3https://gem.cbc.ca/nadiyas-family-favourites/s01e01Trc   CAz$3f4beddd-2061-49b0-ae80-6f1f2ed65b37ZcbcgemNc           
      C   s   t ||d }ddi}d| ji}| jdd |||d}|d }|| jdd	}| jd
d ||d}|d }t d|i }ddd}| jdd ||dd}|d }	dd|	d}| jdd |dd}|d S )N)emailpasswordcontent-typezapplication/jsonapikeyz2https://api.loginradius.com/identity/v2/auth/login)dataheadersqueryaccess_tokenZjwt)r   r   Zjwtappz3https://cloud-api.loginradius.com/sso/jwt/api/token)r   r   	signatureZweb)r   ott-device-typez5https://services.radio-canada.ca/ott/cbc-api/v2/token  )r   r   expected_statusZaccessToken)r   r   zott-access-tokenz7https://services.radio-canada.ca/ott/cbc-api/v2/profile)r   r   ZclaimsToken)jsondumpsencode_TOKEN_API_KEYr7   )
r;   r   r   r   r   r   respr   sigZcbc_access_tokenr)   r)   r*   _new_claims_token  sN    
     
     zCBCGemIE._new_claims_tokenc                 C   s,   | j dd }t|d }t|d S )Nrd   r   z==exp)_claims_tokenr9   base64urlsafe_b64decoder   loads)r;   Zb64_datar   r)   r)   r*   _get_claims_token_expiry  s    z!CBCGemIE._get_claims_token_expiryc                 C   s   |   }|t  dk S )N
   )r   time)r;   r   r)   r)   r*   claims_token_expired  s    zCBCGemIE.claims_token_expiredc                 C   s   | j d k	o|   S rs   )r   r   rE   r)   r)   r*   claims_token_valid  s    zCBCGemIE.claims_token_validc                 C   s0   |   s*| ||| _| j| jd| j | jS Nclaims_token)r   r   r   cachestore_NETRC_MACHINE)r;   r   r   r)   r)   r*   _get_claims_token  s    zCBCGemIE._get_claims_tokenc                 C   s"   |   rd S | j| jd| _d S r   )r   r   loadr   r   rE   r)   r)   r*   _real_initialize  s    zCBCGemIE._real_initializec              
   c   s   t dd |D d}|sdS tdd|d }tdd|}| j||dd	d
}t|tjjjsbdS |D ]}|j	
ddkr|qf|D ]r}t|j	
d}	|	rd|j	krqt|j	
d}
|td|
tdd|	 d|t|j	
d|	d |
dV  qqfdS )z= Find a valid video url and convert it to the secret variant c                 s   s    | ]}| d dkr|V  qdS )vcodecnoneNr6   )rB   fr)   r)   r*   	<genexpr>  s      z0CBCGemIE._find_secret_formats.<locals>.<genexpr>Nz$(Manifest\(.*?),filter=[\w-]+(.*?\))z\1\2r   z$(Manifest\(.*?),format=[\w-]+(.*?\))zDownloading secret XMLF)Znoter-   Typerh   ZBitrateZIndexZ	MaxHeightsecz(QualityLevels\()\d+(\))z\g<1>z\2ZMaxWidthg     @@)	format_idr   widthZtbrheight)nextrH   subZ_download_xml
isinstancexmletreeElementTreeElementattribr6   r   r   )r;   formatsro   Zbase_formatbase_urlr   Z
secret_xmlchildZvideo_qualityZbitrater   r)   r)   r*   _find_secret_formats  s.    zCBCGemIE._find_secret_formatsc                 C   s  |  |}| jd| |dd}|  \}}|rJ|rJ| ||}d|i}ni }| j|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kr|dd kr:d|d< |dd krRd|d< d|d  krd|d< q||d |d |d!|d"|d#d$|d# |d%|d||d&|d'g|
|d(|d)d*S )+Nz7https://services.radio-canada.ca/ott/cbc-api/v2/assets/r   r   zx-claims-tokenZplaySessionr   )r   Z	errorCoder   r   )Z	countries#   r   )methodr   z said: z - messagehls)Zm3u8_idr   r   r   Zm4aZacodecz	mp4a.40.2Zdescriptiver   Z
preferencer   r   imager\   r]   zSeason r   rX   categoryairDateZavailableDate)r   r   r   rV   r\   r^   r]   r   r   r   rX   rY   r   Zrelease_timestampr   )rF   r7   Z_get_login_infor   r6   Zraise_geo_restrictedZraise_login_requiredr   rQ   _extract_m3u8_formatsZ_remove_duplicate_formatsrJ   r   rt   )r;   r   ro   
video_infor   r   r   r   Z	m3u8_infoZm3u8_urlr   fmtr)   r)   r*   rM     s\    
 

&

zCBCGemIE._real_extract)rN   rO   rP   rQ   rR   rS   Z_GEO_COUNTRIESr   r   r   r   r   r   r   r   r   r   rM   r)   r)   r)   r*   r~   j  sp   / r~   c                
   @   sF   e Zd ZdZdZddddddd	dd
dddddgZ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   z$md5:6a92104a56cbeb5818cc47884d4326a2r   r!   zhttps://images.radio-canada.ca/v1/synps-cbc/season/perso/cbc_schitts_creek_season_06_carousel_v03.jpg?impolicy=ott&im=Resize=(_Size_)&quality=75)r   r   r   r\   r^   r]   rV   )r   Zplaylist_countr   z$https://gem.cbc.ca/schitts-creek/s06Trc   z6https://services.radio-canada.ca/ott/cbc-api/v2/shows/c                    sd  |  |}|d}|d}| j| j| |dd}t|d t fdd|d D d }|d krztd	  d
| g }|d D ]}|ddd|d  |d |d|d|d|d|d|d |d|d|d|d |d|dgd qd }	|d}
|
d k	r2|
	ds2|
}	d|||d |d|	|d|d|d d	S )Nr   showr   r   r]   c                 3   s    | ]}| d  kr|V  qdS )r]   Nr   )rB   sr]   r)   r*   r   Q  s      z1CBCGemPlaylistIE._real_extract.<locals>.<genexpr>ZseasonszCouldn't find season z of Zassetsri   ZCBCGemzhttps://gem.cbc.ca/media/r   r   r   r\   r   rX   r   )rl   rm   r   r   r   r   rV   r\   r^   r]   	season_idr   r   r   rX   rY   zdata:r    )	rl   r.   r   r   r   rV   r\   r^   r]   )
Z_match_valid_urlgroupr7   	_API_BASEintr   r   appendr6   
startswith)r;   r   matchr   r   Z	show_infoZseason_infoZepisodesr   rV   Ztn_urir)   r   r*   rM   J  sT    






zCBCGemPlaylistIE._real_extractN)rN   rO   rP   rQ   rR   rS   r   rM   r)   r)   r)   r*   r   4  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gZdd  Zd!S )"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.jpgTZAyqZwxRqh8EHr   iXZ20170413r   )	r   r   rV   is_liver   r   r   r   r   zLive might have ended)r   r   r   zhttps://gem.cbc.ca/live/44Z44zre:^Ottawa [0-9\-: ]+r   z/re:https://images.gem.cbc.ca/v1/cbc-gem/live/.*)r   r   r   r   r   live_statusrV   Zskip_download)r   r   r   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   rV   r   r   c                    s   |  | | | }| | d d d }|dsZt|dd fddthfd	i d
}|d}|sttddd| jd ddd|dddddd} | j|d  dddddt|ddddt	hfd S )!NpropsZ	pagePropsr   ZformattedIdMedia)ZfreeTv)Zstreams.rx   c                    s   |d  kS )Nkeyr)   )rv   vry   r)   r*   r0     r1   z,CBCGemLiveIE._real_extract.<locals>.<lambda>F)get_allrA   zBCouldn't find video metadata, maybe this livestream is now offlineT)expectedz5https://services.radio-canada.ca/media/validation/v2/ZmpxZhdZipadtruer   r   Zdesktop)ZappCodeZconnectionTypeZ
deviceTypeZidMediaZmultibitrateoutputZtechZmanifestType)r   r   r   )Zlive)r   r   r   r   r   )ZimagesZcardr   r   )r   r   rV   r   )
rF   rG   Z_search_nextjs_datar6   r   dictr   r7   r   r
   )r;   r   rL   r   Zvideo_stream_idZstream_datar)   ry   r*   rM     sJ    

  
 zCBCGemLiveIE._real_extractNrp   r)   r)   r)   r*   r     sV   	0r   )r   r   rH   r   urllib.parser{   xml.etree.ElementTreer   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r#   rq   r~   r   r   r)   r)   r)   r*   <module>   s   0~ 6  KL