youtube-publish은(는) 무엇을 하나요?
SDK 의존성 없는 YouTube Data API v3 업로더 (plain fetch, 재개 가능 청크 업로드). 배치 업로드용으로 제작됨: 기본 비공개, SHA-256 원장으로 재실행 시 중복 업로드 방지, 메타데이터 린트, 드라이런 및 할당량 인식.
일회성 설정 (사용자가 수행, 에이전트는 수행하지 않음)
- Google Cloud Console: 프로젝트 생성, YouTube Data API v3 사용 설정, 유형 데스크톱 앱의 OAuth 클라이언트 ID 생성.
- 커밋하지 않고 클라이언트를 스크립트에 제공:
export YOUTUBE_CLIENT_ID=... YOUTUBE_CLIENT_SECRET=...(또는 다운로드한 JSON을 저장소 외부에 두고--client-secrets전달). - 채널을 한 번 인증:
동의 페이지를 열고, 리디렉션을 127.0.0.1에서 캐치하며 (PKCE + 상태 확인), 리프레시 토큰을 모드 600으로 저장합니다. 토큰은 절대 출력되지 않습니다.node scripts/auth.mjs --token-file .youtube-token.json
워크플로
# 1. 드라이런: 메타데이터 검증, 파일 해싱, 건너뛰기/업로드 계획 및 할당량 비용 표시
node scripts/upload.mjs --jobs jobs.json --dry-run
# 2. 업로드 (기본 비공개)
node scripts/upload.mjs --jobs jobs.json --token-file .youtube-token.json
# 단일 파일
node scripts/upload.mjs --file publish/short.mp4 --title "How I automated my edits" --tags shorts,automation --privacy unlisted
jobs.json:
[
{ "file": "publish/short-01.mp4", "title": "...", "description": "...", "tags": ["shorts"], "privacy": "private" },
{ "file": "publish/short-02.mp4", "title": "...", "privacy": "private", "publishAt": "2026-11-01T17:00:00Z" }
]
상대 file 경로는 jobs 파일의 폴더를 기준으로 확인됩니다.
규칙
render-qc를 통과하고 사용자가 승인한 파일만 업로드합니다.- 기본 공개 범위는
private입니다.public은 사용자가 명시적으로 요청하고--allow-public을 전달한 경우에만 허용됩니다. 예약된 동영상(publishAt)은 반드시private이어야 하며, YouTube가 해당 시간에 공개로 전환합니다. - 항상 먼저
--dry-run을 실행하고 계획을 사용자에게 보여줍니다. - 토큰, 클라이언트 시크릿,
.env*파일 또는 원장을 절대 출력, 로그 또는 커밋하지 마십시오. 저장소의.gitignore는*token*.json,*credentials*.json,*client_secret*.json,.env*및*ledger*.json을 포함합니다. - 원장(
.youtube-upload-ledger.json)은 게시된 내용의 진실 공급원입니다. 각 업로드 후 저장됩니다. "재시도"를 위해 삭제하지 마십시오. 사용자가 실제로 두 번째 복사본을 원하는 경우에만--force-duplicate를 사용하십시오. - 할당량: 프로젝트는 기본적으로 하루 10,000유닛을 받으며, 한 번의 업로드는 역사적으로 1,600유닛을 소비합니다(약 하루 6회 업로드).
--max-uploads(기본값 6)는 실행이 할당량을 소진하기 전에 중지합니다.--units-per-upload는 Google이 비용을 변경할 경우 추정치를 조정합니다.quotaExceeded발생 시 실행이 중지되고 남은 작업은 다음 날 재실행할 수 있습니다(원장은 완료된 작업을 건너뜁니다). - 제목: 플레이스홀더(TODO, untitled,
{{...}}) 없음, 최대 100자,<또는>없음. 태그 총 최대 500자. 린트가 이를 적용합니다. - 인증되지 않은 API 프로젝트는 Google이 앱을 심사할 때까지 업로드를 비공개로 강제할 수 있습니다. 모든 업로드가 비공개로 반환되면 사용자에게 알리십시오.
확인
각 결과에는 videoId(비공개 상태인 동안 https://youtu.be/<id> 열기) 또는 skipped 사유가 있습니다. node scripts/upload.mjs --check-auth는 업로드 없이 자격 증명을 테스트합니다.