mirror of
https://github.com/ihmily/StreamCap.git
synced 2026-05-07 05:57:45 +08:00
* refactor: restructure app directory for better organization * update: add missing changes to __init__.py
137 lines
5.0 KiB
Python
137 lines
5.0 KiB
Python
import os
|
|
import time
|
|
|
|
import flet as ft
|
|
|
|
from . import execute_dir
|
|
from .core.config.config_manager import ConfigManager
|
|
from .core.config.language_manager import LanguageManager
|
|
from .core.recording.record_manager import RecordingManager
|
|
from .core.runtime.process_manager import AsyncProcessManager
|
|
from .core.update.update_checker import UpdateChecker
|
|
from .initialization.installation_manager import InstallationManager
|
|
from .ui.components.business.recording_card import RecordingCardManager
|
|
from .ui.components.common.show_snackbar import ShowSnackBar
|
|
from .ui.navigation.sidebar import LeftNavigationMenu, NavigationSidebar
|
|
from .ui.views.about_view import AboutPage
|
|
from .ui.views.home_view import HomePage
|
|
from .ui.views.recordings_view import RecordingsPage
|
|
from .ui.views.settings_view import SettingsPage
|
|
from .ui.views.storage_view import StoragePage
|
|
from .utils import utils
|
|
from .utils.logger import logger
|
|
|
|
|
|
class App:
|
|
def __init__(self, page: ft.Page):
|
|
self.install_progress = None
|
|
self.page = page
|
|
self.run_path = execute_dir
|
|
self.assets_dir = os.path.join(execute_dir, "assets")
|
|
self.process_manager = AsyncProcessManager()
|
|
self.config_manager = ConfigManager(self.run_path)
|
|
self.is_web_mode = False
|
|
self.auth_manager = None
|
|
self.current_username = None
|
|
self.content_area = ft.Column(
|
|
controls=[],
|
|
expand=True,
|
|
alignment=ft.MainAxisAlignment.START,
|
|
horizontal_alignment=ft.CrossAxisAlignment.START,
|
|
)
|
|
|
|
self.settings = SettingsPage(self)
|
|
self.language_manager = LanguageManager(self)
|
|
self.language_code = self.settings.language_code
|
|
self.about = AboutPage(self)
|
|
self.recordings = RecordingsPage(self)
|
|
self.home = HomePage(self)
|
|
self.storage = StoragePage(self)
|
|
self.pages = self.initialize_pages()
|
|
self.sidebar = NavigationSidebar(self)
|
|
self.left_navigation_menu = LeftNavigationMenu(self)
|
|
|
|
self.snack_bar_area = ft.Container()
|
|
self.dialog_area = ft.Container()
|
|
self.complete_page = ft.Row(
|
|
expand=True,
|
|
controls=[
|
|
self.left_navigation_menu,
|
|
ft.VerticalDivider(width=1),
|
|
self.content_area,
|
|
self.dialog_area,
|
|
self.snack_bar_area,
|
|
]
|
|
)
|
|
self.snack_bar = ShowSnackBar(self)
|
|
self.subprocess_start_up_info = utils.get_startup_info()
|
|
self.record_card_manager = RecordingCardManager(self)
|
|
self.record_manager = RecordingManager(self)
|
|
self.current_page = None
|
|
self._loading_page = False
|
|
self.recording_enabled = True
|
|
self.install_manager = InstallationManager(self)
|
|
self.update_checker = UpdateChecker(self)
|
|
self.page.run_task(self.install_manager.check_env)
|
|
self.page.run_task(self.record_manager.check_free_space)
|
|
self.page.run_task(self._check_for_updates)
|
|
|
|
def initialize_pages(self):
|
|
return {
|
|
"settings": self.settings,
|
|
"home": self.home,
|
|
"recordings": self.recordings,
|
|
"storage": self.storage,
|
|
"about": self.about,
|
|
}
|
|
|
|
async def switch_page(self, page_name):
|
|
if self._loading_page:
|
|
return
|
|
|
|
self._loading_page = True
|
|
|
|
try:
|
|
await self.clear_content_area()
|
|
if page := self.pages.get(page_name):
|
|
await self.settings.is_changed()
|
|
self.current_page = page
|
|
await page.load()
|
|
finally:
|
|
self._loading_page = False
|
|
|
|
async def clear_content_area(self):
|
|
self.content_area.clean()
|
|
self.content_area.update()
|
|
|
|
async def cleanup(self):
|
|
try:
|
|
await self.process_manager.cleanup()
|
|
except ConnectionError:
|
|
logger.warning("Connection lost, process may have terminated")
|
|
except Exception as e:
|
|
logger.error(f"Error during cleanup: {e}")
|
|
|
|
def add_ffmpeg_process(self, process):
|
|
self.process_manager.add_process(process)
|
|
|
|
async def _check_for_updates(self):
|
|
"""Check for updates when the application starts"""
|
|
try:
|
|
if not self.update_checker.update_config["auto_check"]:
|
|
return
|
|
|
|
last_check_time = self.settings.user_config.get("last_update_check", 0)
|
|
current_time = time.time()
|
|
check_interval = self.update_checker.update_config["check_interval"]
|
|
|
|
if current_time - last_check_time >= check_interval:
|
|
update_info = await self.update_checker.check_for_updates()
|
|
self.settings.user_config["last_update_check"] = current_time
|
|
await self.config_manager.save_user_config(self.settings.user_config)
|
|
|
|
if update_info.get("has_update", False):
|
|
await self.update_checker.show_update_dialog(update_info)
|
|
except Exception as e:
|
|
logger.error(f"Update check failed: {e}")
|