Skip to content

Commit aab965c

Browse files
committed
delete bangumi update
1 parent 8554ee9 commit aab965c

12 files changed

Lines changed: 316 additions & 209 deletions

File tree

backend/src/module/core/aiocore.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from contextlib import asynccontextmanager
44
from typing import Any
55

6-
from module.utils.events import EventBus
6+
from module.utils.events import event_bus
77
from .task_manager import TaskManager
88

99
logger = logging.getLogger(__name__)
@@ -17,7 +17,7 @@ class AsyncApplicationCore:
1717

1818
def __init__(self):
1919
self.task_manager = TaskManager()
20-
self.event_bus = EventBus()
20+
self.event_bus = event_bus
2121
self.services = []
2222
self._download_monitor = None
2323
self._rename_monitor = None

backend/src/module/database/combine.py

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from module.models.rss import RSSItem
55
from module.models.torrent import Torrent
66

7-
from .bangumi import BangumiDatabase
8-
from .engine import engine as e
9-
from .rss import RSSDatabase
10-
from .torrent import TorrentDatabase
11-
from .user import UserDatabase
7+
from module.database.bangumi import BangumiDatabase
8+
from module.database.engine import engine as e
9+
from module.database.rss import RSSDatabase
10+
from module.database.torrent import TorrentDatabase
11+
from module.database.user import UserDatabase
1212

1313

1414
class Database(Session):
@@ -27,6 +27,17 @@ def __init__(self, engine=e):
2727
def bangumi_to_rss(self, bangumi: Bangumi) -> RSSItem | None:
2828
return self.rss.search_url(bangumi.rss_link)
2929

30+
def add_bangumi(self, bangumi: Bangumi):
31+
pass
32+
33+
def find_torrent_by_bangumi(self, bangumi: Bangumi) -> list[Torrent]:
34+
"""根据 Bangumi 查找相关的 Torrent"""
35+
"依据 official_title, seasion, rss_link"
36+
return self.torrent.filter_by_bangumi(bangumi.official_title, bangumi.season, bangumi.rss_link)
37+
38+
def find_bangumi_by_torrent(self, torrent: Torrent) -> Bangumi | None:
39+
pass
40+
3041
def create_table(self):
3142
SQLModel.metadata.create_all(self.engine)
3243

@@ -202,3 +213,12 @@ def migrate(self):
202213

203214
self.commit()
204215
print("数据库迁移完成!")
216+
217+
if __name__ == "__main__":
218+
url = "https://mikanani.me/Download/20250531/fb338d0c51c01c2494a9fb1642dd97769416b5c2.torrent"
219+
with Database() as db:
220+
torrent = db.torrent.search_by_url(url)
221+
if torrent:
222+
print(type(torrent))
223+
else:
224+
print("未找到种子")

backend/src/module/database/rss.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class RSSDatabase:
1313
rss 的主码是 rss_link, id
1414
现在是 rss 的 id 变动时, bangumi 和 torrent 的 rss_id 也要变动
1515
"""
16+
1617
def __init__(self, session: Session):
1718
self.session = session
1819

@@ -110,6 +111,7 @@ def delete_all(self):
110111
self.session.exec(condition)
111112
self.session.commit()
112113

114+
113115
if __name__ == "__main__":
114116
from module.database import Database
115117

backend/src/module/database/torrent.py

Lines changed: 66 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -14,30 +14,14 @@ def __init__(self, session: Session):
1414
self.session = session
1515

1616
def add(self, data: Torrent):
17-
# 找一下是否已经存在相同的种子
18-
existing_torrent = self.session.query(Torrent).filter_by(url=data.url).first()
19-
# 有的话就更新一下
20-
if existing_torrent:
21-
data.id = existing_torrent.id
22-
ins = self.session.merge(data)
17+
self.session.merge(data)
2318
self.session.commit()
24-
self.session.refresh(ins) # 刷新对象以获取最新的数据库状态
25-
data.id = ins.id # 确保 data.id 被更新为数据库中的 ID
26-
logger.debug(f"[TorrentDatabase] {ins.id=}, {ins.name=}, {ins.url=}")
27-
logger.debug(f"[TorrentDatabase] Insert {data.name=} {data.id=} in database.")
28-
logger.debug(f"Insert {data.name} in database.")
19+
logger.debug(f"[TorrentDatabase] Insert {data.name=} {data.url=} in database.")
2920

3021
def add_all(self, datas: list[Torrent]):
31-
unique_torrent = [
32-
data
33-
for data in datas
34-
if not self.session.query(Torrent).filter_by(url=data.url).first()
35-
]
36-
self.session.add_all(unique_torrent)
22+
for data in datas:
23+
self.session.merge(data)
3724
self.session.commit()
38-
# 对所有的 Torrent 对象进行刷新
39-
for data in unique_torrent:
40-
self.session.refresh(data)
4125
logger.debug(f"Insert {len(datas)} torrents in database.")
4226

4327
def update(self, data: Torrent):
@@ -48,79 +32,92 @@ def update(self, data: Torrent):
4832
logger.debug(f"[TorrentDatabase] Update {data.name} in database success.")
4933
logger.debug(f"Update {data.name} in database.")
5034

51-
def update_all(self, datas: list[Torrent]):
52-
self.session.add_all(datas)
53-
self.session.commit()
54-
55-
def update_one_user(self, data: Torrent):
56-
self.session.add(data)
57-
self.session.commit()
58-
self.session.refresh(data)
59-
logger.debug(f"Update {data.name} in database.")
60-
61-
def search(self, _id: int) -> Torrent:
62-
return self.session.exec(select(Torrent).where(Torrent.id == _id)).first()
63-
64-
def search_hash(self, _hash: str) -> Torrent | None:
65-
statement = select(Torrent).where(func.instr(Torrent.url, _hash) > 0)
35+
# def update_all(self, datas: list[Torrent]):
36+
# self.session.add_all(datas)
37+
# self.session.commit()
38+
#
39+
# def update_one_user(self, data: Torrent):
40+
# self.session.add(data)
41+
# self.session.commit()
42+
# self.session.refresh(data)
43+
# logger.debug(f"Update {data.name} in database.")
44+
#
45+
def filter_by_bangumi(self, official_title: str, season: int, rss_link: str) -> list[Torrent]:
46+
"""根据 Bangumi 的官方标题、季节和 RSS 链接过滤种子"""
47+
statement = select(Torrent).where(
48+
Torrent.official_title == official_title,
49+
Torrent.season == season,
50+
Torrent.rss_link == rss_link,
51+
)
52+
return list(self.session.exec(statement).all())
53+
54+
def search_by_url(self, url: str) -> Torrent | None:
55+
return self.session.get(Torrent, ident=url)
56+
# return self.session.exec(select(Torrent).where(Torrent.url == url)).first()
57+
58+
def search_by_duid(self, duid: str) -> Torrent | None:
59+
statement = select(Torrent).where(Torrent.download_guid == duid)
6660
return self.session.exec(statement).first()
6761

68-
def search_torrent(self, _hash):
69-
# 之前由于 hash 可能不一致, 所以需要搜索 name
70-
# 现在会更新种子的 hash,所以只需要搜索 hash 即可
71-
if plain_hash := get_hash(_hash):
72-
logger.debug(f"[TorrentDatabase] search_torrent {plain_hash}")
73-
_hash = plain_hash
74-
75-
torrent_item = self.search_hash(_hash)
76-
logger.debug(f"[TorrentDatabase] search_torrent result {torrent_item}")
77-
# if not torrent_item and _name:
78-
# torrent_item = self.search_name(_name)
79-
return torrent_item
80-
81-
# def search_name(self, name: str):
82-
# statement = select(Torrent).where(Torrent.name == name)
83-
# return self.session.exec(statement).first()
84-
8562
def search_bangumi(self, bangumi_id: int):
8663
return self.session.exec(
8764
select(Torrent).where(Torrent.bangumi_id == bangumi_id)
8865
).all()
8966

9067
def search_all(self) -> list[Torrent]:
91-
return self.session.exec(select(Torrent)).all()
68+
return list(self.session.exec(select(Torrent)).all())
9269

9370
def search_all_unrenamed(self) -> list[Torrent]:
94-
return list(self.session.exec( select(Torrent).where(Torrent.renamed == false())).all())
71+
return list(
72+
self.session.exec(select(Torrent).where(Torrent.renamed == false())).all()
73+
)
9574

9675
def search_all_downloaded(self) -> list[Torrent]:
97-
return self.session.exec( select(Torrent).where(Torrent.downloaded == true())).all()
76+
torrents = self.session.exec(
77+
select(Torrent).where(Torrent.downloaded == true())
78+
).all()
79+
return list(torrents)
9880

99-
def search_rss(self, rss_id: int) -> list[Torrent]:
100-
return self.session.exec(select(Torrent).where(Torrent.rss_id == rss_id)).all()
81+
# def search_rss(self, rss_url: int) -> list[Torrent]:
82+
# """根据RSS url查询所有种子"""
83+
# torrents = self.session.exec(select(Torrent).where(Torrent.rss_link == rss_url)).all()
84+
# return list(torrents)
10185

10286
def check_new(self, torrents_list: list[Torrent]) -> list[Torrent]:
10387
new_torrents = []
10488
for torrent in torrents_list:
105-
torrent_item = self.search_torrent(torrent.url)
89+
torrent_item = self.search_by_url(torrent.url)
10690
if not torrent_item or not torrent_item.downloaded:
10791
new_torrents.append(torrent)
10892
return new_torrents
10993

110-
def delete(self, _id: int) -> bool:
94+
def delete_by_url(self, url: str) -> bool:
11195
# 思考什么时候删除种子
11296
# 1. 当bangumi已经删除时, 如果删除,会在重命名的时候再次添加
11397
# 2. 当种子也删除时, 不会再次添加
11498
# 3. bangumi 删除有几种情况: 1. 有一个全清, 会刷新一次 2. 用户自已删除, 如果是聚合的, 会在下次
11599
# 刷新时再次添加, 如果是单独的, 会连着rss 一起删除
116-
condition = delete(Torrent).where(Torrent.id == _id)
117-
try:
118-
self.session.exec(condition)
100+
stmt = select(Torrent).where(Torrent.url == url)
101+
torrent_item = self.session.exec(stmt).first()
102+
if torrent_item:
103+
self.session.delete(torrent_item)
104+
logger.debug(
105+
f"[TorrentDatabase] Delete torrent {torrent_item.name} by url: {url}."
106+
)
107+
self.session.commit()
108+
return True
109+
110+
def delete_by_duid(self, duid: str) -> bool:
111+
stmt = select(Torrent).where(Torrent.download_guid == duid)
112+
torrent_item = self.session.exec(stmt).first()
113+
if torrent_item:
114+
self.session.delete(torrent_item)
115+
logger.debug(
116+
f"[TorrentDatabase] Delete torrent {torrent_item.name} by duid: {duid}."
117+
)
119118
self.session.commit()
120119
return True
121-
except Exception as e:
122-
logger.error(f"Delete RSS Item failed. Because: {e}")
123-
return False
120+
return False
124121

125122

126123
if __name__ == "__main__":
@@ -130,8 +127,9 @@ def delete(self, _id: int) -> bool:
130127
name = "[ANi] 物语系列 第外季&第怪季 - 06 [1080P][Baha][WEB-DL][AAC AVC][CHT].mp4"
131128
hash = "1ae27b047005e097b74b66e27c37610aa5a0f5a2"
132129
with Database() as db:
133-
t_name = db.torrent.search_name(name)
134-
t_hash = db.torrent.search_hash(hash)
135-
db.torrent.delete(t_hash.id)
130+
# t_name = db.torrent.search_name(name)
131+
t_hash = db.torrent.search_by_duid(hash)
132+
if t_hash:
133+
db.torrent.delete_by_url(t_hash.url)
136134
# print(f"{t_name=}")
137135
# print(f"{t_hash=}")

backend/src/module/downloader/download_monitor.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,7 @@ async def monitor_torrent(
114114
# 从数据库删除对应的torrent记录
115115
try:
116116
with Database() as db:
117-
if torrent_item := db.torrent.search_hash(torrent_hash):
118-
db.torrent.delete(torrent_item.id)
117+
db.torrent.delete_by_url(torrent.url)
119118
logger.info(f"[DownloadMonitor] 已从数据库删除种子记录: {torrent.name}")
120119
except Exception as e:
121120
logger.error(f"[DownloadMonitor] 删除数据库记录失败: {e}")
@@ -126,7 +125,7 @@ async def monitor_torrent(
126125
logger.debug(f"[DownloadMonitor] 种子 {torrent.name} 下载状态: 未下载")
127126
try:
128127
with Database() as db:
129-
if torrent_item := db.torrent.search_hash(torrent_hash):
128+
if torrent_item := db.torrent.search_by_duid(torrent_hash):
130129
if not torrent_item.downloaded:
131130
torrent_item.downloaded = True
132131
db.torrent.add(torrent_item)

backend/src/module/downloader/download_queue.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ async def download(self):
5959
for torrent in torrents:
6060
database.torrent.add(torrent)
6161
logger.debug(
62-
f"[Download Controller] Torrent {torrent.name} {torrent.id=} 已保存到数据库"
62+
f"[Download Controller] Torrent {torrent.name} {torrent.url=} 已保存到数据库"
6363
)
6464
for i, result in enumerate(results):
6565
torrent, bangumi = torrent_bangumi_pairs[i]

0 commit comments

Comments
 (0)