From 6925dde2548282588f3f1fca05d92d3934fd254d Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 9 Jun 2023 19:25:12 +0800 Subject: [PATCH] fix --- app/api/endpoints/douban.py | 2 -- app/api/endpoints/login.py | 3 ++- app/api/endpoints/messages.py | 2 +- app/api/endpoints/subscribes.py | 2 +- app/api/endpoints/webhooks.py | 2 +- app/chain/__init__.py | 4 ++- app/chain/common.py | 3 +-- app/chain/cookiecloud.py | 2 +- app/chain/douban_sync.py | 4 ++- app/chain/identify.py | 3 ++- app/chain/search.py | 4 ++- app/chain/subscribe.py | 4 ++- app/chain/transfer.py | 4 ++- app/chain/user_message.py | 4 ++- app/command.py | 3 ++- app/core/__init__.py | 6 ----- app/core/module_manager.py | 4 +-- app/core/plugin_manager.py | 2 +- app/db/subscribes.py | 2 +- app/db/userauth.py | 3 ++- app/helper/__init__.py | 1 - app/helper/{playwright.py => browser.py} | 25 +++++++++++------- app/helper/rss.py | 2 +- app/helper/sites.cpython-310-darwin.so | Bin 236136 -> 236136 bytes app/helper/torrent.py | 4 ++- app/log.py | 2 +- app/main.py | 4 ++- app/modules/douban/__init__.py | 4 ++- app/modules/emby/__init__.py | 2 +- app/modules/emby/emby.py | 2 +- app/modules/fanart/__init__.py | 2 +- app/modules/filetransfer/__init__.py | 4 ++- app/modules/filter/__init__.py | 3 ++- app/modules/indexer/__init__.py | 2 +- app/modules/indexer/spider.py | 7 ++--- app/modules/indexer/tnode.py | 2 +- app/modules/indexer/torrentleech.py | 2 +- app/modules/jellyfin/__init__.py | 2 +- app/modules/jellyfin/jellyfin.py | 2 +- app/modules/plex/__init__.py | 2 +- app/modules/plex/plex.py | 2 +- app/modules/qbittorrent/__init__.py | 3 ++- app/modules/qbittorrent/qbittorrent.py | 2 +- app/modules/telegram/__init__.py | 3 ++- app/modules/telegram/telegram.py | 19 +++++++------ app/modules/themoviedb/__init__.py | 4 ++- app/modules/themoviedb/category.py | 2 +- app/modules/themoviedb/tmdb.py | 2 +- app/modules/themoviedb/tmdb_cache.py | 2 +- app/modules/transmission/__init__.py | 3 ++- app/modules/transmission/transmission.py | 2 +- app/modules/wechat/__init__.py | 3 ++- app/modules/wechat/wechat.py | 3 ++- app/plugins/__init__.py | 2 +- app/plugins/autosignin/__init__.py | 5 ++-- app/plugins/autosignin/sites/52pt.py | 2 +- app/plugins/autosignin/sites/btschool.py | 2 +- app/plugins/autosignin/sites/chdbits.py | 2 +- app/plugins/autosignin/sites/haidan.py | 2 +- app/plugins/autosignin/sites/hares.py | 2 +- app/plugins/autosignin/sites/hdarea.py | 2 +- app/plugins/autosignin/sites/hdchina.py | 2 +- app/plugins/autosignin/sites/hdcity.py | 2 +- app/plugins/autosignin/sites/hdsky.py | 2 +- app/plugins/autosignin/sites/hdupt.py | 2 +- app/plugins/autosignin/sites/opencd.py | 2 +- app/plugins/autosignin/sites/pterclub.py | 2 +- app/plugins/autosignin/sites/tjupt.py | 2 +- app/plugins/autosignin/sites/ttg.py | 2 +- app/plugins/autosignin/sites/u2.py | 2 +- app/plugins/autosignin/sites/zhuque.py | 2 +- app/plugins/sitestatistic/__init__.py | 5 ++-- .../sitestatistic/siteuserinfo/__init__.py | 2 +- app/scheduler.py | 2 +- tests/test_filter.py | 2 +- tests/test_metainfo.py | 2 +- 76 files changed, 137 insertions(+), 102 deletions(-) rename app/helper/{playwright.py => browser.py} (65%) diff --git a/app/api/endpoints/douban.py b/app/api/endpoints/douban.py index 42b60130..dfbea1e7 100644 --- a/app/api/endpoints/douban.py +++ b/app/api/endpoints/douban.py @@ -1,9 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks -from sqlalchemy.orm import Session from app import schemas from app.chain.douban_sync import DoubanSyncChain -from app.db import get_db from app.db.models.user import User from app.db.userauth import get_current_active_superuser diff --git a/app/api/endpoints/login.py b/app/api/endpoints/login.py index 25e7d7df..9d09320d 100644 --- a/app/api/endpoints/login.py +++ b/app/api/endpoints/login.py @@ -6,7 +6,8 @@ from fastapi.security import OAuth2PasswordRequestForm from sqlalchemy.orm import Session from app import schemas -from app.core import security, settings +from app.core import security +from app.core.config import settings from app.db import get_db from app.db.models.user import User diff --git a/app/api/endpoints/messages.py b/app/api/endpoints/messages.py index f7b5e142..389d350c 100644 --- a/app/api/endpoints/messages.py +++ b/app/api/endpoints/messages.py @@ -5,7 +5,7 @@ from fastapi import Request from app import schemas from app.chain.user_message import UserMessageChain -from app.core import settings +from app.core.config import settings from app.log import logger from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt diff --git a/app/api/endpoints/subscribes.py b/app/api/endpoints/subscribes.py index a7131c65..511bdef7 100644 --- a/app/api/endpoints/subscribes.py +++ b/app/api/endpoints/subscribes.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session from app import schemas from app.chain.subscribe import SubscribeChain -from app.core import settings +from app.core.config import settings from app.db import get_db from app.db.models.subscribe import Subscribe from app.db.models.user import User diff --git a/app/api/endpoints/webhooks.py b/app/api/endpoints/webhooks.py index 286705de..a42fb361 100644 --- a/app/api/endpoints/webhooks.py +++ b/app/api/endpoints/webhooks.py @@ -3,7 +3,7 @@ from fastapi import APIRouter, BackgroundTasks, Request from app import schemas from app.chain.webhook_message import WebhookMessageChain -from app.core import settings +from app.core.config import settings router = APIRouter() diff --git a/app/chain/__init__.py b/app/chain/__init__.py index b9ab2cbc..d2b8fada 100644 --- a/app/chain/__init__.py +++ b/app/chain/__init__.py @@ -5,7 +5,9 @@ from typing import Optional, Any, Tuple, List, Set, Union from ruamel.yaml import CommentedMap -from app.core import Context, ModuleManager, MediaInfo, TorrentInfo +from app.core.context import Context +from app.core.module_manager import ModuleManager +from app.core.context import MediaInfo, TorrentInfo from app.core.meta import MetaBase from app.log import logger from app.utils.singleton import AbstractSingleton, Singleton diff --git a/app/chain/common.py b/app/chain/common.py index de1e269e..9e8c4bb8 100644 --- a/app/chain/common.py +++ b/app/chain/common.py @@ -3,8 +3,7 @@ from pathlib import Path from typing import List, Optional, Tuple, Set, Dict from app.chain import ChainBase -from app.core import MediaInfo -from app.core import TorrentInfo, Context +from app.core.context import MediaInfo, TorrentInfo, Context from app.core.meta import MetaBase from app.helper.torrent import TorrentHelper from app.log import logger diff --git a/app/chain/cookiecloud.py b/app/chain/cookiecloud.py index d7297e73..622acf04 100644 --- a/app/chain/cookiecloud.py +++ b/app/chain/cookiecloud.py @@ -1,7 +1,7 @@ from typing import Tuple from app.chain import ChainBase -from app.core import settings +from app.core.config import settings from app.db.sites import Sites from app.helper.cookiecloud import CookieCloudHelper from app.helper.sites import SitesHelper diff --git a/app/chain/douban_sync.py b/app/chain/douban_sync.py index d914d02d..50876665 100644 --- a/app/chain/douban_sync.py +++ b/app/chain/douban_sync.py @@ -4,7 +4,9 @@ from typing import Optional from app.chain import ChainBase from app.chain.common import CommonChain from app.chain.search import SearchChain -from app.core import settings, MetaInfo, MediaInfo +from app.core.config import settings +from app.core.meta_info import MetaInfo +from app.core.context import MediaInfo from app.db.subscribes import Subscribes from app.helper.rss import RssHelper from app.log import logger diff --git a/app/chain/identify.py b/app/chain/identify.py index 5c2da970..06427f87 100644 --- a/app/chain/identify.py +++ b/app/chain/identify.py @@ -1,7 +1,8 @@ from typing import Optional from app.chain import ChainBase -from app.core import Context, MetaInfo, MediaInfo +from app.core.meta_info import MetaInfo +from app.core.context import Context, MediaInfo from app.log import logger diff --git a/app/chain/search.py b/app/chain/search.py index 7cd6daea..68cf3aa1 100644 --- a/app/chain/search.py +++ b/app/chain/search.py @@ -2,7 +2,9 @@ from typing import Optional, List from app.chain import ChainBase from app.chain.common import CommonChain -from app.core import Context, MetaInfo, MediaInfo, TorrentInfo, settings +from app.core.context import Context, MediaInfo, TorrentInfo +from app.core.config import settings +from app.core.meta_info import MetaInfo from app.core.meta import MetaBase from app.helper.sites import SitesHelper from app.log import logger diff --git a/app/chain/subscribe.py b/app/chain/subscribe.py index f00a5ba3..870bb034 100644 --- a/app/chain/subscribe.py +++ b/app/chain/subscribe.py @@ -3,7 +3,9 @@ from typing import Dict, List, Optional from app.chain import ChainBase from app.chain.common import CommonChain from app.chain.search import SearchChain -from app.core import MetaInfo, TorrentInfo, Context, MediaInfo, settings +from app.core.meta_info import MetaInfo +from app.core.context import TorrentInfo, Context, MediaInfo +from app.core.config import settings from app.db.subscribes import Subscribes from app.helper.sites import SitesHelper from app.log import logger diff --git a/app/chain/transfer.py b/app/chain/transfer.py index 27503c47..0c0dea8b 100644 --- a/app/chain/transfer.py +++ b/app/chain/transfer.py @@ -1,7 +1,9 @@ from typing import List, Optional from app.chain import ChainBase -from app.core import MetaInfo, MediaInfo, settings +from app.core.meta_info import MetaInfo +from app.core.context import MediaInfo +from app.core.config import settings from app.core.meta import MetaBase from app.log import logger from app.utils.string import StringUtils diff --git a/app/chain/user_message.py b/app/chain/user_message.py index aa95ad19..a59e28bc 100644 --- a/app/chain/user_message.py +++ b/app/chain/user_message.py @@ -2,7 +2,9 @@ from typing import Any from app.chain.common import * from app.chain.search import SearchChain -from app.core import MediaInfo, TorrentInfo, MetaInfo, EventManager +from app.core.context import MediaInfo, TorrentInfo +from app.core.meta_info import MetaInfo +from app.core.event_manager import EventManager from app.db.subscribes import Subscribes from app.log import logger from app.utils.types import EventType diff --git a/app/command.py b/app/command.py index 12d85fc5..96abc8bb 100644 --- a/app/command.py +++ b/app/command.py @@ -7,7 +7,8 @@ from app.chain.cookiecloud import CookieCloudChain from app.chain.douban_sync import DoubanSyncChain from app.chain.subscribe import SubscribeChain from app.chain.transfer import TransferChain -from app.core import eventmanager, PluginManager, EventManager +from app.core.event_manager import eventmanager, EventManager +from app.core.plugin_manager import PluginManager from app.core.event_manager import Event as ManagerEvent from app.log import logger from app.utils.singleton import Singleton diff --git a/app/core/__init__.py b/app/core/__init__.py index 5f304d8e..e69de29b 100644 --- a/app/core/__init__.py +++ b/app/core/__init__.py @@ -1,6 +0,0 @@ -from .config import settings -from .event_manager import eventmanager, EventManager -from .meta_info import MetaInfo -from .module_manager import ModuleManager -from .plugin_manager import PluginManager -from .context import Context, MediaInfo, TorrentInfo diff --git a/app/core/module_manager.py b/app/core/module_manager.py index b9a5e6eb..1f16b9f1 100644 --- a/app/core/module_manager.py +++ b/app/core/module_manager.py @@ -1,8 +1,8 @@ from types import FunctionType from typing import Generator, Optional -from app.core import settings -from app.helper import ModuleHelper +from app.core.config import settings +from app.helper.module import ModuleHelper from app.log import logger from app.utils.singleton import Singleton diff --git a/app/core/plugin_manager.py b/app/core/plugin_manager.py index 4928f016..04f7c4b1 100644 --- a/app/core/plugin_manager.py +++ b/app/core/plugin_manager.py @@ -2,7 +2,7 @@ import traceback from typing import List, Any from app.db.systemconfigs import SystemConfigs -from app.helper import ModuleHelper +from app.helper.module import ModuleHelper from app.log import logger from app.utils.singleton import Singleton diff --git a/app/db/subscribes.py b/app/db/subscribes.py index dc4754f5..491bd7af 100644 --- a/app/db/subscribes.py +++ b/app/db/subscribes.py @@ -2,7 +2,7 @@ from typing import Tuple, List from sqlalchemy.orm import Session -from app.core import MediaInfo +from app.core.context import MediaInfo from app.db import SessionLocal from app.db.models.subscribe import Subscribe from app.utils.types import MediaType diff --git a/app/db/userauth.py b/app/db/userauth.py index c09c2a86..fff4fd73 100644 --- a/app/db/userauth.py +++ b/app/db/userauth.py @@ -3,7 +3,8 @@ from fastapi import Depends, HTTPException, status from sqlalchemy.orm import Session from app import schemas -from app.core import settings, security +from app.core.config import settings +from app.core import security from app.core.security import reusable_oauth2 from app.db import get_db from app.db.models.user import User diff --git a/app/helper/__init__.py b/app/helper/__init__.py index 4b336652..e69de29b 100644 --- a/app/helper/__init__.py +++ b/app/helper/__init__.py @@ -1 +0,0 @@ -from .module import ModuleHelper diff --git a/app/helper/playwright.py b/app/helper/browser.py similarity index 65% rename from app/helper/playwright.py rename to app/helper/browser.py index a49532a1..2b0b474e 100644 --- a/app/helper/playwright.py +++ b/app/helper/browser.py @@ -1,12 +1,14 @@ from playwright.sync_api import sync_playwright +from app.log import logger + class PlaywrightHelper: def __init__(self, browser_type="chromium"): self.browser_type = browser_type def get_page_source(self, url: str, - cookie: str = None, + cookies: str = None, ua: str = None, proxy: dict = None, headless: bool = True, @@ -14,7 +16,7 @@ class PlaywrightHelper: """ 获取网页源码 :param url: 网页地址 - :param cookie: cookie + :param cookies: cookies :param ua: user-agent :param proxy: 代理 :param headless: 是否无头模式 @@ -24,12 +26,17 @@ class PlaywrightHelper: browser = playwright[self.browser_type].launch(headless=headless) context = browser.new_context(user_agent=ua, proxy=proxy) page = context.new_page() - if cookie: - page.set_extra_http_headers({"cookie": cookie}) - page.goto(url) - page.wait_for_load_state("networkidle", timeout=timeout) - source = page.content() - browser.close() + if cookies: + page.set_extra_http_headers({"cookie": cookies}) + try: + page.goto(url) + page.wait_for_load_state("networkidle", timeout=timeout * 1000) + source = page.content() + except Exception as e: + logger.error(f"获取网页源码失败: {e}") + source = None + finally: + browser.close() return source @@ -40,5 +47,5 @@ if __name__ == "__main__": test_url = "https://www.baidu.com" test_cookies = "cookie1=value1; cookie2=value2" test_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36" - source_code = utils.get_page_source(test_url, cookie=test_cookies, ua=test_user_agent) + source_code = utils.get_page_source(test_url, cookies=test_cookies, ua=test_user_agent) print(source_code) diff --git a/app/helper/rss.py b/app/helper/rss.py index 8ea2c433..ef53d59e 100644 --- a/app/helper/rss.py +++ b/app/helper/rss.py @@ -1,7 +1,7 @@ import xml.dom.minidom from typing import List -from app.core import settings +from app.core.config import settings from app.utils.dom import DomUtils from app.utils.http import RequestUtils from app.utils.string import StringUtils diff --git a/app/helper/sites.cpython-310-darwin.so b/app/helper/sites.cpython-310-darwin.so index 03eb1e8fdc76fb233e2eee9ddc98994267e01dba..751d122bbc1bbbcfd1970a0306f8b0fe83ac695a 100755 GIT binary patch delta 32603 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 diff --git a/app/helper/torrent.py b/app/helper/torrent.py index 9c385e7a..f03ddee7 100644 --- a/app/helper/torrent.py +++ b/app/helper/torrent.py @@ -6,7 +6,9 @@ from urllib.parse import unquote from bencode import bdecode -from app.core import settings, Context, MetaInfo +from app.core.config import settings +from app.core.context import Context +from app.core.meta_info import MetaInfo from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils diff --git a/app/log.py b/app/log.py index 0d821887..49fbcc4c 100644 --- a/app/log.py +++ b/app/log.py @@ -1,7 +1,7 @@ import logging from logging.handlers import RotatingFileHandler -from app.core import settings +from app.core.config import settings # logger logger = logging.getLogger() diff --git a/app/main.py b/app/main.py index 9b9c198a..4bbf6ce9 100644 --- a/app/main.py +++ b/app/main.py @@ -4,7 +4,9 @@ from uvicorn import Config from app.api.apiv1 import api_router from app.command import Command -from app.core import settings, ModuleManager, PluginManager +from app.core.config import settings +from app.core.module_manager import ModuleManager +from app.core.plugin_manager import PluginManager from app.db.init import init_db, update_db from app.helper.sites import SitesHelper from app.scheduler import Scheduler diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index 84a49485..e487e03e 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -3,7 +3,9 @@ from pathlib import Path from typing import List, Optional, Tuple, Union from xml.dom import minidom -from app.core import MediaInfo, settings, MetaInfo +from app.core.context import MediaInfo +from app.core.config import settings +from app.core.meta_info import MetaInfo from app.core.meta import MetaBase from app.log import logger from app.modules import _ModuleBase diff --git a/app/modules/emby/__init__.py b/app/modules/emby/__init__.py index 4d15eb1b..f51d8d5a 100644 --- a/app/modules/emby/__init__.py +++ b/app/modules/emby/__init__.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple, Union -from app.core import MediaInfo +from app.core.context import MediaInfo from app.log import logger from app.modules import _ModuleBase from app.modules.emby.emby import Emby diff --git a/app/modules/emby/emby.py b/app/modules/emby/emby.py index 24d58d5c..55d67ae1 100644 --- a/app/modules/emby/emby.py +++ b/app/modules/emby/emby.py @@ -2,7 +2,7 @@ import re from pathlib import Path from typing import List, Optional, Union, Dict -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.http import RequestUtils from app.utils.singleton import Singleton diff --git a/app/modules/fanart/__init__.py b/app/modules/fanart/__init__.py index 00b05057..3902a97c 100644 --- a/app/modules/fanart/__init__.py +++ b/app/modules/fanart/__init__.py @@ -2,7 +2,7 @@ import re from functools import lru_cache from typing import Optional, Tuple, Union -from app.core import MediaInfo, settings +from app.core.context import MediaInfo, settings from app.log import logger from app.modules import _ModuleBase from app.utils.http import RequestUtils diff --git a/app/modules/filetransfer/__init__.py b/app/modules/filetransfer/__init__.py index c74c7416..b3ccd943 100644 --- a/app/modules/filetransfer/__init__.py +++ b/app/modules/filetransfer/__init__.py @@ -5,7 +5,9 @@ from typing import Optional, List, Tuple, Union from jinja2 import Template -from app.core import MediaInfo, MetaInfo, settings +from app.core.context import MediaInfo +from app.core.meta_info import MetaInfo +from app.core.config import settings from app.core.meta import MetaBase from app.log import logger from app.modules import _ModuleBase diff --git a/app/modules/filter/__init__.py b/app/modules/filter/__init__.py index c0804a8a..fcf849bd 100644 --- a/app/modules/filter/__init__.py +++ b/app/modules/filter/__init__.py @@ -1,7 +1,8 @@ import re from typing import List, Tuple, Union, Dict, Optional -from app.core import TorrentInfo, settings +from app.core.context import TorrentInfo +from app.core.config import settings from app.modules import _ModuleBase from app.modules.filter.RuleParser import RuleParser diff --git a/app/modules/indexer/__init__.py b/app/modules/indexer/__init__.py index 066f703b..817bb72b 100644 --- a/app/modules/indexer/__init__.py +++ b/app/modules/indexer/__init__.py @@ -4,7 +4,7 @@ from typing import List, Optional, Tuple, Union from ruamel.yaml import CommentedMap -from app.core import MediaInfo, TorrentInfo +from app.core.context import MediaInfo, TorrentInfo from app.log import logger from app.modules import _ModuleBase from app.modules.indexer.spider import TorrentSpider diff --git a/app/modules/indexer/spider.py b/app/modules/indexer/spider.py index fa6a4300..2dc91ce0 100644 --- a/app/modules/indexer/spider.py +++ b/app/modules/indexer/spider.py @@ -8,8 +8,8 @@ from jinja2 import Template from pyquery import PyQuery from ruamel.yaml import CommentedMap -from app.core import settings -from app.helper.playwright import PlaywrightHelper +from app.core.config import settings +from app.helper.browser import PlaywrightHelper from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils @@ -17,6 +17,7 @@ from app.utils.types import MediaType class TorrentSpider: + # 是否出现错误 is_error: bool = False # 索引器ID @@ -217,7 +218,7 @@ class TorrentSpider: if self.render: page_source = PlaywrightHelper().get_page_source( url=searchurl, - cookie=self.cookie, + cookies=self.cookie, ua=self.ua, proxy=self.proxies ) diff --git a/app/modules/indexer/tnode.py b/app/modules/indexer/tnode.py index 085cb7a8..8518ecfe 100644 --- a/app/modules/indexer/tnode.py +++ b/app/modules/indexer/tnode.py @@ -3,7 +3,7 @@ from typing import Tuple, List from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils diff --git a/app/modules/indexer/torrentleech.py b/app/modules/indexer/torrentleech.py index 6dc5037e..eabcdc10 100644 --- a/app/modules/indexer/torrentleech.py +++ b/app/modules/indexer/torrentleech.py @@ -3,7 +3,7 @@ from urllib.parse import quote from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils diff --git a/app/modules/jellyfin/__init__.py b/app/modules/jellyfin/__init__.py index 204c6d83..50f91401 100644 --- a/app/modules/jellyfin/__init__.py +++ b/app/modules/jellyfin/__init__.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple, Union -from app.core import MediaInfo +from app.core.context import MediaInfo from app.log import logger from app.modules import _ModuleBase from app.modules.jellyfin.jellyfin import Jellyfin diff --git a/app/modules/jellyfin/jellyfin.py b/app/modules/jellyfin/jellyfin.py index 790e3696..80bd8fb6 100644 --- a/app/modules/jellyfin/jellyfin.py +++ b/app/modules/jellyfin/jellyfin.py @@ -1,7 +1,7 @@ import re from typing import List, Union, Optional, Dict -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.http import RequestUtils from app.utils.singleton import Singleton diff --git a/app/modules/plex/__init__.py b/app/modules/plex/__init__.py index 185ed563..8576ec59 100644 --- a/app/modules/plex/__init__.py +++ b/app/modules/plex/__init__.py @@ -1,6 +1,6 @@ from typing import Optional, Tuple, Union -from app.core import MediaInfo +from app.core.context import MediaInfo from app.log import logger from app.modules import _ModuleBase from app.modules.plex.plex import Plex diff --git a/app/modules/plex/plex.py b/app/modules/plex/plex.py index 641a661f..5a85a004 100644 --- a/app/modules/plex/plex.py +++ b/app/modules/plex/plex.py @@ -5,7 +5,7 @@ from urllib.parse import quote_plus from plexapi import media from plexapi.server import PlexServer -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.singleton import Singleton diff --git a/app/modules/qbittorrent/__init__.py b/app/modules/qbittorrent/__init__.py index 73716700..97b595b3 100644 --- a/app/modules/qbittorrent/__init__.py +++ b/app/modules/qbittorrent/__init__.py @@ -1,7 +1,8 @@ from pathlib import Path from typing import Set, Tuple, Optional, Union, List -from app.core import settings, MetaInfo +from app.core.config import settings +from app.core.meta_info import MetaInfo from app.modules import _ModuleBase from app.modules.qbittorrent.qbittorrent import Qbittorrent from app.utils.string import StringUtils diff --git a/app/modules/qbittorrent/qbittorrent.py b/app/modules/qbittorrent/qbittorrent.py index 3d088c8c..25270063 100644 --- a/app/modules/qbittorrent/qbittorrent.py +++ b/app/modules/qbittorrent/qbittorrent.py @@ -6,7 +6,7 @@ import qbittorrentapi from qbittorrentapi import TorrentFilesList, TorrentDictionary from qbittorrentapi.client import Client -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.singleton import Singleton from app.utils.string import StringUtils diff --git a/app/modules/telegram/__init__.py b/app/modules/telegram/__init__.py index e71acf26..39de9e3b 100644 --- a/app/modules/telegram/__init__.py +++ b/app/modules/telegram/__init__.py @@ -1,7 +1,8 @@ import json from typing import Optional, Union, List, Tuple, Any -from app.core import MediaInfo, settings, Context +from app.core.context import MediaInfo, Context +from app.core.config import settings from app.log import logger from app.modules import _ModuleBase from app.modules.telegram.telegram import Telegram diff --git a/app/modules/telegram/telegram.py b/app/modules/telegram/telegram.py index 322f07f3..a93742f2 100644 --- a/app/modules/telegram/telegram.py +++ b/app/modules/telegram/telegram.py @@ -4,11 +4,11 @@ from typing import Optional, List import telebot -from app.core import settings, MediaInfo, Context +from app.core.config import settings +from app.core.context import MediaInfo, Context from app.log import logger from app.utils.http import RequestUtils from app.utils.singleton import Singleton -from app.utils.string import StringUtils class Telegram(metaclass=Singleton): @@ -20,6 +20,9 @@ class Telegram(metaclass=Singleton): """ 初始化参数 """ + if settings.MESSAGER != "telegram": + return + # Token self._telegram_token = settings.TELEGRAM_TOKEN # Chat Id @@ -72,7 +75,7 @@ class Telegram(metaclass=Singleton): else: chat_id = self._telegram_chat_id - return self.__send_request(image=image, caption=caption) + return self.__send_request(userid=chat_id, image=image, caption=caption) except Exception as msg_e: logger.error(f"发送消息失败:{msg_e}") @@ -110,7 +113,7 @@ class Telegram(metaclass=Singleton): else: chat_id = self._telegram_chat_id - return self.__send_request(image=image, caption=caption) + return self.__send_request(userid=chat_id, image=image, caption=caption) except Exception as msg_e: logger.error(f"发送消息失败:{msg_e}") @@ -140,24 +143,24 @@ class Telegram(metaclass=Singleton): else: chat_id = self._telegram_chat_id - return self.__send_request(caption=caption) + return self.__send_request(userid=chat_id, caption=caption) except Exception as msg_e: logger.error(f"发送消息失败:{msg_e}") return False - def __send_request(self, image="", caption="") -> bool: + def __send_request(self, userid: str = None, image="", caption="") -> bool: """ 向Telegram发送报文 """ if image: - ret = self._bot.send_photo(chat_id=self._telegram_chat_id, + ret = self._bot.send_photo(chat_id=userid or self._telegram_chat_id, photo=image, caption=caption, parse_mode="Markdown") else: - ret = self._bot.send_message(chat_id=self._telegram_chat_id, + ret = self._bot.send_message(chat_id=userid or self._telegram_chat_id, text=caption, parse_mode="Markdown") diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index 00dc5393..1deddc3d 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -3,7 +3,9 @@ from pathlib import Path from typing import Optional, List, Tuple, Union from xml.dom import minidom -from app.core import settings, MediaInfo, MetaInfo +from app.core.config import settings +from app.core.context import MediaInfo +from app.core.meta_info import MetaInfo from app.core.meta import MetaBase from app.log import logger from app.modules import _ModuleBase diff --git a/app/modules/themoviedb/category.py b/app/modules/themoviedb/category.py index 455bac86..d5639577 100644 --- a/app/modules/themoviedb/category.py +++ b/app/modules/themoviedb/category.py @@ -3,7 +3,7 @@ from pathlib import Path import ruamel.yaml -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.singleton import Singleton diff --git a/app/modules/themoviedb/tmdb.py b/app/modules/themoviedb/tmdb.py index 5de47a8b..5bd36dbb 100644 --- a/app/modules/themoviedb/tmdb.py +++ b/app/modules/themoviedb/tmdb.py @@ -6,7 +6,7 @@ from lxml import etree from tmdbv3api import TMDb, Search, Movie, TV, Season, Episode from tmdbv3api.exceptions import TMDbException -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.http import RequestUtils from app.utils.string import StringUtils diff --git a/app/modules/themoviedb/tmdb_cache.py b/app/modules/themoviedb/tmdb_cache.py index 6f887cac..3cffba78 100644 --- a/app/modules/themoviedb/tmdb_cache.py +++ b/app/modules/themoviedb/tmdb_cache.py @@ -5,7 +5,7 @@ from pathlib import Path from threading import RLock from typing import Optional -from app.core import settings +from app.core.config import settings from app.core.meta import MetaBase from app.utils.singleton import Singleton from app.utils.types import MediaType diff --git a/app/modules/transmission/__init__.py b/app/modules/transmission/__init__.py index 7a9e3671..b959f573 100644 --- a/app/modules/transmission/__init__.py +++ b/app/modules/transmission/__init__.py @@ -1,7 +1,8 @@ from pathlib import Path from typing import Set, Tuple, Optional, Union, List -from app.core import settings, MetaInfo +from app.core.config import settings +from app.core.meta_info import MetaInfo from app.modules import _ModuleBase from app.modules.transmission.transmission import Transmission from app.utils.types import TorrentStatus diff --git a/app/modules/transmission/transmission.py b/app/modules/transmission/transmission.py index ee431ca8..ee970334 100644 --- a/app/modules/transmission/transmission.py +++ b/app/modules/transmission/transmission.py @@ -4,7 +4,7 @@ from typing import Optional, Union, Tuple, List import transmission_rpc from transmission_rpc import Client, Torrent, File -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.singleton import Singleton from app.utils.string import StringUtils diff --git a/app/modules/wechat/__init__.py b/app/modules/wechat/__init__.py index 4fbdfb94..db98b78c 100644 --- a/app/modules/wechat/__init__.py +++ b/app/modules/wechat/__init__.py @@ -1,7 +1,8 @@ import xml.dom.minidom from typing import Optional, Union, List, Tuple, Any -from app.core import MediaInfo, settings, Context +from app.core.context import MediaInfo, Context +from app.core.config import settings from app.log import logger from app.modules import _ModuleBase from app.modules.wechat.WXBizMsgCrypt3 import WXBizMsgCrypt diff --git a/app/modules/wechat/wechat.py b/app/modules/wechat/wechat.py index 337f57e2..d46863ea 100644 --- a/app/modules/wechat/wechat.py +++ b/app/modules/wechat/wechat.py @@ -3,7 +3,8 @@ import threading from datetime import datetime from typing import Optional, List -from app.core import settings, MediaInfo, Context +from app.core.config import settings +from app.core.context import MediaInfo, Context from app.log import logger from app.utils.http import RequestUtils from app.utils.singleton import Singleton diff --git a/app/plugins/__init__.py b/app/plugins/__init__.py index 25da6cb5..d74aafa3 100644 --- a/app/plugins/__init__.py +++ b/app/plugins/__init__.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import Any from app.chain import ChainBase -from app.core import settings +from app.core.config import settings from app.db import SessionLocal from app.db.models import Base from app.db.models.plugin import PluginData diff --git a/app/plugins/autosignin/__init__.py b/app/plugins/autosignin/__init__.py index dc972852..be038894 100644 --- a/app/plugins/autosignin/__init__.py +++ b/app/plugins/autosignin/__init__.py @@ -7,8 +7,9 @@ from urllib.parse import urljoin from apscheduler.schedulers.background import BackgroundScheduler from ruamel.yaml import CommentedMap -from app.core import EventManager, settings, eventmanager -from app.helper import ModuleHelper +from app.core.event_manager import EventManager, eventmanager +from app.core.config import settings +from app.helper.module import ModuleHelper from app.helper.cloudflare import under_challenge from app.helper.sites import SitesHelper from app.log import logger diff --git a/app/plugins/autosignin/sites/52pt.py b/app/plugins/autosignin/sites/52pt.py index ef805d4d..b67f0665 100644 --- a/app/plugins/autosignin/sites/52pt.py +++ b/app/plugins/autosignin/sites/52pt.py @@ -4,7 +4,7 @@ from typing import Tuple from lxml import etree -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/btschool.py b/app/plugins/autosignin/sites/btschool.py index 15913e45..ac764221 100644 --- a/app/plugins/autosignin/sites/btschool.py +++ b/app/plugins/autosignin/sites/btschool.py @@ -2,7 +2,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/chdbits.py b/app/plugins/autosignin/sites/chdbits.py index adf09544..3a85db3b 100644 --- a/app/plugins/autosignin/sites/chdbits.py +++ b/app/plugins/autosignin/sites/chdbits.py @@ -5,7 +5,7 @@ from typing import Tuple from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/haidan.py b/app/plugins/autosignin/sites/haidan.py index 1d8acd4a..c461e33f 100644 --- a/app/plugins/autosignin/sites/haidan.py +++ b/app/plugins/autosignin/sites/haidan.py @@ -2,7 +2,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/hares.py b/app/plugins/autosignin/sites/hares.py index c8bdca29..2f14534c 100644 --- a/app/plugins/autosignin/sites/hares.py +++ b/app/plugins/autosignin/sites/hares.py @@ -3,7 +3,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/hdarea.py b/app/plugins/autosignin/sites/hdarea.py index f9132c82..8ee533fe 100644 --- a/app/plugins/autosignin/sites/hdarea.py +++ b/app/plugins/autosignin/sites/hdarea.py @@ -2,7 +2,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/hdchina.py b/app/plugins/autosignin/sites/hdchina.py index a0bc6a46..768fd67f 100644 --- a/app/plugins/autosignin/sites/hdchina.py +++ b/app/plugins/autosignin/sites/hdchina.py @@ -4,7 +4,7 @@ from typing import Tuple from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/hdcity.py b/app/plugins/autosignin/sites/hdcity.py index 87c02f5a..9bb4de76 100644 --- a/app/plugins/autosignin/sites/hdcity.py +++ b/app/plugins/autosignin/sites/hdcity.py @@ -2,7 +2,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/hdsky.py b/app/plugins/autosignin/sites/hdsky.py index f57b5082..764698ca 100644 --- a/app/plugins/autosignin/sites/hdsky.py +++ b/app/plugins/autosignin/sites/hdsky.py @@ -4,7 +4,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.helper.ocr import OcrHelper from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler diff --git a/app/plugins/autosignin/sites/hdupt.py b/app/plugins/autosignin/sites/hdupt.py index c3dbbc09..b3bf8eea 100644 --- a/app/plugins/autosignin/sites/hdupt.py +++ b/app/plugins/autosignin/sites/hdupt.py @@ -3,7 +3,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/opencd.py b/app/plugins/autosignin/sites/opencd.py index bfaca8bb..8e7f0d41 100644 --- a/app/plugins/autosignin/sites/opencd.py +++ b/app/plugins/autosignin/sites/opencd.py @@ -5,7 +5,7 @@ from typing import Tuple from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.helper.ocr import OcrHelper from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler diff --git a/app/plugins/autosignin/sites/pterclub.py b/app/plugins/autosignin/sites/pterclub.py index fc6b67a1..4336289e 100644 --- a/app/plugins/autosignin/sites/pterclub.py +++ b/app/plugins/autosignin/sites/pterclub.py @@ -3,7 +3,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/tjupt.py b/app/plugins/autosignin/sites/tjupt.py index f66eed91..1edc9f0f 100644 --- a/app/plugins/autosignin/sites/tjupt.py +++ b/app/plugins/autosignin/sites/tjupt.py @@ -8,7 +8,7 @@ from PIL import Image from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/ttg.py b/app/plugins/autosignin/sites/ttg.py index 156b9854..bf731053 100644 --- a/app/plugins/autosignin/sites/ttg.py +++ b/app/plugins/autosignin/sites/ttg.py @@ -3,7 +3,7 @@ from typing import Tuple from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/u2.py b/app/plugins/autosignin/sites/u2.py index d1af38c5..890c157b 100644 --- a/app/plugins/autosignin/sites/u2.py +++ b/app/plugins/autosignin/sites/u2.py @@ -6,7 +6,7 @@ from typing import Tuple from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/autosignin/sites/zhuque.py b/app/plugins/autosignin/sites/zhuque.py index 270e0f4f..be3f9400 100644 --- a/app/plugins/autosignin/sites/zhuque.py +++ b/app/plugins/autosignin/sites/zhuque.py @@ -4,7 +4,7 @@ from typing import Tuple from lxml import etree from ruamel.yaml import CommentedMap -from app.core import settings +from app.core.config import settings from app.log import logger from app.plugins.autosignin.sites import _ISiteSigninHandler from app.utils.http import RequestUtils diff --git a/app/plugins/sitestatistic/__init__.py b/app/plugins/sitestatistic/__init__.py index 9ca81811..558fc9a2 100644 --- a/app/plugins/sitestatistic/__init__.py +++ b/app/plugins/sitestatistic/__init__.py @@ -7,9 +7,10 @@ import requests from apscheduler.schedulers.background import BackgroundScheduler from ruamel.yaml import CommentedMap -from app.core import settings, eventmanager +from app.core.config import settings +from app.core.event_manager import eventmanager from app.core.event_manager import Event -from app.helper import ModuleHelper +from app.helper.module import ModuleHelper from app.helper.sites import SitesHelper from app.log import logger from app.plugins import _PluginBase diff --git a/app/plugins/sitestatistic/siteuserinfo/__init__.py b/app/plugins/sitestatistic/siteuserinfo/__init__.py index 930aaf54..6d6b380e 100644 --- a/app/plugins/sitestatistic/siteuserinfo/__init__.py +++ b/app/plugins/sitestatistic/siteuserinfo/__init__.py @@ -10,7 +10,7 @@ import requests from lxml import etree from requests import Session -from app.core import settings +from app.core.config import settings from app.helper.cloudflare import under_challenge from app.log import logger from app.utils.http import RequestUtils diff --git a/app/scheduler.py b/app/scheduler.py index 6450a7ab..384c9e5e 100644 --- a/app/scheduler.py +++ b/app/scheduler.py @@ -9,7 +9,7 @@ from app.chain.cookiecloud import CookieCloudChain from app.chain.douban_sync import DoubanSyncChain from app.chain.subscribe import SubscribeChain from app.chain.transfer import TransferChain -from app.core import settings +from app.core.config import settings from app.log import logger from app.utils.singleton import Singleton from app.utils.timer import TimerUtils diff --git a/tests/test_filter.py b/tests/test_filter.py index 61c14dd0..fded08ce 100644 --- a/tests/test_filter.py +++ b/tests/test_filter.py @@ -2,7 +2,7 @@ from unittest import TestCase -from app.core import TorrentInfo +from app.core.context import TorrentInfo from app.modules.filter import FilterModule diff --git a/tests/test_metainfo.py b/tests/test_metainfo.py index 5c198648..6132d628 100644 --- a/tests/test_metainfo.py +++ b/tests/test_metainfo.py @@ -2,7 +2,7 @@ from unittest import TestCase -from app.core import MetaInfo +from app.core.meta_info import MetaInfo from tests.cases.meta import meta_cases