U
    gJ                     @   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mZ ddlmZ ddlmZ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 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   )aes_ecb_decrypt)RequestHandlerResponse)TransportError)	ExtractorErrorOnDemandPagedListbytes_to_intlistdecode_base_nint_or_noneintlist_to_bytestime_secondstraverse_objupdate_url_queryc                       sJ   e Zd ZdZdZdZdZdZdZdd fdd	Z	d
d Z
dd Z  ZS )AbemaLicenseRH)zabematv-licenseNZabematv_licenseZ:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzs@   3AF0298C219469522A313570E8583005A642E73EDD58E3EA2FB7339D3DF1597E	AbemaTVIE)iec                   s   t  jf | || _d S N)super__init__r   )selfr   kwargs	__class__ </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/abematv.pyr   (   s    zAbemaLicenseRH.__init__c              
   C   s   |j }tj|j}z| |}W nf tk
rR } zt|jd|W 5 d }~X Y n8 t	t
tfk
r } ztt|d|W 5 d }~X Y nX tt||dtt|idS )N)causezContent-Lengthheaders)urlurllibparseurlparsenetloc_get_videokey_from_ticketr	   r   r   
IndexErrorKeyError	TypeErrorreprr   ioBytesIOstrlen)r   requestr!   ticketZresponse_dataer   r   r   _send,   s    " zAbemaLicenseRH._sendc           	   
   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   r0   r4   Zmedia_tokenZlicense_responseresZencvideokeyhZenckeyr   r   r   r&   ;   s0      

 
z(AbemaLicenseRH._get_videokey_from_ticket)__name__
__module____qualname__Z_SUPPORTED_URL_SCHEMESZ_SUPPORTED_PROXY_SCHEMESZ_SUPPORTED_FEATURESZRH_NAMErI   rP   r   r2   r&   __classcell__r   r   r   r   r      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 )NrA   )rL   rM   
_SECRETKEYrR   rS   updaterT   )noncerV   )clstmpr   r   mix_oncei   s    
z-AbemaTVBaseIE._generate_aks.<locals>.mix_oncec                    s   t | D ]}  qd S r   )range)count_ra   r`   r   r   mix_tmpo   s    z,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpc                    s    t d|   d S )N   =)base64urlsafe_b64encoderstrip)r^   re   r   r   	mix_twistt   s    z.AbemaTVBaseIE._generate_aks.<locals>.mix_twist   rg   zutf-8)rH   intr   timegmtimer-   r\   tm_montm_mdaytm_hourrh   ri   rj   decode)r_   ZdeviceidZts_1hourZtime_structZts_1hour_strrf   rk   r   )r_   ra   r`   r   _generate_aks_   s    


zAbemaTVBaseIE._generate_aksc              
   C   s  | j r| j S | jjt| d d |  \}}|oD| jj| j|dd}|oR|	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)r   logger
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applicationKeySecretr9   r:   r;   r=   r    token)
_USERTOKENZ_downloaderZ_request_directoradd_handlerr   Z_get_login_infocacheload_NETRC_MACHINEgetr[   rQ   rD   r	   report_warningr-   uuidZuuid4rt   rE   rF   rG   rH   )r   usernamerd   
auth_cacher1   Z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 )r;   r<   r    r|   )_MEDIATOKENrE   r   r[   )r   Z
invalidater4   r   r   r   rD      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 )Nrv   rw   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/r:   )r   ZOriginZRefererr9   r{   r|   T)ry   rx   )r   r   r   r   rD   Zwrite_debugrE   rF   rG   rH   r[   r}   rQ   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   )r<   r;   r    )rE   r   )r   Zendpointvideo_idr<   r;   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   )rW   rX   rY   r   r}   rQ   r   r\   classmethodrt   r   rD   r   r   r   r   r   r   r   r[   V   s   
!!

r[   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)r!   	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<thfs| 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=falser   	   )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)r;   r    labelfreez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   
_TIMETABLErE   r   r   Z_html_search_regexZ_html_search_metasubsearchr   floatr   r	   r   boolr   r]   Z_extract_m3u8_formats)r   r!   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_responser   r   r   r   _real_extract  s    
     
 
     



 




 


   zAbemaTVIE._real_extract)rW   rX   rY   
_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   )r!   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)r;   r<   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 r   )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   r!   r   Zseries_infor   r   r   r     s    
 zAbemaTVTitleIE._real_extractN)	rW   rX   rY   r   r   r   r   r   r   r   r   r   r   r     s0   r   )$rh   rN   r   rR   rL   r+   rF   r   rJ   rn   urllib.parser"   r   commonr   Zaesr   Z
networkingr   r   Znetworking.exceptionsr   utilsr	   r
   r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   <module>   s,   ,7  B