#!/usr/bin/env python3 """ Bifrost - Accessible Fediverse Client A fully accessible ActivityPub client designed for screen reader users. """ import sys import os import argparse import logging from pathlib import Path # Force unbuffered output sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 1) sys.stderr = os.fdopen(sys.stderr.fileno(), 'w', 1) # Add src directory to Python path sys.path.insert(0, str(Path(__file__).parent / "src")) from PySide6.QtWidgets import QApplication from PySide6.QtCore import Qt from main_window import MainWindow class BifrostFormatter(logging.Formatter): """Custom formatter with format: message - severity - timestamp""" def format(self, record): # Format: message - severity - timestamp timestamp = self.formatTime(record, "%Y-%m-%d %H:%M:%S") return f"{record.getMessage()} - {record.levelname} - {timestamp}" def setup_logging(debug_target=None): """Set up logging based on debug target""" logger = logging.getLogger('bifrost') logger.setLevel(logging.DEBUG) # Clear any existing handlers logger.handlers.clear() formatter = BifrostFormatter() if debug_target is None: # No debug mode - only show warnings and errors to console handler = logging.StreamHandler(sys.stderr) handler.setLevel(logging.WARNING) handler.setFormatter(formatter) logger.addHandler(handler) elif debug_target == 'console': # Debug to console handler = logging.StreamHandler(sys.stdout) handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) logger.addHandler(handler) else: # Debug to file try: handler = logging.FileHandler(debug_target, mode='w') handler.setLevel(logging.DEBUG) handler.setFormatter(formatter) logger.addHandler(handler) except Exception as e: print(f"Error setting up file logging: {e}", file=sys.stderr) sys.exit(1) return logger def parse_arguments(): """Parse command line arguments""" parser = argparse.ArgumentParser( description="Bifrost - Accessible Fediverse Client", formatter_class=argparse.RawDescriptionHelpFormatter ) parser.add_argument( '-d', '--debug', nargs='?', const='console', metavar='FILE', help='Enable debug logging. Use -d for console output or -d FILE for file output' ) return parser.parse_args() def main(): """Main application entry point""" args = parse_arguments() # Set up logging logger = setup_logging(args.debug) logger.info("Bifrost application starting up") app = QApplication(sys.argv) app.setApplicationName("Bifrost") app.setApplicationDisplayName("Bifrost Fediverse Client") app.setApplicationVersion("1.0.0") app.setOrganizationName("Bifrost") app.setOrganizationDomain("bifrost.social") # High DPI scaling is enabled by default in newer Qt versions # Create and show main window logger.debug("Creating MainWindow") window = MainWindow() logger.debug("MainWindow created, showing window") window.show() logger.debug("MainWindow shown, starting event loop") # Run the application sys.exit(app.exec()) if __name__ == "__main__": main()