Skip to content

Commit 3b03e6e

Browse files
shinonomeowclaude
andcommitted
refactor: restructure core services and monitors architecture
- Move monitors from separate modules to module/core/monitors/ - download_monitor.py -> core/monitors/download_monitor.py - notification_monitor.py -> core/monitors/notification_monitor.py - rename_monitor.py -> core/monitors/rename_monitor.py - Split large services.py into modular service files in core/services/ - BaseService -> base_services.py - DownloadService -> download_service.py - RSSService -> rss_service.py - RenamerService -> renamer_service.py (moved from core/) - Update imports and references across affected modules - Remove obsolete notification config and manager modules - Clean up unused status reporting methods 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 13d10f2 commit 3b03e6e

24 files changed

Lines changed: 391 additions & 938 deletions

backend/src/module/core/aiocore.py

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55

66
from module.utils.events import event_bus
77

8-
from .task_manager import TaskManager
8+
from .task_manager import TaskManager
9+
910
logger = logging.getLogger(__name__)
1011

1112

@@ -22,6 +23,7 @@ def __init__(self):
2223
self._download_monitor = None
2324
self._rename_monitor = None
2425
self._notification_monitor = None
26+
self.monitors:list = []
2527
self._running: bool = False
2628
self._initialized: bool = False
2729

@@ -31,8 +33,7 @@ async def initialize(self) -> None:
3133

3234
try:
3335
# 创建服务实例
34-
from .renamer_service import RenamerService
35-
from .services import DownloadService, RSSService
36+
from .services import DownloadService, RenamerService, RSSService
3637

3738
self.services = [
3839
DownloadService(),
@@ -76,11 +77,17 @@ async def _register_tasks(self) -> None:
7677
async def _register_event_handlers(self) -> None:
7778
"""注册事件处理器"""
7879
try:
79-
from module.downloader.download_monitor import download_monitor
80-
from module.manager.rename_monitor import RenameMonitor
81-
from module.notification.notification_monitor import NotificationMonitor
80+
# from module.downloader.download_monitor import download_monitor
81+
# from module.manager.rename_monitor import RenameMonitor
82+
# from module.notification import NotificationMonitor
8283
from module.utils.events import EventType
8384

85+
from .monitors import (
86+
NotificationMonitor,
87+
RenameMonitor,
88+
download_monitor,
89+
)
90+
8491
# 使用全局 DownloadMonitor 实例
8592
self._download_monitor = download_monitor
8693
self._download_monitor.initialize()
@@ -169,31 +176,6 @@ async def _cleanup_services(self) -> None:
169176
except Exception as e:
170177
logger.error(f"[AsyncCore] 服务 {service.name} 清理失败: {e}")
171178

172-
def get_status(self) -> dict[str, Any]:
173-
"""获取应用状态"""
174-
status = {
175-
"running": self._running,
176-
"initialized": self._initialized,
177-
"tasks": self.task_manager.get_status(),
178-
"services": [
179-
{"name": s.name, "initialized": getattr(s, "_initialized", False)}
180-
for s in self.services
181-
],
182-
"event_bus": self.event_bus.get_subscribers_count(),
183-
}
184-
185-
# 添加监控器状态
186-
if self._download_monitor:
187-
status["download_monitor"] = self._download_monitor.get_monitoring_status()
188-
189-
status["monitors"] = {
190-
"download_monitor": bool(self._download_monitor),
191-
"rename_monitor": bool(self._rename_monitor),
192-
"notification_monitor": bool(self._notification_monitor),
193-
}
194-
195-
return status
196-
197179
@asynccontextmanager
198180
async def lifespan(self):
199181
"""生命周期管理器"""
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from .download_monitor import DownloadMonitor,download_monitor
2+
from .notification_monitor import NotificationMonitor
3+
from .rename_monitor import RenameMonitor
4+
5+
__all__ = [
6+
"DownloadMonitor",
7+
"download_monitor",
8+
"NotificationMonitor",
9+
"RenameMonitor",
10+
]
File renamed without changes.

backend/src/module/notification/notification_monitor.py renamed to backend/src/module/core/monitors/notification_monitor.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ async def initialize(self):
2727
if not self.enable:
2828
logger.warning("[NotificationMonitor] 通知功能未启用")
2929
return
30+
self._notification_sender.initialize()
3031
self._running = True
3132
self._event_bus.subscribe(
3233
EventType.NOTIFICATION_REQUEST,

backend/src/module/manager/rename_monitor.py renamed to backend/src/module/core/monitors/rename_monitor.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import logging
33

44
from module.conf import settings
5-
from module.database import Database
65
from module.manager import Renamer
76
from module.models import Bangumi, Torrent
87
from module.utils import event_bus

backend/src/module/core/services.py

Lines changed: 0 additions & 162 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from .base_services import BaseService
2+
from .download_service import DownloadService
3+
from .renamer_service import RenamerService
4+
from .rss_service import RSSService
5+
6+
__all__ = ["BaseService", "DownloadService", "RenamerService", "RSSService"]
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import asyncio
2+
import logging
3+
from abc import ABC, abstractmethod
4+
from typing import TYPE_CHECKING, Any
5+
6+
from typing_extensions import override
7+
8+
from module.conf import settings
9+
from module.utils.events import ServiceException
10+
11+
if TYPE_CHECKING:
12+
from module.rss import RSSEngine
13+
14+
logger = logging.getLogger(__name__)
15+
16+
17+
class BaseService(ABC):
18+
"""服务基类"""
19+
20+
def __init__(self, name: str | None = None):
21+
# 如果没有指定名称,使用类名自动生成
22+
if name is None:
23+
name = self.__class__.__name__.lower().replace("service", "")
24+
self.name = name
25+
self._initialized = False
26+
27+
async def initialize(self) -> None:
28+
"""初始化服务"""
29+
if not self._initialized:
30+
try:
31+
await self._setup()
32+
self._initialized = True
33+
logger.info(f"[{self.name}Service] 初始化完成")
34+
except Exception as e:
35+
logger.error(f"[{self.name}Service] 初始化失败: {e}")
36+
raise ServiceException(self.name, f"初始化失败: {e}")
37+
38+
@abstractmethod
39+
async def _setup(self) -> None:
40+
"""子类实现具体初始化逻辑"""
41+
pass
42+
43+
@abstractmethod
44+
async def execute(self) -> None:
45+
"""执行服务逻辑"""
46+
pass
47+
48+
@abstractmethod
49+
def get_task_config(self) -> dict[str, Any]:
50+
"""获取任务配置"""
51+
pass
52+
53+
async def cleanup(self) -> None:
54+
"""清理资源"""
55+
pass
56+
57+
def is_initialized(self) -> bool:
58+
"""检查是否已初始化"""
59+
return self._initialized

0 commit comments

Comments
 (0)