Skip to content

Commit 601d6e1

Browse files
committed
fix: 新版m-team下载
1 parent 4ac3eca commit 601d6e1

File tree

7 files changed

+135
-25
lines changed

7 files changed

+135
-25
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
# NAS媒体库管理工具
22

3-
### 项目
4-
Forked from [NAStool/nas-tools](https://github.com/NAStool/nas-tools)
5-
项目详情以及使用方式请移步原项目。
6-
73
### 新增
84
- 支持 Jackett 和 Prowlarr 索引器
95
- 支持 Aria2 下载器
6+
- 支持新版馒头刷流和下载,需要添加cookie
107

118

129
### Docker 镜像地址:

app/helper/site_helper.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def is_logged_in(cls, html_text):
2121
"""
2222
if JsonUtils.is_valid_json(html_text):
2323
json_data = json.loads(html_text)
24-
if 'message' in json_data and json_data['message'] == 'SUCCESS':
24+
if json_data.get('message') == 'SUCCESS':
2525
return True
2626
else:
2727
return False

app/indexer/client/_mteam.py

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import re
2+
import json
3+
4+
import log
5+
from app.utils import RequestUtils, StringUtils
6+
from config import Config
7+
8+
9+
class MteamSpider(object):
10+
_indexerid = None
11+
_domain = None
12+
_name = ""
13+
_proxy = None
14+
_cookie = None
15+
_ua = None
16+
_size = 100
17+
_searchurl = "%sapi/torrent/search"
18+
_downloadurl = "%sapi/torrent/genDlToken"
19+
_pageurl = "%sdetail/%s"
20+
21+
def __init__(self, indexer):
22+
if indexer:
23+
self._indexerid = indexer.id
24+
self._domain = indexer.domain
25+
self._searchurl = self._searchurl % self._domain
26+
self._downloadurl = self._downloadurl % self._domain
27+
self._name = indexer.name
28+
if indexer.proxy:
29+
self._proxy = Config().get_proxies()
30+
self._cookie = indexer.cookie
31+
self._ua = indexer.ua
32+
self.init_config()
33+
34+
def init_config(self):
35+
self._size = Config().get_config('pt').get('site_search_result_num') or 100
36+
37+
def __get_torrent_url(self, mid):
38+
if not self._domain:
39+
return
40+
41+
res = RequestUtils(headers=self._ua,
42+
cookies=self._cookie,
43+
proxies=self._proxy,
44+
timeout=15).post_res(url=self._downloadurl, data={'id': mid})
45+
if res and res.status_code == 200:
46+
return res.json().get('data', '')
47+
else:
48+
return
49+
50+
def search(self, keyword="", page=0):
51+
params = {
52+
"mode": "normal",
53+
"categories": [],
54+
"visible": 1,
55+
"keyword": keyword,
56+
"pageNumber": int(page) + 1,
57+
"pageSize": self._size
58+
}
59+
60+
params = json.dumps(params, separators=(',', ':'))
61+
res = RequestUtils(
62+
headers={
63+
"Content-Type": "application/json; charset=utf-8",
64+
"User-Agent": f"{self._ua}"
65+
},
66+
cookies=self._cookie,
67+
proxies=self._proxy,
68+
timeout=30
69+
).post_res(url=self._searchurl, data=params)
70+
torrents = []
71+
if res and res.status_code == 200:
72+
results = res.json().get('data', {}).get("data") or []
73+
for result in results:
74+
imdbid = (re.findall(r'tt\d+', result.get('imdb')) or [''])[0]
75+
enclosure = self.__get_torrent_url(result.get('id'))
76+
torrent = {
77+
'indexer': self._indexerid,
78+
'title': result.get('name'),
79+
'description': result.get('smallDescr'),
80+
'enclosure': enclosure,
81+
'pubdate': result.get('createdDate'),
82+
'size': result.get('size'),
83+
'seeders': result.get('status').get('seeders'),
84+
'peers': result.get('status').get('leechers'),
85+
'grabs': result.get('status').get('timesCompleted'),
86+
'downloadvolumefactor': 0.0,
87+
'uploadvolumefactor': 1.0,
88+
'page_url': self._pageurl % (self._domain, result.get('id')),
89+
'imdbid': imdbid
90+
}
91+
torrents.append(torrent)
92+
elif res is not None:
93+
log.warn(f"【INDEXER】{self._name} 搜索失败,错误码:{res.status_code}")
94+
return True, []
95+
else:
96+
log.warn(f"【INDEXER】{self._name} 搜索失败,无法连接 {self._domain}")
97+
return True, []
98+
return False, torrents

app/indexer/client/_rarbg.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import requests
2+
import re
23

34
import log
45
from app.utils import RequestUtils

app/indexer/client/builtin.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from app.indexer.client._spider import TorrentSpider
1212
from app.indexer.client._tnode import TNodeSpider
1313
from app.indexer.client._torrentleech import TorrentLeech
14+
from app.indexer.client._mteam import MteamSpider
1415
from app.sites import Sites
1516
from app.utils import StringUtils
1617
from app.utils.types import SearchType, IndexerType, ProgressKey, SystemConfigKey
@@ -160,6 +161,8 @@ def search(self, order_seq,
160161
mtype=match_media.type if match_media and match_media.tmdb_info else None)
161162
elif indexer.parser == "TorrentLeech":
162163
error_flag, result_array = TorrentLeech(indexer).search(keyword=search_word)
164+
elif indexer.parser == "MteamSpider":
165+
error_flag, result_array = MteamSpider(indexer).search(keyword=search_word)
163166
else:
164167
error_flag, result_array = self.__spider_search(
165168
keyword=search_word,
@@ -219,6 +222,9 @@ def list(self, index_id, page=0, keyword=None):
219222
elif indexer.parser == "TorrentLeech":
220223
error_flag, result_array = TorrentLeech(indexer).search(keyword=keyword,
221224
page=page)
225+
elif indexer.parser == "MteamSpider":
226+
error_flag, result_array = MteamSpider(indexer).search(keyword=keyword,
227+
page=page)
222228
else:
223229
error_flag, result_array = self.__spider_search(indexer=indexer,
224230
page=page,

app/sites/siteuserinfo/mteam.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from urllib.parse import urljoin
66

77
from app.sites.siteuserinfo._base import _ISiteUserInfo, SITE_BASE_ORDER
8-
from app.utils import RequestUtils
8+
from app.utils import RequestUtils, JsonUtils
99
from app.utils.types import SiteSchema
1010
from config import Config
1111

@@ -36,7 +36,6 @@ def parse(self):
3636
self._parse_seeding_pages()
3737
self.seeding_info = json.dumps(self.seeding_info)
3838

39-
4039
def _parse_favicon(self, html_text):
4140
"""
4241
解析站点favicon,返回base64 fav图标
@@ -51,14 +50,17 @@ def _parse_favicon(self, html_text):
5150
self.site_favicon = base64.b64encode(res.content).decode()
5251

5352
def _parse_user_base_info(self, html_text):
53+
if not JsonUtils.is_valid_json(html_text):
54+
return
55+
5456
json_data = json.loads(html_text)
5557

5658
user_profile = self._get_page_content(self._base_url + '/api/member/profile', params={})
5759
user_profile = json.loads(user_profile)
58-
if user_profile['message'] == 'SUCCESS' and json_data['data'] is not None:
59-
userid = user_profile['data']['id']
60-
self.username = json_data['data']['username']
61-
self.bonus = json_data['data']['memberCount']['bonus']
60+
if user_profile.get('message') == 'SUCCESS' and json_data.get('data') is not None:
61+
userid = user_profile.get('data').get('id') or ''
62+
self.username = json_data.get('data').get('username') or ''
63+
self.bonus = json_data.get('data').get('memberCount').get('bonus') or ''
6264
self._torrent_seeding_page = '/api/member/getUserTorrentList'
6365
self._torrent_seeding_params = {"userid": userid, "type": "SEEDING", "pageNumber": 1, "pageSize": 25}
6466

@@ -82,37 +84,43 @@ def _parse_user_detail_info(self, html_text):
8284
'8': '總督/Ultimate User',
8385
'9': '大臣/mTorrent Master'
8486
}
87+
if not JsonUtils.is_valid_json(html_text):
88+
return
8589
json_data = json.loads(html_text)
86-
if json_data['data'] is not None:
90+
if json_data.get('data') is not None:
8791
# 用户等级
88-
role = json_data['data']['role']
92+
role = json_data.get('data').get('role') or ''
8993
self.user_level = role_dict.get(role, '其他')
9094

9195
# 加入日期
92-
self.join_at = json_data['data']['createdDate']
96+
self.join_at = json_data.get('data').get('createdDate')
9397

9498
def _parse_user_traffic_info(self, html_text):
9599
json_data = json.loads(html_text)
96-
if json_data['data'] is not None:
97-
self.upload = int(json_data['data']['memberCount']['uploaded'])
100+
if json_data.get('data') is not None:
101+
self.upload = int(json_data.get('data').get('memberCount').get('uploaded'))
98102

99-
self.download = int(json_data['data']['memberCount']['downloaded'])
103+
self.download = int(json_data.get('data').get('memberCount').get('downloaded'))
100104

101-
self.ratio = json_data['data']['memberCount']['shareRate']
105+
self.ratio = json_data.get('data').get('memberCount').get('shareRate')
102106

103107
def _parse_user_torrent_seeding_info(self, html_text, multi_page=False):
108+
109+
if not JsonUtils.is_valid_json(html_text):
110+
return None
111+
104112
json_data = json.loads(html_text)
105113

106114
page_seeding = 0
107115
page_seeding_size = 0
108116
page_seeding_info = []
109117
next_page = None
110118

111-
if json_data['data'] is not None:
112-
page_seeding = len(json_data['data']['data'])
113-
for data in json_data['data']['data']:
114-
size = int(data['torrent']['size'])
115-
seeders = data['torrent']['status']['seeders']
119+
if json_data.get('data') is not None:
120+
page_seeding = len(json_data.get('data').get('data'))
121+
for data in json_data.get('data').get('data'):
122+
size = int(data.get('torrent').get('size'))
123+
seeders = data.get('torrent').get('status').get('seeders')
116124

117125
page_seeding_size += size
118126
page_seeding_info.append([seeders, size])
@@ -121,8 +129,8 @@ def _parse_user_torrent_seeding_info(self, html_text, multi_page=False):
121129
self.seeding_size += page_seeding_size
122130
self.seeding_info.extend(page_seeding_info)
123131

124-
page_num = int(json_data['data']['pageNumber'])
125-
total_pages = int(json_data['data']['totalPages'])
132+
page_num = int(json_data.get('data').get('pageNumber'))
133+
total_pages = int(json_data.get('data').get('totalPages'))
126134

127135
next_page = page_num + 1
128136
self._torrent_seeding_params['pageNumber'] = next_page

config/sites.dat

16 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)