
    V|hz                     j    S SK r SSKJr  SSKJr  SSKJrJrJrJ	r	J
r
JrJr  SSKJr   " S S	\5      rg)
    N   )InfoExtractor   )	HTTPError)ExtractorError
clean_htmlint_or_nonejoin_nonemptyparse_iso8601str_or_noneurl_or_none)traverse_objc                       \ rS rSrSrSrSSS/ SQSS	/S
SSSSS.	SS.S0 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)Q_S*S+_S,S-_S.S/_S0S/_S1S2_S3S4S5S6S7.ES8./r0 rS9 rS: r	S; r
S< rS=rg>)?GameDevTVDashboardIE   z\https?://(?:www\.)?gamedev\.tv/dashboard/courses/(?P<course_id>\d+)(?:/(?P<lecture_id>\d+))?	gamedevtvz+https://www.gamedev.tv/dashboard/courses/2525z<Complete Blender Creator 3: Learn 3D Modelling for Beginners)blendercourseallzbox modelling	sculptingBlenderz3D Artz8https://gamedev-files.b-cdn.net/courses/qisc9pmu1jdc.jpg20220516ib20241027izvg)	idtitletags
categories	thumbnailupload_date	timestampmodified_datemodified_timestampd   )url	info_dictplaylist_countz0https://www.gamedev.tv/dashboard/courses/63/2279r   z$df04f4d8-68a4-4756-a71b-9ca9446c3a01extmp4r#   imer    20230504episodez)MagicaVoxel Community Course Introduction	series_id63r   r!   iSdr"   20231204r   MagicaVoxelseasonzMagicaVoxel Community Courser   )r/   r   r   serieszMagicaVoxel 3D Art Mini Coursedurationi}  episode_numberr   season_number	season_id219z$md5:a378738c5bbec1c785d76c067652d650z63-219-2279z61_CC_MVX MagicaVoxel Community Course Introduction.mp4zThttps://vz-23691c65-6fa.b-cdn.net/df04f4d8-68a4-4756-a71b-9ca9446c3a01/thumbnail.jpg)description
display_id	alt_titler   )r%   r&   c                 \    U R                  SS SSS0[        R                  " UU/ S.5      R                  5       S9nUS    SUS    3U R                  S'   g ! [         aI  n[        UR                  [        5      (       a$  UR                  R                  S:X  a
  [	        SS	S
9ee S nAff = f)Nz)https://api.gamedev.tv/api/students/loginz
Logging inzContent-Typezapplication/json)emailpassword
cart_items)headersdatai  zInvalid username/passwordT)expected
token_type access_tokenAuthorization)
_download_jsonjsondumpsencoder   
isinstancecauser   status_API_HEADERS)selfusernamer<   responsees        T/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/gamedevtv.py_perform_login#GameDevTVDashboardIE._perform_login>   s    	**;T<');<ZZ% ("$!  68 + H 190F/GqR`IaHb-c/*  	!''9--!''..C2G$%@4PP	s   ;A 
B+"AB&&B+c                 f    U R                   R                  S5      (       d  U R                  SSS9  g g )NrD   z,This content is only available with purchaser<   )method)rL   getraise_login_required)rM   s    rQ   _real_initialize%GameDevTVDashboardIE._real_initializeO   s7      $$_55%%>z & S 6    c              #     #    [        USS[        145       GH-  n[        US[        14S[        14S[        14S.5      n[        USS 45       H  nU(       a   [        UR                  S5      5      U:w  a  M*  [        X&R                  S	5      UR                  S5      5      nU R                  US
   S   USSS9u  p0 UEUEUUU	U
UR                  S5      US.E[        US
S[        14S[        14S
S[        14S[        14S[        14S[        14S
S[        14S
S[        14S
S[        14S
S[        14S.
5      Ev   M     GM0     g 7f)Nsections.r   r   order)r5   r0   r4   lecturesc                 $    [        US   S   5      $ )NvideoplayListUrl)r   )_vs     rQ   <lambda>/GameDevTVDashboardIE._entries.<locals>.<lambda>[   s    ;WXY`WaboWpKqrZ   r5   r`   ra   r)   hls)m3u8_id)r   r8   formats	subtitlesr1   r,   guidr7   duration_in_sec
created_at
updated_atthumbnailUrl)
r   r   r9   r7   r+   r3   r2   r!   r#   r   )r   dictr   strr	   rV   r
   #_extract_m3u8_formats_and_subtitlesr   r   r   )rM   r?   	course_idcourse_infoselected_lecturesectionsection_infolecturer8   rh   ri   s              rQ   _entriesGameDevTVDashboardIE._entriesT   s    #D:sTF*CDG'"[M2"SE*")K=!92 L
 (*>q1rs#GKK,=(>BR(R*96F6F{6SU\U`U`aeUfg
%)%M%MG$]3ZPU &N &W"!" %",&!*)oog6!* #7&6")C5!1&-w%>(5
|'D$+cU#3+2[M*B%,.?+$O&-|m_%M/6}o.V&-~}%M-   t Es   EE
c           
         U R                  U5      R                  SS5      u  p#U R                  SU 3UU R                  S9S   n[	        US[
        14SSS	[
        14S
SS[
        14S[        14S[        14S[        14S.5      nU R                  XBXS5      nU(       a   [        US 5      nU(       d  [        S5      eU$ U R                  " Xb40 UD6$ )Nrr   
lecture_idz&https://api.gamedev.tv/api/courses/my/)r>   r?   r   r   .namer   rl   rm   image)r   r   r   r!   r#   r   zLecture not found)_match_valid_urlgrouprE   rL   r   rp   r   r   rx   nextr   playlist_result)rM   r%   rr   r{   r?   rs   entriesrw   s           rQ   _real_extract"GameDevTVDashboardIE._real_extractx   s     $ 5 5c : @ @l [	""4YK@)%% # ''-/ #4u%S&3%0'gu=&8#/-"A!K=1*
  --I7D)G$%899N##GF+FFrZ    N)__name__
__module____qualname____firstlineno__
_VALID_URL_NETRC_MACHINE_TESTSrL   rR   rX   rx   r   __static_attributes__r   rZ   rQ   r   r      s\   pJ N<SN$h/S%#'",

  B
8
5
 !*
 :	

 B
 
 @
 
 Z
 8]3
 4
 4
 6
 
 a
  Q!
" #
$ B'Qo+
'FP Ld"S
"HGrZ   r   )rF   commonr   networking.exceptionsr   utilsr   r   r	   r
   r   r   r   utils.traversalr   r   r   rZ   rQ   <module>r      s2     ! -   +|G= |GrZ   