Go to file
hehihoho3@gmail.com d451aff8cc feat: 댓글 답장 초안 — 미응답 댓글 수집 + 영상 내용 기반 초안 2개
내 영상에 달린 댓글 중 내가 답 안 한 것만 모아, 영상 내용까지 근거로
답글 초안을 만든다. 조회는 나오는데 구독이 안 붙는 문제(59영상 36만 조회
구독 38)에 직접 닿는 지점이라 여기부터 손댔다.

- 미응답 판정은 totalReplyCount 가 아니라 답글 작성자에 내 채널이 있는지로 본다.
  남이 대댓글만 단 댓글은 여전히 내가 답해야 하기 때문이다.
- 수집 중 내가 단 답글을 발견하면 말투 샘플로 모아둔다. 실측 17개가 학습됐고
  초안이 그 톤을 따른다. 8자 미만("ㅋㅋㅋ")은 말투 정보가 없어 제외.
- 영상 맥락은 Gemini 에 유튜브 URL 을 직접 준다. 내 영상은 30초 쇼츠라 토큰이
  적고 화면에 박힌 자막까지 읽힌다. 영상당 1회만 만들어 캐시한다.
- 실제 게시는 OAuth 가 없어 불가 — 초안 복사까지가 끝이다.

실측에서 잡은 결함 두 개를 고쳤다.
1) 요약 생성 때 제목을 안 넘겨서 Gemini 가 출연자 이름을 추측했다. "이채영"
   영상을 "이채연"으로 요약했고 그 오류가 답글까지 전파됐다. 제목을 함께 주고
   "제목 표기를 글자 그대로" 규칙을 넣어 해결. 캐시가 오염된 경우를 위해
   refreshContext 옵션을 두고, '다시 생성'은 요약도 다시 읽게 했다.
2) 영상 요약이 없는데도 규칙에 "[영상 내용]을 근거로"가 남아 없는 섹션을
   가리켰다. 요약 유무에 따라 규칙을 갈랐다(테스트가 잡음).

쿼터: 영상당 1 unit — 59개 수집에 59 units.
테스트 11건 추가(미응답 판정·말투 샘플·프롬프트 조립·응답 파싱) — 총 106건 통과.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 11:01:58 +09:00
docs feat: 소재 발굴 피드 — 소스 롱폼/경쟁 쇼츠 최신순 2탭 2026-07-31 15:42:26 +09:00
gradle/wrapper Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
src feat: 댓글 답장 초안 — 미응답 댓글 수집 + 영상 내용 기반 초안 2개 2026-08-03 11:01:58 +09:00
.gitignore chore: .playwright-mcp 캡쳐 로그·미디어 산출물 git 추적 제외 2026-06-26 15:54:25 +09:00
build_log_final.txt Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
build_log.txt Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
build.gradle test: add unit test infrastructure and core-logic tests 2026-05-31 13:37:52 +09:00
CLAUDE.md docs: update CLAUDE.md for ChannelVideo single-master architecture 2026-05-30 19:59:38 +09:00
dashboard.png feat(channels): 국가별 탭(KR/JP/US/기타) + Channel.country 수집·백필 2026-06-26 15:24:40 +09:00
gradlew Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
gradlew.bat Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
Jenkinsfile Add Jenkinsfile: build/test/deploy pipeline 2026-06-16 12:22:57 +09:00
README.md docs: rewrite README with badges and accurate stack 2026-06-16 10:36:44 +09:00
settings.gradle Baseline before video model consolidation 2026-05-30 18:56:21 +09:00
영상테스트2.mp4 feat(channels): 국가별 탭(KR/JP/US/기타) + Channel.country 수집·백필 2026-06-26 15:24:40 +09:00
영상테스트.mp4 feat(channels): 국가별 탭(KR/JP/US/기타) + Channel.country 수집·백필 2026-06-26 15:24:40 +09:00

🎬 h-lab · yanalyst

유튜브 데이터를 수집·분석하고, 떡상 영상을 발굴해 재가공·발행까지 잇는 1인 콘텐츠 파이프라인


Java Spring Boot PostgreSQL Thymeleaf

Gradle Swagger Lombok Whisper FFmpeg License


📖 개요

h-lab(아티팩트명 yanalyst)은 유튜브 Shorts 데이터를 수집·분석해 떡상(구독자 대비 조회수 폭발) 후보를 골라내고, 자막을 추출·재가공한 뒤 발행까지 추적하는 개인용 SSR 웹 서비스입니다. Spring Boot 백엔드에 Thymeleaf 서버 사이드 렌더링 UI를 사용하며, 모든 화면이 동일한 앱에서 제공됩니다.

라이트/다크 테마 토글을 지원하는 정제된 SaaS UI로, 사이드바 한 곳에서 전체 테마가 전환됩니다.

주요 기능

단계 설명
🛰️ 수집 (Collection) 등록 채널 동기화 + 조회수 검색 수집. 정기 자동 수집 스케줄러.
🔍 발굴 (Discovery) 조회수 ÷ 구독자 배율로 떡상 후보 자동 선별. 카테고리·북마크·필터.
🗂️ 큐레이션 (Curation) 관심 상태(NEW→REVIEWING→TARGET→DONE/EXCLUDED) 칸반 보드 + 드래그 이동.
✂️ 재가공 (Rework) 영상 업로드 → Whisper 시간싱크 자막 추출 → 말 없는 구간 제거·배속 → SRT+영상 내보내기(CapCut import). 재작성 에디터.
📤 발행 (Publish) 제목·설명·해시태그·예약 패키지 관리, 발행 추적(업로드는 수동).

🔁 콘텐츠 파이프라인

   수집            발굴/큐레이션          재가공                 발행
 ┌────────┐     ┌────────────┐     ┌──────────────┐     ┌──────────┐
 │ CHANNEL│ ──▶ │ 배율 정렬   │ ──▶ │ 자막추출·컷   │ ──▶ │ 제목/태그 │
 │ SEARCH │     │ 칸반 보드   │     │ SRT·영상 출력 │     │ 발행 추적 │
 └────────┘     └────────────┘     └──────────────┘     └──────────┘
        \______________ ChannelVideo (단일 마스터) ______________/

모든 단계는 domain/channel/ChannelVideo 엔티티 하나를 중심으로 돕니다.

🛠 기술 스택

Backend · Spring Boot 3.4.0 / Java 21 · Spring Data JPA · Validation View · Thymeleaf + Layout Dialect (SSR) · Inter · Lucide Icons · Light/Dark CSS 변수 테마 DB · PostgreSQL (ddl-auto: update) · p6spy · Hypersistence Utils Docs · SpringDoc OpenAPI (Swagger UI) Build/Tools · Gradle Wrapper · Lombok · JUnit 5 AI/미디어 엔진(별도 Python 마이크로서비스) · faster-whisper(전사) · ffmpeg(컷·배속·렌더)

🚀 시작하기

요구사항: JDK 21, PostgreSQL 접근 정보. 서버 포트는 8088.

# 실행 (UI + API 모두 http://localhost:8088 에서 제공)
./gradlew bootRun          # Windows: gradlew.bat bootRun

# 빌드 / 테스트
./gradlew build
./gradlew test

# 단일 테스트
./gradlew test --tests "com.hlab.yanalyst.domain.channel.SrtFormatterTest"
경로 설명
http://localhost:8088/ 대시보드
http://localhost:8088/collection · /board · /discover 수집함 · 칸반 · 발굴
http://localhost:8088/rework/{id} · /publish 재가공 · 발행 큐
http://localhost:8088/swagger-ui.html Swagger UI

🔐 환경 변수

시크릿은 환경 변수 또는 git-ignored application-local.yml로 주입합니다 (예시: application-local.yml.example).

변수 용도
DB_URL · DB_USERNAME · DB_PASSWORD PostgreSQL 접속
YOUTUBE_API_KEY YouTube Data API
PYTHON_BASE_URL 자막/전사/렌더 마이크로서비스 (기본 http://h-python.tolag.shop)
UPLOAD_MAX_FILE_SIZE 업로드 영상 최대 크기 (기본 200MB)

📂 프로젝트 구조

h-lab/
├── src/main/java/com/hlab/yanalyst/
│   ├── domain/                 # DDD 스타일 — Entity+Repository+Service+RestController
│   │   ├── channel/            #   ChannelVideo(단일 마스터)·수집·큐레이션·재가공·SRT/컷 로직
│   │   ├── category/ publish/  #   분류 · 발행 패키지
│   │   └── production/          #   n8n 크롤 랭킹 스냅샷
│   ├── web/                    # Thymeleaf 페이지 컨트롤러 + 추가 JSON API
│   ├── service/                # 횡단 서비스 (YouTube 검색 등)
│   └── global/                 # config · 공통 응답 · 예외 · 스케줄러
└── src/main/resources/
    ├── static/css/             # variables.css(테마 토큰) · style.css(컴포넌트)
    ├── static/js/              # common.js(사이드바·테마 토글)
    └── templates/              # layout/base·sidebar + 페이지 HTML

🔌 외부 연동

  • Python 마이크로서비스 — YouTube 자막(/transcript), Whisper 전사(/transcribe), ffmpeg 렌더(/render).
  • YouTube Data API — 채널·영상 메타 수집 및 조회수 검색 (일일 쿼터 가드).
  • n8n Webhookproduction 도메인의 랭킹/크롤 데이터 연동.

📝 라이선스

개인용 프로젝트입니다.

Built with Spring Boot · Thymeleaf · faster-whisper · ffmpeg