Skip to content

Commit 3bc49c8

Browse files
committed
feat: add index page and refactor
1 parent 41eb02f commit 3bc49c8

File tree

14 files changed

+1520
-711
lines changed

14 files changed

+1520
-711
lines changed

app/app_manager.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from .ui.navigation.sidebar import LeftNavigationMenu, NavigationSidebar
1515
from .ui.views.about_view import AboutPage
1616
from .ui.views.home_view import HomePage
17+
from .ui.views.recordings_view import RecordingsPage
1718
from .ui.views.settings_view import SettingsPage
1819
from .ui.views.storage_view import StoragePage
1920
from .utils import utils
@@ -40,11 +41,12 @@ def __init__(self, page: ft.Page):
4041

4142
self.settings = SettingsPage(self)
4243
self.language_manager = LanguageManager(self)
44+
self.language_code = self.settings.language_code
4345
self.about = AboutPage(self)
46+
self.recordings = RecordingsPage(self)
4447
self.home = HomePage(self)
4548
self.storage = StoragePage(self)
4649
self.pages = self.initialize_pages()
47-
self.language_code = self.settings.language_code
4850
self.sidebar = NavigationSidebar(self)
4951
self.left_navigation_menu = LeftNavigationMenu(self)
5052

@@ -77,6 +79,7 @@ def initialize_pages(self):
7779
return {
7880
"settings": self.settings,
7981
"home": self.home,
82+
"recordings": self.recordings,
8083
"storage": self.storage,
8184
"about": self.about,
8285
}

app/core/stream_manager.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ async def fetch_stream(self) -> StreamData:
173173
password=self.account_config.get(self.platform_key, {}).get("password"),
174174
account_type=self.account_config.get(self.platform_key, {}).get("account_type")
175175
)
176+
176177
stream_info = await handler.get_stream_info(self.live_url)
177178
self.recording.is_checking = False
178179
return stream_info
@@ -265,6 +266,7 @@ async def start_ffmpeg(
265266
self.recording.record_url = record_url
266267
logger.info(f"Recording in Progress: {live_url}")
267268
logger.log("STREAM", f"Recording Stream URL: {record_url}")
269+
268270
while True:
269271
if not self.recording.is_recording or not self.app.recording_enabled:
270272
logger.info(f"Preparing to End Recording: {live_url}")
@@ -351,7 +353,7 @@ async def start_ffmpeg(
351353
self.recording.is_recording = False
352354
try:
353355
self.recording.update({"display_title": display_title})
354-
await self.app.record_card_manager.update_card(self.recording)
356+
self.app.page.run_task(self.app.record_card_manager.update_card, self.recording)
355357
self.app.page.pubsub.send_others_on_topic("update", self.recording)
356358
if self.app.recording_enabled and process in self.app.process_manager.ffmpeg_processes:
357359
self.app.page.run_task(self.app.record_manager.check_if_live, self.recording)

app/ui/components/recording_card.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def __init__(self, app):
2626

2727
def load(self):
2828
language = self.app.language_manager.language
29-
for key in ("recording_card", "recording_manager", "base", "home_page", "video_quality", "storage_page"):
29+
for key in ("recording_card", "recording_manager", "base", "recordings_page", "video_quality", "storage_page"):
3030
self._.update(language.get(key, {}))
3131

3232
def pubsub_subscribe(self):
@@ -382,7 +382,7 @@ async def on_delete_recording(self, recording: Recording):
382382

383383
async def remove_recording_card(self, recordings: list[Recording]):
384384
try:
385-
home_page = self.app.current_page
385+
recordings_page = self.app.current_page
386386

387387
existing_ids = {rec.rec_id for rec in self.app.record_manager.recordings}
388388
remove_ids = {rec.rec_id for rec in recordings}
@@ -394,9 +394,9 @@ async def remove_recording_card(self, recordings: list[Recording]):
394394
if rec_id not in keep_ids
395395
]
396396

397-
home_page.recording_card_area.content.controls = [
397+
recordings_page.recording_card_area.content.controls = [
398398
control
399-
for control in home_page.recording_card_area.content.controls
399+
for control in recordings_page.recording_card_area.content.controls
400400
if control not in cards_to_remove
401401
]
402402

@@ -406,7 +406,7 @@ async def remove_recording_card(self, recordings: list[Recording]):
406406
}
407407

408408
try:
409-
home_page.recording_card_area.update()
409+
recordings_page.recording_card_area.update()
410410
except (ft.core.page.PageDisconnectedException, AssertionError) as e:
411411
logger.debug(f"Update recording card area failed: {e}")
412412

@@ -438,7 +438,8 @@ def get_tip_for_monitor_state(self, recording: Recording):
438438
async def update_duration(self, recording: Recording):
439439
"""Update the duration text periodically."""
440440
while True:
441-
await asyncio.sleep(1) # Update every second
441+
update_interval = 1
442+
await asyncio.sleep(update_interval)
442443
if not recording or recording.rec_id not in self.cards_obj: # Stop task if card is removed
443444
break
444445

app/ui/components/recording_dialog.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self, app, on_confirm_callback=None, recording=None):
2020

2121
def load(self):
2222
language = self.app.language_manager.language
23-
for key in ("recording_dialog", "home_page", "base", "video_quality"):
23+
for key in ("recording_dialog", "recordings_page", "base", "video_quality"):
2424
self._.update(language.get(key, {}))
2525

2626
async def show_dialog(self):

app/ui/components/search_dialog.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22

33

44
class SearchDialog(ft.AlertDialog):
5-
def __init__(self, home_page, on_close=None):
6-
self.home_page = home_page
5+
def __init__(self, recordings_page, on_close=None):
6+
self.recordings_page = recordings_page
77
self._ = {}
88
self.load()
99

1010
# Get the name of the current filter condition
1111
filter_name = self._["filter_all"]
12-
if self.home_page.current_filter == "recording":
12+
if self.recordings_page.current_filter == "recording":
1313
filter_name = self._["filter_recording"]
14-
elif self.home_page.current_filter == "error":
14+
elif self.recordings_page.current_filter == "error":
1515
filter_name = self._["filter_error"]
16-
elif self.home_page.current_filter == "offline":
16+
elif self.recordings_page.current_filter == "offline":
1717
filter_name = self._["filter_offline"]
18-
elif self.home_page.current_filter == "stopped":
18+
elif self.recordings_page.current_filter == "stopped":
1919
filter_name = self._["filter_stopped"]
2020

2121
search_title = f"{self._['search']} ({filter_name})"
@@ -54,11 +54,11 @@ def __init__(self, home_page, on_close=None):
5454
)
5555
self.actions_alignment = ft.MainAxisAlignment.END
5656
self.on_close = on_close
57-
self.home_page.app.language_manager.add_observer(self)
57+
self.recordings_page.app.language_manager.add_observer(self)
5858

5959
def load(self):
60-
language = self.home_page.app.language_manager.language
61-
for key in ("search_dialog", "home_page", "base"):
60+
language = self.recordings_page.app.language_manager.language
61+
for key in ("search_dialog", "recordings_page", "base"):
6262
self._.update(language.get(key, {}))
6363

6464
# Ensure the language items related to filtering exist
@@ -75,5 +75,5 @@ async def close_dlg(self, _e):
7575

7676
async def submit_query(self, e):
7777
query = self.query.value.strip()
78-
await self.home_page.filter_recordings(query)
78+
await self.recordings_page.filter_recordings(query)
7979
await self.close_dlg(e)

app/ui/layout/responsive_layout.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ def is_mobile_device(page: ft.Page) -> bool:
99

1010

1111
def setup_responsive_layout(page: ft.Page, app: App) -> None:
12+
_ = app.language_manager.language.get("sidebar", {})
13+
1214
if is_mobile_device(page):
1315
logger.info("mobile device detected, enable mobile layout")
1416
app.is_mobile = True
@@ -17,12 +19,14 @@ def setup_responsive_layout(page: ft.Page, app: App) -> None:
1719

1820
app.bottom_navigation = ft.NavigationBar(
1921
destinations=[
20-
ft.NavigationBarDestination(icon=ft.Icons.HOME, label="首页"),
21-
ft.NavigationBarDestination(icon=ft.Icons.SETTINGS, label="设置"),
22-
ft.NavigationBarDestination(icon=ft.Icons.DRIVE_FILE_MOVE, label="存储"),
23-
ft.NavigationBarDestination(icon=ft.Icons.INFO, label="关于"),
22+
ft.NavigationBarDestination(icon=ft.Icons.HOME, label=_["home"]),
23+
ft.NavigationBarDestination(icon=ft.Icons.DASHBOARD_ROUNDED, label=_["recordings"]),
24+
ft.NavigationBarDestination(icon=ft.Icons.SETTINGS, label=_["settings"]),
25+
ft.NavigationBarDestination(icon=ft.Icons.DRIVE_FILE_MOVE, label=_["storage"]),
26+
ft.NavigationBarDestination(icon=ft.Icons.INFO, label=_["about"]),
2427
],
25-
on_change=lambda e: page.go(f"/{['home', 'settings', 'storage', 'about'][e.control.selected_index]}"),
28+
on_change=lambda e: page.go(
29+
f"/{['home', 'recordings', 'settings', 'storage', 'about'][e.control.selected_index]}"),
2630
)
2731

2832
app.content_area.expand = True

app/ui/navigation/sidebar.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ async def theme_changed(self, _):
165165

166166
async def on_theme_change(self):
167167
"""When the theme changes, recreate the content and update the page"""
168-
if self.app.current_page.page_name == "about":
168+
page_list = ["home", "about"]
169+
if self.app.current_page.page_name in page_list:
169170
await self.app.current_page.load()
170171

171172

@@ -181,21 +182,40 @@ def __init__(self, app):
181182
def load(self):
182183
self._ = self.app.language_manager.language.get("sidebar")
183184
self.control_groups = [
184-
ControlGroup(icon=ft.Icons.HOME, label=self._["home"], index=0, name="home", selected_icon=ft.Icons.HOME),
185+
ControlGroup(
186+
icon=ft.Icons.HOME,
187+
label=self._["home"],
188+
index=0,
189+
name="home",
190+
selected_icon=ft.Icons.HOME
191+
),
192+
ControlGroup(
193+
icon=ft.Icons.DASHBOARD,
194+
label=self._["recordings"],
195+
index=1,
196+
name="recordings",
197+
selected_icon=ft.Icons.DASHBOARD_ROUNDED
198+
),
185199
ControlGroup(
186200
icon=ft.Icons.SETTINGS,
187201
label=self._["settings"],
188-
index=1,
202+
index=2,
189203
name="settings",
190204
selected_icon=ft.Icons.SETTINGS,
191205
),
192206
ControlGroup(
193207
icon=ft.Icons.DRIVE_FILE_MOVE,
194208
label=self._["storage"],
195-
index=2,
209+
index=3,
196210
name="storage",
197211
selected_icon=ft.Icons.DRIVE_FILE_MOVE_OUTLINE
198212
),
199-
ControlGroup(icon=ft.Icons.INFO, label=self._["about"], index=3, name="about", selected_icon=ft.Icons.INFO),
213+
ControlGroup(
214+
icon=ft.Icons.INFO,
215+
label=self._["about"],
216+
index=4,
217+
name="about",
218+
selected_icon=ft.Icons.INFO
219+
),
200220
]
201221
self.selected_control_group = self.control_groups[0]

app/ui/views/about_view.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@ class AboutPage(PageBase):
88
def __init__(self, app):
99
super().__init__(app)
1010
self.page_name = "about"
11-
self._about_config = {}
11+
self.about_config = {}
1212
self.app.language_manager.add_observer(self)
1313
self.load_language()
1414
self.page.on_keyboard_event = self.on_keyboard
1515

1616
def load_language(self):
1717
self._ = self.app.language_manager.language.get("about_page")
18-
self._about_config = self.app.config_manager.load_about_config()
18+
self.about_config = self.app.config_manager.load_about_config()
1919

2020
async def load(self):
2121
"""Load the about page content."""
@@ -39,8 +39,8 @@ async def load(self):
3939
text_color_700 = ft.Colors.GREY_700
4040

4141
language_code = self.app.language_code
42-
version_updates = self._about_config["version_updates"][0]
43-
open_source_license = self._about_config["open_source_license"]
42+
version_updates = self.about_config["version_updates"][0]
43+
open_source_license = self.about_config["open_source_license"]
4444

4545
if is_mobile:
4646
feature_highlights = ft.Column(
@@ -250,7 +250,7 @@ async def load(self):
250250
controls=[
251251
ft.Text(self._["introduction"], size=20, weight=ft.FontWeight.W_600, color=text_color),
252252
ft.Text(
253-
self._about_config["introduction"].get(language_code),
253+
self.about_config["introduction"].get(language_code),
254254
size=16,
255255
text_align=ft.TextAlign.JUSTIFY,
256256
color=text_color_600,

0 commit comments

Comments
 (0)