"""预设 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