import os import time import re from urllib.parse import quote from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from mastodon import Mastodon, MastodonError # Configuration SHOW_NAMES = { "retro": "The Retro Breakfast", "90slunch": "90s Lunch", "80sdimension": "80s Dimension", "au": "Alternate Universe", "bootycalls": "Booty Calls", "chaos": "Chaos", "gog": "Gog", "housecalls": "House Calls", "mac": "March of the Mac", "yes": "Yes Series", "welch": "Bob Welch Special", "wakeman": "Caped Crusader: The Rick Wakeman Retrospective", "mayhem": "Mayhem", "pisces": "Pisces Playhouse", "rockvault": "Rock Vault", "sonicrevolt": "Sonic Revolt", "tunefuse": "TuneFuse", "wwo80s": "WWO 80s", "yacht": "Yacht Rock", } BASE_URL = "http://www.server.genesis-radio.net:5020" INSTANCE_URL = "https://chatwithus.live" ACCESS_TOKEN = "y6cAV7FvTqtJzTHe8QoCO5JSlugIwHgy7zki6Lb5xns" mastodon = Mastodon( access_token=ACCESS_TOKEN, api_base_url=INSTANCE_URL ) # Keep track of files processed and the time they were processed processed_files = {} DEBOUNCE_TIME = 5 # Time in seconds to wait before processing the same file again # Improved show name extraction based on directory aliasing def extract_show_name(file_path): parent_dir = os.path.basename(os.path.dirname(file_path)) return SHOW_NAMES.get(parent_dir, "Genesis Radio") class FileEventHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: return # Only process .mp3 files if not event.src_path.endswith('.mp3'): print(f"Skipping non-mp3 file: {event.src_path}") return current_time = time.time() # Get the current time in seconds # If the file has been processed within the debounce window, skip it if event.src_path in processed_files: last_processed_time = processed_files[event.src_path] if current_time - last_processed_time < DEBOUNCE_TIME: print(f"Skipping duplicate event for file: {event.src_path}") return # Update the time of processing for this file processed_files[event.src_path] = current_time # Debugging: Confirm file creation detection print(f"File detected: {event.src_path}") file_path = event.src_path filename = os.path.basename(file_path) show_name = extract_show_name(file_path) # URL encode the filename and parent directory encoded_filename = quote(filename, safe='') parent_dir = os.path.basename(os.path.dirname(file_path)) encoded_parent_dir = quote(parent_dir, safe='') # Construct the file URL to go to the new path format file_url = f"{BASE_URL}/show/{encoded_parent_dir}/{encoded_filename}" # Constructing a cleaner and more engaging Mastodon message message = f"šŸŽ‰ New Archive Alert! šŸŽ§ {show_name}'s latest episode is now available! šŸŽ¶\n\nTune in: {file_url}" # Debugging: Check the message before posting print(f"Message to post: {message}") try: mastodon.status_post(message) print("āœ… Successfully posted.") except MastodonError as e: print(f"āŒ Mastodon API Error: {e}") print(f"Full error: {e.args}") if __name__ == "__main__": observer = Observer() handler = FileEventHandler() valid_directories = [] for directory in SHOW_NAMES.keys(): directory_path = os.path.join("/mnt/convert/archives", directory) if os.path.exists(directory_path): print(f"āœ… Monitoring: {directory_path}") valid_directories.append(directory_path) else: print(f"āŒ Skipping non-existent directory: {directory_path}") if not valid_directories: print("āŒ No valid directories found to monitor. Exiting.") exit(1) for directory in valid_directories: observer.schedule(handler, directory, recursive=False) print("šŸ”” Genesis Radio Mastodon Notifier running. Press Ctrl+C to stop.") observer.start() try: while True: time.sleep(1) except KeyboardInterrupt: print("\nšŸ”’ Shutting down observer...") observer.stop() observer.join()