o
    iF                     @   s   d dl Z d dlZd dlZd dlZd dlZd dl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 G dd deZG dd	 d	eZG d
d deZdS )    N   )InfoExtractor   )ExtractorErrordict_getfloat_or_noneint_or_noneparse_durationparse_qs	qualitiessrt_subtitles_timecodetry_getupdate_url_queryurlencode_postdatac                   @   s6   e Zd ZdZe dZddiZdZdd Zdd	 Zd
S )PluralsightBaseIEzhttps://app.pluralsight.comz/player/api/graphqlContent-Typezapplication/json;charset=UTF-8aK  
query BootstrapPlayer {
  rpc {
    bootstrapPlayer {
      profile {
        firstName
        lastName
        email
        username
        userHandle
        authed
        isAuthed
        plan
      }
      course(courseId: "%s") {
        name
        title
        courseHasCaptions
        translationLanguages {
          code
          name
        }
        supportsWideScreenVideoFormats
        timestamp
        modules {
          name
          title
          duration
          formattedDuration
          author
          authorized
          clips {
            authorized
            clipId
            duration
            formattedDuration
            id
            index
            moduleIndex
            moduleTitle
            name
            title
            watched
          }
        }
      }
    }
  }
}c              	   C   sB   z|  |||W S  ty    | jd|td|id|id Y S w )Nz=https://app.pluralsight.com/player/user/api/v1/player/payloadcourseIdRefererdataheaders)_download_course_rpcr   _download_jsonr   )self	course_idurl
display_id r   P/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/pluralsight.py_download_courseQ   s   
z"PluralsightBaseIE._download_coursec                 C   sb   | j | j|t| j| i d | jd}t|dd t}|r"|S t	d
| j|d d dd	)
Nquery	variablesr   c                 S   s   | d d d d S )Nr   rpcbootstrapPlayercourser   )xr   r   r   <lambda>c   s    z8PluralsightBaseIE._download_course_rpc.<locals>.<lambda>z{} said: {}errormessageTexpected)r   _GRAPHQL_EPjsondumps_GRAPHQL_COURSE_TMPLencode_GRAPHQL_HEADERSr   dictr   formatIE_NAME)r   r   r   r   responser%   r   r   r   r   [   s"   
z&PluralsightBaseIE._download_course_rpcN)	__name__
__module____qualname__	_API_BASEr,   r1   r/   r   r   r   r   r   r   r      s    
2
r   c                   @   sv   e 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gZdZdd Z	dd Z
edd Zdd ZdS )PluralsightIEpluralsightzBhttps?://(?:(?:www|app)\.)?pluralsight\.com/(?:training/)?player\?zhttps://app.pluralsight.com/id/zhttp://www.pluralsight.com/training/player?author=mike-mckeown&name=hosting-sql-server-windows-azure-iaas-m7-mgmt&mode=live&clip=3&course=hosting-sql-server-windows-azure-iaas 4d458cf5cf4c593788672419a8dd4cf8z0hosting-sql-server-windows-azure-iaas-m7-mgmt-04mp4zDemo MonitoringiR  )idexttitledurationz(Requires pluralsight account credentials)r   md5	info_dictskipzhttps://app.pluralsight.com/training/player?course=angularjs-get-started&author=scott-allen&name=angularjs-get-started-m1-introduction&clip=0&mode=liveTr   only_matchingzhttp://app.pluralsight.com/training/player?author=scott-allen&name=angularjs-get-started-m1-introduction&mode=live&clip=0&course=angularjs-get-startedzzhttps://app.pluralsight.com/player?course=ccna-intro-networking&author=ross-bagurdes&name=ccna-intro-networking-m06&clip=0av  
query viewClip {
  viewClip(input: {
    author: "%(author)s",
    clipIndex: %(clipIndex)d,
    courseName: "%(courseName)s",
    includeCaptions: %(includeCaptions)s,
    locale: "%(locale)s",
    mediaType: "%(mediaType)s",
    moduleName: "%(moduleName)s",
    quality: "%(quality)s"
  }) {
    urls {
      url
      cdn
      rank
      source
    },
    status
  }
}c           	         s  |  | jd d}| |}|||d | jd|d| jdd}|ds-tj| j|}| j |d dt	|d	d
id | jd dd d}|rOt
d| ddt fdddD rd}| v rit
d| ddd}t fdd|ddfD rt
d| dddt
dd S )NzDownloading login page)UsernamePasswordz&<form[^>]+action=(["\'])(?P<url>.+?)\1zpost urlr   )defaultgrouphttpz
Logging inr   z!application/x-www-form-urlencodedr   z<<span[^>]+class="field-validation-error"[^>]*>([^<]+)</span>zerror message)rI   zUnable to login: Tr*   c                 3   s    | ]
}t |  V  qd S N)research.0pr5   r   r   	<genexpr>   s    z/PluralsightIE._perform_login.<locals>.<genexpr>)__INITIAL_STATE__z["\']currentUser["\']z>\s*Sign out\s*<z8Your account has been blocked due to suspicious activityz0To continue using Pluralsight, you must agree toc                 3   s    | ]}| v V  qd S rL   r   rO   rR   r   r   rS      s    z
>Disagree<z>Agree<zX some documents. Go to pluralsight.com, log in and agree with what Pluralsight requires.zUnable to log in)_download_webpage
_LOGIN_URL_hidden_inputsupdate_search_regex
startswithurllibparseurljoinr   r   allany)	r   usernamepassword
login_page
login_formpost_urlr(   BLOCKED
MUST_AGREEr   rR   r   _perform_login   sN   



zPluralsightIE._perform_loginc           
   	   C   s   d }|r| j | j d| d| |dddd}|s9|t|||d}	| j | j d|dddt|	 d	d
id}|rN|dt|dd| ||dgiS d S )Nz /transcript/api/v1/caption/json//zDownloading captions JSONz Unable to download captions JSONF)fatal)acnlcmz/player/retrieve-captionsr   application/json;charset=utf-8ri   r   r   r-   )r?   r   srt)r   r9   intr-   r.   r0   _convert_subtitles)
r   authorclip_idxclip_idlangnamerA   video_idcaptionscaptions_postr   r   r   _get_subtitles   s<   
zPluralsightIE._get_subtitlesc           
   	   C   s   d}d}d}t |D ]S\}}|| }tt||ddt||}}|d u s)|d u r*q
|t|d kr4| ntt||d  |dd}	|	d u rFq
|tj| t| dt|	 |tjf7 }q
|S )N )displayTimeOffsetDisplayTimeOffset)textTextF)skip_false_valuesr   z --> )	enumerater   r   lenoslinesepjoinr   )
rA   subsrp   TIME_OFFSET_KEYS	TEXT_KEYSnumcurrentstartr   endr   r   r   rr      s.   z PluralsightIE._convert_subtitlesc           &         s  t |}|dd gd }|dd gd }|dd gd }|dd gd }tdd ||||fD r;tdd	d
| d| }|||}|d }	d }
|	D ]4}||d|dfv r|dg D ]}|d}|d u ru|d}|d u rzqet||kr|}
 nqeqQ|
std|
d }|
dp|
dp|
d }ddddddddddddd}d}t|}tddd gd!d"gd#g d$f |d%d	u }|rd&nd"|r D ]}|j	 q݈
d'd(r }n fd)d*}| }g }|D ]\}}|D ]}||  }|d+t||d,||d-|d. |d/ f d0}| d| }z!jj|d1| d2tj| i d3 jd4d5 d6 }W n$ tyn   jj d7|d1| d8d(t| d9d:id;}Y nw td<d=|d> |sq|d?}t|tsq|D ]7} | d@}!|!sq| dA}"| }#|#|!||"r| d|" n|||t| dBdC |	|# qqqt|
dDpt|
dE}$|||
dd,||$|}%|||$|||%dFS )GNrs   r   rw   clipr%   c                 s   s    | ]}| V  qd S rL   r   )rP   fr   r   r   rS     s    z.PluralsightIE._real_extract.<locals>.<genexpr>zInvalid URLTr*   -modules
moduleNameclips	clipIndexindexzUnable to resolve clipr@   clipNameclipIdi  i  )widthheightiP  i   i   i   i  )lowmediumhighhigh-widescreenAllowedQualityr?   r   webmr   r=   )r   r   r   supportsWideScreenVideoFormatsr   listformatsFc                     s    dpd} | dd}t|dkr;|\}}d|dd d } D ]}||jkr:||jv r:||ff  S q% drBdnd}|ffS )	Nr3   bestr   r   r   prefer_free_formatsr   r=   )	get_paramsplitr   r   r?   r   )
req_formatreq_format_splitreq_extreq_qualityallowed_qualityALLOWED_QUALITIESr   best_qualityr   r   r   guess_allowed_qualitiesH  s   z<PluralsightIE._real_extract.<locals>.guess_allowed_qualitiesfalseenz%dx%dr   r   )rs   includeCaptionsr   
courseNamelocaler   	mediaTypequalityzDownloading z viewclip graphqlr    r   r   viewClipz/video/clips/viewclipz viewclip JSONr   rn   ro      
   zA%(video_id)s: Waiting for %(timeout)s seconds to avoid throttlingurlsr   cdnrank)r   r?   	format_idr   source_preferencerA   formattedDuration)r>   r@   rA   creatorformats	subtitles)r
   getr_   r   r   strr   collections
namedtupleappendr   copyrq   r   r,   r-   r.   GRAPHQL_VIEWCLIP_TMPLr0   r1   r9   _sleeprandomrandint
isinstancelistrX   r   r	   extract_subtitles)&r   r   qsrs   rw   rt   course_namer   r%   
collectionr   module_clip_
clip_indexr@   ru   	QUALITIESQUALITIES_PREFERENCEquality_key
widescreenr   allowed_qualitiesr   r   r?   
qualities_r   r   	clip_postr   viewclip	clip_urlsclip_url_dataclip_urlr   clip_frA   r   r   r   r   _real_extract  s   








?zPluralsightIE._real_extractN)r6   r7   r8   r4   
_VALID_URLrV   _NETRC_MACHINE_TESTSr   rg   r{   staticmethodrr   r   r   r   r   r   r:   m   s<    -
r:   c                   @   sB   e Zd ZdZdZddddddd	d
dddddgZdd ZdS )PluralsightCourseIEzpluralsight:coursezNhttps?://(?:(?:www|app)\.)?pluralsight\.com/(?:library/)?courses/(?P<id>[^/]+)zHhttp://www.pluralsight.com/courses/hosting-sql-server-windows-azure-iaasz%hosting-sql-server-windows-azure-iaasz7Hosting SQL Server in Microsoft Azure IaaS Fundamentalsz$md5:61b37e60f21c4b2f91dc621a977d0986)r>   r@   description   )r   rC   playlist_countz9https://www.pluralsight.com/courses/angularjs-get-startedTrE   zfhttps://app.pluralsight.com/library/courses/understanding-microsoft-azure-amazon-aws/table-of-contentsc                 C   s   |  |}| |||}|d }|d }|d }|dp!|d}g }t|dD ]L\}	}
|
d}|
d}|r;|s<q)|
dg D ]2}t|d	}|d u rPqBt| j d
d||||dd}|d|t	 |
d|	|
dd qBq)| 
||||S )Nr@   rw   r   r   shortDescriptionr   rs   r   r   z/playerlive)moder%   rs   rw   r   )r!   url_transparent	moduleRef)_typer   ie_keychapterchapter_number
chapter_id)	_match_idr   r   r   r   r   r9   r   r:   r   playlist_result)r   r   r   r%   r@   r   course_datar   entriesr   modulers   module_namer   r   r   r   r   r   r     sF   




z!PluralsightCourseIE._real_extractN)r6   r7   r8   r4   r   r   r   r   r   r   r   r     s$    r   )r   r-   r   r   rM   urllib.parser[   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   r   r   r:   r   r   r   r   r   <module>   s    4U  <