
    V|h2H                         S SK r S SKrS SKrS SKrSSKJr  SSKJrJ	r	J
r
JrJrJrJrJrJr  SSKJr   " S S\5      r " S	 S
\5      rg)    N   )InfoExtractor   )	ExtractorErrordetermine_extfilter_dict	get_firstint_or_noneparse_iso8601
update_urlurl_or_nonevariadic)traverse_objc                      \ rS rSrSrSrS\ S3/rSSSS	S
SSSSS.S.SSSSSSSSSS.S.SSSS	SSSS S!S"S#S$.	S.S%S&SS'S(S)S*S+S,S-.S.S/0S0.S1S2S3S	S4S5S6S7S8S.S9S:0S;.S<S=S>S	S?S@SASBSCS.SDSE0SF/SG./rSHSISJS	SKSLSMSNSOSP.S./rSQSR/ SSQ00r	\
R                  " ST5      \
R                  " SU5      \
R                  " SV5      \
R                  " SW5      SX.rSYrS`S[ jrS\ rS] rS^ rS_rgZ)aLoomIE   loomz@https?://(?:www\.)?loom\.com/(?:share|embed)/(?P<id>[\da-f]{32})z<iframe[^>]+\bsrc=["\'](?P<url>)z;https://www.loom.com/share/43d05f362f734614a2e81b4694a3a523 bfc2d7e9c2e0eb4813212230794b6f42 43d05f362f734614a2e81b4694a3a523mp4z#A Ruler for Windows - 28 March 2022zwILLIAM PIP20220328i^jAb   )idexttitleuploaderupload_date	timestampduration)urlmd5	info_dictz;https://www.loom.com/share/c43a642f815f4378b6f80a889bb73d8d 70f529317be8cf880fcc2c649a531900 c43a642f815f4378b6f80a889bb73d8dwebmzLilah Nielsen Intro VideozLilah Nielsen20200826iLF_   z;https://www.loom.com/share/9458bcbf79784162aa62ffb8dd66201b 51737ec002969dd28344db4d60b9cbbb 9458bcbf79784162aa62ffb8dd66201bzSharing screen with gpt-4zUSharing screen with GPT 4 vision model and asking questions to guide through blender.zSuneel Mathamzcount:320231109iLe]   )	r   r   r   descriptionr   chaptersr   r   r    z;https://www.loom.com/share/24351eb8b317420289b158e4b7e96ff2 24351eb8b317420289b158e4b7e96ff2z
OMFG clownz$md5:285c5ee9d62aa087b7e3271b08796815z
MrPumkin B20210924iENa   )r   r   r   r-   r   r   r   r    skip_downloaddash)r!   r#   paramsz;https://www.loom.com/share/50e26e8aeb7940189dff5630f95ce1f4 5cc7655e7d55d281d203f8ffd14771f7 50e26e8aeb7940189dff5630f95ce1f4ziOS Mobile UploadzSimon Curran20200520iy^#   videopasswordseniorinfants2)r!   r"   r#   r4   z;https://www.loom.com/embed/ddcf1c1ad21f451ea7468b1e33917e4e b321d261656848c184a94e3b93eae28d ddcf1c1ad21f451ea7468b1e33917e4ezCF Reset User's PasswordzAimee Heintz20220707ib   format	bestvideozFailed to parse JSON)r!   r"   r#   r4   expected_warningszBhttps://www.loom.com/community/e1229802a8694a09909e8ba0fbb6d073-pg ec838cd01b576cf0386f32e1ae424609 e1229802a8694a09909e8ba0fbb6d073z.Rexie Jane Cimafranca - Founder's PresentationzRexie Cimafranca20230213   inc)r   r   r   r   r   r    r   GetVideoSourceacceptableMimes)DASHM3U8MP4a              query GetVideoSSR($videoId: ID!, $password: String) {
              getVideo(id: $videoId, password: $password) {
                __typename
                ... on PrivateVideo {
                  id
                  status
                  message
                  __typename
                }
                ... on VideoPasswordMissingOrIncorrect {
                  id
                  message
                  __typename
                }
                ... on RegularUserVideo {
                  id
                  __typename
                  createdAt
                  description
                  download_enabled
                  folder_id
                  is_protected
                  needs_password
                  owner {
                    display_name
                    __typename
                  }
                  privacy
                  s3_id
                  name
                  video_properties {
                    avgBitRate
                    client
                    camera_enabled
                    client_version
                    duration
                    durationMs
                    format
                    height
                    microphone_enabled
                    os
                    os_version
                    recordingClient
                    recording_type
                    recording_version
                    screen_type
                    tab_audio
                    trim_duration
                    width
                    __typename
                  }
                  playable_duration
                  source_duration
                  visibility
                }
              }
            }
a              query GetVideoSource($videoId: ID!, $password: String, $acceptableMimes: [CloudfrontVideoAcceptableMime]) {
              getVideo(id: $videoId, password: $password) {
                ... on RegularUserVideo {
                  id
                  nullableRawCdnUrl(acceptableMimes: $acceptableMimes, password: $password) {
                    url
                    __typename
                  }
                  __typename
                }
                __typename
              }
            }
a              query FetchVideoTranscript($videoId: ID!, $password: String) {
              fetchVideoTranscript(videoId: $videoId, password: $password) {
                ... on VideoTranscriptDetails {
                  id
                  video_id
                  source_url
                  captions_source_url
                  __typename
                }
                ... on GenericError {
                  message
                  __typename
                }
                __typename
              }
            }
a              query FetchChapters($videoId: ID!, $password: String) {
              fetchVideoChapters(videoId: $videoId, password: $password) {
                ... on VideoChapters {
                  video_id
                  content
                  __typename
                }
                ... on EmptyChaptersPayload {
                  content
                  __typename
                }
                ... on InvalidRequestWarning {
                  message
                  __typename
                }
                ... on Error {
                  message
                  __typename
                }
                __typename
              }
            }
)GetVideoSSRrF   FetchVideoTranscriptFetchChapters0a1856cNc                    U R                  S5      nU R                  SX#=(       d    SU=(       d    SSSSU R                   3SU R                  S.[        R                  " [        U5       Vs/ s H5  nUUUS	.U R                  R                  U0 5      EU R                  U   S
.PM7     snSS9R                  5       S9$ s  snf )Nr9   zhttps://www.loom.com/graphqlzDownloading GraphQL JSONzFailed to download GraphQL JSONapplication/json	loom_web_web)AcceptContent-Typezx-loom-request-sourcezapollographql-client-namezapollographql-client-version)videoIdpassword)operationName	variablesquery,:
separators)headersdata)
	get_param_download_json_APOLLO_GRAPHQL_VERSIONjsondumpsr   _GRAPHQL_VARIABLESget_GRAPHQL_QUERIESencode)self
operationsvideo_idnoteerrnoterV   operation_names          O/home/james-whalen/.local/lib/python3.13/site-packages/yt_dlp/extractor/loom.py_call_graphql_apiLoomIE._call_graphql_api   s    >>/2""*H6X>X88, 2+4T5Q5Q4R)S-2040L0LC JJ %-Z$8 : %9. "0' ( --11."E
 ..~>! %9 : GQR SYRXRZ! # \ 	\ :s   -<B?c                    U R                  SU SU 3USU S3SU S3SSSS.[        R                  " [        [        R
                  " 5       5      S SU R                  S	5      S
.SS9R                  5       S9n[        US[        145      $ )Nz,https://www.loom.com/api/campaigns/sessions//zDownloading z JSONzFailed to download FrP   )rS   rT   r9   )anonIDdeviceIDforce_originalrV   rZ   r]   )fatalr_   r`   r!   )
rb   rd   re   struuiduuid4ra   ri   r   r   )rj   endpointrl   responses       rp   _call_url_apiLoomIE._call_url_api	  s    &&:8*AhZPRZ8*E*.A(5,QY^1CUVdjjl+ "' NN?;	
 %&
 '-fh ' 	0 Hu{m&<==    c                   ^ ^^ / n[        USS[        14S[        14SS 14S.45      mU UU4S jnT R                  ST5      nUR                  U" US	S
S95        T R                  ST5      nUR                  U" USSS95        [	        USSSS[
        145      nXg4 V	s/ s H  o(       d  M  [        U	S S9PM     n
n	U(       a%  [        US S9U
;  a  UR                  U" USSS95        U$ s  sn	f )Nvideo_propertieswidthheightmicrophone_enabledc                     U SL a  S$ S $ )NFnone )xs    rp   <lambda>)LoomIE._extract_formats.<locals>.<lambda>  s    !u*8VRV8Vr   )r   r   acodecc           	   3      >#    U (       d  g [        U 5      n[        R                  R                  U 5      R                  nUS:X  ay  U R                  SS5      n T	R                  U T
SSU 3SUS9nS[        US	5      ;   nU H:  nU(       a  UR                  S
5      S:w  a  SUS'   0 UE[        US   US9US.Ev   M<     g US:X  a*  T	R                  U T
SU 3SS9nU H  n0 UEUUS.Ev   M     g U USU 3US.TEv   g 7f)Nm3u8z-split.m3u8z.m3u8r   zhls-F)m3u8_idrx   qualityr   ).vcodecr   r   r!   rY   )r!   extra_param_to_segment_urlmpdzdash-)mpd_idrx   )r   r   zhttp-)r!   r   	format_idr   )r   urllibparseurlparserY   replace_extract_m3u8_formatsr   rg   r   _extract_mpd_formats)
format_urlr   r   r   rY   m3u8_formatsis_not_premergedfmtdash_formatsrj   rl   r   s            rp   get_formats,LoomIE._extract_formats.<locals>.get_formats  sV    
+CLL))*5;;Ef}'//wG
#99%4	{9KSXbi  :  k $*\,-X#X 'C'CGGH,=,G(.H)#e*EB6;  ( #8851DE  9  S'C6;#*  ( &#(!4&	
 ' s   C;C>zraw-urlrawr   )r   ztranscoded-url
transcodedr`   getVideonullableRawCdnUrlr!   r   cdnr   )r   r
   r~   extendr	   r   r   )rj   rl   metadatagql_dataformatsr   raw_urltranscoded_urlcdn_urlr!   
valid_urlsr   s   ``         @rp   _extract_formatsLoomIE._extract_formats  s   '3E}-+/+.V-WXH
 3 '	R $$Y9{7E1=>++,<hG{><LMHvz;NPUXcWd&ef>E=V^=VcZ]1jD1=V
^z'6jHNN;wqAB	 _s   
C+-C+c                    U R                  U5      n[        U R                  SUS5      SS[        145      =(       d    0 nUR	                  S5      S:X  a*  U R                  S5      (       d
  [        SS	S
9e[        SS	S
9eU R                  / SQU5      n[        USS[        145      nUUU R                  [        USSS[        145      U5      =(       d    S U R                  X#U5      [        S[        USSSSS[        1045      =(       d    S 05      S.[        US[        14S[        14SS[        14S[        14S.5      E$ )NrK   z!Downloading GraphQL metadata JSONr`   r   
__typenameVideoPasswordMissingOrIncorrectr9   zAThis video is password-protected, use the --video-password optionT)expectedzInvalid video password)rM   rL   rF   r   r    fetchVideoChapterscontenten.fetchVideoTranscript)
source_urlcaptions_source_urlr!   )r   r    r.   r   	subtitlesnamer-   ownerdisplay_name	createdAt)r   r-   r   r   )	_match_idr	   rq   dictrg   ra   r   r   r
   "_extract_chapters_from_descriptionry   r   r   r   r   )rj   r!   rl   r   r   r    s         rp   _real_extractLoomIE._real_extractU  s   >>#&""=(<_`Z$(* 0-/ 	 <<%)JJ>>/22$Wbfh h !9DII))*egop+=zK=*YZ  ??(V-A9se$TUW_a idh,,XJ$l8!79}<.     & 
 8 3% -u5$nse<)M?;	& 
 	
r   r   )NN)__name__
__module____qualname____firstlineno__IE_NAME
_VALID_URL_EMBED_REGEX_TESTS_WEBPAGE_TESTSrf   textwrapdedentrh   rc   rq   r~   r   r   __static_attributes__r   r   rp   r   r      s   GTJ6zl!DEL M14:%%#
	 M140'%#
	 M140r'!%#

	" M4!A$%#	
 #F+  M14(&%#
 #$45  M140&%#
 [)45KTFl T14F*%#
 N 	6
   9( 9t #// +  !) 1 !" " * uqd (\(>=~"
r   r   c                       \ rS rSrSrSrSSSSS.S	.S
SSSS.S	.SSSSS.S	.SSSSS.S	.SSSSS.S.SSSSS.S	.SSS S!S.S	.S"S#S$./rS% rS*S' jrS( r	S)r
g&)+LoomFolderIEiz  zloom:folderz=https?://(?:www\.)?loom\.com/share/folder/(?P<id>[\da-f]{32})zBhttps://www.loom.com/share/folder/997db4db046f43e5912f10dc5f817b5c    997db4db046f43e5912f10dc5f817b5czBlending Lessons)r   r   )r!   playlist_mincountr#   zBhttps://www.loom.com/share/folder/9a8a87f6b6f546d9a400c8e7575ff7f2    9a8a87f6b6f546d9a400c8e7575ff7f2zList A- a, i, ozBhttps://www.loom.com/share/folder/886e534218c24fd292e97e9563078cc4r    886e534218c24fd292e97e9563078cc4zMedicare Agent Training videoszBhttps://www.loom.com/share/folder/b72c4ecdf04745da9403926d80a40c38 b72c4ecdf04745da9403926d80a40c38zQuick Altos Q & A TutorialszBhttps://www.loom.com/share/folder/8b458a94e0e4449b8df9ea7a68fafc4e    8b458a94e0e4449b8df9ea7a68fafc4ezSezer Texting Guide)r!   playlist_countr#   zBhttps://www.loom.com/share/folder/e056a91d290d47ca9b00c9d1df56c463=    e056a91d290d47ca9b00c9d1df56c463zUser VideoszBhttps://www.loom.com/share/folder/c2dde8cc67454f0e99031677279d8954K    c2dde8cc67454f0e99031677279d8954zHonors 1zKhttps://www.loom.com/share/folder/bae17109a68146c7803454f2893c8cf8/EdpuzzleT)r!   only_matchingc                 0    U R                  SU 3USSS0S9$ )Nz https://www.loom.com/v1/folders/zDownloading folder info JSONlimit10000r   )rb   )rj   	folder_ids     rp   _extract_folder_data!LoomFolderIE._extract_folder_data  s2    "".yk:I*7G2D # F 	Fr   Nc           	   #   D  ^#    U=(       d    U R                  T5      n[        USS 45       H3  nUS   nU R                  SU 3[        XTR	                  S5      5      v   M5     [        USU4S jS[
        145       H  nU R                  U5       S h  vN   M     g  N	7f)Nvideosc                     US   $ Nr   r   )_vs     rp   r   6LoomFolderIE._extract_folder_entries.<locals>.<lambda>  s    qwr   r   zhttps://www.loom.com/share/r   foldersc                    > US   T:g  $ r   r   )r   r   r   s     rp   r   r     s    $9(<r   )r   r   
url_resultr   rg   ry   _extract_folder_entries)rj   r   initial_folder_datafolder_datavideorl   subfolder_ids    `     rp   r   $LoomFolderIE._extract_folder_entries  s     )QT-F-Fy-Q!+:N/OPET{H//-hZ8&(IIV\L]_ _ Q )<dSE7K LL33LAAALAs   BB B
B c           
          U R                  U5      nU R                  U5      nU R                  U R                  X#5      U[	        USS[
        R                  145      5      $ )Nfolderr   )r   r   playlist_resultr   r   ry   strip)rj   r!   playlist_idplaylist_datas       rp   r   LoomFolderIE._real_extract  s\    nnS)11+>##((Dk6CII;(GHJ 	Jr   r   )N)r   r   r   r   r   r   r   r   r   r   r   r   r   rp   r   r   z  s    GQJ T4'
	 T4&
	 T45
	 T42
	 T4*
	 T4"
	 T4
	 ]q;FzF
BJr   r   )rd   r   urllib.parser   rz   commonr   utilsr   r   r   r	   r
   r   r   r   r   utils.traversalr   r   r   r   r   rp   <module>r     sG        !
 
 
 +b
] b
JXJ= XJr   