o
    iz                     @   sd   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 ddlmZ G dd	 d	eZdS )
    N   )InfoExtractor   )	HTTPError)ExtractorError
clean_htmlint_or_nonejoin_nonemptyparse_iso8601str_or_noneurl_or_none)traverse_objc                   @   s   e Zd ZdZdZdddg dddgd	d
dddd	dddi dddddddddddddddd d!d"d#dd$gd%d&d'g d(d)d*d+d,d-d.d/d.d0d1d2d3d4d5d6d7gZi Zd8d9 Zd:d; Zd<d= Z	d>d? Z
d@S )AGameDevTVDashboardIEz\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                 C   s   z| j dd dddit||g d d}W n ty6 } zt|jtr1|jjdkr1tdd	d
 d }~ww |d  d|d  | j	d< d S )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usernamer8   responsee rM   N/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/gamedevtv.py_perform_login>   s$   
 z#GameDevTVDashboardIE._perform_loginc                 C   s"   | j ds| jddd d S d S )Nr@   z,This content is only available with purchaser8   )method)rH   getraise_login_required)rI   rM   rM   rN   _real_initializeO   s
   
z%GameDevTVDashboardIE._real_initializec                 c   s6   t |ddthfD ]}t |dthfdthfdthfd}t |ddd	 fD ]p}|r5t|d|kr5q't||d
|d}| j|d d |ddd\}	}
i |||||	|
|d|dt |ddthfdthfddthfdthfdthfdthfddthfddt	hfddt	hfddt
hfd
V  q'q
d S )Nsections.r   r   order)r2   r-   r1   lecturesc                 S   s   t |d d S )NvideoplayListUrl)r   )_vrM   rM   rN   <lambda>[   s    z/GameDevTVDashboardIE._entries.<locals>.<lambda>r2   rW   rX   r&   hls)m3u8_id)r   r5   formats	subtitlesr.   r)   guidr4   duration_in_sec
created_at
updated_atthumbnailUrl)
r   r   r6   r4   r(   r0   r/   r   r    r   )r   dictr   strr   rQ   r	   #_extract_m3u8_formats_and_subtitlesr   r
   r   )rI   r;   	course_idcourse_infoselected_lecturesectionsection_infolecturer5   r^   r_   rM   rM   rN   _entriesT   sR   
	





zGameDevTVDashboardIE._entriesc              	   C   s   |  |dd\}}| jd| || jdd }t|dthfddd	thfd
ddthfdthfdthfdthfd}| ||||}|rRt	|d }|sPt
d|S | j||fi |S )Nrh   
lecture_idz&https://api.gamedev.tv/api/courses/my/)r:   r;   r   r   .namer   rb   rc   image)r   r   r   r   r    r   zLecture not found)_match_valid_urlgrouprA   rH   r   rf   r
   r   rn   nextr   playlist_result)rI   r"   rh   ro   r;   ri   entriesrm   rM   rM   rN   _real_extractx   s,   
	
z"GameDevTVDashboardIE._real_extractN)__name__
__module____qualname__
_VALID_URL_NETRC_MACHINE_TESTSrH   rO   rS   rn   rw   rM   rM   rM   rN   r      s    	
($r   )rB   commonr   networking.exceptionsr   utilsr   r   r   r	   r
   r   r   utils.traversalr   r   rM   rM   rM   rN   <module>   s    $	