From 7102e77b2aa51ce0cc3dbab3e01c20f8a65ff8aa Mon Sep 17 00:00:00 2001 From: yqsphp Date: Thu, 15 Jan 2026 15:00:06 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=93=E6=AD=A3=E5=9C=A8?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E6=97=B6=EF=BC=8C=E6=8A=95=E5=B1=8F=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E8=A2=AB=E5=BC=BA=E5=88=B6=E9=80=80=E5=87=BA=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=EF=BC=8C=E5=86=8D=E6=AC=A1=E6=9F=A5=E6=89=BE=E8=AF=A5?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8A=95=E5=B1=8F=E5=A4=B1=E8=B4=A5=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=89=80=E6=9C=89=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E6=8C=89=E9=92=AE=E9=AA=8C=E8=AF=81=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=B7=B2=E9=80=89=E6=8B=A9=E6=96=87=E4=BB=B6=E5=92=8C=E8=AE=BE?= =?UTF-8?q?=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/device_list.py | 9 ++++++-- ui/main_window.py | 54 ++++++++++++++++++++++++++++++++++----------- ui/ui_window.py | 2 +- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/core/device_list.py b/core/device_list.py index 7617519..17cb795 100644 --- a/core/device_list.py +++ b/core/device_list.py @@ -14,15 +14,17 @@ class DeviceList: :return: """ if device["udn"] not in self.list: - self.list.setdefault(device["udn"], {"stat":False, "controller": None, "pause": False}) + self.list.setdefault(device["udn"], {"stat":False, "location":device["location"], "controller": None, "pause": False}) return self.list[device["udn"]] - def update_device(self, device, stat, controller = None, pause = None): + def update_device(self, device, stat, controller = None, pause = None, location = None): """ 更新设备信息 :param device:设备 :param stat:设备状态播放 bool :param controller:控制对象 + :param pause: 暂停状态 + :param location: 设备文档地址 :return: """ if device["udn"] in self.list: @@ -33,6 +35,9 @@ class DeviceList: self.list[key].update({"stat":stat,"controller":controller}) if pause is not None: self.list[key]["pause"] = pause + # 设备文档地址 + if location is not None: + self.list[key]["location"] = location return True diff --git a/ui/main_window.py b/ui/main_window.py index 3d7cf07..bd50a11 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -37,14 +37,8 @@ class MainWindow(QMainWindow, UiWindow): self.logger = AppLogger('MediaCastUI') # 初始化ui self.init_ui() - # 初始化服务 - self.init_connections() - - def init_connections(self): - """初始化信号连接""" # 设备发现 self.refresh_devices() - # 启动HTTP文件服务器 self.start_http_server() @@ -224,7 +218,15 @@ class MainWindow(QMainWindow, UiWindow): stat = self.selected_device_list.get_device(device) #如果当前设备已存在,将控制对象赋值 if stat != False and stat["controller"] is not None: - self.dlna_controller = stat["controller"] + # 重新刷新判断获取设备uuid的location是否一致 + if stat["location"] == device["location"]: + self.dlna_controller = stat["controller"] + else: + # 当投屏设备发生强制结束时,再次启动它的端口会变,这时从新实例化控制对象 + self.dlna_controller = DLNAController(device) + # 还原控制按钮 + self.selected_device_list.update_device(device, False, self.dlna_controller, False, device["location"]) + self.enable_control_buttons(True) # 当前选中设备如果正在播放中,控制按钮都不变 if stat != False and stat["stat"] == True: @@ -269,12 +271,9 @@ class MainWindow(QMainWindow, UiWindow): def start_casting(self): """开始投屏""" - if not self.selected_device : - self.log_message("请先选择设备", "error") - return - if not self.selected_file: - self.log_message("请先选择文件", "error") + if not self.select_device_file_stat(): return + try: # 检查当前选中设备的控制对象 device = self.selected_device_list.get_device(self.selected_device) @@ -311,7 +310,7 @@ class MainWindow(QMainWindow, UiWindow): # 如果已经创建了DLNA控制器 if device != False and device["pause"] == True: # 从暂停状态恢复播放 - if self.dlna_controller.play(): + if self.dlna_controller.play(self.speed): self.selected_device_list.update_device(self.selected_device, True, pause=False) # 设置控制按钮 self.enable_control_buttons(False) @@ -345,6 +344,9 @@ class MainWindow(QMainWindow, UiWindow): def pause_casting(self): """暂停投屏""" + if not self.select_device_file_stat(): + return + if self.dlna_controller: self.dlna_controller.pause() # 重置暂停状态 @@ -357,6 +359,9 @@ class MainWindow(QMainWindow, UiWindow): def stop_casting(self): """停止投屏""" + if not self.select_device_file_stat(): + return + if self.dlna_controller: self.dlna_controller.stop() # 重置停止状态 @@ -368,11 +373,17 @@ class MainWindow(QMainWindow, UiWindow): def volume_changed(self, value): """音量改变""" + if not self.select_device_file_stat(): + return + if self.dlna_controller: self.dlna_controller.set_volume(value) def toggle_mute(self, checked): """切换静音""" + if not self.select_device_file_stat(): + return + if self.dlna_controller: self.dlna_controller.set_mute(checked) icon = "🔇" if checked else "🔊" @@ -386,6 +397,9 @@ class MainWindow(QMainWindow, UiWindow): 设置播放速度 :return: """ + if not self.select_device_file_stat(): + return + self.speed = self.speed_btn.currentData() self.log_message(f"设置播放速度:{self.speed_btn.currentText()}") @@ -408,6 +422,20 @@ class MainWindow(QMainWindow, UiWindow): self.volume_slider.setEnabled(False if enabled else True) self.mute_btn.setEnabled(False if enabled else True) + def select_device_file_stat(self): + """ + 控制按钮都需要验证 + :return: + """ + if not self.selected_device : + self.log_message("请先选择设备", "error") + return False + if not self.selected_file: + self.log_message("请先选择文件", "error") + return False + + return True + def closeEvent(self, event): """窗口关闭事件""" # 停止HTTP服务器 diff --git a/ui/ui_window.py b/ui/ui_window.py index 9a80cbe..7b1a246 100644 --- a/ui/ui_window.py +++ b/ui/ui_window.py @@ -54,7 +54,7 @@ class UiWindow: """ def init_ui(self): """初始化UI界面""" - version = "v1.1.0" + version = "v1.2.0" app_name = "多媒体投屏 by yqsphp" self.setWindowTitle(app_name)