
    yfn                         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m	Z	m
Z
mZmZmZmZmZmZmZmZmZ  G d de      Z G d	 d
e      Z G d de      Z G d de      Z G d de      Z G d de      Zy)    N   )InfoExtractor   )	HTTPError)ExtractorErrorfloat_or_noneformat_fieldint_or_nonejwt_decode_hs256parse_age_limitparse_countparse_iso8601	qualitiestime_secondstraverse_objurl_or_noneurlencode_postdatac                       e Zd ZdZdZdZdZdZdZdZ	dZ
dddd	d
dddddddZed        Zd Zd Zd Zdi fdZdi fdZd ZddZy)CrunchyrollBaseIEzhttps://www.crunchyroll.comzhttps://api.crunchyroll.comcrunchyrollN)cr_webnoaihdevm_6iyg0a8l0qzar-SAde-DEzen-USzes-419zes-ESzfr-FRzit-ITzpt-BRzpt-PTzru-RUzhi-IN)arde eszes-esfritzpt-brzpt-ptruhic                 h    t        | j                  | j                        j                  d            S )Netp_rt)bool_get_cookies	_BASE_URLget)selfs    >/usr/lib/python3/dist-packages/yt_dlp/extractor/crunchyroll.pyis_logged_inzCrunchyrollBaseIE.is_logged_in.   s'    D%%dnn599(CDD    c                    | j                   ry | j                  | j                   dd ddddd| j                   dd	      }|d
   dk7  rt	        d      |d   d   }| j                  | j                   dd dt        |||d            }|d
   dk7  rt	        d|d   z  d      | j                   st	        d      y )Nz/get_upsell_data.0.jsonzGetting session idr   whatvalueshouldbeforwebzcom.crunchyroll.staticgiKq5eY27ny3cqzz/welcome/login)sess_id	device_iddevice_typeaccess_tokenrefererquerycodeokzCould not get session iddata
session_idz/login.1.jsonz
Logging in)accountpasswordr9   r8   z Login failed. Server message: %smessageTexpectedz-Login succeeded but did not set etp_rt cookie)r*   _download_json	_API_BASEr&   r   r   )r(   usernamer;   upsell_responser9   login_responses         r)   _perform_loginz CrunchyrollBaseIE._perform_login2   s   --~~56>R67 1"nn-^< .  6"d* !;<<$V,\:
,,~~m,dL##$(%  -  &!T) !CnU^F_!_jnoo   !PQQ !r+   c                    t         j                  rt         j                  t               kD  ry t         j                  sm| j
                  | j                     }| j                  d|        dt        j                  | dj                               j                         z   t         _        dt         j                  i}| j                  rd}nd}t        j                         |d<   	 | j                  | j                   dd d	| |d
| j                               }dt+        |dt,        hddf      v t         _        d|d   dz   |d   z   it         _        t        t+        |dt0        hfd      dz
        t         _        y # t         $ rF}t#        |j$                  t&              r&|j$                  j(                  dk(  rt!        dd       d }~ww xY w)NzUsing cxApiParam=zBasic :Authorizationetp_rt_cookie	client_idzETP-Anonymous-IDz/auth/v1/tokenzAuthenticating with grant_type=zgrant_type=)noteheadersr8   i  zRequest blocked by Cloudflare; navigate to Crunchyroll in your browser, then pass the fresh cookies (with --cookies-from-browser or --cookies) and your browser's User-Agent (with --user-agent)Tr>   
cr_premiumr2   benefits.
token_type 
expires_ini,  )default
   )seconds)r   _AUTH_HEADERS_AUTH_REFRESHr   _BASIC_AUTH
_CLIENT_IDr*   write_debugbase64	b64encodeencodedecodeuuiduuid4r@   r&   r   
isinstancecauser   statusr   r   _IS_PREMIUMr   )r(   cx_api_paramauth_headers
grant_typeauth_responseerrors         r)   _update_authzCrunchyrollBaseIE._update_authO   s   **/@/N/NQ]Q_/_ ,,??4+<+<=L0?@,4v7G7G<.XYHZHaHaHc7d7k7k7m,m)'):)F)FG(J$J/3zz|L+,
	 //>>".14@_`j_k>l$[+E+L+L+N 0 PM )5]Ucfvew  zD  FI  UJ  9K  )K%+:M,<WZ]<]`mn|`}<}*~'*6|M\hkxjy[z  EH  @I  LN  @N  +O'  	%++y1ekk6H6HC6O$ISWY Y 	s   %7F 	G
AGGc                 v    | j                  dt        d      }|r|d   S | j                  j                  |      S )NmetadataT)ie_key	casesenser   )_configuration_argCrunchyrollBetaIE_LOCALE_LOOKUPr'   )r(   languageconfig_locales      r)   _locale_from_languagez'CrunchyrollBaseIE._locale_from_languagen   s>    //
CT`d/e#0}QWd6I6I6M6Mh6WWr+   c                    | j                          |j                  d      sd| }|j                         }| j                  |      }|r||d<   | j	                  | j
                   | ||xs d| t        j                  |      S )N/localezCalling API: )rL   r5   )ri   
startswithcopyrs   r@   r&   r   rU   )r(   endpointinternal_idlangrK   r5   rv   s          r)   _call_base_apiz CrunchyrollBaseIE._call_base_apir   s    ""3'8*~H

++D1$E(O""~~xj);8Z-PXz@Z%335 # B 	Br+   apic           
      n   |j                  d| j                   d      sd| j                   d| }	 | j                  |||d| d| j                   d|      }|st        d| d	      |S # t        $ r>}t	        |j
                  t              r|j
                  j                  dk(  rY d }~y  d }~ww xY w)
Nz/content/v2/ru   Downloading z JSON ()r4   i  z%Unexpected response when downloading z JSON)rw   _API_ENDPOINTr|   r   r`   ra   r   rb   )r(   pathrz   r{   rK   r5   resultrh   s           r)   	_call_apizCrunchyrollBaseIE._call_api   s    d.@.@-ACD!$"4"4!5Qtf=D	((k4<vWTEWEWDXXY)Zbg ) iF  #He!TUU  	%++y1ekk6H6HC6O	s   'A- -	B463B/.B//B4c                     | j                  d| d|ddd      }|sy g }dD ]R  }t        ||dt        hf      }t        ||dt        hf      }||0|j                  |j	                         ||d	       T |S )
Nz6https://static.crunchyroll.com/skip-events/production/z.jsonzDownloading chapter infoF)rK   fatalerrnote)recapintrocreditspreviewstartend)title
start_timeend_time)r@   r   r   append
capitalize)r(   rz   skip_eventschapterseventr   r   s          r)   _extract_chaptersz#CrunchyrollBaseIE._extract_chapters   s    ))D[MQVW8u * V = 	aE ug.OPE{UEM?,KLC}OOe&6&6&8[^_`	a r+   c                    |s|}| j                          | j                  d| d|dt        j                        }ddd|d   fi}t	        |dt
        j                  hd f      D ]  \  }}d	| ||d   f||<    | j                  d
      xs dgD cg c]  }|dk(  rdn| }}|D 	cg c]  }	|	s|		 }
}	|
rFd|vrBt        |      }| j                  ddj                  |
              | j                  dd       n#t        t        t        j                  |            }t	        |dt        hf      }t        |d d d         }g i }}|j                         D ]  \  }}}|j                         |v rG| j!                  |||t        j                  dd|r| dnd d      \  }}| j#                  ||       na|D ]4  }|j%                  d      dk7  r||d<    ||j                               |d<   6 |j'                  |        t	        |dt
        j                  hdf      D ]3  \  }}|j)                  |g       j+                  t	        |ddd              5 ||fS c c}w c c}	w )!Nz2https://cr-play-service.prd.crunchyrollsvc.com/v1/z/console/switch/playzDownloading stream info)rK   rL   r   urlhardSubsc                     |d   d   S )Nr   r    )_vs     r)   <lambda>z3CrunchyrollBaseIE._extract_stream.<locals>.<lambda>   s    jklmjnotju r+   zhardsub-hardsubnoneallzAvailable hardsub languages: z, zTo extract formats of a hardsub language, use "--extractor-args crunchyrollbeta:hardsub=<language_code or all>". See https://github.com/yt-dlp/yt-dlp#crunchyrollbeta-crunchyroll for more infoT)	only_onceaudioLocaleFr   rP   zMPD manifest)mpd_idrL   r   rK   )targetacodecrq   quality)	subtitlescaptions.format)r   ext)ri   r@   r   rU   r   dictitemsrn   set	to_screenjoinmapstrlowerr   values"_extract_mpd_formats_and_subtitles_merge_subtitlesr'   extend
setdefaultr   )r(   
identifier
display_idstream_responseavailable_formatshardsub_langstreamvalrequested_hardsubsr{   hardsub_langsfull_format_langsaudio_localehardsub_preferenceformatsr   	format_id
stream_urladaptive_formats	dash_subsfrv   subtitles                          r)   _extract_streamz!CrunchyrollBaseIE._extract_stream   s   #J--@L`a6@Q@_@_ . a  "b/%*@!AB$0:PTPZPZ|]uBv$w 	g L&19,/H,X^_dXe.fl+	g JNI`I`ajIkIwpvowySF]r;yy*;D$tDDU*<< #$6 7NN:499];S:TUVNNa 	    !$C		3D$E F#OmcU5KL&'9$B$'?@3D3K3K3M 	-/I|Z!!#'88.2.U.U
9FWFeFe	{!_Z\4]]i&j /V /l+ ) %%i	%B% H55?f,$0AjM1,2D2D2FG)H NN+,	- !-_?X[_[e[eZfhk>l m 	mFH  ,33LSXaiKj4kl	m 	!!C zDs   I)I$1I$)N)__name__
__module____qualname__r&   rA   _NETRC_MACHINErU   r   rW   rc   rX   rp   propertyr*   rE   ri   rs   r|   r   r   r   r   r+   r)   r   r      s    -I-I"NMMKK3JN E ER:O>X @D2 B 7<2  &."r+   r   c                       e Zd ZdZdZddZy)CrunchyrollCmsBaseIEcmsNc                    t         j                  rt         j                  t               k  rW| j                  dd |d      d   }|d   |d   |d   dt         _        |d   t         _        t        |d	         d
z
  t         _        |j                  d      sdt         j
                   d| }| j                  |||d| dt         j                        S )Nzindex/v2zRetrieving signed policycms_webpolicy	signaturekey_pair_id)Policy	SignaturezKey-Pair-IdbucketexpiresrS   z/cms/v2ru   r   z JSON (signed cms)r4   )r   _CMS_EXPIRYr   r|   
_CMS_QUERY_CMS_BUCKETr   rw   )r(   r   rz   r{   rK   responses         r)   _call_cms_api_signedz)CrunchyrollCmsBaseIE._call_cms_api_signed   s    #//3G3S3SWcWe3e**:tTC]^_hiH"8,%k2'6/ +
 08/A ,/<Xi=P/QTV/V ,y)1==>avFD""+t|D69K%LThTsTs # u 	ur+   )r}   )r   r   r   r   r   r   r   r+   r)   r   r      s    MKur+   r   c                      e Zd ZdZdZdi 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$eed%d&d'd(d)giid*d+d,d-i dd.dddd/d
d0dd1dd2dd3dd4dd5dd4dd6dddd7dd8dd d#d$d9ed:eid;d<id,d=i dd>dddd?dd@ddAddBddCddBddDddddEddd!d"dd d
dFddGd#d$eed%d;d&id,dHdIddJdKdLdMd dNd;d&idOdPdQdRdKdMdSdJdTdUdVdWd<dXdYd<dXgZdZZd[ Ze	d\        Z
e	d]        Zy^)_ro   r   z(?x)
        https?://(?:beta\.|www\.)?crunchyroll\.com/
        (?:(?P<lang>\w{2}(?:-\w{2})?)/)?
        watch/(?!concert|musicvideo)(?P<id>\w+)z9https://www.crunchyroll.com/watch/GY2P1Q98Y/to-the-futureid	GY2P1Q98Yr   mp4durationgX9@	timestampi9 Wdescriptionz$md5:a022fbec4fbb023d43631032c91ed64br   u*   World Trigger Episode 73 – To the Futureupload_date20160402serieszWorld Trigger	series_id	GR757DMKYseason	season_id	GR9P39NJ6season_numberr   episodezTo the Futureepisode_numberI   	thumbnailz1re:^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$r   zcount:2	age_limit   
like_countdislike_countm3u8crunchyrollbetar   r   zbv[format_id~=hardsub])skip_downloadextractor_argsr   r   	info_dictparamsz+https://www.crunchyroll.com/watch/GYE5WKQGR	GYE5WKQGRgMbXv@i Xz$md5:74b67283ffddd75f6e224ca7dc031e76u:   SHELTER – Porter Robinson presents Shelter the Animation20161018SHELTER	GYGG09WWY	GR09MGK4Rz.Porter Robinson presents Shelter the Animationr   r   r   r   TzXhttps://www.crunchyroll.com/watch/GJWU2VKK3/cherry-blossom-meeting-and-a-coming-blizzard	GJWU2VKK3gK70@z$md5:2d1c67c0ec6ae514d9c30b0b99a625cdud   The Ice Guy and His Cool Female Colleague Episode 1 – Cherry Blossom Meeting and a Coming Blizzardz)The Ice Guy and His Cool Female Colleague	GW4HM75NP	GY9PC21VEz,Cherry Blossom Meeting and a Coming BlizzardiXc20230104z+https://www.crunchyroll.com/watch/GM8F313NQ	GM8F313NQzGarakowa -Restore the World-z$md5:8d2f8b6b9dd77d87810882e7d2ee5608g|?58@   )r   r   r   r   r   r   r   no longer existsr   r  r  skipz+https://www.crunchyroll.com/watch/G62PEZ2E6	G62PEZ2E6gFHP@)r   r   r   r   r      r   r  playlist_mincountz.https://www.crunchyroll.com/de/watch/GY2P1Q98Yr   only_matchingzJhttps://beta.crunchyroll.com/pt-br/watch/G8WUN8VKP/the-ruler-of-conspiracyvideoc           
         	
  j                  |      j                  dd      \  
	t         j                  d	 	
dddi      ddt        hf      }|st        d		 d
d      |j                  d      }|dk(  r j                  |      }n|dk(  r j                  |      }n|dk(  rut        |d      } j                  	|      s) j                   j                   d
 d| t        |      S 	
 fd}  j                   |       fi  j                  |      S t        d|        j                  sAt        || ddf      r0d| d} j                  rt        |d       j!                  |        j#                  	      \  |d<   |d<    j%                  	      |d<   d }|j'                  t        |dd|hfd |hfd!f             |S )"Nr{   r   zobjects/zobject inforatingstruer8   r   No video with id ) could be found (possibly region locked?)Tr>   typer   moviemovie_listing)movie_listing_metadatafirst_movie_idru   watch/c            	   3      K   j                  d dd      } t        | d      D ]@  } j                  j                   d d|d    t        fi j                  |       B y w)Nzmovie_listings/z/moviesz
movie list)r8   .ru   r#  r   )r   r   
url_resultr&   ro   _transform_movie_response)moviesmovie_responserz   r{   r(   s     r)   entriesz0CrunchyrollBetaIE._real_extract.<locals>.entriest  s     /+g(NP[]acop&26=&I ]N)$//>>*!D6t8L7MN)]-1-K-KN-[] ]]s   A)A,zUnknown object type 	_metadatais_premium_onlyThis  is for premium members onlyr   r   r   c                 f    t        dj                  | d   | j                  d      xs df            S )Nr   	displayedunit)r   r   r'   )items    r)   calculate_countz8CrunchyrollBetaIE._real_extract.<locals>.calculate_count  s.    rww[(9488F;K;Qr'RSTTr+   ratingupdownr   )_match_valid_urlgroupr   r   r   r   r'   _transform_episode_responser&  _yes_playlistr%  r&   ro   playlist_resultrc   r*   raise_login_requiredr   r   update)r(   r   r   object_typer   r"  r)  r=   r2  rz   r{   s   `        @@r)   _real_extractzCrunchyrollBetaIE._real_extract_  s    11#6<<VTJk  {m$k4TZH[!]_eghkojp^qs #4[MAj!kvz{{ll6*)#55h?FG#33H=FO+)(4`aN%%k>B$..)94&~FV'WYjlz{{] (4''	^T5S5ST\5]^^ !#7}!EFFL{m9<UWh;i$jk]*FGG  $Wt<<%%g.151E1Ek1R.y6+.!33K@z	U 	l8h/!23$&789
 .  	
 r+   c                     t        | dt        hfd      xs i }| d   dj                  t        |d      t        |dd      t        | d	      f      d
t        | d	t        hfdt        hd hfdddddt
        hfdt        hfdt        hfdfd      t        |dd hfdt        hfdt        hfdt        hfdt        hfdt        hfdt        ht        hffdt        ht        hffddt        hfdt        hfd 
d      S )!N)episode_metadataNFget_allr   u    – season_titler   z Episode %sr   )r   r   r   c                 &    | j                  dd      S Nz\r\n
replacexs    r)   r   z?CrunchyrollBetaIE._transform_episode_response.<locals>.<lambda>      7TXAY r+   imagesr   .sourcewidthheightr   rN  rO  )r   r   
thumbnailsduration_msc                     t        | d      S Ni  r   rI  s    r)   r   z?CrunchyrollBetaIE._transform_episode_response.<locals>.<lambda>      }Q7M r+   r   series_titler   r   r   sequence_numbermaturity_ratingsr   r   )
r   r   r   r   r   r   r   r   r   rq   )r   r   r   r	   r   r   r
   r   intr   r   r8   rk   s     r)   r8  z-CrunchyrollBetaIE._transform_episode_response  s]   'AD6&JTYZ`^`t*__ >: 9mDF T7+	&- .
 4#cU+ -u7Y6Z['c3${m4%}5'+7A " 
  8*-M,NO+m_=)C51)C51)C51)C51"1SEM?3K!L#4u}o6N"O0"6GH+cU3& !
 	
r+   c                     t        | dt        hfd      xs i }d| d   it        | dt        hfdt        hd hfdd	d
d
dt        hfdt        hfdt        hfdfd      t        |dd hfddt
        hfd      S )N)movie_metadatar!  NFrA  r   r   r   c                 &    | j                  dd      S rE  rG  rI  s    r)   r   z=CrunchyrollBetaIE._transform_movie_response.<locals>.<lambda>  rK  r+   rL  r   .rM  rN  rO  rP  )r   r   rQ  rR  c                     t        | d      S rT  rU  rI  s    r)   r   z=CrunchyrollBetaIE._transform_movie_response.<locals>.<lambda>  rV  r+   rY  r   )r   r   )r   r   r   r   r
   r   r[  s     r)   r&  z+CrunchyrollBetaIE._transform_movie_response  s    'Y\`[a&blqrxvx$t*
4!C5) -u7Y6Z['c3${m4%}5'+7A " 
 8*-M,NO0"6GH& 
 	
r+   N)r   r   r   IE_NAME
_VALID_URLrZ  _TESTS_RETURN_TYPEr>  staticmethodr8  r&  r   r+   r)   ro   ro      s   G3J K
+
5
 
 	

 A
 A
 :
 o
 
 o
 
 Q
 
 b
 M
  	!
" #
$  '
, $09wi2HI.
1> =
+
5
 
 	

 A
 Q
 :
 i
 
 i
 
 Q
 G
 a
 M
  !
" ##
$ S%
( #D)/2 j
+
5
 
 A	

 {
 A
 
 A
 
 Q
 E
 a
 	
 M
 
  :!
" #
$  '
* #F+/2 =3A M
 #F+" =A3
 
 @ \OjFX L3j 
 
@ 
 
r+   ro   c                   :    e Zd ZdZdZddddddd	d
dddgZd Zy)CrunchyrollBetaShowIEzcrunchyroll:playlistz|(?x)
        https?://(?:beta\.|www\.)?crunchyroll\.com/
        (?P<lang>(?:\w{2}(?:-\w{2})?/)?)
        series/(?P<id>\w+)z=https://www.crunchyroll.com/series/GY19NQ2QR/Girl-Friend-BETA	GY19NQ2QRzGirl Friend BETAz$md5:99c1b22ee30a74b536a8277ced8eb750r   )r   r   r   r   rS   r  z0https://beta.crunchyroll.com/it/series/GY19NQ2QRTr  c                 @     j                  |      j                  dd      \   fd}  j                   |       fi t         j	                  d d      dddt
        hfd	d
 hfddt        hfdddddt        hfdt        hfdt        hfdfdf      S )Nr{   r   c            
   3   ^  K   j                  d d      } t        | ddt        hf      D ]z  }j                  d|d    |d   d      }t        |ddt        hf      D ]D  } j                  j                   d d	|d    t
        fi t
        j                  |       F | y w)
Nzseasons?series_id=seasonsr   .zepisodes?season_id=r   zepisode listru   r#  )r   r   r   r%  r&   ro   r8  )seasons_responser   episodes_responseepisode_responserz   r{   r(   s       r)   r)  z4CrunchyrollBetaShowIE._real_extract.<locals>.entries  s     #88;Mk]9[]hjnpyz&'7'39OP n$($=$=)&,8&,n%^!(45FRUX\W]H^(_ n$)$//>>*!D68H8N7OP)n->-Z-Z[k-ln nnns   B*B-zseries/r   r8   r   r   r   c                 &    | j                  dd      S rE  rG  rI  s    r)   r   z5CrunchyrollBetaShowIE._real_extract.<locals>.<lambda>  s    !))GT:R r+   rY  r   rL  .rM  rN  rO  rP  )r   r   r   rQ  )	r6  r7  r:  r   r   r   r   r   r
   )r(   r   r)  rz   r{   s   `  @@r)   r>  z#CrunchyrollBetaShowIE._real_extract  s     11#6<<VTJk	n $t##I{4>>GK=*A;PTV^_bhjk!C5) -0R/ST0"6GH'c3${m4%}5'+79 		n 	b 	 	r+   N)r   r   r   r`  ra  rb  r>  r   r+   r)   rf  rf    sK    $GJ
 O'A 
   BF r+   rf  c                       e Zd ZdZdZdddddddgd	d
gdddiddddddddgd	dgdddidddddddddgd	dd
gd	ddiddddd ddd!ddgZd"Zd# Zed$        Z	y%)&CrunchyrollMusicIEzcrunchyroll:musicz(?x)
        https?://(?:www\.)?crunchyroll\.com/
        (?P<lang>(?:\w{2}(?:-\w{2})?/)?)
        watch/(?P<type>concert|musicvideo)/(?P<id>\w+)z9https://www.crunchyroll.com/de/watch/musicvideo/MV5B02C79r   	MV5B02C79zegaono-hanazEgaono HanazGoose housez5re:(?i)^https://www.crunchyroll.com/imgsrv/.*\.jpeg?$J-Pop)r   r   r   r   trackartistsr   genresr   r   r  z7https://www.crunchyroll.com/watch/musicvideo/MV88BB7F2C
MV88BB7F2Czcrossing-fieldzCrossing FieldLiSAAnimer  r  z4https://www.crunchyroll.com/watch/concert/MC2E2AC135
MC2E2AC135z/live-is-smile-always-364joker-at-yokohama-arenaz1LiVE is Smile Always-364+JOKER- at YOKOHAMA ARENAz$md5:747444e7e6300907b7a43f0a0503072e)	r   r   r   r   rs  rt  r   r   ru  zEhttps://www.crunchyroll.com/de/watch/musicvideo/MV5B02C79/egaono-hanaTr  zdhttps://www.crunchyroll.com/watch/concert/MC2E2AC135/live-is-smile-always-364joker-at-yokohama-arenazFhttps://www.crunchyroll.com/watch/musicvideo/MV88BB7F2C/crossing-fieldmusicc                    | j                  |      j                  ddd      \  }}}ddd|   \  }}t        | j                  | d| |||      dd	t        hf      }|st        d
| dd      | j                  sT|j                  d      rCd|j                  d      xs d d}| j                  rt        |d      | j                  |       | j                  |      }	| j                  d| |      \  |	d<   }
|	S )Nr{   r   r  )concertszconcert info)music_videoszmusic video info)concert
musicvideoru   r8   r   r  r  Tr>   isPremiumOnlyr,  mediar-  zmusic/r   )r6  r7  r   r   r   r   rc   r'   r*   r;  _transform_music_responser   )r(   r   r{   rz   r=  r   namer   r=   r   r   s              r)   r>  z CrunchyrollMusicIE._real_extract6  s&   )-)>)>s)C)I)I&RVX^)_&k;3>
 
d  $q/FUY[_ `ciklosntbuv #4[MAj!kvz{{HLL$Ahll62=g>>Z[G  $Wt<<%%g.//9#33f[M4JKXy1r+   c                     d| d   it        | dddddt        fdt        hd hfdd	d	d
t        hfdt        hfdt        hfdfdddt
        hfd      S )Nr   slugr   artistr  r   c                 .    | j                  dd      xs d S rE  rG  rI  s    r)   r   z>CrunchyrollMusicIE._transform_music_response.<locals>.<lambda>T  s    7TXAYAa]a r+   rL  .rM  rN  rO  rP  ru  .displayValuerY  r   )r   r   rs  rt  r   rQ  ru  r   )r   r   r   r   r
   r   r<   s    r)   r  z,CrunchyrollMusicIE._transform_music_responseK  s     $t*
4$  $fc2 -u7a6bc'c${m4%}5'+74 
 :0"6GH" 
 	
r+   N)
r   r   r   r`  ra  rb  r   r>  rd  r  r   r+   r)   rp  rp    s	   !G:J
 K'""%Qi	
 #F+ I*%%xQi	
 #F+" FKHHxQAi

 #F+ W v X_2Ff M* 
 
r+   rp  c                   R    e Zd ZdZdZdddg dddd	d
dddgZdZd Zed        Z	y)CrunchyrollArtistIEzcrunchyroll:artistzx(?x)
        https?://(?:www\.)?crunchyroll\.com/
        (?P<lang>(?:\w{2}(?:-\w{2})?/)?)
        artist/(?P<id>\w{10})z-https://www.crunchyroll.com/artist/MA179CB50D
MA179CB50Drw  )rx  rr  Rockz$md5:16d87de61a55c3f7d6c454b73285938e)r   r   ru  r   S   r  z2https://www.crunchyroll.com/artist/MA179CB50D/lisaTr  rz  c                       j                  |      j                  dd      \  }}t         j                  d| ||d      d       fd}  j                   |       fi  j                        S )Nr{   r   zartists/zartist info)r8   r   c            	   3      K   dD ]C  \  } }t        | df      D ]-  }j                  j                   d| d| t        |       / E y w)N))r|  r~  )videosr  .z/watch/ru   )r   r%  r&   rp  )	attributer   rz   r   r(   s      r)   r)  z2CrunchyrollArtistIE._real_extract.<locals>.entriesz  sd     #V {	4#/9c:J#K {K//T^^,<GD6;-*XZlnyzz{{s   A
A)r6  r7  r   r   r:  _transform_artist_response)r(   r   r{   rz   r)  r   s   `    @r)   r>  z!CrunchyrollArtistIE._real_extractu  s}     11#6<<VTJk{m$k4!HITV	{
 $t##GI[1P1PQY1Z[[r+   c                     d| d   it        | ddt        hd hfddddt        hfdt        hfd	t        hfd
fdd      S )Nr   r  r   c                 &    | j                  dd      S rE  rG  rI  s    r)   r   z@CrunchyrollArtistIE._transform_artist_response.<locals>.<lambda>  rK  r+   rL  .rM  rN  rO  rP  r  )r   r   rQ  ru  )r   r   r   r
   r<   s    r)   r  z.CrunchyrollArtistIE._transform_artist_response  sr     $t*
4 -u7Y6Z['c${m4%}5'+74 
 :	" 	
 	
r+   N)
r   r   r   r`  ra  rb  r   r>  rd  r  r   r+   r)   r  r  `  sd    "G!J
 ?0A	
  	 DF M
\ 
 
r+   r  )rZ   r^   commonr   networking.exceptionsr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   ro   rf  rp  r  r   r+   r)   <module>r     s~      ! -   "{" {"|u, u,\
, \
~.0 .bb
* b
J/
+ /
r+   