97 lines
3.9 KiB
Python
97 lines
3.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""환경·경로 설정 (pydantic-settings).
|
|
|
|
castad 패턴을 따르되, 개발이 바로 되도록 DB 기본값은 SQLite.
|
|
생성 엔진은 저장소 내장(backend/generator/).
|
|
"""
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
BACKEND_DIR = Path(__file__).resolve().parents[1] # backend/
|
|
REPO_ROOT = BACKEND_DIR.parent # o2o-ssulbox/
|
|
GENERATOR_DIR = BACKEND_DIR / "generator" # 내장 생성 엔진
|
|
OUTPUT_DIR = GENERATOR_DIR / "output" # 완성 mp4
|
|
|
|
# 프론트 시나리오 코드 ↔ 엔진 폴더
|
|
SCENARIO_ENGINE = {
|
|
"joseon": "animation",
|
|
"samgukji": "animation_samgukji",
|
|
"greek": "animation_greekroman",
|
|
}
|
|
ENGINE_SCENARIO = {v: k for k, v in SCENARIO_ENGINE.items()}
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
model_config = SettingsConfigDict(
|
|
env_file=str(BACKEND_DIR / ".env"), env_ignore_empty=True, extra="ignore"
|
|
)
|
|
|
|
DEBUG: bool = True
|
|
|
|
# DB — 개발 기본 SQLite. 운영은 DATABASE_URL 로 MySQL 지정 가능.
|
|
DATABASE_URL: str = f"sqlite+aiosqlite:///{(BACKEND_DIR / 'ssulbox.db').as_posix()}"
|
|
|
|
# JWT
|
|
JWT_SECRET: str = "dev-secret-change-me"
|
|
JWT_ALGORITHM: str = "HS256"
|
|
JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = 60
|
|
JWT_REFRESH_TOKEN_EXPIRE_DAYS: int = 7
|
|
|
|
# 크레딧
|
|
SIGNUP_CREDITS: int = 10 # 신규 가입 지급
|
|
CREDITS_PER_VIDEO: int = 1 # 영상 1편 생성 소모
|
|
|
|
# 생성(Gemini)
|
|
GEMINI_API_KEY: str | None = None
|
|
MAX_CONCURRENT_JOBS: int = 1
|
|
|
|
# 네이버 업장명 자동완성(선택 — 키 없으면 비활성)
|
|
NAVER_CLIENT_ID: str | None = None
|
|
NAVER_CLIENT_SECRET: str | None = None
|
|
NAVER_LOCAL_API_URL: str = "https://openapi.naver.com/v1/search/local.json"
|
|
|
|
# 카카오 로그인(선택 — 키 없으면 dev-login 사용)
|
|
KAKAO_CLIENT_ID: str | None = None
|
|
KAKAO_CLIENT_SECRET: str | None = None
|
|
# castad 카카오 앱에 이미 등록된 경로에 맞춤(콘솔 수정 불필요). 자체 앱 쓰면 아무 경로나 등록 후 변경.
|
|
KAKAO_REDIRECT_URI: str = "http://localhost:8000/user/auth/kakao/callback"
|
|
# 카카오 콜백이 토큰을 붙여 되돌려보낼 프론트 주소
|
|
FRONTEND_URL: str = "http://localhost:5173"
|
|
|
|
@property
|
|
def kakao_enabled(self) -> bool:
|
|
return bool(self.KAKAO_CLIENT_ID)
|
|
|
|
# SNS 연동/업로드 — 유튜브(Google OAuth + YouTube Data API v3)만 지원
|
|
YOUTUBE_CLIENT_ID: str | None = None
|
|
YOUTUBE_CLIENT_SECRET: str | None = None
|
|
# castad Google OAuth 앱에 등록된 콜백 경로에 맞춤(콘솔 수정 불필요)
|
|
YOUTUBE_REDIRECT_URI: str = "http://localhost:8000/social/oauth/youtube/callback"
|
|
SNS_REDIRECT_BASE: str | None = None # OAuth 콜백 베이스 URL
|
|
|
|
@property
|
|
def social_enabled(self) -> dict[str, bool]:
|
|
"""플랫폼별 키 설정 여부. 프론트/라우터에서 활성 판단에 사용."""
|
|
return {"youtube": bool(self.YOUTUBE_CLIENT_ID and self.YOUTUBE_CLIENT_SECRET)}
|
|
|
|
# 미디어 저장소 — Azure Blob(ADO2와 동일 계정 재사용). SAS 없으면 로컬 디스크 fallback.
|
|
# 컨테이너는 공개 읽기이므로 재생 URL엔 SAS 불필요, 업로드(PUT)에만 write SAS 필요.
|
|
AZURE_BLOB_BASE_URL: str = (
|
|
"https://ado2mediastoragepublic.blob.core.windows.net"
|
|
"/ado2-media-public-access/ado2-media-original"
|
|
)
|
|
AZURE_BLOB_SAS_TOKEN: str | None = None # write 권한 SAS (미설정 시 로컬 저장)
|
|
AZURE_BLOB_PREFIX: str = "ssulbox" # ADO2 콘텐츠와 경로 분리
|
|
|
|
@property
|
|
def azure_blob_enabled(self) -> bool:
|
|
return bool(self.AZURE_BLOB_BASE_URL and self.AZURE_BLOB_SAS_TOKEN)
|
|
|
|
|
|
settings = Settings()
|
|
|
|
# OS 환경변수 GEMINI_API_KEY/GOOGLE_API_KEY 폴백
|
|
GEMINI_API_KEY = settings.GEMINI_API_KEY or os.getenv("GEMINI_API_KEY") or os.getenv("GOOGLE_API_KEY")
|