U
    MfbN                     @   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Z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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 ddlmZ dd	 ZG d
d dej j!Z"G dd deZ#G dd de#Z$G dd de#Z%dS )    N   )InfoExtractor   )aes_ecb_decrypt)	ExtractorErrorOnDemandPagedListbytes_to_intlistdecode_base_nint_or_noneintlist_to_bytestime_secondstraverse_objupdate_url_query)clean_proxiesc                 C   sx   | j jd }d|jkrdS | jd  }| j }t|| |j| j|d}t	|t
jjs^t|| |jd|_dS )z6Add a handler for opening URLs, like _download_webpageZUrllibabematv-licenseNZhttp_headers)	cookiejarproxies)r   )Z_request_directorhandlersZ_SUPPORTED_URL_SCHEMESparamscopyr   r   Z_get_instancer   
isinstanceurllibrequestOpenerDirectorAssertionErroradd_handler)ZydlhandlerZrhheadersr   opener r   </tmp/pip-unpacked-wheel-zk9bgjdq/yt_dlp/extractor/abematv.py
add_opener    s    



r!   c                   @   s6   e Zd ZdZdZdZddddZdd	 Zd
d ZdS )AbemaLicenseHandleri  Z:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzs@   3AF0298C219469522A313570E8583005A642E73EDD58E3EA2FB7339D3DF1597E	AbemaTVIE)iec                 C   s   t | dt| dd  || _d S )Nzabematv-license_openabematv_license_open)setattrgetattrr$   )selfr$   r   r   r    __init__5   s    zAbemaLicenseHandler.__init__c           	   
   C   s   | j dd}| j j|d}| j jdd |r.dndd|itd|d d	d
id}t|d | jd}t	t
d|d? |d@ }tjt| j|d | j j  tjd}t	| }tt||S )NverboseF)to_showz$https://license.abema.io/abematv-hlszRequesting playback licenseta)kvltContent-Typeapplication/json)notequerydatar   k)tablez>QQ@   l    Zcid	digestmod)r$   	get_param_get_media_token_download_jsonjsondumpsencoder	   STRTABLEr   structpackhmacnewbinascii	unhexlifyHKEY
_DEVICE_IDhashlibsha256digestr   r   )	r(   ticketr+   Zmedia_tokenZlicense_responseresZencvideokeyhZenckeyr   r   r    _get_videokey_from_ticket<   s0      

 
z-AbemaLicenseHandler._get_videokey_from_ticketc                 C   sX   t |tjjr| n|}tj|j}| |}tj	j
t|dtt|i|ddS )NzContent-Length   )r   urlcode)r   r   r   Requestget_full_urlparseurlparsenetlocrO   response
addinfourlioBytesIOstrlen)r(   rQ   rL   Zresponse_datar   r   r    r%   V   s    
 
 z(AbemaLicenseHandler.abematv_license_openN)	__name__
__module____qualname__handler_orderr@   rG   r)   rO   r%   r   r   r   r    r"   0   s   r"   c                   @   sX   e Zd ZdZdZdZdZdZedd Z	dd Z
dd
dZdd ZdddZdd ZdS )AbemaTVBaseIEZabematvNs   v+Gjs=25Aw5erR!J8ZuvRrCx*rGswhB&qdHd_SYerEWdU&a?3DzN9BRbp5KwY4hEmcj5#fykMjJ=AuWz5GSMY-d@H7DMEh3M@9n2G552Us$$k9cD=3TxwWe86!x#Zyhec                    s   |  }tt d d d }t|}t|  }d  fddfdd}fdd} j ||j || ||jd	  || ||j	d	  t
d
dS )Ni  r   c                    s(   t j jtjd}||  | d S )Nr8   )rC   rD   
_SECRETKEYrI   rJ   updaterK   )noncerN   )clstmpr   r    mix_oncer   s    
z-AbemaTVBaseIE._generate_aks.<locals>.mix_oncec                    s   t | D ]}  qd S N)range)count_rh   rg   r   r    mix_tmpx   s    z,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpc                    s    t d|   d S )N   =)base64urlsafe_b64encoderstrip)re   rm   r   r    	mix_twist}   s    z.AbemaTVBaseIE._generate_aks.<locals>.mix_twist   ro   zutf-8)r?   intr   timegmtimer\   rc   tm_montm_mdaytm_hourrp   rq   rr   decode)rf   ZdeviceidZts_1hourZtime_structZts_1hour_strrn   rs   r   )rf   rh   rg   r    _generate_aksh   s    


zAbemaTVBaseIE._generate_aksc              
   C   s   | j r| j S t| jt|  |  \}}|o>| jj| j|dd}|oL|dt	_ t	j rz|dt	_
| d W d S  tk
r } z| d| d W 5 d }~X Y nX tt t	_
| | j
}| jdd d	t| j
|d
 ddid}|d t	_ | j S )N
2024.01.19Zmin_ver	usertoken	device_idTz?Failed to login with cached user token; obtaining a fresh one ()zhttps://api.abema.io/v1/usersZAuthorizing)ZdeviceIdZapplicationKeySecretr0   r1   r2   r4   r   token)
_USERTOKENr!   Z_downloaderr"   Z_get_login_infocacheload_NETRC_MACHINEgetrb   rH   r;   r   report_warningr\   uuidZuuid4r|   r<   r=   r>   r?   )r(   usernamerl   
auth_cacheeZaks	user_datar   r   r    _get_device_token   s:    
$  
 	
zAbemaTVBaseIE._get_device_tokenFTc                 C   sT   |s| j r| j S | jdd |r dnddddddd	d
dd|   idd t_ | j S )Nz#https://api.abema.io/v1/media/tokenzFetching media tokenFZandroidz6.0.1ja_JPz
Asia/Tokyoztv.abemaz3.27.1)ZosNameZ	osVersionZosLangZ
osTimezoneZappIdZ
appVersionAuthorizationbearer )r2   r3   r   r   )_MEDIATOKENr<   r   rb   )r(   Z
invalidater+   r   r   r    r;      s(    
  
 zAbemaTVBaseIE._get_media_tokenc              
   C   s   |    | jj| j|ddr2|  r2| d d S d|krDd\}}nd\}}| jd| d dt||d	|i	 d
|    ddddd}|d t
_| d t
jt
jd}| j| j|| d S )Nr}   r~   zSkipping logging in@)z
user/emailemail)ZoneTimePasswordZuserIdzhttps://api.abema.io/v1/auth/z
Logging inpasswordr   zhttps://abema.tvzhttps://abema.tv/r1   )r   ZOriginZRefererr0   r   r   T)r   r   )r   r   r   r   r;   Zwrite_debugr<   r=   r>   r?   rb   r   rH   store)r(   r   r   epmethodZlogin_responser   r   r   r    _perform_login   s:    

    

zAbemaTVBaseIE._perform_loginDownloading JSON metadatac              	   C   s,   | j d| ||pi |dd|   idS )Nzhttps://api.abema.io/r   r   )r3   r2   r   )r<   r   )r(   Zendpointvideo_idr3   r2   r   r   r    	_call_api   s       zAbemaTVBaseIE._call_apic                 C   sR   t d|D ]@}| j|d|dd}t|ddkr6qt|d}|r|  S qg S )Nzd(?is)</span></li></ul><script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>json_ldFfatalz@typeZBreadcrumbList)ZitemListElement.name)refinditer_parse_jsongroupr   )r(   webpager   jldjsonlditemsr   r   r    _extract_breadcrumb_list   s    

z&AbemaTVBaseIE._extract_breadcrumb_list)FT)Nr   )r^   r_   r`   r   r   rH   r   rc   classmethodr|   r   r;   r   r   r   r   r   r   r    rb   _   s   
!!

rb   c                
   @   s~   e 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gZdZdd  ZdS )!r#   zWhttps?://abema\.tv/(?P<type>now-on-air|video/episode|channels/.+?/slots)/(?P<id>[^?/]+)z+https://abema.tv/video/episode/194-25_s2_p1z194-25_s2_p1u>   第1話 「チーズケーキ」　「モーニング再び」u   異世界食堂２u   シーズン2r   r   )idtitleseriesseasonseason_numberepisodeepisode_numberZexpired)rQ   	info_dictskipz:https://abema.tv/channels/anime-live2/slots/E8tvAnMJ7a9a5dZE8tvAnMJ7a9a5duF   ゆるキャン△ SEASON２ 全話一挙【無料ビデオ72時間】u   ゆるキャン△ SEASON２z$md5:9c5a3172ae763278f9303922f0ea5b17)r   r   r   r   r   r   descriptionz2https://abema.tv/video/episode/87-877_s1282_p31047u   第5話『光射す』z$md5:56d4fc1b4f7769ded5f923c55bb4695dzre:https://hayabusa\.io/.+u   相棒)r   r   r   Z	thumbnailr   r   z'https://abema.tv/now-on-air/abema-animezabema-animez$md5:55f2e61f46a17e9230802d7bcc913d5fT)r   r   is_livezeNot supported until yt-dlp implements native live downloader OR AbemaTV can start a local HTTP serverNc              	   C   s  |  |dd\}}dd|   i}|dd }| ||}| jd|d|d	}| j||i d	}| jd
|dd d	}|sd }	td|D ]"}
| j	|
d|dd}	|	r qq|	r|	
d}|s8|dkr8| js| jd||d| _tdd}| j
dg D ]<}|
d|krq|d |kr||d k r|d } q8q| ||}|rp|d |d< |d |d< |sp|d }| jd|dd dd }|s| d!|}|rtd"d#|}td$|}|rt|dtd%d	}t|d&td%d	}|d'k r|nd |d(< |d)k r|nd |d*< d+\}}d,}|dkrd-}d.}|d/krJt|d0d1i}| ||}|d2 D ]&}||d kr^|d3 d4 } q~q^td5| d6d-d7n|dkr(| jd8| |d9|d:}t|d;}d<|kr| d= d>}|t|d?d@dAdBdC |s
t|dD}|st|dE}dF| dG}nV|dkrv| jdH| |d9|d:}t|dIdd	sh| d= d>}dJ| dG}ntdK|r| dL | dM | j||dN|dO}|||||||dP |S )QNr   typer   zBearer /z&<link\s+rel="canonical"\s*href="(.+?)"zcanonical URL)defaultz8<span\s*class=".+?EpisodeTitleBlock__title">(.+?)</span>r   z(?is)<span\s*class="com-m-Thumbnail__image">(?:</span>)?<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>(?P<json_ld>.+?)</script>r   Fr   captionz
now-on-airz5https://api.abema.io/v1/timetable/dataSet?debug=false)r   	   )hoursslotsZ	channelIdZstartAtZendAtr   r   )z\<p\s+class="com-video-EpisodeDetailsBlock__content"><span\s+class=".+?">(.+?)</span></p><divz8<span\s+class=".+?SlotSummary.+?">(.+?)</span></div><divr   r   )r   r   )r   zog:descriptionztwitter:descriptionu   (?sx)
                    ^(.+?)(?:
                        アニメの動画を無料で見るならABEMA！| # anime
                        等、.+ # applies for most of categories
                    )?
                z\1zs(\d+)_p(\d+)$infr   d   r   i  r   )FNpublicTz https://api.abema.io/v1/channelsznews-globaldivision1ZchannelsZplaybackZhlszCannot find on-air z	 channel.)expectedz'https://api.abema.io/v1/video/programs/zChecking playability)r2   r   )Zterms.ZonDemandType   zThis is a premium-only streamZpremium_only)r   r   )r   r   )r   sequence)r   number)r   r   r   r   )r   r   )r   contentz*https://vod-abematv.akamaized.net/program/z/playlist.m3u8z$https://api.abema.io/v1/media/slots/)slotflagsZtimeshiftFreez'https://vod-abematv.akamaized.net/slot/ZUnreachablezwThis is a livestream; yt-dlp doesn't support downloading natively, but FFmpeg cannot handle m3u8 manifests from AbemaTVzePlease consider using Streamlink to download these streams (https://github.com/streamlink/streamlink)Zmp4)extZlive)r   r   r   formatsr   availability)Z_match_valid_urlr   r   splitZ_download_webpageZ_search_regexZ_search_json_ldr   r   r   r   
_TIMETABLEr<   r   r   Z_html_search_regexZ_html_search_metasubsearchr
   floatr   r   r   r   rd   Z_extract_m3u8_formats)r(   rQ   r   Z
video_typer   r   Zcanonical_urlinfor   r   r   nowr   Z
breadcrumbr   Zog_descZmobjZseriZepisr   Zm3u8_urlr   Zchannel_urlZonair_channelschZapi_responseZondemand_typesr   r   r   r    _real_extract$  s    
     
 
     



 






 


   zAbemaTVIE._real_extract)r^   r_   r`   
_VALID_URL_TESTSr   r   r   r   r   r    r#      sV   		.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gZdd Zdd Zdd ZdS )AbemaTVTitleIEz-https?://abema\.tv/video/title/(?P<id>[^?/]+)   z$https://abema.tv/video/title/90-1597z90-1597u   シャッフルアイランド)r   r   r   )rQ   r   Zplaylist_mincountz$https://abema.tv/video/title/193-132z193-132u:   真心が届く~僕とスターのオフィス・ラブ!?~   z#https://abema.tv/video/title/25-102z25-102u=   ソードアート・オンライン アリシゼーション   c              	   #   s`    j d| d|d|d  |t| j dt jdd} fdd	t|d
D E d H  d S )Nv1/video/series/z	/programszDownloading page r   seq)ZseriesVersionoffsetorderlimit)r2   r3   c                 3   s   | ]}  d | V  qdS )zhttps://abema.tv/video/episode/N)Z
url_result).0xr(   r   r    	<genexpr>  s   z-AbemaTVTitleIE._fetch_page.<locals>.<genexpr>)programs.r   )r   r\   
_PAGE_SIZEr   )r(   playlist_idseries_versionpager   r   r   r    _fetch_page  s    
 	
zAbemaTVTitleIE._fetch_pagec                 C   s   t t| j||| jS ri   )r   	functoolspartialr   r   )r(   r   r   r   r   r    _entries  s    zAbemaTVTitleIE._entriesc                 C   sF   |  |}| d| |}| j| ||d ||d|ddS )Nr   versionr   r   )r   Zplaylist_titleZplaylist_description)Z	_match_idr   Zplaylist_resultr   r   )r(   rQ   r   Zseries_infor   r   r    r     s    
 zAbemaTVTitleIE._real_extractN)	r^   r_   r`   r   r   r   r   r   r   r   r   r   r    r     s0   r   )&rp   rE   r   rI   rC   rZ   r=   r   rA   rv   urllib.parser   urllib.requesturllib.responser   commonr   Zaesr   utilsr   r   r   r	   r
   r   r   r   r   Zutils.networkingr   r!   r   BaseHandlerr"   rb   r#   r   r   r   r   r    <module>   s0   ,/  C