generate_seed.py 7.2 KB
#!/usr/bin/env python3
"""Generate seed_data.json for lemonv_drama - 古风互动剧本生成系统"""
import json
import random
from datetime import datetime, timezone, timedelta

random.seed(7)

eras = ["唐", "宋", "明", "清", "仙侠", "架空"]
genres = ["宫廷", "武侠", "仙侠", "民间", "神话", "穿越"]
emotions = ["绮丽境", "雄浑境", "冲淡境", "凄婉境"]

settings_tang = ["长安城", "大明宫", "扬州", "洛阳"]
settings_song = ["汴京", "临安", "江南小镇"]
settings_ming = ["京城", "江南", "边关"]
settings_xianxia = ["昆仑山", "蓬莱仙岛", "青云宗"]
settings_qing = ["京城", "苏州", "江南织造"]

setting_pool = {
    "唐": settings_tang, "宋": settings_song, "明": settings_ming,
    "仙侠": settings_xianxia, "清": settings_qing, "架空": ["云隐城", "天枢阁"]
}

moods = ["盛大繁华", "暗流涌动", "凄美离别", "热血激昂", "温馨治愈", "悬疑紧张"]
endings = ["HE", "BE", "NE", "TE"]

protagonists = [
    "废柴嫡女", "冷面王爷", "神医圣手", "江湖少侠", "穿越女主", "将军嫡子",
    "腹黑谋士", "热血剑客", "傲娇公主", "憨厚书生", "天才少女", "失忆高手"
]
antagonists = [
    "恶毒继母", "阴谋皇子", "武林盟主", "朝堂权臣", "灭门仇人", "前世宿敌",
    "白切黑闺蜜", "伪善师父", "灭族仇敌", "心机表妹"
]
deuteragonists = [
    "忠诚暗卫", "温柔竹马", "高冷师兄", "阳光小师弟", "神秘高人", "俏皮丫鬟",
    "痴情男配", "正义捕快", "神秘商人", "忠义老仆"
]

ai_producibility_tips = [
    "室内宫廷场景为主,AI生成难度低",
    "武侠动作戏较多,建议真人实拍或简化",
    "仙侠特效场景密集,AI生成成本高",
    "明清室内场景,AI生成可行",
    "大量外景和战争场面,AI生成受限"
]

dialogue_styles = ["文言化", "半文半白", "古典白话", "诗意对白"]

def make_plot_twist(era):
    twists = [
        "身份逆转:主角发现自己的真实身份远超想象",
        "青梅竹马实为仇人之子,多年陪伴是一场阴谋",
        "身世之谜:以为的废柴,其实是皇室血脉",
        "替身文学:心上人的白月光竟是自己的替身",
        "重生复仇:带着前世记忆回到关键节点",
        "男二是好人的反转",
        "反派洗白:宿敌竟是卧底守护者",
        "失忆梗:忘记的是最不该忘的人",
        "假死脱身:所有人都以为他死了",
        "狸猫换太子式的亲子鉴定反转",
    ]
    return random.choice(twists)

def make_emotion_arc(emotion):
    arcs = {
        "绮丽境": ["初见惊艳", "试探拉扯", "互诉衷肠", "误会虐恋", "真相大白", "执子之手"],
        "雄浑境": ["家国危难", "临危受命", "浴血奋战", "功成名就", "隐退江湖"],
        "冲淡境": ["误入桃源", "渐生情愫", "身份暴露", "归隐山林", "相守一生"],
        "凄婉境": ["偶遇倾心", "阴谋陷害", "生离死别", "孤身复仇", "真相大白", "阴阳两隔"],
    }
    return random.choice(list(arcs.values()))

def generate_drama(idx):
    era = random.choice(eras)
    genre = random.choice(genres)
    emotion = random.choice(emotions)
    setting = random.choice(setting_pool.get(era, ["京城"]))
    mood = random.choice(moods)
    protagonist = random.choice(protagonists)
    antagonist = random.choice(antagonists)
    deuteragonist = random.choice(deuteragonists)

    era_descriptions = {
        "唐": "盛世繁华,胡汉交融,文化开放",
        "宋": "文人治国,市井经济繁荣,商业发达",
        "明": "厂卫制度,海禁与走私并存,党争激烈",
        "清": "宫廷制度森严,满汉矛盾,文字狱盛行",
        "仙侠": "灵气复苏,宗门林立,弱肉强食",
        "架空": "规则自由,不受历史约束",
    }

    title_templates = [
        f"《{era}朝{protagonist}》",
        f"《{mood}:{antagonist}与{protagonist}》",
        f"《{setting}往事》",
        f"《{genre}志:{deuteragonist}的抉择》",
        f"《{era}梦华录》",
        f"《{antagonist}的一千零一种死法》",
    ]

    ending_types = random.sample(endings, k=random.randint(2, 4))
    word_count = random.choice([3000, 5000, 8000, 12000, 20000])

    branch_count = random.randint(2, 6)
    branch_nodes = []
    for b in range(branch_count):
        node = {
            "node_id": f"BRANCH_{idx}_{b+1}",
            "plot_summary": random.choice([
                f"关键抉择:是否相信对方?",
                f"危机时刻:如何应对突如其来的陷害?",
                f"情感考验:利益与情义的选择",
                f"身份揭露:真相浮出水面的瞬间",
                f"生死抉择:牺牲自己还是牺牲对方?",
                f"阵营站队:各方势力的拉拢",
            ]),
            "choice_count": random.randint(2, 3),
            "consequence_preview": random.choice([
                "命运的齿轮开始转动",
                "一条看似光明实则危险的道路",
                "表面是敌人,实则是盟友",
                "触发了隐藏条件的判定",
            ])
        }
        branch_nodes.append(node)

    genre_ai_map = {
        "宫廷": 7, "武侠": 6, "仙侠": 5, "民间": 8, "神话": 5, "穿越": 7
    }
    ai_prod = genre_ai_map.get(genre, 6)
    ai_score = ai_prod * 5 + random.uniform(-5, 5)
    ai_tip = ai_producibility_tips[genres.index(genre)] if genre in genres[:len(ai_producibility_tips)] else random.choice(ai_producibility_tips)

    script_potential = {
        "genre": genre,
        "ai_producibility_score": round(max(0, min(50, ai_score)), 1),
        "ai_producibility_tip": ai_tip,
        "branch_count": branch_count,
        "ending_count": len(ending_types),
        "emotion": emotion,
        "era": era,
        "setting": setting,
        "mood": mood,
    }

    return {
        "drama_id": f"drama_{idx:03d}",
        "title": random.choice(title_templates),
        "source": {
            "platform": "lemonv_drama",
            "type": "古风互动剧本",
            "era": era,
            "genre": genre,
            "emotion": emotion,
            "source_url": "lemonv_drama:seed_generation",
            "crawl_time": datetime.now(timezone.utc).isoformat()
        },
        "content": {
            "protagonist": protagonist,
            "antagonist": antagonist,
            "deuteragonist": deuteragonist,
            "setting": f"{era}朝{setting}",
            "era_description": era_descriptions.get(era, ""),
            "plot_twist": make_plot_twist(era),
            "emotion_arc": make_emotion_arc(emotion),
        },
        "structure": {
            "word_count": word_count,
            "branch_count": branch_count,
            "ending_types": ending_types,
            "branch_nodes": branch_nodes,
            "dialogue_style": random.choice(dialogue_styles),
        },
        "script_potential": script_potential,
    }

dramas = [generate_drama(i) for i in range(1, 52)]

with open("seed_data.json", "w", encoding="utf-8") as f:
    json.dump(dramas, f, ensure_ascii=False, indent=2)

print(f"Generated {len(dramas)} lemonv_drama seed entries")