""" 故事模块工具函数 """ 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)