
    yfM                     J   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 ddlmZmZmZmZmZmZmZmZmZ d Z G d	 d
ej@                  jB                        Z" G d de      Z# G d de#      Z$ G d de#      Z%y)    N   )clean_proxies   )InfoExtractor)aes_ecb_decrypt)	ExtractorErrorbytes_to_intlistdecode_base_nint_or_noneintlist_to_bytesOnDemandPagedListtime_secondstraverse_objupdate_url_queryc                    | j                   j                  d   }d|j                  v ry| j                  d   j	                         }| j
                  j	                         }t        ||       |j                  | j                  |      }t        |t        j                  j                        sJ |j                  |       g |j                  d|_        y)z6Add a handler for opening URLs, like _download_webpageUrllibzabematv-licenseNhttp_headers)	cookiejarproxies)_request_directorhandlers_SUPPORTED_URL_SCHEMESparamscopyr   r   _get_instancer   
isinstanceurllibrequestOpenerDirectoradd_handler)ydlhandlerrhheadersr   openers         :/usr/lib/python3/dist-packages/yt_dlp/extractor/abematv.py
add_openerr'      s     
			'	'	1BB555jj(--/Gkk G'7#wGFffnn;;<<<
w O"";"; O=N OB    c                   ,    e Zd ZdZdZdZddZd Zd Zy)	AbemaLicenseHandleri  :123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzs@   3AF0298C219469522A313570E8583005A642E73EDD58E3EA2FB7339D3DF1597Ec           	      B    t        | dt        | dd              || _        y )Nzabematv-license_openabematv_license_open)setattrgetattrie)selfr0   s     r&   __init__zAbemaLicenseHandler.__init__4   s#     	,gd<RTX.YZr(   c                    | j                   j                  dd      }| j                   j                  |      }| j                   j                  dd |rdndd|it	        j
                  d|d      j                  d	      d
di      }t        |d   | j                        }t        t        j                  d|dz	  |dz              }t        j                  t        j                  | j                         |d   | j                   j"                  z   j                  d	      t$        j&                        }t        |j)                               }t+        t-        ||            S )NverboseF)to_showz$https://license.abema.io/abematv-hlszRequesting playback licenseta)kvltutf-8Content-Typeapplication/json)notequerydatar$   k)tablez>QQ@   l    cid	digestmod)r0   	get_param_get_media_token_download_jsonjsondumpsencoder
   STRTABLEr	   structpackhmacnewbinascii	unhexlifyHKEY
_DEVICE_IDhashlibsha256digestr   r   )	r1   ticketr5   media_tokenlicense_responseresencvideokeyhenckeys	            r&   _get_videokey_from_ticketz-AbemaLicenseHandler._get_videokey_from_ticket;   s2   ''##Iu5gg..w.?77112D`g?\mr$  vg 2 2 	 ,S1G&v{{5#)SK]E]'^_HHtyy)e$tww'9'99AA'Jnn& "!((*-V DEEr(   c           	      v   t        |t        j                  j                        r|j	                         n|}t        j
                  j                  |      j                  }| j                  |      }t        j                  j                  t        j                  |      dt        t        |            i|d      S )NzContent-Length   )r$   urlcode)r   r   r   Requestget_full_urlparseurlparsenetlocr_   response
addinfourlioBytesIOstrlen)r1   rb   rX   response_datas       r&   r-   z(AbemaLicenseHandler.abematv_license_openU   s    $.sFNN4J4J$Kc QT&&s+2266v>))"**]*Cc#m"45N
 *  	r(   N)r0   	AbemaTVIE)	__name__
__module____qualname__handler_orderrL   rS   r2   r_   r-    r(   r&   r*   r*   /   s!    MKHNDF4r(   r*   c                   R    e Zd ZdZdZdZdZdZed        Z	d Z
d
dZd ZddZd	 Zy)AbemaTVBaseIEabematvNs   v+Gjs=25Aw5erR!J8ZuvRrCx*rGswhB&qdHd_SYerEWdU&a?3DzN9BRbp5KwY4hEmcj5#fykMjJ=AuWz5GSMY-d@H7DMEh3M@9n2G552Us$$k9cD=3TxwWe86!x#Zyhec                 
    |j                  d      }t        t               dz  dz   dz        }t        j                  |      }t        |      j                  d      }d  fdfd}fd}  j                          ||j                          ||        ||j                  dz          ||        ||j                  dz         t        j                        j                  d      j                  d      S )	Nr:   i  r   c                     t        j                  j                  t        j                        }|j                  |        |j                         y )NrD   )rO   rP   
_SECRETKEYrU   rV   updaterW   )noncer]   clstmps     r&   mix_oncez-AbemaTVBaseIE._generate_aks.<locals>.mix_onceq   s1    7>>BAHHUO((*Cr(   c                 6    t        |       D ]
  }         y N)range)countir   r   s     r&   mix_tmpz,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpw   s    5\ r(   c                 `     t        j                        j                  d      | z          y )N   =)base64urlsafe_b64encoderstrip)r}   r   r   s    r&   	mix_twistz.AbemaTVBaseIE._generate_aks.<locals>.mix_twist|   s&    V--c299$?%GHr(      r   )rK   intr   timegmtimerm   r{   tm_montm_mdaytm_hourr   r   r   decode)	r~   deviceidts_1hourtime_structts_1hour_strr   r   r   r   s	   `      @@r&   _generate_akszAbemaTVBaseIE._generate_aksg   s    ??7+$.2d:;kk(+8}++G4		
	I 	 ""#(##a'(,##a'('',33D9@@IIr(   c           
      >   | j                   r| j                   S t        | j                  t        |              | j	                         \  }}|xr( | j
                  j                  | j                  |d      }|xr |j                  d      t        _         t        j                   r-	 |j                  d      t        _
        | j                  d       y t        t        j                                t        _
        | j#                  | j                        }| j%                  dd d	t'        j(                  | j                  |d
      j+                  d      ddi      }|d   t        _         | j                   S # t        $ r}| j                  d| d       Y d }~d }~ww xY w)N
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?   r$   token)
_USERTOKENr'   _downloaderr*   _get_login_infocacheload_NETRC_MACHINEgetrw   rT   rG   r   report_warningrm   uuiduuid4r   rH   rI   rJ   rK   )r1   username_
auth_cacheeaks	user_datas          r&   _get_device_tokenzAbemaTVBaseIE._get_device_token   sg   ????"4##%8%>?**,!f$**//$2E2ExYe/"f
#-#M*..2M ##l+5>>++F(%%d+ $'tzz|#4   1''+T OO(+  vg 2 ( 	 $-W#5 ! " l##&efgehhi$jkkls   &+E4 4	F=FFc                     |s| j                   r| j                   S | j                  dd |rdnddddddd	d
dd| j                          i      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   rw   )r1   
invalidater5   s      r&   rG   zAbemaTVBaseIE._get_media_token   s    d..###$($7$714X_>Tej#$!*#&  74+A+A+C*D!E %8 % %! r(   c                 N   | j                          | j                  j                  | j                  |d      r"| j	                         r| j                  d       y d|v rd\  }}nd\  }}| j                  d| d dt        j                  ||d	|i      j                  d
      d| j                          dddd      }|d   t        _        | j	                  d       t        j                  t        j                  d}| j                  j                  | j                  ||       y )Nr   r   zSkipping logging in@)z
user/emailemail)oneTimePassworduserIdzhttps://api.abema.io/v1/auth/z
Logging inpasswordr:   r   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   rw   r   rT   store)r1   r   r   epmethodlogin_responser   s          r&   _perform_loginzAbemaTVBaseIE._perform_login   s     ::??4..,?OTXTiTiTk23(?.JB4JB,,+B40$\H  vg#*4+A+A+C*D!E,. 2	) - 
 $2'#: d#&11&11

 	

,,h
Cr(   c           
      b    | j                  d| ||xs i |dd| j                          i      S )Nzhttps://api.abema.io/r   r   )r>   r=   r$   )rH   r   )r1   endpointvideo_idr>   r=   s        r&   	_call_apizAbemaTVBaseIE._call_api   sJ    ""#H:.74+A+A+C*D!E #  	r(   c                     t        j                  d|      D ]G  }| j                  |j                  d      |d      }t	        |d      dk7  r6t	        |d      }|sE|c S  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   )r1   webpager   jldjsonlditemss         r&   _extract_breadcrumb_listz&AbemaTVBaseIE._extract_breadcrumb_list   sq    ;;w 	C %%cii	&:HE%RFFG,0@@ )IJE	 	r(   )FT)NzDownloading JSON metadata)rq   rr   rs   r   r   rT   r   r{   classmethodr   r   rG   r   r   r   ru   r(   r&   rw   rw   ^   sN    NJJK UJJ JBB &D>
r(   rw   c            
       |    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 Zy) rp   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)rb   	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           
         | j                  |      j                  dd      \  }}dd| j                         z   i}|j                  d      d   }| j	                  ||      }| j                  d|d|	      }| j                  ||i 	      }| j                  d
|dd 	      }|sWd }	t        j                  d|      D ])  }
| j                  |
j                  d      |d      }	|	s) n |	r|	j                  d      }|s|dk(  r| j                  s| j                  d||      | _        t        d      }| j                  j                  dg       D ]/  }|j                  d      |k7  r|d   |k  s!||d   k  s*|d   } n | j                  ||      }|r|d   |d<   |d   |d<   |s|d   }| j                  d|dd d       }|s+| j!                  d!|      }|rt        j"                  d"d#|      }t        j$                  d$|      }|rbt'        |j                  d      t)        d%      	      }t'        |j                  d&      t)        d%      	      }|d'k  r|nd |d(<   |d)k  r|nd |d*<   d+\  }}|dk(  rVd,}d-}|d.k(  rt+        |d/d0i      }| j                  ||      }|d1   D ]  }||d   k(  s|d2   d3   } n t-        d4| d5d,6      |dk(  r|| j                  d7| |d8|9      }t/        |d:      }d;|vr| j1                  d<       |j3                  t/        |d=d>d?d@dA             |st/        |dB      }|st/        |dC      }dD| dE}nN|dk(  r>| j                  dF| |d8|9      }t/        |dGd	      s| j1                  d<       dH| dE}nt-        dI      |r"| j1                  dJ       | j1                  dK       | j5                  ||dL|M      }|j3                  |||||dN       |S )ONr   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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   )FNTz 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$   )terms.onDemandType   zThis is a premium-only stream)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   )_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   r   r|   _extract_m3u8_formats)r1   rb   r   
video_typer$   r   canonical_urlinfor   r   r   nowr  
breadcrumbr   og_descmobjseriepisr   m3u8_urlchannel_urlonair_channelschapi_responseondemand_typesr  s                              r&   _real_extractzAbemaTVIE._real_extract#  s     $44S9??fM*Y)?)?)AA
  %%c*2.
((h7**5w +  ##GXr#B""GRYcg # iF{{ ^  ))#))I*>PU)V 

9-|3??"&"5"5KX# #6 #% Q'C++GR8 88K(H4	?c)cDM.A ME 227HE
 (^DN(nDOY--K]D . ; ,,H'SG ff &
 G% yy*M:tzz!}eElCDtzz!}eElCD,03JDDD! .2D[TdD!"'%G<K=(.{Z<MN!00hGN$Z0 _r$x'!*~e4H_
 %':8*I%NY]^^9$..9(Dh+ / !L *,8VWN&##$CDKK\-,!7"7	4   $\3GH*<9OPCH:^\H7"..6xjA8+ / !L  .PZ_`##$CD@
.YH //  !Z  [  !H  I,,hE - 9 	&
 	 r(   )rq   rr   rs   
_VALID_URL_TESTSr  r4  ru   r(   r&   rp   rp      s    kJ< U*%W
  L"]4_A
  D"-A6/
  9 B
 x
G-F\ JIr(   rp   c                   Z    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 Zd Zd Zy)AbemaTVTitleIEz-https?://abema\.tv/video/title/(?P<id>[^?/]+)   z$https://abema.tv/video/title/90-1597z90-1597u   シャッフルアイランド)r   r   r   )rb   r   playlist_mincountz$https://abema.tv/video/title/193-132z193-132u:   真心が届く~僕とスターのオフィス・ラブ!?~   z#https://abema.tv/video/title/25-102z25-102u=   ソードアート・オンライン アリシゼーション   c              #       K    j                  d| d|d|dz    |t        | j                  z        dt         j                        d      } fdt        |d	      D        E d {    y 7 w)
Nv1/video/series/z	/programszDownloading page r   seq)seriesVersionoffsetorderlimit)r=   r>   c              3   F   K   | ]  }j                  d |         yw)zhttps://abema.tv/video/episode/N)
url_result).0xr1   s     r&   	<genexpr>z-AbemaTVTitleIE._fetch_page.<locals>.<genexpr>  s,      F OO=aSABFs   !)programs.r   )r   rm   
_PAGE_SIZEr   )r1   playlist_idseries_versionpagerI  s   `    r&   _fetch_pagezAbemaTVTitleIE._fetch_page  s     >>{m95{$TAXJ/!/dT__45T__-	 " F!(,CDF 	F 	Fs   A&A1)A/*A1c                 l    t        t        j                  | j                  ||      | j                        S r   )r   	functoolspartialrN  rJ  )r1   rK  rL  s      r&   _entrieszAbemaTVTitleIE._entries  s.     d..^LOO 	r(   c                     | j                  |      }| j                  d| |      }| j                  | j                  ||d         ||j	                  d      |j	                  d            S )Nr>  versionr   r  )rK  playlist_titleplaylist_description)	_match_idr   playlist_resultrR  r   )r1   rb   rK  series_infos       r&   r4  zAbemaTVTitleIE._real_extract  sm    nnS)nn'7}%E{S##MM+{9'=>K&??73!,!; $ = 	=r(   N)	rq   rr   rs   r5  rJ  r6  rN  rR  r4  ru   r(   r&   r8  r8    sq    AJJ 65
  6Q
   5T
  F.F
=r(   r8  )&r   rQ   rP  rU   rO   rk   rI   r   rM   r   urllib.parser   urllib.requesturllib.responser   utils.networkingr   commonr   aesr   utilsr   r	   r
   r   r   r   r   r   r   r'   r   BaseHandlerr*   rw   rp   r8  ru   r(   r&   <module>rb     s         	  	       , ! !
 
 
P ,&..44 ,^PM Pf{ {|5=] 5=r(   