자동화 개요

상표 검색 서비스 ‘마크뷰(MarkView)’를 활용한 영상 콘텐츠 제작 과정을 자동화하여,

반복적인 영상 제작·블로그 콘텐츠 작성 업무를 효율화하는 것을 목표한 자동화 프로젝트입니다.

[기획 개요]
상표 관심 키워드를 중심으로
마크뷰 검색 실제 영상을 자동 생성하고
입력받은 주제에 맞는 블로그 글 생성
유튜브 영상을 자동으로 제작, 업로드 자동화
Notion에 발행용 블로그 포스트 및 영상 링크 업로드 + Notion 업로드 실패 시 Gmail로 발송
최종 블로그 발행만 사람이 검토 후 수동 진행

👉 “팩트(영상)는 자동 / 판단(발행)은 사람”

[전체 워크플로우 구조 개요]
[수동]
1. 검색어 선정 및 블로그 주제 선정
   ↓
[자동]
2. n8n챗 웹페이지(로컬)에 입력 | 입력 형식: [검색어], 주제 
3. [검색어]를 마크뷰에서 검색하는 영상 자동 생성
4. 생성 후 유튜브에 자동 업로드(유튜브API 사용, 실패 시 저장한 로컬 경로 반환)
4. 주제를 기반으로 블로그용 글 생성
5. 블로그 포스팅용 글 + 영상 유튜브 링그 노션에 적재
   ↓
[수동]
6. 담당자 검토(이미지 추가 및 문단 정리) 후 블로그 발행

<aside>

[결과요약]

image.png

1. 아키텍처 개요

본 자동화는 n8n Chat UI를 단일 입력 인터페이스로 두고,

  1. 사용자 입력 수집/정규화
  2. video-worker API 호출(영상 생성 + 업로드)
  3. 결과에 따라 사용자 응답 분기
  4. 블로그 글 생성(LLM)
  5. Notion DB 적재
  6. 최종 링크(노션/드라이브/유튜브) 안내

까지를 단일 워크플로우로 처리합니다.

image.png

<aside> 💡

즉,

n8n을 통한 사용자 입력과 결과물 업로드 처리

별도 단일 프로그램을 통해서 영상 자동 생성

두 가지로 분리하였습니다.

</aside>


2. n8n 워크플로우

[실행 흐름]
1. chat Trigger 를 통해서 검색어와 생성할 주제 키워드 입력
2. AI Agnet로 주제 5개 생성, 5 중 1 택
3. 영상 폼 결정 (일반 또는 숏폼)
4. 자동 업로드 결정 (자동 또는 수동)
5. 영상 생성 요청
	- n8n -> Video worker
	- Http Request 요청으로(post)
	- body에는 검색어, 자동업로드 여부, 영상폼에 대한 정보를 적재
6. 영상 생성 완료, 업로드 결과 chat으로 응답
 - 영상 생성 실패 시 로드 출력
7. 주제에 맞는 블로그 포스팅 글 작성(AI Agent)
8. 포스팅 글과 영상URL Notion에 적재
 - Notion 업로드 실패 시 Chat으로 출력

3. 디렉토리 구조

MARKVIEW-CONTENT-AUTOMATION
├─ infra
│  └─ docker-compose.yml //전체 서비스의 실행 환경 정의
│
├─ n8n // n8n 워크플로우 Json 파일(Import 용)
│  └─ AX_chat - ver5_2026-01-16.json
│
├─ services
│  └─ video-worker //실제로 일을 하는 모든 로직은 여기
│     ├─ app //API & 비즈니스 로직 | 외부(n8n)와 내부(영상 파이프라인)를 연결하는 중간 계층
│     │   ├─ __init__.py
│     │   ├─ config.py                    // 서비스 설정 중앙 관리
│     │   ├─ constants.py                 // 상수 Enum 정의
│     │   ├─ file_utils.py                // 파일/경로/정리 유틸
│     │   ├─ main.py                      // FastAPI 엔트리포인트(REST API)
│     │   ├─ schemas.py                   // 요청/응답 스키마
│     │   ├─ uploader.py                  // Drive/YouTube 업로드 로직
│     │   ├─ youtube_metadata.py          // 유튜브 관련 메타데이터 빌더
│     │   └─ services/
│     │         └─ generate_service.py  // 영상 생성 파이프라인 서비스
│     │          
│     ├─ markview-video-automation //영상 생성 팩토리
│     │  ├─ output
│     │  │  ├─ video
│     │  │  ├─ converted
│     │  │  └─ playwright-report
│     │  │
│     │  ├─ playwright-ax
│     │  │
│     │  ├─ scripts
│     │  │  └─ convert-latest-video.mjs //녹화된 영상 convert 도구(ffmpeg)
│     │  │
│     │  ├─ test-results
│     │  │
│     │  ├─ tests
│     │  │  └─ basic.spec.ts  //녹화 영상 행동 시나리오 구현 코드
│     │  │
│     │  ├─ package.json
│     │  ├─ package-lock.json
│     │  └─ playwright.config.ts
│     │
│     ├─ runner
│     │  └─ run_video.py //npm → playwright → 변환 전체 트리거
│     │
│     ├─ scripts
│     │  └─ init_youtube_token.py //YouTube인증, 토큰 재발급
│     │
│     └─ secrets
│        └─ youtube
│           ├─ client_secret.json
│           └─ token.json
│     
├─ reauth.ps1 //유튜브 인증 갱신
├─ start.ps1 //자동화 도구 실행
└─ stop.ps1 //자동화 도구 종료

4. 인사이트 & 트러블 슈팅