@@ -785,10 +785,13 @@ def generate_config_with_current_values() -> str:
785785# Global tracking for last/next check times
786786LAST_CHECK_TIME = None
787787NEXT_CHECK_TIME = None
788+
788789# Human-friendly global next-check display (used when NEXT_CHECK_TIME is not available)
789790NEXT_CHECK_DISPLAY = None
790791CHECK_COUNT = 0
791792
793+ START_TIME_SCRIPT = 0.0
794+
792795# Global state for debug mode manual check trigger (thread-safe Event)
793796# Will be initialized after threading is imported
794797DEBUG_INPUT_THREAD = None
@@ -872,8 +875,6 @@ def _startup_sigint_handler(signum, frame):
872875import threading
873876import hashlib
874877
875- start_time_script = time .time ()
876-
877878# Initialize the web dashboard data lock now that threading is imported
878879# Important: this lock is acquired from multiple call-sites that can nest (e.g. helpers called inside other locked
879880# regions). Use an RLock to avoid self-deadlocks that would freeze the web dashboard API
@@ -2490,10 +2491,9 @@ def update_ui_data(targets=None, config=None, check_count=None, last_check=None,
24902491 parts .append (f"last_check={ last_check } " )
24912492 if next_check is not None :
24922493 parts .append (f"next_check={ next_check } " )
2493- if config :
2494- if 'status_msg' in config :
2495- parts .append (f"status_msg='{ config ['status_msg' ]} '" )
2496- if targets :
2494+ if isinstance (config , dict ) and 'status_msg' in config :
2495+ parts .append (f"status_msg='{ config ['status_msg' ]} '" )
2496+ if isinstance (targets , dict ):
24972497 for tgt_user , tgt_data in targets .items ():
24982498 tgt_parts = [tgt_user ]
24992499 if isinstance (tgt_data , dict ):
@@ -2515,7 +2515,10 @@ def update_ui_data(targets=None, config=None, check_count=None, last_check=None,
25152515 tgt_parts .append (f"following={ tgt_data ['following' ]} " )
25162516 if 'session' in tgt_data :
25172517 s = tgt_data ['session' ]
2518- tgt_parts .append (f"session={ s .get ('username' , '?' )} (active={ s .get ('active' )} )" )
2518+ if isinstance (s , dict ):
2519+ tgt_parts .append (f"session={ s .get ('username' , '?' )} (active={ s .get ('active' )} )" )
2520+ else :
2521+ tgt_parts .append (f"session={ s } " )
25192522 parts .append (f"[{ ', ' .join (tgt_parts )} ]" )
25202523 if parts :
25212524 debug_print (f"UI Data Update: { ', ' .join (parts )} " )
@@ -3874,7 +3877,7 @@ def convert_utc_str_to_tz_datetime(dt_str):
38743877# Returns the current date/time in human readable format; eg. Sun 21 Apr 2024, 15:08:45
38753878def get_cur_ts (ts_str = "" ):
38763879 fmt = "%d %b %Y, %I:%M:%S %p" if TIME_FORMAT_12H else "%d %b %Y, %H:%M:%S"
3877- elapsed_time_script = int (time .time () - start_time_script )
3880+ elapsed_time_script = int (time .monotonic () - START_TIME_SCRIPT ) if START_TIME_SCRIPT else 0
38783881 return (f'{ ts_str } { calendar .day_abbr [(now_local_naive ()).weekday ()]} { now_local_naive ().strftime (fmt )} (elapsed: { display_time (elapsed_time_script )} )' )
38793882
38803883
@@ -9231,7 +9234,7 @@ def get_target_paths(user):
92319234
92329235
92339236def run_main ():
9234- global CLI_CONFIG_PATH , DOTENV_FILE , LOCAL_TIMEZONE , LIVENESS_CHECK_COUNTER , SESSION_USERNAME , SESSION_PASSWORD , CSV_FILE , DISABLE_LOGGING , INSTA_LOGFILE , OUTPUT_DIR , STATUS_NOTIFICATION , FOLLOWERS_NOTIFICATION , ERROR_NOTIFICATION , INSTA_CHECK_INTERVAL , DETECT_CHANGED_PROFILE_PIC , RANDOM_SLEEP_DIFF_LOW , RANDOM_SLEEP_DIFF_HIGH , imgcat_exe , SKIP_SESSION , SKIP_FOLLOWERS , SKIP_FOLLOWINGS , SKIP_FOLLOW_CHANGES , SKIP_GETTING_STORY_DETAILS , SKIP_GETTING_POSTS_DETAILS , GET_MORE_POST_DETAILS , SMTP_PASSWORD , stdout_bck , PROFILE_PIC_FILE_EMPTY , USER_AGENT , USER_AGENT_MOBILE , BE_HUMAN , ENABLE_JITTER
9237+ global CLI_CONFIG_PATH , DOTENV_FILE , LOCAL_TIMEZONE , LIVENESS_CHECK_COUNTER , SESSION_USERNAME , SESSION_PASSWORD , CSV_FILE , DISABLE_LOGGING , INSTA_LOGFILE , OUTPUT_DIR , STATUS_NOTIFICATION , FOLLOWERS_NOTIFICATION , ERROR_NOTIFICATION , INSTA_CHECK_INTERVAL , DETECT_CHANGED_PROFILE_PIC , RANDOM_SLEEP_DIFF_LOW , RANDOM_SLEEP_DIFF_HIGH , imgcat_exe , SKIP_SESSION , SKIP_FOLLOWERS , SKIP_FOLLOWINGS , SKIP_FOLLOW_CHANGES , SKIP_GETTING_STORY_DETAILS , SKIP_GETTING_POSTS_DETAILS , GET_MORE_POST_DETAILS , SMTP_PASSWORD , stdout_bck , PROFILE_PIC_FILE_EMPTY , USER_AGENT , USER_AGENT_MOBILE , BE_HUMAN , ENABLE_JITTER , START_TIME_SCRIPT
92359238 global DEBUG_MODE , VERBOSE_MODE , HOURS_VERBOSE , DASHBOARD_MODE , DASHBOARD_ENABLED , WEB_DASHBOARD_ENABLED , FOLLOWERS_CHURN_DETECTION , WEBHOOK_ENABLED , WEBHOOK_URL , WEBHOOK_STATUS_NOTIFICATION , WEBHOOK_FOLLOWERS_NOTIFICATION , WEBHOOK_ERROR_NOTIFICATION , DASHBOARD_CONSOLE , DASHBOARD_DATA , FOLLOWERS_CHURN_AUTODISABLED , FOLLOWERS_CHURN_AUTODISABLED_REASON
92369239 global WEB_DASHBOARD_HOST , WEB_DASHBOARD_PORT , WEB_DASHBOARD_TEMPLATE_DIR , mode_of_the_tool , DOWNLOAD_THUMBNAILS , THUMBNAILS_FORCED_BY_WEB , COLORED_OUTPUT , COLOR_THEME , TIME_FORMAT_12H
92379240 global PROXY_ENABLED , PROXY_URL , PROXY_CERT_PATH , PROXY_WEBHOOKS
@@ -9259,6 +9262,7 @@ def run_main():
92599262 print (f"{ os .path .basename (sys .argv [0 ])} v{ VERSION } " )
92609263 sys .exit (0 )
92619264
9265+ START_TIME_SCRIPT = time .monotonic ()
92629266 stdout_bck = sys .stdout
92639267
92649268 # Initialise colour handling based on CLI args (early check) and terminal capabilities
0 commit comments