refactor: 依赖库已经支持分段获取静态文件,重构代码

This commit is contained in:
涵曦 2024-11-08 21:19:38 +08:00
parent 5766919e69
commit bd6dd43737

View File

@ -1,7 +1,6 @@
import asyncio import asyncio
import hashlib import hashlib
import json import json
import mimetypes
import os import os
import re import re
import secrets import secrets
@ -26,7 +25,7 @@ from fastapi import (
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html from fastapi.openapi.docs import get_redoc_html, get_swagger_ui_html
from fastapi.openapi.utils import get_openapi from fastapi.openapi.utils import get_openapi
from fastapi.responses import RedirectResponse, StreamingResponse from fastapi.responses import RedirectResponse
from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.security import HTTPBasic, HTTPBasicCredentials
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel from pydantic import BaseModel
@ -538,7 +537,7 @@ async def music_file(request: Request, file_path: str, key: str = "", code: str
if not os.path.exists(absolute_file_path): if not os.path.exists(absolute_file_path):
raise HTTPException(status_code=404, detail="File not found") raise HTTPException(status_code=404, detail="File not found")
# 移除MP3 ID3 v2标签和填充,减少播放前延迟 # 移除MP3 ID3 v2标签和填充
if config.remove_id3tag and is_mp3(file_path): if config.remove_id3tag and is_mp3(file_path):
log.info(f"remove_id3tag:{config.remove_id3tag}, is_mp3:True ") log.info(f"remove_id3tag:{config.remove_id3tag}, is_mp3:True ")
temp_mp3_file = remove_id3_tags(absolute_file_path, config) temp_mp3_file = remove_id3_tags(absolute_file_path, config)
@ -560,34 +559,7 @@ async def music_file(request: Request, file_path: str, key: str = "", code: str
else: else:
log.warning(f"Failed to convert file to MP3 format: {absolute_file_path}") log.warning(f"Failed to convert file to MP3 format: {absolute_file_path}")
file_size = os.path.getsize(absolute_file_path) return FileResponse(absolute_file_path)
range_start, range_end = 0, file_size - 1
range_header = request.headers.get("Range")
log.info(f"music_file range_header {range_header}")
if range_header:
range_match = range_pattern.match(range_header)
if range_match:
range_start = int(range_match.group(1))
if range_match.group(2):
range_end = int(range_match.group(2))
log.info(f"music_file in range {absolute_file_path}")
log.info(f"music_file {range_start} {range_end} {absolute_file_path}")
headers = {
"Content-Range": f"bytes {range_start}-{range_end}/{file_size}",
"Accept-Ranges": "bytes",
}
mime_type, _ = mimetypes.guess_type(file_path)
if mime_type is None:
mime_type = "application/octet-stream"
return StreamingResponse(
file_iterator(absolute_file_path, range_start, range_end),
headers=headers,
status_code=206 if range_header else 200,
media_type=mime_type,
)
@app.options("/music/{file_path:path}") @app.options("/music/{file_path:path}")
@ -610,10 +582,7 @@ async def get_picture(request: Request, file_path: str, key: str = "", code: str
if not os.path.exists(absolute_file_path): if not os.path.exists(absolute_file_path):
raise HTTPException(status_code=404, detail="File not found") raise HTTPException(status_code=404, detail="File not found")
mime_type, _ = mimetypes.guess_type(absolute_file_path) return FileResponse(absolute_file_path)
if mime_type is None:
mime_type = "image/jpeg"
return FileResponse(absolute_file_path, media_type=mime_type)
@app.get("/docs", include_in_schema=False) @app.get("/docs", include_in_schema=False)