
    V|hM                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r
S SKrSSKJr  SSKJr  SSKJrJr  SSKJr  SSKJrJrJrJrJrJrJrJr   " S	 S
\5      r " S S\5      r " S S\5      r  " S S\5      r!g)    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                   P   ^  \ rS rSrSrSrSrSrSrSr	SU 4S jjr
S rS	 rS
rU =r$ )AbemaLicenseRH   )zabematv-licenseNabematv_license:123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzs@   3AF0298C219469522A313570E8583005A642E73EDD58E3EA2FB7339D3DF1597Ec                2   > [         TU ]  " S0 UD6  Xl        g )N )super__init__ie)selfr   kwargs	__class__s      R/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/abematv.pyr   AbemaLicenseRH.__init__&   s    "6"    c           
         UR                   n[        R                  R                  U5      R                  n U R                  U5      n[        [        R                  " U5      US[!        [#        U5      5      0S9$ ! [         a  n[        UR                  S9UeS nAf[        [        [        4 a  n[        [        U5      S9UeS nAff = f)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es         r   _sendAbemaLicenseRH._send*   s    kk&&s+22	7 ::6BM JJ}%s%s3}+='>?A 	A  	7 qww/Q6Hi0 	7 tAw/Q6	7s#   A; ;
C	BC	1CC	c                    U R                   R                  SS5      nU R                   R                  US9nU R                   R                  SS U(       a  SOSSU0[        R
                  " SUS.5      R                  5       S	S
0S9n[        US   U R                  S9n[        UR                  SS5      5      n[        R                  " [        R                  " U R                  5      US   U R                   R                   -   R                  5       ["        R$                  S9n[        UR'                  5       5      n[)        [+        Xh5      5      $ )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   r5   r<   media_tokenlicense_responseresencvideokeyhenckeys	            r   r+   (AbemaLicenseRH._get_videokey_from_ticket9   s    ''##Iu5gg..w.?77112D`g?\mr$  vx 2 2 	 ,S1H3<<E23HHtzz*e$tww'9'99AACnn& ahhj!_[9::r!   )r   )r   	AbemaTVIE)__name__
__module____qualname____firstlineno___SUPPORTED_URL_SCHEMES_SUPPORTED_PROXY_SCHEMES_SUPPORTED_FEATURESRH_NAMErS   rZ   r   r8   r+   __static_attributes____classcell__)r   s   @r   r   r      s9    1#GLIOEA; ;r!   r   c                   ^    \ rS rSrSrSrSrSrSr\	S 5       r
S rSS jrS rSS	 jrS
 rSrg)AbemaTVBaseIET   abematvNs   v+Gjs=25Aw5erR!J8ZuvRrCx*rGswhB&qdHd_SYerEWdU&a?3DzN9BRbp5KwY4hEmcj5#fykMjJ=AuWz5GSMY-d@H7DMEh3M@9n2G552Us$$k9cD=3TxwWe86!x#Zyhec                   ^ ^^ UR                  5       n[        [        5       S-  S-   S-  5      n[        R                  " U5      n[        U5      R                  5       nS mU U4S jmUU4S jnUU4S jnT" T R                  5        U" UR                  5        U" U5        U" UR                  S-  5        U" U5        U" UR                  S-  5        [        R                  " T5      R                  S5      R                  S5      $ )	Ni  r   c                    > [         R                  " TR                  [        R                  S9nUR                  U 5        UR                  5       mg )NrK   )rV   rW   
_SECRETKEYr\   r]   updater^   )noncerd   clstmps     r   mix_once-AbemaTVBaseIE._generate_aks.<locals>.mix_onceg   s1    7>>BAHHUO((*Cr!   c                 :   > [        U 5       H  nT" T5        M     g N)range)count_r}   r|   s     r   mix_tmp,AbemaTVBaseIE._generate_aks.<locals>.mix_tmpm   s    5\ "r!   c                 b   > T" [         R                  " T5      R                  S5      U -   5        g )N   =)base64urlsafe_b64encoderstrip)rz   r}   r|   s    r   	mix_twist.AbemaTVBaseIE._generate_aks.<locals>.mix_twistr   s&    V--c299$?%GHr!      r   zutf-8)rR   intr   timegmtimer2   rx   tm_montm_mdaytm_hourr   r   r   decode)	r{   deviceidts_1hourtime_structts_1hour_strr   r   r}   r|   s	   `      @@r   _generate_aksAbemaTVBaseIE._generate_aks]   s    ??$$.2d:;kk(+8}++-		
	I 	 ""#(##a'(,##a'('',33D9@@IIr!   c           
      x   U R                   (       a  U R                   $ U R                  R                  R                  [	        U S S95        U R                  5       u  pU=(       a%    U R                  R                  U R                  USS9nU=(       a    UR                  S5      [        l         [        R                   (       a-   UR                  S5      [        l        U R                  S5        g [        [         R"                  " 5       5      [        l        U R%                  U R                  5      nU R'                  S	S S
[(        R*                  " U R                  US.5      R-                  5       SS0S9nUS   [        l         U R                   $ ! [         a  nU R                  SU S35         S nANS nAff = f)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applicationKeySecretrA   rB   rC   rE   r%   token)
_USERTOKEN_downloader_request_directoradd_handlerr   _get_login_infocacheload_NETRC_MACHINEgetrs   r[   rN   r
   report_warningr2   uuiduuid4r   rO   rP   rQ   rR   )r   usernamer   
auth_cacher7   aks	user_datas          r   _get_device_tokenAbemaTVBaseIE._get_device_token   so   ????"**66~VZ7[\**,f$**//$2E2ExYe/"f
#-#M*..2M ##l+5>>++F(%%d+ $'tzz|#4   1''+T OO(+  vx 2 ( 	 $-W#5 ! " l##&efgehhi$jkkls   +F 
F9F44F9c                     U(       d  U R                   (       a  U R                   $ U R                  SS U(       a  SOSSSSSSS	S
.SSU R                  5        30S9S   [        l         U R                   $ )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 )rC   rD   r%   r   )_MEDIATOKENrO   r   rs   )r   
invalidater<   s      r   rN   AbemaTVBaseIE._get_media_token   s    d..###$($7$714X_>Tej#$!*#&  74+A+A+C*D!E %8 % %! r!   c                 R   U R                  5         U R                  R                  U R                  USS9(       a'  U R	                  5       (       a  U R                  S5        g SU;   a  Su  p4OSu  p4U R                  SU 3S S[        R                  " XAS	U05      R                  5       S
U R                  5        3SSSS.S9nUS   [        l        U R	                  S5        [        R                  [        R                  S.nU R                  R                  U R                  X5        g )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/rB   )r   OriginRefererrA   r   r   T)r   r   )r   r   r   r   rN   write_debugrO   rP   rQ   rR   rs   r   r[   store)r   r   r   epmethodlogin_responser   s          r   _perform_loginAbemaTVBaseIE._perform_login   s    ::??4..,?OTXTiTiTkTk23(?.JB4JB,,+B40$\H  vx#*4+A+A+C*D!E,. 2	" - 
 $2'#: d#&11&11

 	

,,hCr!   c           
      d    U R                  SU 3X#=(       d    0 USSU R                  5        30S9$ )Nzhttps://api.abema.io/r   r   )rD   rC   r%   )rO   r   )r   endpointvideo_idrD   rC   s        r   	_call_apiAbemaTVBaseIE._call_api   sH    ""#H:.74+A+A+C*D!E #  	r!   c                     [         R                  " SU5       HL  nU R                  UR                  S5      USS9n[	        US5      S:w  a  M5  [	        US5      nU(       d  MJ  U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itemss         r   _extract_breadcrumb_list&AbemaTVBaseIE._extract_breadcrumb_list   sn    ;;wC %%cii	&:HE%RFFG,0@@ )IJEu 	r!   r   )FT)NzDownloading JSON metadata)rh   ri   rj   rk   r   r   r[   r   rx   classmethodr   r   rN   r   r   r   rp   r   r!   r   rs   rs   T   sN    NJJK UJJ JBB &D>
r!   rs   c            
           \ rS rSrSrSSSSSSSS	S
.SS.SSSSSSS	SS.SS.SSSSSSSS.SS.SSSSS.SS./rSrS  rS!rg)"rg      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           
         U R                  U5      R                  SS5      u  p#SSU R                  5       -   0nUR                  S5      S   nU R	                  X5      nU R                  SUSUS	9nU R                  XR0 S	9nU R                  S
USS S	9nU(       da  S n	[        R                  " SU5       H,  n
U R                  U
R                  S5      USS9n	U	(       d  M,    O   U	(       a  U	R                  S5      nU(       d  US:X  a  U R                  (       d  U R                  SUUS9U l        [        SS9nU R                  R                  S/ 5       H4  nUR                  S5      U:w  a  M  US   U::  d  M%  XS   :  d  M/  US   n  O   U R                  XR5      nU(       a  US   US'   US   US'   U(       d  US   nU R                  SUSS SS 9nU(       d1  U R!                  S!U5      nU(       a  [        R"                  " S"S#U5      n[        R$                  " S$U5      nU(       a^  ['        UR                  S5      [)        S%5      S	9n['        UR                  S&5      [)        S%5      S	9nUS':  a  UOS US('   US):  a  UOS US*'   S+u  nnS,nUS:X  aW  S-nS.nUS/:X  a  [+        US0S105      nU R                  UU5      nUS2    H  nUUS   :X  d  M  US3   S4   n  O   [-        S5U S63S-S79eUS:X  a  U R                  S8U 3US9US:9n[/        US;S<[0        145      (       d  U R3                  S=5        S>nUR5                  [/        US?S@SASBSC.5      5        U(       d  [/        USD5      nU(       d  [/        USE5      nSFU SG3nOPUS:X  a?  U R                  SHU 3US9US:9n[/        USISS	9(       d  U R3                  S=5        S>nSJU SG3nO[-        SK5      eU(       a"  U R3                  SL5        U R3                  SM5        U R7                  UUSNUSO9nUR5                  UUUUUUSP.5        [9        U R;                  USQS	9S SR9=n(       a  SSU0/UST'   U$ )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)rC   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 )rD   r&   
thumbnails)_match_valid_urlr   r   split_download_webpage_search_regex_search_json_ldr   r   r   r   
_TIMETABLErO   r   r   _html_search_regex_html_search_metasubsearchr   floatr   r
   r   boolr   ry   _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   s                               r   _real_extractAbemaTVIE._real_extract  s     $44S9??fMY)?)?)AA
  %%c*2.
((7**5w +  ##Gr#B""GRYcg # iF{{ ^ ))#))I*>PU)V6 

9-|3??"&"5"5KX# #6 #% Q'C++GR888K(H4	?c)cM.A ME 9 227E
 (^DN(nDOY--J]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 1
 %':8*I%NY]^^9$..9(Dh+ / !L  w.GHH##$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 	&(
 	 #4#<#<Wb#<#QY]^^9^#()"4!5Dr!   )r*  )	rh   ri   rj   rk   
_VALID_URL_TESTSr*  rA  rp   r   r!   r   rg   rg      s    kJ< U*%W
  L"]4_A
  D"-A6/
  9 B
 x
G-F\ JPr!   rg   c                   z    \ rS rSrSrSrSSSSS.S	S
.SSSSS.SS
.SSSSS.SS
.SSSSS.SS./rS rS rS r	Sr
g) AbemaTVTitleIEi  zVhttps?://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:9b59493d1f3a792bafbc7319258e7af8rH   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              #      ^ #    U[        UT R                  -  5      S[        T R                  5      S.nU(       a  X5S'   T R                  SU S3USUS-    3US9nU 4S	 j[        US
5       5        S h  vN   g  N7f)Nseq)seriesVersionoffsetorderlimitseasonIdv1/video/series/z	/programszDownloading page r   )rC   rD   c              3   L   >#    U  H  nTR                  S U 35      v   M     g7f)zhttps://abema.tv/video/episode/N)
url_result).0xr   s     r   	<genexpr>-AbemaTVTitleIE._fetch_page.<locals>.<genexpr>  s-      FD OO=aSABBDs   !$)programs.r   )r2   
_PAGE_SIZEr   r   )r   playlist_idseries_version	season_idpagerD   rY  s   `      r   _fetch_pageAbemaTVTitleIE._fetch_page  s     +$01)	
  )*>>{m95{$TAXJ/ " F!(,CDF 	F 	Fs   A1A<4A:5A<c                 n    [        [        R                  " U R                  XU5      U R                  5      $ r   )r   	functoolspartialr_  rZ  )r   r[  r\  r]  s       r   _entriesAbemaTVTitleIE._entries  s.     d..YWOO 	r!   c                     U R                  U5      R                  SS5      u  p#U R                  SU 3U5      nU R                  U R	                  X$S   U5      UUR                  S5      UR                  S5      S9$ )Nr   r   rR  versionr   r  )r[  playlist_titleplaylist_description)r%  r   r   playlist_resultrd  r   )r   r&   r[  r]  series_infos        r   rA  AbemaTVTitleIE._real_extract  s    !%!6!6s!;!A!A$!Qnn'7}%E{S##MM+9'=yIWb&??73!,!; $ = 	=r!   r   N)rh   ri   rj   rk   rC  rZ  rD  r_  rd  rA  rp   r   r!   r   rF  rF    s    jJJ 65A

  6QA

   =";A

   R/"A

 1 FDF"
=r!   rF  )"r   rX   rb  r\   rV   r0   rP   r   r   urllib.parser'   r   commonr   aesr   
networkingr   r   networking.exceptionsr	   utilsr
   r   r   r   r   r   r   r   r   rs   rg   rF  r   r!   r   <module>rs     sz         	  	    ! ! 1 2	 	 	4;^ 4;nPM PfB BJC=] C=r!   