
    oiQ                    \    d Z ddlmZ ddlZddlmZ ddlmZ ddlmZm	Z	 d
dZ
ddZdd	Zy)ua  skills/analizador_combo.py — ANALIZAR (estación 2)

Cache lookup + faster-whisper transcripción + frame extraction + LLM extracción combo.
Skill canónica: analizador-combo-completo.

Backend: Python puro (faster-whisper) + claude CLI subprocess (combo extraction LLM).

Inputs:
  caja.descargar.video_path (output de la estación previa)
  caja.input_start.{product, country, saturated}

Output:
  caja.sections.analizar = {
    transcription, word_count, duration_seconds, language_detected,
    combo_completo: {awareness, sofisticacion, jergas, deseo_principal, avatar, ...},
    cache_hit: bool
  }
    )annotationsN)datetime)Path)SkillContextSkillResultc                   |j                         }|j                  di       j                  d      xs i }|j                  d      }|j                  di       }|j                  dd      }|j                  d      xs dj                         d d	 }|rt        |      j	                         st        d
dg      S t        d| d      t        d|j                          d      g}|D ]  }	|	j	                         s	 t        j                  |	j                  d            }
|
j                  dd      j                  dd      }t        j                         t        j                  |j                  dd            z
  j                  }|dk  rA|j                  di |
dt        |	      |ddd       t        ddt        |	      d      c S  	 dd lm} 	  |d"d#d$%      }|j)                  ||d&d'      \  }}d(j+                  d) |D              }t-        |j/                               }|d*k  rt        d
d+| d,g      S 	 |j                  d.d
      }t1        ||||      }|j3                  |d/d01      }|j                  d2      s3t        d
d3|j                  d4      xs |j                  d5       g      S t5        |j                  d6d            }t        j                         j7                         |||j                  d      t9        |d7      r|j:                  nd ||t=        |d8d       |d
d9
}t        d|       }|j?                  dd:       |d;z  jA                  t        jB                  |d
d	<      d       |j                  d|dd       t        d||d=      S # t         $ r Y w xY w# t&        $ r t        d
d!g      cY S w xY w# t         $ r}t        d
d-| g      cY d }~S d }~ww xY w)>Nsections	descargar
video_pathinput_startproductunknowncountryes   Fu6   video_path no existe — DESCARGAR debió correr antes)okerrorsz(C:/Users/ferna/proyecto cero/_productos/z/_analysis.jsonzutf-8)encoding	timestampz2000-01-01T00:00Zz+00:00    analizarT)	cache_hit
cache_pathage_daysreplacezanalizador-combo-completo)modeactor)r   r   )r   outputr   )WhisperModelu9   faster_whisper no instalado · pip install faster-whispermediumcpuint8)devicecompute_type   )language	beam_size
vad_filter c              3  P   K   | ]  }|j                   j                            y w)N)textstrip).0ss     HC:\Users\ferna\proyecto cero\_factory_3d_demo\skills\analizador_combo.py	<genexpr>zrun.<locals>.<genexpr>?   s     >XQVV\\^Xs   $&   u   Transcripción <20 palabras (u   ) — audio corrupto?u   Whisper falló: 	saturatedzclaude-opus-4-7   )model	timeout_sr   u$   claude CLI falló combo extraction: stderrerrorstdoutdurationr(   )
r   r   r   r   duration_secondstranscription
word_countlanguage_detectedcombo_completor   )parentsexist_okz_analysis.json)ensure_asciiindent)r>   r@   )"	read_cajagetlowerr   existsr   jsonloads	read_textr   r   nowfromisoformatdayswrite_sectionstr	Exceptionfaster_whisperr!   ImportError
transcribejoinlensplitbuild_combo_prompt
claude_cliextract_json_from_claude_output	isoformathasattrr;   getattrmkdir
write_textdumps)inputscontextcajadescr   inpr   r   cache_pathscpcachedtsr   r!   r6   segmentsinfo	full_textr>   er4   promptrescomboanalysisout_dirs                             r1   runrs      s   D88J#''4:D,'J
((="
%Cggi+Gwwy!)T0022A6GT*-446e-e,fgg 	8	QR88IYZK 99;BLL'L$BCZZ-?@HHhW$LLNX-C-CBJJxY[D\-]]ccb=))*  7A  7Adbefhbiw  7A  HQ  Yt)  u&$TY\]_Y`7abb ! k/FXe&I))*wRS`d)e$HH>X>>	*+
?%3PQ[P\\q1r0stt  U+I	7GYGF


V+<

LC774=e/STWT[T[\dTeTyilipipqxiySz-{,|}} ,CGGHb,ABE \\^--/ 779%-4T:-FDMMD" $T:t<H >wiHIGMM$M.++DJJxe\],^ip+q*hYFab$jTY'Z[[a    ke-h,ijjk  Fe/?s-C,DEEFsD   =CN(N8 A*O (	N54N58OO	O9O4.O94O9c           
     N    |rdnd}d| d|j                          d| d| d d  d	S )	NuD   Mercado SATURADO (sof nivel 4) — necesitamos formato más currado.zMercado normal.z-Analiza este video ganador para el producto "z" en mercado z. u  

Extrae el COMBO COMPLETO en JSON estricto. Estructura obligatoria:
{
  "awareness": "<Unaware|Problem Aware|Solution Aware|Product Aware|Most Aware> (Schwartz)",
  "sofisticacion": "<1-5>",
  "jergas": ["<jerga1>", "<jerga2>", "..."],
  "deseo_principal": "<frase corta>",
  "avatar": {"edad": "<rango>", "genero": "<m/f/ambos>", "contexto": "<vida>", "profesion": "<x>"},
  "temporalidad": "<urgencia + estacionalidad + etapa de vida>",
  "fuerza_cambio": "<qué empuja a actuar AHORA>",
  "antagonistas_nombrados": ["<x>", "..."],
  "formato_angulo": "<descripción>",
  "mecanismo_revelado": "<si aplica>",
  "estructura_narrativa": "<actos>",
  "duracion_clase": "<corto|medio|largo>"
}

TRANSCRIPCIÓN DEL VIDEO:
"""
i@  u=   
"""

Responde SOLO con el JSON, sin texto antes ni después.)upper)r=   r   r   r4   sat_notes        r1   rX   rX   f   sR    YbUhyH<WI]SZS`S`SbRccefneo p( u  8); ;    c                   | j                         }|j                  d      rI|j                  dd      }t        |      dk\  r)|d   }|j                  d      r|dd j                         }	 t	        j
                  |      S # t        $ r Y nw xY w	 |j                  d      }|j                  d      }t	        j
                  |||dz          S # t        $ r
 d	|dd
 icY S w xY w)uX   Intenta parsear JSON del output de claude. Si claude añade prosa, busca el bloque JSON.z```r      rI      N{}_raw_unparseablei  )	r.   
startswithrW   rV   rI   rJ   rQ   indexrindex)r:   r0   firstlasts       r1   rZ   rZ      s    A||EGGE1q6Q;!A||F#abEKKMzz!} -xx}zz!E$q&/** -"AdsG,,-s$   ,B 	BB<C C! C!)ra   dictrb   r   returnr   )
r=   rP   r   rP   r   rP   r4   boolr   rP   )r:   rP   r   r   )__doc__
__future__r   rI   r   pathlibr   skills._libr   r   rs   rX   rZ    rw   r1   <module>r      s-   $ #    1I\X;8-rw   