Communitygithub.com

Michael-Steshenko/aoe-editor

전체 Age of Empires 동영상 편집 및 YouTube 게시 워크플로우. 녹화 세션에서 개별 게임 클립을 감지 및 자르고, 연령 전환 챕터를 추출하며, 사후 분석을 유지하고, 대기열/유휴 시간을 정리하며, 7분 미만 게임은 폐기하되 번호를 유지하고, 편파적인 게임은 검토용으로 표시하며, 각 동영상 파일명과 일치하는 맞춤형 YouTube 썸네일을 생성하고, YouTube 예약 대기열을 동적으로 점검하며, 동영상을 1v1 및 팀 게임 재생목록에 할당하고, 소스 파일을 보존하며, 완료된 녹화 파일명에 ' - aoe-editor-done'을 추가하여 처리 완료를 표시합니다.

aoe-editor란 무엇인가요?

이 스킬은 Age of Empires 게임 플레이 녹화 세션을 자동으로 처리하여 개별 경기 클립으로 분할하고, 진정성 있는 YouTube 썸네일을 생성하며, YouTube 업로드를 관리하는 완전한 엔드 투 엔드 워크플로우를 제공합니다. 수동 편집 없이 대규모 녹화 세션을 깔끔한 개별 하이라이트로 변환하고자 하는 콘텐츠 제작자에게 특히 유용합니다. Windows 환경에서 Claude Code 또는 다른 AI 에이전트와 함께 사용하도록 설계되었습니다. 이 워크플로우는 먼저 녹화 파일의 파일 이름에서 날짜를 추출하여 대상 폴더 구조를 만든 다음, FFmpeg 등을 사용하여 인게임 화면 전환을 감지하고 각 게임 클립을 7분 미만인 게임은 자동으로 건너뛰면서 추출합니다. 또한, 굵은 타이포그래피와 역동적인 텍스트 배치를 사용하여 맞춤형 YouTube 썸네일을 생성하며, 썸네일에 승패를 암시하는 스포일러나 경기 결과가 노출되지 않도록 주의합니다. 마지막으로, 처리된 각 게임에 대해 스포일러 없는 YouTube 제목을 생성하고, `yutu` 도구를 사용하여 예약 업로드를 위해 YouTube에 제목을 게시합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Michael-Steshenko/aoe-editor-skill

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

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

문서

AoE Editor

이 스킬을 사용하여 긴 Age of Empires (AoE) 게임 플레이 녹화 세션을 깔끔한 개별 경기 클립으로 처리하고, 진정성 있는 YouTube 썸네일을 생성하며, 예약된 YouTube 업로드를 관리하세요.

엄격한 안전 및 보안 가드레일

1. 원본 녹화 보존 및 완료 표시

[!IMPORTANT] 원본 녹화를 절대 삭제하지 말고 완료된 파일에 - aoe-editor-done을 추가하세요 에이전트는 어떤 상황에서도 원본 녹화 파일(예: $env:USERPROFILE\Videos\)을 삭제, 제거 또는 덮어쓰면 안 됩니다.

  • 처리 중에도 원본은 그대로 유지: 클립이 성공적으로 추출, 검토 또는 YouTube에 업로드된 후에도 원본 세션 영상을 절대 삭제해서는 안 됩니다.
  • 완료 후 이름 변경 ( - aoe-editor-done): 소스 녹화의 모든 게임이 편집, 분할, 확인 및 대상 날짜 폴더에 저장된 후, 소스 파일 확장자 앞에 - aoe-editor-done을 추가하여 이름을 변경해야 합니다:
    • 예시 (.mp4): 2026-10-27 20-35-29.mp4 -> 2026-10-27 20-35-29 - aoe-editor-done.mp4
    • 예시 (모든 확장자): <filename>.<ext> -> <filename> - aoe-editor-done.<ext>
    • PowerShell 명령:
      $item = Get-Item "<SourcePath>"
      Rename-Item -Path $item.FullName -NewName "$($item.BaseName) - aoe-editor-done$($item.Extension)"
      
  • 이미 완료된 파일 건너뛰기: 처리할 세션 녹화를 스캔하거나 식별할 때, 확장자 앞에 - aoe-editor-done이 있는 파일은 항상 무시하고 건너뜁니다.
  • 폐기된 게임: 건너뛰거나 폐기된 게임(예: 길이 < 7분)의 경우, 해당 세그먼트 추출을 건너뜁니다. 소스 비디오의 어떤 부분도 자르거나, 잘라내거나, 삭제하지 마십시오.
  • 임시 파일 정리만 허용: 임시/스크래치 폴더에 있는 샘플 프레임 JPEG와 같은 임시 스크래치 파일만 정리할 수 있습니다. 소스 비디오 파일은 절대 삭제하지 마십시오.

2. 엄격한 보안 및 자격 증명 보호

[!CAUTION] 자격 증명 또는 토큰 파일을 절대 읽지 마십시오 에이전트는 어떤 상황에서도 자격 증명 파일, 비밀 또는 토큰의 내용을 읽거나, 보거나, 표시하거나 검사해서는 안 됩니다.

  • 검사 금지: 특히, $env:USERPROFILE\Videos\yt-uploader\ 안에 있는 파일(예: request.token, youtube.token.json, client_secrets.json 또는 *.token / *.json 자격 증명 파일)을 절대 읽거나, 검사하거나, cat, print 또는 출력하지 마십시오.
  • 실행만 허용: yutu를 실행할 때는 환경 변수(YUTU_CREDENTIAL, YUTU_CACHE_TOKEN)와 명령줄 플래그로만 호출하십시오. 그것이 읽는 토큰이나 비밀을 절대 검사하거나 출력하지 마십시오.

3. 무인 처리 중 절전 방지 (기본 절전 방지)

워크플로우가 완전히 무인으로 실행될 수 있도록 (감지, 클립 자르기, 썸네일 렌더링 또는 YouTube에 배치 업로드) 사용자 디스플레이는 정상적으로 꺼지거나 절전 모드로 전환되도록 허용하려면:

  • 기본 방법 (네이티브 Windows API - 화면 절전 가능): ES_CONTINUOUS | ES_SYSTEM_REQUIRED (0x80000001) 플래그와 함께 Windows SetThreadExecutionState를 사용합니다. 이는 Windows에 백그라운드 처리/업로드가 진행 중임을 알려 CPU, 디스크 및 네트워크가 절대 절전 모드로 전환되지 않도록 보장하는 동시에, 모니터는 일반 Windows 전원 설정에 따라 꺼지거나 절전 모드로 전환되도록 허용합니다:
    $sig = '[DllImport("kernel32.dll", SetLastError=true)] public static extern int SetThreadExecutionState(int esFlags);'
    $power = Add-Type -MemberDefinition $sig -Name 'PowerHelper' -Namespace 'SystemSleep' -PassThru
    # 시스템 절전 방지 (디스플레이 절전 허용)
    $power::SetThreadExecutionState([int]0x80000001)
    
  • 절전 잠금 해제: 모든 배치 작업 또는 업로드가 완료되면 실행 상태를 기본 연속 모드로 재설정합니다:
    $power::SetThreadExecutionState([int]0x80000000)
    
  • 대안 (Caffeine): Caffeine이 caffeine64.exe에 설치되어 있습니다. Caffeine은 59초마다 키보드 입력을 시뮬레이션하므로 모니터를 물리적으로 끄지 않는 한 디스플레이 절전을 방지합니다. 표준 방법으로 위의 네이티브 방법을 사용하십시오.
  • 권장 시간 / 사용법:
    • 배치 작업 기간 동안(특히 업로드, 6-8GB 비디오의 경우 1-3시간 소요 가능) 활성 상태를 유지하고 완료 즉시 해제합니다.

대상 폴더 구조

처리된 모든 게임과 썸네일은 녹화 파일 이름에서 파생된 날짜 형식의 하위 폴더 내 aoe 디렉토리에 저장됩니다:

$env:USERPROFILE\Videos\aoe\<DDMmmYY>\
  ├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).mp4
  ├── Game 1 - <MyCiv> vs <OpponentCiv> (<Map> - <Result>).png       # 비디오 이름과 정확히 일치하는 썸네일
  ├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).mp4 # (예: Game 2는 <7m으로 폐기됨)
  ├── Game 3 - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result>).png
  └── ...

날짜 폴더 규칙

  • 날짜는 비디오 파일 이름에서 구문 분석됩니다: YYYY-MM-DD ...
    • 예: 2026-10-27 20-35-29.mp4 -> 27Oct26
    • 예: 2026-10-29 19-46-42.mp4 -> 29Oct26
    • 형식: <일><3-문자 월><2-자리 연도> (예: 13Oct26, 27Oct26, 29Oct26).

게임 필터링 및 시간 규칙

  1. 7분 미만의 짧은 게임 (자동 폐기 / 내보내기 건너뛰기):

    • 인게임 시간이 7분 미만인 모든 게임(예: 조기 항복, 연결 끊김, 실패한 시작)은 내보내기에서 건너뛰어야 합니다 (출력 클립으로 추출하거나 저장하지 않음). 원본 소스 비디오의 어떤 부분도 삭제, 자르기 또는 수정하지 마십시오.
    • 순차 번호 보존: 폐기된 게임은 녹화 세션에서 자신의 순차 번호를 계속 사용합니다.
      • 예: Game 1이 18분, Game 2가 2분(폐기), Game 3이 25분인 경우, 결과 출력 파일은 Game 1 - ... 다음에 Game 3 - ...이 됩니다. Game 2는 파일 목록에서 건너뛰어 번호가 원래 경기 순서를 정확하게 반영하도록 합니다.
  2. 편파적 / 지루한 게임 (자르기 및 사용자 검토):

    • 게임이 매우 편파적이거나 지루해 보이는 경우(예: 초기 대규모 점수 차이, 최소한의 저항/교전, 비경쟁적인 압승):
      • 게임을 잘라서 평소처럼 날짜 폴더에 저장하여 로컬 영상을 보존합니다.
      • 사용자에게 알림: 클립 세부 정보, 타임스탬프 및 편파적/지루하다고 느낀 이유를 사용자에게 알립니다. YouTube 업로드 대기열에 추가할지 여부를 결정하기 전에 클립을 검토하도록 사용자에게 요청합니다.

게임 감지 및 트리밍 규칙

  1. 클립 시작 지점:

    • 로딩 화면이 게임 시작(마을 회관 및 시작 유닛 등장)으로 전환되는 즉시 시작합니다.
  2. 클립 종료 지점 및 사후 분석:

    • 사후 분석 유지: 플레이어가 사후 게임 성과 화면(요약, 군사, 경제, 기술, 사회)을 검토하거나 리플레이 분석을 시청하는 경우, 이를 게임 비디오 클립에 유지합니다.
    • 클립은 플레이어가 사후 게임 화면/리플레이를 떠나 메인 메뉴 또는 대기열로 돌아갈 때 종료됩니다.
  3. 잘라낼 내용:

    • 매치메이킹 대기 시간.
    • 로비 대기 및 문명 선택 카운트다운 화면.
    • 유휴 시간, 데스크톱 검색 또는 자리 비움(AFK) 세그먼트.

엄격한 명명 규칙

1. 로컬 비디오 및 썸네일 파일 이름 (.mp4 / .png)

디스크의 로컬 파일은 로컬 추적, 보관 및 경기 연대순을 위해 명명됩니다:

  • 게임 번호: 세션의 순차적 경기 인덱스(Game 1, Game 2 등), <7분 폐기된 경기의 건너뛴 번호를 보존합니다.
  • 문명:
    • 1v1: Game <N> - <MyCiv> vs <OpponentCiv> (<Map> - <Result/Notes>).mp4
      • 예: Game 1 - Ethiopians vs Franks (Arabia - Win).mp4
    • 팀: Game <N> - <MyTeamCivs> vs <OpponentCivs> (<Map> - <Result/Notes>).mp4
      • 예: Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4
  • 썸네일 파일 이름: .mp4 파일 이름과 문자 하나까지 일치해야 하며, .mp4를 .png로 바꿉니다.

2. YouTube 비디오 제목 (-title / -metaJSON을 통해 YouTube에 업로드됨)

[!IMPORTANT] YouTube 제목: 승패 스포일러 금지 및 게임 번호 사용 금지 YouTube에 게시되는 제목은 경기 결과를 절대 암시해서는 안 되며 세션 게임 번호를 절대 포함해서는 안 됩니다:

  • Win 또는 Loss 포함 금지: 시청자에게 경기 결과를 절대 암시하지 마십시오.
  • Game 1, Game 2 등 포함 금지: YouTube 시청자는 원시 세션 인덱스가 아닌 독립적인 경기를 탐색합니다.
  • 표준 YouTube 제목 구문: <MyTeamCivs> vs <OpponentCivs> AOE2 <MatchFormat> <Map>
    • 1v1 형식: <MyCiv> vs <OpponentCiv> AOE2 1v1 <Map>
      • 예: Khmer vs Bohemians AOE2 1v1 Arena
      • 예: Dravidians vs Tatars AOE2 1v1 Arabian Desert
      • 예: Ethiopians vs Franks AOE2 1v1 Arabian Desert
    • 2v2 형식: <Civ1> & <Civ2> vs <Civ3> & <Civ4> AOE2 2v2 <Map>
      • 예: Khmer & Franks vs Persians & Bohemians AOE2 2v2 Arena
      • 예: Khmer & Bengalis vs Malians & Mongols AOE2 2v2 Arena
    • 3v3 형식: <Civ1>, <Civ2> & <Civ3> vs <Civ4>, <Civ5> & <Civ6> AOE2 3v3 <Map>
      • 예: Khmer, Bohemians & Goths vs Ethiopians, Romans & Celts AOE2 3v3 Arena
    • 4v4 형식: <Civ1>, <Civ2>, <Civ3> & <Civ4> vs <Civ5>, <Civ6>, <Civ7> & <Civ8> AOE2 4v4 <Map>
      • 예: Ethiopians, Franks, Britons & Mayans vs Mongols, Tatars, Turks & Persians AOE2 4v4 Black Forest

진정성 있는 썸네일 및 동적 밈 가이드라인 (.png)

[!IMPORTANT] 썸네일 파일 이름은 비디오 파일 이름과 일치해야 합니다 각 비디오의 썸네일 파일 이름은 비디오 파일 이름과 정확히 일치해야 합니다 (확장자를 .png로 변경):

  • 비디오: Game 1 - Ethiopians vs Franks (Arabia - Win).mp4
  • 썸네일: Game 1 - Ethiopians vs Franks (Arabia - Win).png
  • 비디오: Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).mp4
  • 썸네일: Game 3 - Khmer and Franks vs Persians and Bohemians (Arena - Win).png

기만적인 클릭베이트 또는 반복적인 단일 밈 클리셰를 피하십시오. 썸네일을 실제 일어난 일에 기반을 두고, 밈 편집을 다양하고 유기적으로 유지하며 경기 스토리에 맞추십시오:

1. 임팩트 있는 썸네일 스타일링 및 타이포그래피

모바일 피드 가독성에 최적화된 대담하고 대비가 높은 타이포그래피를 디자인하십시오:

  • 크고 강렬한 텍스트: 글꼴 크기는 크고 모바일 피드에서 즉시 읽을 수 있어야 합니다 (1440p의 경우 fontsize=140 ~ 160, 다른 해상도에 맞게 조정). 작고 대비가 낮은 텍스트(<100)는 절대 사용하지 마십시오.
  • 두꺼운 외곽선 및 그림자: 두꺼운 검은색 테두리(borderw=8 ~ 12)와 그림자(shadowx=4:shadowy=4:shadowcolor=black)를 사용하여 텍스트가 모든 배경에서 돋보이도록 하십시오.
  • 투톤 및 멀티 컬러 텍스트 스타일링: 기본 흰색 단일 텍스트로 설정하지 마십시오. 단어/줄 전체에 걸쳐 대비되고 생생한 색상을 사용하십시오:
    • 위쪽 단어는 흰색(#FFFFFF), 아래쪽/핵심 단어는 생생한 금색/노란색(#FFD700 또는 #FFE500) 또는 주황색(#FF8C00).
    • 투톤 레이아웃 예시:
      • "LETS STEAL" (흰색) / "SOME GOLD!" (노란색)
      • "OUTPOST" (흰색) / "REVENGE!" (주황색)
      • "CASTLE" (흰색) / "MELTERS" (노란색)
      • "WHY MAKE" (흰색) / "THESE?!" (주황색)
      • "SCORPION" (흰색) / "DEATHBALL" (노란색)
      • "CELT SIEGE" (노란색) / "UNSTOPPABLE" (흰색)
  • 동적이고 유연한 텍스트 배치 (엄격한 피사체 여백) :
    • [!IMPORTANT] 텍스트는 초점 유닛 또는 피사체를 절대 가려서는 안 됩니다

    • 텍스트 오버레이는 훅에 언급된 초점 유닛, 건물 또는 전술적 이벤트를 절대 가리거나, 폐색하거나, 위에 놓여서는 안 됩니다 (예: 훅이 "SIEGE ELEPHANT BREACH"라고 말하면 공성 코끼리는 100% 보여야 하며 텍스트에 의해 방해받지 않아야 함).
    • 텍스트는 액션을 가리지 않는 곳(열린 네거티브 공간, 전장의 안개 또는 빈 지형)에 엄격하게 배치하십시오.
    • 화면에서 유닛과 전투가 어디에 위치하는지 확인하고, 초점 액션과 피사체 유닛이 완전히 가려지지 않도록 텍스트를 상단 중앙, 상단 왼쪽, 상단 오른쪽 또는 하단 중앙에 동적으로 배치하십시오.

2. 액션 프레임 선택 및 시각적-텍스트 입증

  • 유휴 기지 프레임 금지: 액션이 다른 곳에서 발생하는 동안 카메라가 평화로운 집 농장, 마을 회관 또는 경제 대기열 위로 물러나는 프레임을 절대 선택하지 마십시오.
  • 진행 중인 활성 전투 및 공격 (사후 전투 잔해 또는 빈 폐허 절대 금지) :
    • 프레임은 살아있는 활성 전투 또는 진행 중인 공격을 포착해야 합니다: 유닛이 근접전에서 적극적으로 충돌하고, 화살을 쏘고, 공성 발사체를 발사하고, 경제를 약탈하거나 적 기지/성을 공격하는 모습.
    • 빈 정적 폐허 금지: 적 유닛이 적극적으로 공격하거나 존재하지 않는 부서진 벽이나 부서진 건물의 프레임을 절대 선택하지 마십시오. 활동 중인 군대가 없는 부서진 벽은 버려지고 정적이며 흥미롭지 않아 보입니다.
    • 전투 후 잔해 (바닥의 시체) 금지: 전투가 이미 끝난 후에 찍은 프레임으로, 바닥에 죽은 시체만 보이고 나머지 유닛은 유휴 상태로 서 있는 프레임을 절대 선택하지 마십시오. 전투 중 액션을 포착하고, 후에는 포착하지 마십시오.
  • 결과 누출 또는 점수 스포일러 금지:
    • 썸네일은 경기 결과를 절대 공개해서는 안 됩니다:
      • 채팅에 "Player X resigned"이 표시되거나 점수 상자에 플레이어 이름이 지워진 프레임을 절대 포착하지 마십시오.
      • 점수 차이 / 기지 압도 누출 금지: 오른쪽 하단 점수 상자가 엄청난 점수 적자(예: 플레이어가 상대 점수의 70-75%)를 표시하는 동시에 플레이어 기지가 폐허/약탈당하고 있는 프레임을 절대 선택하지 마십시오. 이는 시청자에게 손실을 노골적으로 누출하고 긴장감을 망칩니다. 점수와 보드 상태를 모호하게 유지하거나 자르기/깨끗하게 유지하십시오.
    • 모든 썸네일 프레임은 활발하고, 긴장되며, 경쟁적인 게임 플레이 중에 포착되어야 합니다.
  • 페이스 캠 표정 품질 및 자르기 검사 프로토콜:
    • 녹화에 웹캠/페이스 캠 오버레이가 포함된 경우:
      • 전용 페이스 캠 검사 (1:1 비율로 자르기 및 확인): 전체 1440p 보기만으로 얼굴 표정을 판단하지 마십시오. 에이전트는 최종 썸네일 프레임을 선택하기 전에 페이스 캠 영역(crop=390:300:0:890 또는 동등한 웹캠 상자)을 1:1 픽셀 규모로 분리하여 자르고 검사해야 합니다. 이는 표정 품질을 완벽하게 확신하기 위함입니다.
      • 표정 품질 임계값: 페이스 캠 프레임은 관련성, 강도 및 품질을 충족해야 합니다: 반응이 약하거나, 무표정하거나, 술에 취했거나, 방향을 잘못 보거나, 눈을 가늘게 뜨거나, 먹거나, 폰을 보고 있거나, 키보드에서 떨어진 프레임은 거부하십시오.
      • 얼굴 우선 순위: 1차 선택은 여전히 게임 액션에 중점을 두어야 합니다. 표정은 선택된 동작을 보완하는 역할을 합니다.

3. 일관된 썸네일 템플릿 변형

[!IMPORTANT] 썸네일 디자인은 경기 결과를 암시하거나 누출하는 것을 피해야 합니다 이미지가 결과를 암시해서는 안 됩니다. 적극적인 전투 또는 긴장된 순간을 보여주되, 명백한 패배 또는 승리 이미지는 피하십시오.

아래 템플릿은 1440p의 ffmpeg drawtext에 최적화되어 있습니다. 해상도에 따라 크기를 조정하십시오:

템플릿 1: 집중된 전투 (전방 액션, 전장 중앙) meme_template: focused_battle action_frame_description: Units actively clashing in melee or shooting in the center of the battlefield. No idle bases. text_position: top, spread across the top edge left_text: (empty, left empty for unit visibility) center_text: "<Meme Line 1>" (White / bold, fontsize=150) right_text: "<Meme Line 2>" (Golden Yellow / bold, fontsize=150) bottom_text: (empty / none)

템플릿 2: 밀집된 혼란 (매우 가까운 전투, 유닛이 화면을 거의 채움) meme_template: tight_chaos action_frame_description: Very close melee where units almost fill the screen. High chaos. text_position: top-center & bottom-center, avoiding the packed center center_text: "<Meme Line 1>" (White / bold, fontsize=155, shadow, top-center) bottom_text: "<Meme Line 2>" (Orange / bold, fontsize=155, shadow, bottom-center) left_text: (empty) right_text: (empty)

템플릿 3: 가까운 전투, 원거리 지원 meme_template: close_melee_ranged_support action_frame_description: Melee units clashing in the mid-foreground with ranged units (archers/cavalry archers) firing from the background in support. text_position: top, but lower than full top edge to leave breathing room around ranged supports center_text: (empty) left_text: "<Meme Line 1>" (White / bold, fontsize=145, top-left corner) right_text: "<Meme Line 2>" (Golden Yellow / bold, fontsize=145, top-right corner) bottom_text: (empty)

템플릿 4: 전진 / 돌진 / 약탈 meme_template: push_rush_raid action_frame_description: Army moving forward aggressively: pushing into an enemy base, raiding villagers, seizing ground. Units are actively moving/attacking, not posturing. text_position: top & bottom edges, leaving central army visible center_text: "<Meme Line 1>" (White / bold, fontsize=160, top-center) bottom_text: "<Meme Line 2>" (Orange / bold, fontsize=160, bottom-center) left_text: (empty) right_text: (empty)

템플릿 5: 총력전 (마지막 스탠드 / 막판 푸시) meme_template: all_in_final_push action_frame_description: Intense, desperate fight: lots of projectiles, explosions, mangonels firing, units dying, high stakes. Usually late-game. text_position: top & bottom, narrower to avoid covering the chaotic action left_text: "<Meme Line 1>" (White / bold, fontsize=160, top-left) center_text: "<Meme Line 2>" (Golden Yellow / bold, fontsize=160, bottom-center) right_text: (empty) bottom_text: (empty)


YouTube 업로드 워크플로우 (yutu)

yutu란 무엇인가?

yutu는 비디오, 썸네일 및 메타데이터를 포함하여 YouTube에 콘텐츠를 게시하는 데 사용되는 명령줄 도구입니다. $env:USERPROFILE\Videos\yt-uploader\에 설치되어 있습니다.

[!CAUTION] NEVER READ CREDENTIAL FILES yt-uploader 디렉토리에서 yutu를 찾기 위해 디렉토리를 나열하는 것은 허용되지만, client_secrets.json, request.token 또는 youtube.token.json 파일의 내용을 읽거나, 보거나, cat 또는 인쇄하는 것은 절대 허용되지 않습니다.

YouTube 업로드 명령 실행

모든 게임이 절단되고, 썸네일이 생성되었으며, 준비된 후에만 yutu를 호출하여 비디오를 YouTube에 게시하십시오. yutu를 호출할 때:

$env:YUTU_CREDENTIAL = "value-from-secure-context"
$env:YUTU_CACHE_TOKEN = "value-from-secure-context"

& "$env:USERPROFILE\Videos\yt-uploader\yutu" `
    -video <VideoPath> `
    -title <YouTubeTitle> `
    -thumbnail <ThumbnailPath> `
    -description <DescriptionText> `
    -metaJSON <MetadataJsonPath> `
    -privacyType "private" `
    -publishAt <PublishDateTime> `
    -playlistIds <PlaylistIds>

YouTube 업로드 규칙

  1. YouTube 제목 규칙 준수: -title 값은 위에 정의된 대로 승패 스포일러가 없어야 합니다.

  2. -metaJSON 필드: 설명을 위해 다음 구조의 JSON 파일을 생성하십시오 (경기 및 문명 정보 포함):

    {
      "description": "<DescriptionText>",
      "tags": ["age of empires 2", "aoe2", "<Map>", "<Result>", "<MyCiv>", "<OpponentCiv>", "1v1" or "team game"]
    }
    
  3. 비공개로 업로드 (-privacyType "private"): 모든 업로드는 -publishAt 날짜/시간에 예약될 때까지 비공개로 시작되어야 합니다.

  4. -publishAt 시간 규칙:

    • 게시 시간은 미래의 버퍼링된 시간을 기준으로 설정해야 합니다.
    • -publishAt 형식: YYYY-MM-DDTHH:MM:SSZ (UTC).
    • 경기 간 최소 간격: 6시간.
    • 업로드 시간 사이에는 최소 60초의 지연이 있어야 합니다.
  5. 재생목록 할당 (-playlistIds):

    • 1v1 (게임당 단일 문명): 1v1 YouTube 재생목록에 할당하십시오.
    • 팀 게임 (게임당 여러 문명): Team Games YouTube 재생목록에 할당하십시오.

YouTube 큐 검사

YouTube 큐 랜드마크 이해

수동 스크립트 없이 YouTube 업로드 일정을 검사하려면:

방법: 업로드된 게시물의 예약 시간을 읽기 위해 yutu 사용

& "$env:USERPROFILE\Videos\yt-uploader\yutu` ` -listSchedule

예약된 비디오가 있는 경우:

  • 모든 게시 시간을 읽습니다.
  • 마지막 게시 시간을 식별합니다.
  • 가장 최근 예약된 비디오 이후 6시간 후인 미래 시간을 계산합니다.
  • 계산된 시간을 -publishAt 값으로 사용합니다.

큐가 비어 있거나 예약된 비디오가 없는 경우:

  • (날짜 폴더의) 첫 번째 게임 업로드에 대해 Now + 20분에 게시 시간을 설정합니다.

종단 간 워크플로우 요약

  1. 소스 스캔: $env:USERPROFILE\Videos\을 스캔하여 녹화를 찾습니다. 이미 - aoe-editor-done이 있는 파일을 건너뜁니다.
  2. 날짜 추출 및 폴더 생성: 파일 이름에서 DDMmmYY를 구문 분석합니다. $env:USERPROFILE\Videos\aoe\<DDMmmYY>\를 생성합니다.
  3. 클립 감지 및 트리밍: ffmpeg를 사용하여 각 게임의 시작/종료 시간을 감지합니다. 대기열, 로비 및 AFK 시간을 자릅니다.
  4. 게임 필터링: 7분 미만의 게임을 건너뜁니다. 편파적인 게임을 플래그 지정하고 사용자 검토를 요청합니다.
  5. 내보내기: 각 게임을 Game <N> - <Civs> (<Map> - <Result>).mp4로 저장합니다.
  6. 썸네일 생성: 각 게임에 대해 ffmpeg drawtext를 사용하여 .png 썸네일을 생성합니다.
  7. 소스 표시: - aoe-editor-done을 소스 파일에 추가합니다.
  8. YouTube 업로드 (선택 사항):
    • yutu로 큐를 검사합니다.
    • 스포일러 없는 제목을 준비합니다.
    • 설명이 포함된 JSON 메타데이터를 생성합니다.
    • yutu로 비공개 업로드를 실행하고, 6시간 간격으로 게시를 예약합니다.
    • 재생목록 (1v1 또는 팀 게임)에 할당합니다.

관련 스킬