diff --git a/app/controllers/v1/video.py b/app/controllers/v1/video.py index e80d762..1f5bc4d 100644 --- a/app/controllers/v1/video.py +++ b/app/controllers/v1/video.py @@ -25,6 +25,8 @@ from app.models.schema import ( TaskQueryResponse, TaskResponse, TaskVideoRequest, + VideoMaterialUploadResponse, + VideoMaterialRetrieveResponse ) from app.services import state as sm from app.services import task as tm @@ -222,6 +224,51 @@ def upload_bgm_file(request: Request, file: UploadFile = File(...)): "", status_code=400, message=f"{request_id}: Only *.mp3 files can be uploaded" ) +@router.get( + "/video_materials", response_model=VideoMaterialRetrieveResponse, summary="Retrieve local video materials" +) +def get_video_materials_list(request: Request): + allowed_suffixes = ("mp4", "mov", "avi", "flv", "mkv", "jpg", "jpeg", "png") + local_videos_dir = utils.storage_dir("local_videos", create=True) + files = [] + for suffix in allowed_suffixes: + files.extend(glob.glob(os.path.join(local_videos_dir, f"*.{suffix}"))) + video_materials_list = [] + for file in files: + video_materials_list.append( + { + "name": os.path.basename(file), + "size": os.path.getsize(file), + "file": file, + } + ) + response = {"files": video_materials_list} + return utils.get_response(200, response) + + +@router.post( + "/video_materials", + response_model=VideoMaterialUploadResponse, + summary="Upload the video material file to the local videos directory", +) +def upload_video_material_file(request: Request, file: UploadFile = File(...)): + request_id = base.get_task_id(request) + # check file ext + allowed_suffixes = ("mp4", "mov", "avi", "flv", "mkv", "jpg", "jpeg", "png") + if file.filename.endswith(allowed_suffixes): + local_videos_dir = utils.storage_dir("local_videos", create=True) + save_path = os.path.join(local_videos_dir, file.filename) + # save file + with open(save_path, "wb+") as buffer: + # If the file already exists, it will be overwritten + file.file.seek(0) + buffer.write(file.file.read()) + response = {"file": save_path} + return utils.get_response(200, response) + + raise HttpException( + "", status_code=400, message=f"{request_id}: Only files with extensions {allowed_suffixes} can be uploaded" + ) @router.get("/stream/{file_path:path}") async def stream_video(request: Request, file_path: str): diff --git a/app/models/schema.py b/app/models/schema.py index 3696fa3..75c34aa 100644 --- a/app/models/schema.py +++ b/app/models/schema.py @@ -301,3 +301,33 @@ class BgmUploadResponse(BaseResponse): "data": {"file": "/MoneyPrinterTurbo/resource/songs/example.mp3"}, }, } + +class VideoMaterialRetrieveResponse(BaseResponse): + class Config: + json_schema_extra = { + "example": { + "status": 200, + "message": "success", + "data": { + "files": [ + { + "name": "example.mp4", + "size": 12345678, + "file": "/MoneyPrinterTurbo/resource/videos/example.mp4", + } + ] + }, + }, + } + +class VideoMaterialUploadResponse(BaseResponse): + class Config: + json_schema_extra = { + "example": { + "status": 200, + "message": "success", + "data": { + "file": "/MoneyPrinterTurbo/resource/videos/example.mp4", + }, + }, + } \ No newline at end of file