3cd26e98db
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 43s
CI/CD Pipeline / Unit Tests (push) Successful in 1m35s
CI/CD Pipeline / Frontend Lint (push) Successful in 1m37s
CI/CD Pipeline / Build Production Runtime Images (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (push) Has been cancelled
CI/CD Pipeline / Staging E2E Tests (push) Has been cancelled
CI/CD Pipeline / Staging API Integration Tests (push) Has been cancelled
161 lines
5.2 KiB
Python
Executable File
161 lines
5.2 KiB
Python
Executable File
"""预设 BGM 库 — 免费可商用背景音乐清单.
|
|
|
|
按风格分类,存储在 OSS 或 CDN 上。
|
|
实际音频文件由运维统一上传,这里只维护元数据清单。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass, field
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class PresetBGM:
|
|
"""预设 BGM 条目"""
|
|
|
|
id: str
|
|
name: str
|
|
style: str # 风格分类:upbeat/relax/tech/commerce/emotional/cinematic
|
|
duration: float # 时长(秒)
|
|
artist: str = ""
|
|
description: str = ""
|
|
tags: list[str] = field(default_factory=list)
|
|
audio_url: str = "" # CDN/OSS 地址,空字符串表示待部署
|
|
|
|
|
|
# ── 预设库清单 ────────────────────────────────────────────────────────────────
|
|
|
|
PRESET_BGM_LIBRARY: list[PresetBGM] = [
|
|
# 轻快 upbeat
|
|
PresetBGM(
|
|
id="bgm_upbeat_001",
|
|
name="阳光清晨",
|
|
style="upbeat",
|
|
duration=120.0,
|
|
artist="免费商用音乐库",
|
|
description="轻快明亮的吉他+钢琴,适合vlog、生活记录",
|
|
tags=["轻快", "阳光", "吉他", "vlog"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_upbeat_002",
|
|
name="活力节拍",
|
|
style="upbeat",
|
|
duration=95.0,
|
|
artist="免费商用音乐库",
|
|
description="电子鼓点+合成器,节奏明快,适合运动、产品展示",
|
|
tags=["轻快", "电子", "活力", "运动"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_upbeat_003",
|
|
name="夏日漫步",
|
|
style="upbeat",
|
|
duration=110.0,
|
|
artist="免费商用音乐库",
|
|
description="Ukulele+口哨,轻松愉悦,适合旅行、美食",
|
|
tags=["轻快", "夏日", "ukulele", "旅行"],
|
|
),
|
|
# 治愈 relax
|
|
PresetBGM(
|
|
id="bgm_relax_001",
|
|
name="静谧时光",
|
|
style="relax",
|
|
duration=180.0,
|
|
artist="免费商用音乐库",
|
|
description="温柔钢琴独奏,治愈系,适合读书、冥想",
|
|
tags=["治愈", "钢琴", "安静", "冥想"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_relax_002",
|
|
name="雨后森林",
|
|
style="relax",
|
|
duration=150.0,
|
|
artist="免费商用音乐库",
|
|
description="自然白噪音+轻柔吉他,放松减压",
|
|
tags=["治愈", "自然", "放松", "环境音"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_relax_003",
|
|
name="月光奏鸣曲",
|
|
style="relax",
|
|
duration=200.0,
|
|
artist="古典音乐(公版)",
|
|
description="贝多芬经典钢琴作品,公版免费",
|
|
tags=["治愈", "古典", "钢琴", "优雅"],
|
|
),
|
|
# 科技 tech
|
|
PresetBGM(
|
|
id="bgm_tech_001",
|
|
name="未来科技",
|
|
style="tech",
|
|
duration=85.0,
|
|
artist="免费商用音乐库",
|
|
description="电子合成器+科技鼓点,适合数码产品、科技解说",
|
|
tags=["科技", "电子", "未来感", "数码"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_tech_002",
|
|
name="数据脉冲",
|
|
style="tech",
|
|
duration=100.0,
|
|
artist="免费商用音乐库",
|
|
description="极简电子节奏,适合数据分析、AI类视频",
|
|
tags=["科技", "极简", "数据", "AI"],
|
|
),
|
|
# 电商 commerce
|
|
PresetBGM(
|
|
id="bgm_commerce_001",
|
|
name="心动时刻",
|
|
style="commerce",
|
|
duration=75.0,
|
|
artist="免费商用音乐库",
|
|
description="时尚动感节奏,适合商品展示、带货视频",
|
|
tags=["电商", "时尚", "动感", "带货"],
|
|
),
|
|
PresetBGM(
|
|
id="bgm_commerce_002",
|
|
name="品质生活",
|
|
style="commerce",
|
|
duration=90.0,
|
|
artist="免费商用音乐库",
|
|
description="高级感轻音乐,适合品牌宣传、高端产品",
|
|
tags=["电商", "高端", "品牌", "品质"],
|
|
),
|
|
]
|
|
|
|
# ── 风格分类字典 ──────────────────────────────────────────────────────────────
|
|
|
|
BGM_STYLES: dict[str, str] = {
|
|
"upbeat": "轻快",
|
|
"relax": "治愈",
|
|
"tech": "科技",
|
|
"commerce": "电商",
|
|
"emotional": "情感",
|
|
"cinematic": "电影",
|
|
}
|
|
|
|
|
|
# ── 工具函数 ──────────────────────────────────────────────────────────────────
|
|
|
|
|
|
def get_preset_bgm(bgm_id: str) -> PresetBGM | None:
|
|
"""按 ID 获取预设 BGM。"""
|
|
for bgm in PRESET_BGM_LIBRARY:
|
|
if bgm.id == bgm_id:
|
|
return bgm
|
|
return None
|
|
|
|
|
|
def list_preset_bgm_by_style(style: str) -> list[PresetBGM]:
|
|
"""按风格筛选预设 BGM。"""
|
|
return [bgm for bgm in PRESET_BGM_LIBRARY if bgm.style == style]
|
|
|
|
|
|
def search_preset_bgm(keyword: str) -> list[PresetBGM]:
|
|
"""按关键词搜索预设 BGM(名称+标签+描述)。"""
|
|
kw = keyword.lower()
|
|
results = []
|
|
for bgm in PRESET_BGM_LIBRARY:
|
|
if kw in bgm.name.lower() or kw in bgm.description.lower() or any(kw in tag.lower() for tag in bgm.tags):
|
|
results.append(bgm)
|
|
return results
|