remove bendcode
This commit is contained in:
@ -37,7 +37,6 @@ WORKDIR ${WORKDIR}
|
|||||||
COPY . .
|
COPY . .
|
||||||
RUN apt-get update \
|
RUN apt-get update \
|
||||||
&& apt-get -y install musl-dev \
|
&& apt-get -y install musl-dev \
|
||||||
&& pip install cython \
|
|
||||||
&& pip install -r requirements.txt \
|
&& pip install -r requirements.txt \
|
||||||
&& python_ver=$(python3 -V | awk '{print $2}') \
|
&& python_ver=$(python3 -V | awk '{print $2}') \
|
||||||
&& echo "${WORKDIR}/" > /usr/local/lib/python${python_ver%.*}/site-packages/app.pth \
|
&& echo "${WORKDIR}/" > /usr/local/lib/python${python_ver%.*}/site-packages/app.pth \
|
||||||
|
@ -213,7 +213,7 @@ class CommonChain(ChainBase):
|
|||||||
download_id = __download(_context=context, _torrent_file=torrent_path)
|
download_id = __download(_context=context, _torrent_file=torrent_path)
|
||||||
else:
|
else:
|
||||||
logger.info(
|
logger.info(
|
||||||
f"【Downloader】种子 {meta.org_string} 未含集数信息,解析文件数为 {len(torrent_episodes)}")
|
f"种子 {meta.org_string} 未含集数信息,解析文件数为 {len(torrent_episodes)}")
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
download_id = __download(context)
|
download_id = __download(context)
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import re
|
import re
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Tuple, Optional, List
|
from typing import Tuple, Optional, List, Union
|
||||||
from urllib.parse import unquote
|
from urllib.parse import unquote
|
||||||
|
|
||||||
from bencode import bdecode
|
from torrentool.api import Torrent
|
||||||
|
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.core.context import Context
|
from app.core.context import Context
|
||||||
@ -24,13 +24,14 @@ class TorrentHelper:
|
|||||||
ua: str = None,
|
ua: str = None,
|
||||||
referer: str = None,
|
referer: str = None,
|
||||||
proxy: bool = False) \
|
proxy: bool = False) \
|
||||||
-> Tuple[Optional[Path], Optional[bytes], Optional[str], Optional[list], Optional[str]]:
|
-> Tuple[Optional[Path], Optional[Union[str, bytes]], Optional[str], Optional[list], Optional[str]]:
|
||||||
"""
|
"""
|
||||||
把种子下载到本地
|
把种子下载到本地
|
||||||
:return: 种子保存路径、种子内容、种子主目录、种子文件清单、错误信息
|
:return: 种子保存路径、种子内容、种子主目录、种子文件清单、错误信息
|
||||||
"""
|
"""
|
||||||
if url.startswith("magnet:"):
|
if url.startswith("magnet:"):
|
||||||
return None, None, "", [], f"{url} 为磁力链接"
|
return None, url, "", [], f"{url} 为磁力链接"
|
||||||
|
# 请求种子文件
|
||||||
req = RequestUtils(
|
req = RequestUtils(
|
||||||
ua=ua,
|
ua=ua,
|
||||||
cookies=cookie,
|
cookies=cookie,
|
||||||
@ -40,7 +41,7 @@ class TorrentHelper:
|
|||||||
while req and req.status_code in [301, 302]:
|
while req and req.status_code in [301, 302]:
|
||||||
url = req.headers['Location']
|
url = req.headers['Location']
|
||||||
if url and url.startswith("magnet:"):
|
if url and url.startswith("magnet:"):
|
||||||
return None, None, "", [], f"获取到磁力链接:{url}"
|
return None, url, "", [], f"获取到磁力链接:{url}"
|
||||||
req = RequestUtils(
|
req = RequestUtils(
|
||||||
ua=ua,
|
ua=ua,
|
||||||
cookies=cookie,
|
cookies=cookie,
|
||||||
@ -50,10 +51,14 @@ class TorrentHelper:
|
|||||||
if req and req.status_code == 200:
|
if req and req.status_code == 200:
|
||||||
if not req.content:
|
if not req.content:
|
||||||
return None, None, "", [], "未下载到种子数据"
|
return None, None, "", [], "未下载到种子数据"
|
||||||
|
# 读取种子文件名
|
||||||
|
file_name = self.__get_url_torrent_filename(req, url)
|
||||||
|
# 种子文件路径
|
||||||
|
file_path = Path(settings.TEMP_PATH) / file_name
|
||||||
# 解析内容格式
|
# 解析内容格式
|
||||||
if req.text and str(req.text).startswith("magnet:"):
|
if req.text and str(req.text).startswith("magnet:"):
|
||||||
# 磁力链接
|
# 磁力链接
|
||||||
return None, None, "", [], f"获取到磁力链接:{req.text}"
|
return None, req.text, "", [], f"获取到磁力链接:{req.text}"
|
||||||
elif req.text and "下载种子文件" in req.text:
|
elif req.text and "下载种子文件" in req.text:
|
||||||
# 首次下载提示页面
|
# 首次下载提示页面
|
||||||
skip_flag = False
|
skip_flag = False
|
||||||
@ -79,7 +84,7 @@ class TorrentHelper:
|
|||||||
).post_res(url=action, data=data)
|
).post_res(url=action, data=data)
|
||||||
if req and req.status_code == 200:
|
if req and req.status_code == 200:
|
||||||
# 检查是不是种子文件,如果不是抛出异常
|
# 检查是不是种子文件,如果不是抛出异常
|
||||||
bdecode(req.content)
|
Torrent.from_string(req.content)
|
||||||
# 跳过成功
|
# 跳过成功
|
||||||
logger.info(f"触发了站点首次种子下载,已自动跳过:{url}")
|
logger.info(f"触发了站点首次种子下载,已自动跳过:{url}")
|
||||||
skip_flag = True
|
skip_flag = True
|
||||||
@ -89,59 +94,40 @@ class TorrentHelper:
|
|||||||
else:
|
else:
|
||||||
logger.warn(f"触发了站点首次种子下载,且无法自动跳过:{url}")
|
logger.warn(f"触发了站点首次种子下载,且无法自动跳过:{url}")
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
logger.warn(f"【Downloader】触发了站点首次种子下载,尝试自动跳过时出现错误:{err},链接:{url}")
|
logger.warn(f"触发了站点首次种子下载,尝试自动跳过时出现错误:{err},链接:{url}")
|
||||||
|
|
||||||
if not skip_flag:
|
if not skip_flag:
|
||||||
return None, None, "", [], "种子数据有误,请确认链接是否正确,如为PT站点则需手工在站点下载一次种子"
|
return None, None, "", [], "种子数据有误,请确认链接是否正确,如为PT站点则需手工在站点下载一次种子"
|
||||||
else:
|
|
||||||
|
if req.content:
|
||||||
# 检查是不是种子文件,如果不是仍然抛出异常
|
# 检查是不是种子文件,如果不是仍然抛出异常
|
||||||
try:
|
try:
|
||||||
bdecode(req.content)
|
# 保存到文件
|
||||||
|
file_path.write_bytes(req.content)
|
||||||
|
# 获取种子目录和文件清单
|
||||||
|
torrentinfo = Torrent.from_file(file_path)
|
||||||
|
# 获取目录名
|
||||||
|
folder_name = torrentinfo.name
|
||||||
|
# 获取文件清单
|
||||||
|
if len(torrentinfo.files) <= 1:
|
||||||
|
# 单文件种子
|
||||||
|
file_list = [torrentinfo.name]
|
||||||
|
else:
|
||||||
|
file_list = [fileinfo.name for fileinfo in torrentinfo.files]
|
||||||
|
# 成功拿到种子数据
|
||||||
|
return file_path, req.content, folder_name, file_list, ""
|
||||||
except Exception as err:
|
except Exception as err:
|
||||||
print(str(err))
|
logger.error(f"种子文件解析失败:{err}")
|
||||||
return None, None, "", [], "种子数据有误,请确认链接是否正确"
|
# 种子数据仍然错误
|
||||||
# 读取种子文件名
|
return None, None, "", [], "种子数据有误,请确认链接是否正确"
|
||||||
file_name = self.__get_url_torrent_filename(req, url)
|
# 返回失败
|
||||||
# 种子文件路径
|
return None, None, "", [], ""
|
||||||
file_path = Path(settings.TEMP_PATH) / file_name
|
|
||||||
# 种子内容
|
|
||||||
file_content: bytes = req.content
|
|
||||||
# 读取种子信息
|
|
||||||
file_folder, file_names, ret_msg = self.__get_torrent_fileinfo(file_content)
|
|
||||||
# 写入磁盘
|
|
||||||
file_path.write_bytes(file_content)
|
|
||||||
# 返回
|
|
||||||
return file_path, file_content, file_folder, file_names, ret_msg
|
|
||||||
|
|
||||||
elif req is None:
|
elif req is None:
|
||||||
return None, None, "", [], "无法打开链接:%s" % url
|
return None, None, "", [], "无法打开链接:%s" % url
|
||||||
elif req.status_code == 429:
|
elif req.status_code == 429:
|
||||||
return None, None, "", [], "触发站点流控,请稍后重试"
|
return None, None, "", [], "触发站点流控,请稍后重试"
|
||||||
else:
|
else:
|
||||||
return None, None, "", [], "下载种子出错,状态码:%s" % req.status_code
|
return None, None, "", [], f"下载种子出错,状态码:{req.status_code}"
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def __get_torrent_fileinfo(content: bytes) -> Tuple[str, list, str]:
|
|
||||||
"""
|
|
||||||
解析Torrent文件,获取文件清单
|
|
||||||
:return: 种子文件列表主目录、种子文件列表、错误信息
|
|
||||||
"""
|
|
||||||
file_folder = ""
|
|
||||||
file_names = []
|
|
||||||
try:
|
|
||||||
torrent = bdecode(content)
|
|
||||||
if torrent.get("info"):
|
|
||||||
files = torrent.get("info", {}).get("files") or []
|
|
||||||
if files:
|
|
||||||
for item in files:
|
|
||||||
if item.get("path"):
|
|
||||||
file_names.append(item["path"][0])
|
|
||||||
file_folder = torrent.get("info", {}).get("name")
|
|
||||||
else:
|
|
||||||
file_names.append(torrent.get("info", {}).get("name"))
|
|
||||||
except Exception as err:
|
|
||||||
return file_folder, file_names, "解析种子文件异常:%s" % str(err)
|
|
||||||
return file_folder, file_names, ""
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def __get_url_torrent_filename(req, url: str) -> str:
|
def __get_url_torrent_filename(req, url: str) -> str:
|
||||||
|
@ -62,10 +62,10 @@ class TorrentLeech:
|
|||||||
}
|
}
|
||||||
torrents.append(torrent)
|
torrents.append(torrent)
|
||||||
elif res is not None:
|
elif res is not None:
|
||||||
logger.warn(f"【INDEXER】{self._indexer.get('name')} 搜索失败,错误码:{res.status_code}")
|
logger.warn(f"{self._indexer.get('name')} 搜索失败,错误码:{res.status_code}")
|
||||||
return True, []
|
return True, []
|
||||||
else:
|
else:
|
||||||
logger.warn(f"【INDEXER】{self._indexer.get('name')} 搜索失败,无法连接 {self._indexer.get('domain')}")
|
logger.warn(f"{self._indexer.get('name')} 搜索失败,无法连接 {self._indexer.get('domain')}")
|
||||||
return True, []
|
return True, []
|
||||||
|
|
||||||
return False, torrents
|
return False, torrents
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
Cython~=0.29.35
|
|
||||||
fast-bencode~=1.1.3
|
|
||||||
pydantic~=1.10.8
|
pydantic~=1.10.8
|
||||||
SQLAlchemy~=2.0.15
|
SQLAlchemy~=2.0.15
|
||||||
uvicorn~=0.22.0
|
uvicorn~=0.22.0
|
||||||
@ -36,4 +34,5 @@ beautifulsoup4~=4.12.2
|
|||||||
pillow~=9.5.0
|
pillow~=9.5.0
|
||||||
pyTelegramBotAPI~=4.12.0
|
pyTelegramBotAPI~=4.12.0
|
||||||
playwright~=1.34.0
|
playwright~=1.34.0
|
||||||
cf_clearance~=0.29.2
|
cf_clearance~=0.29.2
|
||||||
|
torrentool~=1.2.0
|
Reference in New Issue
Block a user