From 0a7a5b7733d9cbfa6e17194eab95f57336052c8e Mon Sep 17 00:00:00 2001 From: RRRosmontis Date: Tue, 18 Aug 2026 08:03:51 +0000 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=E3=80=8C/=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TKYM-Singl.png | Bin 0 -> 115072 bytes danmaku.py | 1145 ++++++++++++++++++++++++++++++++++++++++++++++++ danmaku.spec | 39 ++ ico.ico | Bin 0 -> 12315 bytes test.py | 10 + 5 files changed, 1194 insertions(+) create mode 100644 TKYM-Singl.png create mode 100644 danmaku.py create mode 100644 danmaku.spec create mode 100644 ico.ico create mode 100644 test.py diff --git a/TKYM-Singl.png b/TKYM-Singl.png new file mode 100644 index 0000000000000000000000000000000000000000..9870285253672421c9ba96da1f75251761e4f1f5 GIT binary patch literal 115072 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�ORKs_h$dh0#3; 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 literal 0 HcmV?d00001 diff --git a/danmaku.py b/danmaku.py new file mode 100644 index 0000000..5cd087b --- /dev/null +++ b/danmaku.py @@ -0,0 +1,1145 @@ +import asyncio +import json +import logging +import sys +import threading +import io +import urllib.request +from PIL import Image, ImageDraw +import pystray +from winotify import Notification, audio +import websockets +import pythoncom + +# PyQt5 相关导入 +from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QLineEdit, + QRadioButton, QPushButton, QSlider, + QVBoxLayout, QHBoxLayout, QGroupBox, QMessageBox, + QFrame, QScrollArea, QSizePolicy, QDialog) +from PyQt5.QtCore import Qt, QThread, pyqtSignal, QSize, QPropertyAnimation, QPoint, QRect, QTimer +from PyQt5.QtGui import QIntValidator, QFont, QResizeEvent, QMouseEvent, QColor, QPainter, QBrush, QPen, QFontMetrics, QIcon, QPixmap, QImage + +# ==================== 版本号 ==================== +VERSION = "0.6.2" + +# ==================== 配置日志 ==================== +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' +) +logger = logging.getLogger("danmaku_client") + +# ==================== 全局变量 ==================== +exit_event = threading.Event() # 退出标志 +active_websockets = [] # 所有活跃的 WebSocket 连接对象 +ws_lock = threading.Lock() # 保护 active_websockets 的线程锁 + +# 图标URL(若无法访问,将自动降级为默认图标) +ICON_URL = "https://cdn.rrrosmontis.icu/tsukuyomi/TKYM-Singl.png" + +# ==================== 获取应用图标(供任务栏和托盘共用) ==================== +def create_default_icon(): + size = 64 + img = Image.new('RGB', (size, size), color='white') + draw = ImageDraw.Draw(img) + draw.ellipse([8, 8, size-8, size-8], fill='blue', outline='darkblue') + return img + +def get_icon_image(): + try: + with urllib.request.urlopen(ICON_URL, timeout=5) as response: + img_data = response.read() + img = Image.open(io.BytesIO(img_data)) + if img.mode != 'RGBA': + img = img.convert('RGBA') + logger.info("成功加载远程图标") + return img + except Exception as e: + logger.warning(f"加载远程图标失败: {e},使用默认图标") + return create_default_icon() + +def get_qicon(): + """将 PIL Image 转换为 QIcon""" + img = get_icon_image() + img = img.convert("RGBA") + data = img.tobytes("raw", "RGBA") + qimage = QImage(data, img.width, img.height, QImage.Format_RGBA8888) + pixmap = QPixmap.fromImage(qimage) + return QIcon(pixmap) + +# ==================== PyQt5 配置对话框(改为 QDialog) ==================== +class ConfigDialog(QDialog): + """美观的配置对话框,用于输入房间号、选择节点、显示模式""" + def __init__(self): + super().__init__() + self.room_id = None + self.mode = None + self.opacity = 0.85 # 默认透明度 + self.font_size = 10 # 默认字号(减小) + self.aspect_ratio = "9:16" # 默认宽高比改为 9:16 + self.display_mode = "window" # 默认悬浮窗模式 ("window" 或 "notification") + self.init_ui() + + def init_ui(self): + """初始化界面组件""" + self.setWindowTitle(f"TSUKUYOMI DANMAKU - CONFIG") + self.resize(500, 520) # 稍微增加高度以容纳新模式选项 + self.setMinimumSize(400, 480) + self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) + + # 深色背景样式表(与原来一致) + self.setStyleSheet(""" + QWidget { + background-color: #0a0e17; + color: #e0e0e0; + font-family: "Microsoft YaHei", "Segoe UI", sans-serif; + font-size: 13px; + } + QLabel { + color: #c0c0c0; + } + QLineEdit { + background-color: #1e2434; + border: 1px solid #2c3348; + border-radius: 5px; + padding: 8px 10px; + color: #ffffff; + font-size: 13px; + selection-background-color: #3a425c; + } + QLineEdit:focus { + border: 1px solid #5a6e8a; + } + QRadioButton { + color: #d0d0d0; + font-size: 13px; + spacing: 10px; + padding: 4px 0; + } + QRadioButton::indicator { + width: 16px; + height: 16px; + } + QRadioButton::indicator:unchecked { + border: 1px solid #5a6e8a; + border-radius: 8px; + background-color: #1e2434; + } + QRadioButton::indicator:checked { + border: 1px solid #7c9cbf; + border-radius: 8px; + background-color: #4c7a9a; + } + QPushButton { + background-color: #2c3348; + border: none; + border-radius: 6px; + padding: 8px 20px; + color: #ffffff; + font-size: 13px; + font-weight: bold; + } + QPushButton:hover { + background-color: #3a425c; + } + QPushButton:pressed { + background-color: #1f2538; + } + QGroupBox { + border: 1px solid #2c3348; + border-radius: 8px; + margin-top: 12px; + font-size: 13px; + font-weight: normal; + } + QGroupBox::title { + subcontrol-origin: margin; + left: 12px; + padding: 0 6px 0 6px; + color: #b0b0b0; + } + """) + + # 主布局 + main_layout = QVBoxLayout() + main_layout.setSpacing(18) + main_layout.setContentsMargins(25, 20, 25, 20) + + # 标题区域 + title_label = QLabel("TSUKUYOMI DANMAKU") + title_font = QFont() + title_font.setPointSize(15) + title_font.setBold(True) + title_label.setFont(title_font) + title_label.setAlignment(Qt.AlignCenter) + title_label.setStyleSheet("color: #d4d4d4; margin-bottom: 8px;") + main_layout.addWidget(title_label) + + # 房间号输入区域 + room_layout = QVBoxLayout() + room_label = QLabel("房间号 (1-100)") + room_label.setStyleSheet("margin-bottom: 4px; font-weight: bold;") + self.room_edit = QLineEdit() + self.room_edit.setPlaceholderText("请输入数字房间号") + self.room_edit.setValidator(QIntValidator(1, 100)) + room_layout.addWidget(room_label) + room_layout.addWidget(self.room_edit) + main_layout.addLayout(room_layout) + + # 节点选择区域 + node_group = QGroupBox("接入节点选择") + node_group.setMinimumHeight(140) + node_group.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) + node_layout = QVBoxLayout() + node_layout.setSpacing(10) + node_layout.setContentsMargins(15, 12, 15, 12) + + self.radio_main = QRadioButton("[主站] api.rrrosmontis.icu") + self.radio_backup = QRadioButton("[副站] tsk.aeolianchi.me") + self.radio_both = QRadioButton("[主站+副站] 同时接收") + + self.radio_main.setChecked(True) + + node_layout.addWidget(self.radio_main) + node_layout.addWidget(self.radio_backup) + node_layout.addWidget(self.radio_both) + node_layout.addStretch() + node_group.setLayout(node_layout) + main_layout.addWidget(node_group) + + # ========== 新增:显示模式选择(悬浮窗 / 通知) ========== + mode_group = QGroupBox("显示模式") + mode_layout = QVBoxLayout() + mode_layout.setSpacing(10) + mode_layout.setContentsMargins(15, 12, 15, 12) + self.radio_window = QRadioButton("悬浮窗模式") + self.radio_notification = QRadioButton("通知模式") + self.radio_window.setChecked(True) # 默认悬浮窗 + mode_layout.addWidget(self.radio_window) + mode_layout.addWidget(self.radio_notification) + mode_group.setLayout(mode_layout) + main_layout.addWidget(mode_group) + + # 添加弹性空间 + main_layout.addStretch(1) + + # 按钮区域 + btn_layout = QHBoxLayout() + btn_layout.setSpacing(25) + self.start_btn = QPushButton("启动接收") + self.start_btn.setMinimumHeight(36) + self.cancel_btn = QPushButton("退出程序") + self.cancel_btn.setMinimumHeight(36) + + btn_layout.addStretch() + btn_layout.addWidget(self.start_btn) + btn_layout.addWidget(self.cancel_btn) + btn_layout.addStretch() + main_layout.addLayout(btn_layout) + + # 版本提示 + ver_label = QLabel(f"版本 {VERSION}") + ver_label.setAlignment(Qt.AlignCenter) + ver_label.setStyleSheet("color: #6a6e7a; font-size: 10px; margin-top: 10px;") + main_layout.addWidget(ver_label) + + self.setLayout(main_layout) + + # 连接信号 + self.start_btn.clicked.connect(self.on_start_clicked) + self.cancel_btn.clicked.connect(self.on_cancel_clicked) + + def on_start_clicked(self): + """启动按钮处理:验证房间号并保存配置""" + room_text = self.room_edit.text().strip() + if not room_text: + QMessageBox.warning(self, "输入错误", "请输入房间号") + return + + try: + room_val = int(room_text) + if not (1 <= room_val <= 100): + QMessageBox.warning(self, "输入错误", "房间号必须在 1-100 之间") + return + except ValueError: + QMessageBox.warning(self, "输入错误", "房间号必须为整数") + return + + if self.radio_main.isChecked(): + mode = "main" + elif self.radio_backup.isChecked(): + mode = "backup" + else: + mode = "both" + + # 获取显示模式 + if self.radio_window.isChecked(): + display_mode = "window" + else: + display_mode = "notification" + + self.room_id = room_val + self.mode = mode + self.display_mode = display_mode + # 透明度、字号、宽高比使用默认值(注意字号默认10,比例9:16) + self.opacity = 0.85 + self.font_size = 10 # 默认字号减小 + self.aspect_ratio = "9:16" + + self.accept() # 关闭对话框并返回 Accepted + + def on_cancel_clicked(self): + """退出程序""" + self.reject() + +# ==================== 设置对话框(用于主悬浮窗) ==================== +class SettingsDialog(QDialog): + """设置对话框:调节透明度、字号、宽高比、窗口大小(等比缩放)""" + def __init__(self, parent_window): + super().__init__(parent_window) + self.parent_window = parent_window # DanmakuWindow 实例 + self.setWindowTitle("悬浮窗设置") + self.setModal(True) + self.setFixedSize(400, 420) + self.setStyleSheet(""" + QDialog { + background-color: #1e1e2e; + color: #ffffff; + } + QLabel { + color: #ffffff; + } + QRadioButton { + color: #ffffff; + } + QSlider::groove:horizontal { + height: 4px; + background: #2c3348; + border-radius: 2px; + } + QSlider::handle:horizontal { + background: #7c9cbf; + width: 12px; + height: 12px; + margin: -4px 0; + border-radius: 6px; + } + QPushButton { + background-color: #2c3348; + border: none; + border-radius: 6px; + padding: 6px 12px; + color: #ffffff; + } + QPushButton:hover { + background-color: #3a425c; + } + QGroupBox { + border: 1px solid #2c3348; + border-radius: 6px; + margin-top: 10px; + color: #ffffff; + } + QGroupBox::title { + subcontrol-origin: margin; + left: 10px; + padding: 0 5px; + color: #ffffff; + } + """) + + layout = QVBoxLayout(self) + layout.setSpacing(15) + + # 透明度 + opacity_group = QGroupBox("窗口透明度") + opacity_layout = QVBoxLayout() + self.opacity_slider = QSlider(Qt.Horizontal) + self.opacity_slider.setRange(20, 100) + self.opacity_slider.setValue(int(self.parent_window.opacity_value * 100)) + self.opacity_slider.valueChanged.connect(self.on_opacity_changed) + opacity_layout.addWidget(self.opacity_slider) + self.opacity_label = QLabel(f"当前: {self.opacity_slider.value()}%") + opacity_layout.addWidget(self.opacity_label) + opacity_group.setLayout(opacity_layout) + layout.addWidget(opacity_group) + + # 字号 + font_group = QGroupBox("弹幕字号") + font_layout = QVBoxLayout() + self.font_slider = QSlider(Qt.Horizontal) + self.font_slider.setRange(4, 24) + self.font_slider.setValue(self.parent_window.current_font_size) + self.font_slider.valueChanged.connect(self.on_font_changed) + font_layout.addWidget(self.font_slider) + self.font_label = QLabel(f"当前: {self.font_slider.value()}px") + font_layout.addWidget(self.font_label) + font_group.setLayout(font_layout) + layout.addWidget(font_group) + + # 宽高比 + ratio_group = QGroupBox("悬浮窗宽高比") + ratio_layout = QVBoxLayout() + ratio_radio_layout = QHBoxLayout() + self.radio_16_9 = QRadioButton("16:9") + self.radio_9_16 = QRadioButton("9:16") + if self.parent_window.current_aspect_ratio == "16:9": + self.radio_16_9.setChecked(True) + else: + self.radio_9_16.setChecked(True) + self.radio_16_9.toggled.connect(self.on_ratio_changed) + self.radio_9_16.toggled.connect(self.on_ratio_changed) + ratio_radio_layout.addWidget(self.radio_16_9) + ratio_radio_layout.addWidget(self.radio_9_16) + ratio_radio_layout.addStretch() + ratio_layout.addLayout(ratio_radio_layout) + ratio_group.setLayout(ratio_layout) + layout.addWidget(ratio_group) + + # 窗口大小调节(等比缩放) + size_group = QGroupBox("窗口大小(等比缩放)") + size_layout = QVBoxLayout() + + # 宽度调节滑块 + width_layout = QHBoxLayout() + width_layout.addWidget(QLabel("宽度:")) + self.width_slider = QSlider(Qt.Horizontal) + # 宽度范围:最小宽度 ~ 屏幕宽度 + min_w = self.parent_window.min_width + max_w = QApplication.primaryScreen().geometry().width() - 100 + self.width_slider.setRange(min_w, max_w) + self.width_slider.setValue(self.parent_window.width()) + self.width_slider.valueChanged.connect(self.on_width_changed) + width_layout.addWidget(self.width_slider) + self.width_value_label = QLabel(f"{self.parent_window.width()}px") + width_layout.addWidget(self.width_value_label) + size_layout.addLayout(width_layout) + + # 高度显示(只读) + height_layout = QHBoxLayout() + height_layout.addWidget(QLabel("高度:")) + self.height_value_label = QLabel(f"{self.parent_window.height()}px") + height_layout.addWidget(self.height_value_label) + height_layout.addStretch() + size_layout.addLayout(height_layout) + + size_group.setLayout(size_layout) + layout.addWidget(size_group) + + # 按钮 + btn_layout = QHBoxLayout() + btn_layout.addStretch() + close_btn = QPushButton("关闭") + close_btn.clicked.connect(self.accept) + btn_layout.addWidget(close_btn) + layout.addLayout(btn_layout) + + def on_opacity_changed(self, value): + opacity = value / 100.0 + self.parent_window.set_opacity(opacity) + self.opacity_label.setText(f"当前: {value}%") + + def on_font_changed(self, value): + self.parent_window.set_font_size(value) + self.font_label.setText(f"当前: {value}px") + + def on_ratio_changed(self): + if self.radio_16_9.isChecked(): + new_ratio = "16:9" + else: + new_ratio = "9:16" + self.parent_window.set_aspect_ratio(new_ratio) + min_w = self.parent_window.min_width + max_w = self.width_slider.maximum() + self.width_slider.setRange(min_w, max_w) + current_width = self.parent_window.width() + if current_width < min_w: + current_width = min_w + self.parent_window.set_window_width(current_width) + self.width_slider.setValue(current_width) + self.width_value_label.setText(f"{current_width}px") + self.height_value_label.setText(f"{self.parent_window.height()}px") + + def on_width_changed(self, width): + self.parent_window.set_window_width(width) + self.width_value_label.setText(f"{width}px") + self.height_value_label.setText(f"{self.parent_window.height()}px") + + def showEvent(self, event): + self.opacity_slider.setValue(int(self.parent_window.opacity_value * 100)) + self.font_slider.setValue(self.parent_window.current_font_size) + if self.parent_window.current_aspect_ratio == "16:9": + self.radio_16_9.setChecked(True) + else: + self.radio_9_16.setChecked(True) + self.width_slider.setValue(self.parent_window.width()) + self.width_slider.setRange(self.parent_window.min_width, self.width_slider.maximum()) + self.width_value_label.setText(f"{self.parent_window.width()}px") + self.height_value_label.setText(f"{self.parent_window.height()}px") + super().showEvent(event) + + # 新增:从主窗口同步当前字号并更新UI + def refresh_font_display(self): + """从主窗口同步当前字号并更新滑块和标签""" + current_size = self.parent_window.current_font_size + self.font_slider.setValue(current_size) + self.font_label.setText(f"当前: {current_size}px") + +# ==================== 弹幕接收线程(异步) ==================== +class DanmakuReceiver(QThread): + """在独立线程中运行 asyncio 事件循环,接收弹幕并通过信号发送到主窗口""" + new_danmaku = pyqtSignal(str, str) # 用户名, 弹幕内容 + + def __init__(self, room_id: int, mode: str): + super().__init__() + self.room_id = room_id + self.mode = mode + self.exit_event = threading.Event() + self.loop = None + + def stop(self): + self.exit_event.set() + global active_websockets + with ws_lock: + for ws in active_websockets: + if self.loop and self.loop.is_running(): + asyncio.run_coroutine_threadsafe(ws.close(), self.loop) + active_websockets.clear() + if self.loop and self.loop.is_running(): + self.loop.call_soon_threadsafe(self.loop.stop) + + def run(self): + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + try: + self.loop.run_until_complete(self.main_async()) + except asyncio.CancelledError: + logger.info("异步任务被取消") + except Exception as e: + logger.error(f"异步任务异常: {e}") + finally: + pending = asyncio.all_tasks(self.loop) + for task in pending: + task.cancel() + if pending: + self.loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True)) + self.loop.close() + logger.info("事件循环已关闭") + + async def handle_message(self, message: str): + try: + data = json.loads(message) + msg_type = data.get("type") + if msg_type == "danmaku": + danmaku = data.get("data", {}) + user = danmaku.get("user", "匿名") + text = danmaku.get("text", "") + self.new_danmaku.emit(user, text) + elif msg_type == "init": + logger.info("收到 init 消息(忽略)") + else: + logger.debug(f"未知消息类型: {msg_type}") + except json.JSONDecodeError: + logger.error(f"解析消息失败: {message}") + except Exception as e: + logger.error(f"处理消息异常: {e}") + + async def websocket_task(self, url: str, name: str): + global active_websockets + while not self.exit_event.is_set(): + websocket = None + try: + async with websockets.connect(url) as websocket: + with ws_lock: + active_websockets.append(websocket) + logger.info(f"[{name}] 已连接到 {url}") + + join_msg = { + "type": "join", + "room": self.room_id, + "user": "客户端用户" + } + await websocket.send(json.dumps(join_msg)) + + init_msg = await websocket.recv() + logger.info(f"[{name}] 收到 init: {init_msg[:100]}") + + async for message in websocket: + if self.exit_event.is_set(): + break + await self.handle_message(message) + + except websockets.exceptions.ConnectionClosed: + if not self.exit_event.is_set(): + logger.warning(f"[{name}] 连接已关闭,5秒后重连...") + except Exception as e: + if not self.exit_event.is_set(): + logger.error(f"[{name}] 连接错误: {e},5秒后重连...") + finally: + if websocket: + with ws_lock: + if websocket in active_websockets: + active_websockets.remove(websocket) + + if not self.exit_event.is_set(): + await asyncio.sleep(5) + + logger.info(f"[{name}] WebSocket 任务已退出") + + async def main_async(self): + MAIN_URL = "wss://api.rrrosmontis.icu/v1/live/danmaku" + BACKUP_URL = "wss://tsk.aeolianchi.me/danmaku" + + tasks = [] + if self.mode == "main": + tasks.append(self.websocket_task(MAIN_URL, "主站")) + elif self.mode == "backup": + tasks.append(self.websocket_task(BACKUP_URL, "副站")) + elif self.mode == "both": + tasks.append(self.websocket_task(MAIN_URL, "主站")) + tasks.append(self.websocket_task(BACKUP_URL, "副站")) + else: + logger.error(f"未知模式: {self.mode}") + return + + await asyncio.gather(*tasks, return_exceptions=True) + +# ==================== 弹幕条目控件(支持动画) ==================== +class DanmakuItem(QLabel): + """单个弹幕的显示控件,支持淡入动画""" + def __init__(self, user: str, text: str, font_size: int, parent=None): + super().__init__(parent) + html = f'
{user}: {text}
' + self.setText(html) + self.setTextFormat(Qt.RichText) + self.setWordWrap(True) + self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Minimum) + font = QFont("Microsoft YaHei", font_size) + self.setFont(font) + self.setContentsMargins(4, 2, 4, 2) + self.setStyleSheet(""" + QLabel { + background-color: rgba(30, 30, 40, 100); + border-radius: 6px; + padding: 4px 6px; + } + """) + self.opacity_effect = None + self.animation = None + + def start_animation(self): + from PyQt5.QtWidgets import QGraphicsOpacityEffect + self.opacity_effect = QGraphicsOpacityEffect(self) + self.setGraphicsEffect(self.opacity_effect) + self.opacity_effect.setOpacity(0) + self.animation = QPropertyAnimation(self.opacity_effect, b"opacity") + self.animation.setDuration(300) + self.animation.setStartValue(0) + self.animation.setEndValue(1) + self.animation.start() + +# ==================== 主悬浮窗(无边框、可拖拽、等比例缩放、半透明) ==================== +class DanmakuWindow(QWidget): + def __init__(self, room_id: int, mode: str, opacity: float, font_size: int, aspect_ratio: str): + super().__init__() + self.room_id = room_id + self.mode = mode + self.opacity_value = opacity + self.current_font_size = font_size + self.current_aspect_ratio = aspect_ratio # "16:9" 或 "9:16" + self.dragging = False + self.drag_pos = None + self.receiver = None + self._updating_scaling = False + self.settings_dialog = None # 记录设置对话框实例,用于同步字号 + + self.update_min_size() + if self.current_aspect_ratio == "16:9": + self.base_width = 350 # 减小默认宽度 + self.base_height = int(350 * 9 / 16) + else: + self.base_width = 250 # 9:16 默认宽度更小 + self.base_height = int(250 * 16 / 9) + if self.base_width < self.min_width: + self.base_width = self.min_width + self.base_height = int(self.base_width * (9/16 if self.current_aspect_ratio == "16:9" else 16/9)) + + self.init_ui() + + # 窗口标志:无边框、置顶、工具窗口(隐藏任务栏) + self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.Tool) + self.setAttribute(Qt.WA_TranslucentBackground) + self.setWindowOpacity(self.opacity_value) + + self.resize(self.base_width, self.base_height) + self.center() + + self._resizing = False + self.update_ui_scaling() + + def update_min_size(self): + if self.current_aspect_ratio == "16:9": + self.min_width = 150 + self.min_height = int(150 * 9 / 16) + else: + self.min_width = 100 + self.min_height = int(100 * 16 / 9) + + def center(self): + screen_geo = QApplication.primaryScreen().geometry() + x = (screen_geo.width() - self.width()) // 2 + y = (screen_geo.height() - self.height()) // 2 + self.move(x, y) + + def init_ui(self): + self.container = QFrame(self) + self.container.setObjectName("Container") + self.container.setStyleSheet(""" + QFrame#Container { + background-color: rgba(20, 20, 30, 255); + border-radius: 12px; + border: 1px solid rgba(255, 255, 255, 30); + } + QLabel { + color: #f0f0f0; + background: transparent; + } + """) + + main_layout = QVBoxLayout(self.container) + main_layout.setContentsMargins(8, 12, 8, 12) + main_layout.setSpacing(8) + + self.title_layout = QVBoxLayout() + self.title_layout.setSpacing(4) + + first_row = QHBoxLayout() + self.title_label1 = QLabel("弹幕列表") + self.title_label1.setStyleSheet("font-weight: bold; color: #d4d4d4;") + first_row.addWidget(self.title_label1) + first_row.addStretch() + + self.settings_btn = QPushButton("⚙") + self.settings_btn.setStyleSheet(""" + QPushButton { + background: rgba(80, 80, 90, 150); + border-radius: 12px; + font-weight: bold; + color: #c0c0c0; + } + QPushButton:hover { + background: rgba(120, 120, 130, 200); + color: white; + } + """) + self.settings_btn.clicked.connect(self.open_settings) + first_row.addWidget(self.settings_btn) + + self.close_btn = QPushButton("✕") + self.close_btn.setStyleSheet(""" + QPushButton { + background: rgba(80, 80, 90, 150); + border-radius: 12px; + font-weight: bold; + color: #c0c0c0; + } + QPushButton:hover { + background: rgba(120, 120, 130, 200); + color: white; + } + """) + self.close_btn.clicked.connect(self.close_app) + first_row.addWidget(self.close_btn) + + self.title_layout.addLayout(first_row) + + mode_text = "" + if self.mode == "main": + mode_text = "SITE 1" + elif self.mode == "backup": + mode_text = "SITE 2" + else: + mode_text = "SITE 1 & 2" + self.title_label2 = QLabel(f"{mode_text} · ROOM {self.room_id}") + self.title_label2.setStyleSheet("color: #a0a0c0;") + self.title_layout.addWidget(self.title_label2) + main_layout.addLayout(self.title_layout) + + line = QFrame() + line.setFrameShape(QFrame.HLine) + line.setStyleSheet("background-color: rgba(255, 255, 255, 40); max-height: 1px;") + main_layout.addWidget(line) + + self.scroll_area = QScrollArea() + self.scroll_area.setWidgetResizable(True) + self.scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) + self.scroll_area.setStyleSheet(""" + QScrollArea { + background: transparent; + border: none; + } + QScrollArea > QWidget { + background: transparent; + } + """) + self.scroll_area.viewport().setStyleSheet("background: transparent;") + + self.danmaku_container = QWidget() + self.danmaku_container.setStyleSheet("background: transparent;") + self.danmaku_layout = QVBoxLayout(self.danmaku_container) + self.danmaku_layout.setAlignment(Qt.AlignTop) + self.danmaku_layout.setSpacing(6) + self.danmaku_layout.setContentsMargins(2, 4, 2, 4) + self.scroll_area.setWidget(self.danmaku_container) + + main_layout.addWidget(self.scroll_area) + + self.container.setGeometry(0, 0, self.width(), self.height()) + self.container.setLayout(main_layout) + + def update_ui_scaling(self): + if self._updating_scaling: + return + self._updating_scaling = True + base_width = 500 + scale = self.width() / base_width + scale = max(0.5, min(1.5, scale)) + + title_font_size = int(16 * scale) + title_font = QFont("Microsoft YaHei", title_font_size) + title_font.setBold(True) + self.title_label1.setFont(title_font) + + subtitle_font_size = int(11 * scale) + subtitle_font = QFont("Microsoft YaHei", subtitle_font_size) + self.title_label2.setFont(subtitle_font) + + btn_size = int(24 * scale) + btn_font_size = int(14 * scale) + self.settings_btn.setFixedSize(btn_size, btn_size) + self.close_btn.setFixedSize(btn_size, btn_size) + + btn_font = QFont("Segoe UI", btn_font_size) + self.settings_btn.setFont(btn_font) + self.close_btn.setFont(btn_font) + + self.title_layout.setSpacing(int(4 * scale)) + self._updating_scaling = False + + def open_settings(self): + if self.settings_dialog is None: + dlg = SettingsDialog(self) + self.settings_dialog = dlg + dlg.finished.connect(lambda: setattr(self, 'settings_dialog', None)) + dlg.show() + else: + self.settings_dialog.raise_() + self.settings_dialog.activateWindow() + + def set_opacity(self, value): + self.opacity_value = value + self.setWindowOpacity(value) + + def set_font_size(self, size): + self.current_font_size = size + font = QFont("Microsoft YaHei", size) + for i in range(self.danmaku_layout.count()): + item = self.danmaku_layout.itemAt(i) + if item and item.widget(): + widget = item.widget() + widget.setFont(font) + widget.updateGeometry() + self.danmaku_layout.invalidate() + self.danmaku_container.updateGeometry() + self.scroll_area.updateGeometry() + self.scroll_to_bottom() + + # 如果设置对话框已打开,同步其显示 + if self.settings_dialog is not None: + self.settings_dialog.refresh_font_display() + + def set_aspect_ratio(self, ratio): + if ratio == self.current_aspect_ratio: + return + self.current_aspect_ratio = ratio + self.update_min_size() + self.set_window_width(self.width()) + + def set_window_width(self, width): + if width < self.min_width: + width = self.min_width + if self.current_aspect_ratio == "16:9": + height = int(width * 9 / 16) + else: + height = int(width * 16 / 9) + if height < self.min_height: + height = self.min_height + width = int(height * (16/9 if self.current_aspect_ratio == "16:9" else 9/16)) + self.resize(width, height) + + def add_danmaku(self, user: str, text: str): + """添加一条弹幕,并强制滚动到底部(修复留白和显示不全问题)""" + if not self.isVisible(): + return + item = DanmakuItem(user, text, self.current_font_size) + self.danmaku_layout.addWidget(item) + item.start_animation() + + # 延迟滚动,确保布局完全更新(避免留白/显示不全) + QTimer.singleShot(30, self.scroll_to_bottom) + + # 限制最大条目数 + if self.danmaku_layout.count() > 200: + oldest_item = self.danmaku_layout.takeAt(0) + if oldest_item.widget(): + oldest_item.widget().deleteLater() + + def scroll_to_bottom(self): + """滚动到底部,强制更新滚动条最大值""" + scrollbar = self.scroll_area.verticalScrollBar() + # 先强制刷新布局,确保最大值正确 + self.danmaku_container.updateGeometry() + self.scroll_area.updateGeometry() + scrollbar.setValue(scrollbar.maximum()) + + def close_app(self): + if self.receiver: + try: + self.receiver.new_danmaku.disconnect(self.add_danmaku) + except (TypeError, AttributeError): + pass + exit_event.set() + if self.receiver and self.receiver.isRunning(): + self.receiver.stop() + self.receiver.wait(3000) + QApplication.quit() + + # ========== 无边框窗口拖拽和等比例缩放 ========== + def mousePressEvent(self, event: QMouseEvent): + if event.button() == Qt.LeftButton: + if event.pos().y() < 60: + self.dragging = True + self.drag_pos = event.globalPos() + event.accept() + + def mouseMoveEvent(self, event: QMouseEvent): + if self.dragging and self.drag_pos is not None: + delta = event.globalPos() - self.drag_pos + self.move(self.x() + delta.x(), self.y() + delta.y()) + self.drag_pos = event.globalPos() + event.accept() + + def mouseReleaseEvent(self, event: QMouseEvent): + self.dragging = False + self.drag_pos = None + + def mouseDoubleClickEvent(self, event: QMouseEvent): + if event.pos().y() < 60: + if self.isMaximized(): + self.showNormal() + else: + self.showMaximized() + + def update_danmaku_max_width(self): + """根据当前视口宽度,限制所有弹幕条目的最大宽度""" + # 获取视口宽度(滚动区域内部可用宽度) + viewport_width = self.scroll_area.viewport().width() + # 减去 danmaku_layout 的左右边距(2+2=4)以及容器内边距 + max_width = viewport_width - 8 # 左右各2px边距,再留一点余量 + if max_width < 50: + max_width = 50 + for i in range(self.danmaku_layout.count()): + item = self.danmaku_layout.itemAt(i) + if item and item.widget(): + widget = item.widget() + widget.setMaximumWidth(max_width) + # 强制重新布局,确保换行生效 + widget.updateGeometry() + + def auto_adjust_font_size(self): + """根据当前窗口宽度自动计算并调整弹幕字号""" + width = self.width() + new_size = int(width * 0.04) # 线性关系:宽度250 -> 字号10 + new_size = max(4, min(24, new_size)) # 限制字号范围 4~24 + if new_size != self.current_font_size: + self.set_font_size(new_size) + + def resizeEvent(self, event: QResizeEvent): + if not self._resizing and not self.isMaximized(): + self._resizing = True + if self.current_aspect_ratio == "16:9": + target_ratio = 16 / 9 + else: + target_ratio = 9 / 16 + + new_width = event.size().width() + new_height = event.size().height() + current_ratio = new_width / new_height + + if abs(current_ratio - target_ratio) > 0.01: + if current_ratio > target_ratio: + new_width = int(new_height * target_ratio) + else: + new_height = int(new_width / target_ratio) + new_width = max(self.min_width, new_width) + new_height = max(self.min_height, new_height) + self.resize(new_width, new_height) + event.accept() + + self.container.setGeometry(0, 0, self.width(), self.height()) + self._resizing = False + elif self.isMaximized(): + self.container.setGeometry(0, 0, self.width(), self.height()) + + self.update_ui_scaling() + self.update_danmaku_max_width() + self.auto_adjust_font_size() + super().resizeEvent(event) + +# ==================== 系统通知发送函数(静音) ==================== +def send_notification(title: str, main_content: str, sub_content: str = ""): + """在独立线程中发送 Windows 通知(避免 Qt 事件循环冲突)""" + def _show(): + pythoncom.CoInitialize() # 初始化 COM 为 STA + notification = Notification( + app_id="TSUKUYOMI DANMAKU", + title=title, + msg=main_content, + duration="short" + ) + if sub_content: + notification.msg = f"{main_content}\n{sub_content}" + # 暂时注释掉 set_audio,避免未知干扰 + # notification.set_audio(audio.Silent, loop=False) + notification.show() + pythoncom.CoUninitialize() + + threading.Thread(target=_show, daemon=True).start() + +# ==================== 托盘图标相关 ==================== +def setup_tray(quit_callback, icon_image): + menu = pystray.Menu(pystray.MenuItem("退出", quit_callback)) + icon = pystray.Icon("danmaku_client", icon_image, "TSUKUYOMI DANMAKU", menu) + tray_thread = threading.Thread(target=icon.run, daemon=True) + tray_thread.start() + return icon, tray_thread + +# ==================== 主函数 ==================== +def main(): + if sys.platform != "win32": + logger.error("此客户端仅在 Windows 上支持系统通知,请使用其他方式") + sys.exit(1) + + # 启用高 DPI 支持 + QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) + QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) + + app = QApplication(sys.argv) + + # 设置应用图标(任务栏) + app_icon = get_qicon() + app.setWindowIcon(app_icon) + + # 显示配置对话框(模态) + config_dialog = ConfigDialog() + if config_dialog.exec_() != QDialog.Accepted: + logger.info("用户取消配置,退出程序") + sys.exit(0) + + room_id = config_dialog.room_id + mode = config_dialog.mode + opacity = config_dialog.opacity + font_size = config_dialog.font_size + aspect_ratio = config_dialog.aspect_ratio + display_mode = config_dialog.display_mode # "window" 或 "notification" + + # 创建弹幕接收线程(两种模式都需要) + receiver = DanmakuReceiver(room_id, mode) + + # 托盘图标图片(提前加载) + tray_icon_img = get_icon_image() + + # 根据显示模式创建不同的 UI 组件 + if display_mode == "window": + # 悬浮窗模式 + main_window = DanmakuWindow(room_id, mode, opacity, font_size, aspect_ratio) + main_window.show() + receiver.new_danmaku.connect(main_window.add_danmaku) + main_window.receiver = receiver + # 退出回调 + def on_quit(icon=None, item=None): + logger.info("正在安全退出...") + exit_event.set() + try: + receiver.new_danmaku.disconnect(main_window.add_danmaku) + except TypeError: + pass + receiver.stop() + receiver.wait(3000) + if icon: + icon.stop() + QApplication.quit() + # 替换 close_app 方法 + main_window.close_app = lambda: on_quit() + # 设置 app 在最后一个窗口关闭时退出(悬浮窗关闭即退出) + app.setQuitOnLastWindowClosed(True) + else: + # 通知模式:不创建悬浮窗,只使用系统通知 + # 禁止窗口关闭时退出程序(因为没有主窗口) + app.setQuitOnLastWindowClosed(False) + + # 发送启动通知 + mode_text = "" + if mode == "main": + mode_text = "SITE 1" + elif mode == "backup": + mode_text = "SITE 2" + else: + mode_text = "SITE 1 & 2" + send_notification( + title="TSUKUYOMI DANMAKU", + main_content="弹幕接收已开启。右键托盘图标可关闭", + sub_content=f"{mode_text} · ROOM {room_id}" + ) + + # 连接弹幕信号到通知函数 + def on_new_danmaku(user, text): + send_notification( + title=text, # 弹幕内容作为标题 + main_content=f"来自 {user}", # 发送者信息作为正文 + sub_content="" # 无需副内容 + ) + receiver.new_danmaku.connect(on_new_danmaku) + + # 退出回调 + def on_quit(icon=None, item=None): + logger.info("正在安全退出...") + exit_event.set() + receiver.stop() + receiver.wait(3000) + if icon: + icon.stop() + QApplication.quit() + + # 启动接收线程 + receiver.start() + + # 创建托盘图标(两种模式都需要) + tray_icon, tray_thread = setup_tray(on_quit, tray_icon_img) + + # 运行 Qt 主循环 + try: + sys.exit(app.exec_()) + except SystemExit: + pass + finally: + if receiver.isRunning(): + receiver.stop() + receiver.wait(2000) + if tray_thread.is_alive(): + tray_thread.join(timeout=1) + logger.info("程序已完全退出") + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/danmaku.spec b/danmaku.spec new file mode 100644 index 0000000..dc14ab3 --- /dev/null +++ b/danmaku.spec @@ -0,0 +1,39 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['danmaku.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='danmaku', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=['ico.ico'], +) diff --git a/ico.ico b/ico.ico new file mode 100644 index 0000000000000000000000000000000000000000..6cc3b3846682cfb18ab05372d3c9abd04b8b74cd GIT binary patch literal 12315 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