U
    gC                     @   sH   d dl mZ ddlmZmZmZmZ G dd deZG dd deZdS )	   )InfoExtractor   )ExtractorErrormimetype2extparse_iso8601try_getc                   @   s   e Zd ZdZdZdZdddiddd	d
deeddd	ddddgZdZdZ	dZ
ddddZdd Zdd ZdefddZdd ZdS ) FancodeVodIEFzfancode:vodz6https?://(?:www\.)?fancode\.com/video/(?P<id>[0-9]+)\bz8https://fancode.com/video/15043/match-preview-pbks-vs-miZskip_downloadTZ6249806281001mp4zMatch Preview: PBKS vs MIzre:^https?://.*\.jpg$iv9`Z202104226008340455001)	idexttitleZ	thumbnail	timestamp
view_count
like_countupload_dateZuploader_id)urlparams	info_dictzhttps://fancode.com/video/15043r   Zonly_matchingNZfancodezRUse "--username refresh --password <refresh_token>" to login using a refresh tokenzapplication/jsonzhttps://fancode.com)zcontent-typeoriginZrefererc                 C   sz   |dkr|  d| j  |   d| }| d|d}t|dd | _| jd kr^|  d n| jd	d
| j i d S )NZrefreshz>Login using username and password is not currently supported. a
  {
            "query":"mutation RefreshToken($refreshToken: String\u0021) { refreshToken(refreshToken: $refreshToken) { accessToken }}",
            "variables":{
                "refreshToken":"%s"
            },
            "operationName":"RefreshToken"
        }zrefresh tokenzGetting the Access tokenc                 S   s   | d d d S )NdataZrefreshTokenZaccessToken xr   r   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/fancode.py<lambda>:       z-FancodeVodIE._perform_login.<locals>.<lambda>zFailed to get Access tokenAuthorizationzBearer )Zreport_warning_LOGIN_HINTZreport_logindownload_gqlr   _ACCESS_TOKENheadersupdate)selfusernamepasswordr   Z
token_jsonr   r   r   _perform_login+   s    
zFancodeVodIE._perform_loginc                 C   sJ   d }|r | j d kr d| j }n|s2| j d k	r2d}|rF| j|dd d d S )Nz3This video is only available for registered users. z;This video isn't available to the current logged in accountT)Zmetadata_availablemethod)r!   r   Zraise_login_required)r$   Zis_available
is_premiummsgr   r   r   _check_login_required@   s    z"FancodeVodIE._check_login_requiredc                 C   s   | j d|| |||dS )Nzhttps://www.fancode.com/graphql)r   noter"   fatal)Z_download_jsonencode)r$   variabler   r,   r-   r"   r   r   r   r    I   s       zFancodeVodIE.download_gqlc           
      C   s   d}|  |}d}d| }| j||dd}t|dd tp<i }t|dd t}|d kr^td	|d
}	| |d|	 d|||f d||d |d|d|dt|d| j	|	dd
S )NzGhttps://players.brightcove.net/%s/default_default/index.html?videoId=%sr
   a  {
            "query":"query Video($id: Int\u0021, $filter: SegmentFilter) { media(id: $id, filter: $filter) { id contentId title contentId publishedTime totalViews totalUpvotes provider thumbnail { src } mediaSource {brightcove } duration isPremium isUserEntitled tags duration }}",
            "variables":{
                "id":%s,
                "filter":{
                    "contentDataType":"DEFAULT"
                }
            },
            "operationName":"Video"
        }zDownloading metadata)r,   c                 S   s   | d d S )Nr   mediar   r   r   r   r   r   b   r   z,FancodeVodIE._real_extract.<locals>.<lambda>c                 S   s   | d d S )NZmediaSourceZ
brightcover   r   r   r   r   r   c   r   z%Unable to extract brightcove Video IDZ	isPremiumisUserEntitledZurl_transparentZBrightcoveNewr   ZtotalUpvotesZ
totalViewstagsZpublishedTime)Zneeds_premium)
_typer   Zie_keyr   r   r   r   r2   release_timestampZavailability)
	_match_idr    r   dictstrr   getr+   r   Z_availability)
r$   r   ZBRIGHTCOVE_URL_TEMPLATEvideo_idZbrightcove_user_idr   Zmetadata_jsonr0   Zbrightcove_video_idr)   r   r   r   _real_extractO   s0    
	


zFancodeVodIE._real_extract)__name__
__module____qualname___WORKINGIE_NAME
_VALID_URLint_TESTSr!   Z_NETRC_MACHINEr   r"   r'   r+   r    r:   r   r   r   r   r      sB    	r   c                   @   sL   e Zd ZdZdZdZdddddd	d
ddddd	ddd	dgZdd ZdS )FancodeLiveIEFzfancode:livez4https?://(www\.)?fancode\.com/match/(?P<id>[0-9]+).+z[https://fancode.com/match/35328/cricket-fancode-ecs-hungary-2021-bub-vs-blb?slug=commentaryZ35328r	   z
BUB vs BLBips`TZ20210628)r   r   r   r   is_liver   ZEnded)r   r   skipz https://fancode.com/match/35328/r   z.https://fancode.com/match/35567?slug=scorecardc              	   C   s   |  |}d| }| ||d}t|dd }|ddkrHtddd	| |d
d ||d| t|dd |tt|dd dt|ddS )Na  {
            "query":"query MatchResponse($id: Int\u0021, $isLoggedIn: Boolean\u0021) { match: matchWithScores(id: $id) { id matchDesc mediaId videoStreamId videoStreamUrl { ...VideoSource } liveStreams { videoStreamId videoStreamUrl { ...VideoSource } contentId } name startTime streamingStatus isPremium isUserEntitled @include(if: $isLoggedIn) status metaTags bgImage { src } sport { name slug } tour { id name } squads { name shortName } liveStreams { contentId } mediaId }}fragment VideoSource on VideoSource { title description posterUrl url deliveryType playerType}",
            "variables":{
                "id":%s,
                "isLoggedIn":true
            },
            "operationName":"MatchResponse"
        }z	Info jsonc                 S   s   | d d S )Nr   matchr   r   r   r   r   r      r   z-FancodeLiveIE._real_extract.<locals>.<lambda>ZstreamingStatusZSTARTEDzThe stream can't be accessedT)expectedr1   namec                 S   s   | d d S )NvideoStreamUrlr   r   r   r   r   r   r      r   c                 S   s   | d d S )NrI   ZdeliveryTyper   r   r   r   r   r      r   Z	startTime)r   r   formatsr   rD   r4   )	r5   r    r   r8   r   r+   Z_extract_akamai_formatsr   r   )r$   r   r9   r   Z	info_jsonZ
match_infor   r   r   r:      s     
	zFancodeLiveIE._real_extractN)r;   r<   r=   r>   r?   r@   rB   r:   r   r   r   r   rC   z   s*   rC   N)	commonr   utilsr   r   r   r   r   rC   r   r   r   r   <module>   s   u