SYMBOL INDEX (115 symbols across 14 files) FILE: scripts/preflight_local.py function ok (line 14) | def ok(msg: str) -> None: function warn (line 18) | def warn(msg: str) -> None: function fail (line 22) | def fail(msg: str) -> None: function check_url (line 26) | def check_url(url: str, timeout: int = 3) -> Tuple[bool, str]: function main (line 34) | def main() -> int: FILE: src/art.py function print_banner (line 4) | def print_banner() -> None: FILE: src/cache.py function get_cache_path (line 7) | def get_cache_path() -> str: function get_afm_cache_path (line 16) | def get_afm_cache_path() -> str: function get_twitter_cache_path (line 25) | def get_twitter_cache_path() -> str: function get_youtube_cache_path (line 34) | def get_youtube_cache_path() -> str: function get_provider_cache_path (line 43) | def get_provider_cache_path(provider: str) -> str: function get_accounts (line 63) | def get_accounts(provider: str) -> List[dict]: function add_account (line 94) | def add_account(provider: str, account: dict) -> None: function remove_account (line 119) | def remove_account(provider: str, account_id: str) -> None: function get_products (line 144) | def get_products() -> List[dict]: function add_product (line 164) | def add_product(product: dict) -> None: function get_results_cache_path (line 186) | def get_results_cache_path() -> str: FILE: src/classes/AFM.py class AffiliateMarketing (line 18) | class AffiliateMarketing: method __init__ (line 23) | def __init__( method scrape_product_information (line 91) | def scrape_product_information(self) -> None: method generate_response (line 119) | def generate_response(self, prompt: str) -> str: method generate_pitch (line 131) | def generate_pitch(self) -> str: method share_pitch (line 152) | def share_pitch(self, where: str) -> None: method quit (line 171) | def quit(self) -> None: FILE: src/classes/Outreach.py class Outreach (line 19) | class Outreach: method __init__ (line 24) | def __init__(self) -> None: method _find_scraper_dir (line 40) | def _find_scraper_dir(self) -> str: method is_go_installed (line 49) | def is_go_installed(self) -> bool: method unzip_file (line 63) | def unzip_file(self, zip_link: str) -> None: method build_scraper (line 85) | def build_scraper(self) -> None: method run_scraper_with_args_for_30_seconds (line 116) | def run_scraper_with_args_for_30_seconds(self, args: str, timeout=300)... method get_items_from_file (line 147) | def get_items_from_file(self, file_name: str) -> list: method set_email_for_website (line 163) | def set_email_for_website(self, index: int, website: str, output_file:... method start (line 199) | def start(self) -> None: FILE: src/classes/Tts.py class TTS (line 10) | class TTS: method __init__ (line 11) | def __init__(self) -> None: method synthesize (line 15) | def synthesize(self, text, output_file=os.path.join(ROOT_DIR, ".mp", "... FILE: src/classes/Twitter.py class Twitter (line 24) | class Twitter: method __init__ (line 29) | def __init__( method post (line 73) | def post(self, text: Optional[str] = None) -> None: method get_posts (line 143) | def get_posts(self) -> List[dict]: method add_post (line 172) | def add_post(self, post: dict) -> None: method generate_post (line 198) | def generate_post(self) -> str: FILE: src/classes/YouTube.py class YouTube (line 35) | class YouTube: method __init__ (line 50) | def __init__( method niche (line 103) | def niche(self) -> str: method language (line 113) | def language(self) -> str: method generate_response (line 122) | def generate_response(self, prompt: str, model_name: str = None) -> str: method generate_topic (line 134) | def generate_topic(self) -> str: method generate_script (line 152) | def generate_script(self) -> str: method generate_metadata (line 200) | def generate_metadata(self) -> dict: method generate_prompts (line 224) | def generate_prompts(self) -> List[str]: method _persist_image (line 297) | def _persist_image(self, image_bytes: bytes, provider_label: str) -> str: method generate_image_nanobanana2 (line 319) | def generate_image_nanobanana2(self, prompt: str) -> str: method generate_image (line 380) | def generate_image(self, prompt: str) -> str: method generate_script_to_speech (line 392) | def generate_script_to_speech(self, tts_instance: TTS) -> str: method add_video (line 416) | def add_video(self, video: dict) -> None: method generate_subtitles (line 444) | def generate_subtitles(self, audio_path: str) -> str: method generate_subtitles_assemblyai (line 465) | def generate_subtitles_assemblyai(self, audio_path: str) -> str: method _format_srt_timestamp (line 488) | def _format_srt_timestamp(self, seconds: float) -> str: method generate_subtitles_local_whisper (line 505) | def generate_subtitles_local_whisper(self, audio_path: str) -> str: method combine (line 552) | def combine(self) -> str: method generate_video (line 649) | def generate_video(self, tts_instance: TTS) -> str: method get_channel_id (line 688) | def get_channel_id(self) -> str: method upload_video (line 703) | def upload_video(self) -> bool: method get_videos (line 855) | def get_videos(self) -> List[dict]: FILE: src/config.py function assert_folder_structure (line 10) | def assert_folder_structure() -> None: function get_first_time_running (line 23) | def get_first_time_running() -> bool: function get_email_credentials (line 32) | def get_email_credentials() -> dict: function get_verbose (line 42) | def get_verbose() -> bool: function get_firefox_profile_path (line 52) | def get_firefox_profile_path() -> str: function get_headless (line 62) | def get_headless() -> bool: function get_ollama_base_url (line 72) | def get_ollama_base_url() -> str: function get_ollama_model (line 82) | def get_ollama_model() -> str: function get_twitter_language (line 92) | def get_twitter_language() -> str: function get_nanobanana2_api_base_url (line 102) | def get_nanobanana2_api_base_url() -> str: function get_nanobanana2_api_key (line 115) | def get_nanobanana2_api_key() -> str: function get_nanobanana2_model (line 126) | def get_nanobanana2_model() -> str: function get_nanobanana2_aspect_ratio (line 136) | def get_nanobanana2_aspect_ratio() -> str: function get_threads (line 146) | def get_threads() -> int: function get_zip_url (line 156) | def get_zip_url() -> str: function get_is_for_kids (line 166) | def get_is_for_kids() -> bool: function get_google_maps_scraper_zip_url (line 176) | def get_google_maps_scraper_zip_url() -> str: function get_google_maps_scraper_niche (line 186) | def get_google_maps_scraper_niche() -> str: function get_scraper_timeout (line 196) | def get_scraper_timeout() -> int: function get_outreach_message_subject (line 206) | def get_outreach_message_subject() -> str: function get_outreach_message_body_file (line 216) | def get_outreach_message_body_file() -> str: function get_tts_voice (line 226) | def get_tts_voice() -> str: function get_assemblyai_api_key (line 236) | def get_assemblyai_api_key() -> str: function get_stt_provider (line 246) | def get_stt_provider() -> str: function get_whisper_model (line 256) | def get_whisper_model() -> str: function get_whisper_device (line 266) | def get_whisper_device() -> str: function get_whisper_compute_type (line 276) | def get_whisper_compute_type() -> str: function equalize_subtitles (line 286) | def equalize_subtitles(srt_path: str, max_chars: int = 10) -> None: function get_font (line 299) | def get_font() -> str: function get_fonts_dir (line 309) | def get_fonts_dir() -> str: function get_imagemagick_path (line 318) | def get_imagemagick_path() -> str: function get_script_sentence_length (line 328) | def get_script_sentence_length() -> int: FILE: src/cron.py function main (line 12) | def main(): FILE: src/llm_provider.py function _client (line 8) | def _client() -> ollama.Client: function list_models (line 12) | def list_models() -> list[str]: function select_model (line 23) | def select_model(model: str) -> None: function get_active_model (line 34) | def get_active_model() -> str | None: function generate_text (line 41) | def generate_text(prompt: str, model_name: str = None) -> str: FILE: src/main.py function main (line 20) | def main(): FILE: src/status.py function error (line 3) | def error(message: str, show_emoji: bool = True) -> None: function success (line 17) | def success(message: str, show_emoji: bool = True) -> None: function info (line 31) | def info(message: str, show_emoji: bool = True) -> None: function warning (line 45) | def warning(message: str, show_emoji: bool = True) -> None: function question (line 59) | def question(message: str, show_emoji: bool = True) -> str: FILE: src/utils.py function close_running_selenium_instances (line 13) | def close_running_selenium_instances() -> None: function build_url (line 35) | def build_url(youtube_video_id: str) -> str: function rem_temp_files (line 48) | def rem_temp_files() -> None: function fetch_songs (line 65) | def fetch_songs() -> None: function choose_random_song (line 137) | def choose_random_song() -> str: