import re with open("app.py", "r", encoding="utf-8") as f: content = f.read() js_injection = """ # --- AUTO-SAVE SETTINGS FEATURE --- settings_comps = [ mode_input, sub_mask_mode, voice_input, source_lang_input, sub_style, speed_input, vol_input, mute_original, logo_enabled, logo_preset, logo_scale, cta_enabled, cta_preset, cta_scale ] load_js = ''' function() { let saved = localStorage.getItem('drippy4_settings'); if (saved) { try { let s = JSON.parse(saved); return [ s.mode !== undefined ? s.mode : "asr", s.mask !== undefined ? s.mask : "box", s.voice !== undefined ? s.voice : "meme_male_gasp", s.lang !== undefined ? s.lang : "zh", s.style !== undefined ? s.style : "white_bold", s.speed !== undefined ? s.speed : 1.15, s.vol !== undefined ? s.vol : 100, s.mute !== undefined ? s.mute : false, s.logo_e !== undefined ? s.logo_e : false, s.logo_p !== undefined ? s.logo_p : "bottom_right", s.logo_s !== undefined ? s.logo_s : 18.0, s.cta_e !== undefined ? s.cta_e : false, s.cta_p !== undefined ? s.cta_p : "bottom_center", s.cta_s !== undefined ? s.cta_s : 48.0 ]; } catch(e) {} } return ["asr", "box", "meme_male_gasp", "zh", "white_bold", 1.0, 100, false, false, "bottom_right", 18.0, false, "bottom_center", 48.0]; } ''' save_js = ''' function(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) { let settings = { mode: v1, mask: v2, voice: v3, lang: v4, style: v5, speed: v6, vol: v7, mute: v8, logo_e: v9, logo_p: v10, logo_s: v11, cta_e: v12, cta_p: v13, cta_s: v14 }; localStorage.setItem('drippy4_settings', JSON.stringify(settings)); return []; } ''' demo.load(fn=None, inputs=None, outputs=settings_comps, js=load_js) for comp in settings_comps: comp.change(fn=None, inputs=settings_comps, outputs=None, js=save_js) """ if "AUTO-SAVE SETTINGS FEATURE" not in content: content = content.replace("demo.queue(", js_injection + "\n\ndemo.queue(") with open("app.py", "w", encoding="utf-8") as f: f.write(content) print("Patched successfully") else: print("Already patched")