o
    iK                     @   s   d dl Z d dlZddlm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 G dd	 d	eZG d
d deZdS )    N   )InfoExtractor   )Request)	HTTPError)ExtractorErrordetermine_extextract_attributesfloat_or_noneint_or_none
js_to_jsonsmuggle_urltry_getunescapeHTMLunsmuggle_urlurl_or_noneurlencode_postdatac                       s   e 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ddddddddddgZdd Z	dd Z
dd Zdd Z fddZ fdd Zd!d" Zd#d$ Z  ZS )%UdemyIEudemya]  (?x)
                    https?://
                        (?:[^/]+\.)?udemy\.com/
                        (?:
                            [^#]+\#/lecture/|
                            lecture/view/?\?lectureId=|
                            [^/]+/learn/v4/t/lecture/
                        )
                        (?P<id>\d+)
                    zIhttps://www.udemy.com/join/login-popup/?displayType=ajax&showSkipButton=1zhttps://www.udemy.comz4https://www.udemy.com/java-tutorial/#/lecture/172757 98eda5b657e752cf945d8445e261b5c5160614mp4zIntroduction and Installationz$md5:c0d51f6f21ef4ec65f091055a5eef876gQ@)idexttitledescriptiondurationz"Requires udemy account credentials)urlmd5	info_dictskipzShttps://www.udemy.com/electric-bass-right-from-the-start/learn/v4/t/lecture/4580906Tr   only_matchingzmhttps://www.udemy.com/learn-web-development-complete-step-by-step-guide-to-success/learn/v4/t/lecture/4125812zqhttps://www.udemy.com/how-you-can-help-your-local-community-5-amazing-examples/learn/v4/t/lecture/3225750?start=0z6https://wipro.udemy.com/java-tutorial/#/lecture/172757c                 C   sP   | j t| jd|ddd|ddpi }|dp | dd	g|d
}||dfS )Nz%ng-init=["\'].*\bcourse=({.+?})[;"\']course{}defaultF)fatalr   zdata-course-id=["\'](\d+)z &quot;courseId&quot;\s*:\s*(\d+)z	course idr   )_parse_jsonr   _search_regexget)selfwebpagevideo_idr#   	course_id r/   J/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/udemy.py_extract_course_infoC   s    zUdemyIE._extract_course_infoc                 C   s   dd }t | jd|ddd d}|r!td| d||| d	d
t | jd|ddd d}|rK| j||||dd|id}d|v rM| | d d S d S d S )Nc                 S   s   | dstj| |S |S )Nhttp)
startswithurllibparseurljoin)base_urlr   r/   r/   r0   combine_urlQ   s   z+UdemyIE._enroll_course.<locals>.combine_urlzWhref=(["\'])(?P<url>(?:https?://(?:www\.)?udemy\.com)?/(?:payment|cart)/checkout/.+?)\1zcheckout urlr   )groupr&   zCourse z` is not free. You have to pay for it before you can download. Use this URL to confirm purchase: TexpectedzNhref=(["\'])(?P<url>(?:https?://(?:www\.)?udemy\.com)?/course/subscribe/.+?)\1z
enroll urlzEnrolling in the courseRefererheadersz>You have enrolled inz%: Successfully enrolled in the course)r   r)   r   _download_webpage	to_screen)r+   r7   r,   r.   r8   checkout_url
enroll_urlr/   r/   r0   _enroll_courseP   s4   zUdemyIE._enroll_coursec                 C   s&   | j d| d| d|dddddS )	Nz:https://www.udemy.com/api-2.0/users/me/subscribed-courses/z
/lectures/?zDownloading lecture JSONz!title,description,view_html,assetz[asset_type,stream_url,thumbnail_url,download_urls,stream_urls,captions,data,course_is_drmed)fields[lecture]zfields[asset]query)_download_json)r+   r.   
lecture_idr/   r/   r0   _download_lectureh   s   zUdemyIE._download_lecturec                 C   sf   t |tsd S |d}|r1d|d|d}|d}|r+|d|d7 }t|dd	d S )
NerrorzUdemy returned error #{}: {}codemessagedataz - {}
formErrorsTr:   )
isinstancedictr*   formatr   )r+   responserK   	error_str
error_datar/   r/   r0   _handle_errorp   s   


zUdemyIE._handle_errorc                    sh   | di  }d|d< ||d< t j|i |}|s|S |\ }t fdddD r2tddd	|S )
Nr>   zsMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36z
User-Agentc                 3   s    | ]}| v V  qd S Nr/   .0pr,   r/   r0   	<genexpr>   s    z3UdemyIE._download_webpage_handle.<locals>.<genexpr>)z>Please verify you are a humanzkAccess to this page has been denied because we believe you are using automation tools to browse the websitez"_pxCaptcha"zUdemy asks you to solve a CAPTCHA. Login with browser, solve CAPTCHA, then export cookies and pass cookie file to yt-dlp with --cookies.Tr:   )r*   copysuper_download_webpage_handleanyr   )r+   argskwargsr>   ret_	__class__r[   r0   r_   {   s"   z UdemyIE._download_webpage_handlec                    s   ddd}| j D ]}|jdkr|j|d< q|jdkr'|j|d< d|j |d	< qt|tr4|j| nt||d
}t j|g|R i |}| 	| |S )NtrueXMLHttpRequest)zX-Udemy-Snail-CasezX-Requested-With	client_idzX-Udemy-Client-Idaccess_tokenzX-Udemy-Bearer-TokenzBearer zX-Udemy-Authorizationr=   )
	cookiejarnamevaluerP   r   r>   updater^   rH   rV   )r+   url_or_requestra   rb   r>   cookierS   re   r/   r0   rH      s    





zUdemyIE._download_jsonc                 C   s   |  | jd d}dd }||rd S | d|}|||d | j | jd dt|| j| jdd}||sN| jd	|d
d d}|rJtd| ddtdd S )NzDownloading login popupc                    s   t  fdddD S )Nc                 3   s    | ]	}t | V  qd S rW   )researchrX   r[   r/   r0   r\      s    z<UdemyIE._perform_login.<locals>.is_logged.<locals>.<genexpr>)z3href=["\'](?:https://www\.udemy\.com)?/user/logout/z>Logout<)r`   r[   r/   r[   r0   	is_logged   s   z)UdemyIE._perform_login.<locals>.is_loggedz
login-form)emailpasswordz
Logging in)r<   Origin)rN   r>   z1(?s)<div[^>]+class="form-errors[^"]*">(.+?)</div>zerror messager%   zUnable to login: Tr:   zUnable to log in)r?   
_LOGIN_URL_form_hidden_inputsrn   r   _ORIGIN_URL_html_search_regexr   )r+   usernameru   login_popuprs   
login_formrS   rK   r/   r/   r0   _perform_login   s6   zUdemyIE._perform_loginc           '   
      s   |}t|i d d}d }|s!||}||\}}z||}W n5 ty^ } z)t|jt	rS|jj
dkrS|pD||}||| ||}n W Y d }~nd }~ww |d }|d}	|d }
|
dpu|
d}|d	krtd
| ddd|
dp|
d}|rjd|dd d}|r|dS t|
d |
dp|
d}t|
di d}i i g dd |
di dttsi fdd  fdd}fd d!}d"D ]}|
| d#}t|tr||d	 q|
d$}t|trN|D ]9}t|tsqt|d%}|s*qt|d&d' t}|d(d)kr<n}||pDd*g d%|i q|d+}|r9t }td,|D ]}t|}|d-}|soq_|d.}t|}||v rq_|| |d/d0kst|d1krԈj|d2d3d4d5d6} | D ],}!td7|!d% }"|"r|!d8st|" d8|!d8< |!d9st|" d9|!d9< q!|  q_ ||r| d:nd |d;| q_j"jd<|d=d>dd?t#d5d@}#|#rt|#tr||#dA |st|#d}||#dB s9s9j"jdC|dDd>dd?dEd' d5d@}$||$ sYrY$ D ]\}%}&|&|%}!|!d%rW|! qCsg|
dFrg% ||	||dGS )HNr   r.   i  r   r   asset
asset_type	assetTypeVideozLecture z is not a videoTr:   
stream_url	streamUrlz((https?://www\.youtube\.com/watch\?v=.*)zyoutube URLr%   Youtuber   thumbnail_urlthumbnailUrlrN   r   c                 S   s   |  dd|  dp| t|  dt|  dt|  d|  dt|  dt|  d|  d	t|  d
t|  dt|  ddS )Nr   z%spheightwidthvideo_bitrate_in_kbpsvideo_codec
frame_rateaudio_bitrate_in_kbpsaudio_codecaudio_sample_ratetotal_bitrate_in_kbpsfile_size_in_bytes)r   	format_idr   r   vbrvcodecfpsabracodecasrtbrfilesize)r*   r   )srcf_idr/   r/   r0   extract_output_format   s   z4UdemyIE._real_extract.<locals>.extract_output_formatoutputsc                    s0    |}t|tr ||}||  |S | S rW   )r*   rP   rQ   rn   )fkeyoutputoutput_format)r   r   r/   r0   add_output_format_meta	  s   



z5UdemyIE._real_extract.<locals>.add_output_format_metac                    s   t | tsd S | D ]I}t|dp|d}|sq	|ddks't|dkr6j|dddd	d
 q	|d}|| dt|d}|rM ||}| q	d S )Nfiler   typeapplication/x-mpegURLm3u8r   m3u8_nativehlsFentry_protocolm3u8_idr'   labelrZ   r   r   r   )	rP   listr   r*   r   extend_extract_m3u8_formatsr   append)source_listsource	video_urlr   r   )r   formatsr+   r-   r/   r0   extract_formats  s*   


z.UdemyIE._real_extract.<locals>.extract_formatsc                    s   t | tsd S | D ]?}t |tsq	|ddkrq	t|d}|s#q	|dp1|dp1|d}|ddu r; n}||g d	|i q	d S )
Nkindcaptionsr   languagesrclangr   autogeneratedTr   )rP   r   rQ   r*   r   
setdefaultr   )
track_listtrackr   langsub_dict)automatic_captions	subtitlesr/   r0   extract_subtitles)  s4   

z0UdemyIE._real_extract.<locals>.extract_subtitles)downloadstream_urlsr   r   c                 S   s   | d d S )Nlocaler/   )xr/   r/   r0   <lambda>I      z'UdemyIE._real_extract.<locals>.<lambda>r   autoen	view_htmlz<source[^>]+>r   zdata-resr   r   r   r   r   r   Fr   z)/hls_(?P<height>\d{3,4})_(?P<tbr>\d{2,})/r   r   rZ   r   z+videojs-setup-data=(["\'])(?P<data>{.+?})\1z
setup datar$   )r&   r9   )transform_sourcer'   sourcestracksz&text-tracks=(["\'])(?P<data>\[.+?\])\1ztext tracksc                 S   s   t t| S rW   )r   r   )sr/   r/   r0   r     r   course_is_drmed)r   r   r   	thumbnailr   r   r   r   )&	_match_idr   r*   r?   r1   rJ   r   rP   causer   statusrC   r)   
url_resultstrr
   rQ   r   r   r   r   r   setrq   findallr	   r   addr   r   rr   intr9   r   r(   r   items
report_drm)'r+   r   rI   r.   r,   rd   lectureer   r   r   r   r   youtube_urlr   r   r   r   url_kindurlsr   cccc_urlr   r   r   view_html_urlsr   
attributesr   resr   m3u8_formatsr   mrN   text_tracksr   r   r/   )r   r   r   r   r   r+   r   r-   r0   _real_extract   s  
	












zUdemyIE._real_extract)__name__
__module____qualname__IE_NAME
_VALID_URLrw   ry   _NETRC_MACHINE_TESTSr1   rC   rJ   rV   r_   rH   r~   r   __classcell__r/   r/   re   r0   r      sJ    
$r   c                       sD   e Zd ZdZdZddddddgZe fddZd	d
 Z  Z	S )UdemyCourseIEzudemy:coursez0https?://(?:[^/]+\.)?udemy\.com/(?P<id>[^/?#&]+)z$https://www.udemy.com/java-tutorial/Tr!   z&https://wipro.udemy.com/java-tutorial/c                    s   t |rdS t |S )NF)r   suitabler^   )clsr   re   r/   r0   r     s   zUdemyCourseIE.suitablec                 C   sH  |  |}| ||}| ||\}}| ||| | jd| d|dddddd}g }d gd	 \}}	|d
 D ]d}
|
d}|dkr|
d}t|tr\|dpV|d}|dkr\q8|
d}|rdtd| d|
d  d|i|
dt	
 d}
|	r|	|
d< |r||
d< ||
 q8|dkr|
d}	|
d}q8| |||S )Nz&https://www.udemy.com/api-2.0/courses/z#/cached-subscriber-curriculum-itemszDownloading course curriculumztitle,object_indexztitle,asset1000)zfields[chapter]rE   	page_sizerF   r   results_classr   r   r   r   r   r   url_transparentzhttps://www.udemy.com/z/learn/v4/t/lecture/r.   r   )_typer   r   ie_keychapter_numberchapterobject_index)r   r?   r1   rC   rH   r*   rP   rQ   r   r   r   r   playlist_result)r+   r   course_pathr,   r.   r   rS   entriesr  r   entryclazzr   r   rI   r/   r/   r0   r     sV   








zUdemyCourseIE._real_extract)
r   r   r   r   r   r   classmethodr   r   r   r/   r/   re   r0   r     s    r   )rq   urllib.parser4   commonr   
networkingr   networking.exceptionsr   utilsr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r/   r/   r/   r0   <module>   s    8   