o
    iM                     @   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                       sF   e Zd ZdZdZdZdZdZdZd fdd	Z	d
d Z
dd Z  ZS )AbemaLicenseRH)zabematv-licenseNabematv_license:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzs@   3AF0298C219469522A313570E8583005A642E73EDD58E3EA2FB7339D3DF1597Eie	AbemaTVIEc                   s   t  jdi | || _d S )N )super__init__r   )selfr   kwargs	__class__r   L/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/abematv.pyr   &   s   
zAbemaLicenseRH.__init__c              
   C   s   |j }tj|j}z| |}W n) ty$ } zt|jd|d }~w t	t
tfy: } ztt|d|d }~ww 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!   ticket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   big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   r0   r5   media_tokenlicense_responseresencvideokeyhenckeyr   r   r   r&   9   s,   
z(AbemaLicenseRH._get_videokey_from_ticket)r   r   )__name__
__module____qualname___SUPPORTED_URL_SCHEMES_SUPPORTED_PROXY_SCHEMES_SUPPORTED_FEATURESRH_NAMErL   rS   r   r3   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 )AbemaTVBaseIE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 )NrD   )rO   rP   
_SECRETKEYrU   rV   updaterW   )noncer]   )clstmpr   r   mix_onceg   s   
z-AbemaTVBaseIE._generate_aks.<locals>.mix_oncec                    s   t | D ]}  qd S N)range)count_rn   rm   r   r   mix_tmpm   s   
z,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpc                    s    t d|   d S )N   =)base64urlsafe_b64encoderstrip)rk   rs   r   r   	mix_twistr   s   z.AbemaTVBaseIE._generate_aks.<locals>.mix_twist   ru   zutf-8)rK   intr   timegmtimer-   ri   tm_montm_mdaytm_hourrv   rw   rx   decode)rl   deviceidts_1hourtime_structts_1hour_strrt   ry   r   )rl   rn   rm   r   _generate_aks]   s   


zAbemaTVBaseIE._generate_aksc              
   C   s  | j r| j S | jjt| d d |  \}}|o"| jj| j|dd}|o)|	dt
_ t
j rXz|	dt
_| d W d S  tyW } z| d| d W Y d }~nd }~ww 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min_ver	usertoken	device_idTz?Failed to login with cached user token; obtaining a fresh one ()zhttps://api.abema.io/v1/usersAuthorizing)deviceIdapplicationKeySecretr:   r;   r<   r>   r    token)
_USERTOKEN_downloader_request_directoradd_handlerr   _get_login_infocacheload_NETRC_MACHINEgetrg   rT   rG   r	   report_warningr-   uuiduuid4r   rH   rI   rJ   rK   )r   usernamerr   
auth_cacher2   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 tokenFandroidz6.0.1ja_JPz
Asia/Tokyoztv.abemaz3.27.1)osName	osVersionosLang
osTimezoneappId
appVersionAuthorizationbearer )r<   r=   r    r   )_MEDIATOKENrH   r   rg   )r   
invalidater5   r   r   r   rG      s"   
zAbemaTVBaseIE._get_media_tokenc              
   C   s   |    | jj| j|ddr|  r| d d S d|v r"d\}}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)oneTimePassworduserIdzhttps://api.abema.io/v1/auth/z
Logging inpasswordr   zhttps://abema.tvzhttps://abema.tv/r;   )r   OriginRefererr:   r   r   T)r   r   )r   r   r   r   rG   write_debugrH   rI   rJ   rK   rg   r   rT   store)r   r   r   epmethodlogin_responser   r   r   r   _perform_login   s4   



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    )rH   r   )r   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rq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@typeBreadcrumbList)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`   ra   r   r   rT   r   ri   classmethodr   r   rG   r   r   r   r   r   r   r   rg   T   s    
!
!
rg   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_numberexpired)r!   	info_dictskipz:https://abema.tv/channels/anime-live2/slots/E8tvAnMJ7a9a5d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	}|s]d }	td|D ]}
| j	|
d|dd}	|	rU nqD|	r]|	
d}|s|dkr| jso| jd||d| _tdd}| j
dg D ]}|
d|krq{|d |kr||d k r|d } nq{| ||}|r|d |d< |d |d< |s|d }| jd|dd dd }|s| d!|}|rtd"d#|}td$|}|rt|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rBd-}d.}|d/krt|d0d1i}| ||}|d2 D ]}||d kr5|d3 d4 } nq$td5| d6d-d7nq|dkr| jd8| |d9|d:}t|d;d<thfsd| d= d>}|t|d?d@dAdBdC |syt|dD}|st|dE}dF| dG}n+|dkr| jdH| |d9|d:}t|dIdd	s| 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slots	channelIdstartAt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1channelsplayback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 stream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flagstimeshiftFreez'https://vod-abematv.akamaized.net/slot/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)mp4)extlive)r   r   r   formatsr   availability )r=   r!   
thumbnails)_match_valid_urlr   r   split_download_webpage_search_regex_search_json_ldr   r   r   r   
_TIMETABLErH   r   r   _html_search_regex_html_search_metasubsearchr   floatr   r	   r   boolr   rj   _extract_m3u8_formatsr   _og_search_thumbnail)r   r!   r   
video_typer    r   canonical_urlinfor   r   r   nowr   
breadcrumbr   og_descmobjseriepisr   m3u8_urlr  channel_urlonair_channelschapi_responser  r   r   r   r   _real_extract  s   














	zAbemaTVIE._real_extract)r_   r`   ra   
_VALID_URL_TESTSr
  r!  r   r   r   r   r      sX    		.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   playlist_mincountz$https://abema.tv/video/title/193-132z193-132u:   真心が届く~僕とスターのオフィス・ラブ!?~z$md5:9b59493d1f3a792bafbc7319258e7af8rA   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   playlist_countc                 #   sr    |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)seriesVersionoffsetorderlimit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)
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=   r5  r   r3  r   _fetch_page  s    
zAbemaTVTitleIE._fetch_pagec                 C   s   t t| j|||| jS ro   )r
   	functoolspartialr;  r6  )r   r7  r8  r9  r   r   r   _entries  s   zAbemaTVTitleIE._entriesc                 C   sT   |  |dd\}}| d| |}| j| ||d |||d|ddS )Nr   r   r/  versionr   r   )r7  playlist_titleplaylist_description)r  r   r   playlist_resultr>  r   )r   r!   r7  r9  series_infor   r   r   r!    s   zAbemaTVTitleIE._real_extractN)	r_   r`   ra   r"  r6  r#  r;  r>  r!  r   r   r   r   r$    sF    			"r$  )"rv   rQ   r<  rU   rO   r+   rI   r   r|   urllib.parser"   r   commonr   aesr   
networkingr   r   networking.exceptionsr   utilsr	   r
   r   r   r   r   r   r   r   rg   r   r$  r   r   r   r   <module>   s,    (7  F