
    `gj0                       d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZmZ ddlmZmZ  G d	 d
e      Z G d de      Z G d de      Z G d de      Zd+dZd,dZd-dZd-dZddd.dZdd	 	 	 	 	 	 	 d/dZd0dZd1dZd1dZdddd	 	 	 	 	 	 	 	 	 d2dZ	 	 	 	 	 	 d3dZd4dZ d d!	 	 	 	 	 	 	 	 	 d5d"Z!	 	 	 	 	 	 d6d#Z"	 	 	 	 	 	 d3d$Z#	 	 	 	 	 	 	 	 	 	 d7d%Z$d&d'	 	 	 	 	 	 	 d8d(Z%dd&d)	 	 	 	 	 	 	 	 	 d9d*Z&y):z:Graph-backed Teams meeting helpers for the plugin runtime.    )annotationsN)Path)Any)quote)MeetingArtifactTeamsMeetingRef)MicrosoftGraphAPIErrorMicrosoftGraphClientc                      e Zd ZdZy)TeamsMeetingErrorz/Base class for Teams meeting pipeline failures.N__name__
__module____qualname____doc__     R/root/.hermes/venv/lib/python3.12/site-packages/plugins/teams_pipeline/meetings.pyr   r      s    9r   r   c                      e Zd ZdZy)TeamsMeetingNotFoundErrorz6Raised when the meeting cannot be resolved from Graph.Nr   r   r   r   r   r          @r   r   c                      e Zd ZdZy)!TeamsMeetingArtifactNotFoundErrorz6Raised when a transcript or recording cannot be found.Nr   r   r   r   r   r      r   r   r   c                      e Zd ZdZy)TeamsMeetingPermissionErrorz>Raised when Graph access is denied for the requested resource.Nr   r   r   r   r   r      s    Hr   r   c                p    t        | t              r| j                  n
t        |       }dt	        |d       S )Nz/communications/onlineMeetings/ safe)
isinstancer   
meeting_idstrr   )meeting_refr!   s     r   _meeting_pathr$      s4    +5k?+S''Y\]hYiJ,U:B-G,HIIr   c                   | j                   dv rt        t        |             S | j                   dk(  rt        |      S t	        t        |             S )N         )status_coder   r"   r   r   )excmissing_messages     r   _wrap_graph_errorr-   #   sC    
*$*3s844
#(99SX&&r   c                    | j                  d      }t        |t              sy |j                  d      }t        |t              sy |j                  d      }t        |t              sy |j                  d      S )N	organizeridentityuserid)getr    dict)payloadr/   r0   r1   s       r   _parse_organizer_user_idr6   +   sa    K(Ii&}}Z(Hh%<<DdD!88D>r   c                    | j                  d      }t        |t              r|j                  d      }|rt        |      S | j                  d      S )NchatInfothreadId)r3   r    r4   r"   )r5   chat	thread_ids      r   _parse_thread_idr<   8   sD    ;;z"D$HHZ(	y>!;;z""r   	tenant_idc          
        dD ci c]%  }| j                  |      || j                  |      ' }}| j                  d      }|||d<   t        t        | j                  d      xs d      j                         t	        |       | j                  d      | j                  d      t        |       |xs | j                  d      |      S c c}w )	N)subjectstartDateTimeendDateTimecreatedDateTimeparticipantsr2   r   
joinWebUrlcalendarEventIdtenantId)r!   organizer_user_idjoin_web_urlcalendar_event_idr;   r>   metadata)r3   r   r"   stripr6   r<   )r5   r>   keyrK   rD   s        r   _normalize_meeting_refrN   A   s     R;;s' 	W[[H 
 ;;~.L#/ w{{4(.B/55727;[[.!++&78"7+6w{{:6 s   *C)default_source_urlc                  t        |      }|j                  d      xs7 |j                  d      xs$ |j                  d      xs |j                  d      }|j                  d      xs |j                  d      xs |}t        | t        |j                  d      xs d      j	                         |j                  d	      xs |j                  d
      |j                  d      xs |j                  d      |||j                  d      |j                  d      xs |j                  d      |j                  d      |
      S )Nz@microsoft.graph.downloadUrldownloadUrlrecordingContentUrltranscriptContentUrlwebUrl
contentUrlr2   r   displayNamenamecontentTypefileMimeTyperC   lastModifiedDateTimemeetingEndDateTimesize)
artifact_typeartifact_iddisplay_namecontent_type
source_urldownload_url
created_atavailable_at
size_bytesrK   )r4   r3   r   r"   rL   )r]   r5   rO   rK   rb   ra   s         r   _normalize_artifactrf   U   s    G}H23 	/;;}%	/;;,-	/ ;;-.	  X&Y'++l*CYGYJ#D)/R0668[[/F7;;v3F[[/N7;;~3N!;;01[[!78]GKKH\<];;v& r   c                   t        | j                  j                  d      xs d      j                         }t	        t        | j                  xs | j                              }t	        |dv       }d}| j                  | j                  j                         }n&| j                  | j                  j                         }|||fS )Nstatusr   >   	available	completed	succeeded)r"   rK   r3   lowerintboolrb   ra   rd   	isoformatrc   )artifactrh   has_downloadis_completed	timestamps        r   _transcript_sort_keyrt   q   s    ""&&x06B7==?FtH11HX5H5HIJLv!HHILI())335					(''113	,	22r   c                ~    |j                   r|j                   S t        |        dt        |j                  d       dS )Nz/recordings/r   r   /contentrb   r$   r   r^   r#   rp   s     r   _recording_download_pathry   }   s@    $$$K()eH<P<PWY6Z5[[cddr   c                ~    |j                   r|j                   S t        |        dt        |j                  d       dS )Nz/transcripts/r   r   rv   rw   rx   s     r   _transcript_download_pathr{      s@    $$$K()uX=Q=QXZ7[6\\deer   )r!   rI   r>   c                 K   |r_	 | j                  t        |             d {   }t	        |t
              r|j                  d      st        d|       t        ||      S |r|j                  dd      }	 | j                  ddd	| di
       d {   }t	        |t
              r|j                  d      nd }t	        |t              r|st        d|       t        |d   |      S t        d      7 # t        $ r}t        |d|       |d }~ww xY w7 # t        $ r}t        |d|       |d }~ww xY ww)NzTeams meeting not found: r,   r2   r=   'z''z/communications/onlineMeetingsz$filterzJoinWebUrl eq ')paramsz&Teams meeting not found for join URL: valuer   z.Either meeting_id or join_web_url is required.)get_jsonr$   r	   r-   r    r4   r3   r   rN   replacelist
ValueError)clientr!   rI   r>   r5   r+   escaped_join_url
candidatess           r   resolve_meeting_referencer      sg     	l"OOM*,EFFG '4(D0A+.G
|,TUU%gCC'//T:		"OO0!_5E4Fa#HI ,  G .8-FW[[)D
*d+:+.TUaTb,cdd%jmyII
E
FF1 G% 	l#C;TU_T`9abhkk	l & 	#"H W 	so   E C: C8C: AE 9D DD AE 8C: :	DDDE D 	D='D88D==E c                  K   	 | j                  t        |       d       d {   }|D cg c]  }t        |t              st        d|      ! c}S 7 /# t        $ r }t        |d|j                         |d }~ww xY wc c}w w)Nz/transcriptsz'No transcripts found for Teams meeting r}   
transcriptcollect_paginatedr$   r	   r-   r!   r    r4   rf   r   r#   payloadsr+   r5   s        r   list_transcript_artifactsr      s     11];5O4PP\2]^^ GOl7R\]dfjRkg6ll _! EkF\F\E]^
 	
 mH   B A AA BBBBA 	A?A::A??Bc                z    | D cg c]  }|j                   dk(  s| }}|sy t        |t        d      d   S c c}w )Nr   T)rM   reverser   )r]   sortedrt   )r   	candidatetranscriptss      r   select_preferred_transcriptr      sD    .8dI<S<SWc<c9dKd+#7FqII es   88zutf-8encodingc                 K   t        |j                  xs d      j                  xs d}t        j                  d|d      5 }t        |j
                        }d d d        	 | j                  t        ||             d {    |j                  |      j                         }	 	 |j                  d
       |s&t!        d|j                   d|j                   d      |S # 1 sw Y   xY w7 n# t        $ r-}t        |d|j                   d|j                   	      |d }~ww xY w# t        $ r Y |w xY w# 	 j                  d
       w # t        $ r Y w w xY wxY ww)Nztranscript.vttz.txtzteams-transcript-F)prefixsuffixdeleter   zTranscript  not found for meeting r}   T)
missing_okz for meeting z was empty.)r   r_   r   tempfileNamedTemporaryFilerW   download_to_filer{   	read_textrL   r	   r-   r^   r!   unlinkOSErrorr   )	r   r#   r   r   r   handledestinationtextr+   s	            r   download_transcript_textr      sw     *))=-=>EEOF		$	$,?W\	] (ag6;;'(%%&?Z&XZefff$$h$7==?	$/ /*001{?U?U>VVab
 	
 K-( ( 	g! j4455L[McMcLde

 	  			$/ 		s   A E C#E !C1  C/$C1 'D* 9*E #C,(E /C1 1	D':(D""D''D9 *	D63E 5D66E 9E;EE	EEEEE c                   K   t        | |       d {   }t        |      }|y	 |t        | ||       d {   fS 7 *7 # t        $ r Y yw xY ww)N)NN)r   r   r   r   )r   r#   r   r   s       r   fetch_preferred_transcript_textr      se      2&+FFK,[9J!9&+z!ZZZZ G
 [, s>   A=AA ?A AA 	A
AAAc                  K   	 | j                  t        |       d       d {   }|D cg c]  }t        |t              st        d|      ! c}S 7 /# t        $ r }t        |d|j                         |d }~ww xY wc c}w w)Nz/recordingsz&No recordings found for Teams meeting r}   	recordingr   r   s        r   list_recording_artifactsr      s     11];5O4PP[2\]] FNk'Q[\ceiQjW5kk ^! D[E[E[D\]
 	
 lr   c                  K   t        |      }	 | j                  t        ||      |       d {   }|j                         t        |      |j                  d      xs |j                  |j                  d      xs |j                  dS 7 \# t        $ r-}t	        |d|j
                   d|j                         |d }~ww xY ww)Nz
Recording r   r}   re   r`   )rp   pathre   r`   )r   r   ry   r	   r-   r^   r!   to_dictr"   r3   re   r`   )r   r#   r   r   destination_pathresultr+   s          r   download_recording_artifactr      s      K(	..$[)<
 
 %%'$%jj.F)2F2F

>2Li6L6L	 
 " ()>)>(??VWbWmWmVno
 	s8   CB BB ACB 	C(B>>CCT)allow_permission_errorsc                 K   	 | j                  dt        |d              d {   }t        |t              r|j                  d      sy |j                  d	      |j                  d
      t        |j                  d      xs g       t        |      d}|j                  d      xs g }|rt        |      |d<   t        dt        |d         |j                  d      xs d|j                  d      |j                  d      |j                  d      ||d      S 7 # t        $ r?}|j                  dv r|rY d }~y |j                  dk(  rY d }~y t	        |d|       |d }~ww xY ww)Nz/communications/callRecords/r   r   r&   r)   zCall record not found: r}   r2   version
modalitiesrD   )r   r   participant_countr/   sessionssession_countcall_recordtyperT   rA   rB   )r   metrics)r]   r^   r_   ra   rc   rd   rK   )r   r   r	   r*   r-   r    r4   r3   lenr6   r   r"   )r   call_record_idr   r5   r+   r   r   s          r   fetch_call_record_artifactr     sW    j*Fu^bdGeFf(ghh gt$GKK,= ;;y)kk,/ ^!<!BC-g6	G {{:&,"H#&x= #&[[(9M;;x(;;/[[/!(W= + i! j??j(-D??c!7N~N^5_`fiijsP   E*"D DD C2E*D 	E'(E"8E*=E"E*E""E''E*r   r   c                  K   |xs |j                   j                  d      }|sy t        | t        |      |       d {   S 7 w)Nr   r   )rK   r3   r   r"   )r   r#   r   r   resolved_call_record_ids        r   enrich_meeting_with_call_recordr   ?  sQ      -Z0D0D0H0HIY0Z"+23 7   s   =AA A)r#   zTeamsMeetingRef | strreturnr"   )r+   r	   r,   r"   r   r   )r5   dict[str, Any]r   
str | None)r5   r   r>   r   r   r   )r]   r"   r5   r   rO   r   r   r   )rp   r   r   ztuple[int, int, str])r#   r   rp   r   r   r"   )
r   r
   r!   r   rI   r   r>   r   r   r   )r   r
   r#   r   r   list[MeetingArtifact])r   r   r   MeetingArtifact | None)
r   r
   r#   r   r   r   r   r"   r   r"   )r   r
   r#   r   r   z)tuple[MeetingArtifact | None, str | None])
r   r
   r#   r   r   r   r   z
str | Pathr   r   )r   r
   r   r"   r   rn   r   r   )
r   r
   r#   r   r   r   r   rn   r   r   )'r   
__future__r   r   pathlibr   typingr   urllib.parser   plugins.teams_pipeline.modelsr   r   tools.microsoft_graph_clientr	   r
   RuntimeErrorr   r   r   r   r$   r-   r6   r<   rN   rf   rt   ry   r{   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s@   @ "     J U: :A 1 AA(9 AI"3 IJ
'
# PT 0 &*	 #	
 8	3ef "# !G !G !G 	!G
 !G !GHm m m mJ     
  	B   /l l l l    	
 : %)	$ $ $ "	$
 $V "&$(   	
 " r   