moebiusT7/book-ocr-studio
0
1"""Poll only while asynchronous work needs UI updates."""2from functools import wraps3from pathlib import Path4import streamlit as st5from core import read,is_running6 7def job_pending(path):8 if not path:return False9 folder=Path(path)10 if not (folder/'status.json').exists():return False11 return is_running(folder) or read(folder/'status.json').get('state') in {'ready','queued'}12 13def capture_pending():14 from kindle_capture import running15 path=st.session_state.get('capture_session')16 if not path:return False17 folder=Path(path)18 s=read(folder/'state.json')19 # Child process may not have acquired its lock yet; still poll startup.20 if s.get('phase')=='starting':return True21 if not running(folder):return job_pending(s.get('job'))22 return (any((folder/'commands').glob('*.json')) or23 s.get('phase') in {'starting','capturing','detecting','updating'} or24 (folder/'close').exists() or job_pending(s.get('job')))25 26def adaptive_fragment(seconds,pending):27 def decorate(fn):28 @wraps(fn)29 def render(*args,**kwargs):30 polling=bool(pending())31 @st.fragment(run_every=seconds if polling else None)32 def body():33 fn(*args,**kwargs)34 if bool(pending())!=polling:35 st.rerun() # Register or remove timer after a state transition.36 return body()37 return render38 return decorate39 