spring: application: name: h-lab # Secrets are supplied via environment variables, or a git-ignored # application-local.yml (see application-local.yml.example). No secrets here. config: import: optional:classpath:application-local.yml servlet: multipart: max-file-size: ${UPLOAD_MAX_FILE_SIZE:200MB} # 업로드 영상(Whisper 전사용) max-request-size: ${UPLOAD_MAX_REQUEST_SIZE:200MB} datasource: url: ${DB_URL:} driverClassName: org.postgresql.Driver username: ${DB_USERNAME:} password: ${DB_PASSWORD:} jpa: database-platform: org.hibernate.dialect.PostgreSQLDialect hibernate: ddl-auto: update show-sql: false properties: hibernate: format_sql: false decorator: datasource: p6spy: enable-logging: true multiline: true logging: slf4j log-message-format: com.hlab.yanalyst.global.config.P6SpyFormatter tracing: include-parameter-values: true springdoc: swagger-ui: path: /swagger-ui.html tags-sorter: alpha operations-sorter: alpha api-docs: path: /v3/api-docs server: port: 8088 # YouTube Data API 키 (YOUTUBE_API_KEY 환경변수 또는 application-local.yml 로 주입) youtube: api: key: ${YOUTUBE_API_KEY:} # Python 마이크로서비스(자막 /transcript, Whisper 전사 /transcribe). 동일 호스트면 http://localhost:8000 로 오버라이드. python: base-url: ${PYTHON_BASE_URL:http://h-python.tolag.shop} # yt-dlp 원본 다운로드(로컬 ProcessBuilder 실행). 재가공 '원본 다운로드' 버튼이 사용. ytdlp: bin: ${YTDLP_BIN:yt-dlp} # PATH 에 있으면 그대로, 아니면 절대경로 지정 ffmpeg-location: ${FFMPEG_LOCATION:} # 비우면 PATH 사용. 필요시 ffmpeg bin 폴더 경로(예: D:\\utils\\ffmpeg\\bin) max-height: ${YTDLP_MAX_HEIGHT:1080} # bv*[height<=N]+ba/b, mp4 머지 timeout-seconds: ${YTDLP_TIMEOUT_SECONDS:600} download: dir: ${DOWNLOAD_DIR:downloads} # 다운로드 캐시 폴더(작업 디렉토리 기준 상대경로 가능) # 자가호스팅 LibreTranslate(원본 스크립트 번역 → 재가공 초안). POST /translate {q,source,target}. translate: base-url: ${TRANSLATE_BASE_URL:https://h-translate.tolag.shop} # Gemini(무료 티어): 유튜브 URL → 화면 자막 추출 + 한국어 번역. AI Studio API 키 사용. gemini: api-key: ${GEMINI_API_KEY:} model: ${GEMINI_MODEL:gemini-2.5-flash} # 유튜브 URL 영상 이해 지원 hlab: # 정기 자동 수집: 등록 채널의 신규 Shorts 를 주기적으로 수집 scheduler: channel-collection: enabled: ${CHANNEL_COLLECTION_ENABLED:true} cron: ${CHANNEL_COLLECTION_CRON:0 0 4 * * *} # 매일 04:00 channel-snapshot: enabled: ${CHANNEL_SNAPSHOT_ENABLED:true} cron: ${CHANNEL_SNAPSHOT_CRON:0 0 3 * * *} # 매일 03:00 (성장 추이 기록) channel-discovery: enabled: ${CHANNEL_DISCOVERY_ENABLED:true} cron: ${CHANNEL_DISCOVERY_CRON:0 30 4 * * *} # 매일 04:30 (추천 채널 발굴) youtube: daily-quota: ${YOUTUBE_DAILY_QUOTA:10000} # 자동 수집이 소비할 수 있는 일일 쿼터 상한(추정) # 추천 채널 발굴: 지역 인기 Shorts 에서 작은구독자·고배율 떡상 채널 발굴 discovery: regions: ${DISCOVERY_REGIONS:KR,JP,US} max-subscribers: ${DISCOVERY_MAX_SUBS:100000} # 작은 채널 상한 min-ratio: ${DISCOVERY_MIN_RATIO:5.0} # 떡상 배율 하한 period-days: ${DISCOVERY_PERIOD_DAYS:14} # 최근 N일 영상 대상 top-n: ${DISCOVERY_TOP_N:30}