o
    i{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                   @   s   e Zd ZdZi dddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)Zd0d,d-Zed.d/ Zd*S )1PanoptoBaseIEz:(?P<base_url>https?://[\w.-]+\.panopto.(?:com|eu)/Panopto)r   zen-USr   zen-GBr   zes-MX   zes-ES   zde-DE   zfr-FR   znl-NL   zth-TH   zzh-CN	   zzh-TW
   zko-KR   zja-JP   zru-RU   zpt-PT   zpl-PL   zen-AU   zda-DKzfi-FIzhu-HUznb-NOzsv-SEzit-IT)               NTc           
      K   s   | j || |f|rt|dnd |dddd|}|s!d S t|d}|dkr2| jdd |S |d urNd	|d
 }	|rGt|	|dd| j|	|d |S )Nutf8application/json)acceptcontent-type)datafatalheaders	ErrorCoder   cookies)methodzPanopto said: ErrorMessageT)video_idexpected)r-   )	_download_jsonjsondumpsencoder   raise_login_requiredgetr   report_warning)
selfbase_urlpathr-   r&   r'   kwargsresponse
error_codemsg r=   L/home/ubuntu/.local/lib/python3.10/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   )r0   loads).0kvr=   r=   r>   
<dictcomp>F   s     z1PanoptoBaseIE._parse_fragment.<locals>.<dictcomp>)urllibparser
   urlparsefragmentitems)urlr=   r=   r>   _parse_fragmentD   s   $zPanoptoBaseIE._parse_fragment)NT)__name__
__module____qualname__BASE_URL_RE_SUB_LANG_MAPPINGr?   staticmethodrK   r=   r=   r=   r>   r      s\    	

r   c                       sR  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i dddddddddddddd
ddd dgd!g d"d#d$ed%d&d'd(d)d*d+d,dd-i dd.dd
d'd/d d0gd"d1dd2d!d3d4gdg dd5dd6d%d7dd8d$edd0d)d9d+d:d;d<d=i dd>dd
d d?gdg d'd@d%dAd)dBd$ed"dCdd?d!g ddDddEddFd+dGddHddIi ddJddKddLd'dMddNd)dOd"d#ddPd$dQddd+dRd%dSd dTdgddUd!g dddKdVdWdXdYdZd
g d[dQd\d]d^gd_d`dadbdcdbgdddVdVdedXdfi ddgdd
dhdiddjd dgdg ddkddld+dmd%dnddd$dQd'dod!g d"dpddqdVdVdedXdrdVdsdtdVdsg	Zdudvd
dwdQdxgdydzd{d|g d}d~ddxddddddgiiidXgZ	e
 fddZdd Zedd 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/.+20160328mp4gl
V@z$2db6b718-47a0-4b0b-9e17-ab0b00f42b1ez$bb0b58ff-b31b-47a0-9aa2-af6f0113613aProduct)idtitle	timestamp	thumbnailupload_dateextcastchaptersdurationaverage_ratingtagsuploader_id
channel_idchannel)rJ   	info_dictzahttps://demo.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=ed01b077-c9e5-4c7b-b8ff-15fa306d7a59rV   z$ed01b077-c9e5-4c7b-b8ff-15fa306d7a59rW   z/Overcoming Top 4 Challenges of Enterprise VideouploaderzPanopto SupportrX   i:dVrY   rZ   20151206r[   r]   zcount:13r\   r`   ra   z$a96d1a31-b4de-489b-9eee-b4a5b414372cr_   descriptionz$md5:4391837802b3fc856dadf630c4b375d1r^   gMb@rb   z$9f3c1921-43bb-4bda-8b3a-b8d2f05a8546rc   Webcastszhttps://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]Viewer
Enterprise20190930z0re:https?://howtovideos\.hosted\.panopto\.com/.+z$md5:2d844aaa1b1a14ad0e2601a0993b431fzGetting Started: View a Videoz$fb93bc3c-6750-4b80-a05b-a921013735d3zGetting StartedzInvalid URL)rJ   rd   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 Interviews20191030zahttps://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-af6f0121c8f020151129r   zCustomer Demonstrationsz$md5:55e51d54233ddb0e6c2ed388ca73822czISR Videographerzcount:28T)formatskip_download)rJ   rd   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 ResourcesHumanResourcesg@z2re:https?://na-training-1\.hosted\.panopto\.com/.+z$8e8ba0a3-424f-40df-a4f1-ab3a01375103zCait M.20210306)rV   r[   r]   rW   r_   rX   rc   r`   r^   rY   ra   re   rZ   r\   )writesubtitlesrq   zjhttps://na-training-1.hosted.panopto.com/Panopto/Pages/Viewer.aspx?id=940cbd41-f616-4a45-b13e-aaf1000c915bz$940cbd41-f616-4a45-b13e-aaf1000c915b	subtitleszcount:1zHR Benefits Review Meeting*i{]z1re:https://na-training-1\.hosted\.panopto\.com/.+Zoomz$md5:04f90a9c2c68b7828144abfb170f0106gQy@z$b6ac04ad-38b8-4724-a004-a851004ea3df20191129z^https://ucc.cloud.panopto.eu/Panopto/Pages/Viewer.aspx?id=0e8484a4-4ceb-4d98-a63f-ac0200b455cb)rJ   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:8Panoptoz$md5:731ce802eee75808b1181db1ff1b5002g-:g@z're:https?://monash\.au\.panopto\.com/.+is_20201210z$b18ca46d-20df-4ff5-b0b3-aa7a00085617)rV   r[   rW   r_   r\   r]   rc   rg   r^   r`   rY   rX   rZ   re   ra   extractor_argsgenericimpersonatechromec                    s   t |rdS t |S )NF)PanoptoPlaylistIEsuitablesuper)clsrJ   	__class__r=   r>   r      s   zPanoptoIE.suitablec           	      C   s   t |dtd}|d}t |ddtd}|rW|rY|r[d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 d S d S d S )N)DeliveryDurationexpected_typeInvocationId)r   Streams.PublicIDF)get_allr   z/Date(z000)/streamRequestsr   r   r   )ClientTimeStampIDInvocationIDPlaybackSpeedSecondsListenedSecondsRejectedStartPositionStartReason
StopReasonStreamID	TimeStampUpdatesRejectedz)/Services/Analytics.svc/AddStreamRequestsr"   r%   r#   zMarking watchedzUnable to mark watched)r'   r&   r(   noteerrnote)r   floatr4   strcalendartimegmdtdatetimenowtimezoneutc	timetuple_download_webpager0   r1   r2   )	r6   r7   r-   delivery_infor^   invocation_id	stream_idtimestamp_strr&   r=   r=   r>   _mark_watched   s6   
"
zPanoptoIE._mark_watchedc                 C   sj   g }| pg D ],}| d}t| dt| d}}|r&|d u s&|d u r'q|||| |d q|S )NCaptionTimer   )
start_timeend_timerW   )r4   r	   append)
timestampsr]   rX   captionstartr^   r=   r=   r>   _extract_chapters  s   

zPanoptoIE._extract_chaptersc                 c   s
   i }|pg D ]g}| d}| d| d}}| ddkr<|d ur<|d ur<|dg | d| d|  |d	 | d
| d| d}}}	d |||	fvrn|dg | d| d| d| d|	  |d	 q| D ]\}
}|
ddddd|dV  qsd S )Nr   ObjectIdentifierObjectSequenceNumberEventTargetType
PowerPointslidesz/Pages/Viewer/Image.aspx?id=z&number=)rJ   r^   ObjectPublicIdentifier	SessionIDAbsoluteTimechapterz(/Pages/Viewer/Thumb.aspx?eventTargetPID=z&sessionPID=z&isPrimary=false&absoluteTime=rn   nonezabout:invalid)	format_idr[   protocolacodecvcodecrJ   	fragments)r4   
setdefaultr   rI   )r7   r   image_fragsrX   r^   obj_idobj_snobj_pid
session_idabs_timenamer   r=   r=   r>   _extract_mhtml_formats*  s6   
"
z PanoptoIE._extract_mhtml_formatsc                    s    fdd}d | S )Nc               	   3   s~    t  D ]7\} }|d }|d}|r|| }nt | d dfp%d }| d  dt| dt| d|d  V  qd S )Nr   r   r   
z --> r   )	enumerater4   r   r   )iliner   r^   r   r&   deliveryr=   r>   
_gen_linesI  s   

.z'PanoptoIE._json2srt.<locals>._gen_linesz

)join)r&   r   r   r=   r   r>   	_json2srtG  s   	zPanoptoIE._json2srtc                 C   sx   i }| dpg D ]0}| j|d|dd|dt|ddd}t|ts#q	|| j |p,d	g d
| ||d q	|S )NAvailableLanguages/Pages/Viewer/DeliveryInfo.aspxFz"Downloading captions JSON metadataTr0   )
deliveryIdgetCaptionslanguageresponseType)r'   r   querydefaultsrt)r[   r&   )	r4   r?   r   
isinstancelistr   rP   r   r   )r6   r7   r-   r   rv   langr:   r=   r=   r>   _get_subtitlesT  s$   
	

zPanoptoIE._get_subtitlesc                 K   s   g }i }|pg D ]P}g }t t|dthfD ]+}|d}	|	dv r9| j||ddd\}
}||
 | j||d q|||	d q|D ]}|d	|d
i| qD|| q||fS )N)StreamHttpUrl	StreamUrlViewerMediaFileTypeName)hlsr   F)m3u8_idr'   )target)rJ   r[   format_noteTag)	setr   r   r4   #_extract_m3u8_formats_and_subtitlesextend_merge_subtitlesr   update)r6   r-   streams
fmt_kwargsformatsrv   streamstream_formats
stream_url
media_typefmtssubsfmtr=   r=   r>   &_extract_streams_formats_and_subtitlesh  s,   



z0PanoptoIE._extract_streams_formats_and_subtitlesc                 C   s  |  |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\}
}||
 }|| || | |	|| 	|||}| 
||| i d|d|ddt|ddd dd|r|d nd d|dd|d| d t   d!|d"d#| |d$|d%pd d&|d'd(|d)d*t|d+d,|d-d.t|d/d0d1d2d3|d4|S )5Nr7   rV   r    falsetruer0   )	r   invocationIdisLiveNotesrefreshAuthCookieisActiveBroadcast	isEditingisKollectiveAgentInstalledisEmbedr   )r   r   SessionStartTime
TimestampsPodcastStreamsPODCAST)r   r   i)
preferencerW   SessionNamer\   )Contributors.DisplayNamec                 S   s   | pd S )Nr=   )xr=   r=   r>   <lambda>  s    z)PanoptoIE._real_extract.<locals>.<lambda>r   rX   l    Nk
 r^   r   rY   z2/Services/FrameGrabber.svc/FrameRedirect?objectId=z&mode=Delivery&random=r_   AverageRatingr]   re   OwnerDisplayNamera   OwnerIdrg   SessionAbstractr`   )Tags.Contentrb   SessionGroupPublicIDrc   SessionGroupLongNameSessionGroupShortNameFr   r   rv   )_match_valid_urlgroupr?   r	   r4   r   r   r   r   extract_subtitlesmark_watchedr   randomr   )r6   rJ   r7   r-   r   r   session_start_timer   podcast_formatspodcast_subtitlesstreams_formatsstreams_subtitlesr   rv   r=   r=   r>   _real_extract  s|   






	




zPanoptoIE._real_extract)rL   rM   rN   r   rO   
_VALID_URL_EMBED_REGEXint_TESTS_WEBPAGE_TESTSclassmethodr   r   rQ   r   r   r   r   r   r$  __classcell__r=   r=   r   r>   rR   I   s    
	
	
	
	
	
  


rR   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 )r   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   )rV   rW   rg   r   rJ   rd   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 ]5}|ddkr&| 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=itemsItemsTypeNameSessionz1Got an item in the playlist that is not a SessionT)	only_oncerJ   Id	ViewerUriNameDescriptionr   )Parentr4  )r6  r2  )_typerV   rJ   rW   rg   r^   rc   rb   )r?   r4   r5   r   r   )r6   r7   playlist_idsession_list_idsession_list_inforI   itemr=   r=   r>   _entries  s&   
zPanoptoPlaylistIE._entriesc                 C   s   |  |dd\}}tt|d}|r<| dr1| d| d | j|d|  t |dS | d| d	|  | 	|d
| |}| j
| |||d ||d|ddS )Nr7   rV   
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/SessionListIdr4  r5  )r8  playlist_titleplaylist_description)r  r  r   r
   	get_param	to_screen
url_resultrR   r?  r?   playlist_resultr<  r4   )r6   rJ   r7   r8  r-   playlist_infor=   r=   r>   r$    s   

zPanoptoPlaylistIE._real_extractN)	rL   rM   rN   r   rO   r%  r(  r<  r$  r=   r=   r=   r>   r     s&    
	r   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)rV   rW   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 ]+}|d}d||dt|ddddpD|d|  |d|d|ddV  q)t|dg dD ]}	|	d}
| j|d|
 d t |
|	ddV  q\d S )Nr   T)
sortColumngetFolderDataincludePlaylists)page
maxResultsz/Services/Data.svc/GetSessionsz page queryParametersFr&   r'   Results)r   
DeliveryIDrJ   r  	ViewerUrlEmbedUrlr  r>  r   
FolderNameFolderID)r7  rV   rW   rJ   r^   rc   rb   
Subfoldersr   z$/Pages/Sessions/List.aspx#folderID=""r4  )r?  r-   rW   )
_PAGE_SIZEr?   r   r4   r   rE  rH  r?  )r6   r7   query_params
display_idrN  rr   r:   resultitem_idfolder	folder_idr=   r=   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folderIDFrQ  rW   r4  )r?   r   )r6   r7   r`  r:   r=   r=   r>   _extract_folder_metadata/  s   
z&PanoptoListIE._extract_folder_metadatac           	      C   s   |  |}|d}| |}|dd}}|dr*d}|ds)g d|d< n|dr2d	}n|r6|}|d
}|rE|d| d7 }d||d}|rV|| || tt| j	|||| j
|d< |S )Nr7   rb  rJ  isSubscriptionsPagesubscriptionssubscribableTypes)r   r   r   isSharedWithMesharedwithmer   z	: query "rY  playlist)r7  rV   rW   entries)r  r  rK   r4   r   rc  r   	functoolspartialra  rZ  )	r6   rJ   mobjr7   r[  r`  r\  r   infor=   r=   r>   r$  7  s4   






zPanoptoListIE._real_extractN)rL   rM   rN   r   rO   r%  rZ  r(  ra  rc  r$  r=   r=   r=   r>   rH    s2    
	"rH  )r   r   r   rk  r0   r  urllib.parserE   commonr   utilsr   r   r   r   r	   r
   r   r   utils.traversalr   r   rR   r   rH  r=   r=   r=   r>   <module>   s    (
3  q: