支持 YemaPT

This commit is contained in:
jxxghp 2024-05-20 16:55:36 +08:00
parent 0d2a4c50d6
commit ffac57ad4d
5 changed files with 169 additions and 1 deletions

View File

@ -55,6 +55,7 @@ class SiteChain(ChainBase):
"ptlsp.com": self.__indexphp_test, "ptlsp.com": self.__indexphp_test,
"1ptba.com": self.__indexphp_test, "1ptba.com": self.__indexphp_test,
"star-space.net": self.__indexphp_test, "star-space.net": self.__indexphp_test,
"yemapt.org": self.__yema_test,
} }
def is_special_site(self, domain: str) -> bool: def is_special_site(self, domain: str) -> bool:
@ -133,6 +134,30 @@ class SiteChain(ChainBase):
return True, f"连接成功,但更新状态失败" return True, f"连接成功,但更新状态失败"
return False, "鉴权已过期或无效" return False, "鉴权已过期或无效"
@staticmethod
def __yema_test(site: Site) -> Tuple[bool, str]:
"""
判断站点是否已经登陆yemapt
"""
user_agent = site.ua or settings.USER_AGENT
url = f"{site.url}api/consumer/fetchSelfDetail"
headers = {
"User-Agent": user_agent,
"Content-Type": "application/json",
"Accept": "application/json, text/plain, */*",
}
res = RequestUtils(
headers=headers,
cookies=site.cookie,
proxies=settings.PROXY if site.proxy else None,
timeout=site.timeout or 15
).get_res(url=url)
if res and res.status_code == 200:
user_info = res.json()
if user_info and user_info.get("success"):
return True, "连接成功"
return False, "Cookie已过期"
def __indexphp_test(self, site: Site) -> Tuple[bool, str]: def __indexphp_test(self, site: Site) -> Tuple[bool, str]:
""" """
判断站点是否已经登陆ptlsp/1ptba 判断站点是否已经登陆ptlsp/1ptba

View File

@ -13,6 +13,7 @@ from app.modules.indexer.mtorrent import MTorrentSpider
from app.modules.indexer.spider import TorrentSpider from app.modules.indexer.spider import TorrentSpider
from app.modules.indexer.tnode import TNodeSpider from app.modules.indexer.tnode import TNodeSpider
from app.modules.indexer.torrentleech import TorrentLeech from app.modules.indexer.torrentleech import TorrentLeech
from app.modules.indexer.yema import YemaSpider
from app.schemas.types import MediaType from app.schemas.types import MediaType
from app.utils.string import StringUtils from app.utils.string import StringUtils
@ -111,6 +112,12 @@ class IndexerModule(_ModuleBase):
mtype=mtype, mtype=mtype,
page=page page=page
) )
elif site.get('parser') == "Yema":
error_flag, result = YemaSpider(site).search(
keyword=search_word,
mtype=mtype,
page=page
)
else: else:
error_flag, result = self.__spider_search( error_flag, result = self.__spider_search(
search_word=search_word, search_word=search_word,

View File

@ -15,7 +15,7 @@ from app.utils.string import StringUtils
class MTorrentSpider: class MTorrentSpider:
""" """
mTorrent API需要缓存ApiKey mTorrent API
""" """
_indexerid = None _indexerid = None
_domain = None _domain = None

132
app/modules/indexer/yema.py Normal file
View File

@ -0,0 +1,132 @@
from typing import Tuple, List
from ruamel.yaml import CommentedMap
from app.core.config import settings
from app.db.systemconfig_oper import SystemConfigOper
from app.log import logger
from app.schemas import MediaType
from app.utils.http import RequestUtils
from app.utils.string import StringUtils
class YemaSpider:
"""
YemaPT API
"""
_indexerid = None
_domain = None
_name = ""
_proxy = None
_cookie = None
_ua = None
_size = 40
_searchurl = "%sapi/torrent/fetchCategoryOpenTorrentList"
_downloadurl = "%sapi/torrent/download?id=%s"
_pageurl = "%s#/torrent/detail/%s/"
_timeout = 15
# 分类
_movie_category = 4
_tv_category = 5
def __init__(self, indexer: CommentedMap):
self.systemconfig = SystemConfigOper()
if indexer:
self._indexerid = indexer.get('id')
self._domain = indexer.get('domain')
self._searchurl = self._searchurl % self._domain
self._name = indexer.get('name')
if indexer.get('proxy'):
self._proxy = settings.PROXY
self._cookie = indexer.get('cookie')
self._ua = indexer.get('ua')
self._timeout = indexer.get('timeout') or 15
def search(self, keyword: str, mtype: MediaType = None, page: int = 0) -> Tuple[bool, List[dict]]:
"""
搜索
"""
if not mtype:
categoryId = self._movie_category
elif mtype == MediaType.TV:
categoryId = self._tv_category
else:
categoryId = self._movie_category
params = {
"categoryId": categoryId,
"pageParam": {
"current": page + 1,
"pageSize": self._size,
"total": self._size
},
"sorter": {}
}
if keyword:
params.update({
"keyword": keyword,
})
res = RequestUtils(
headers={
"Content-Type": "application/json",
"User-Agent": f"{self._ua}",
"Accept": "application/json, text/plain, */*"
},
cookies=self._cookie,
proxies=self._proxy,
referer=f"{self._domain}",
timeout=self._timeout
).post_res(url=self._searchurl, json=params)
torrents = []
if res and res.status_code == 200:
results = res.json().get('data', []) or []
for result in results:
category_value = result.get('categoryId')
if category_value == self._tv_category:
category = MediaType.TV.value
elif category_value == self._movie_category:
category = MediaType.MOVIE.value
else:
category = MediaType.UNKNOWN.value
torrent = {
'title': result.get('showName'),
'description': result.get('shortDesc'),
'enclosure': self.__get_download_url(result.get('id')),
'pubdate': StringUtils.unify_datetime_str(result.get('gmtCreate')),
'size': result.get('fileSize'),
'seeders': result.get('seedNum'),
'peers': result.get('leechNum'),
'grabs': result.get('completedNum'),
'downloadvolumefactor': self.__get_downloadvolumefactor(result.get('downloadPromotion')),
'uploadvolumefactor': 1.0,
'freedate': StringUtils.unify_datetime_str(result.get('downloadPromotionEndTime')),
'page_url': self._pageurl % (self._domain, result.get('id')),
'labels': [],
'category': category
}
torrents.append(torrent)
elif res is not None:
logger.warn(f"{self._name} 搜索失败,错误码:{res.status_code}")
return True, []
else:
logger.warn(f"{self._name} 搜索失败,无法连接 {self._domain}")
return True, []
return False, torrents
@staticmethod
def __get_downloadvolumefactor(discount: str) -> float:
"""
获取下载系数
"""
discount_dict = {
"free": 0
}
if discount:
return discount_dict.get(discount, 1)
return 1
def __get_download_url(self, torrent_id: str) -> str:
"""
获取下载链接
"""
return self._downloadurl % (self._domain, torrent_id)

View File

@ -58,6 +58,7 @@ class RequestUtils:
verify=False, verify=False,
headers=self._headers, headers=self._headers,
proxies=self._proxies, proxies=self._proxies,
cookies=self._cookies,
timeout=self._timeout, timeout=self._timeout,
json=json, json=json,
stream=False) stream=False)
@ -67,6 +68,7 @@ class RequestUtils:
verify=False, verify=False,
headers=self._headers, headers=self._headers,
proxies=self._proxies, proxies=self._proxies,
cookies=self._cookies,
timeout=self._timeout, timeout=self._timeout,
json=json, json=json,
stream=False) stream=False)
@ -80,6 +82,7 @@ class RequestUtils:
verify=False, verify=False,
headers=self._headers, headers=self._headers,
proxies=self._proxies, proxies=self._proxies,
cookies=self._cookies,
timeout=self._timeout, timeout=self._timeout,
params=params) params=params)
else: else:
@ -87,6 +90,7 @@ class RequestUtils:
verify=False, verify=False,
headers=self._headers, headers=self._headers,
proxies=self._proxies, proxies=self._proxies,
cookies=self._cookies,
timeout=self._timeout, timeout=self._timeout,
params=params) params=params)
return str(r.content, 'utf-8') return str(r.content, 'utf-8')