Skip to content

Commit bdb87ec

Browse files
authored
Merge pull request #74 from shinonomeow/shino_aio
add renamer service and fix disable error on rename
2 parents a96e194 + c5ebda9 commit bdb87ec

13 files changed

Lines changed: 140 additions & 518 deletions

File tree

backend/src/module/core/aiocore.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from typing import Any
55

66
from module.utils.events import event_bus
7+
from module.conf import settings
8+
79
from .task_manager import TaskManager
810

911
logger = logging.getLogger(__name__)
@@ -30,11 +32,13 @@ async def initialize(self) -> None:
3032

3133
try:
3234
# 创建服务实例
33-
from .services import RSSService, DownloadService
35+
from .renamer_service import RenamerService
36+
from .services import DownloadService, RSSService
3437

3538
self.services = [
3639
DownloadService(),
3740
RSSService(),
41+
RenamerService(),
3842
]
3943

4044
# 初始化所有服务
@@ -65,7 +69,6 @@ async def _register_tasks(self) -> None:
6569
name=config["name"],
6670
coro_func=service.execute,
6771
interval=config["interval"],
68-
max_retries=config["max_retries"],
6972
)
7073
logger.debug(f"[AsyncCore] 注册任务: {config['name']}")
7174

@@ -85,14 +88,18 @@ async def _register_event_handlers(self) -> None:
8588
)
8689
logger.info("[AsyncCore] 已注册 DownloadMonitor 事件处理器")
8790

88-
# 创建并注册 RenameMonitor
89-
self._rename_monitor = RenameMonitor(event_bus=self.event_bus)
90-
await self._rename_monitor.initialize()
91-
self.event_bus.subscribe(
92-
EventType.DOWNLOAD_COMPLETED,
93-
self._rename_monitor.handle_download_completed,
94-
)
95-
logger.info("[AsyncCore] 已注册 RenameMonitor 事件处理器")
91+
# 创建并注册 RenameMonitor (仅在启用重命名功能时)
92+
if settings.bangumi_manage.enable:
93+
self._rename_monitor = RenameMonitor(event_bus=self.event_bus)
94+
await self._rename_monitor.initialize()
95+
self.event_bus.subscribe(
96+
EventType.DOWNLOAD_COMPLETED,
97+
self._rename_monitor.handle_download_completed,
98+
)
99+
logger.info("[AsyncCore] 已注册 RenameMonitor 事件处理器")
100+
else:
101+
self._rename_monitor = None
102+
logger.info("[AsyncCore] 重命名功能已禁用,跳过 RenameMonitor 注册")
96103

97104
# 创建并注册 NotificationMonitor
98105
self._notification_monitor = NotificationMonitor(event_bus=self.event_bus)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import logging
2+
from typing import Any
3+
4+
from module.conf import settings
5+
from module.core.services import BaseService
6+
from module.database import Database
7+
from module.manager.renamer import Renamer
8+
from module.utils.events import Event, EventType, event_bus
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
class RenamerService(BaseService):
14+
"""重命名服务 - 检查已下载但未重命名的种子并发布重命名事件"""
15+
16+
def __init__(self):
17+
super().__init__()
18+
self._renamer: Renamer | None = None
19+
20+
async def _setup(self) -> None:
21+
"""初始化重命名器"""
22+
self._renamer = Renamer()
23+
24+
def get_task_config(self) -> dict[str, Any]:
25+
"""获取重命名任务配置"""
26+
return {
27+
"name": "renamer_check",
28+
"interval": 600, # 转换为秒
29+
"enabled": settings.bangumi_manage.enable,
30+
}
31+
32+
async def execute(self) -> None:
33+
"""执行重命名检查任务"""
34+
if not self._renamer:
35+
logger.error("[RenamerService] 重命名器未初始化")
36+
return
37+
38+
try:
39+
# 查询已下载但未重命名的种子
40+
with Database() as db:
41+
unrenamed_torrents = db.torrent.search_downloaded_unrenamed()
42+
43+
if not unrenamed_torrents:
44+
logger.debug("[RenamerService] 没有需要重命名的种子")
45+
return
46+
47+
logger.info(
48+
f"[RenamerService] 发现 {len(unrenamed_torrents)} 个需要重命名的种子"
49+
)
50+
51+
# 为每个种子发布下载完成事件,触发重命名流程
52+
for torrent in unrenamed_torrents:
53+
await self._publish_download_completed_event(torrent)
54+
55+
except Exception as e:
56+
logger.error(f"[RenamerService] 执行失败: {e}")
57+
raise
58+
59+
async def _publish_download_completed_event(self, torrent) -> None:
60+
"""发布下载完成事件
61+
62+
Args:
63+
torrent: 种子信息
64+
"""
65+
try:
66+
# 获取对应的番剧信息
67+
with Database() as db:
68+
bangumi = db.torrent_to_bangumi(torrent)
69+
70+
if not bangumi:
71+
logger.warning(f"[RenamerService] 无法找到种子 {torrent.name} 对应的番剧信息")
72+
return
73+
74+
event = Event(
75+
type=EventType.DOWNLOAD_COMPLETED,
76+
data={
77+
"torrent": torrent,
78+
"bangumi": bangumi,
79+
"download_uid": torrent.download_uid,
80+
"name": torrent.name,
81+
},
82+
)
83+
84+
await event_bus.publish(event)
85+
logger.debug(f"[RenamerService] 已发布重命名事件: {torrent.name}")
86+
87+
except Exception as e:
88+
logger.error(f"[RenamerService] 发布重命名事件失败: {e}")

backend/src/module/database/torrent.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,16 @@ def search_all_downloaded(self) -> list[Torrent]:
7777
).all()
7878
return list(torrents)
7979

80+
def search_downloaded_unrenamed(self) -> list[Torrent]:
81+
"""查询已下载但未重命名的种子"""
82+
torrents = self.session.exec(
83+
select(Torrent).where(
84+
Torrent.downloaded == true(),
85+
Torrent.renamed == false()
86+
)
87+
).all()
88+
return list(torrents)
89+
8090
# def search_rss(self, rss_url: int) -> list[Torrent]:
8191
# """根据RSS url查询所有种子"""
8292
# torrents = self.session.exec(select(Torrent).where(Torrent.rss_link == rss_url)).all()

backend/src/module/downloader/download_monitor.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ async def _publish_download_completed(
181181
data={"torrent": torrent, "bangumi": bangumi},
182182
)
183183

184-
await self._event_bus.publish(event)
184+
asyncio.create_task(self._event_bus.publish(event))
185185
logger.debug(f"[DownloadMonitor] 已发布下载完成事件: {torrent.name}")
186186

187187
except Exception as e:

backend/src/module/downloader/download_queue.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ async def download(self):
4949
for _ in range(min(queue.qsize(), 5)):
5050
torrent, bangumi = queue.get_nowait()
5151

52-
# torrent.bangumi_official_title = bangumi.official_title
53-
# torrent.bangumi_season = bangumi.season
54-
# torrent.rss_link = bangumi.rss_link
5552
queue.task_done()
5653
logging.debug(f"[Download Controller] start download {torrent.name}")
5754
torrents.append(torrent)
@@ -102,7 +99,7 @@ async def _publish_download_started(
10299
data={"torrent": torrent, "bangumi": bangumi},
103100
)
104101

105-
await self._event_bus.publish(event)
102+
asyncio.create_task( self._event_bus.publish(event))
106103
logger.debug(f"[Download Controller] 已发布下载开始事件: {torrent.name}")
107104

108105
except Exception as e:

backend/src/module/manager/rename_monitor.py

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

4+
from module.conf import settings
45
from module.utils.events import Event, EventType, EventBus
56
from module.manager import Renamer
67
from module.models import Bangumi, Torrent
@@ -122,7 +123,7 @@ async def _publish_rename_completed(
122123
data={"torrent": torrent, "bangumi": bangumi},
123124
)
124125

125-
await self._event_bus.publish(event)
126+
asyncio.create_task(self._event_bus.publish(event))
126127
logger.info(f"[RenameMonitor] 已发布重命名完成事件: {torrent.name}")
127128

128129
except Exception as e:

backend/src/module/manager/renamer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ async def _publish_notification_request(self, notify_info: Notification) -> None
200200
data={"notify_info": notify_info},
201201
)
202202

203-
await self._event_bus.publish(event)
203+
asyncio.create_task(self._event_bus.publish(event))
204204
logger.debug(f"[Download Controller] 已发布通知请求事件: {notify_info.title}")
205205

206206
except Exception as e:

backend/src/module/parser/analyser/raw_parser.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ def parse_season(
157157
# 如果是非可信季度信息,返回第一个有效的季度
158158
else:
159159
if len(season_info[0]) ==1 and season_list[0] > 1:
160-
re.sub(p.SEASON_PATTERN_UNTRUSTED,"/[]" , self.title)
160+
self.findall_sub_title(p.SEASON_PATTERN_UNTRUSTED)
161161
return season_list[0], season_info[0]
162162

163163
return 1, ""
@@ -408,9 +408,9 @@ def is_point_5(title: str) -> bool:
408408
# # #
409409
# title = "碧蓝之海 第二季.mp4"
410410
# title = "坂本日常 第2部分"
411-
# title = "[ANi] Grand Blue Dreaming / GRAND BLUE 碧蓝之海 2 - 04 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]"
412-
title = "[Lilith-Raws] Boku no Kokoro no Yabai Yatsu - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT].mp4"
413-
title = "【极影字幕社】★4月新番 天国大魔境 Tengoku Daimakyou 第05话 GB 720P MP4(字幕社招人内详)"
411+
title = "[ANi] Grand Blue Dreaming / GRAND BLUE 碧蓝之海 2 - 04 [1080P][Baha][WEB-DL][AAC AVC][CHT][MP4]"
412+
# title = "[Lilith-Raws] Boku no Kokoro no Yabai Yatsu - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT].mp4"
413+
# title = "【极影字幕社】★4月新番 天国大魔境 Tengoku Daimakyou 第05话 GB 720P MP4(字幕社招人内详)"
414414
res = raw_parser(title)
415415
for k, v in res.__dict__.items():
416416
print(f"{k}: {v}")

backend/src/module/plugin/__init__.py

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)