
    ci2              
          d 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 ddlmZ  ed      Z	e	dz  Z
e
dz  Zej                  j                  d e ee      j!                         j"                  j"                              Z ee      d	z  d
z  Zddedee   defdZdefdZdedefdZdededededef
dZd Zedk(  r e        yy)u  
youtube-check-new-transcripts.py

유튜브 요약 대기 영상 감지 스크립트 (Haiku 팀원용)

Firestore youtube_summary_queue 컬렉션에서 summaryStatus='pending'인 영상을 확인합니다.
새 전문이 있으면 videoId, 제목, 채널명 등의 정보를 JSON으로 출력합니다.

사용법:
    python3 youtube-check-new-transcripts.py
    python3 youtube-check-new-transcripts.py --with-transcript --video-id <videoId>

작업: task-192.1
    N)Path)datetimez/home/jay/projects/insuwikiscriptszyoutube-get-pending.tsWORKSPACE_ROOTmemoryzyoutube-transcriptsscript_pathargsreturnc                    ddt        |       g}|r|j                  |       	 t        j                  |ddt        t              d      }|j
                  dk7  rAt        d|j                   t        j                         |j                  |j
                  d	S |j                  j                         j                  d
      }t        |      D ]M  }|j                         }|j                  d      s%|j                  d      s7	 t        j                   |      c S  d|j                  dS # t        j"                  $ r Y tw xY w# t        j$                  $ r ddicY S t&        $ r}dt        |      icY d}~S d}~ww xY w)u   
    TypeScript 스크립트를 실행하고 JSON 결과를 반환
    
    Args:
        script_path: TypeScript 스크립트 경로
        args: 추가 인수 목록
        
    Returns:
        dict: 파싱된 JSON 결과
    npxzts-nodeT<   )capture_outputtextcwdtimeoutr   u$   [ERROR] 스크립트 실행 실패: file)error
returncode
{}u   JSON 파싱 실패)r   stdoutr   u   타임아웃 (60초)N)strextend
subprocessrunINSUWIKI_PROJECT_DIRr   printstderrsysr   stripsplitreversed
startswithendswithjsonloadsJSONDecodeErrorTimeoutExpired	Exception)r   r	   cmdresultstdout_lineslinees          </home/jay/workspace/scripts/youtube-check-new-transcripts.pyrun_ts_scriptr2   #   sY    )S-
.C

4!()
 !8HszzZ#]]&:K:KLL }}**,2248\* 	D::<Ds#c(:::d++		 .GG	 ++  $$ 1/00 !Q  !s[   A6E AE 3E D-E E -E E EE E>E>'E93E>9E>c                  V    t        dt        j                         t        t              S )u   
    요약 대기 중인 영상 목록 조회
    
    Returns:
        dict: {pendingCount, videos: [{videoId, title, channelName, ...}]}
    u;   [youtube-check-new-transcripts] 대기 영상 조회 중...r   r   r!   r    r2   YOUTUBE_GET_PENDING_SCRIPT     r1   get_pending_videosr8   S   s     

GcjjY344r7   video_idc                 f    t        d|  dt        j                         t        t        dd| g      S )u   
    특정 영상의 전문(transcript) 조회
    
    Args:
        video_id: 유튜브 영상 ID
        
    Returns:
        dict: {videoId, title, channelName, transcript}
    z([youtube-check-new-transcripts] videoId=u    전문 조회 중...r   --with-transcriptz	--videoIdr4   )r9   s    r1   get_transcriptr<   ^   s7     
4XJ>S
T[^[e[ef36I;X`5abbr7   titlechannel_name
transcriptc                    t         j                  dd       |rdj                  d |D              dd nd}t        j                         j                  d      }|  d	| d
}t         |z  }d|xs d d|xs d d|  d|  dt        j                         j                          d| d}t        |dd      5 }	|	j                  |       ddd       t        d| t        j                         |S # 1 sw Y   )xY w)u   
    전문을 로컬 파일로 저장
    
    Args:
        video_id: 유튜브 영상 ID
        title: 영상 제목
        channel_name: 채널명
        transcript: 전문 텍스트
        
    Returns:
        Path: 저장된 파일 경로
    T)parentsexist_ok c              3   J   K   | ]  }|j                         s|d v s|  yw)z -_N)isalnum).0cs     r1   	<genexpr>z"save_transcript.<locals>.<genexpr>|   s     GqQYY[AJGs   ##N2   unknownz%Y%m%d_%H%M%S_u
   _전문.mdz#    (제목 없음)u   

- **채널**: u   (채널 없음)u   
- **영상 ID**: u3   
- **원본 URL**: https://www.youtube.com/watch?v=u   
- **저장일**: u   

---

## 전문

r   wzutf-8)encodingu6   [youtube-check-new-transcripts] 전문 저장 완료: r   )TRANSCRIPT_DIRmkdirjoinr   nowstrftime	isoformatopenwriter   r!   r    )
r9   r=   r>   r?   
safe_title	timestampfilenamefilepathcontentfs
             r1   save_transcriptr]   l   s%    5 QVGEGGL[dJ''8I1ZL
3H(H U//0 1001 2 33;* =,,.**,- .  G 
hg	. !	 
B8*
MTWT^T^_O	 s   6C00C9c            
         t        j                  d      } | j                  ddd       | j                  dt        d	       | j                  d
dd       | j                  dddgdd       | j	                         }|j
                  r|j                  s0t        dt        j                         t        j                  d       t        |j                        }d|v r5t        t        j                  |d             t        j                  d       |j                  rQ|j                  d      r@t        |d   |j                  d      |j                  d      |d         }t        |      |d<   |j                   dk(  rt        d       t        d|j                  d              t        d|j                  d              t        d|j                  d              t        d t#        |j                  dd!             d"       t        |j                  dd#      d d$ d%z          y t        t        j                  |dd&'             y t%               }d|v r5t        t        j                  |d             t        j                  d       |j                   dk(  rt        d(|j                  d)d*       d+       t'        |j                  d,g       d      D ]  \  }}t        d-| d.|j                  dd/              t        d0|j                  d              t        d1|j                  d              t        d2|j                  d3              t        d4|j                  d5      rd6nd7         n!t        t        j                  |dd&'             |j                  d)d*      d*k(  rt        j                  d*       y y )8Nu2   유튜브 요약 대기 영상 감지 스크립트)descriptionr;   
store_trueu   특정 영상의 전문 조회)actionhelpz
--video-idu5   전문 조회할 영상 ID (--with-transcript 필요))typerb   z--save-transcriptu!   전문을 로컬 파일로 저장z--formatr'   r   u   출력 형식 (기본: json))choicesdefaultrb   u6   [ERROR] --with-transcript 사용 시 --video-id 필요r      r   F)ensure_asciir?   videoIdr=   channelNamesavedTou   === 영상 정보 ===z
Video ID: u   제목: u   채널: u   
=== 전문 (rC   u   자) ===u   (없음)i  z...   )rg   indentu   === 요약 대기 영상 (pendingCountr   u   개) ===videosr   z. rL   z   Video ID: u      채널: u      업로드일: publishedAtu      자막: hasTranscriptu   있음u   없음)argparseArgumentParseradd_argumentr   
parse_argswith_transcriptr9   r   r!   r    exitr<   r'   dumpsr]   getformatlenr8   	enumerate)parserr	   r-   rZ   ivideos         r1   mainr      sN   $$1efF
+L=  ?
3T  V
+L@  B

VV,<f;  = D}}JQTQ[Q[\HHQK.f$**V%89HHQK FJJ|$<&y!

7#

=)|$	H !$HF9;;& )+Jvzz)4567HVZZ0123HVZZ6789N3vzz,'C#D"EXNO&**\:6t<uDE$**V%BC $%f$**V%89HHQK;;& .vzz.!/L.MXVW%fjj2&>B \51#R		'3D EFGHeii	&:%;<=EIIm$<#=>?)%))M*B)CDE		/0JHPX#YZ[\ $**V%BC ::na(A-HHQK .r7   __main__)N)__doc__r'   osr   r!   rq   pathlibr   r   r   SCRIPTS_DIRr5   environrx   r   __file__resolveparent_WORKSPACE_ROOTrO   listdictr2   r8   r<   r]   r   __name__r6   r7   r1   <module>r      s    	  
    9: "Y.(+CC  **..!13tH~7M7M7O7V7V7]7]3^_o&14II-!t -!49 -! -!`5D 5cS cT c(c (# (S (c (VZ (VAH zF r7   