
    G9i                    <   U 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Zd dlZd dlZd dl	Z	d dl
Z
d dlmZmZ 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Zd dlmZmZ 	 d dlmZ n# e$ r dZY nw xY wd dlmZ d dlmZ d dlm Z m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( d dl)Z)d dl*Z+d d	l,m-Z- ej.        /                    d
d           	  e0ej1        d          rej1        2                    d            e0ej3        d          rej3        2                    d           n# e4$ r Y nw xY w ee5          6                                j7        Z8da9da:da;i Z<e$e=e+j>        j?        f         e@d<   dZAdZBdZCdZDdZEdZFdZGdZHg dZIdZJdZKdZLdZM ejN        dd           e	  ed          ZOn# e4$ r eZOY nw xY weZOdde&e         d e=fd!ZPd efd"ZQ eQ            ZRd# ZSd$ ZTd% ZUd&e=d efd'ZVd(e=d e+j>        j?        fd)ZWd(e=d*e=d+eXd,e$e=e=f         d-e=d e=fd.ZYd/ZZd0Z[d1Z\d2Z]d3Z^ ee5          _                    d4          `                    d5          Zaeab                                r7ej.        c                    d6d7          ejd        z    e=ea          z   ej.        d6<   dd8Ze ee              ee5          _                    d9          Zf ee5          _                    d:          Zgd;Zhd<ZidZjd=Zkd>Zld?Zmd@ZndAZodZp ejq        dBdC          dCk    Zr esd et ejq        dDdE                              Zu esdF ev ejq        dGdH                              Zw ee5          _                    dI          ZxdJZy ee5          _                    dK          ZzezdLz  Z{dMe=dNe#d e=fdOZ|e G dP dQ                      Z}e G dR dS                      Z~e G dT dU                      Ze G dV dW                      Ze G dX dY                      Ze G dZ d[                      Zdd]e=d^etd e=fd_Zd`etdaedbe=d e=fdcZ	 dddedeedfevd efdgZdhe#die#d e#fdjZdhe&e=         d e=fdkZdle j        d e%e         fdmZdne'e}         doevdpevdqetdre'e         d e%e         fdsZdte'e=         d e j        fduZdle j        d e&e         fdvZ	 	 ddne'e}         dyetdzetd e%e$e=e#f                  fd{Zd|e'e$e=e#f                  doevdpevd}etd e=f
d~Zddddede=de&e=         de&e$e=e#f                  d e=f
dZdddede=de=d e=fdZde=d e&e#         fdZdddede=de&e=         d e&e#         fdZded e%e}         fdZd]e=d e=fdZdne'e}         d dfdZddddne'e}         dyetdzetd e%e%e$e=e#f                           fdZd|e'e$e=e#f                  d e=fdZdne'e}         de'e$e=e#f                  d etfdZdne'e}         de&e         d etfdZdevdevdevdevd evf
dZdne'e}         devdevd e(eve%e}         f         fdZdne'e}         doevdpevd}etded e%e         fdZd	daedetd e=fdZd
daedetd e=fdZdaeded e&e=         fdZdaeded e&e$e=e=f                  fdZdde=de=detd e%e=         fdZde=de=daede'e=         detde'e=         d e=fdZdaeded e&e=         fdZdde=devd e&e=         fdZd]e=d e=fdZde=daed efdZde=d e=fdZde=de=d e=fdZde=d e=fdZdd]e=detdetd e=fdÄZde=d e=fdĄZh dţZdde=detd e%e=         fdƄZdaed e=fdǄZde'e         de&e         d dfdɄZdne'e}         doevdpevd}etd e%e         f
dʄZdevd e=fd̄Zdevd e=fd̈́Zd]e=d e=fd΄Zd]e=detd e=fdЄZeGfdaedetd e%e$e=e#f                  fd҄Zd]e=d e%e=         fdӄZ	 dddddלdaededetdede&e         de=d efd݄Zdaeded dfd߄Zd efdZdhevdevdevd evfdZ G d d          Zdede'e         d dfdZde'e=         d dfdZded e=fdZ	 	 ddede&e~         de=de&e=         de&e         d e=fdZ	 ddaedede=detd e(eeee&e         f         f
dZ	 ddedaedede=de=dede=de&e         d efdZdle j        d efdZde$e=e=f         de%e(e=e=e=eXf                  d e(e=eXf         fdZ	 	 dde=de&e         de$e=e#f         detde&e$e=e#f                  d dfd Zdle j        d dfdZdte'e=         d e&e         fdZeɐdk    r eej        dd                    dS dS (      N)ThreadPoolExecutorTimeoutError)datetimeUTC)ZoneInfo)	dataclass)Path)BaseHTTPRequestHandlerThreadingHTTPServer)AnyDictListOptionalSequenceTuple)urlsplitPYTHONIOENCODINGutf-8reconfigureencoding_HTTP_CONNECTIONSz	video.mp4cortessmallg      6@g      C@      x   )u   🔥u   ⚡u   🚀u   🎯u   😲'AIzaSyCxZfjzfQtWtUMuffzP0xK2it6z7zujQp4z1https://n8n.gudanbolizante.site/webhook/tvthathi1z.https://n8n.gudanbolizante.site/webhook/cortes)z*.mp4z*.movz*.m4vz*.mkvz*.aviz*.mxfz	video/mxfz.mxfzAmerica/Sao_Paulodtreturnc                     | pt          j        t                    }	 |                    t                                                    S # t          $ r |                                cY S w xY w)zY
    Retorna timestamp ISO em horario de Sao Paulo sem depender do fuso do servidor.
    )r   nowr   
astimezoneSAO_PAULO_TZ	isoformat	Exception)r   bases     !/root/maquina/NOVA/CORTES/main.pyisoformat_sao_paulor)   M   sl     "c""D |,,66888      ~~ s   +A	 	A*)A*c                  ~   t          j        d          pt          j        d          } | r!t          |                                           S t          dz  t          d          g}|D ];}t          |                                          }|                                r|c S <t          dz                                  S )N	INBOX_DIR	INPUT_DIRinz/home/user157/in)osgetenvr	   
expanduserROOT_DIRexists)	env_value
candidates	candidateexpandeds       r(   _resolve_inbox_dirr7   X   s    	+&&@")K*@*@I ,I))+++T/4(:#;#;<J  		??--//?? 	OOO	tO'')))    c                      t           t           S 	 t          j        d          a n"# t          $ r} t	          d          | d } ~ ww xY wt           S )NwhisperzMBiblioteca 'whisper' nao encontrada. Instale 'openai-whisper' para continuar.)r:   	importlibimport_moduleImportErrorRuntimeError)excs    r(   ensure_whisper_moduler@   g   sb    ))44   [
 
	 Ns   % 
A?Ac                  |    t           t           S 	 t          j        d          a n# t          $ r d a Y nw xY wt           S )Ncv2)rB   r;   r<   r=    r8   r(   ensure_cv2_modulerD   t   sL    

%e,,   J   % 44c                  |    t           t           S 	 t          j        d          a n# t          $ r d a Y nw xY wt           S )N	mediapipe)mpr;   r<   r=   rC   r8   r(   ensure_mediapipe_modulerI      sL    	~	$[11   IrE   rawc                    | st          d          t          |                                           }|g}|                                sS|                    t
          | z                                             t          r|                    t          | z             |D ]}|                                r|c S d                    d |D                       }t          d|           )Nz$Nenhum arquivo de entrada informado., c              3   4   K   | ]}t          |          V  d S N)str).0paths     r(   	<genexpr>z%resolve_input_file.<locals>.<genexpr>   s(      ==#d))======r8   z,Video nao encontrado. Caminhos verificados: )	FileNotFoundErrorr	   r0   is_absoluteappendr1   r+   r2   join)rJ   r5   search_pathsrQ   	attempteds        r(   resolve_input_filerY      s     H FGGGS		$$&&I ){L  "" 1X^7799::: 	1	C000  ;;== 	KKK			=======I
V9VV
W
WWr8   hostc                     t                               |           }||S t          j                            | d          }|t           | <   |S )N<   timeout)r   gethttpclientHTTPSConnection)rZ   conns     r(   _get_https_connectionrd      sJ      &&D;&&tR&88D"dKr8   rQ   dataheaderslabelc                    t          |           }	 |                    d|||           |                                }|                                                    dd          }ny# t
          $ rl}	 |                                 t                              | d            n # t                              | d            w xY wt          d| d|           |d }~ww xY w|j
        dk    rt          | d	|j
         d|           |S )
NPOST)bodyrf   r   replaceerrorszFalha ao conectar no :   z retornou erro HTTP )rd   requestgetresponsereaddecoder&   closer   popr>   status)	rZ   rQ   re   rf   rg   rc   responserj   r?   s	            r(   _perform_https_postrx      s*    !&&D	LVTg>>>##%%}}%%gi%@@ L L L	.JJLLL!!$----!!$----A5AACAABBKL #eRRRRDRRSSSKs*   AA( (
C3B#C#C  CCaa  Voce e um editor experiente em cortes virais para TikTok e Instagram.
Analise os segmentos abaixo e selecione ate {top_k} trechos com maior potencial de viralizar.
Cada trecho precisa ter entre {min_dur:.1f}s e {max_dur:.1f}s. Priorize momentos emotivos, opinioes fortes, historias curiosas, humor ou revelacoes. Evite longos periodos de silencio.
Responda exclusivamente em JSON com a estrutura:
{{"highlights":[{{"start":12.3,"end":34.5,"reason":"motivo do corte"}},...]}}
Use segundos absolutos do video. Se nao houver um bom trecho, retorne uma lista vazia.
SEGMENTOS (indice|inicio|fim|fala):
{segments}
a  Voce e um revisor profissional de portugues falado no Brasil. Algumas falas transcritas pelo modelo de ASR ficaram com erros ortograficos ou de reconhecimento de fala.
Ajuste apenas as palavras incorretas mantendo girias, tom e sentido original. Nao invente conteudo novo e nao traduza.
Retorne apenas JSON com a estrutura {{"segments":[{{"index":0,"text":"fala corrigida"}},...]}}.
Seguem as falas no formato indice|inicio|fim|texto:
{segments}
aF  Voce e um jornalista brasileiro preparando uma descricao de cunho jornalistico para redes sociais. A partir da transcricao do corte, escreva um texto com estrutura de lead: apresente o fato principal na primeira frase, traga detalhes essenciais nas frases seguintes e feche com contexto adicional ou proximos passos.
Use entre 4 e 5 frases, mantenha tom informativo, objetivo e respeitoso, evitando opinioes pessoais.
Inclua ate 4 hashtags em portugues do Brasil que reflitam o conteudo noticioso.
Transcricao:
{transcript}
---
Retorne apenas a descricao final, sem texto adicional.a~  Voce e uma especialista em titulos. Use o texto abaixo (captions.txt) e escreva UM titulo curto e natural que resuma o fato principal.
Regras simples:
- Ate 45 caracteres.
- Sem emojis, hashtags, aspas ou ponto final.
- Frase coerente e direta em portugues, sem inventar nada alem do texto base.
TEXTO BASE (caption):
{transcript}
Retorne apenas JSON valido: {"title":"TEXTO AQUI"}
aK  Voce e um redator senior de portal de noticias brasileiro.
Com base na transcricao do corte, elabore uma materia completa, objetiva e aprofundada.
Produza um titulo informativo e impactante e um texto com pelo menos 8 paragrafos curtos.
Comece com um lead que resuma o fato principal, desenvolva com detalhes, contexto, repercussao e proximos passos.
Mantenha rigor jornalistico, citando dados concretos quando possivel e evitando opinioes pessoais.
Retorne apenas JSON valido no formato {{"title":"TITULO","article":"TEXTO EM MULTIPLOS PARAGRAFOS"}}.
Transcricao integral:
{transcript}
z1ffmpeg-2025-10-05-git-6231fa7fb7-essentials_buildbinPATH c                     t           j        dk    rd S g } t                                          rvdD ]s}t          |z  }|                                r|                     |           |                    d          }|                                r|                     |           tdD ]:}t          |          }|                                r|                     |           ;| D ]h}	 |                                j        }t          j	        ||t          j
        z  t          j        z  t          j        z             Y# t          $ r Y ew xY wd S )Nnt)ffmpegffprobez.exe)r.   name
FFMPEG_DIRr2   rU   with_suffixr	   statst_modechmodS_IXUSRS_IXGRPS_IXOTHOSError)r4   r   r'   exerQ   current_modes         r(   ensure_ffmpeg_permissionsr      sW   	w$J ') 	' 	'D$D{{}} (!!$'''""6**Czz|| '!!#&&&% $ $Dzz;;== 	$d###  	99;;.LHT<$,6ETUUUU 	 	 	H		 s   &AD<<
E	E	zlogo.pngz	logo2.png      r\   #   U   i     CUTS_FAST_MODE1AI_RETRY_ATTEMPTS3      ?AI_RETRY_DELAYz2.5z	fundo.jpgz	1080:1920fontszAnton-Regular.ttftemplatekwargsc                    	  | j         d	i S # t          $ r t          j        d          }i dt          j        t
                   dt
          ffd}|                    ||           }|                    dd                              dd          }                                D ]'\  }\  }}|                    |d|z   |z   dz             }( |j         d	i cY S w xY w)
Nz\{(\w+)(:[^}]*)?\}matchr    c                     |                      d          }|                      d          pd}|v r!d|                                 d}||f|<   |S |                      d          S )Nr      r{   __FMT_PLACEHOLDER___r   )groupupper)r   keyspectokenr   placeholderss       r(   replz"safe_format_template.<locals>.repl,  sj    ++a..C;;q>>'RDf}}<SYY[[<<<'*DkU#;;q>>!r8   {z{{}z}}rC   )	formatKeyErrorrecompileMatchrO   subrk   items)	r   r   patternr   tempr   r   r   r   s	    `      @r(   safe_format_templater   %  s%   %x((((( % % %*23335	" 	"# 	" 	" 	" 	" 	" 	" 	" {{4**||C&&..sD99"."4"4"6"6 	? 	?E;C<<sSy4'7#'=>>DDt{$$V$$$$$#%s    CC"!C"c                   z    e Zd ZU eed<   eed<   eed<   eed<   eed<   edefd            Zedefd            Z	d	S )
Segmentstartendtextavg_logprobno_speech_probr    c                 <    t          d| j        | j        z
            S )NMbP?)maxr   r   selfs    r(   durationzSegment.durationD  s    4DJ.///r8   c                 j    t          dt          | j                                                            S Nr   )r   lenr   splitr   s    r(   
word_countzSegment.word_countH  s&    1c$)//++,,---r8   N)
__name__
__module____qualname__float__annotations__rO   propertyr   intr   rC   r8   r(   r   r   <  s         LLL	JJJ
III0% 0 0 0 X0 .C . . . X. . .r8   r   c                   b    e Zd ZU eed<   eed<   eed<   eed<   dZeed<   dZeed<   dZeed	<   d
S )
CropWindowxywidthheight        
confidencer   
detectionssamplesN)	r   r   r   r   r   r   r   r   r   rC   r8   r(   r   r   M  sf         
FFF
FFFJJJKKKJJGSr8   r   c                       e Zd ZU eed<   eed<   eed<   ee         ed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zee         ed<   edefd            ZddedefdZd
S )HighlightCandidater   r   scoresegmentsr{   reasontitleunknownoriginNcropr    c                      | j         | j        z
  S rN   )r   r   r   s    r(   r   zHighlightCandidate.durationc  s    x$*$$r8      limitc                     d                     d | j        D                       }t          |          |k    r|d |dz
           dz   n|S )N c              3   2   K   | ]}|j         	|j         V  d S rN   r   rP   segs     r(   rR   z-HighlightCandidate.preview.<locals>.<genexpr>h  s+      FFSSXFFFFFFFr8      ...)rV   r   r   )r   r   r   s      r(   previewzHighlightCandidate.previewg  sQ    xxFFDMFFFFF.1$ii%.?.?[uqy[!E))TIr8   )r   )r   r   r   r   r   r   r   r   rO   r   r   r   r   r   r   r   r   r   rC   r8   r(   r   r   X  s         LLL	JJJLLL7mFCE3OOOFC!%D(:
%%%%% % % % X%J JS J3 J J J J J Jr8   r   c                       e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   ee         ed<   ee         ed<   eed<   eed<   eed<   ee         ed<   ee         ed<   dZ	eed<   dS )GeneratedCutindex	base_namer   r   r   r   r   r   r   r   
zoom_video	fit_videoass_fillass_fitsrtcaptionportal_articler{   portal_titleN)
r   r   r   r   r   rO   r   r   r	   r   rC   r8   r(   r   r   l  s         JJJNNNLLL	JJJOOOLLLKKKJJJKKKLLL~NNNMMM	IIId^TN"""L#r8   r   c                   X    e Zd ZU eed<   eed<   eed<   eed<   eed<   ee         ed<   dS )PipelineSummary
input_path
output_dirrun_tag
started_atfinished_at
highlightsN)	r   r   r   r	   r   rO   r   r   r   rC   r8   r(   r   r     s\         LLL\""""""r8   r   c                   8    e Zd ZU eed<   eed<   eed<   eed<   dS )AIConfigprovidermodelapi_keytemperatureN)r   r   r   rO   r   r   rC   r8   r(   r  r    s9         MMMJJJLLLr8   r  0   r   
max_lengthc                 j   t          j        d|           }|                    dd                              d          }t	          j        dd|                              d                                          }t	          j        dd|          }|sdS |d|                             d          }|p|S )	zFTransforma texto livre em um fragmento amigavel para nomes de arquivo.NFKDasciiignorez[^a-zA-Z0-9]+-z-{2,}r{   N)	unicodedata	normalizeencoders   r   r   striplowerrstrip)r   r  
normalized
ascii_textcleanedtrimmeds         r(   slugify_for_filenamer    s    &vt44J""7H55<<WEEJf%sJ77==cBBHHJJGfXsG,,G rkzk"))#..Ggr8   r   	highlightr   c                    |j         p|                                }t          |          }|sRt          t	          |j        dz                      }t          t	          |j        dz                      }|dd|dd}d| d| dd| S )zHGera um nome base estavel e organizado para todos os artefatos do corte.  06dzms-mscorte__02d)r   r   r  r   roundr   r   )r   r  r   slug_sourceslugstart_msend_mss          r(   build_output_stemr%    s    /8Y%6%6%8%8K,,D 2uY_t34455U9=4/0011111611110G00e000$000r8   ab	tolerancec                     t          | j        |j        z
            |k     ot          | j        |j        z
            |k     S rN   )absr   r   )r&  r'  r(  s      r(   highlights_are_similarr+    s:     qw !!I-P#aeaem2D2Dy2PPr8   value	referencec                    t          |t                    rLt          | t                    r(|                                                                 dv S t          |           S t          |t
                    r$t          |t                    st          |           S t          |t                    rt          |           S | S )N>   r   onsimyestrue)
isinstanceboolrO   r  r  r   r   )r,  r-  s     r(   coerce_typer5    s    )T"" eS!! 	N;;==&&((,MMME{{)S!! *Y*E*E 5zz)U## U||Lr8   c                     | 1t          j        d          }||                                S t          S |                                 S )NCORTES_NOTIFY_WEBHOOK)r.   r/   r  DEFAULT_NOTIFY_WEBHOOK)r,  envs     r(   resolve_notify_webhookr:    s>    }i/00?99;;%%;;==r8   argsc                 Z   | j         r| j         t          k    rt          j                    n*t          | j                                                   j        }t          | j                                                  }g }d t          D             }t                      }g }|	                                r|
                    |           t          	 	                                r0t          fd|D                       s|
                               n# t          $ r Y nw xY w|D ]}	 t          |                                          }n# t          $ r Y 1w xY w|D ]}	|	                                s|	j                                        t          fd|D                       sL                    d          rb|	                                }
|
|v r{||
j        v s|
|k    r|
                    |
           |                    |
           |                                 |S )Nc                     g | ]G}|                     d           r|dd                                         n|                                HS )z*.r   N)
startswithr  )rP   r   s     r(   
<listcomp>z)discover_batch_inputs.<locals>.<listcomp>  s\         '11$77LW]]__  r8   c              3   B   K   | ]}                     |          V  d S rN   )samefile)rP   r
inbox_roots     r(   rR   z(discover_batch_inputs.<locals>.<genexpr>  s1      *Q*Qa:+>+>q+A+A*Q*Q*Q*Q*Q*Qr8   c              3   B   K   | ]}                     |          V  d S rN   )endswith)rP   suffix
name_lowers     r(   rR   z(discover_batch_inputs.<locals>.<genexpr>  s1      JJvz**622JJJJJJr8   r  )inputDEFAULT_INPUTr	   cwdresolveparentr   SUPPORTED_BATCH_PATTERNSsetr2   rU   r+   anyr   listiterdiris_filer   r  r>  parentsaddsort)r;  search_rootr   r4   suffixesseenrootsrootentriesrQ   resolvedrC  rG  s              @@r(   discover_batch_inputsr]    sf   $(Jt$*2M2M$(***SWX\XbScScSkSkSmSmStKdo&&..00JJ /  H eeDE "[!!!J 	%s*Q*Q*Q*Q5*Q*Q*Q'Q'Q 	%LL$$$     	4<<>>**GG 	 	 	H	 	 	D<<>> **JJJJJJJJJJ $$X.. ||~~H4X---Z1G1Gh'''HHX	 OOs%   AD 
D$#D$,!E
EEr   min_durmax_durrequiredexistingc                     |dk    s| sg S | d         j         }| d         j        }t          d||z
            }t          |t          ||t          t	          |          |z   d          z                      }t          |dz  |dz  d          }	g }
|}||z   |dz   k    r&|
                    |           ||	z  }||z   |dz   k    &|
s|g}
g }|
D ]}}t          |||z             }||z
  |k     rt          | ||          \  }}|t          d          k    s|sI|                    t          |||t          |          d	                     ~|
                    d
 d           t          |dz  |          }|d |         S )Nr   r   r   r          @-inffallbackr   r   r   r   r   c                     | j         S rN   r   cs    r(   <lambda>z.generate_fallback_highlights.<locals>.<lambda>      !' r8   Tr   reverser   )r   r   r   minr   rU   score_windowr   r   rP  rU  )r   r^  r_  r`  ra  total_start	total_endtotal_durationtarget_durationstepstartscurrentr4   r   r   r   selectedr   s                     r(   generate_fallback_highlightsrz    s    1}}H}	1+#K Iy;677N'3wS]]U]E]_`AaAa0a#b#bccO$gmS99DFG
G
y4/
/
/g4 G
y4/
/
/  +-J 
 
)U_455;  &x<<xE&MM!!!h!  	
 	
 	
 	
 OO))4O8881h''Efufr8   argvc                 8   t          j        d          pt          j        d          pd}t          j        d          pt          j        d          }	 |rt          |          nd}n# t          $ r d}Y nw xY wt	          j        d          }|                    d	t          d
           |                    dt          d           |                    dt          d           |                    dt          t          d           |                    dt          t          d           |                    dt          t          d           |                    dg ddd           |                    ddd           |                    dd d!"           |                    d#d$g d%d&'           |                    d(d d)           |                    d*t          d+d,           |                    d-d d.           |                    d/d d0           |                    d1t          d2d3           |                    d4d d5"           |                    d6|d7           |                    d8t          |d9           |                    |           S ):NCORTES_HOSTHOSTz0.0.0.0CORTES_PORTPORTi="  zDGera automaticamente o melhor corte vertical com legendas dinamicas.)descriptionz--inputzArquivo de video de entrada.)defaulthelpz--output-dirz"Pasta onde os cortes serao salvos.z--modelzModelo Whisper a ser utilizado.z--min-durationz$Duracao minima do corte em segundos.)typer  r  z--max-durationz$Duracao maxima do corte em segundos.z--topz)Quantidade de melhores cortes a exportar.z	--variant)zoomfitbothr  z9Formato do corte vertical a exportar (zoom, fit ou both).)choicesr  r  z--langptzIdioma dominante do video.z--batch-all
store_truez@Processa todos os arquivos de video encontrados automaticamente.)actionr  z--ai-providergemini)autononeopenair  z>Provedor de IA para escolher o melhor trecho (padrao: gemini).)r  r  r  z
--ai-modelzFModelo do provedor de IA (opcional, usa um padrao para cada provedor).z--ai-temperature皙?z\Temperatura da IA ao selecionar o corte (valores baixos focam em respostas deterministicas).--gemini-keyzYChave de API do Gemini (sobrescreve variaveis de ambiente GEMINI_API_KEY/GOOGLE_API_KEY).z--notify-webhookz|URL para receber os resultados do processamento via POST. Use string vazia para desabilitar (padrao envia para webhook N8N).z--notify-timeout-   zGTimeout (em segundos) para a requisicao HTTP de notificacao do webhook.z--serve-webhookzIInicia um servidor HTTP que permite disparar cortes via requisicoes POST.z--serve-hostzeHost/interface para o servidor de webhook (padrao: 0.0.0.0 ou variavel de ambiente CORTES_HOST/HOST).z--serve-portzIPorta do servidor de webhook (padrao: 8765 ou variavel CORTES_PORT/PORT).)r.   r/   r   
ValueErrorargparseArgumentParseradd_argumentrI  DEFAULT_OUTPUT_DIRDEFAULT_MODELr   DEFAULT_MIN_DURDEFAULT_MAX_DURDEFAULT_TOP_K
parse_args)r{  env_hostenv_port_rawenv_portparsers        r(   r  r    sq   y''I29V+<+<I	H9]++@ry/@/@L(4>3|$$$$   $Z  F 	=?]^^^
0BImnnn
	=?`aaa
3	     3	     c=Grsss
'''H	     $5QRRR
l  BD  E  E  E
444M	     U    
 k	     h    
 Q	     V	     X    
 t    
 X	     T"""s   A( (A76A7c                    | j         p.t          j        d          pt          j        d          pt          }| j                                        }|dk    r|rd}nt          j        d          rd}nd}|dk    rt          d          |dk    rFt          j        d          }|st          d	          | j        pd
}t          d||| j	                  S |dk    r|}|st          d          | j         rd}n-t          j        d          st          j        d          rd}nd}t          d| d           |t          j        d<   | j        pd}t          d||| j	                  S t          j                            d| d           d S )NGEMINI_API_KEYGOOGLE_API_KEYr  r  OPENAI_API_KEYr  r  z_Nenhum provedor de IA configurado. Defina GEMINI_API_KEY (ou GOOGLE_API_KEY) antes de executar.z,[IA] Variavel OPENAI_API_KEY nao encontrada.zgpt-4o-mini)r  r  r  r  ze[IA] Chave do Gemini nao encontrada. Defina --gemini-key ou a variavel GEMINI_API_KEY/GOOGLE_API_KEY.r  zvariavel de ambiente existentezDEFAULT_GEMINI_KEY embutidaz%[IA] Usando chave Gemini a partir de .zgemini-2.5-flashz[IA] Provedor desconhecido: 
)
gemini_keyr.   r/   DEFAULT_GEMINI_KEYai_providerr  r>   ai_modelr  ai_temperatureprintenvironsysstderrwrite)r;  provided_gemini_keyr  r  r  sources         r(   resolve_ai_configr  x  s    	9%&&	9%&&	 	  %%''H6 	HHY'(( 	HHH6m
 
 	
 8),-- 	OMNNN.UYUhiiii8% 	w   ? 	3#FFY'(( 	3BI6F,G,G 	35FF2F?f???@@@'.
#$3!3UYUhiiiiJ@H@@@AAA4r8   .     	max_charsmax_segmentsc                 X   g }d}t          |           D ]\  }}d                    |j                                                                                  }|sGt          |          dk    r|d d         dz   }|t          |j        d          t          |j        d          t          |j	        d          |d}t          j        |d	          }	|r|t          |	          z   |k    r n>|                    |           |t          |	          z  }t          |          |k    r n|S )
Nr   r         r   r   )r   r   r   r   r   Fensure_ascii)	enumeraterV   r   r  r   r   r   r   r   r   jsondumpsrU   )
r   r  r  preparedtotal_charsidxr   r   entryencodeds
             r(   prepare_segments_for_air    s7   
 &(HKh''  Sxx((..0011 	t99s??:%D39a((!$$clA..
 
 *U777 	c'll2Y>>Es7||#x==L((E )Or8   r[  top_kc                 *   d | D             }d                     |          }t          j        d          pt          }	 t	          |||||          S # t
          $ r6}t          d| d           t	          t          ||||          cY d }~S d }~ww xY w)Nc           
      X    g | ]'}|d           d|d          d|d          d|d          (S r   |r   r   r   rC   rP   items     r(   r?  z#build_ai_prompt.<locals>.<listcomp>  V        =GG4=GG4;GGfGG  r8   r  PROMPT_HIGHLIGHT_SELECTION)r  r^  r_  r   z7[PROMPT] Falha ao formatar PROMPT_HIGHLIGHT_SELECTION (); usando padrao.)rV   r.   r/   "DEFAULT_PROMPT_HIGHLIGHT_SELECTIONr   r&   r  )r[  r^  r_  r  linessegments_blobr   r?   s           r(   build_ai_promptr    s       E IIe$$My566\:\H
#"
 
 
 	
  
 
 
^^^^___#."
 
 
 	
 	
 	
 	
 	
 	

s   A 
B+BBBsystem_promptresponse_formatconfigpromptr  r  c                   |pd}|ddi}| j         t          dt          d| j                            |d|dd|dgd	}t	          j        |                              d
          }d| j         dd}t          dd||d          }t	          j	        |          }|
                    d          pg }	|	st          d          |	d         
                    d          pi }
|

                    d          }|st          d          |S )NzUVoce e um assistente que retorna apenas JSON valido. Nao adicione texto fora do JSON.r  json_objectr   rd  system)rolecontentuser)r  r  r  messagesr   zBearer application/json)AuthorizationContent-Typezapi.openai.comz/v1/chat/completionsOpenAIr  z%OpenAI retornou resposta sem choices.r   messager  zOpenAI retornou resposta vazia.)r  r   rp  r  r  r  r  r  rx   loadsr_   r>   )r  r  r  r  payloadre   rf   rj   parsedr  r  r  s               r(   call_openai_chatr    sH    " _  !=13C); < <==*-88//
	 G :g%%g..D36>33* G /1GwX`aaDZFjj##)rG DBCCCajnnY''-2Gkk)$$G ><===Nr8   r  response_mime_typer  c                   d| j          d| j         }dd|igigt          dt          d| j                            |dd}t          j        |                              d	          }t          |          }|j	        pd
}|j
        r| d|j
         }t          |j        pd||ddid          }t          j        |          }	|	                    d          pg }
|
st          d          |
d         }|                    d          pi }|                    d          pg }|st          d          |d                             d          }|st          d          |S )Nz8https://generativelanguage.googleapis.com/v1beta/models/z:generateContent?key=partsr   r   rd  )r  responseMimeType)contentsgenerationConfigr   /?z!generativelanguage.googleapis.comr  r  Geminir4   z(Gemini retornou resposta sem candidatos.r   r  zGemini retornou resposta vazia.zGemini nao retornou texto.)r  r  r   rp  r  r  r  r  r   rQ   queryrx   hostnamer  r_   r>   )r  r  r  urlr  re   
parsed_urlrQ   rj   r  r4   firstr  r  r   s                  r(   call_gemini_generater    s   	!6< 	! 	!	! 	! 
  0123sCV-?$@$@AA 2
 
 G :g%%g..D#J?!cD ,++)++BB	+, D ZFL))/RJ GEFFFqMEii	""(bGKK  &BE ><===8<<D 97888Kr8   raw_textc                    | sd S |                                  } 	 t          j        |           S # t          j        $ r Y nw xY wt	          j        d| t          j                  }|r?|                    d          }	 t          j        |          S # t          j        $ r Y nw xY wt	          j        d| t          j                  }|r?|                    d          }	 t          j        |          S # t          j        $ r Y nw xY wd S )Nz\{.*\}r   z\[.*\])r  r  r  JSONDecodeErrorr   searchDOTALLr   )r  	obj_matchsnippetarray_matchs       r(   extract_json_payloadr  ;  s-    t~~Hz(###    	)Xry99I //!$$	:g&&&# 	 	 	D	 )Ix;;K ##A&&	:g&&&# 	 	 	D	4s2   . A A ;B B! B!C0 0DDr  c                    | j         dk    rt          | ||ddi          }n | j         dk    rt          | |d          }nd S t          |          S )Nr  r  r  r  r  r  r  )r  r  r  r  )r  r  r  rJ   s       r(   request_ai_jsonr  V  sq     (""'#]3	
 
 
 
H	$	$"66FXYYYt$$$r8   resultc                    g }|                      dg           D ]}|                    t          t          |                     dd                    t          |                     dd                    t	          |                     dd                                                    t          |                     dd                    t          |                     d	d
                                         |S )Nr   r   r   r   r   r{   r         r         ?r   r   r   r   r   )r_   rU   r   r   rO   r  )r  r   r   s      r(   load_segmentsr
  j  s     Hzz*b)) 	
 	
CGGGS1122#''%--..,,--3355!#''-">">??$SWW-=s%C%CDD  	
 	
 	
 	
 Or8   c                 R   |                      dd                               dd          } |                      dd                               dd          } |                      dd                               d	d          } t          j        d
d|                                           } | S )Nu   –r  u   —u   “"u   ”u   ‘'u   ’\s+r   )rk   r   r   r  r   s    r(   normalize_segment_textr  y  s    <<#&&..x==D<<#&&..x==D<<#&&..x==D6&#tzz||,,DKr8   c                 B    | D ]}t          |j                  |_        d S rN   )r  r   )r   r   s     r(   normalize_segments_in_placer    s.     4 4)#(334 4r8   i'     )r  r  c                   g }g }d}t          |           D ]\  }}t          |j                  }|s|t          |j        d          t          |j        d          |d}	t          t          j        |	d                    }
|r5||
z   |k    st          |          |k    r|	                    |           g }d}|	                    |	           ||
z  }|r|	                    |           |S )Nr   r   )r   r   r   r   Fr  )
r  r  r   r   r   r   r   r  r  rU   )r   r  r  batchesrx  r  r  r   r   r  encoded_lens              r(   iter_transcript_batchesr    s    +-G$&GKh'' # #S%ch// 	39a((!$$	
 
 $*U???@@ 	+%	11S\\\5Q5QNN7###GKu{"  wNr8   c                    d | D             }d                     |          }t          j        d          pt          }	 t	          ||          S # t
          $ r3}t          d| d           t	          t          |          cY d }~S d }~ww xY w)Nc           
      X    g | ]'}|d           d|d          d|d          d|d          (S r  rC   r  s     r(   r?  z3build_transcript_cleanup_prompt.<locals>.<listcomp>  r  r8   r  PROMPT_TRANSCRIPT_CLEANUP)r   z6[PROMPT] Falha ao formatar PROMPT_TRANSCRIPT_CLEANUP (r  )rV   r.   r/   !DEFAULT_PROMPT_TRANSCRIPT_CLEANUPr   r&   r  )r[  r  r  r   r?   s        r(   build_transcript_cleanup_promptr    s       E IIe$$My455Z9ZH_#H}EEEE _ _ _]s]]]^^^#$EP]^^^^^^^^^_s   A 
B(BBBr   c                    d}|D ]}t          |t                    s	 t          |                    d                    }n# t          t
          f$ r Y Ow xY w|dk     s|t          |           k    rm|                    d          }t          |t                    st          |          }|s|| |         j	        k    r|| |         _	        |dz  }|S )Nr   r   r   r   )
r3  dictr   r_   	TypeErrorr  r   rO   r  r   )r   r   appliedr  r  r  	correcteds          r(   apply_segment_correctionsr!    s     G  $%% 		dhhw''((CC:& 	 	 	H	77cS]]**88F##(C(( 	*844	 	***!*HSMqLGNs   "AAAc                    | sdS t          |            |r	|j        dvrdS d}t          |           }t          d          5 }|D ]"}t	          |          }	 |                    t          ||d          }|                    d          }ne# t          $ r" t          j
                            d	           Y st          $ r.}	t          j
                            d
|	 d           Y d }	~	 nd }	~	ww xY w|sd }
t          |t                    r-|                    d          }t          |t                     r|}
nt          |t                     r|}
|
s|t#          | |
          z  }$d d d            n# 1 swxY w Y   |S )Nr   >   r  r  r   )max_workersz8Retorne apenas JSON valido com as correcoes solicitadas.r  r\   r]   zC[IA] Revisao de transcricao excedeu 60s; prosseguindo sem ajustes.
z$[IA] Falha ao corrigir transcricao: r  r   )r  r  r  r   r  submitr  r  r   r  r  r  r>   r3  r  r_   rP  r!  )r   r  total_appliedr  executorbatchr  futurer  r?   r   maybes               r(   correct_segments_with_air*    s&     q))) V_,@@@qM%h//G		*	*	* Hh 	H 	HE4U;;F!#"\	 )   !---33   
  !ghhh   
  !O!O!O!OPPP  8<E'4((  J//eT** "!EGT**   6xGGGMM9H H H H H H H H H H H H H H H: sI   E54BE5)C/6E58	C/#C*$E5*C//A:E55E9<E9a_starta_endb_startb_endc                 `    t          dt          ||          t          | |          z
            S )Nr   )r   rp  )r+  r,  r-  r.  s       r(   overlap_amountr0    s+    sCu%%GW(=(==>>>r8   	win_startwin_endc                 4   t          d||z
            }d}d}d}d}g }|}	| D ]}
t          |
j        |
j        ||          }|dk    r%t          dt          |
j        |          |	z
            }||z  }||z  }||
j        z  }||
j        |z  z  }||
j        |z  z  }t          |
j        |          }	|                    |
           |st          d          g fS ||z  }||z  }|r||z  nd}||z  }|dz  |dz  z   t          d|          d	z  z   |d
z  z
  }||fS )Nr   r   r   re  r        ?333333?g      g?g?)
r   r0  r   r   r   r   r   rp  rU   r   )r   r1  r2  win_durationspeech_timeweighted_confweighted_words	idle_timeselected_segmentscursorr   overlapgap
proportionspeech_ratioword_densityavg_confsilence_penaltyr   s                      r(   rq  rq    s   tWy011LKMNI')F & & CGYHHa<< #s39i0069::S	ws|+
722#.:55SWg&&  %%%% !V}}b  -L!L0L.9C}{**tH,.O 	s

	
dH


$	% C
	  
 ###r8   c                    t          |           }|sg S t          ||||          }	 |j        dk    rt          ||          }n|j        dk    rt	          ||          }ng S nD# t
          $ r7}t          j                            d|j         d| d           g cY d }~S d }~ww xY wt          |          }	g }
t          |	t                    rs|	                    d          }t          |t                    r|}
n]t          |t                    r|g}
nD|*dd	ht          |	                                          k    r|	g}
nt          |	t                    r|	}
|
sg S | d
         j        }| d         j        }g }|
D ]}t          |t                    s	 t%          |                    d                    }t%          |                    d	                    }n# t&          t(          f$ r Y rw xY wt+          ||          }t-          ||          }||k    r||z
  }||k     rt-          |||z             }||z
  }||k    r1t-          |||z             }||z
  }||k     rt+          |||z
            }t/          | ||          \  }}|t%          d          k    s|s"t1          |                    dd          pd                                          }t1          |                    dd          pd                                          }|                    t7          |||t          |          ||d                     t9          |          t+          d|          k    r n|S )N)r^  r_  r  r  r  z[IA] Falha ao consultar rn   r  r   r   r   r   rc  re  r   r{   r   ai)r   r   r   r   r   r   r   r   )r  r  r  r  r  r>   r  r  r  r  r3  r  r_   rP  rN  keysr   r   r   r  r  r   rp  rq  rO   r  rU   r   r   )r   r^  r_  r  r  r  r  rJ   r?   r  r   	raw_itemsfirst_startlast_endr   r  r   r   r   r   ry  r   r   s                          r(   select_highlights_with_airJ  (  s    'x00H 	XwuUUUF	?h&&"6622CC_((&vv66CCI   
NFONNsNNNOOO						 #3''G"$E'4   	KK--	i&& 	EE	4(( 	KEEGU#3s7<<>>7J7J#J#JIE	GT	"	"  	1+#K|H+-J * *$%% 		$((7++,,E((CC:& 	 	 	H	 K''(C  %<<;gh00C;gh00CU{H'!!Kw77&x<<xE&MM!!!TXXh++1r2288::DHHWb))/R006688h  
	
 
	
 
	
 z??c!Umm++E , s0   9A# #
B$-,BB$B$AGG,+G,  r   c                 ,   d                     d | j        D                                                       }t          j        dd|          }t          |          |k    r|S |d |dz
           }d|v r|                    dd          d         n|}|dz   S )Nr   c              3   2   K   | ]}|j         	|j         V  d S rN   r   r   s     r(   rR   z+summarise_highlight_text.<locals>.<genexpr>  s+      GGchGCHGGGGGGr8   r  r   r   r   r   )rV   r   r  r   r   r   rsplitr  r   r   r  s       r(   summarise_highlight_textrP    s    88GG	(:GGGGGMMOOD6&#t$$D
4yyE;UQY;G+.'>>gnnS!$$Q''wGU?r8     c                     d                     d | j        D                       }t          j        dd|                                          }t          |          |k    r.|d |         }d|v r|                    dd          d         n|}|}|S )Nr   c              3   V   K   | ]$}|j         	|j                                         V  %d S rN   )r   r  r   s     r(   rR   z+get_highlight_transcript.<locals>.<genexpr>  s5      OOchOCHNN$$OOOOOOr8   r  r   r   )rV   r   r   r   r  r   rN  rO  s       r(   get_highlight_transcriptrT    s    88OO	0BOOOOOD6&#t$$**,,D
4yy5vv,/2g~~'..a((++7Kr8   	ai_configc           
         |r|j         dk    rd S t          | d          }|sd S t          j        d          pt          }	 t          ||          }n@# t          $ r3}t          d| d           t          t          |          }Y d }~nd }~ww xY wd }d }t          dt          dz             D ]v}	 t          ||d	
          } n`# t          $ rS}|}t          d| dt           d|            |t          k    rY d }~ n&t          j        t                     Y d }~od }~ww xY w|r|t          d           d S |                                }	|	pd S )Nr  i  r   PROMPT_SOCIAL_CAPTION
transcriptz2[PROMPT] Falha ao formatar PROMPT_SOCIAL_CAPTION (r  r   z
text/plainr  z[IA][legenda] tentativa r  	 falhou: z/[IA][legenda] desistindo apos repetidas falhas.)r  rT  r.   r/   DEFAULT_PROMPT_SOCIAL_CAPTIONr   r&   r  ranger   r  timesleepr   r  )
r  rU  rZ  r   r  r?   rw   
last_errorattemptr   s
             r(   generate_social_captionrb    s    	*h66t))4@@@J ty011R5RH\%h:FFF \ \ \Y3YYYZZZ%&CPZ[[[\ #H&*J-122 	' 	'	'+IvR^___HE 	' 	' 	'JXWXX7HXXSVXXYYY+++J~&&&&&&&&	'  h&?@@@tnnG?ds6   A 
B)BB2C
D#*D DD#c           
         |r|j         dk    rd S t          | d          }|sd S t          j        d          pt          }	 t          ||          }n@# t          $ r3}t          d| d           t          t          |          }Y d }~nd }~ww xY wd }d }t          dt          dz             D ]v}	 t          ||          } nb# t          $ rU}|}t          d	| d
t           d|            |t          k    rd }Y d }~ n&t          j        t                     Y d }~od }~ww xY w|r|t          d           d S t          |t                    st          d           d S t!          |                    dd          pd                                          }	t!          |                    dd          pd                                          }
|
st          d           d S |	s| j        pt)          | d          }	|	|
dS )Nr  ip  rW  PROMPT_PORTAL_ARTICLErY  z2[PROMPT] Falha ao formatar PROMPT_PORTAL_ARTICLE (r  r   z[IA][portal] tentativa r  r[  z.[IA][portal] desistindo apos repetidas falhas.z.[IA][portal] resposta invalida: JSON esperado.r   r{   articlez*[IA][portal] conteudo ausente na resposta.P   )r   re  )r  rT  r.   r/   DEFAULT_PROMPT_PORTAL_ARTICLEr   r&   r  r]  r   r  r^  r_  r   r3  r  rO   r_   r  r   rP  )r  rU  rZ  r   r  r?   r  r`  ra  r   re  s              r(   generate_portal_articlerh    s     	*h66t))4@@@J ty011R5RH\%h:FFF \ \ \Y3YYYZZZ%&CPZ[[[\ )-G&*J-122 
' 
'		'%i88GE 	' 	' 	'JWGWW6GWWRUWWXXX+++J~&&&&&&&&	'  go>???tgt$$ >???tGR((.B//5577E'++i,,23399;;G :;;;t QP#;IR#P#P#Pw///s6   A 
B)BB2C
D#,D DD#   rZ  r   	max_wordsc                    g }|                                  }|                                }|r0|                    d                    |d |                              t	          j        d|          }t          d |D             d          }|r|                    |           |pd                                                                 }|rW|                                }t          |          dk    r0|                    d                    |d |                              g }	|D ]E}
t	          j        dd|
                                          }
|
r|
|	vr|	                    |
           F|	S )Nr   z[.!?]c              3   f   K   | ],}|                                 |                                 V  -d S rN   r  )rP   ss     r(   rR   z(derive_banned_phrases.<locals>.<genexpr>  s7      JJ		J17799JJJJJJr8   r{   r   r  )	r   r   rU   rV   r   nextr  r   r   )rZ  r   rj  bannedclean_transcriptwordssentence_matchfirst_sentencereason_wordsunique_bannedr  s              r(   derive_banned_phrasesrw    ss   F!''))""$$E 4chhu[y[122333Xh(899NJJnJJJBOON &n%%%l!!##))++F ?||~~|q  MM#((<)#<==>>>M ' 'vfc4((..00 	'D--  &&&r8   banned_phrasesra  previous_titlesc           
         |pd}d                     |                                 d d                                                   }g }|r|                    d| d           |r5|                    dd                     d |D                       z              d	                     |          }d
}	|r%dd                     d |D                       z   d	z   }	|dk    rdnd}
t	          j        d          pd}|r| d	nd
}	 t          ||
||j        ||	|           S # t          $ r=}t          d| d           t          t          |
||j        ||	|           cY d }~S d }~ww xY w)Nz(sem resumo adicional)r      zPrimeiras palavras proibidas: "r  zExpressoes proibidas: z; c              3   "   K   | ]
}d | d V  dS r  NrC   )rP   phrases     r(   rR   z%build_title_prompt.<locals>.<genexpr>  s*      0\0\6V0\0\0\0\0\0\r8   r  r{   zJTitulos descartados anteriormente (produza algo completamente diferente):
c              3   &   K   | ]}|d | d V  dS r}  rC   )rP   r   s     r(   rR   z%build_title_prompt.<locals>.<genexpr>  s/      KKUKEKKKKKKr8   r   zPRIMEIRA ENTREGA.
z$REFACA DO ZERO! Traga outro gancho.
PROMPT_TITLE_GENERATIONa  Voce e uma especialista em titulos. Use o texto abaixo (captions.txt) e escreva UM titulo curto e natural que resuma o fato principal.
Regras simples:
- Ate 45 caracteres.
- Sem emojis, hashtags, aspas ou ponto final.
- Frase coerente e direta em portugues, sem inventar nada alem do texto base.
TEXTO BASE (caption):
{transcript}
Retorne apenas JSON valido: {{"title":"TEXTO AQUI"}}
)attempt_sectionr   r   banned_sectionprevious_sectionrZ  z4[PROMPT] Falha ao formatar PROMPT_TITLE_GENERATION (r  )rV   r   r   rU   r.   r/   r   r   r&   r  DEFAULT_PROMPT_TITLE)rZ  r   r  rx  ra  ry  first_wordsbanned_section_partsr  r  r  r   formatted_bannedr?   s                 r(   build_title_promptr    s    //F((:++--bqb12288::K&( V##$Tk$T$T$TUUU 
##$tyy0\0\^0\0\0\'\'\\	
 	
 	
 YY344N 
YiiKK/KKKKKL 	 07!||++AhOy233 		E  1?F.,,,,B
#+'+-!
 
 
 	
  

 

 

[S[[[\\\# +'+-!
 
 
 	
 	
 	
 	
 	
 	


s   D 
E$'2EE$E$c           	      v   t          |           }|sd S t          || j                  }g }t          rdnd}t	          |          D ]c}t          || j        | |||          }	 t          ||          }nD# t          $ r7}	t          j	        
                    d|j         d|	 d           Y d }	~	 d S d }	~	ww xY w	 |t          j        |d          nd}
n# t          $ r t          |          }
Y nw xY wt!          d	|dz    d|
            d }t#          |t$                    r;d
|v r7t          |                    d
          pd                                          }nt#          |t                    r|                                }nnt#          |t*                    rY|rW|d         }t#          |t$                    r:d
|v r6t          |                    d
          pd                                          }|s|                    d           t/          |          }t1          |          }|rt3          ||           rQ|sdnd}t!          d	|dz    d| d|           |                    |pd           |r|                    |           It!          d|dz    d|           |c S t!          d           d S )Nr   r   z[IA] Falha ao gerar titulo com rn   r  Fr  nullz[IA][titulo] tentativa r   r{   r   z(resposta vazia)invalidoparecido_demaisz rejeitada (): z
(invalido)z#[IA][titulo] aprovado na tentativa z>[IA][titulo] nenhuma tentativa valida, fallback sera aplicado.)rT  rw  r   	FAST_MODEr]  r  r  r>   r  r  r  r  r  r  r  rO   r  r3  r  r_   r  rP  rU   sanitise_title_textforce_uppercase_titletitle_is_too_similar)r  r  rZ  rx  ry  max_attemptsra  r  r  r?   payload_previewr5   r  r   s                 r(   generate_title_with_air  A  s[   ))44J t*:y7GHHN!#O!(11qL&& 2 2#
 
	%ff55GG 	 	 	JYvYYRUYYYZZZ444444		+IPI\djuEEEEbhOO 	+ 	+ 	+!'llOOO	+H!HHHHIII#'	gt$$ 	BG););GKK006B77==??II%% 	BII&& 	B7 	BAJE%&& B7e+;+;		' 2 2 8b99??AA	 	""#5666'	22	))44	 		0IFF 		'0GZZ6GF!'A+ ! !6 ! !! !   ""9#<=== 1%%i000PGaKPP9PPQQQ	
JKKK4s*   "A33
B4=+B//B48CC/.C/      ^@caption_textr^   c           	      (   t          j        dt                    }|sdS d|                                v r|n
|d|v rdndz   }|                                 st          dd	           dS t          j        | t          d
d          	                    d          }t          j                            ||ddid          }dt          dt          fd}dt          dt          t                   fd}d}d}	d}
t          d| dd	           d}	 t          j                            ||          5 }t!          |dd          }|                                }|                    dd          }	t          d|	dd           d	            ||	          }	 t          j        |          }
n$# t(          $ r |                                }
Y nw xY w|rt          d!| d	           ddd           n# 1 swxY w Y   n;# t(          $ r.}t*          j                            d"| d#           Y d}~dS d}~ww xY w ||          p
 ||	          }t1          |
t2                    r4d$|
v r8t          |
                    d$          pd                                          }nd%|
v r8t          |
                    d%          pd                                          }nd&|
v r_t1          |
d&         t2                    rD|
d&         }d$|v r6t          |                    d$          pd                                          }n,|
rV|
                                D ]A}t1          |t                    r*|                                r|                                } nBnt1          |
t8                    r|
r|
d'         }t1          |t2                    rLt          |                    d$          p|                    d%          pd                                          }nSt1          |t                    r|                                }n)t1          |
t                    r|
                                }|r+t1          |t                    rd(|                                v sd(|	                                v rd}|r@t1          |t                    rd(|                                v st1          |
t2                    s.|r|}n)|	pd} ||          } ||          p
 ||          }|r|}|st          d)|	dd*          d	           dS |                    d+          r|                    d+          s*|                    d,          r1|                    d,          r|d-d.                                         }|                     d/d+                               d,d          }tC          |          }tE          |          }|                    d0          ru|                    d1          r`	 t          j        |          }
d2D ]7}||
v r1tE          tC          t          |
|                                       } n8n# t(          $ r Y nw xY wt          d3|            |pdS )4zFEnvia o caption para o webhook externo e tenta obter um titulo pronto.TITLE_WEBHOOK_URLNzwait=r  z
&wait=truez
?wait=truez/[Webhook] Caption vazio; titulo nao solicitado.Tflush)r   r  Fr  r   r  r  ri   )re   rf   methodr   r    c                 @   |                                  }|                    d          rt|                    d          }|                    dd          }t	          |          dk    r|d         }|                    dd          d                                          }|S )Nz````r  r   r   r   )r  r>  lstripr   r   rN  )r   txtr  s      r(   _strip_code_fencez5request_title_from_webhook.<locals>._strip_code_fence  s    jjll>>%   	2**S//CIIdA&&E5zzQAh**UA&&q)//11C
r8   r  c                     | sd S ddg}|D ]Z}t          j        || t           j        t           j        z            }|r)|                    d                                          c S [d S )Nz!"title"\s*:\s*"((?:\\.|[^"\\])*)"z!'title'\s*:\s*'((?:\\.|[^'\\])*)'r   )r   r  
IGNORECASEr  r   r  )r  patternspatr   s       r(   _extract_title_from_textz<request_title_from_webhook.<locals>._extract_title_from_text  s     	4 10
  	. 	.CIc3	(ABBE .{{1~~++-----.tr8   r8   r{   z [Webhook] Enviando caption para z (aguardando resposta unica)r]   rv   r  rl   z[Webhook] Resposta bruta: ro   z[Webhook] Status z![Webhook] Falha ao obter titulo: r  r   Titulore   r   WORKFLOWz4[Webhook] Nenhum titulo encontrado. Resposta bruta: i  r  r  r   rc  z\"r   r   )r   TITLETitlez[Webhook] Titulo retornado: )#r.   r/   DEFAULT_TITLE_WEBHOOKr  r  r  r  r  r  r  urllibrp   RequestrO   r   urlopengetattrrr   rs   r  r&   r  r  r  r3  r  r_   valuesrP  r   r>  rE  rk   r  r  )r  r^   base_urlr  r  reqr  r  rj   raw_decodedre   r   resprv   r  r?   regex_titlenestedvalr  fallback_textcleaned_text	extractedr   s                           r(   request_title_from_webhookr    s~   y,.CDDH t(.."2"222(((VY]eVeVellkw:xC ?tLLLLtj ,@AA   fWoo  .
 
 7^M_<`io
 
p
pC	 	 	 	 	 	c hsm     DKD	
NS
N
N
NVZ[[[[E^##C#99 	@TT8T22F99;;D++gh+??KB{4C4/@BB$OOOO''44G'z'** ' ' '}}' @2&22$????	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@    
DSDDDEEEttttt +*733\7O7OP[7\7\K$ d??))/R006688EE**0b117799EEt^^
4< > >^&\F&  FJJw//5266<<>> 	{{}}  c3'' CIIKK IIKKEE	D$		 D QeT"" 	"		'**Geii.A.AGRHHNNPPEEs## 	"KKMME	D#		 

 *UC(( Z5;;==-H-Hj\g\m\m\o\oNoNo "z%-- "*2M2MWabfhlWmWm2M 	"EE'-2M,,];;L00>>iBZBZ[hBiBiI "! X[QURUQUEVXX`deeeet $%.."5"5 $5;K;KC;P;P $UZUcUcdgUhUh $ad!!##MM%%%--c266E&&E!%((E !4!4 	:e$$D2  $;;12Ec$s)nn2U2UVVEE   	 	 	D		
0
0
0111=Dst   !G9 -A$G-F'&G-'GG-GG-!G9 -G11G9 4G15G9 9
H1#H,,H1AY. .
Y;:Y;c                    t          j        d| pd          } d                    d | D                       } |                                 } t	          j        dd|           } t	          j        dd|                                           S )Nr	  r{   c              3   B   K   | ]}t          j        |          |V  d S rN   )r  	combiningrP   chs     r(   rR   z-normalise_text_for_compare.<locals>.<genexpr>  s2      FF"K,A",E,EF2FFFFFFr8   z[^a-z0-9\s]+r   r  )r  r  rV   r  r   r   r  r   s    r(   normalise_text_for_comparer    sx     44D77FFFFFFFD::<<D6/3--D6&#t$$**,,,r8   r   c           	         t          |           }|sdS |                                }t          |          dk    rdS t          t          |d                    }|r||v s|                    |          rdS |                                }d}t          ||          D ]\  }}||k    r|dz  } |t          dt          |          t          |                    k    rdS t          |          t          |          z  }	|	r@t          |	          t          dt          t          |                              z  dk    rdS t          |j	                  }
|
r||
v s|
                    |          rdS |
                                }t          |          t          |          z  }|r@t          |          t          dt          t          |                              z  dk    rdS t          |          d	k    rdS d
S )NTr   rf  rW  r   r   r   g333333?
   F)
r  r   r   rP  r>  ziprp  rN  r   r   )r   r  
title_normtitle_wordssnippet_normsnippet_wordscommon_prefixtwswr=  reason_normru  overlap_reasons                r(   r  r    s   +E22J t""$$K
;1t-.FyXZ.[.[.[\\L %%)@)@)L)L%4$**,,+}55 	 	FBRxx"C3{#3#3S5G5GHHHH4k""S%7%77 	s7||c!S[1A1A-B-B&C&CCsJJ4,Y-=>>K $$(>(>z(J(J$4"((**[))C,=,== 	c.11C3s;?O?O;P;P4Q4QQUXXX4
:"t5r8   c                 ,   | pd                     dd          } t          j        dd|                                           } |                     d          } | sdS | r| d         dv r
| d d         } |                                 } | sdS t	          |           t
          k    r3| d t
                   }d|v r|                    dd          d	         n|}|} | r?| d	                                         s%| d	                                         | dd          z   } | S )
Nr{   r  r   r  z "'rc  z.!?r   r   )	rk   r   r   r  r   MAX_TITLE_LENrN  isupperr   )r   r  s     r(   r  r  -  s$   [b!!$,,EF63&&,,..EKKE r re##crc
 KKMME r
5zzM!!'/2g~~'..a((++7 -U1X%%'' -a  59,Lr8   source_textfallback_titlec                    | pd                                 }|                                 }|s|S 	 t          dd           t          |          }n+# t          $ r}t          d|            d }Y d }~nd }~ww xY w|r2t	          t          |                    }|rt          d|            |S t          d           |S )Nr{   z   [Titulo] Chamando webhook...Tr  z"   [Webhook] Falha na requisicao: z   Titulo webhook: z6   [Webhook] Nenhum titulo retornado; usando fallback.)r  r  r  r&   r  r  )r  r  r  rf  webhook_titler?   neats          r(   build_title_from_webhookr  G  s     b''))G##%%H /t<<<<27;;   8388999  $%8%G%GHH 	...///K	
BCCCOs    A 
A9A44A9c                 d   | sdS d                     d | D                       }|                                }d}|}|rK|d                                         s1||d         z  }|dd          }|r|d                                         1||                                z                                   S )Nr{   c              3      K   | ]F}|                                 s,|                                s|                                s|d v B|V  GdS )z!?.,:-_'"()N)isasciiisalnumisspacer  s     r(   rR   z(force_uppercase_title.<locals>.<genexpr>_  sU      qqRBJJLLqBJJLLqBJJLLq\^bp\p\pb\p\p\p\pqqr8   r   r   )rV   r  r  r   )r   r  prefixrests       r(   r  r  [  s     rggqq5qqqqqGmmooGFD
 tAw(( $q'ABBx  tAw((  TZZ\\!((***r8         	min_wordsc                     | sdS |                                  }t          |          |k    r
|d |         }t          |          |k     rd                    |          S d                    |          S )Nr{   r   )r   r   rV   )r   rj  r  rr  s       r(   compress_titler  i  sl     rJJLLE
5zzIjyj!
5zzIxx88E??r8   c                    | sdS |                                  h dh ddt          dt          dd ffd}t          fdD                       }t          fd	D                       }|s |d
d           |s8t	          fdt                    D             d
          } ||dz   d           d                              }t          t          |                    }t          |                                           dk    r/d                    |                                 d d                   }t          |          t          k    r1|d t                   }d|v r|                    dd          d
         n|}|S )Nr{   >      ESTÁ   SERÁEFOIESTASERA>      APÓSDADEDOEMPORAPOSr  r   r    c           	          t          dt          | dz   t                                        }                    ||           d S r   )r   rp  r   insert)r  r   posrr  s      r(   insert_afterz/ensure_aux_and_connective.<locals>.insert_after{  s@    !Sq#e**--..S%     r8   c              3       K   | ]}|v V  	d S rN   rC   )rP   wauxiliariess     r(   rR   z,ensure_aux_and_connective.<locals>.<genexpr>  s(      22q!{"222222r8   c              3       K   | ]}|v V  	d S rN   rC   )rP   r  connectivess     r(   rR   z,ensure_aux_and_connective.<locals>.<genexpr>  s(      331#333333r8   r   r  c              3   *   K   | ]\  }}|v 	|V  d S rN   rC   )rP   ir  r  s      r(   rR   z,ensure_aux_and_connective.<locals>.<genexpr>  s1      KKda!{:J:J:J:J:J:JKKr8   r   r  r      )r   r   rO   rO  ro  r  rV   r  r  r   r  rN  )	r   r  has_auxhas_connaux_idxfixedr  r  rr  s	         @@@r(   ensure_aux_and_connectiver   t  s    rKKMME@@@KBBBK!# !c !d ! ! ! ! ! ! 2222E22222G3333U33333H Q (KKKKi&6&6KKKQOOWq[$'''HHUOOE!"5e"<"<==E
5;;==Bss+,,
5zzM!!n}n%+.%<<S!$$Q''ULr8   >#   Ar  OAOASr  r  r  r  NANOOSOUSEUMAOSCOMDASDOSERAr  MASNASNOSr  PRAQUESERSOBUMAPARAPRAAPRAOPRAASPRAOSc                    t          j        dt          j        d|                                                     }i }|D ]m}d                    d t          j        d|          D                       }t          |          dk    s	|t          v rQ|                    |d          dz   ||<   nt          |
                                d 	          }d
 |d |         D             S )Nu;   [A-Z0-9ÃÃ‰ÃÃ“ÃšÃƒÃ•Ã‚ÃŠÃ”Ã‡]+r	  r{   c              3   B   K   | ]}|                                 |V  d S rN   )r  r  s     r(   rR   z3extract_keywords_from_transcript.<locals>.<genexpr>  s/      [[bjjll["[[[[[[r8   r   r   r   c                 $    | d          | d         fS )Nr   r   rC   )r  s    r(   rl  z2extract_keywords_from_transcript.<locals>.<lambda>  s    47(DG9L r8   r   c                     g | ]\  }}|S rC   rC   )rP   wordr  s      r(   r?  z4extract_keywords_from_transcript.<locals>.<listcomp>  s    555WT1D555r8   )r   findallr  r  r   rV   r   	STOPWORDSr_   sortedr   )rZ  r   rr  freqr"  r  sorted_wordss          r(    extract_keywords_from_transcriptr(    s   JUWbWlmsu  vF  vF  vH  vH  XI  XI  J  JED 1 1''[[{'<VT'J'J[[[[[w<<19 4 4!,,q0W$**,,,L,LMMML55VeV 45555r8   c           
         t          | d          }t          |          }t          t          t	          | j        dz                      t          t                    z           }t          |          dk    r|d          d|d          d|d	          }nt          |          d	k    r|d          d
|d          }nt          |          dk    r|d          d}n~| j        pd}t          j	        dd|          
                                                                }|d t          dt          t          |          t          dz
                               }| d| }t          |          }t!          |          }t          |          t          k    r1|d t                   }d|v r|                    dd          d         n|}t          |          dk     rt!          | d          }|S )NiX  rW  r  r   r   r   r   z VS r   z SOB PRESSAO z	 EM XEQUEzVERDADE ESCONDIDAr  r  r   z SEGREDO REVELADO)rT  r(  TITLE_PREFIXESr   r   r   r   r   r   r   r  r   r   rp  r  r  r  rN  )r  rZ  keywordsr  	hook_corer'   hooks          r(   fallback_title_from_highlightr.    s   ))3???J/
;;HCio&: ; ;<<s>?R?RRSF
8}}{CCXa[CChqkCC			X!		{>>!>>			X!		{---		6#6vfc4((..006688E3r3s4yy-!2C#D#DEEEF	""y""Dt$$D &&D
4yy=  N]N#),t{{3""1%%$
4yy2~~$%A%A%ABBKr8   r   c           	         d t          | d          D             }|sd S |D ]\  }}d }|rt          ||          }|s!t          |          }t          d|           t	          t          |                    |_        t          dt          |j                   dt          |j	                   d|j                   d S )Nc                 *    g | ]\  }}|j         ||fS rC   )r   )rP   r  r  s      r(   r?  z/assign_titles_to_highlights.<locals>.<listcomp>  s:     5 5 5+S)U^Ud5	i5 5 5r8   r   r   z[IA][titulo] usando fallback: z[IA][titulo] final para corte r  rn   )
r  r  r.  r  r  r  r   fmt_tsr   r   )r   rU  pendingr  r  r   s         r(   assign_titles_to_highlightsr4    s   5 5/81/M/M/M5 5 5G   
 
9 	A*9i@@E 	>1)<<E<5<<===/0CE0J0JKK	#VIO-D-D # #vimG\G\ # ## #	
 	
 	
 	

 
r8   c                    g }| s|S t          t          |                     D ]}| |         j        }t          |t          |                     D ]r}| |         j        }||z
  }	|	|k     r|	|k    r nPt	          | ||          \  }
}|
t          d          k    rK|                    t          |||
|d                     s|sd| d         j        }| d         j        }t	          | ||          \  }
}|                    t          |||
|pt          |           d                     |	                    d d           |d t          d	|                   S )
Nre  	heuristicrg  r   rc  c                     | j         S rN   ri  rj  s    r(   rl  z!find_highlights.<locals>.<lambda>!  rm  r8   Trn  r   )r]  r   r   r   rq  r   rU   r   rP  rU  r   )r   r^  r_  r  r4   	start_idxr1  end_idxr2  r   r   ry  rr  rs  s                 r(   find_highlightsr:    s   +-J 3x==))  	Y'-	YH66 	 	Gw'+G*H'!!'!!*8YHHOE8f%%"#%&       
qk'RL$	&xiHHx!!3T(^^"  	
 	
 	
 OO))4O888oAuo&&r8   secondsc                     t          t          | t          |           z
  dz                      }t          |           dz  }t          |           dz  dz  }t          |           dz  }|dd|dd|dd|dS )Nr  r\   i  02:,03r   r   )r;  r  rn  mhs        r(   r2  r2  %  s    	UGc'll*d233	4	4BGrA	W	r!AGA***Q***A***2****r8   c                     t          t          | dz                      }|dz  }|dz  }|dz  }|dz  }|dz  }|dz  }|dd|dd|dd|dS )Nd   r\   dr>  r  r  rA  )r;  total_cscstotal_srn  total_mrB  rC  s           r(   fmt_ass_timerK  -  s    53''((H	CB#oG"AmG"A2A,,,A,,,A,,,B,,,,r8   c                 ~    |                      dd                               dd                               dd          S )N\\\r   z\{r   z\})rk   r   s    r(   
escape_assrO  8  s6    <<f%%--c599AA#uMMMr8   line_spacingc                    |dk    sd| vr| S |                      d          }|s| S |d         g}|dd         D ]}|                    d| d|            |                    d           d                    |          S )	zDInject ASS baseline offsets so multi-line titles gain extra spacing.r   z\Nr   Nz\N{\pbo-r   z{\pbo0}r{   )r   rU   rV   )r   rP  r  spacedsegments        r(   apply_ass_line_spacingrT  <  s    qE--JJuE q
F9 ? ?=L==G==>>>>
MM*776??r8   max_words_per_screenc           
         g }|dk    rt           }t          d| j                  }| j        D ]}t          |j        | j                  }t          |j        | j                  }||k    r>d |j                            dd          	                                D             }|sxt          d||z
            }|t          |          z  }	t          dt          |          |          D ]}
||
|
|z            }||	|
z  z   }||	|
t          |          z   z  z   }t          ||          }|| j        z
  }|| j        z
  }||k    r#|t          d|	t          |          z            z   }t          d|          }t          ||          }||z
  d	k     rt          ||dz             }t          d||z
            }t          |||z             }t          d	|t          |          z            }|                    ||||d
           |S )Nr   g?c                 :    g | ]}||                                 S rC   )r   )rP   r  s     r(   r?  z)build_subtitle_chunks.<locals>.<listcomp>Y  s%    MMMq1MMMMr8   r  r   r  g
ףp=
?r   皙?)r   r   rr  per_word)DEFAULT_MAX_WORDS_ON_SCREENr   r   r   r   rp  r   r   rk   r   r   r]  rU   )r  rU  chunkshighlight_durationr   	seg_startseg_endrr  absolute_durationrY  r  blockblock_start_absblock_end_abs	rel_startrel_endchunk_durationper_word_chunks                     r(   build_subtitle_chunksrg  J  sG    $&Fq  :S)"455! ) )	9?33	cgy}--iMMCH$4$4T3$?$?$E$E$G$GMMM 	Wy%899$s5zz1CJJ(<== 	 	C#&: ::;E'(S.8O%C#e**4D(EEM77M')/9I#io5G)###c$3u::0E&F&FFC++I,g66G"T))0)c/BB w':;;N,i..HIIG ~E

'BCCNMM&"" .	    +	< Mr8   c                    d                     |                                           }|sg S |                                }g }g }|D ]z}|rd                     ||gz             n|}t          |          t          k    r.|r,|                    d                     |                     |g}e|                    |           {|r(|                    d                     |                     t          |          t
          k    rL|d t
          dz
           }|                    d                     |t
          dz
  d                               |}|S )Nr   r   )rV   r   r   FIT_TITLE_MAX_CHARS_PER_LINErU   FIT_TITLE_MAX_LINES)r   cleanrr  r  rx  r"  r5   keeps           r(   split_fit_title_linesrm    sJ   HHTZZ\\""E 	KKMMEEG ! !29CCHHWv-...t	y>>888W8LL'**+++fGGNN4     (SXXg&&'''
5zz'''.*Q../CHHU#6#:#<#<=>>???Lr8   rE  Fr  )exclude_titletitle_only_pathvariant_modeass_pathtitle_margin_vrn  ro  rp  c                D   |                                 dk    }|rdnd}|rdnd}d}	|	}
d}|rt          |	dz            }
n1t          |	dz            }
t          t          |
d	z                      }|rd}d
}d
}nd}d}d}d}d}d| d| d|
 d| d| d| d| d| d}g }t          |           }|D ]}t	          d|d         |z             }t          | j        |z   t	          |dz   |d         |z                       }||k    r|dz   }|d         }|d         }dt          |           dt          |           d t          d!	                    |                     }|
                    |           | j                                        }g }d"}|rd# |                    d$d%                              d%          D             }d& |D             }|s|                                g}t          |          }|rg }t!          |          d'k    rt#          |d                   }n,|D ])} t#          |           p| g}!|                    |!           *d( |D             p|}|}"t&          }#t)          |          D ]W\  }$}%t          |%          }&|"|$|#z  z   }'|
                    d)t          | j                   d*|
 d+t*           d|' d,|& 
           Xnet          d-	                    |                    }(|dk    rt-          |(|          }(|
                    d)t          | j                   d.|(            t/          |          }t          |          })|r	|s||)dd<   |s-d)t          | j                   d/}*|
                    |*           |                    |d%	                    |)          z   d%z   d01           |r3|r1|                    |d%	                    |          z   d%z   d01           n,|r*|                                r|                    d23           |S )4Nr        r   Z   r   r4  r5  g{Gz?z
&H00000000r{  z
&H00151515z
&H64000000z
&H00FFFFFFrX  a  [Script Info]
ScriptType: v4.00+
PlayResX: 1080
PlayResY: 1920
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.709

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Anton,zP,&H00FFFFFF,&H00777777,&H00151515,&H64000000,-1,0,0,0,100,100,0,0,1,6,3,2,60,60,z,1
Style: Title,Anton,r?  z,&H00FFFFFF,z,-1,0,0,0,100,100,0,0,1,z,3,8,80,80,z],1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
r   r   r  r         ?rY  rr  zDialogue: 0,z3,Default,,0,0,0,,{\blur0.8\bord6\shad3\fad(120,80)}r   Fc                 6    g | ]}|                                 S rC   rm  r   s     r(   r?  z'write_ass_subtitles.<locals>.<listcomp>  s     [[[[[[r8   r  c                     g | ]}||S rC   rC   r   s     r(   r?  z'write_ass_subtitles.<locals>.<listcomp>  s    =======r8   r   c                     g | ]}||S rC   rC   )rP   lines     r(   r?  z'write_ass_subtitles.<locals>.<listcomp>  s    <<<t<<<<r8   zDialogue: 0,0:00:00.00,z,,Title,,0,0,0,,{\bord0\shad0\fad(120,120)\fsz\pos(z)}z \N z2,Title,,0,0,0,,{\blur0.8\bord6\shad3\fad(120,120)}z@,Default,,0,0,0,,{\blur2\bord7\fad(120,120)}(sem fala detectada)r   r   T
missing_ok)r  r   r   rg  r   rp  r   rK  rO  rV   rU   r   r  rk   r   rP  r   rm  extendFIT_TITLE_LINE_GAPr  FIT_TITLE_POS_XrT  r4  
write_textr2   unlink)+r  rq  rr  rn  ro  rp  is_fitsubtitle_font_sizesubtitle_margin_vbase_title_font_sizetitle_font_sizetitle_line_spacingtitle_outlinetitle_outline_colourtitle_back_colourtitle_primary
start_leadheaderr  r[  chunkr   r   rY  rr  r|  
title_texttitle_lines	has_titlebase_segmentsr   
auto_linesr   r6   base_yr>  r  rS  escaped_segmenty_posescaped_titleoutput_linesfallback_lines+                                              r(   write_ass_subtitlesr    s    !!U*F &/C%.3*O @2S899 2S899 '=!>!>?? )+(+( MJ	\ !3	\ 	\ EV	\ 	\ .	\ 	\ 1>	\ 	\ L`	\ 	\ ct	\ 	\ N[	\ 	\ hv	\ 	\ 	\ $ E"9--F  Cw*455)$z13us{E%LS]D]3^3^__%<<$,C$gU<.. U Uc1B1B U U7A#((5//7R7RU U 	 	T&&((JKI !&[[
0B0B40N0N0T0TUY0Z0Z[[[===== 	1'--//0M&& 	$&J8}}!!28A;??

# 0 0C4S99BcUH%%h////<<<<<HH#F$C )( 3 3  W",W"5"5s*""~l9;M.N.N ~ ~9H~ ~P_~ ~bg~ ~l{~ ~    'w||H'='=>>M!A%% 6}FX Y YL,y7I*J*J L L<IL L   %%	;;L ( ('QqS $Al93E&F&F A A A 	 	]###<!8!884?'RRR 09 0""6DIIk,B,B#BT#IT["\\\\	 0_3355 0$///r8   srt_pathc                    g }d}| j                                         }|rXt          d| j        dz
            }|                    | dt          d           dt          |           d| d           |dz  }t          |           }|D ]}|d         }t          | j        t          |dz   |d	                             }	d
                    |d                   }
|                    | dt          |           dt          |	           d|
 d           |dz  }|s|                    d           |	                    d                    |          d           d S )Nr   r   rX  r  r   z --> r   r  r   r   rr  z51
00:00:00,000 --> 00:00:03,000
(sem fala detectada)
r   r   )
r   r  r   r   rU   r2  rg  rp  rV   r  )r  r  cuesr  r  end_timer[  r  r   r   r   s              r(   write_srt_subtitlesr    su   D
C&&((J sI.566sRRfSkkRRx0@0@RRJRRRSSSq"9--F  g)$c%#+uU|&D&DEExxg''sIIfUmmII&++IIIIIJJJq PNOOO		$':::::r8   c                  B    t                      d uot                      d uS rN   )rI   rD   rC   r8   r(   _mp_face_module_availabler  .  s%    "$$D0T5F5H5HPT5TTr8   	min_value	max_valuec                 &    | |k     r|S | |k    r|S | S rN   rC   )r,  r  r  s      r(   _clampr  2  s)    yyLr8   c            	       Z    e Zd ZdeddfdZddZddZddZded	ed
e	de
e         fdZdS )FaceCropAnalyzer
video_pathr    Nc           	      d   t                      }|t          d          t          |          | _        || _        |                    | j                  | _        | j                                        st          d          t          | j        	                    |j
                  pd          | _        t          | j        	                    |j                  pd          | _        t          | j        	                    |j                  pd          | _        | j        dk    s| j        dk    r#|                                  t          d          d| _        | j        t          | j                  z  | _        t)          dt          t+          | j        | j        z                                | _        d| _        d	| _        | j        | j        k    | _        t)          d| j        | j        z
            | _        t          | j        	                    |j                  pd          | _        d S )
NzOpenCV nao esta instalado.z:Nao foi possivel abrir o video para analise com MediaPipe.r   g      >@z7Dimensoes do video sao invalidas para analise de rosto.g      @r   i8  i  )rD   r>   rO   r  _cv2VideoCapturecapisOpenedr   r_   CAP_PROP_FRAME_WIDTHr   CAP_PROP_FRAME_HEIGHTr   r   CAP_PROP_FPSfpsrt   scale_target_heightscale_factorr   r   scaled_width
crop_widthcrop_heightsupports_cropmax_xCAP_PROP_FRAME_COUNTframe_count)r   r  
cv2_modules      r(   __init__zFaceCropAnalyzer.__init__;  s   &((
;<<<j//	**4?;;x  "" 	][\\\j&EFFK!LL
$(,,z'GHHMANNj&=>>F$GG:??dkQ..JJLLLXYYY#)  4uT[7I7II3uTZ$:K-K'L'L#M#MNN!.$/AD-?@@
tx||J,KLLQPQRRr8   c                 |    t          | d          r)| j        $| j                                         d | _        d S d S d S )Nr  )hasattrr  releaser   s    r(   rt   zFaceCropAnalyzer.closeU  sJ    4 	DH$8HDHHH	 	$8$8r8   c                     | S rN   rC   r   s    r(   	__enter__zFaceCropAnalyzer.__enter__Z  s    r8   c                 .    |                                   d S rN   )rt   )r   exc_typer?   tbs       r(   __exit__zFaceCropAnalyzer.__exit__]  s    

r8   r   r   detectorc           	         | j         sd S ||k    r|dz   }t          dt          || j        z                      }t          |dz   t          || j        z                      }| j        dk    rt          || j        dz
            }t          dt          t          | j        dz                                }g }d}|}	|	|k    rn| j                            | j	        j
        |	           | j                                        \  }
}|
r|n'|dz  }| j	                            || j	        j                  }|                    |          }|r|j        rt          |j        d           }|j        j        }t%          |j        dd          }t%          |j        dd          }t%          |j        dd          }|dk    s|dk    r|	|z  }	t%          ||z   dd          }t%          ||d	z  z   dd          }|                    || j        z  || j        z  || j        z  f           |	|z  }	|	|k    n|sd S t1          | \  }}}t          |          }t          |          }||z
  }d
| j        z  }|dz  }t          ||          }t          d||z
            }t          t5          | j                  ||z             }||z
  | j        k    r	||z   d	z  } nt7          j        |          } t          t          | | j        d	z  z
                      }!t          dt          | j        |!                    }!t=          |          }"|"t          d|          z  }#t?          |!d| j        | j         |#|"|          S )Nr  r   r   g      @c                 .    | j         r| j         d         ndS )Nr   r   ri  )dets    r(   rl  z1FaceCropAnalyzer.compute_window.<locals>.<lambda>}  s    CI$FCIaLL3 r8   r   r   r  rd  g{Gz?rw  r   r   r   r   r   r   r   )!r  r   r   r  r  rp  r   r  rN  r  CAP_PROP_POS_FRAMESrr   cvtColorCOLOR_BGR2RGBprocessr   location_datarelative_bounding_boxr  xminr   r   rU   r  r  r  r   
statisticsmedianr  r   r   r  )$r   r   r   r  start_frame	end_framesample_strider   total_samples	frame_idxokframe	rgb_frameresultsbestbboxleftr   r   rightcenterleftsrightscentersmin_left	max_rightspanbase_marginadaptive_marginmarginpadded_leftpadded_right	center_pxcrop_xdetections_countr   s$                                       r(   compute_windowzFaceCropAnalyzer.compute_window`  s   ! 	4C<<#+C!S!12233aS48^)<)<==	aIt'7!';<<IAs5C#8#899::79
	9$$HLL6	BBBIB QM	**5$)2IJJI&&y11G 7- &FF   )?dic22tz344S#66A::1.Ite|S#66us{ 2C==!!D--ut7H/H&SWSdJde   &I7 9$$:  	4!$j!1vwu::KK	8#T_,+[/22#x&0115!233Y5GHH+%88$|3s:II")'22IU9t'<<==>>QDJ//00z??%A}(=(==
/#!'!
 
 
 	
r8   r    N)r    r  )r   r   r   r	   r  rt   r  r  r   r   r   r   r  rC   r8   r(   r  r  :  s        S4 SD S S S S4   
      N
E N
 N
 N
R\I] N
 N
 N
 N
 N
 N
r8   r  r  c                 6   |sd S t                      st          d           d S 	 t                      }t          |           5 }|j        st          d           	 d d d            d S |j        j                            dd          5 }t          d           t          |d          D ]o\  }}|	                    |j
        |j        |          }|r4||_        t          d| d	|j        d
d|j         d|j         d	           \t          d| d           p	 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 # t           $ r}t          d|            Y d }~d S d }~wt"          $ r}t          d| d           Y d }~d S d }~ww xY w)Nzy   [!] MediaPipe/OpenCV nao encontrados. Instale 'mediapipe' e 'opencv-python' para habilitar o enquadramento automatico.zL   [!] Video ja e suficientemente estreito. Mantendo enquadramento original.r   r   )model_selectionmin_detection_confidencezK   -> Detectando cabecas com MediaPipe para centralizar o corte vertical...r1  z      Corte #z: rosto localizado (conf=z.2fz, amostras=r  z).zD: nenhum rosto consistente encontrado; usando enquadramento central.z#   [!] Face tracking desabilitado: z*   [!] Erro inesperado ao usar MediaPipe (z!); continuando sem face tracking.)r  r  rI   r  r  	solutionsface_detectionFaceDetectionr  r  r   r   r   r   r   r   r>   r&   )	r  r   	mp_moduleanalyzerr  r  r  r   r?   s	            r(   apply_face_trackingr    s    $&& 9	
 	
 	
 	c+--	j)) 	X) deee	 	 	 	 	 	 	 	
 $3AA !C B   cddd&/
!&D&D&D  NC#229?IMS[\\D 	)-	KC K K$/a K K(,K K:>,K K K   
 uCuuu   	              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	*  ; ; ;9C99::::::::: c c ca3aaabbbbbbbbbcsx   E D>E '!D>BD&D>&D*	*D>-D*	.D>1E >EE EE 
FE--F:FFcmdc                    t          j        | t           j        t           j        d          }|j        dk    rRt          j                            d           t          j                            |j                   t          d          d S )NT)stdoutr  r   r   zFFmpeg erro:
zFFmpeg falhou)
subprocessrunPIPE
returncoder  r  r  r>   )r  procs     r(   
run_ffmpegr    sq    >#jojoTXYYYD!
)***
%%%?+++ r8   sub_pathc                     |                                                                  }|                    dd                              dd                              dd          S )NrM  rN  r>  z\:r  z\')rK  as_posixrk   )r  r\  s     r(   escape_ffmpeg_sub_pathr	    sU    !!**,,HD&))11#u==EEc5QQQr8   r   modebg_input_labeltitle_sub_pathc           
         t          |           }|dvrt          d|           g }|dk    rc|                    d           |r6|                    d|j         d|j         d|j         d|j                    n+|                    d           n|                    d           d	d
                    |           dg}d}d}	t          	                                rdt          t                     d}	|                    d| d| d|	 d           d}d }
|dk    r!t          	                                rt          }
n t          	                                rt          }
|
d u}|r|                    d| d           d}n|                    d| d           d}|dk    r|                    d| d           d}|dk    r|                    d| d           d}|                    d| d           d}|"|                    d| dt           d           ndt          	                                r6t          t                    }|                    d| d t           d           n|                    d!           |                    d"| d#           d$}|r0t          |          }|                    d| d| d|	 d%           d&}|rU|
rSt          |
          }|                    d| d't           d(           |                    d| d)t           d*           d+}|                    d| d,           d-                    |          S ).N>   r  fillz!Modo de exportacao desconhecido: r  zscale=-2:1920zcrop=r>  zcrop=1080:1920z4scale=1080:1920:force_original_aspect_ratio=decreasez[0:v]r?  z[video_base]
video_baser{   z:fontsdir='r  [z]subtitles='z[video_sub]	video_subr  z]format=rgba[video_rgba]
video_rgbaz]format=yuv420p[video_yuv]	video_yuvz ]setpts=PTS-STARTPTS[video_zero]
video_zeroz2]format=rgba,colorchannelmixer=aa=1[video_rgba_bg]video_rgba_bgz]scale=z,,format=rgba,colorchannelmixer=aa=1[bg_rgba]zmovie='z',scale=zLcolor=color=black:size=1080x1920,format=rgba,colorchannelmixer=aa=1[bg_rgba]z
[bg_rgba][zL]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)/2:shortest=1[video_with_bg]video_with_bgz[video_with_title]video_with_titlez',scale=-1:z,format=rgba[logo]z$][logo]overlay=(main_w-overlay_w)/2:z":eval=init:format=auto[video_logo]
video_logoz]format=yuv420p,setsar=1[outv];)r	  r  rU   r   r   r   r   rV   	FONTS_DIRr2   LOGO_FIT_IMAGE_PATHLOGO_IMAGE_PATHBACKGROUND_TARGET_SIZEBACKGROUND_IMAGE_PATHLOGO_TARGET_HEIGHTLOGO_TOP_MARGIN)r  r   r
  r  r  subtitle_sourcevideo_filtersfilter_graph_partscurrent_labelfonts_option	logo_path
needs_logo	bg_sourcetitle_sourcelogo_sources                  r(   build_filter_chainr+    so    -X66O?""CTCCDDD!Mv~~_--- 	3  !U!U!Udk!U!UDF!U!UTV!U!UVVVV  !12222STTT%RSXXm-D-D%R%R%R$S ML JI%;I%F%FIIIRMRRRRRRR    M !%Iu}},3355}'						!	! $#	$&J $!!"Mm"M"M"MNNN$!!"Om"O"O"OPPP###!!"Om"O"O"OPPP#u}}!!????	
 	
 	
 %!!QQQQ	
 	
 	
 (%%%oNoo+Aooo    #))++ 	v./DEEI%%q)qq-Cqqq    %%&tuuu!!tttt	
 	
 	
 ( +-n==!!ZZZ<ZZ,ZZZ	
 	
 	
 + %i %,Y77!!TkTT.@TTT	
 	
 	
 	!!vvv?vvv	
 	
 	
 %O-OOOPPP88&'''r8   r   r   fit_title_marginc                    |                     dd           || dz  }|| dz  }|| dz  }d}|}t                                          r|t          z  }|t          z  }t	          | ||d           || d	z  }	t
          t          z   t          z   }
|
t          z  }
t	          | ||
d|	d
          }|s|		                    d           d }	t          | |           ||||	fS )NT)rS  exist_okz.assz_fit.assz.srtr   r  )rr  rp  z_fit_title.assr  )rr  rn  ro  rp  r}  )mkdirr  r2   LOGO_TITLE_MARGIN_EXTRAr  r   r  TITLE_BELOW_LOGO_GAPFIT_TITLE_ADDITIONAL_OFFSETr  r  )r  r   r   r,  ass_fill_pathass_fit_pathr  fill_margin
fit_marginfit_title_pathtitle_overlay_marginhas_title_fits               r(   prepare_highlight_subtitlesr:  H	  s>    TD111I!3!3!33M9 6 6 66Ly....HK!J ...--
	=[abbbbY">">">>N*-??BVV77'+&  M  ...	8,,,,.@@r8   varianttitle_ass_pathc           
         | d| }|| dz  }	|dk    rt          |dd           nd }
d }|dk    r2t                                          rdddt          t                    g}ng }|rd	}t	          ||
|||
          }t
          j                            d          }|rt          d| d|            ddd|j	        dd|j
        ddt          |           g}|r|                    |           d}|                    g d|ddddddddddddd d!d"d#d$d%d&t          |          d't          |          d(d)d*d+d,d-d.d/d0d1d2d3t          |	                     |r#t          d4d5                    |                     t          d6|	j         d7|j        d8d9| d:           t          |           |r:|                                r&	 |                                 n# t"          $ r Y nw xY w|	S );Nr  z_tiktok.mp4r  r   r  z-loopr   z-iz1:v)r  r  DEBUG_FILTER_GRAPHz[DEBUG] filter graph (r  r~   z-yz-ss.3fz-toH   z-filter_complexz-mapz[outv]z0:a?z-c:vlibx264z-presetslowz
-profile:vhighz-levelz4.1z-b:v10Mz-maxrate12Mz-bufsize20Mz-gz-keyint_minz-pix_fmtyuv420pz	-movflagsz
+faststartz-c:aaacz-b:a192kz-ar44100z-ac2z[DEBUG] ffmpeg cmd:r   z-> Gerando  (.1fzs, modo=z)...)r  r  r2   rO   r+  r.   r  r_   r  r   r   r  rV   r   r   r  r  r   )r  r  r   r   r;  rq  r
  r<  variant_base
final_pathcrop_to_usebg_labelbackground_argsfilter_graphdebug_filtersr  gop_sizes                    r(   export_highlight_variantrV  l	  s     ++'++L::::J6:fnn')VT222$K"Hu}}.5577}"Cs3H/I/IJ %%  L JNN#788M @>t>>>>????  =J	C  $

?###HJJ &&& 	& 		&
 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&  	!&" 	#&$ 	%&& 	'&( 	)&* 	+&, 	H-&. 	/&0 	H1&2 	3&4 	5&6 	7&8 	9&: 	;&< 	=&> 	?&@ 	A&B 	C&D 	E&F 	G&H 	I&J 	JK& & & &N  4#SXXc]]333	
X

X
X9+=
X
X
X7
X
X
XYYYsOOO .//11 	!!#### 	 	 	D	s   &G; ;
HHc                    t          j        t                    }t          t	          | j        pd                                                    }t          d           t                      }|	                    | j
                  }|                    t	          |          d| j                  }t          |          }|st          d          t          |           t!          |           }t#          | dd          pd                                }|dvrd}|d	v }	|d
v }
|	s|
st'          d          g }|	r|                    d           |
r|                    d           t          dd                    |                      t,          rt          d           nZt          d           t/          ||          }|dk    rt          d| d           n!|rt          d           nt          d           t          d           t1          d| j                  }g }|rwt          d           t5          || j        | j        ||          }|r9t;          |d          D ]&\  }}|j        rt          d| d|j                    'nt          d           nt          d           t          d           t1          |d z  |d z             }t?          || j        | j        |          }|st          d!           g }	 dd#t@          tB                   d$tB          d%tD          d&tF          fd'}|r7tI          |d( d)*          D ]#} |||           tK          |          |k    r n$tK          |          |k     r9|r7tI          |d+ d)*          D ]#} |||           tK          |          |k    r n$tI          ||z   d, d)*          }|D ]#}tK          |          |k    r n |||           $tK          |          |k     rX|tK          |          z
  }tM          || j        | j        ||-          }|D ]%}tK          |          |k    r n |||d./           &tK          |          |k     r*|r(|D ]%}tK          |          |k    r n |||d0/           &|st          d1          tO          ||           t          d2           tQ          ||           tS          | j*                  }tW          |j,                  }t          j        tZ                    .                    d3          }|r| d4| n|}g }g }t          d5           t;          |d          D ]\  }}t          d6| dt_          |j0                   d7t_          |j1                   d8|j2        d9d:|j3        d;
           |j4        d<k    rd=n|j4        d>k    rd?n|j4        }t          d@|            |j5        rt          dA|j5                    |j        rt          dB|j                    |6                                } t          dC|             to          |||          }!d }"d }#d}$d }%|j5        r|j5                                        nd}&|r|j8        dDk    rts          ||          }'|'r|'dE         }$||! dFz  }#|$ dG|'dH                                          dI}(|#:                    |(dJK           t          dL|#j;                    |                    |#           ty          ||          })|)r<|)}%||! dMz  }"|":                    |)dIz   dJK           t          dN|"j;                    n/t          dO           nt          dP           nt          dQ           |%p| }*|&p*t{          t}          |*pdd t~                                       }+t          |*|+          |_5        |j5        pd                                },|,rzdE|,i}-||! dRz  }.	 |.:                    t          jB        |-dST          dIz   dJK           |                    |.           n)# t          $ r}/t          dU|/            Y d }/~/nd }/~/ww xY wt          |||!          \  }0}1}2}3d }4d }5|	r+t          ||||!d|0dVW          }4|                    |4           |
r,t          ||||!d|1d|3X          }5|                    |5           |                    t          di dY|dZ|!d[|j0        d\|j1        d]|j2        d^|j3        d_|j4        dE|j5        d`|j        da| db|4dc|5dd|0de|1df|2dg|"dh|#di|$           i dZ|!dj|dY|dkt	          |G                                          dl|j;        dmt	          |G                                          d[|j0        d\|j1        d]|j2        d^|j3        d_|j4        d`|j        da| dE|j5        dndo |jH        D             dp|jI        rP|jI        jJ        |jI        jK        |jI        jL        |jI        jM        |jI        jN        |jI        jO        |jI        jP        dqnd dr|4d u|5d udsdtt                      i}6||! duz  }7	 |7:                    t          jB        |6dSdvw          dIz   dJK           |                    |7           b# t          $ r}/t          dx|/            Y d }/~/d }/~/ww xY w|dy| dzz  }8	 |8:                    |j;        dIz   dJK           |                    |8           n)# t          $ r}/t          d{|/            Y d }/~/nd }/~/ww xY w|j;        t                      d|}9t          jS        d}d                                          }:|:r|:|9d~<   |dy| dz  };	 |;:                    t          jB        |9dSdvw          dJK           |                    |;           n)# t          $ r}/t          d|/            Y d }/~/nd }/~/ww xY wt          d           |D ]}<t          d|<            t          d           t          j        t                    }=t          |||||=|          S )Nr{   z&1/5 Transcrevendo audio com Whisper...
transcribe)tasklanguagez$Nenhum trecho de fala foi detectado.r;  r  >   r  r  r  >   r  r  >   r  r  z4Nenhum formato de corte selecionado para exportacao.r  r  z"   -> Format(o/s) selecionado(s): rL   z92/5 Revisando ortografia com IA... (pulado - modo rapido)z"2/5 Revisando ortografia com IA...r   z   -> z trechos ajustados.z0   -> Nenhuma correcao adicional foi necessaria.z5   -> IA indisponivel; mantendo transcricao original.z!3/5 Selecionando cortes virais...r   z8   -> Consultando IA para sugerir os melhores trechos...r1  z
      IA #rn   z0      [!] Nenhum corte valido retornado pela IA.z/   -> IA desabilitada; usando heuristica local.z<   -> Avaliando heuristica local para cortes alternativos...r  z2      [!] Heuristica nao encontrou cortes validos.r   targetr5   r(  r    c                 d    | D ]}t          |||          r dS |                     |           dS )Nr(  FT)r+  rU   )r[  r5   r(  ra  s       r(   append_uniquez#run_pipeline.<locals>.append_unique
  sM      	 	H%h	YOOO uui   tr8   c                     | j         S rN   ri  rj  s    r(   rl  zrun_pipeline.<locals>.<lambda>
  s    QW r8   Trn  c                     | j         S rN   ri  rj  s    r(   rl  zrun_pipeline.<locals>.<lambda>
  s    AG r8   c                     | j         S rN   ri  rj  s    r(   rl  zrun_pipeline.<locals>.<lambda>"
  s    qw r8   )r^  r_  r`  ra  gffffff?r]  r  z-Nao foi possivel encontrar cortes candidatos.z'4/5 Ajustando enquadramento vertical...z%Y%m%d_%H%M%Sr  z65/5 Criando cortes verticais com legendas dinamicas...z
   Corte #z ate rL  rM  z	s) score=r?  rE  IAr6  
Heuristicaz   Origem: z   Titulo: z   Motivo: z   Preview: r  r   z_portal.txtz

re  r  r   r   z    Materia para portal salva em z_caption.txtz   Legenda social salva em z=   [!] Nao foi possivel gerar legenda social para este corte.z>   [!] Nao foi possivel gerar materia para portal neste corte.zE   [!] Legenda social e materia para portal requerem provider GEMINI.z
_title.txtFr  z0   [!] Nao foi possivel salvar titulo em texto: r  )r   r;  rq  r
  )r   r;  rq  r
  r<  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
input_namer   r   c                 P    g | ]#}|j         |j        |j        |j        |j        d $S )r	  r	  r   s     r(   r?  z run_pipeline.<locals>.<listcomp>
  sK     	 	 	  !Y7H#&?&)&8 	 	 	r8   r   r  generated_formats)r  r  
updated_atz
_data.jsonr   )r  indentz2   [!] Nao foi possivel salvar metadata do corte: r  z_source.txtz0   [!] Nao foi possivel registrar arquivo raiz: )
input_filegenerated_atCORTE_REQUEST_USERgenerated_byz
_meta.jsonz-   [!] Nao foi possivel registrar metadados: zFinalizado!z   [OK] zGOs arquivos .ass e .srt correspondentes foram salvos junto com o corte.)r   r   r   r   r   r   r   rC   )Ur   r"   r   rY   rO   rH  r  r  r@   
load_modelr  rX  langr
  r>   r  r  r  r  r  rU   rV   r  r*  r   toprJ  min_durationmax_durationr  r   r:  r   r   r   r4  r%  r   rz  r4  r  r	   r   r  stemr$   strftimer2  r   r   r   r   r   r   r   r%  r  rh  r  r   rb  r  r  r  r  r  r  r   r:  rV  r   rK  r   r   r   r   r   r   r   r   r   r)   r.   r/   r   )>r;  r   r  whisper_moduler  r  r   rU  variant_optiongenerate_zoomgenerate_fitselected_formatsr   desired_variationsai_highlightsr  r  heuristic_limitheuristic_highlightsselected_highlightsr^  r5   combined_poolneededfallback_candidatesr   
input_slugtimestamp_tagr   generated_fileshighlight_resultsorigin_labelpreview_textr   caption_pathportal_article_pathportal_article_titler  original_titlearticle_infoarticle_textr   r)  r  
title_note
title_json
title_pathr?   r3  r4  r  ass_fit_title_path	zoom_pathfit_pathhighlight_metadatametadata_pathsource_markermeta_payloadrequest_usermeta_markerrQ   r   s>                                                                 r(   run_pipeliner  	  s   c""J#C
(8b$9$9$?$?$A$ABBJ	
2333*,,N%%dj11Ec*ooL49UUFV$$H CABBB)))!$''IdIv66@&GGIIN444"&66M!_4L Q\ QOPPP (''' '&&&	
Ltyy9I/J/J
L
LMMM 
KIJJJJ2333,XyAA	q==99999:::: 	KDEEEEIJJJ	
-...Q)).0M AHIII1d'):<NPY
 
  	F )-q A A A @ @9# @>q>>I,<>>???@ DEEEE?@@@	
HIII,q02Dq2HIIO*8T5FHY[jkk DBCCC46 ]` '(5GTY	     3D3DdSSS 	 	IM-y999&''+=== > "4449M4 4:K:KUYZZZ 	 	IM-y999&''+=== > =+??EVEV`deeeM" 6 6	"##'999E)95555
"444#c*=&>&>>:%%(
 
 
 - 	J 	JI&''+===M-yDIIIII
"4449M4- 	I 	II&''+===M-yCHHHHH LJKKK 3Y???	
3444
$7888do&&J%jo66JL..77HHM1;N-----G"$O,.	
BCCC!"5Q??? aN aN9G G GfY_55 G GF9=<Q<Q G G"FG G1:FG G	
 	
 	
  )/477ttYM]alMlMl\\r{  sC*L**+++? 	31	11222 	42	 022333 ((**+\++,,,%aG<<	'+.2!&*4=OK..000 	[+x7729iHHL X'3G'<$&0i3L3L3L&L#"6__L<S<Y<Y<[<[___#..|g.NNNS9L9QSSTTT&&':;;;1)YGG [#*L#-90J0J0J#JL ++GdNW+MMMK8IKKLLLLYZZZZVWWWW YZZZ#3|' 
+@!3^m^ DEE,
 ,
 3<PP	o+2244
 	P!:.J#&>&>&>>JP%%dj%&P&P&PSW&Wbi%jjj&&z2222 P P PNNNOOOOOOOOP E`z9E
 E
A|X/A %)	#' 
	.0#&  I ""9--- 	-/#%1	 	 	H ""8,,,     a#)  oo MM	
 #++  oo !''  oo !'' % %9 #( ' % H  %!"  32#$ 21%	
 	
 	
,)
)
w)
 Q)
 #j002233	)

 */)
 #j002233)
 Y_)
 9=)
 	*)
 Y_)
 i&)
 i&)
 |)
 Y_)
  	 	 %-	 	 	)
2  ~
^%^%"-#./'n7'n7$>1   G)
H  !-t+" "I)
P -//Q)
 )
T #	%=%=%==	N$$
-E!LLLtS  %    ""=1111 	N 	N 	NLsLLMMMMMMMM	N !>'!>!>!>>MH  4!7' JJJ}---- H H HFFFGGGGGGGGH !o+-- L 91266<<>>L 4'3^$;;;;;KEtz,USTUUU`ghhh{++++ E E ECcCCDDDDDDDDE	- ! !    	
STTT,s##K$   sc   8A`<<
a"aa"1Aj77
kkk+4l   
m*mmAo 
o?#o::o?fieldsfilesc                    dt          j                    j         }t          j                    }|                                 D ]\  }}||                    d| d                    d                     |                    d| d                    d                     |                    |                    d                     |                    d           |D ]\  }}}}	|                    d| d                    d                     |                    d| d| d	                    d                     |                    d
| d                    d                     |                    |	           |                    d           |                    d| d                    d                     ||                                fS )Nz----CortesBoundaryz--z
r   z&Content-Disposition: form-data; name="z"

s   
z"; filename="z"
zContent-Type: z

z--
)	uuiduuid4hexioBytesIOr   r  r  getvalue)
r  r  boundarybufferr   r,  
field_namefilenamecontent_typere   s
             r(   encode_multipart_formdatar    s    7DJLL$466HZ\\F||~~  e=(((((//88999MdMMMTTU\]]^^^U\\'**+++W49  0
HlD(((((//88999]Z]]h]]]ddelmm	
 	
 	
 	<l<<<CCGLLMMMTW
LL&h&&&--g66777V__&&&&r8   webhook_urlsummaryjob_inforequest_payloadc                 2
   | sd S ||                     dd          |                     d          |                     d          |                     d          |                     d          t                      d}|||d<   t          j        |d	
                              d          }t
          j                            | |ddd          }t
          j                            ||           d S |                     dd          |                     d          |                     d          |j	        t          |j                  t          |j                  t          |j                  t          |j                  t          |j                  d	}|||d<   d |                                D             }	|	r|	|d<   g }
g }g }g }|j        D ]}|
                    i d|j        d|j        d|j        d|j        d|j        d|j        d|j        d|j        d|j        d|j        d|j        r|j        j        nd d|j        r|j        j        nd d |j         j        d!|j!        j        d"|j"        j        d#|j#        r|j#        j        nd d$|j$        r|j$        j        nd d%|j%        i           g }|j        r%|                    d&|j        d'|j        f           |j        r%|                    d(|j        d'|j        f           |&                    d)|j        d'|j         fd*|j        d'|j!        fd+|j        d'|j"        fg           |j#        r%|                    d,|j        d'|j#        f           |j$        r%|                    d-|j        d'|j$        f           |D ]\  }}|'                                s&|                    |t          |          d.           ?|(                                }tS          j*        |j                  d/         pd0}|                    ||j        ||f           |                    ||j        t          |          t          |          d1           ̐|
|d2<   |r||d3<   |r||d4<   d5t          j        |d	
          i}tW          ||          \  }}d6| dd}t
          j                            | ||          }t
          j                            ||           d S )7Nrv   failedjob_iderror	tracebacktrigger_source)rv   r  r  r  r  r   trigger_payloadFr  r   r  )r  Accept)re   rf   r]   	completed)	rv   r  r  r   rH  r   r   r   highlight_countc                 "    i | ]\  }}|d v	||S )>   r  rv   r  rC   )rP   kvs      r(   
<dictcomp>z+send_results_to_webhook.<locals>.<dictcomp>V  s)    kkktq!1Dj;j;ja;j;j;jr8   r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zoom_video_r  
fit_video_	ass_fill_ass_fit_srt_caption_portal_)fieldrQ   r   zapplication/octet-stream)r  r  sizerQ   r   attachmentsmissing_filesmetadatazmultipart/form-data; boundary=),r_   r)   r  r  r  r  rp   r  r  r   rO   r   r   r   r   r   r   r   rU   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r2   
read_bytes	mimetypes
guess_typer  )r  r  r  r^   r  r  re   r  r  extra_job_infohighlight_entriesr  attachments_infor  cutattachment_mapr  rQ   r  r  r  rj   rf   s                          r(   send_results_to_webhookr  +  s     ll8X66ll8,,\\'**!k22&ll+;<<.00#
 #
 &)8G%&z'666==gFFn$$%7CUVV % 
 

 	sG444 ,,x55,,x((",,'788?W'((',--)'*<==*7+>??w122
  
 H "&5"#kkx~~'7'7kkkN .-.057K-/*,M! 2 2  S]  sw	
 CL  #*  #* 3; S^Mcn11 3=JS]//d CL- 3;+ sw|  s{D3;++!" !S=O"Y#"4"9"9UY#$  0% 	
 	
 	
. 24> 	S!!#@#@#@#@#."QRRR= 	Q!!#?	#?#?#?"OPPP,SY,,,cl;+CI+++S[9'	'''1	
 	
 	
 ; 	M!!#=ci#=#=#=s{"KLLL 	S!!#<SY#<#<#<c>P"QRRR . 		 		J;;== $$z3t99%M%MNNN??$$D$/	::1=[A[L
DI|TJKKK##$$)SYYX[\`XaXabb   		 /H\ 3"2 2$1!$*XEBBBCF.v{CCNHdCCC$ G .
 
 4
 
I
IC
N300000r8   c                 $    t          g           t           j                  }| _        t          dt	           j                             _        h d G  fddt                    } j         j        f}t          ||          }t          d j         d j         d           	 |                                 n# t          $ r t          d           Y nw xY w|                                 d S # |                                 w xY w)	Nr   >   
serve_host
serve_portserve_webhookc                   z    e Zd ZZ ZddddZdededdfd	Zdd
Z	de
deeef         ddfdZddZd fdZdS ).run_webhook_server.<locals>.CutsWebhookHandler*zPOST, OPTIONSr  )zAccess-Control-Allow-OriginzAccess-Control-Allow-MethodszAccess-Control-Allow-Headersr   r;  r    Nc                     d S rN   rC   )r   r   r;  s      r(   log_messagez:run_webhook_server.<locals>.CutsWebhookHandler.log_message  s    Fr8   c                 p    | j                                         D ]\  }}|                     ||           d S rN   )cors_headersr   send_header)r   r   r,  s      r(   _set_cors_headersz@run_webhook_server.<locals>.CutsWebhookHandler._set_cors_headers  sG    "/5577 - -
U  e,,,,- -r8   rv   r  c                    t          j        |d                              d          }|                     |           |                                  |                     dd           |                     dt          t          |                               |                                  | j	        
                    |           d S )NFr  r   r  zapplication/json; charset=utf-8Content-Length)r  r  r  send_responser  r  rO   r   end_headerswfiler  )r   rv   r  rj   s       r(   _respond_jsonz<run_webhook_server.<locals>.CutsWebhookHandler._respond_json  s    :gE:::AA'JJDv&&&""$$$^-NOOO-s3t99~~>>>JT"""""r8   c                     |                      d           |                                  |                                  d S )N   )r  r  r  r   s    r(   
do_OPTIONSz9run_webhook_server.<locals>.CutsWebhookHandler.do_OPTIONS  s@    s###""$$$r8   c           
      d     j                             dd          d         }|dvr                     dddi           d S t           j                            dd	          pd          }|r j                            |          nd
}i }|ru	 t          j	        |
                    d          pd          }t          |t                    r|}nd|i}n.# t          j        $ r                      dddi           Y d S w xY wt          |                    d          pt          j                               fdt#           j                  D             }t#           j                                                  D ]%\  }}|v r
||v rt+          j        |          ||<   &t/          j        d!i |i }	|                                D ]v\  }
}|
                    dd          }t5          |          rFt7          |          }	 t9          ||          }n# t:          $ r |}Y nw xY wt=          ||           q||	|
<   wd_        tA          t7          dd                     _!        t          j!        t                    rj!        sd_!        tE          dt          t7          dj#                                      _#        t          |          |	r|	d<   d"fd}tI          j%        |d d          &                                                      ddd            d S )#Nr  r   r   )r  /cortesz/triggeri  r  zEndpoint desconhecidor  0r8   r   z{}re   ro   zJSON invalidor  c           	      `    i | ]*}|t          j        t          j        |                    +S rC   )copydeepcopyr  default_args)rP   r  r   s     r(   r  zJrun_webhook_server.<locals>.CutsWebhookHandler.do_POST.<locals>.<dictcomp>  s2    jjjQDM'$2CQ*G*GHHjjjr8   r  r  Fnotify_webhookr{   notify_timeoutunknown_fieldsr    c                     ddd} 	 t                    }d| d<   j        ri	 t          j        || j                   t	          dj         d d	           d S # t
          $ r }t	          d
 d|            Y d }~d S d }~ww xY wd S # t
          $ r}d| d<   t          |          j         d| | d<   t          j	                    | d<   t          dd          rL	 t          j        d | j                   n,# t
          $ r}t	          d d|            Y d }~nd }~ww xY wt	          d d|            Y d }~d S d }~ww xY w)Nrunningwebhookr  rv   r  r  rv   r^   r  #[webhook] Resultados enviados para z (job )z,[webhook] Falha ao enviar resultados do job rn   r  r  r  r  r{   z)[webhook] Falha ao notificar erro do job z[webhook] Job r[  )r  r  r  r  r  r&   r  r   r  
format_excr  )job_contextr  r?   
notify_excjob_argsr  r  s       r(   
job_runnerzJrun_webhook_server.<locals>.CutsWebhookHandler.do_POST.<locals>.job_runner  sD   $'&// /
 C*844G,7K). bb3 ( 7 ' +(0(?0?    " nhF] n nek n n n      ) b b b!"`QW"`"`[^"`"`aaaaaaaaabb b ! C C C,4K).23ii.@+I+IC+I+IK(/8/C/E/EK,x)92>> 
f	f3 ( 7 $ +(0(?0?      ) f f f!"df"d"dXb"d"deeeeeeeefA6AACAABBBBBBBBBCse   B 9A   
B
*B?B B

B 
EAE"D E
D*D% E%D**EEzcortes-job-T)r[  r   daemon   queued)r  rv   rC   r  )'rQ   r   r  r   rf   r_   rfilerr   r  r  rs   r3  r  r  rO   r  r  varsr  server_argsr   r  r  r  	Namespacerk   r  r  r5  r&   setattrr  r:  r  r   r  	threadingThreadr   )r   rQ   lengthraw_bodyr  r  	base_dictr   r,  overrides_unknownraw_key	raw_valueattrr-  coercedr  r  r  r  r;  copy_excludes   `               @@@r(   do_POSTz6run_webhook_server.<locals>.CutsWebhookHandler.do_POST  s   9??3**1-D777""32I(JKKK))*:C@@EAFFF28Atzv...cH&(G 	!Z(@(@(HDIIF!&$// 3"(#)6"2+   &&sWo,FGGGFF X..>$*,,??FjjjjRVW[WhRiRijjjI"4#344::<< : :
U,&&)##%)]5%9%9IcN)66I66H02&-mmoo 
; 
;"sC008T** ; '$ 7 7I,"-i"C"C$ , , ,"+,HdG44441:%g..%*H"&<WXO_ae=f=f&g&gH#(1377 -@W -*,'&)!SCSUYUh1i1i-j-j&k&kH#"7mmO  F4E 01&C &C &C &C &C &C &C &CP J5K65K5KTXYYY__aaasv$J$JKKKKKs%   AC 'DD
HH*)H*r  )r   r   r   r  r  r  rO   r   r  r  r   r   r  r  r  )r;  base_defaultsr  s   r(   CutsWebhookHandlerr    s        $+.,;,:
 
	c 	# 	$ 	 	 	 		- 	- 	- 	-	# 	#d38n 	# 	# 	# 	# 	#	 	 	 	
_	L _	L _	L _	L _	L _	L _	L _	L _	Lr8   r  z#[webhook] Servidor ativo em http://r>  r  z!
[webhook] Encerrando servidor...)r  r:  r  r   r   r  r
   r  r  r   r  serve_foreverKeyboardInterruptserver_close)r;  resolved_notifyr  addresshttpdr  r  s   `    @@r(   run_webhook_serverr    sj   rNNM,T-@AAO)DaT%8!9!9::D@@@L}L }L }L }L }L }L }L }L }L3 }L }L }L~ 0G);<<E	
Z
Z
Z$/
Z
Z
Z[[[ 4 4 42333334 	s*   /C C9 C C9 C  C9 9Dc                    t          |           }t          |j                  }||_        t          dt	          |j                            |_        |j        rt          |           d S dt          t                   dt          j        dt          dd fd}|j        rt          |          }|st          d           d S d }|D ]w}t          j        di t!          |          }d|_        t          |          |_        t          d	|j         d
           t'          |          } |||d|j                    x|S t'          |          } |||d           |S )Nr   r  run_argsr  r    c                     | r|j         sd S |ddd}	 t          |j         | ||j        d            t          d|j                     d S # t          $ r}t          d|            Y d }~d S d }~ww xY w)Nr  clir  r  r  z&[webhook] Falha ao enviar resultados: )r  r  r  r  r&   )r  r  r  r  r?   s        r(   notify_summaryzmain.<locals>.notify_summary?  s     	h5 	F$uUU
	B#' / $    Q8OQQRRRRR 	B 	B 	B@3@@AAAAAAAAA	Bs   5A
 

A1A,,A1z2Nenhum arquivo de video encontrado para processar.Fz
=== Processando z ===zcli-r  rC   )r  r:  r  r   r   r  r  r  r   r   r  r  rO   	batch_allr]  r  r  rH  r   r  rs  )	r{  r;  r  r  videosfinal_summaryr  
local_argsr  s	            r(   mainr#  5  s   dD,T-@AAO)DaT%8!9!9::D 4   tB 9 BXEW Bad Bim B B B B  ~ &t,, 	FGGG437  	P 	PJ!+99d4jj99J#(J ":J<z<<<===(44MN=*6NZ_6N6NOOOO4  GN7D%(((Nr8   __main__rN   r  )r  rm  )r  r  )rK  )rQ  )ri  )r  )r  r  )r   )rE  )NN)r   )r   N)r  r  r  r  r.   r   r   r^  r  r  r  concurrent.futuresr   r   r  urllib.errorr  urllib.requestr  r  r  r   r   r   zoneinfor   r=   dataclassesr   pathlibr	   http.serverr
   r   typingr   r   r   r   r   r   r;   http.clientr`   urllib.parser   r  
setdefaultr  r  r   r  r&   __file__rK  rL  r1   r:   rB   rH   r   rO   ra   rb   r   rI  r  r  r  r  r  rZ  r  r*  r  r  r8  rM  add_typer$   r)   r7   r+   r@   rD   rI   rY   rd   bytesrx   r  r  r\  r  rg  	with_namejoinpathr   r2   r_   pathsepr   r  r  r  r   r0  r1  r2  r  r  ri  rj  r/   r  r   r   r   r   r   r  r  r  ANTON_FONT_PATHr   r   r   r   r   r   r  r  r%  r4  r+  r5  r:  r  r]  rz  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r!  r*  r0  rq  rJ  rP  rT  rb  rh  rw  r  r  r  r  r  r  r  r  r  r   r$  r(  r.  r4  r:  r2  rK  rO  rT  rg  rm  r  r  r  r  r  r  r  r	  r+  r:  rV  r  r  r  r  r#  r   r{  rC   r8   r(   <module>r7     sG     				  				 				      



         ? ? ? ? ? ? ? ?                       " " " " " " " "!!!!!!!   HHH ! ! ! ! ! !       C C C C C C C C = = = = = = = = = = = = = = = =         ! ! ! ! ! ! 
  (' 2 2 2	wsz=)) 1
000wsz=)) 1
000 	 	 	D	 4>>!!##*

	<> 4T[889 > > >   SSS> K I Q  	 ; ' ' 'x 344    L   HX.  #        	*D 	* 	* 	* 	*   	
 
 
    XC XD X X X X  (C    

  #s(^	
  	   . # "= ?   T(^^%%&YZZccdijj
 S33bj@33z??RBJv   0     $x..**:66d8nn..{;;       !  BI&,,3	C33yry)<cBBCCDD S%%		*:E B BCCDDX00== $ DNN$$W--	11%3 %# %# % % % %. . . . . . . . .          J J J J J J J J&        * # # # # # # # #        	 	s 	 	S 	 	 	 	1S 1-? 1# 1RU 1 1 1 1 FIQ QQ0Q=BQ	Q Q Q Q	s 	s 	s 	 	 	 	(3- C    ' 2 'tDz ' ' ' 'V,w,, , 	,
 )*, 

, , , ,^V#Xc] V#x'9 V# V# V# V#r/H. /8H3E / / / /h  w  
$sCx.	   <
d38n%

 
 	

 	
 
 
 
F $(04$ $ $$$ C=	$
 d38n-$ 	$ $ $ $V 1	* * *** 	*
 	* * * *Z3 8C=    > $(	% % %%% C=	%
 c]% % % %($ 4=         4(7*; 4 4 4 4 4 	  w  	
 
$tCH~
   B_Xd38n-E _# _ _ _ _w(0c3h(@   2(w()1();(( ( ( (V?E ?% ?% ? ?RW ? ? ? ?($8G, ($ ($ ($SXY^`del`mYmSn ($ ($ ($ ($VWwWW W 	W
 W 

W W W Wt (: 3 QT     (: 3 RU     '9  h  S[\_S`        F.0!.0.0 d38n.0 .0 .0 .0b c 3 3 tTWy    .=
=
=
 "=
 SM	=

 =
 c]=
 	=
 =
 =
 =
@=&8 =( =xX[} = = = =@x xS x5 xXVY] x x x xv-S -S - - - -& &0B &t & & & &Rs s    4# s s    (+ + + + + +   c #    S S    :$ $ $	N	6 	6 	6S 	6c 	6 	6 	6 	6-? C    <
H5G,H 
U]^fUg 
lp 
 
 
 
,*'hw/ *'% *'% *'X[ *'`dew`x *' *' *' *'Z+E +c + + + +-% -C - - - -NS NS N N N N C C      !<4 4!44 
$sCx.4 4 4 4n S	    4 }
  &*} } }!}} }
 } d^} } 
} } } }@;#5 ; ;$ ; ; ; ;,U4 U U U U% E e     t
 t
 t
 t
 t
 t
 t
 t
n%cD %ch?Q6R %cW[ %c %c %c %cP,HSM ,d , , , ,RT Rc R R R R %)%)_( _(_(
:
_( _( SM	_(
 TN_( 	_( _( _( _(L  	!A !A!!A!A !A 	!A
 4tXd^+,!A !A !A !AX &*] ]]!] ] 	]
 ] ] ] TN] 
] ] ] ]@Dx) Do D D D DN
'cN'#'c3U.B(C#D'
3:' ' ' '8 04u1 u1u1o&u1 38nu1 	u1
 d38n-u1 
u1 u1 u1 u1pOX/ OD O O O Od+x} +/!: + + + +\ zD!"" s7   A" "A,+A,=AD DDF F('F(