Parent PRD
#5
What to build
nlm CLI를 subprocess로 래핑하는 NotebookLM 서비스를 만든다. 첫 요청 시 노트북 존재 여부를 확인하고, 없으면 자동 생성한다. 콘텐츠 생성 요청이 오면 자막 텍스트를 소스로 추가(URL 기준 중복 체크)하고, nlm audio create를 실행하여 artifact_id를 반환한다.
4개 API 엔드포인트 구현:
POST /api/notebooklm/generate — type, source_text, url을 받아 콘텐츠 생성 시작
GET /api/notebooklm/status/<artifact_id> — 생성 진행 상태 폴링
GET /api/notebooklm/download/<artifact_id> — 완성 파일 다운로드 (Phase 4에서 완성, 여기선 스텁)
GET /api/notebooklm/auth-check — nlm login --check 결과 반환
노트북 ID와 URL→source_id 매핑은 data/notebooklm_state.json에 저장하여 재사용.
이 Phase 완료 시 curl로 팟캐스트 생성 요청 → 상태 폴링 → 완료 확인까지 가능해야 한다.
Acceptance criteria
Blocked by
None - can start immediately
User stories addressed
- User story 1 (팟캐스트 생성)
- User story 12 (노트북 자동 생성/재사용)
- User story 13 (자막 소스 자동 추가, 중복 방지)
- User story 17 (인증 안내)
Parent PRD
#5
What to build
nlmCLI를 subprocess로 래핑하는 NotebookLM 서비스를 만든다. 첫 요청 시 노트북 존재 여부를 확인하고, 없으면 자동 생성한다. 콘텐츠 생성 요청이 오면 자막 텍스트를 소스로 추가(URL 기준 중복 체크)하고,nlm audio create를 실행하여 artifact_id를 반환한다.4개 API 엔드포인트 구현:
POST /api/notebooklm/generate— type, source_text, url을 받아 콘텐츠 생성 시작GET /api/notebooklm/status/<artifact_id>— 생성 진행 상태 폴링GET /api/notebooklm/download/<artifact_id>— 완성 파일 다운로드 (Phase 4에서 완성, 여기선 스텁)GET /api/notebooklm/auth-check—nlm login --check결과 반환노트북 ID와 URL→source_id 매핑은
data/notebooklm_state.json에 저장하여 재사용.이 Phase 완료 시
curl로 팟캐스트 생성 요청 → 상태 폴링 → 완료 확인까지 가능해야 한다.Acceptance criteria
POST /api/notebooklm/generate호출 시 노트북 자동 생성 + 소스 추가 + 팟캐스트 생성 시작, artifact_id 반환GET /api/notebooklm/status/<artifact_id>호출 시in_progress/completed/failed상태 반환GET /api/notebooklm/auth-check호출 시 인증 상태 + 계정 이메일 반환nlm login안내 포함)notebooklm_service.py단위 테스트 — subprocess mock으로 노트북 생성/소스 추가/생성/상태 폴링 검증Blocked by
None - can start immediately
User stories addressed