"""A deterministic daily selection of public-domain classical Chinese poetry.""" from datetime import datetime from zoneinfo import ZoneInfo # Original classical works; no modern copyrighted translations are included. POEMS = [ ( "jing-ye-si", "静夜思", "李白", "床前明月光,疑是地上霜。\n举头望明月,低头思故乡。", ), ( "chun-xiao", "春晓", "孟浩然", "春眠不觉晓,处处闻啼鸟。\n夜来风雨声,花落知多少。", ), ( "deng-guan-que-lou", "登鹳雀楼", "王之涣", "白日依山尽,黄河入海流。\n欲穷千里目,更上一层楼。", ), ("xiang-si", "相思", "王维", "红豆生南国,春来发几枝。\n愿君多采撷,此物最相思。"), ("lu-zhai", "鹿柴", "王维", "空山不见人,但闻人语响。\n返景入深林,复照青苔上。"), ( "zhu-li-guan", "竹里馆", "王维", "独坐幽篁里,弹琴复长啸。\n深林人不知,明月来相照。", ), ( "jiang-xue", "江雪", "柳宗元", "千山鸟飞绝,万径人踪灭。\n孤舟蓑笠翁,独钓寒江雪。", ), ( "xun-yin-zhe", "寻隐者不遇", "贾岛", "松下问童子,言师采药去。\n只在此山中,云深不知处。", ), ( "min-nong", "悯农·其二", "李绅", "锄禾日当午,汗滴禾下土。\n谁知盘中餐,粒粒皆辛苦。", ), ("feng", "风", "李峤", "解落三秋叶,能开二月花。\n过江千尺浪,入竹万竿斜。"), ( "wang-lu-shan", "望庐山瀑布", "李白", "日照香炉生紫烟,遥看瀑布挂前川。\n飞流直下三千尺,疑是银河落九天。", ), ( "zao-fa-bai-di", "早发白帝城", "李白", "朝辞白帝彩云间,千里江陵一日还。\n两岸猿声啼不住,轻舟已过万重山。", ), ( "wang-tian-men", "望天门山", "李白", "天门中断楚江开,碧水东流至此回。\n两岸青山相对出,孤帆一片日边来。", ), ( "zeng-wang-lun", "赠汪伦", "李白", "李白乘舟将欲行,忽闻岸上踏歌声。\n桃花潭水深千尺,不及汪伦送我情。", ), ( "shan-xing", "山行", "杜牧", "远上寒山石径斜,白云生处有人家。\n停车坐爱枫林晚,霜叶红于二月花。", ), ( "jiang-nan-chun", "江南春", "杜牧", "千里莺啼绿映红,水村山郭酒旗风。\n南朝四百八十寺,多少楼台烟雨中。", ), ( "ti-xi-lin-bi", "题西林壁", "苏轼", "横看成岭侧成峰,远近高低各不同。\n不识庐山真面目,只缘身在此山中。", ), ( "hui-xiang-ou-shu", "回乡偶书·其一", "贺知章", "少小离家老大回,乡音无改鬓毛衰。\n儿童相见不相识,笑问客从何处来。", ), ( "ye-yu-ji-bei", "夜雨寄北", "李商隐", "君问归期未有期,巴山夜雨涨秋池。\n何当共剪西窗烛,却话巴山夜雨时。", ), ( "feng-qiao", "枫桥夜泊", "张继", "月落乌啼霜满天,江枫渔火对愁眠。\n姑苏城外寒山寺,夜半钟声到客船。", ), ] def catalog(): return [ { "id": p[0], "title": p[1], "author": p[2], "lines": p[3], "source": "Public-domain classical Chinese poetry", "edition": "frame-flow-classics-v1", } for p in POEMS ] def get_poem(date=None, poem_id=None): day = ( datetime.strptime(date, "%Y-%m-%d").date() if date else datetime.now(ZoneInfo("Asia/Shanghai")).date() ) poems = catalog() if poem_id: selected = next((p for p in poems if p["id"] == poem_id), None) if selected is None: raise ValueError("Unknown poem") else: selected = poems[day.toordinal() % len(poems)] return {**selected, "date": day.isoformat()}