repair-agent 487b258bbe feat: 添加默认故事功能及修复故事模块依赖
- Story 模型新增 is_default 字段及迁移 0004
- 新增 utils.py:ensure_default_stories 懒初始化默认故事(含视频绘本)
- StoryViewSet/ShelfViewSet list 接口调用 ensure_default_stories
- 新增 upload_default_story_media 管理命令,上传视频/封面到 OSS
- 安装缺失依赖:edge-tts 7.2.7、volcengine-python-sdk[ark] 5.0.12

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-02 15:16:38 +08:00

61 lines
2.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
故事模块工具函数
"""
OSS_BASE = "https://qy-rtc.oss-cn-beijing.aliyuncs.com"
DEFAULT_STORIES = [
{
"title": "失控的魔法扫帚",
"content": (
"魔法学院的期末考试正在进行中小女巫艾米紧张地握着她的新扫帚「光轮2026」。"
"考试题目是:平稳飞越学校的钟楼并且不撞到任何一只鸽子。\n\n"
"「起飞!」艾米念出咒语。可是,扫帚似乎有了自己的想法,它没有飞向钟楼,"
"而是像火箭一样冲向了食堂的窗户!\n\n"
"「糟糕!那是校长的草莓蛋糕!」艾米惊呼。就在千钧一发之际,扫帚突然一个急转弯,"
"稳稳地停在了蛋糕前——原来它只是饿了。\n\n"
"虽然考试不及格,但艾米发明了全校最快的「外卖配送术」。"
"从此以后,魔法学院的学生们再也不用担心吃不到热乎乎的披萨了。"
),
"cover_url": f"{OSS_BASE}/stories/defaults/失控的魔法扫帚_cover.png",
"has_video": True,
"video_url": f"{OSS_BASE}/stories/defaults/失控的魔法扫帚.mp4",
"generation_mode": "ai",
"prompt": "角色=[小女巫],场景=[魔法学院],道具=[魔法扫帚]",
},
]
def ensure_default_stories(user):
"""确保用户书架有默认故事,没有则创建。
逻辑与 music.utils.ensure_default_tracks 保持一致:
- 若用户已有默认故事则跳过
- 先确保默认书架存在,再批量写入
"""
from .models import Story, StoryShelf
if Story.objects.filter(user=user, is_default=True).exists():
return
# 确保默认书架存在
shelf, _ = StoryShelf.objects.get_or_create(
user=user,
defaults={"name": "我的书架"},
)
stories = []
for item in DEFAULT_STORIES:
stories.append(Story(
user=user,
shelf=shelf,
title=item["title"],
content=item["content"],
cover_url=item["cover_url"],
has_video=item["has_video"],
video_url=item["video_url"],
generation_mode=item["generation_mode"],
prompt=item["prompt"],
is_default=True,
))
Story.objects.bulk_create(stories)