a
    hz                     @   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dddddddddddgdg dddddd d!d"d#d$d%d&gZi Zd'd( Zd)d* Zd+d, Z	d-d. Z
d/S )0GameDevTVDashboardIEz\https?://(?:www\.)?gamedev\.tv/dashboard/courses/(?P<course_id>\d+)(?:/(?P<lecture_id>\d+))?Z	gamedevtvz+https://www.gamedev.tv/dashboard/courses/25Z25z<Complete Blender Creator 3: Learn 3D Modelling for Beginners)Zblendercourseallzbox modellingZ	sculptingZBlenderz3D Artz8https://gamedev-files.b-cdn.net/courses/qisc9pmu1jdc.jpgZ20220516ibZ20241027izvg)	idtitletags
categories	thumbnailupload_date	timestampmodified_datemodified_timestampd   )url	info_dictZplaylist_countz0https://www.gamedev.tv/dashboard/courses/63/2279z$df04f4d8-68a4-4756-a71b-9ca9446c3a01mp4imeZ20230504z)MagicaVoxel Community Course IntroductionZ63iSdZ20231204MagicaVoxelzMagicaVoxel Community Course)r   r   r   zMagicaVoxel 3D Art Mini Coursei}  r   Z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)r   extr   r   episode	series_idr   r   r   r   seasonr   seriesdurationepisode_numberseason_number	season_iddescription
display_id	alt_titler   )r   r   c                 C   s   z.| j dd dddit||g d d}W nJ tyx } z2t|jtrb|jjdkrbtdd	d
 W Y d }~n
d }~0 0 |d  d|d  | j	d< d S )Nz)https://api.gamedev.tv/api/students/loginz
Logging inzContent-Typezapplication/json)emailpasswordZ
cart_items)headersdatai  zInvalid username/passwordT)expected
token_type Zaccess_tokenAuthorization)
_download_jsonjsondumpsencoder   
isinstancecauser   status_API_HEADERS)selfusernamer,   responsee r?   O/mnt/pikpak/tmp/myenv/lib/python3.9/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 )Nr2   z,This content is only available with purchaser,   )method)r:   getZraise_login_required)r;   r?   r?   r@   _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 ]}|rjt|d|krjqNt||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  qNqd S )Nsections.r   r   order)r'   r"   r&   Zlecturesc                 S   s   t |d d S )NvideoplayListUrl)r   )_vr?   r?   r@   <lambda>[       z/GameDevTVDashboardIE._entries.<locals>.<lambda>r'   rG   rH   r   Zhls)Zm3u8_id)r   r)   formats	subtitlesr#   r!   Zguidr(   Zduration_in_sec
created_at
updated_atZthumbnailUrl)
r   r   r*   r(   r    r%   r$   r   r   r   )r   dictr   strr   rC   r	   Z#_extract_m3u8_formats_and_subtitlesr   r
   r   )r;   r.   	course_idcourse_infoZselected_lecturesectionZsection_infolecturer)   rM   rN   r?   r?   r@   _entriesT   sL    
	





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}| ||||}|rt	|d }|st
d|S | j||fi |S )NrS   
lecture_idz&https://api.gamedev.tv/api/courses/my/)r-   r.   r   r   .namer   rO   rP   image)r   r   r   r   r   r   zLecture not found)Z_match_valid_urlgroupr3   r:   r   rR   r
   r   rW   nextr   Zplaylist_result)r;   r   rS   rX   r.   rT   entriesrV   r?   r?   r@   _real_extractx   s,    
	
z"GameDevTVDashboardIE._real_extractN)__name__
__module____qualname__Z
_VALID_URLZ_NETRC_MACHINEZ_TESTSr:   rA   rD   rW   r^   r?   r?   r?   r@   r      sZ   ($r   )r4   commonr   Znetworking.exceptionsr   utilsr   r   r   r	   r
   r   r   Zutils.traversalr   r   r?   r?   r?   r@   <module>   s
   $	