
    r<j)                       d dl mZ d dlZd dlZd dlZd dlmZ d dlZd dl	Z	d dl
mZ d dlmZ  ee                                          j        Zedz  Zedz  Zedz  d	z  Zed
z  Zg dZg dZg dZ e eeez                       Z ee           dzdZd{dZd|dZd}dZd~dZ ddZ! ej"        dddd !            e!              ej#        d"            ej$        d#           ej%        5   ej&        d$            e             D ]1\  Z'Z(Z) ej*        e(rd%nd&d'e' d(z               ej$        e)           2 ej+                      ej,        d)           ddd           n# 1 swxY w Y   e-                    d*d*+           e-                    d*d*+            ej.        d,d-gd./          \  Z/Z0e/5   ej1        d0            ej,        d1d*2            ej2        d3ed4d56          Z3e3r@ e4e35                                          d7z  d7z  Z6 ej7        d8e3j'         d9e6d:d;            ej,        d<d*2            ej1        d=            e            Z8 ej9        d> e:e8;                                          d? @          Z< ej=        dAdBdCD          Z>ddd           n# 1 swxY w Y   e05   ej1        dE            ej2        dFg dGdHI          Z? ej2        dJeK          Z@ ej2        dLeK          ZA ejB        dMd4N          5   ej*        dO           ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y    ej+                      ejC        dPdQd*R          rJe3s ejD        dS            ejE                      ejF        dT          s ejD        dU            ejE                      ee3e          ZGdVH                    dW  ee?dX           ee@dY           eeAdZ          fD                       ZI ejJ        d[e3j'         d\e8e<          d]            ejK        d^d*N          5 ZK ej*        d_           	 d d`lLmMZM  ej*        da            eM eNeG                    ZOd dblLmPZP  ePeOe3j'                  ZQ ej*        dc eeQ          j'                     ej*        dd           d delRmSZSmTZT  eSeOe<e>eIf          ZU eTeUe3j'                  ZVeKW                    dgdhi           nH# eX$ r@ZYeKW                    djdki            ejZ        eY            ejE                     Y dZY[YndZY[Yww xY wddd           n# 1 swxY w Y    ej7        dl            e[eVdm          5 Z\ ej]        dne\ eeV          j'        dod*p           ddd           n# 1 swxY w Y    ejB        dqd4N          5   ee^                    dr          ds d*t          ddu         Z_e_s ej$        dv           e_D ]ZZ`e`[                    dm          5 Za ej]        dwe`j'         eae`j'        dodxe`j'         d*y           ddd           n# 1 swxY w Y   [	 ddd           dS # 1 swxY w Y   dS )    )annotationsN)Path)Document)load_dotenvinputoutputconfigzprompts.yamlz.env)mp3wavm4aaacoggogaflacwebm)mp4movm4vavimkvr   )pdfdocxtxtvttmdreturndict[str, str]c                     t                               dd          5 } t          j        |           }d d d            n# 1 swxY w Y   d |d                                         D             S )Nrutf-8)encodingc                `    i | ]+}||                     d d                                          ,S )_ )replacetitle).0ks     app.py
<dictcomp>z&load_session_types.<locals>.<dictcomp>   s4    SSSqAqyyc""((**SSS    sitzungsarten)PROMPTS_FILEopenyaml	safe_loadkeys)filer	   s     r)   load_session_typesr3      s    			3		1	1 &T%%& & & & & & & & & & & & & & &SSF?4K4P4P4R4RSSSSs   >AAfilenamestrc                   t          |           j                                        pd}t          |          j        d d         }t          |          j                                        d d         }t          j        dd|                              d          pd}| dt          j	                    j
        d d          | S )NuploadP      z[^A-Za-z0-9_. -]+r#   z ._
   )r   namestripstemsuffixlowerresubuuiduuid4hex)r4   r;   r=   r>   s       r)   safe_filenamerE   !   s    >>$$&&2(D::?3B3D$ZZ$$&&ss+F6&T2288??K8D44TZ\\%crc*4F444r+   
target_dirr   c                
   |                     dd           |t          | j                  z  }|                    d          5 }|                    |                                            d d d            n# 1 swxY w Y   |S )NTparentsexist_okwb)mkdirrE   r;   r.   write	getbuffer)uploaded_filerF   pathfs       r)   save_uploadrR   )   s    TD111m&8999D	4 +A	''))***+ + + + + + + + + + + + + + +Ks   (A88A<?A<labelc                   | sdS t          | j                  j                                        }|                                 }|dv r|                    dd          }nT|dk    rt          t          | j                  z  }t                              dd           |	                    |           t          t          |                    }d	                    d
 |j        D                       }n|dk    r	 ddlm} t          t          | j                  z  }t                              dd           |	                    |            |t          |                    }d	                    d |j        D                       }n)# t"          $ r d}Y nw xY w|                    dd          }|                                }|sdS d| d| j         d| d	S )N >   .md.txt.vttr    ignore)errorsz.docxTrH   
c              3  V   K   | ]$}|j                                         |j         V  %d S N)textr<   )r'   ps     r)   	<genexpr>z#read_text_upload.<locals>.<genexpr>?   s3      OOAOOOOOOOr+   z.pdfr   )	PdfReaderc              3  B   K   | ]}|                                 pd V  dS )rU   N)extract_text)r'   pages     r)   r`   z#read_text_upload.<locals>.<genexpr>H   s3      PP4T..006BPPPPPPr+   z9[PDF-Kontext konnte nicht automatisch ausgelesen werden.]z--- z: z ---
)r   r;   r>   r?   getvaluedecode	INPUT_DIRrE   rL   write_bytesr   r5   join
paragraphspypdfra   pages	Exceptionr<   )	rO   rS   r>   rawr^   tmp_pathdocumentra   readers	            r)   read_text_uploadrr   1   s    r-$%%,2244F

 
 
"
"C(((zz'(z33	7		}]-?@@@t444S!!!CMM**yyOO)<OOOOO	6				O'''''' =1C#D#DDHOOD4O888  %%%Ys8}}--F99PP6<PPPPPDD 	O 	O 	ONDDD	O zz'(z33::<<D r=%===-==T====s   <BF FFlist[tuple[str, bool, str]]c                    dt          t          j        d                    dfdt          t          j        dd                    t          j        dd          fddt          j        d	d
           dt          j        dd           dt          j        dd           fdt                                          pdt          t                    fgS )NzHuggingFace TokenHF_TOKENu   für WhisperX DiarizationzCodex ModellCODEX_MODELzgpt-5.5zAutoProtocol STTTAUTOPROTOCOL_WHISPER_MODELzlarge-v3z / AUTOPROTOCOL_WHISPER_DEVICEcuda!AUTOPROTOCOL_WHISPER_COMPUTE_TYPEfloat16zOutput Ordner)boolosgetenv
OUTPUT_DIRexistsr5    r+   r)   readiness_itemsr   T   s    	d29Z#8#899;VW	biyAABBBIm]fDgDghy5zBB K Ky6??K Ky<iHHK K	
 
*++--5s:G r+   Nonec                 2    t          j        dd           d S )Na  
        <style>
          :root { color-scheme: light dark; }
          .block-container {
            max-width: 1180px;
            padding-top: 1.25rem;
            padding-bottom: 5rem;
          }
          div[data-testid="stFileUploader"] section {
            min-height: 7rem;
            border-radius: 1.25rem;
            border-style: dashed;
          }
          div[data-testid="stFileUploader"] button,
          .stButton > button,
          .stDownloadButton > button {
            min-height: 3.25rem;
            border-radius: 999px;
            font-weight: 700;
          }
          textarea, input, select {
            font-size: 16px !important; /* verhindert iOS Auto-Zoom */
          }
          .mobile-card {
            border: 1px solid rgba(128,128,128,.25);
            border-radius: 1.25rem;
            padding: 1rem;
            background: rgba(128,128,128,.06);
          }
          @media (max-width: 768px) {
            .block-container { padding-left: 0.85rem; padding-right: 0.85rem; }
            h1 { font-size: 1.7rem !important; line-height: 1.15; }
            h2, h3 { font-size: 1.15rem !important; }
            div[data-testid="column"] { width: 100% !important; flex: 1 1 100% !important; }
          }
        </style>
        Tunsafe_allow_html)stmarkdownr   r+   r)   inject_mobile_cssr   c   s1    K$	J M' ' ' ' ' 'r+   zAutoprotocol Web-Appu   🎙️wideexpanded)
page_title	page_iconlayoutinitial_sidebar_stateu   🎙️ Autoprotocol Web-Appuu   iPhone/iPad-tauglicher Upload für Voice-Notizen, Audio und Videos — Protokollgenerierung via ChatGPT 5.5/CodexCLI.Statusu   ✅u   ⚠️z **z**u  
        **Mobile Hinweise**
        - iPhone Voice Memos: teilen → In Dateien sichern → hier hochladen.
        - Videos aus Fotos/Dateien werden als `.mov`/`.mp4` akzeptiert.
        - Große Videos bitte im WLAN/Tailnet laden; die Verarbeitung kann dauern.
        TrH   g      ?   large)gapz1. Aufnahme hochladenz<div class="mobile-card">r   uG   Audio/Video auswählen oder vom iPhone/iPad aus Dateien/Fotos hochladenFuS   Unterstützt u. a. iPhone Voice Memos (.m4a), Videos (.mov/.mp4), WAV/MP3 und WebM.)typeaccept_multiple_fileshelpi   zBereit: z (z.1fz MB)z</div>z2. Sitzungs-DetailszArt der Sitzungc                    t           |          S r]   )session_types)xs    r)   <lambda>r      s    mA. r+   )optionsformat_funcz(Teilnehmer & Funktionen / Namens-MappinguX   Beispiel: SPEAKER_00 = Hans Müller, Präsident
SPEAKER_01 = Anna Keller, Projektleitung   )placeholderheightz3. Kontext optionalz#Teams-/Zoom-Transkript oder Notizen)r   r   r   r   zBHilft beim Namen-Mapping und bei bereits vorhandenen Transkripten.)r   r   zTraktandenliste / Agenda)r   zLetztes Protokoll als ReferenzzDatenschutz & Betrieb)r   u   Uploads werden lokal auf diesem JARVIS-Host unter `input/` gespeichert; fertige Protokolle unter `output/`. Keine Rohdaten gehören ins Git. Zugriff von unterwegs erfolgt über dein Tailnet.u   🚀 Protokoll generierenprimary)r   use_container_widthz3Bitte zuerst eine Audio- oder Videodatei hochladen.ru   zWHF_TOKEN fehlt in `.env`. Ohne Token kann WhisperX keine Sprecher-Diarisierung starten.r[   c              #     K   | ]}||V  	d S r]   r   )r'   parts     r)   r`   r`      s>        
      r+   zTeams-/Zoom-Transkript
TraktandenzLetztes ProtokollzStarte Verarbeitung: z als .u   Verarbeitung läuft…z&1/3 Datei gespeichert und vorbereitet.)process_directzM2/3 WhisperX transkribiert Audio/Video. Das kann bei langen Aufnahmen dauern.)export_to_wordz2/3 Roh-Transkript gesichert: z43/3 ChatGPT 5.5 via CodexCLI erstellt das Protokoll.)generate_protocol_with_llmsave_llm_to_word)transcription_datasession_typeparticipants_textcontext_textzProtokoll erfolgreich generiertcomplete)rS   statezVerarbeitung fehlgeschlagenerroru%   🎉 Protokoll erfolgreich generiert!rbu-   📄 Fertiges Protokoll (.docx) herunterladenzGapplication/vnd.openxmlformats-officedocument.wordprocessingml.document)rS   data	file_namemimer   zLetzte erzeugte Protokollez*.docxc                4    |                                  j        S r]   )statst_mtime)r_   s    r)   r   r     s    16688;L r+   )keyreverser:   z Noch keine Protokolle vorhanden.u   ⬇️ z	download-)rS   r   r   r   r   r   )r   r   )r4   r5   r   r5   )rF   r   r   r   )rS   r5   r   r5   )r   rs   )r   r   )b
__future__r   r}   r@   rB   pathlibr   	streamlitr   r/   r   r   dotenvr   __file__resolveparentBASE_DIRrg   r   r-   ENV_FILEAUDIO_TYPESVIDEO_TYPESCONTEXT_TYPESsortedsetMEDIA_TYPESr3   rE   rR   rr   r   r   set_page_configr&   captionsidebarheaderr;   okdetailrM   dividerr   rL   columnsleftright	subheaderfile_uploader
media_filelenrN   size_mbsuccessr   	selectboxlistr1   selected_type	text_area
teilnehmerteams_transcriptagendalast_protocolexpanderbuttonr   stopr~   saved_media_pathri   r   infostatusautoprotocolr   r5   transcript_datar   transcript_pathllm_processorr   r   
llm_output	word_pathupdaterm   exc	exceptionr.   r2   download_buttonglobdocsdoc_pathrQ   r   r+   r)   <module>r      s   " " " " " " 				 				                        4>>!!##*w	 
("^3fHHH999333fSS{23344 H   T T T T5 5 5 5    >  >  >  >F   ( ( ( (V  %$	         	' ( ( ( 

  C  D  D  DZ  BIh+O--  b&2+%%8~T~~~=>>>
6BJLLLBK	                 
t , , , 
    - - -bj$000e	  BL()))BK+tDDDD!!Q#b	  J  D#j**,,--4t;
BjoBBBBBBCCCBKD1111BL&'''&&((M BL]''))**..  M
 2o  J+              6  
 
BL&''''r'-)))Q  
 R8}MMMF$B$%EMZZZM	,u	=	=	= 
 
a	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
29(ydSSS 9
 FGGG			29Z   jkkk			"{:y9999   -/GHHV\22],?@@
    L BGYJOYY-:VYYYZZZ	+d	;	;	; v9:::	333333BHdeee,nSS1A-B-BCCO333333,n_joNNOBHRdd?6K6K6PRRSSSBHKLLLRRRRRRRR33#2*",)	  J )(Z_EEIMM AMTTTT 	 	 	MM =WMMMMBLBGIIIIIIII	/              8 BJ6777	i		 
$Ad9oo*Z $	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 R[->>>  6*//(++1L1LVZ[[[\_]_\_`D 7
5666 	 	]]4   	AB///"-^///$(   	 	 	 	 	 	 	 	 	 	 	 	 	 	 			                 s   1A,E))E-0E-;C'J..J25J2;AML4(M4L8	8M;L8	<MMM	U!B1TU!U6UU!UU!!U%(U%$V88V<?V<AY=+,Y#Y=#Y''Y=*Y'+Y==ZZ