fix: worker 音频 mime 推断补充 .m4a/.mp3/.wav 等 10 种音频后缀 #1537

Merged
xiaoxia merged 3 commits from fix/audio-mime-inference into develop 2026-08-29 12:37:14 +08:00
3 changed files with 71 additions and 3 deletions
@@ -1,7 +1,30 @@
def infer_mime_type_from_storage_key(storage_key: str) -> str:
lower_filename = storage_key.rsplit("/", 1)[-1].lower()
# Video
if lower_filename.endswith(".mov"):
return "video/quicktime"
if lower_filename.endswith((".mp4", ".m4v", ".avi", ".mkv", ".webm")):
return "video/mp4"
# Audio
if lower_filename.endswith(".m4a"):
return "audio/mp4"
if lower_filename.endswith(".mp3"):
return "audio/mpeg"
if lower_filename.endswith(".wav"):
return "audio/wav"
if lower_filename.endswith(".flac"):
return "audio/flac"
if lower_filename.endswith(".ogg"):
return "audio/ogg"
if lower_filename.endswith(".aac"):
return "audio/aac"
if lower_filename.endswith(".wma"):
return "audio/x-ms-wma"
if lower_filename.endswith(".amr"):
return "audio/amr"
if lower_filename.endswith(".opus"):
return "audio/opus"
if lower_filename.endswith(".weba"):
return "audio/webm"
# Default fallback
return "image/jpeg"
+3 -3
View File
@@ -707,9 +707,9 @@ class TestStrayLoggerRemoved:
source = inspect.getsource(generation_cover)
# The stray call was logger.info(\n plan_id,\n generation_task_id,\n)
# with no format string — should not exist
assert "logger.info(\n plan_id," not in source, (
"Stray logger.info(plan_id, generation_task_id) should be removed"
)
assert (
"logger.info(\n plan_id," not in source
), "Stray logger.info(plan_id, generation_task_id) should be removed"
class TestUploadCoverType:
+45
View File
@@ -17,3 +17,48 @@ def test_infer_mime_type_treats_common_video_extensions_as_video():
def test_infer_mime_type_keeps_unknown_files_as_image_placeholder():
assert infer_mime_type_from_storage_key("uploads/abc/photo.jpg") == "image/jpeg"
# ─── Audio extensions ───────────────────────────────────────────────
def test_infer_mime_type_audio_m4a():
assert infer_mime_type_from_storage_key("uploads/abc/voice.m4a") == "audio/mp4"
# case-insensitive
assert infer_mime_type_from_storage_key("uploads/abc/VOICE.M4A") == "audio/mp4"
def test_infer_mime_type_audio_mp3():
assert infer_mime_type_from_storage_key("uploads/abc/song.mp3") == "audio/mpeg"
def test_infer_mime_type_audio_wav():
assert infer_mime_type_from_storage_key("uploads/abc/recording.wav") == "audio/wav"
def test_infer_mime_type_audio_flac():
assert infer_mime_type_from_storage_key("uploads/abc/hifi.flac") == "audio/flac"
def test_infer_mime_type_audio_ogg():
assert infer_mime_type_from_storage_key("uploads/abc/podcast.ogg") == "audio/ogg"
def test_infer_mime_type_audio_aac():
assert infer_mime_type_from_storage_key("uploads/abc/stream.aac") == "audio/aac"
def test_infer_mime_type_audio_wma():
assert infer_mime_type_from_storage_key("uploads/abc/old.wma") == "audio/x-ms-wma"
def test_infer_mime_type_audio_amr():
assert infer_mime_type_from_storage_key("uploads/abc/voice_msg.amr") == "audio/amr"
def test_infer_mime_type_audio_opus():
assert infer_mime_type_from_storage_key("uploads/abc/voip.opus") == "audio/opus"
def test_infer_mime_type_audio_weba():
assert infer_mime_type_from_storage_key("uploads/abc/web_audio.weba") == "audio/webm"