项目重命名: ReelForge => Pixelle-Video

This commit is contained in:
puke
2025-10-31 10:23:38 +08:00
parent dfdba73b74
commit 136514e466
60 changed files with 384 additions and 383 deletions

View File

@@ -1,5 +1,5 @@
"""
ReelForge API Layer
Pixelle-Video API Layer
FastAPI-based REST API for video generation services.
"""

View File

@@ -1,5 +1,5 @@
"""
ReelForge FastAPI Application
Pixelle-Video FastAPI Application
Main FastAPI app with all routers and middleware.
@@ -18,7 +18,7 @@ from loguru import logger
from api.config import api_config
from api.tasks import task_manager
from api.dependencies import shutdown_reelforge
from api.dependencies import shutdown_pixelle_video
# Import routers
from api.routers import (
@@ -41,24 +41,24 @@ async def lifespan(app: FastAPI):
Handles startup and shutdown events.
"""
# Startup
logger.info("🚀 Starting ReelForge API...")
logger.info("🚀 Starting Pixelle-Video API...")
await task_manager.start()
logger.info("ReelForge API started successfully\n")
logger.info("Pixelle-Video API started successfully\n")
yield
# Shutdown
logger.info("🛑 Shutting down ReelForge API...")
logger.info("🛑 Shutting down Pixelle-Video API...")
await task_manager.stop()
await shutdown_reelforge()
logger.info("ReelForge API shutdown complete")
await shutdown_pixelle_video()
logger.info("Pixelle-Video API shutdown complete")
# Create FastAPI app
app = FastAPI(
title="ReelForge API",
title="Pixelle-Video API",
description="""
## ReelForge - AI Video Generation Platform API
## Pixelle-Video - AI Video Generation Platform API
### Features
- 🤖 **LLM**: Large language model integration
@@ -113,7 +113,7 @@ app.include_router(files_router, prefix=api_config.api_prefix)
async def root():
"""Root endpoint with API information"""
return {
"service": "ReelForge API",
"service": "Pixelle-Video API",
"version": "0.1.0",
"docs": api_config.docs_url,
"health": "/health",
@@ -132,7 +132,7 @@ if __name__ == "__main__":
import uvicorn
# Parse command line arguments
parser = argparse.ArgumentParser(description="Start ReelForge API Server")
parser = argparse.ArgumentParser(description="Start Pixelle-Video API Server")
parser.add_argument("--host", default="0.0.0.0", help="Host to bind to")
parser.add_argument("--port", type=int, default=8000, help="Port to bind to")
parser.add_argument("--reload", action="store_true", help="Enable auto-reload")
@@ -142,7 +142,7 @@ if __name__ == "__main__":
# Print startup banner
print(f"""
╔══════════════════════════════════════════════════════════════╗
ReelForge API Server ║
Pixelle-Video API Server ║
╚══════════════════════════════════════════════════════════════╝
Starting server at http://{args.host}:{args.port}

View File

@@ -1,45 +1,45 @@
"""
FastAPI Dependencies
Provides dependency injection for ReelForgeCore and other services.
Provides dependency injection for PixelleVideoCore and other services.
"""
from typing import Annotated
from fastapi import Depends
from loguru import logger
from reelforge.service import ReelForgeCore
from pixelle_video.service import PixelleVideoCore
# Global ReelForge instance
_reelforge_instance: ReelForgeCore = None
# Global Pixelle-Video instance
_pixelle_video_instance: PixelleVideoCore = None
async def get_reelforge() -> ReelForgeCore:
async def get_pixelle_video() -> PixelleVideoCore:
"""
Get ReelForge core instance (dependency injection)
Get Pixelle-Video core instance (dependency injection)
Returns:
ReelForgeCore instance
PixelleVideoCore instance
"""
global _reelforge_instance
global _pixelle_video_instance
if _reelforge_instance is None:
_reelforge_instance = ReelForgeCore()
await _reelforge_instance.initialize()
logger.info("ReelForge initialized for API")
if _pixelle_video_instance is None:
_pixelle_video_instance = PixelleVideoCore()
await _pixelle_video_instance.initialize()
logger.info("Pixelle-Video initialized for API")
return _reelforge_instance
return _pixelle_video_instance
async def shutdown_reelforge():
"""Shutdown ReelForge instance"""
global _reelforge_instance
if _reelforge_instance:
logger.info("Shutting down ReelForge...")
_reelforge_instance = None
async def shutdown_pixelle_video():
"""Shutdown Pixelle-Video instance"""
global _pixelle_video_instance
if _pixelle_video_instance:
logger.info("Shutting down Pixelle-Video...")
_pixelle_video_instance = None
# Type alias for dependency injection
ReelForgeDep = Annotated[ReelForgeCore, Depends(get_reelforge)]
PixelleVideoDep = Annotated[PixelleVideoCore, Depends(get_pixelle_video)]

View File

@@ -7,7 +7,7 @@ Endpoints for generating narrations, image prompts, and titles.
from fastapi import APIRouter, HTTPException
from loguru import logger
from api.dependencies import ReelForgeDep
from api.dependencies import PixelleVideoDep
from api.schemas.content import (
NarrationGenerateRequest,
NarrationGenerateResponse,
@@ -23,7 +23,7 @@ router = APIRouter(prefix="/content", tags=["Content Generation"])
@router.post("/narration", response_model=NarrationGenerateResponse)
async def generate_narration(
request: NarrationGenerateRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
Generate narrations from text
@@ -41,7 +41,7 @@ async def generate_narration(
logger.info(f"Generating {request.n_scenes} narrations from text")
# Call narration generator service
narrations = await reelforge.narration_generator(
narrations = await pixelle_video.narration_generator(
text=request.text,
n_scenes=request.n_scenes,
min_words=request.min_words,
@@ -60,7 +60,7 @@ async def generate_narration(
@router.post("/image-prompt", response_model=ImagePromptGenerateResponse)
async def generate_image_prompt(
request: ImagePromptGenerateRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
Generate image prompts from narrations
@@ -77,7 +77,7 @@ async def generate_image_prompt(
logger.info(f"Generating image prompts for {len(request.narrations)} narrations")
# Call image prompt generator service
image_prompts = await reelforge.image_prompt_generator(
image_prompts = await pixelle_video.image_prompt_generator(
narrations=request.narrations,
min_words=request.min_words,
max_words=request.max_words
@@ -95,7 +95,7 @@ async def generate_image_prompt(
@router.post("/title", response_model=TitleGenerateResponse)
async def generate_title(
request: TitleGenerateRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
Generate video title from text
@@ -111,7 +111,7 @@ async def generate_title(
logger.info("Generating title from text")
# Call title generator service
title = await reelforge.title_generator(
title = await pixelle_video.title_generator(
text=request.text
)

View File

@@ -12,7 +12,7 @@ class HealthResponse(BaseModel):
"""Health check response"""
status: str = "healthy"
version: str = "0.1.0"
service: str = "ReelForge API"
service: str = "Pixelle-Video API"
class CapabilitiesResponse(BaseModel):

View File

@@ -5,7 +5,7 @@ Image generation endpoints
from fastapi import APIRouter, HTTPException
from loguru import logger
from api.dependencies import ReelForgeDep
from api.dependencies import PixelleVideoDep
from api.schemas.image import ImageGenerateRequest, ImageGenerateResponse
router = APIRouter(prefix="/image", tags=["Image"])
@@ -14,7 +14,7 @@ router = APIRouter(prefix="/image", tags=["Image"])
@router.post("/generate", response_model=ImageGenerateResponse)
async def image_generate(
request: ImageGenerateRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
Image generation endpoint
@@ -32,7 +32,7 @@ async def image_generate(
logger.info(f"Image generation request: {request.prompt[:50]}...")
# Call image service
image_path = await reelforge.image(
image_path = await pixelle_video.image(
prompt=request.prompt,
width=request.width,
height=request.height,

View File

@@ -5,7 +5,7 @@ LLM (Large Language Model) endpoints
from fastapi import APIRouter, HTTPException
from loguru import logger
from api.dependencies import ReelForgeDep
from api.dependencies import PixelleVideoDep
from api.schemas.llm import LLMChatRequest, LLMChatResponse
router = APIRouter(prefix="/llm", tags=["LLM"])
@@ -14,7 +14,7 @@ router = APIRouter(prefix="/llm", tags=["LLM"])
@router.post("/chat", response_model=LLMChatResponse)
async def llm_chat(
request: LLMChatRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
LLM chat endpoint
@@ -31,7 +31,7 @@ async def llm_chat(
logger.info(f"LLM chat request: {request.prompt[:50]}...")
# Call LLM service
response = await reelforge.llm(
response = await pixelle_video.llm(
prompt=request.prompt,
temperature=request.temperature,
max_tokens=request.max_tokens

View File

@@ -5,9 +5,9 @@ TTS (Text-to-Speech) endpoints
from fastapi import APIRouter, HTTPException
from loguru import logger
from api.dependencies import ReelForgeDep
from api.dependencies import PixelleVideoDep
from api.schemas.tts import TTSSynthesizeRequest, TTSSynthesizeResponse
from reelforge.utils.tts_util import get_audio_duration
from pixelle_video.utils.tts_util import get_audio_duration
router = APIRouter(prefix="/tts", tags=["TTS"])
@@ -15,7 +15,7 @@ router = APIRouter(prefix="/tts", tags=["TTS"])
@router.post("/synthesize", response_model=TTSSynthesizeResponse)
async def tts_synthesize(
request: TTSSynthesizeRequest,
reelforge: ReelForgeDep
pixelle_video: PixelleVideoDep
):
"""
Text-to-Speech synthesis endpoint
@@ -31,7 +31,7 @@ async def tts_synthesize(
logger.info(f"TTS synthesis request: {request.text[:50]}...")
# Call TTS service
audio_path = await reelforge.tts(
audio_path = await pixelle_video.tts(
text=request.text,
voice_id=request.voice_id
)

View File

@@ -8,7 +8,7 @@ import os
from fastapi import APIRouter, HTTPException, Request
from loguru import logger
from api.dependencies import ReelForgeDep
from api.dependencies import PixelleVideoDep
from api.schemas.video import (
VideoGenerateRequest,
VideoGenerateResponse,
@@ -32,7 +32,7 @@ def path_to_url(request: Request, file_path: str) -> str:
@router.post("/generate/sync", response_model=VideoGenerateResponse)
async def generate_video_sync(
request_body: VideoGenerateRequest,
reelforge: ReelForgeDep,
pixelle_video: PixelleVideoDep,
request: Request
):
"""
@@ -52,7 +52,7 @@ async def generate_video_sync(
logger.info(f"Sync video generation: {request_body.text[:50]}...")
# Call video generator service
result = await reelforge.generate_video(
result = await pixelle_video.generate_video(
text=request_body.text,
mode=request_body.mode,
title=request_body.title,
@@ -94,7 +94,7 @@ async def generate_video_sync(
@router.post("/generate/async", response_model=VideoGenerateAsyncResponse)
async def generate_video_async(
request_body: VideoGenerateRequest,
reelforge: ReelForgeDep,
pixelle_video: PixelleVideoDep,
request: Request
):
"""
@@ -126,7 +126,7 @@ async def generate_video_async(
# Define async execution function
async def execute_video_generation():
"""Execute video generation in background"""
result = await reelforge.generate_video(
result = await pixelle_video.generate_video(
text=request_body.text,
mode=request_body.mode,
title=request_body.title,

View File

@@ -13,7 +13,7 @@ class TTSSynthesizeRequest(BaseModel):
class Config:
json_schema_extra = {
"example": {
"text": "Hello, welcome to ReelForge!",
"text": "Hello, welcome to Pixelle-Video!",
"voice_id": "[Chinese] zh-CN Yunjian"
}
}