#!/usr/bin/env python3
from pathlib import Path
import json, shutil, subprocess, re
BASE=Path('/data/video-pipeline/Channel-Loi-Co-Nhan/project')
TEMPLATE=BASE/'13062026-072-Bo-Duoc-Si-Dien-Phuc-Moi-Tro-Ve'
SAFE=['#loiconhan','#xuhuong','#daolycuocsong','#trietlycuocsong','#songtute','#phucduc','#shorts']
BGM_MAIN='/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/paulyudin-sentimental-story-182512.mp3'
BGM_YT='/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Borderless-Aakash-Gandhi.mp3'
PROMPT="vertical 9:16, co phong giay vang, aged yellow parchment, ink-wash cinematic historical illustration, muted ochre brown charcoal palette, antique paper grain. Ancient Vietnamese moral story scene: {beat}. Clear mobile composition, warm dignified mood. Negative exclusions: no modern objects, no modern clothing, no cars, no phones, no electric lights, no plastic, no Western/European faces, no medieval European armor, no Chinese opera costume, no Japanese samurai, no fantasy armor, no sci-fi, no neon, no photorealistic modern scene, no 3D/game render, no anime, no cartoon, no text, no logo, no watermark."

def run(cmd):
    print('RUN',' '.join(map(str,cmd)), flush=True)
    subprocess.check_call(list(map(str,cmd)), cwd='/data/video-pipeline/Channel-Loi-Co-Nhan')

def setup(pid,slug,title,desc,topic,scenes):
    dst=BASE/f'{pid}-{slug}'
    if not dst.exists():
        def ignore(d,names): return [n for n in names if n in {'output','audio','images','logs','subtitles','render_onepass','__pycache__'} or n.endswith('.pyc')]
        shutil.copytree(TEMPLATE,dst,ignore=ignore)
    old=str(TEMPLATE); new=str(dst); oldid=TEMPLATE.name; newid=dst.name
    for p in dst.rglob('*'):
        if p.is_file() and p.suffix in {'.py','.json','.txt','.md'}:
            try: s=p.read_text(encoding='utf-8')
            except UnicodeDecodeError: continue
            s=s.replace(old,new).replace(oldid,newid).replace(BGM_YT,BGM_MAIN).replace('/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Alegend-Peace.mp3',BGM_MAIN).replace("'#loicongday'","'#xuhuong'")
            s=re.sub(r"hashtags = \['#loiconhan', '#xuhuong'\] \+ \[\('#' \+ w\) for w in slug_words\(topic_clean\)\[:4\]\] \+ \['#trietlycuocsong', '#daolycuocsong', '#songcham', '#shorts', '#tiktokvietnam'\]", "hashtags = ['#loiconhan', '#xuhuong', '#daolycuocsong', '#trietlycuocsong', '#songtute', '#phucduc', '#shorts']", s)
            p.write_text(s,encoding='utf-8')
    data={'project_id':dst.name,'title':title,'target_duration_sec':{'min':160,'max':180},'style':'cổ phong, giấy vàng','metadata':{'youtube_title':title,'description':desc,'hashtags':SAFE,'topic_sentence':topic,'word_count_estimate':600},'total_scenes':14,'scenes':[]}
    for i,(summary,narr,beat) in enumerate(scenes,1):
        data['scenes'].append({'scene_id':f'scene_{i:03d}','type':'visual_beat','summary':summary,'narration':narr,'visual_beat':beat,'estimated_seconds':10 if i==14 else 9,'visual_prompt':PROMPT.format(beat=beat)})
    (dst/'script/scenes.json').write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding='utf-8')
    src=dst/'scripts_worker_rebuild_strict.py'; yt=dst/'scripts_worker_rebuild_yt.py'
    yt.write_text(src.read_text(encoding='utf-8').replace(BGM_MAIN,BGM_YT).replace("FINAL = PROJECT / 'output/final/final_video.mp4'", "FINAL = PROJECT / 'output/final/final_video-yt.mp4'"),encoding='utf-8')
    return dst

def fix_info(p):
    info=p/'output/info.json'; data=json.loads(info.read_text(encoding='utf-8'))
    topic=(data.get('title') or data.get('upload_title') or p.name).split('|')[0].strip().rstrip('.'); desc=data.get('description') or ''
    data['hashtags']=SAFE[:]; data['caption']=topic+'. '+' '.join(SAFE)
    sm=data.setdefault('social_meta',{}); y=sm.setdefault('youtube',{})
    y.setdefault('title',data.get('upload_title') or data.get('title') or topic); y['description']=(desc+'\n\n' if desc else '')+' '.join(SAFE); y['category']=y.get('category','Education')
    if isinstance(data.get('tags'),list): y['tags']=data['tags'][:7]
    sm['tiktok']={'caption':data['caption']}; sm['facebook_reels']={'caption':f'Cổ nhân dạy: {topic}.\n\n'+' '.join(SAFE)}; sm['instagram_reels']={'caption':f'{topic}.\n\n'+' '.join(SAFE)}
    data['final_video']=str(p/'output/final/final_video.mp4'); data['final_video_yt']=str(p/'output/final/final_video-yt.mp4')
    data['public_link']=f'https://mediareel.pain.io.vn/Channel-Loi-Co-Nhan/project/{p.name}/output/final/final_video.mp4'; data['public_url']=data['public_link']
    data['public_link_yt']=f'https://mediareel.pain.io.vn/Channel-Loi-Co-Nhan/project/{p.name}/output/final/final_video-yt.mp4'; data['public_url_yt']=data['public_link_yt']; data['bgm_main']=BGM_MAIN; data['bgm_yt']=BGM_YT
    info.write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding='utf-8')

def produce(p):
    run(['python3',p/'scripts_complete_short_project.py'])
    run(['python3',p/'scripts_run_asr_and_build_subtitles.py'])
    run(['python3',p/'scripts_worker_rebuild_strict.py'])
    run(['python3',p/'scripts_worker_rebuild_yt.py'])
    fix_info(p); print('DONE_PROJECT',p,flush=True)

S73=[
('Khiêm nhường là gốc giữ phúc','Cổ nhân dạy, người có phúc không phải người luôn đứng cao, mà là người đứng cao vẫn biết cúi đầu. Cây lúa càng chín càng cúi, người càng hiểu đời càng bớt khoe mình. Khiêm nhường là mái che giữ phúc khỏi bị gió cuốn đi.','ripe rice field bending under golden dusk beside humble scholar'),
('Đừng khoe điều mình hơn người','Một chút tài, một chút của, một chút may mắn nếu đem khoe mãi sẽ làm lòng người xa dần. Người khôn biết tài năng dùng để giúp đời, không dùng để đặt mình lên đầu thiên hạ.','talented artisan quietly helping villagers instead of boasting'),
('Người tự cao khó nghe lời hay','Tự cao giống như đóng cửa trước gió mát. Người khác góp ý cũng thấy khó chịu, chỉ dẫn cũng xem thường. Lâu ngày, điều mình không biết càng nhiều mà mình lại tưởng đã đủ.','closed wooden gate blocking fresh mountain wind'),
('Khiêm nhường không phải yếu đuối','Biết cúi đầu không có nghĩa là hèn yếu. Đó là người hiểu lúc nào nên nói, lúc nào nên nghe, lúc nào nên lui để giữ việc lớn. Cái mạnh thật sự thường không cần ồn ào.','calm warrior-scholar lowering head beside quiet river'),
('Thắng mà không khoe mới quý','Ai cũng có lúc làm được việc tốt, thắng được một lần, vượt được một đoạn đường. Nhưng người có phúc không vì vậy mà châm chọc kẻ sau. Thắng mà vẫn giữ lòng mềm, phúc mới theo lâu.','runner reaching village bridge and turning back to help others'),
('Học từ người dưới mình','Có người vì chức vị, tuổi tác, tiền bạc mà xem thường người nhỏ hơn. Nhưng đời thường giấu bài học trong những nơi khiêm tốn. Biết học từ người dưới mình là dấu hiệu của trí rộng.','elder listening to young farmhand explain seedling growth'),
('Khoe khoang gọi ganh ghét tới','Tài giỏi mà khoe nhiều sẽ gọi thị phi tới cửa. Của cải mà phô nhiều sẽ gọi lòng tham tới gần. Người xưa giữ phúc bằng cách bớt phô trương, để ánh sáng nằm trong việc làm chứ không nằm ngoài miệng.','bright lantern covered softly to avoid attracting moths'),
('Người khiêm nhường dễ được nâng đỡ','Ai biết nói lời nhã nhặn, biết cảm ơn, biết nhận phần thiếu của mình, người khác tự nhiên muốn giúp. Người tự cao khiến người ta tránh xa; người khiêm nhường khiến quý nhân dễ lại gần.','villagers gathering to support humble traveler at crossroads'),
('Đừng lấy công cũ che lỗi mới','Từng có công không có nghĩa hiện tại không cần sửa. Nếu lấy công lao cũ để che mọi lỗi sai, phúc cũ cũng mòn. Người biết khiêm nhường giữ công bằng cách tiếp tục tự xét mình.','old merit tablet beside fresh footprints being corrected'),
('Càng được khen càng nên tỉnh','Lời khen giống rượu ngọt, uống nhiều dễ say. Người được khen mà biết tỉnh sẽ hỏi mình còn thiếu gì, còn phải sửa gì. Người say lời khen sẽ bước lệch mà không hay.','cup of sweet wine beside mirror reflecting humble face'),
('Giữ lễ với người thấp hơn','Lễ nghĩa thật không chỉ dành cho người quyền thế. Cách ta đối xử với người yếu hơn mới lộ ra nết thật. Người càng có phúc càng không nỡ dùng địa vị để làm người khác nhỏ lại.','wealthy elder bowing respectfully to poor gatekeeper'),
('Nói ít làm nhiều','Người khiêm nhường thường để việc làm nói thay lời. Họ không vội khoe mình tử tế, không cần kể mình chịu khó, cũng không đòi ai tung hô. Việc thật âm thầm sẽ có ngày tự sáng.','quiet person repairing village path before dawn'),
('Tâm thấp thì phúc cao','Nước tìm chỗ thấp nên mới tụ thành sông. Người giữ lòng thấp mới chứa được lời hay, tình nghĩa và cơ hội. Tâm càng khiêm, đường càng rộng; miệng càng khoe, phúc càng mỏng.','clear water gathering in low valley under old bridge'),
('Biết khiêm nhường thì phúc ở lại','Đời người có lúc lên cao, có lúc xuống thấp. Khi lên cao mà không quên cúi đầu, khi được hơn mà không quên thương người, phúc khí sẽ ở lại lâu. Người càng có phúc càng biết khiêm nhường.','humble figure under large ancestral tree as lanterns glow')]
S74=[
('Lời khen là gió, gốc rễ mới là thật','Cổ nhân dạy, lời khen nghe êm tai nhưng dễ làm lòng người bay khỏi mặt đất. Người khôn nhận lời khen như ngọn gió qua áo, còn gốc rễ vẫn cắm trong việc làm, đạo đức và sự tỉnh táo.','praised scholar holding roots of old tree in parchment landscape'),
('Đừng để khen chê dắt mũi','Nếu ai khen cũng vui quá, ai chê cũng giận quá, thì đời mình bị miệng người khác kéo đi. Người có bản lĩnh nghe khen không say, nghe chê không đổ, tự biết mình đang đứng ở đâu.','person standing steady while praise and criticism banners blow around'),
('Khen nhiều chưa chắc đã thật','Có lời khen xuất phát từ thiện ý, cũng có lời khen để lấy lòng, để nhờ vả, để đẩy mình vào chỗ chủ quan. Người tỉnh không nghi ngờ tất cả, nhưng cũng không nuốt mọi lời ngọt như mật.','honey bowl beside hidden fishing hook on wooden table'),
('Được khen càng phải soi lại mình','Khi được khen, hãy hỏi điều gì mình làm được và điều gì còn thiếu. Nếu chỉ nghe phần hay mà bỏ qua phần dở, lời khen sẽ thành chiếc khăn che mắt. Soi lại mình là cách giữ đường ngay.','old bronze mirror reflecting both bright and shadow side'),
('Lời khen dễ làm quên người giúp mình','Không ai thành công một mình. Sau một việc tốt, nếu chỉ nhớ mình giỏi mà quên người đã nâng đỡ, phúc sẽ mỏng. Người có đạo biết nhận phần công của người khác trước khi nhận phần mình.','artisan being praised while turning to thank helpers behind him'),
('Khoe thành tích làm lòng người xa','Một lần kể niềm vui thì ai cũng mừng. Nhưng kể đi kể lại để hơn người, lời vui biến thành gai. Người khôn biết chia sẻ vừa đủ, giữ niềm vui sạch, không làm người nghe thấy bị đè thấp.','celebration lanterns kept modest among quiet neighbors'),
('Đừng sống để được vỗ tay','Nếu việc gì cũng làm để mong người khác khen, tâm sẽ rất mệt. Không ai vỗ tay mãi, cũng không ai hiểu hết lòng mình. Làm điều đúng vì nó đúng, lòng mới an khi không có tiếng khen.','quiet monk sweeping temple courtyard without audience'),
('Bị chê chưa chắc là xấu','Có lời chê cay nghiệt nên bỏ ngoài tai, nhưng cũng có lời chê giúp mình thấy lỗi. Người chỉ thích khen sẽ mất thuốc đắng. Người biết lọc lời chê có thể biến khó nghe thành lợi ích.','bitter medicine bowl beside healing herbs'),
('Người xu nịnh thường đến khi mình có lợi','Khi mình có tiền, có quyền, có chút danh, lời khen sẽ nhiều hơn. Nhưng lúc sa cơ còn ai nói thật, ai ở lại, mới biết đâu là người đáng quý. Đừng để lời xu nịnh che mất bạn hiền.','flatterers fading as honest friend remains by rainy gate'),
('Giữ người nói thật bên cạnh','Một người dám nhắc mình khi mình sai quý hơn mười người chỉ biết khen. Lời thật có lúc khó nghe nhưng giữ chân khỏi bước lệch. Người có phúc biết quý người nói thật.','honest friend holding lantern to show rough path'),
('Khen con cũng cần có chừng','Trong nhà, khen con cháu là tốt, nhưng khen quá mức dễ làm trẻ sinh kiêu. Hãy khen nỗ lực, khen lòng tốt, khen sự sửa mình, để lời khen nuôi nết chứ không nuôi cái tôi.','elder praising child for helping sweep courtyard'),
('Lời khen không thay được việc làm','Được gọi là người tốt không quan trọng bằng tiếp tục làm điều tốt. Được khen là hiếu không bằng thật sự chăm cha mẹ. Danh tiếng chỉ là bóng, việc làm mới là thân cây.','shadow of tall tree beside real tree with deep roots'),
('Tỉnh giữa tiếng khen','Khi xung quanh toàn lời hay, càng phải giữ một khoảng lặng trong lòng. Khoảng lặng ấy giúp mình nhớ gốc, nhớ lỗi cũ, nhớ con đường còn dài. Người tỉnh không để lời khen dẫn đi xa khỏi mình.','quiet inner courtyard surrounded by distant cheering'),
('Không say lời khen thì đường không lệch','Lời khen đến rồi đi, miệng đời thay đổi rất nhanh. Chỉ có người giữ được tâm bình thản mới đi đường dài. Đừng vì lời khen mà quên đường về, vì nhớ được đường về là còn giữ được phúc.','traveler finding home path despite floating praise banners')]
S75=[
('Việc thiện kín đáo giữ phúc lâu','Cổ nhân dạy, làm việc thiện không nhất thiết phải đánh trống cho người đời biết. Có những điều tốt âm thầm như nước thấm vào đất, không ồn ào nhưng nuôi cây rất lâu. Phúc sâu thường sinh từ lòng không cầu tiếng.','anonymous hand placing rice bag at poor doorway before dawn'),
('Giúp người để cứu lòng mình','Khi giúp người, điều đầu tiên được cứu có khi là chính lòng mình. Một tay đưa ra làm tâm bớt cứng, một việc tử tế làm ngày bớt lạnh. Làm thiện không phải để hơn ai, mà để giữ phần người trong mình.','gentle hand lifting fallen traveler on ancient road'),
('Đừng biến việc thiện thành sân khấu','Nếu giúp ai cũng cần người xem, cho gì cũng cần lời khen, việc thiện dễ lẫn với lòng háo danh. Người nhận có thể thấy mắc nợ, người cho cũng mất đi sự trong sạch ban đầu.','stage curtain closing over coin donation scene'),
('Cho mà giữ thể diện cho người nhận','Một bát cơm cho đúng lúc phải đi cùng sự tôn trọng. Đừng để người nhận cúi đầu trong tủi hổ. Của ít mà giữ được thể diện cho người, phúc lớn hơn của nhiều mà lời nói làm đau.','rice bowl offered discreetly behind bamboo screen'),
('Làm điều tốt khi không ai biết','Điều tử tế thật sự lộ rõ khi không có ai chứng kiến. Nhặt lại viên đá trên đường, che giúp mái dột, để phần nước cho người sau, những việc ấy nhỏ nhưng tâm sáng.','person removing stone from village path under moonlight'),
('Thiện nhỏ đừng xem thường','Một lời an ủi, một lần nhường đường, một chén nước đưa người mệt, đều là hạt giống. Hạt nhỏ gặp đất tốt sẽ thành bóng mát. Người tích thiện không chờ việc lớn mới bắt đầu.','small seeds turning into shade tree beside village well'),
('Giúp đúng người đúng cách','Lòng tốt cũng cần trí tuệ. Giúp sai cách có thể làm người khác ỷ lại, hoặc làm mình kiệt sức. Người có phúc biết giúp bằng lòng thiện và con mắt tỉnh, để việc tốt sinh điều tốt.','elder choosing tools and rice wisely for needy family'),
('Đừng kể công sau khi giúp','Đã giúp rồi cứ nhắc mãi, việc thiện sẽ biến thành gánh nợ. Người được giúp khó ngẩng đầu, người giúp cũng mất phúc trong lời kể. Làm xong thì để gió mang đi, lòng mình sẽ nhẹ.','old favor scroll released into gentle river'),
('Thiện với người gần trước','Nhiều người thích làm việc tốt ngoài đường nhưng về nhà lại lạnh nhạt. Thiện tâm phải bắt đầu từ cha mẹ, vợ chồng, con cái, người cạnh mình. Nếu nhà mình lạnh, tiếng tốt ngoài đời cũng chưa trọn.','family member covering elderly parent with warm blanket'),
('Không vì người vô ơn mà bỏ thiện','Có lúc giúp người mà không được nhớ ơn. Đừng vì một người vô ơn mà đóng cửa với cả đời. Chỉ cần rút kinh nghiệm, giúp khôn hơn, chứ đừng để lòng thiện chết đi.','kind person closing one small gate but opening wider garden path'),
('Việc thiện âm thầm đổi khí trong nhà','Một nhà thường làm điều tử tế, dù không khoe, không nói, không ghi bảng, không khí cũng khác. Con trẻ nhìn thấy sẽ học theo. Phúc không chỉ đến từ tiền, mà từ nết nhà biết thương người.','children watching parents secretly leave firewood for neighbor'),
('Người nhận cũng nên nhớ nghĩa','Được giúp dù ít cũng nên ghi lòng. Một câu cảm ơn, một lần sống tốt hơn, một ngày có thể giúp lại người khác, ấy là cách trả nghĩa đẹp nhất. Phúc lưu chuyển khi ơn không bị quên.','recipient bowing quietly then helping another traveler later'),
('Thiện tích lâu thành đường sáng','Một việc tốt có thể chưa đổi được đời, nhưng nhiều việc tốt tích lại sẽ đổi hướng lòng người. Như từng ngọn đèn nhỏ, gom đủ sẽ thành đường sáng cho cả làng đi qua đêm tối.','many small lanterns forming path through dark village'),
('Làm thiện không cầu danh, phúc tự tìm về','Danh tiếng đến rồi đi, lời khen cũng tan, nhưng việc thiện thật sẽ ở lại trong lòng người và trong nết mình. Cứ làm điều tốt trong lặng lẽ, không cầu danh, phúc tự có đường tìm về.','humble figure walking away as dawn lights grateful village')]
projects=[('13062026-073','Nguoi-Cang-Co-Phuc-Cang-Biet-Khiem-Nhuong','Người càng có phúc càng biết khiêm nhường | Lời cổ nhân dạy','Cổ nhân dạy: người càng có phúc càng biết khiêm nhường. Càng lên cao càng biết cúi đầu, càng được hơn càng không khoe mình, phúc khí mới ở lại lâu.','Người càng có phúc càng biết khiêm nhường',S73),('13062026-074','Dung-Vi-Loi-Khen-Ma-Quen-Duong-Ve','Đừng vì lời khen mà quên đường về | Lời cổ nhân dạy','Cổ nhân dạy: lời khen dễ làm người ta say, nhưng người tỉnh biết giữ gốc, biết soi lại mình và không để miệng đời dẫn lối.','Đừng vì lời khen mà quên đường về',S74),('13062026-075','Lam-Thien-Khong-Cau-Danh-Phuc-Tu-Tim-Ve','Làm thiện không cầu danh, phúc tự tìm về | Lời cổ nhân dạy','Cổ nhân dạy: việc thiện âm thầm nuôi phúc lâu dài. Làm điều tốt không cầu tiếng khen, không kể công, phúc tự có đường trở về.','Làm thiện không cầu danh, phúc tự tìm về',S75)]
for spec in projects:
    p=setup(*spec); produce(p)
print('ALL_DONE')
