- 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>
61 lines
2.3 KiB
Python
61 lines
2.3 KiB
Python
"""
|
||
故事模块工具函数
|
||
"""
|
||
|
||
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)
|