@@ -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
126123if __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=}")
0 commit comments