a
    hM                     @   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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 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decode_base_nint_or_nonetime_secondstraverse_obj
update_url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 i | || _d S N)super__init__r   )selfr   kwargs	__class__ M/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/abematv.pyr   &   s    zAbemaLicenseRH.__init__c              
   C   s   |j }tj|j}z| |}W nj tyT } zt|jd|W Y d }~nBd }~0  t	t
tfy } ztt|d|W Y d }~n
d }~0 0 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	|
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)table   bigZcid	digestmod)r   	get_param_get_media_token_download_jsonjsondumpsencoder   	_STRTABLElistto_byteshmacnewbinascii	unhexlify_HKEY
_DEVICE_IDhashlibsha256digestbytesr   )	r   r/   r3   Zmedia_tokenZlicense_responseresZencvideokeyhZenckeyr   r   r   r%   9   s*    

z(AbemaLicenseRH._get_videokey_from_ticket)__name__
__module____qualname__Z_SUPPORTED_URL_SCHEMESZ_SUPPORTED_PROXY_SCHEMESZ_SUPPORTED_FEATURESZRH_NAMErI   rP   r   r1   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   )noncerW   )clstmpr   r   mix_onceg   s    
z-AbemaTVBaseIE._generate_aks.<locals>.mix_oncec                    s   t | D ]}  qd S r   )range)count_rb   ra   r   r   mix_tmpm   s    z,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpc                    s    t d|   d S )N   =)base64urlsafe_b64encoderstrip)r_   rf   r   r   	mix_twistr   s    z.AbemaTVBaseIE._generate_aks.<locals>.mix_twist   rh   zutf-8)rH   intr   timegmtimer,   r]   tm_montm_mdaytm_hourri   rj   rk   decode)r`   ZdeviceidZts_1hourZtime_structZts_1hour_strrg   rl   r   )r`   rb   ra   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y } z| d| d W Y d }~n
d }~0 0 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applicationKeySecretr8   r9   r:   r<   r   token)
_USERTOKENZ_downloaderZ_request_directoradd_handlerr   Z_get_login_infocacheload_NETRC_MACHINEgetr\   rQ   rD   r	   report_warningr,   uuiduuid4ru   rE   rF   rG   rH   )r   usernamere   
auth_cacher0   Zaks	user_datar   r   r   _get_device_token   s4    
(
	
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
invalidater3   r   r   r   rD      s"    
zAbemaTVBaseIE._get_media_tokenc              
   C   s   |    | jj| j|ddr2|  r2| d d S d|v 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 )Nrw   rx   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/r9   )r   ZOriginZRefererr8   r|   r}   T)rz   ry   )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   s2    



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   )rX   rY   rZ   r   r~   rQ   r   r]   classmethodru   r   rD   r   r   r   r   r   r   r   r\   T   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   	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 t| j|dQd	d dR }rdS|ig|dT< |S )UNr   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 )r;   r    Z
thumbnails)_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_formatsr   Z_og_search_thumbnail)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   r   _real_extract  s    















	zAbemaTVIE._real_extract)rX   rY   rZ   
_VALID_URL_TESTSr   r   r   r   r   r   r      sV   		.r   c                   @   sx   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gZdd Zdd Zdd Zd S )!AbemaTVTitleIEzVhttps?://abema\.tv/video/title/(?P<id>[^?/#]+)/?(?:\?(?:[^#]+&)?s=(?P<season>[^&#]+))?   z$https://abema.tv/video/title/90-1887z90-1887u   シャッフルアイランドz$md5:61b2425308f41a5282a926edda66f178)r   r   r   r   )r    r   Zplaylist_mincountz$https://abema.tv/video/title/193-132z193-132u:   真心が届く~僕とスターのオフィス・ラブ!?~z$md5:9b59493d1f3a792bafbc7319258e7af8r?   z+https://abema.tv/video/title/25-1nzan-whrxez25-1nzan-whrxeu$   ソードアート・オンラインz$md5:c094904052322e6978495532bdbf06e6z@https://abema.tv/video/title/26-2mzbynr-cph?s=26-2mzbynr-cph_s40u   〈物語〉シリーズz26-2mzbynr-cphz$md5:e67873de1c88f360af1f0a4b84847a52)r   r   r   ;   )r    r   Zplaylist_countc                 #   sp   |t | j dt  jd}|r*||d<  jd| d|d|d  |d} fd	d
t|dD E d H  d S )Nseq)ZseriesVersionoffsetorderlimitZseasonIdv1/video/series/z	/programszDownloading page r   )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,   
_PAGE_SIZEr   r   )r   playlist_idseries_version	season_idpager;   r   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   r   _entries  s    zAbemaTVTitleIE._entriesc                 C   sT   |  |dd\}}| d| |}| j| ||d |||d|ddS )Nr   r   r   versionr   r   )r   Zplaylist_titleZplaylist_description)r   r   r   Zplaylist_resultr   r   )r   r    r   r   Zseries_infor   r   r   r     s    zAbemaTVTitleIE._real_extractN)	rX   rY   rZ   r   r   r   r   r   r   r   r   r   r   r     sD   			"r   )"ri   rN   r   rR   rL   r*   rF   r   ro   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   <module>   s*   (7  F