U
    gd                     @   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 G dd de	ZG dd	 d	eZG d
d deZG dd deZdS )    N   )InfoExtractor   )ExtractorErrorOnDemandPagedListbug_reports_message	get_firstint_or_noneparse_qssrt_subtitles_timecodetraverse_objc                   @   sX   e 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dZdddZedd ZdS ) PanoptoBaseIEz:(?P<base_url>https?://[\w.-]+\.panopto.(?:com|eu)/Panopto)en-USzen-GBzes-MXes-ESzde-DEzfr-FRznl-NLzth-THzzh-CNzzh-TWzko-KRzja-JPzru-RUzpt-PTzpl-PLzen-AUzda-DKzfi-FIzhu-HUznb-NOzsv-SEzit-IT)r   r   r                     	   
                                    NTc           
      K   s   | j || |f|r"t|dnd |dddd|}|sBd S t|d}|dkrb| jdd n:|d k	rd	|d
 }	|rt|	|ddn| j|	|d |S )Nutf8application/json)acceptcontent-type)datafatalheaders	ErrorCoder   cookies)methodzPanopto said: ZErrorMessageT)video_idexpected)r-   )	Z_download_jsonjsondumpsencoder   Zraise_login_requiredgetr   report_warning)
selfbase_urlpathr-   r'   r(   kwargsresponseZ
error_codemsg r:   </tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/panopto.py	_call_api2   s*      
zPanoptoBaseIE._call_apic                 C   s$   dd t jt j| j D S )Nc                 S   s    i | ]\}}|t |d  qS )r   )r/   loads).0kvr:   r:   r;   
<dictcomp>E   s      z1PanoptoBaseIE._parse_fragment.<locals>.<dictcomp>)urllibparser
   urlparsefragmentitems)urlr:   r:   r;   _parse_fragmentC   s    zPanoptoBaseIE._parse_fragment)NT)__name__
__module____qualname__BASE_URL_RE_SUB_LANG_MAPPINGr<   staticmethodrH   r:   r:   r:   r;   r      s6   
r   c                       s  e Zd Zejd Zdej dgZdddddd	d
g g deddddddddddddd
ddgdeddddddddd
d d!gd"d#d$d%gg d&d'd(d)ed!d*d+d,dd-d.d
d/gg d0d1d2ed3d/d4d5d6d7d8d9dd:d;d<d=d>d?ddd@dAdddBdCdgdDddEd<dFdGdHdIdJd
g dKdAdLdMdNgdOdPdQdRdSdRgdTdUdVgdTdWdVgdXdYdFdFdZdHd[d\d
d]d^dgg d_dPd`daddAdbdcdddedFdFdZdHdfdFdgdhdFdgg	Ze	 fdidjZ
dkdl Zedmdn Zedodp Zedqdr Zdsdt Zdudv Zdwdx Z  ZS )y	PanoptoIEz:/Pages/(Viewer|Embed)\.aspx.*(?:\?|&)id=(?P<id>[a-f0-9-]+)z<iframe[^>]+src=["\'](?P<url>z1/Pages/(Viewer|Embed|Sessions/List)\.aspx[^"\']+)zahttps://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=26b3ae9e-4a48-4dcc-96ba-0befba08a0fbz$26b3ae9e-4a48-4dcc-96ba-0befba08a0fbz Panopto for Business - Use CasesiHbVz(re:https://demo\.hosted\.panopto\.com/.+Z20160328Zmp4gl
V@z$2db6b718-47a0-4b0b-9e17-ab0b00f42b1e$e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63aShowcase Videos)idtitle	timestamp	thumbnailupload_dateextcastchaptersdurationaverage_ratinguploader_id
channel_idchannel)rG   	info_dictzahttps://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=ed01b077-c9e5-4c7b-b8ff-15fa306d7a59z$ed01b077-c9e5-4c7b-b8ff-15fa306d7a59z/Overcoming Top 4 Challenges of Enterprise VideozPanopto Supporti:dVZ20151206zcount:12z$a96d1a31-b4de-489b-9eee-b4a5b414372cz$md5:4391837802b3fc856dadf630c4b375d1gMb@z$9f3c1921-43bb-4bda-8b3a-b8d2f05a8546ZWebcasts)rR   rS   uploaderrT   rU   rV   rW   rY   rX   r\   r[   descriptionrZ   r]   r^   zhttps://howtovideos.hosted.panopto.com/Panopto/Pages/Viewer.aspx?randomparam=thisisnotreal&id=5fa74e93-3d87-4694-b60e-aaa4012214ed&advance=truez$5fa74e93-3d87-4694-b60e-aaa4012214edg#~j0`@zKathryn Kellyz$316a0a58-7fa2-4cd9-be1c-64270d284a56i]ZViewerZ
EnterpriseZ20190930z/re:https://howtovideos\.hosted\.panopto\.com/.+z$md5:2d844aaa1b1a14ad0e2601a0993b431fzGetting Started: View a Videoz$fb93bc3c-6750-4b80-a05b-a921013735d3zGetting Started)rR   rW   rZ   rX   r\   rT   tagsrY   rV   rU   ra   rS   r[   r`   r]   r^   z]https://unisa.au.panopto.com/Panopto/Pages/Embed.aspx?id=9d9a0fa3-e99a-4ebd-a281-aac2017f4da4z$9d9a0fa3-e99a-4ebd-a281-aac2017f4da4zLTS CLI Scriptgffff@z$md5:ee5cf653919f55b72bce2dbcf829c9faz$b23e673f-c287-4cb1-8344-aae9005a69f8z$38377323-6a23-41e2-9ff6-a8e8004bf6f7iι]z*WW2 Vets Interview 3 Ronald Stanley Georgez%re:https://unisa\.au\.panopto\.com/.+zWorld War II Veteran InterviewsZ20191030)rR   rW   rX   rY   rZ   ra   r]   r[   r\   r`   rT   rS   rU   r^   rV   zahttps://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=a7f12f1d-3872-4310-84b0-f8d8ab15326bz$a7f12f1d-3872-4310-84b0-f8d8ab15326bmhtmliZVgVh@z)Cache Memory - CompSci 15-213, Lecture 12Z20151129r   z$md5:55e51d54233ddb0e6c2ed388ca73822czISR Videographerzcount:28)rR   rW   rT   rZ   rS   r]   r\   rV   r[   r`   r^   ra   rX   rY   rU   T)formatskip_download)rG   r_   paramszjhttps://na-training-1.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=8285224a-9a2b-4957-84f2-acb0000c4ea9z$8285224a-9a2b-4957-84f2-acb0000c4ea9zCompany PolicyiC`zHuman ResourcesZHumanResourcesg@z1re:https://na-training-1\.hosted\.panopto\.com/.+z$8e8ba0a3-424f-40df-a4f1-ab3a01375103zCait M.Z20210306srtz$md5:a3f4d25963fdeace838f327097c13265rW   r'   z$md5:57e9dad365fd0fbaf0468eac4949f189)r   r   )rR   rW   rY   rS   r[   rT   r^   rb   rZ   rU   r\   r`   rV   rX   	subtitles)Zwritesubtitlesre   zjhttps://na-training-1.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=940cbd41-f616-4a45-b13e-aaf1000c915bz$940cbd41-f616-4a45-b13e-aaf1000c915bzcount:1zHR Benefits Review Meeting*i{]ZZoomz$md5:04f90a9c2c68b7828144abfb170f0106gQy@z$b6ac04ad-38b8-4724-a004-a851004ea3dfZ20191129)rR   rW   ri   rS   rX   rY   rT   rU   r^   ra   r`   r[   rZ   r\   rV   z^https://ucc.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=0e8484a4-4ceb-4d98-a63f-ac0200b455cb)rG   Zonly_matchingzahttps://brown.hosted.panopto.com/Panopto/Pages/Embed.aspx?id=0b3ff73b-36a0-46c5-8455-aadf010a3638c                    s   t |rdS t |S )NF)PanoptoPlaylistIEsuitablesuper)clsrG   	__class__r:   r;   rk      s    zPanoptoIE.suitablec           	      C   s   t |dtd}|d}t |ddtd}|r|r|rdttjtj	j
  d}d	|d
|d|d d
d
dd ||d
dgi}| j|d |dt|dddiddd d S )N)DeliveryDurationexpected_typeZInvocationId)rp   Streams.ZPublicIDF)get_allrs   z/Date(z000)/ZstreamRequestsr   r   r   )ZClientTimeStampIDZInvocationIDZPlaybackSpeedZSecondsListenedZSecondsRejectedZStartPositionZStartReasonZ
StopReasonZStreamIDZ	TimeStampZUpdatesRejectedz)/Services/Analytics.svc/AddStreamRequestsr#   r&   r$   zMarking watchedzUnable to mark watched)r(   r'   r)   noteZerrnote)r   floatr2   strcalendartimegmdtdatetimenowtimezoneutc	timetupleZ_download_webpager/   r0   r1   )	r4   r5   r-   delivery_inforZ   Zinvocation_idZ	stream_idZtimestamp_strr'   r:   r:   r;   _mark_watched   s<    
"    zPanoptoIE._mark_watchedc                 C   sj   g }| p
g D ]X}| d}t| dt| d }}|r|d ks|d krNq|||| |d q|S )NCaptionTimerq   )
start_timeend_timerS   )r2   r	   append)
timestampsrY   rT   captionstartrZ   r:   r:   r;   _extract_chapters
  s    

zPanoptoIE._extract_chaptersc                 c   s  i }|p
g D ]}| d}| d| d }}| ddkrv|d k	rv|d k	rv|dg | d| d|  |d	 | d
| d| d  }}}	d |||	fkr|dg | d| d| d| d|	  |d	 q| D ]\}
}|
ddddd|dV  qd S )Nrq   ZObjectIdentifierZObjectSequenceNumberZEventTargetTypeZ
PowerPointZslidesz/Pages/Viewer/Image.aspx?id=z&number=)rG   rZ   ZObjectPublicIdentifierZ	SessionIDZAbsoluteTimeZchapterz(/Pages/Viewer/Thumb.aspx?eventTargetPID=z&sessionPID=z&isPrimary=false&absoluteTime=rc   nonezabout:invalid)Z	format_idrW   protocolZacodecZvcodecrG   	fragments)r2   
setdefaultr   rF   )r5   r   Zimage_fragsrT   rZ   Zobj_idZobj_snZobj_pidZ
session_idZabs_timenamer   r:   r:   r;   _extract_mhtml_formats  s0    
"
z PanoptoIE._extract_mhtml_formatsc                    s    fdd}d | S )Nc               	   3   s|   t  D ]n\} }|d }|d}|r0|| }nt | d dfpHd }| d  dt| dt| d|d  V  qd S )Nr   rq   r   
z --> r   )	enumerater2   r   r   )iliner   rZ   r   r'   deliveryr:   r;   
_gen_lines8  s    

z'PanoptoIE._json2srt.<locals>._gen_linesz

)join)r'   r   r   r:   r   r;   	_json2srt6  s    	zPanoptoIE._json2srtc                 C   sx   i }| dpg D ]`}| j|d|dd|dt|ddd}t|tsFq|| j |pXd	g d
| ||d q|S )NZAvailableLanguages/Pages/Viewer/DeliveryInfo.aspxFz"Downloading captions JSON metadataTr/   )
deliveryIdZgetCaptionslanguageresponseType)r(   rw   querydefaultrg   rh   )	r2   r<   ry   
isinstancelistr   rM   r   r   )r4   r5   r-   r   ri   langr8   r:   r:   r;   _get_subtitlesC  s*       	


zPanoptoIE._get_subtitlesc                 K   s   g }i }|pg D ]}g }| d}| d}	|r>|d|i |	r| d}
|
dkr|| |	|\}}|| | ||}n|d|	i |D ]}|d| di| q|| q||fS )NZStreamHttpUrlZ	StreamUrlrG   ZViewerMediaFileTypeName)Zhlsformat_noteTag)r2   r   Z#_extract_m3u8_formats_and_subtitlesextend_merge_subtitlesupdate)r4   r-   ZstreamsZ
fmt_kwargsformatsri   streamZstream_formatsZhttp_stream_urlZ
stream_url
media_typeZm3u8_formatsZstream_subtitlesfmtr:   r:   r;   &_extract_streams_formats_and_subtitlesW  s6    



  z0PanoptoIE._extract_streams_formats_and_subtitlesc                 C   sl  |  |dd\}}| j|d||ddddddddd	d	}|d
 }t|d}|d}| j||ddd\}}	| j||ddd\}
}||
 }|| || | |	|| 	|||}| 
||| ||dt|ddd d|r|d nd |d|d| dt   |d| ||dp4d |d|dt|d |d!t|d"d#d$d%||d&S )'Nr5   rR   r    falsetruer/   )	r   ZinvocationIdZisLiveNotesZrefreshAuthCookieZisActiveBroadcastZ	isEditingZisKollectiveAgentInstalledZisEmbedr   )r   rp   ZSessionStartTimeZ
TimestampsZPodcastStreamsZPODCAST)r   rt   i)Z
preferenceSessionName)ZContributors.ZDisplayNamec                 S   s   | pd S )Nr:   )xr:   r:   r;   <lambda>      z)PanoptoIE._real_extract.<locals>.<lambda>rr   l    Nk
 rq   z2/Services/FrameGrabber.svc/FrameRedirect?objectId=z&mode=Delivery&random=ZAverageRatingZOwnerDisplayNameZOwnerIdZSessionAbstract)ZTags.ZContentZSessionGroupPublicIDZSessionGroupLongNameZSessionGroupShortNameFru   )rR   rS   rX   rT   rZ   rU   r[   rY   r`   r\   ra   rb   r]   r^   r   ri   )_match_valid_urlgroupr<   r	   r2   r   r   r   r   Zextract_subtitlesZmark_watchedr   randomr   )r4   rG   r5   r-   r   r   Zsession_start_timer   Zpodcast_formatsZpodcast_subtitlesZstreams_formatsZstreams_subtitlesr   ri   r:   r:   r;   _real_extractu  sl      
  
  
  zPanoptoIE._real_extract)rI   rJ   rK   r   rL   
_VALID_URLZ_EMBED_REGEXint_TESTSclassmethodrk   r   rN   r   r   r   r   r   r   __classcell__r:   r:   rn   r;   rO   H   s2  


  


rO   c                   @   sN   e Zd Zejd Zdddddddd	d
dddddgZdd Zdd ZdS )rj   z;/Pages/(Viewer|Embed)\.aspx.*(?:\?|&)pid=(?P<id>[a-f0-9-]+)zhttps://howtovideos.hosted.panopto.com/Panopto/Pages/Viewer.aspx?pid=f3b39fcf-882f-4849-93d6-a9f401236d36&id=5fa74e93-3d87-4694-b60e-aaa4012214ed&advance=truezFeatured Video Tutorialsz$f3b39fcf-882f-4849-93d6-a9f401236d36r   )rS   rR   ra   $   rG   r_   Zplaylist_mincountzbhttps://utsa.hosted.panopto.com/Panopto/Pages/Viewer.aspx?pid=e2900555-3ad4-4bdb-854d-ad2401686190z%Library Website Introduction Playlistz$e2900555-3ad4-4bdb-854d-ad2401686190z$md5:f958bca50a1cbda15fdc1e20d32b3ecbr   c                 c   s   |  |d| d|}|d }|D ]j}|ddkrJ| jdt  dd q"d	|d
|d|d|d|dt|dt|ddV  q"d S )Nz/Api/SessionLists/z6?collections[0].maxCount=500&collections[0].name=itemsZItemsZTypeNameSessionz1Got an item in the playlist that is not a SessionT)Z	only_oncerG   IdZ	ViewerUriNameDescriptionrq   )Parentr   )r   r   )_typerR   rG   rS   ra   rZ   r^   r]   )r<   r2   r3   r   r   )r4   r5   playlist_idZsession_list_idZsession_list_inforF   itemr:   r:   r;   _entries  s&     
 zPanoptoPlaylistIE._entriesc                 C   s   |  |dd\}}tt|d}|rx| drb| d| d | j|d|  t |dS | d| d	|  | 	|d
| |}| j
| |||d ||d|ddS )Nr5   rR   Z
noplaylistzDownloading just video z because of --no-playlist/Pages/Viewer.aspx?id=)ie_keyr-   zDownloading playlist z+; add --no-playlist to just download video z/Api/Playlists/ZSessionListIdr   r   )r   Zplaylist_titleZplaylist_description)r   r   r   r
   	get_paramZ	to_screen
url_resultrO   r   r<   Zplaylist_resultr   r2   )r4   rG   r5   r   r-   Zplaylist_infor:   r:   r;   r     s    
 zPanoptoPlaylistIE._real_extractN)	rI   rJ   rK   r   rL   r   r   r   r   r:   r:   r:   r;   rj     s$   

rj   c                   @   sf   e Zd Zej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d Zdd Z	dd Z
dS )PanoptoListIEz/Pages/Sessions/List\.aspx   zthttps://demo.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63a%22rP   rQ   )rR   rS      r   zVhttps://demo.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#view=2&maxResults=250panopto_listi,  zhttps://howtovideos.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx?noredirect=true#folderID=%224b9de7ae-0080-4158-8496-a9ba01692c2e%22z$4b9de7ae-0080-4158-8496-a9ba01692c2ezVideo Tutorialsr   c              
   c   s   dddd||| j d}| j|d| d|d  d|idd	}t|d
g dD ]V}|d}d||dt|ddddp|d|  |d|d|ddV  qNt|dg dD ]8}	|	d}
| j|d|
 d t |
|	ddV  qd S )Nr   T)Z
sortColumnZgetFolderDataZincludePlaylists)pageZ
maxResultsz/Services/Data.svc/GetSessionsz page ZqueryParametersFr'   r(   ZResults)r   Z
DeliveryIDrG   r   Z	ViewerUrlZEmbedUrlr   r   rq   Z
FolderNameZFolderID)r   rR   rS   rG   rZ   r^   r]   Z
Subfoldersrv   z$/Pages/Sessions/List.aspx#folderID=""r   )r   r-   rS   )
_PAGE_SIZEr<   r   r2   r   r   r   r   )r4   r5   query_params
display_idr   rf   r8   resultZitem_idfolder	folder_idr:   r:   r;   _fetch_page  sB    	   



  zPanoptoListIE._fetch_pagec                 C   s&   | j |d|d|idd}dt|diS )Nz /Services/Data.svc/GetFolderInfofolderIDFr   rS   r   )r<   r   )r4   r5   r   r8   r:   r:   r;   _extract_folder_metadata-  s        z&PanoptoListIE._extract_folder_metadatac           	      C   s   |  |}|d}| |}|dd }}|drVd}|dsnddd	g|d< n|d
rfd}n|rn|}|d}|r|d| d7 }d||d}|r|| || tt| j	|||| j
|d< |S )Nr5   r   r   ZisSubscriptionsPageZsubscriptionsZsubscribableTypesr   r   r   ZisSharedWithMeZsharedwithmer   z	: query "r   Zplaylist)r   rR   rS   entries)r   r   rH   r2   r   r   r   	functoolspartialr   r   )	r4   rG   Zmobjr5   r   r   r   r   infor:   r:   r;   r   5  s4    






 zPanoptoListIE._real_extractN)rI   rJ   rK   r   rL   r   r   r   r   r   r   r:   r:   r:   r;   r     s0   


"r   )rz   r}   r|   r   r/   r   urllib.parserB   commonr   utilsr   r   r   r   r	   r
   r   r   r   rO   rj   r   r:   r:   r:   r;   <module>   s   (3  f>