작업 규칙 — ytmine
📑 인덱스: 🆕 신규 / §1 웹 UI(web.py) / §2 전사 파이프라인
🆕 신규
- [코디] 2026-09-10 — 오디오 다운로드 403이면 영어 영상은 영어 자동자막(en)으로 대체. yt-dlp 2026.07.04에서
process가download_audio단계에서HTTP Error 403: Forbidden로 죽었다(메타데이터·자막 조회는 정상, 오디오 스트림만 막힘 → yt-dlp 구버전 추정). 우회 방법:yt_dlp --skip-download --write-auto-subs --sub-langs en --sub-format vtt로 vtt를 받고 → 줄 단위 dedup(롤업 cue는 앞 cue의 마지막 줄이 다음 cue 첫 줄로 반복되므로, 직전 줄과 같으면 버린다) + 30초 블록으로 병합 →process와 같은 rec 구조로raw/<id>.json저장 +write_md(source=auto_sub:en). 줄 dedup 후 단어 수가 단순 중복 제거 결과와 일치했다(10,761·13,900) =parse_vtt의 cue 단위 dedup이 못 거르는 부분중복까지 해결됨. raw json을 같은 포맷으로 두면 web.py·텔레그램 요약이 재전사 없이 재사용한다. 근본 해결 = yt-dlp 업그레이드 → ✅같은 날 2026.8.19로 올려서 해소 확인. 오디오 403이 다시 나면 우회보다python -m pip install -U yt-dlp가 먼저다(유튜브가 바뀌면 yt-dlp가 몇 주 안에 따라간다). - 2026-08-02 — "Groq 되나?" 점검은 유튜브 새로 받지 말고 기존 raw 오디오 15초 클립으로.
data/*/raw/*.16k.ogg하나에서 imageio-ffmpeg로 15초 자르고ytmine._transcribe_groq(clip)호출 → 1초 안에 판정(다운로드·쿼터 소모 최소). 판정 기준은 예외 유무가 아니라transcribe_audio(backend="groq")의 source 태그가stt:groq:*인지 — 폴백이 예외를 삼켜서 "에러 없이 로컬로 돌아간" 상태가 성공처럼 보인다.selfcheck출력의groq 실패 -> local 폴백: 429 rate limit (테스트)는 일부러 넣은 단위검증 로그라 장애로 오독 금지. - 2026-07-27 — 텔레그램
ytmine <링크>= 기본 명령어(페페 지시). 처리 주체는 broker(tools/cody-permission-broker/broker.py_maybe_handle_ytmine), 전사·요약은 web.py(8795) HTTP 위임(로직 중복 금지). 폴링 루프에서 ytmine 명령이면continue— 안 그러면_maybe_handle_ask_reply가 "열린 질문 답변"으로 삼킨다. 텔레그램 HTML은 b/i/u/s/a/code/pre만 허용이라 요약의h3/ul/li는 변환 필수(_ytmine_html_to_tg), 4096자 한도 → 3500자 분할, 파서 400 나면 태그 제거 평문 재전송. web.py는 HKCU Runytmine_web으로 자동시작(꺼져 있으면 broker가 web.bat 띄우고 1회 재시도). - 2026-07-26 — STT는 Groq 1순위 + 로컬 자동 폴백(페페 지시).
transcribe_audio()가 groq 실패(키없음·401·429 한도초과·네트워크)를 잡아 faster-whisper CPU로 넘어간다. 무료 한도 실측 = 2,000 RPD / 20 RPM / 오디오 28,800초·하루 8시간 분량(ASD가 실질 병목, 회수 아님).source:태그가 실제 쓴 백엔드라 폴백 여부는 결과 md로 확인. 폴백 구간은 RTF~0.75라 느리다 — 대량 배치 시 예상시간(estimate RTF 0.01) 대비 오래 걸리면 한도에 걸린 것. - 2026-07-26 — 로컬 웹서버는 "방화벽 허용 python"으로 띄운다. 이 PC는 인바운드가 프로그램 단위로 허용돼 있고(시스템
python312/python39는 허용, 프로젝트 venv python은 미허용), venv python으로 서빙하면 로컬은 되는데 폰·타 tailnet 기기에서 접속이 안 된다. → 서버 = 시스템 python312 + 표준 라이브러리, 무거운 작업(yt-dlp·STT)은 venv 서브프로세스. 근거 =handoff.md"웹 UI". - 2026-07-26 — 새 포트는 띄우기 전에
netstat -ano | grep LISTENING으로 점유 확인. 8792를 잡았다가 talklog_server가 이미 쓰고 있어서(Windows는 SO_REUSEADDR로 중복 바인드가 조용히 성공) 404가 났다. 8788/8790/8791/8792/8793/8799 = 선점, ytmine web = 8795. - 2026-07-29 — API 키는
C:\dev\.secrets\.env하나만.ytmine\.env는 노브 전용(포트·모델·플래그)으로 격하했고,ytmine.py·web.py로더가 로컬.env다음에.secrets\.env도 읽는다(setdefault라 로컬 노브 우선). 키를 프로젝트.env에 다시 적지 말 것. ⚠상주 웹서버(:8795)는 재시작해야 새 키를 읽는다(env는 기동 시 1회 로드). - 2026-07-29 — Groq 403을 "키 만료"로 읽지 말 것.
urllib기본 UA를 Cloudflare가 차단해 403error code: 1010을 준다. 브라우저 UA를 붙이면 200(구 키도 실제로는 살아 있었다 = 재발급 헛수고). 공식groqSDK는 자기 UA를 붙이므로 무관. 전역 규칙 =rules/tooling.md. - 2026-07-29 — 요약 LLM = 제미나이
gemini-3.6-flash고정. 그록 경로·XAI_API_KEY·YTMINE_FALLBACK분기를web.py에서 삭제했다(페페 지시: 사용처 없음). 다시 넣지 말 것 — 폴백 개념 없이 단일 경로다. - ~~2026-07-26 — 요약 LLM = 그록(페페 지정), 폴백만 제미나이.~~ (26.7.29 폐기 — 위 항목이 유효). 남길 사실 둘: ⚠Groq(STT) ≠ 그록(요약) — 이름만 비슷한 다른 회사다. Groq 무료 TPM 12,000이라 1시간 전사본(≈2.5만 토큰) 요약을 단일 요청으로 못 받는다(요약엔 애초에 안 씀).