Communitygithub.com

Hammadbaig-hub/daily-shorts-media

매일 하나의 무료 애니메이션 텍스트 기반 YouTube Shorts를 자동 제작 및 게시합니다. 새로운 주제를 선정하고, 웹에서 모든 사실을 검증한 후, 코드로 1080x1920 영상을 렌더링하고(무료), GitHub에 호스팅한 후 Metricool을 통해 YouTube에 예약 게시합니다. 영어와 우르두어가 번갈아 가며 게시됩니다.

daily-shorts-media란 무엇인가요?

이 스킬은 YouTube 채널 'Bright Life'를 위해 하루에 하나씩 '정보' 및 '동기 부여' 스타일의 YouTube Shorts를 완전 자동으로 제작하고 게시하는 AI 에이전트를 위한 것입니다. 사용자가 예산이 없음을 감안하여, 무료 오픈소스 도구(Pillow, ffmpeg, Kokoro TTS)만을 사용하여 비디오를 렌더링하고 음악을 합성하므로 저작권 문제가 없습니다. 모든 사실은 게시 전에 WebSearch를 통해 신뢰할 수 있는 소스(예: NASA, 브리태니커 백과사전)에서 검증되어 채널의 신뢰도를 높이고 YouTube의 품질 기준을 충족합니다. 오프라인 Kokoro TTS 모델을 사용하여 영어(am_michael)와 우르두어(hm_omega, 일부 음소 매핑) 내레이션을 생성하며, 각 슬라이드는 내레이션 길이에 맞춰집니다. 완성된 비디오는 GitHub에 푸시되고 Metricool API를 통해 YouTube에 예약 게시(파키스탄 시간 오후 7시)됩니다. 이 스킬은 Claude Code, Cursor, Codex 등 코드 작성 및 API 호출이 가능한 모든 AI 에이전트 플랫폼에서 작동하도록 설계되었습니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Hammadbaig-hub/daily-shorts-media/tree/HEAD/tools

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

YouTube Daily Shorts

완전 자동, 무료, 하루 하나의 Shorts. 이 채널은 "혹시 알고 계셨나요?" 스타일의 사실과 짧은 동기 부여 글을 영어와 우르두어로 번갈아 게시합니다.

고정 설정 (사용자가 변경하면 여기서 수정)

설정값
GitHub 미디어 저장소Hammadbaig-hub/daily-shorts-media (공개, main 브랜치) — 렌더링 도구는 tools/ 디렉토리에 있음
Metricool 브랜드 (blogId)7592220, 시간대 Asia/Karachi
채널"Bright Life", 핸들 @Bright-Life-m4 (핸들은 script.json에 입력; CTA는 "Bright Life"를 언급)
게시 시간파키스탄 시간 19:00 (해당 시간이 지났으면 다음 빈 슬롯; 현재로부터 최소 15분 이후)
공개 범위공개 (사용자가 완전 자동 업로드를 선택함)

이 방식이 채택된 이유

  • 무료: 사용자에게 예산이 없으므로, 비디오는 Pillow + ffmpeg (tools/scripts/make_short.py 스크립트)로 그려지고 음악은 동일한 스크립트 내에서 합성됩니다. 따라서 Content ID 저작권 주장이 발생하지 않습니다.
  • 음성 해설: 내레이션은 Kokoro에서 제공됩니다. Kokoro는 CPU에서 오프라인으로 실행되는 작고 무료인 신경망 TTS(Text-to-Speech) 모델입니다(tools/scripts/voice.py). 약 350MB의 모델 파일은 GitHub 릴리스에서 처음 한 번 다운로드되어 ~/tts에 저장됩니다. 영어는 am_michael 음성을 사용하고, 우르두어는 우르두어 스크립트 텍스트로 힌디어 음성 hm_omega를 사용하며, 일부 음소가 다시 매핑됩니다. 각 슬라이드는 해당 내레이션 길이만큼 지속되며, 음악은 내레이션 아래에서 줄여져 재생됩니다. 클라우드 TTS(Microsoft/Google)는 워크스페이스에서 차단되어 있어 오프라인 방식을 사용합니다.
  • GitHub 호스팅: Metricool은 공개 비디오 URL이 필요합니다. 클라우드 워크스페이스는 GitHub에 푸시할 수 있고, raw 파일 URL이 공개되므로 이것이 브리지 역할을 합니다.
  • 사실 확인: 사실 채널은 정확성에 달려 있습니다. YouTube는 또한 대량 생산되거나 가치가 낮거나 오해의 소지가 있는 콘텐츠를 억제하며, 잘못된 "사실"은 싫어요와 수정 댓글을 유발합니다. 모든 사실은 사용되기 전에 검증됩니다. 이것이 실제 가치를 더하는 작업 부분입니다.

일일 워크플로우

1. 저장소 가져오기 및 오늘 계획 세우기

cd ~ && (git -C daily-shorts-media pull -q || git clone https://github.com/Hammadbaig-hub/daily-shorts-media.git)
pip install -q --break-system-packages kokoro-onnx soundfile pillow numpy
python daily-shorts-media/tools/scripts/plan_today.py daily-shorts-media/history.json

저장소가 세션에 없으면, 먼저 add_repo (소유자 Hammadbaig-hub, 저장소 daily-shorts-media, 접근 권한 push)로 첨부하고 클론합니다.

plan_today.py는 오늘의 lang(언어), theme(주제), 오늘 이미 비디오가 게시되었는지 여부, 그리고 지금까지 사용된 모든 주제를 반환합니다. posted_today가 true이면 중단하고 보고합니다. 절대 하루에 두 번 게시하지 마십시오.

2. 주제 선정

채널의 다양성을 유지하기 위해 카테고리를 순환합니다: 우주, 동물, 인체, 역사, 지리, 과학, 기술, 음식, 해양, 발명품, 언어, 그리고 대략 5일에 한 번 정도 동기 부여 글(실제 연구나 잘 기록된 실화에 기반한 교훈이나 습관). already_done 목록에 없고, 거의 중복되지 않는 것을 선택하십시오.

다음은 피하십시오: 의학 또는 식이요법 관련 조언, 정치, 종파적 또는 종교적 논쟁, 실제 개인에 관한 모든 것, 그리고 일반적으로 반복되는 신화에 기반한 "사실" (예: 금붕어의 3초 기억, 만리장성이 우주에서 보인다는 것 등).

3. 스크립트 작성 및 검증

호기심을 유발하는 12단어 미만의 후크, 3~5개의 사실 (각각 한 문장, 25단어 미만), 그리고 CTA를 작성합니다.

모든 사실에 대해 WebSearch를 실행하고 신뢰할 수 있는 출처(NASA, 내셔널 지오그래픽, 브리태니커, 대학, 동료 검토 연구, 주요 백과사전)에서 확인합니다. 사실을 확인할 수 없거나 출처가 일치하지 않으면 해당 사실을 버리고 다른 사실을 사용합니다. 출처 URL은 설명에 포함되므로 보관하십시오.

우르두어 날: 파키스탄 시청자가 말하는 자연스럽고 간단한 우르두어 스크립트(로만 우르두어가 아닌 우르두어 문자)로 작성하며, 직역하지 않습니다. 숫자는 우르두어 단어(بیس فیصد, ہزاروں)로 작성하여 음성이 올바르게 발음하도록 합니다.

CTA 예시 — 영어: "Follow Bright Life for a new fact every day". 우르두어: "روزانہ نئے حقائق کے لیے برائٹ لائف کو فالو کریں".

script.json으로 저장:

{"lang": "en", "hook": "...", "facts": ["...", "..."], "cta": "...",
 "handle": "@Bright-Life-m4", "theme": 2}

4. 렌더링

python daily-shorts-media/tools/scripts/make_short.py script.json daily-shorts-media/videos/<날짜>-<슬러그>.mp4 > render.log 2>&1

렌더링은 CPU에서 약 5분 정도 걸리므로 Bash run_in_background로 실행하고 완료 알림을 기다리십시오. pgrep -f make_short 루프로 기다리지 마십시오. 자신의 명령줄과 일치하여 절대 종료되지 않습니다. 길이는 내레이션에 따라 결정되며, 일반적으로 35개 사실에 대해 2545초입니다. Shorts로 유지되도록 55초 미만으로 유지하십시오. 사실이 길면 5개 대신 3개를 사용하십시오.

텍스트가 음성으로 읽히기 때문에 듣기 좋게 작성하십시오: 어색한 기호는 풀어 쓰고(영어에서 "%" 대신 "percent", 우르두어에서 "فیصد"), 괄호와 약어를 피하며, 문장을 짧게 유지하여 음성이 서두르지 않도록 합니다. 그런 다음 한 프레임을 캡처하여 Read로 텍스트 오버플로우나 깨진 우르두어를 확인합니다:

ffmpeg -loglevel error -y -ss 5.5 -i <비디오> -frames:v 1 check.png

텍스트가 화면 밖으로 나가거나 잘못 보이면 해당 줄을 줄이고 다시 렌더링합니다.

5. GitHub에 푸시

오늘의 항목을 history.json에 추가합니다: {"date": "...", "lang": "...", "theme": n, "topic": "...", "title": "...", "file": "videos/...mp4"}

videos/ 디렉토리에는 최신 .mp4 파일 20개만 유지합니다(이미 YouTube에 있는 오래된 파일은 삭제하여 저장소를 작게 유지). 그런 다음:

cd daily-shorts-media && git add -A && git commit -qm "Short <날짜>: <주제>" && git push -q

공개 URL: https://raw.githubusercontent.com/Hammadbaig-hub/daily-shorts-media/main/videos/<파일>.mp4

예약 전에 200 응답이 오는지 확인합니다(curl -sI <url> | head -1). 워크스페이스에서 해당 호스트에 연결할 수 없으면 푸시가 성공했다고 믿고 계속 진행합니다.

6. Metricool을 통해 YouTube에 예약

createScheduledPost를 호출합니다. blogId는 7592220, 최상위 date (YYYY-MM-DDT19:00:00+05:00 — 이 값이 없으면 호출이 실패함), 그리고 다음 info JSON을 포함합니다 (Metricool은 비디오를 자체 저장소로 복사하므로 GitHub 파일은 나중에 정리될 수 있음):

{
  "providers": [{"network": "youtube"}],
  "text": "<설명>",
  "media": ["<raw GitHub URL>"],
  "publicationDate": {"dateTime": "YYYY-MM-DDT19:00:00", "timezone": "Asia/Karachi"},
  "autoPublish": true,
  "draft": false,
  "descendants": [], "firstCommentText": "", "hasNotReadNotes": false,
  "mediaAltText": [], "shortener": false, "smartLinkData": {"ids": []},
  "youtubeData": {
    "title": "<제목>",
    "type": "short",
    "privacy": "public",
    "tags": ["facts", "did you know", "..."],
    "category": "EDUCATION",
    "madeForKids": false,
    "isAiGeneratedContent": false
  }
}

isAiGeneratedContent는 false입니다. 비디오가 일반 애니메이션 텍스트이지 사실적인 합성 영상이 아니기 때문입니다. YouTube의 공개 요구 사항은 사실적으로 조작된 미디어를 위한 것입니다. 이후 버전에서 AI 생성 사실적인 영상이나 음성을 추가하는 경우 true로 설정하십시오.

제목: 70자 미만, 호기심 유발 후크 + #shorts. 해당 언어로 작성합니다. 예: Your Brain Can't Feel Pain?! 🧠 #shorts

설명: 후크를 확장하는 23줄, 그 다음 Sources:와 함께 확인한 URL들, 마지막으로 35개의 해시태그 (#facts #didyouknow #shorts 및 주제 태그; 우르두어 날은 #urdu #urdufacts 추가).

7. 보고

로만 우르두어로 몇 줄로 사용자에게 알립니다: 주제, 언어, 제목, 예약 시간, Metricool plannerUrl. 예약된 작업으로 실행 중이고 지켜보는 사람이 없으면 SendUserMessage로 해당 요약을 보냅니다.

주간 점검 (일요일 또는 "채널 kaisa chal raha hai"라고 물을 때)

지난 7일간 YouTube 네트워크에 대해 getAnalyticsDataByMetrics를 사용합니다 (조회수, 시청 시간, 획득 구독자 수, 인기 동영상). 어떤 카테고리와 언어가 더 많은 조회수를 얻었는지 요약하고, 이를 바탕으로 다음 주 주제 선택을 성과가 좋은 쪽으로 기울입니다. 사용자가 달리 말하지 않는 한 언어 교대를 유지합니다.

문제 발생 시

  • Metricool이 게시를 거부: 정확한 오류를 보고합니다. 동일한 입력으로 재시도하지 마십시오. 일반적인 원인: 최상위 date 누락, 비디오 URL에 아직 접근 불가능 (1분 정도 기다렸다가 한 번 재시도), 또는 Metricool의 YouTube 연결이 만료됨 (사용자가 Metricool에서 다시 연결해야 함).
  • Git 푸시 실패: 저장소에 푸시 권한이 첨부되지 않음 — add_repo를 access: push와 함께 호출합니다. 여전히 Claude에 GitHub 액세스 권한이 없다고 표시되면, Claude GitHub 앱이 daily-shorts-media를 선택된 저장소에 포함시켜야 합니다 (github.com/settings/installations → Claude → Configure). GitHub에서 2FA를 요구하므로 사용자가 직접 이 단계를 확인합니다.
  • 글꼴 누락: 저장소의 tools/assets/fonts/ 디렉토리에 있습니다. 스크립트는 그곳에서 글꼴을 읽습니다.
  • 음성 모델 다운로드 실패: script.json에 "voice": false를 설정하여 렌더링합니다 (음악만 있는 비디오). 보고서에 이 사실을 언급합니다.

관련 스킬