From 96f17e2bc2117b6db236615c81e9c40ccd588055 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Mon, 4 Sep 2023 10:14:05 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#426=20=E5=88=AE=E5=89=8A=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E5=9B=BE=E7=89=87=E9=87=8D=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/modules/themoviedb/scraper.py | 6 +++++- app/utils/common.py | 34 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 app/utils/common.py diff --git a/app/modules/themoviedb/scraper.py b/app/modules/themoviedb/scraper.py index 1b998523..20c7295d 100644 --- a/app/modules/themoviedb/scraper.py +++ b/app/modules/themoviedb/scraper.py @@ -2,11 +2,14 @@ import time from pathlib import Path from xml.dom import minidom +from requests import RequestException + from app.core.config import settings from app.core.context import MediaInfo from app.core.metainfo import MetaInfo from app.log import logger from app.schemas.types import MediaType +from app.utils.common import retry from app.utils.dom import DomUtils from app.utils.http import RequestUtils @@ -312,6 +315,7 @@ class TmdbScraper: self.__save_nfo(doc, file_path.with_suffix(".nfo")) @staticmethod + @retry(RequestException, logger=logger) def __save_image(url: str, file_path: Path): """ 下载图片并保存 @@ -320,7 +324,7 @@ class TmdbScraper: return try: logger.info(f"正在下载{file_path.stem}图片:{url} ...") - r = RequestUtils().get_res(url=url) + r = RequestUtils().get_res(url=url, raise_exception=True) if r: file_path.write_bytes(r.content) logger.info(f"图片已保存:{file_path}") diff --git a/app/utils/common.py b/app/utils/common.py new file mode 100644 index 00000000..606fef6d --- /dev/null +++ b/app/utils/common.py @@ -0,0 +1,34 @@ +import time +from typing import Any + + +def retry(ExceptionToCheck: Any, + tries: int = 3, delay: int = 3, backoff: int = 2, logger: Any = None): + """ + :param ExceptionToCheck: 需要捕获的异常 + :param tries: 重试次数 + :param delay: 延迟时间 + :param backoff: 延迟倍数 + :param logger: 日志对象 + """ + + def deco_retry(f): + def f_retry(*args, **kwargs): + mtries, mdelay = tries, delay + while mtries > 1: + try: + return f(*args, **kwargs) + except ExceptionToCheck as e: + msg = f"{str(e)}, {mdelay} 秒后重试 ..." + if logger: + logger.warn(msg) + else: + print(msg) + time.sleep(mdelay) + mtries -= 1 + mdelay *= backoff + return f(*args, **kwargs) + + return f_retry + + return deco_retry