# NotebookLM 통합 — 팟캐스트 오디오 자동생성 파이프라인

## 작업 레벨: Lv.2

## 목표
NotebookLM CLI(`nlm`)를 설치하고, ThreadAuto 콘텐츠에서 팟캐스트 스타일 오디오를 자동 생성하는 래퍼 모듈을 만든다.

## 배경
- 현재 ThreadAuto는 카드뉴스(이미지) + 영상(슬라이드쇼)만 생성
- NotebookLM의 "Audio Overview" 기능: 텍스트 소스 → 2인 대화체 팟캐스트 오디오 자동 생성
- 이 오디오를 영상 배경으로 사용하면 콘텐츠 퀄리티 대폭 향상
- edge-tts(로봇 음성) 대비 훨씬 자연스러운 AI 대화체

## 서버 환경
- Python 3.12 + pip
- Playwright + Chromium 설치됨
- Deno: **미설치** (필요시 설치)
- Go: **미설치**
- yt-dlp: 설치됨
- 서버: 헤드리스 (데스크탑 브라우저 없음, Playwright headless만 가능)

## 작업 범위

### Phase 1: 도구 설치 + 인증

#### 옵션 A: nlm (Deno 기반) — 스크린샷 기준
```bash
# Deno 설치
curl -fsSL https://deno.land/install.sh | sh
# ~/.deno/bin/deno 경로에 설치됨

# nlm 설치
deno install -gArf jsr:@nicholasgriffintn/notebooklm-cli

# 인증
nlm login
# → 브라우저가 열림 → Google 로그인 → 토큰 저장
```

#### 옵션 B: tmc/nlm (Go 기반) — 기능 가장 풍부
```bash
# Go 설치 (필요시)
wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz

# nlm 설치
go install github.com/tmc/nlm/cmd/nlm@latest

# 인증 (브라우저 쿠키 스캔 방식)
nlm auth
```

#### 옵션 C: Python 기반 (pip) — 우리 스택과 호환 최적
```bash
pip install notebooklm-cli
# 또는
pip install notebooklm-mcp-cli

# 인증 (Playwright로 Chrome 시작 → Google 로그인 → 쿠키 추출)
notebooklm-cli auth
```

**판단 기준**: 서버가 헤드리스이므로 Playwright가 이미 있는 Python 기반(옵션 C)을 우선 시도.
설치 실패 시 옵션 A(Deno) 시도.

**인증 이슈**: 헤드리스 서버에서 Google 로그인이 필요. 방법:
1. Playwright headless=False가 안되므로, 로컬에서 인증 후 쿠키/토큰 파일을 서버로 복사
2. 또는 Playwright headless로 Google OAuth 자동화 (기존 비너스 Google OAuth 패턴 참조: `/home/jay/workspace/` 참조)
3. 또는 `--auth-file` 옵션으로 쿠키 파일 직접 지정

**중요**: 인증이 안 되면 나머지 작업 진행 불가. 인증 실패 시 보고서에 상세 기록하고, 가능한 대안(수동 쿠키 복사 등) 제시할 것.

### Phase 2: 래퍼 모듈 생성

프로젝트: `/home/jay/projects/ThreadAuto/`

#### `audio/notebooklm_client.py` — NotebookLM 래퍼

```python
"""NotebookLM 오디오 생성 래퍼 모듈.

카드뉴스 텍스트 → NotebookLM → 팟캐스트 오디오 (MP3/WAV) 변환.
"""
from __future__ import annotations
from pathlib import Path


class NotebookLMClient:
    """NotebookLM CLI를 래핑하여 오디오 생성 자동화."""

    def __init__(self, auth_path: str | None = None):
        """초기화. auth_path: 인증 토큰/쿠키 파일 경로."""

    def create_notebook(self, title: str) -> str:
        """노트북 생성. 반환: notebook_id."""

    def add_text_source(self, notebook_id: str, text: str, title: str = "") -> str:
        """텍스트 소스를 노트북에 추가. 반환: source_id."""

    def generate_audio(self, notebook_id: str, output_path: str) -> str:
        """노트북 소스 기반 오디오 오버뷰 생성.

        - NotebookLM이 2인 대화체 팟캐스트 오디오를 생성
        - 생성된 오디오를 output_path에 저장

        반환: output_path (생성된 오디오 파일 경로)
        """

    def cleanup_notebook(self, notebook_id: str) -> None:
        """사용 완료된 노트북 삭제 (정리)."""


def generate_podcast_from_slides(
    slides: list[dict],
    output_path: str,
    topic_title: str = "",
) -> str:
    """카드뉴스 슬라이드 JSON → 팟캐스트 오디오 생성.

    1. slides에서 텍스트 추출 (title, description, hook 등)
    2. NotebookLM 노트북 생성 + 텍스트 소스 추가
    3. 오디오 오버뷰 생성
    4. 노트북 정리
    5. 오디오 파일 반환

    Args:
        slides: 카드뉴스 슬라이드 딕셔너리 목록
        output_path: 오디오 출력 경로 (.mp3 또는 .wav)
        topic_title: 콘텐츠 주제 (노트북 제목에 사용)

    Returns:
        생성된 오디오 파일 경로
    """
```

#### `audio/__init__.py` — 패키지 초기화

#### `audio/tests/test_notebooklm_client.py` — 단위 테스트

테스트 항목:
1. CLI 도구 설치 확인 (`which nlm` 또는 `which notebooklm-cli`)
2. 인증 상태 확인
3. 노트북 CRUD (mock 또는 실제)
4. slides → 텍스트 추출 로직
5. 오디오 생성 E2E (실제 생성 1건 — 통합 테스트)

### Phase 3: 샘플 테스트

실제 카드뉴스 콘텐츠로 오디오 생성 테스트:
1. `output/pipeline_test/generated_content.json`의 slides 사용
2. `generate_podcast_from_slides()` 호출
3. 생성된 오디오 파일을 `/home/jay/projects/ThreadAuto/output/audio/` 에 저장
4. 오디오 파일 크기, 재생 시간 확인

## 산출물

1. `audio/notebooklm_client.py` — 래퍼 모듈
2. `audio/__init__.py`
3. `audio/tests/test_notebooklm_client.py` — 테스트
4. 설치 스크립트 또는 설치 문서
5. 샘플 오디오 파일 1개 (`output/audio/sample_podcast.mp3`)

## 주의사항

1. **인증이 핵심 난관**: 헤드리스 서버에서 Google 로그인을 해결해야 함. 안 되면 대안 제시.
2. **NotebookLM 오디오 생성 시간**: 보통 2~5분 소요. 타임아웃 충분히 설정.
3. **기존 코드 수정 금지**: 새 `audio/` 디렉토리만 생성. 기존 `video/`, `content/` 등 건드리지 말 것.
4. **비용**: nlm CLI는 무료 (비공식 API). 별도 과금 없음.
5. **오디오 언어**: 한국어 소스 → 한국어 팟캐스트 생성되는지 확인. 영어만 되면 보고서에 명시.
