a
    h{d                     @   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 ddl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url_or_none)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)zen-USzen-GBzes-MXz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 u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 r9   M/mnt/pikpak/tmp/myenv/lib/python3.9/site-packages/yt_dlp/extractor/panopto.py	_call_api3   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vr9   r9   r:   
<dictcomp>F       z1PanoptoBaseIE._parse_fragment.<locals>.<dictcomp>)urllibparser
   urlparsefragmentitems)urlr9   r9   r:   _parse_fragmentD   s    zPanoptoBaseIE._parse_fragment)NT)__name__
__module____qualname__BASE_URL_RE_SUB_LANG_MAPPINGr;   staticmethodrH   r9   r9   r9   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g ddddddddddddd
ddg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/d0d
d1gg d2d3d4ed5d1g d6d7d8d9d:d;dd<d=d>d?d@dAdBddCdDddEdFdGdgdHg ddId>dJdKdLdMdNd
g dOdDdPdQdRgdSdTdUdVdWdVgdXdJdJdYdLdZd[d
d\d]dgg d^d_d`daddDdbg dcdddedJdJdYdLdfdJdgdhdJdgg	Zdidjd
dkdDdlgdmdndodpg dqdrdsdldtdudvdwdxdygiiidLgZ	e
 fdzd{Zd|d} Zed~d Zedd Zedd Zdd Zdd Zdd Z  ZS )	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-ab0b00f42b1ez$bb0b58ff-b31b-47a0-9aa2-af6f0113613aZProduct)idtitle	timestamp	thumbnailupload_dateextcastchaptersdurationaverage_ratingtags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:13z$a96d1a31-b4de-489b-9eee-b4a5b414372cz$md5:4391837802b3fc856dadf630c4b375d1gMb@z$9f3c1921-43bb-4bda-8b3a-b8d2f05a8546ZWebcasts)rP   rQ   uploaderrR   rS   rT   rU   rW   rV   rZ   r[   rY   descriptionrX   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20190930z0re:https?://howtovideos\.hosted\.panopto\.com/.+z$md5:2d844aaa1b1a14ad0e2601a0993b431fzGetting Started: View a Videoz$fb93bc3c-6750-4b80-a05b-a921013735d3zGetting Started)rP   rU   rX   rV   r[   rR   rZ   rW   rT   rS   r`   rQ   rY   r_   r\   r]   zInvalid URL)rG   r^   skipz]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)rP   rU   rV   rW   rX   r`   r\   rY   r[   r_   rZ   rR   rQ   rS   r]   rT   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$0202d932-6d28-4fb2-b373-af6f0121c8f0Z20151129r   zCustomer Demonstrationsz$md5:55e51d54233ddb0e6c2ed388ca73822czISR Videographerzcount:28)rP   rU   rR   rX   rQ   r\   r[   rT   rY   r_   r]   r`   rV   rW   rZ   rS   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@z2re:https?://na-training-1\.hosted\.panopto\.com/.+z$8e8ba0a3-424f-40df-a4f1-ab3a01375103zCait M.Z20210306)rP   rU   rW   rQ   rY   rR   r]   rZ   rX   rS   r[   r_   rT   rV   )Zwritesubtitlesrd   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{]z1re:https://na-training-1\.hosted\.panopto\.com/.+ZZoomz$md5:04f90a9c2c68b7828144abfb170f0106gQy@z$b6ac04ad-38b8-4724-a004-a851004ea3dfZ20191129)rP   rU   	subtitlesrQ   rV   rW   rR   rS   r]   r`   r_   rY   rX   rZ   r[   rT   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-aadf010a3638zxhttps://www.monash.edu/learning-teaching/teachhq/learning-technologies/panopto/how-to/insert-a-quiz-into-a-panopto-videoz$0bd3f16c-824a-436a-8486-ac5900693aefzQuizzes in PanoptozStephanie Luozcount:8ZPanoptoz$md5:731ce802eee75808b1181db1ff1b5002g-:g@z're:https?://monash\.au\.panopto\.com/.+is_Z20201210z$b18ca46d-20df-4ff5-b0b3-aa7a00085617)rP   rU   rQ   rY   rV   rW   r]   r`   rX   rZ   rS   rR   rT   r_   r[   Zextractor_argsZgenericZimpersonateZchromec                    s   t |rdS t |S )NF)PanoptoPlaylistIEsuitablesuper)clsrG   	__class__r9   r:   rh      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)rm   Streams.ZPublicIDF)get_allrp   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   floatr1   strcalendartimegmdtdatetimenowtimezoneutc	timetupleZ_download_webpager.   r/   r0   )	r3   r4   r,   delivery_inforX   Zinvocation_idZ	stream_idZtimestamp_strr&   r9   r9   r:   _mark_watched   s4    
"zPanoptoIE._mark_watchedc                 C   sj   g }| p
g D ]X}| d}t| dt| d }}|r|d u s|d u rNq|||| |d q|S )NCaptionTimern   )
start_timeend_timerQ   )r1   r	   append)
timestampsrW   rR   captionstartrX   r9   r9   r:   _extract_chapters  s    

zPanoptoIE._extract_chaptersc                 c   s  i }|p
g D ]}| d}| d| d }}| ddkrv|d urv|d urv|dg | d| d|  |d	 | d
| d| d  }}}	d |||	fvr|dg | d| d| d| d|	  |d	 q| D ]\}
}|
ddddd|dV  qd S )Nrn   ZObjectIdentifierZObjectSequenceNumberZEventTargetTypeZ
PowerPointZslidesz/Pages/Viewer/Image.aspx?id=z&number=)rG   rX   ZObjectPublicIdentifierZ	SessionIDZAbsoluteTimeZchapterz(/Pages/Viewer/Thumb.aspx?eventTargetPID=z&sessionPID=z&isPrimary=false&absoluteTime=rb   nonezabout:invalid)Z	format_idrU   protocolZacodecZvcodecrG   	fragments)r1   
setdefaultr   rF   )r4   r   Zimage_fragsrR   rX   Zobj_idZobj_snZobj_pidZ
session_idZabs_timenamer   r9   r9   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   rn   r   
z --> r   )	enumerater1   r   r   )iliner   rX   r   r&   deliveryr9   r:   
_gen_linesI  s    

z'PanoptoIE._json2srt.<locals>._gen_linesz

)join)r&   r   r   r9   r   r:   	_json2srtG  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'   rt   querydefaultZsrt)rU   r&   )	r1   r;   rv   
isinstancelistr   rM   r   r   )r3   r4   r,   r   rf   langr7   r9   r9   r:   _get_subtitlesT  s$    	


zPanoptoIE._get_subtitlesc                 K   s   g }i }|pg D ]}g }t t|dthfD ]V}|d}	|	dv rr| j||ddd\}
}||
 | j||d q,|||	d q,|D ]}|d	|d
i| q|| q||fS )N)ZStreamHttpUrlZ	StreamUrlZViewerMediaFileTypeName)hlsr   F)Zm3u8_idr'   )target)rG   rU   format_noteTag)	setr   r   r1   Z#_extract_m3u8_formats_and_subtitlesextend_merge_subtitlesr   update)r3   r,   ZstreamsZ
fmt_kwargsformatsrf   streamZstream_formatsZ
stream_url
media_typeZfmtssubsfmtr9   r9   r:   &_extract_streams_formats_and_subtitlesh  s,    



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 )'Nr4   rP   r    falsetruer.   )	r   ZinvocationIdZisLiveNotesZrefreshAuthCookieZisActiveBroadcastZ	isEditingZisKollectiveAgentInstalledZisEmbedr   )r   rm   ZSessionStartTimeZ
TimestampsZPodcastStreamsZPODCAST)r   rq   i)Z
preferenceSessionName)ZContributors.ZDisplayNamec                 S   s   | pd S )Nr9   )xr9   r9   r:   <lambda>  rA   z)PanoptoIE._real_extract.<locals>.<lambda>ro   l    Nk
 rn   z2/Services/FrameGrabber.svc/FrameRedirect?objectId=z&mode=Delivery&random=ZAverageRatingZOwnerDisplayNameZOwnerIdZSessionAbstract)ZTags.ZContentZSessionGroupPublicIDZSessionGroupLongNameZSessionGroupShortNameFrr   )rP   rQ   rV   rR   rX   rS   rY   rW   r_   r[   r`   rZ   r\   r]   r   rf   )_match_valid_urlgroupr;   r	   r1   r   r   r   r   Zextract_subtitlesZmark_watchedr   randomr   )r3   rG   r4   r,   r   r   Zsession_start_timer   Zpodcast_formatsZpodcast_subtitlesZstreams_formatsZstreams_subtitlesr   rf   r9   r9   r:   _real_extract  s\    


zPanoptoIE._real_extract)rI   rJ   rK   r   rL   
_VALID_URLZ_EMBED_REGEXint_TESTSZ_WEBPAGE_TESTSclassmethodrh   r   rN   r   r   r   r   r   r   __classcell__r9   r9   rk   r:   rO   I   s^  
  


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 )rg   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$f3b39fcf-882f-4849-93d6-a9f401236d36zFeatured Video Tutorialsr   )rP   rQ   r`   r   rG   r^   Zplaylist_mincountzbhttps://utsa.hosted.panopto.com/Panopto/Pages/Viewer.aspx?pid=e2900555-3ad4-4bdb-854d-ad2401686190z$e2900555-3ad4-4bdb-854d-ad2401686190z%Library Website Introduction Playlistz$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Descriptionrn   )Parentr   )r   r   )_typerP   rG   rQ   r`   rX   r]   r\   )r;   r1   r2   r   r   )r3   r4   playlist_idZsession_list_idZsession_list_inforF   itemr9   r9   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 )Nr4   rP   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   r1   )r3   rG   r4   r   r,   Zplaylist_infor9   r9   r:   r     s    

zPanoptoPlaylistIE._real_extractN)	rI   rJ   rK   r   rL   r   r   r   r   r9   r9   r9   r:   rg     s$   
	rg   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%22z$e4c6a2fc-1214-4ca0-8fb7-aef2e29ff63azShowcase Videos)rP   rQ   r   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  qPt|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   rn   Z
FolderNameZFolderID)r   rP   rQ   rG   rX   r]   r\   Z
Subfoldersrs   z$/Pages/Sessions/List.aspx#folderID=""r   )r   r,   rQ   )
_PAGE_SIZEr;   r   r1   r   r   r   r   )r3   r4   query_params
display_idr   re   r7   resultZitem_idfolder	folder_idr9   r9   r:   _fetch_page  s:    	



zPanoptoListIE._fetch_pagec                 C   s&   | j |d|d|idd}dt|diS )Nz /Services/Data.svc/GetFolderInfofolderIDFr   rQ   r   )r;   r   )r3   r4   r   r7   r9   r9   r:   _extract_folder_metadata/  s    
z&PanoptoListIE._extract_folder_metadatac           	      C   s   |  |}|d}| |}|dd }}|drTd}|dslg d|d< n|drdd	}n|rl|}|d
}|r|d| d7 }d||d}|r|| || tt| j	|||| j
|d< |S )Nr4   r   r   ZisSubscriptionsPageZsubscriptionsZsubscribableTypes)r   r   r   ZisSharedWithMeZsharedwithmer   z	: query "r   Zplaylist)r   rP   rQ   entries)r   r   rH   r1   r   r   r   	functoolspartialr   r   )	r3   rG   Zmobjr4   r   r   r   r   infor9   r9   r:   r   7  s2    






zPanoptoListIE._real_extractN)rI   rJ   rK   r   rL   r   r   r   r   r   r   r9   r9   r9   r:   r     s0   
	"r   )rw   rz   ry   r   r.   r   urllib.parserB   commonr   utilsr   r   r   r   r	   r
   r   r   Zutils.traversalr   r   rO   rg   r   r9   r9   r9   r:   <module>   s   (
3  q: