refactor backend module architecture

This commit is contained in:
jxxghp
2026-08-14 15:45:38 +08:00
parent 557cc0e2e3
commit 7b3444c366
716 changed files with 10378 additions and 7709 deletions
+16 -15
View File
@@ -12,20 +12,21 @@ from fastapi.concurrency import run_in_threadpool
from qbittorrentapi import TorrentFilesList
from transmission_rpc import File
from app.core.cache import FileCache, AsyncFileCache, fresh, async_fresh
from app.core.config import settings
from app.core.context import Context, MediaInfo, MusicInfo, SubtitleInfo, TorrentInfo
from app.core.event import Event, EventManager
from app.core.meta import MetaBase, MetaMusic
from app.core.module import ModuleManager
from app.core.plugin import PluginManager
from app.platform.cache import FileCache, AsyncFileCache, fresh, async_fresh
from app.platform.config import settings
from app.domain.context import Context, MediaInfo, MusicInfo, SubtitleInfo, TorrentInfo
from app.platform.events import Event, EventManager
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.extensions.module_manager import ModuleManager
from app.extensions.plugin_manager import PluginManager
from app.db.message_oper import MessageOper
from app.db.systemconfig_oper import SystemConfigOper
from app.db.user_oper import UserOper
from app.helper.message import MessageHelper, MessageQueueManager, MessageTemplateHelper
from app.helper.server import MoviePilotServerHelper
from app.helper.service import ServiceConfigHelper
from app.log import logger
from app.messaging.message import MessageHelper, MessageQueueManager, MessageTemplateHelper
from app.integrations.server import MoviePilotServerHelper
from app.extensions.service_registry import ServiceConfigHelper
from app.platform.log import logger
from app.schemas import (
RateLimitExceededException,
TransferInfo,
@@ -40,8 +41,8 @@ from app.schemas import (
TransferDirectoryConf,
MessageResponse,
)
from app.utils.identity import normalize_internal_user_id
from app.utils.media import resolve_media_identity
from app.foundation.identity import normalize_internal_user_id
from app.domain.media import resolve_media_identity
from app.schemas.message import ChannelCapability, ChannelCapabilityManager
from app.schemas.category import CategoryConfig
from app.schemas.types import (
@@ -55,7 +56,7 @@ from app.schemas.types import (
MediaSource,
SystemConfigKey,
)
from app.utils.object import ObjectUtils
from app.foundation.object import ObjectUtils
class ChainBase(metaclass=ABCMeta):
@@ -2088,7 +2089,7 @@ class ChainBase(metaclass=ABCMeta):
"""
if channel == MessageChannel.WebAgent:
try:
from app.helper.agent import edit_web_agent_message
from app.messaging.agent import edit_web_agent_message
return edit_web_agent_message(
user_id=str((metadata or {}).get("userid") or ""),
+1 -1
View File
@@ -2,7 +2,7 @@ from typing import Optional
from app import schemas
from app.chain import ChainBase
from app.core.context import MediaInfo
from app.domain.context import MediaInfo
class AniListChain(ChainBase):
+1 -1
View File
@@ -2,7 +2,7 @@ from typing import Optional, List
from app import schemas
from app.chain import ChainBase
from app.core.context import MediaInfo
from app.domain.context import MediaInfo
class BangumiChain(ChainBase):
+2 -2
View File
@@ -2,8 +2,8 @@ from typing import Any, List, Optional
from app import schemas
from app.chain import ChainBase
from app.core.context import MediaInfo, MusicAlbumInfo, MusicInfo
from app.core.meta import MetaMusic
from app.domain.context import MediaInfo, MusicAlbumInfo, MusicInfo
from app.domain.meta.metamusic import MetaMusic
from app.schemas import MediaType
from app.schemas.types import MUSIC_ENTITY_ALBUM, MediaSource
+15 -14
View File
@@ -13,33 +13,34 @@ from app import schemas
from app.chain import ChainBase
from app.chain.media import MediaChain
from app.chain.storage import StorageChain
from app.core.cache import FileCache
from app.core.config import settings, global_vars
from app.core.context import (
from app.platform.cache import FileCache
from app.platform.config import settings, global_vars
from app.domain.context import (
Context,
MediaInfo,
MusicInfo,
SubtitleInfo,
TorrentInfo,
)
from app.core.event import eventmanager, Event
from app.core.meta import MetaBase, MetaMusic
from app.core.metainfo import MetaInfo
from app.platform.events import eventmanager, Event
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfo
from app.db.downloadfailure_oper import DownloadFailureOper
from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.mediaserver_oper import MediaServerOper
from app.helper.directory import DirectoryHelper, validate_download_save_path
from app.helper.thread import ThreadHelper
from app.helper.torrent import TorrentHelper
from app.log import logger
from app.services.directory import DirectoryHelper, validate_download_save_path
from app.platform.thread import ThreadHelper
from app.services.torrent import TorrentHelper
from app.platform.log import logger
from app.schemas import ExistMediaInfo, FileURI, NotExistMediaInfo, DownloaderTorrent, Notification, ResourceSelectionEventData, \
ResourceDownloadEventData
from app.schemas.types import MUSIC_ENTITY_ALBUM, MediaSource, MediaType, TorrentStatus, EventType, MessageChannel, NotificationType, ContentType, \
ChainEventType
from app.utils.http import RequestUtils
from app.utils.media import build_media_key, resolve_media_identity
from app.utils.string import StringUtils
from app.utils.system import SystemUtils
from app.foundation.http import RequestUtils
from app.domain.media import build_media_key, resolve_media_identity
from app.domain.string import StringUtils
from app.infrastructure.system import SystemUtils
DOWNLOAD_FAILURE_RESOURCE_TTL_SECONDS = 24 * 60 * 60
+1 -1
View File
@@ -1,7 +1,7 @@
from typing import Any
from app.chain import ChainBase
from app.core.context import MusicInfo
from app.domain.context import MusicInfo
from app.schemas.types import MUSIC_ENTITY_RECORDING, MediaSource
+2 -2
View File
@@ -1,8 +1,8 @@
from typing import Optional, Union
from app.chain import ChainBase
from app.core.context import MusicInfo, MusicLyrics
from app.core.meta import MetaMusic
from app.domain.context import MusicInfo, MusicLyrics
from app.domain.meta.metamusic import MetaMusic
class LrclibChain(ChainBase):
+12 -11
View File
@@ -12,20 +12,21 @@ from app.chain.acoustid import AcoustIdChain
from app.chain.douban import DoubanChain
from app.chain.musicbrainz import MusicBrainzChain, _MusicMetadataSourceChain
from app.chain.theaudiodb import TheAudioDbChain
from app.core.cache import async_fresh, fresh
from app.core.config import settings
from app.core.context import (
from app.platform.cache import async_fresh, fresh
from app.platform.config import settings
from app.domain.context import (
Context,
MediaInfo,
MusicAlbumInfo,
MusicArtistInfo,
MusicInfo,
)
from app.core.event import eventmanager, Event
from app.core.meta import MetaBase, MetaMusic
from app.core.metainfo import MetaInfo, MetaInfoPath
from app.helper.audio import AudioMetadataHelper
from app.log import logger
from app.platform.events import eventmanager, Event
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfo, MetaInfoPath
from app.services.audio import AudioMetadataHelper
from app.platform.log import logger
from app.schemas import FileItem
from app.schemas.types import (
MUSIC_ENTITY_ALBUM,
@@ -36,13 +37,13 @@ from app.schemas.types import (
MediaSourceSelection,
MediaType,
)
from app.utils.media import (
from app.domain.media import (
is_music_media_source,
normalize_media_source,
resolve_media_identity,
)
from app.utils.singleton import Singleton
from app.utils.string import StringUtils
from app.foundation.singleton import Singleton
from app.domain.string import StringUtils
recognize_lock = Lock()
+4 -4
View File
@@ -3,13 +3,13 @@ from datetime import datetime
from typing import Callable, Dict, List, Union, Optional, Generator, Any
from app.chain import ChainBase
from app.core.config import global_vars
from app.platform.config import global_vars
from app.db.mediaserver_oper import MediaServerOper
from app.helper.service import ServiceConfigHelper
from app.log import logger
from app.extensions.service_registry import ServiceConfigHelper
from app.platform.log import logger
from app.schemas import MediaServerLibrary, MediaServerItem, MediaServerSeasonInfo, MediaServerPlayItem
from app.schemas.types import MediaType
from app.utils.security import SecurityUtils
from app.security.url import SecurityUtils
lock = threading.Lock()
+11 -11
View File
@@ -11,7 +11,7 @@ from pathlib import Path
from typing import Any, Optional, Dict, Union, List, Tuple
from urllib.parse import unquote, urlparse
from app.agent import ReplyMode, agent_manager
from app.agent.orchestrator import ReplyMode, agent_manager
from app.agent.llm import AgentCapabilityManager, LLMHelper
from app.agent.prompt.transfer_redo import build_manual_redo_prompt
from app.chain import ChainBase
@@ -22,28 +22,28 @@ from app.chain.site import SiteChain, site_interaction_manager
from app.chain.skills import SkillsChain, skills_interaction_manager
from app.chain.subscribe import SubscribeChain, subscribe_interaction_manager
from app.chain.transfer import TransferChain
from app.core.config import settings, global_vars
from app.core.context import MediaInfo, Context
from app.core.meta import MetaBase
from app.platform.config import settings, global_vars
from app.domain.context import MediaInfo, Context
from app.domain.meta.metabase import MetaBase
from app.db.models import TransferHistory
from app.db.transferhistory_oper import TransferHistoryOper
from app.db.user_oper import UserOper
from app.helper.directory import DirectoryHelper
from app.helper.interaction import (
from app.services.directory import DirectoryHelper
from app.messaging.interaction import (
agent_interaction_manager,
media_interaction_manager,
plugin_input_interaction_manager,
PendingMediaInteraction,
)
from app.helper.torrent import TorrentHelper
from app.log import logger
from app.services.torrent import TorrentHelper
from app.platform.log import logger
from app.schemas import CommingMessage, DownloadDirectory, FileURI, NotExistMediaInfo, Notification
from app.schemas.message import ChannelCapabilityManager, ChannelCapability
from app.schemas.system import TransferDirectoryConf
from app.schemas.types import EventType, MessageChannel, MediaType
from app.utils.http import RequestUtils
from app.utils.media import build_media_key, resolve_media_identity
from app.utils.string import StringUtils
from app.foundation.http import RequestUtils
from app.domain.media import build_media_key, resolve_media_identity
from app.domain.string import StringUtils
class MessageChain(ChainBase):
+2 -2
View File
@@ -1,8 +1,8 @@
from typing import Any, Optional
from app.chain import ChainBase
from app.core.context import MusicAlbumInfo, MusicArtistInfo, MusicInfo
from app.core.meta import MetaMusic
from app.domain.context import MusicAlbumInfo, MusicArtistInfo, MusicInfo
from app.domain.meta.metamusic import MetaMusic
from app.schemas.types import MediaSource, MediaType
+8 -8
View File
@@ -7,20 +7,20 @@ from app.chain.bangumi import BangumiChain
from app.chain.douban import DoubanChain
from app.chain.listenbrainz import ListenBrainzChain
from app.chain.tmdb import TmdbChain
from app.core.cache import cached, fresh
from app.core.config import settings, global_vars
from app.core.context import MusicInfo
from app.helper.image import ImageHelper
from app.log import logger
from app.platform.cache import cached, fresh
from app.platform.config import settings, global_vars
from app.domain.context import MusicInfo
from app.services.image import ImageHelper
from app.platform.log import logger
from app.schemas import MediaType
from app.schemas.types import (
MUSIC_ENTITY_ALBUM,
MUSIC_ENTITY_RECORDING,
MediaSource,
)
from app.utils.common import log_execution_time
from app.utils.media import normalize_media_source
from app.utils.singleton import Singleton
from app.platform.execution import log_execution_time
from app.domain.media import normalize_media_source
from app.foundation.singleton import Singleton
class RecommendChain(ChainBase, metaclass=Singleton):
+14 -13
View File
@@ -13,21 +13,22 @@ from app import schemas
from app.chain import ChainBase
from app.chain.lrclib import LrclibChain
from app.chain.storage import StorageChain
from app.core.cache import async_fresh, cached, fresh
from app.core.config import settings
from app.core.context import (
from app.platform.cache import async_fresh, cached, fresh
from app.platform.config import settings
from app.domain.context import (
Context,
MediaInfo,
MusicAlbumInfo,
MusicInfo,
MusicLyrics,
)
from app.core.event import eventmanager, Event
from app.core.meta import MetaBase, MetaMusic
from app.core.metainfo import MetaInfo, MetaInfoPath
from app.platform.events import eventmanager, Event
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfo, MetaInfoPath
from app.db.systemconfig_oper import SystemConfigOper
from app.helper.audio import AudioMetadataHelper
from app.log import logger
from app.services.audio import AudioMetadataHelper
from app.platform.log import logger
from app.schemas import FileItem
from app.schemas.types import (
MUSIC_ENTITY_ALBUM,
@@ -41,15 +42,15 @@ from app.schemas.types import (
ScrapingPolicy,
SystemConfigKey,
)
from app.utils.http import RequestUtils
from app.utils.media import (
from app.foundation.http import RequestUtils
from app.domain.media import (
is_music_media_source,
normalize_media_source,
resolve_media_identity,
)
from app.utils.mixins import ConfigReloadMixin
from app.utils.singleton import Singleton
from app.utils.string import StringUtils
from app.platform.reload import ConfigReloadMixin
from app.foundation.singleton import Singleton
from app.domain.string import StringUtils
from app.chain.media import MediaChain
+15 -15
View File
@@ -14,18 +14,18 @@ from fastapi.concurrency import run_in_threadpool
from app.chain import ChainBase
from app.chain.media import MediaChain
from app.core.config import global_vars, settings
from app.core.context import Context
from app.core.context import MediaInfo, SubtitleInfo, TorrentInfo
from app.core.event import eventmanager, Event
from app.core.meta import MetaMusic
from app.core.metainfo import MetaInfo
from app.core.context import MusicInfo
from app.platform.config import global_vars, settings
from app.domain.context import Context
from app.domain.context import MediaInfo, SubtitleInfo, TorrentInfo
from app.platform.events import eventmanager, Event
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfo
from app.domain.context import MusicInfo
from app.db.systemconfig_oper import SystemConfigOper
from app.helper.progress import ProgressHelper
from app.helper.sites import SitesHelper # noqa
from app.helper.torrent import TorrentHelper
from app.log import logger
from app.platform.progress import ProgressHelper
from app.infrastructure.sites import SitesHelper # noqa
from app.services.torrent import TorrentHelper
from app.platform.log import logger
from app.schemas import NotExistMediaInfo
from app.schemas.types import (
MUSIC_ENTITY_ALBUM,
@@ -35,13 +35,13 @@ from app.schemas.types import (
ProgressKey,
SystemConfigKey,
)
from app.utils.media import (
from app.domain.media import (
build_media_key,
parse_media_key,
resolve_media_identity,
)
from app.utils.string import StringUtils
from app.utils.zhconv import convert as zhconv_convert
from app.domain.string import StringUtils
from app.foundation.zhconv import convert as zhconv_convert
class SearchChain(ChainBase):
@@ -513,7 +513,7 @@ class SearchChain(ChainBase):
"""
通过统一后台提示词机制执行资源推荐
"""
from app.agent import ReplyMode, agent_manager
from app.agent.orchestrator import ReplyMode, agent_manager
from app.agent.prompt import prompt_manager
prompt = prompt_manager.render_system_task_message(
+13 -13
View File
@@ -4,20 +4,20 @@ from datetime import datetime
from typing import Callable, List, Optional, Tuple, Union, Dict
from urllib.parse import urljoin
from app.helper.sites import SitesHelper # noqa
from app.infrastructure.sites import SitesHelper # noqa
from lxml import etree
from app.chain import ChainBase
from app.core.config import global_vars, settings
from app.core.event import Event, eventmanager
from app.platform.config import global_vars, settings
from app.platform.events import Event, eventmanager
from app.db.models.site import Site
from app.db.site_oper import SiteOper
from app.db.systemconfig_oper import SystemConfigOper
from app.helper.browser import PlaywrightHelper
from app.helper.cloudflare import under_challenge
from app.helper.cookie import CookieHelper
from app.helper.cookiecloud import CookieCloudHelper
from app.helper.interaction import (
from app.infrastructure.browser import PlaywrightHelper
from app.infrastructure.cloudflare import under_challenge
from app.security.cookie import CookieHelper
from app.integrations.cookiecloud import CookieCloudHelper
from app.messaging.interaction import (
SlashInteractionManager,
build_navigation_buttons,
format_markdown_table,
@@ -26,13 +26,13 @@ from app.helper.interaction import (
supports_markdown,
update_or_post_message,
)
from app.helper.rss import RssHelper
from app.log import logger
from app.infrastructure.rss import RssHelper
from app.platform.log import logger
from app.schemas import MessageChannel, Notification, SiteUserData
from app.schemas.types import EventType, NotificationType
from app.utils.http import RequestUtils
from app.utils.site import SiteUtils
from app.utils.string import StringUtils
from app.foundation.http import RequestUtils
from app.domain.site import SiteUtils
from app.domain.string import StringUtils
site_interaction_manager = SlashInteractionManager()
+2 -2
View File
@@ -2,13 +2,13 @@ import re
from typing import List, Optional, Tuple, Union
from app.chain import ChainBase
from app.helper.interaction import (
from app.messaging.interaction import (
build_navigation_buttons,
page_items,
supports_interaction_buttons,
update_or_post_message, skills_interaction_manager, PendingSkillsInteraction,
)
from app.helper.skill import SkillHelper, SkillInfo
from app.agent.skills.registry import SkillHelper, SkillInfo
from app.schemas import Notification
from app.schemas.types import MessageChannel
+3 -3
View File
@@ -3,9 +3,9 @@ from typing import Optional, Tuple, List, Dict
from app import schemas
from app.chain import ChainBase
from app.core.config import settings
from app.helper.directory import DirectoryHelper
from app.log import logger
from app.platform.config import settings
from app.services.directory import DirectoryHelper
from app.platform.log import logger
class StorageChain(ChainBase):
+13 -12
View File
@@ -15,23 +15,24 @@ from app.chain.mediaserver import MediaServerChain
from app.chain.search import SearchChain
from app.chain.tmdb import TmdbChain
from app.chain.torrents import TorrentsChain
from app.core.config import settings, global_vars
from app.core.context import (
from app.platform.config import settings, global_vars
from app.domain.context import (
Context,
MediaInfo,
MusicInfo,
TorrentInfo,
)
from app.core.event import eventmanager, Event
from app.core.meta import MetaBase, MetaMusic
from app.core.meta.words import WordsMatcher
from app.core.metainfo import MetaInfo
from app.platform.events import eventmanager, Event
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.domain.meta.words import WordsMatcher
from app.domain.metainfo import MetaInfo
from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.models.subscribe import Subscribe
from app.db.site_oper import SiteOper
from app.db.subscribe_oper import SubscribeOper
from app.db.systemconfig_oper import SystemConfigOper
from app.helper.interaction import (
from app.messaging.interaction import (
SlashInteractionManager,
build_navigation_buttons,
format_markdown_table,
@@ -40,15 +41,15 @@ from app.helper.interaction import (
supports_markdown,
update_or_post_message,
)
from app.helper.mediaserver import MediaServerHelper
from app.helper.server import MoviePilotServerHelper
from app.helper.torrent import TorrentHelper
from app.log import logger
from app.services.mediaserver import MediaServerHelper
from app.integrations.server import MoviePilotServerHelper
from app.services.torrent import TorrentHelper
from app.platform.log import logger
from app.schemas import (SubscribeEpisodesRefreshEventData,
SubscribeCompletionCheckEventData)
from app.schemas.types import MUSIC_ENTITY_ALBUM, MUSIC_ENTITY_RECORDING, MediaSource, MediaType, SystemConfigKey, MessageChannel, NotificationType, EventType, ChainEventType, \
ContentType
from app.utils.media import (
from app.domain.media import (
MUSIC_SUBSCRIBABLE_TYPES,
build_media_key,
normalize_media_source,
+6 -6
View File
@@ -5,13 +5,13 @@ from pathlib import Path
from typing import Union, Optional
from app.chain import ChainBase
from app.core.config import settings
from app.core.plugin import PluginManager
from app.helper.system import SystemHelper
from app.log import logger
from app.platform.config import settings
from app.extensions.plugin_manager import PluginManager
from app.platform.runtime import SystemHelper
from app.platform.log import logger
from app.schemas import Notification, MessageChannel
from app.utils.http import RequestUtils
from app.utils.system import SystemUtils
from app.foundation.http import RequestUtils
from app.infrastructure.system import SystemUtils
from version import FRONTEND_VERSION, APP_VERSION
+1 -1
View File
@@ -3,7 +3,7 @@ from typing import Optional, List
from app import schemas
from app.chain import ChainBase
from app.core.context import MediaInfo
from app.domain.context import MediaInfo
from app.schemas import MediaType
+11 -11
View File
@@ -3,24 +3,24 @@ import re
import traceback
from typing import Callable, Dict, List, Union, Optional
from app.helper.sites import SitesHelper # noqa
from app.infrastructure.sites import SitesHelper # noqa
from app.chain import ChainBase
from app.chain.media import MediaChain
from app.core.config import settings, global_vars
from app.core.context import TorrentInfo, Context, MediaInfo
from app.core.context import MusicInfo
from app.core.meta import MetaMusic
from app.core.metainfo import MetaInfo
from app.platform.config import settings, global_vars
from app.domain.context import TorrentInfo, Context, MediaInfo
from app.domain.context import MusicInfo
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfo
from app.db.site_oper import SiteOper
from app.db.systemconfig_oper import SystemConfigOper
from app.helper.rss import RssHelper
from app.helper.torrent import TorrentHelper
from app.log import logger
from app.infrastructure.rss import RssHelper
from app.services.torrent import TorrentHelper
from app.platform.log import logger
from app.schemas import Notification
from app.schemas.types import SystemConfigKey, MessageChannel, NotificationType, MediaType
from app.utils.media import resolve_media_identity
from app.utils.string import StringUtils
from app.domain.media import resolve_media_identity
from app.domain.string import StringUtils
class TorrentsChain(ChainBase):
+19 -18
View File
@@ -10,31 +10,32 @@ from time import monotonic
from typing import List, Optional, Tuple, Union, Dict, Callable, Any
from app import schemas
from app.agent import ReplyMode, prompt_manager, agent_manager
from app.agent.orchestrator import ReplyMode, agent_manager, prompt_manager
from app.chain import ChainBase
from app.chain.media import MediaChain
from app.chain.storage import StorageChain
from app.chain.subscribe import SubscribeChain
from app.chain.tmdb import TmdbChain
from app.core.config import settings, global_vars
from app.core.context import MediaInfo, MusicInfo
from app.core.event import eventmanager
from app.core.meta import MetaBase, MetaMusic
from app.core.metainfo import MetaInfoPath
from app.platform.config import settings, global_vars
from app.domain.context import MediaInfo, MusicInfo
from app.platform.events import eventmanager
from app.domain.meta.metabase import MetaBase
from app.domain.meta.metamusic import MetaMusic
from app.domain.metainfo import MetaInfoPath
from app.db.downloadhistory_oper import DownloadHistoryOper
from app.db.models.downloadhistory import DownloadHistory, DownloadFiles
from app.db.models.transferhistory import TransferHistory
from app.db.systemconfig_oper import SystemConfigOper
from app.db.transferpending_oper import TransferPendingOper
from app.db.transferhistory_oper import TransferHistoryOper
from app.helper.directory import DirectoryHelper
from app.helper.audio import AudioMetadataHelper
from app.helper.format import EpisodeFormatRuleHelper, FormatParser
from app.helper.progress import ProgressHelper
from app.helper.transferhistory import (clear_transfer_failures, describe_history_gate,
from app.services.directory import DirectoryHelper
from app.services.audio import AudioMetadataHelper
from app.services.formatting import EpisodeFormatRuleHelper, FormatParser
from app.platform.progress import ProgressHelper
from app.services.history import (clear_transfer_failures, describe_history_gate,
evaluate_history_gate, is_skip_action,
record_transfer_failure, resolve_history)
from app.log import logger
from app.platform.log import logger
from app.schemas import StorageOperSelectionEventData
from app.schemas import (
TransferInfo,
@@ -63,15 +64,15 @@ from app.schemas.types import (
MUSIC_ENTITY_RECORDING,
MediaSource,
)
from app.utils.mixins import ConfigReloadMixin
from app.utils.media import (
from app.platform.reload import ConfigReloadMixin
from app.domain.media import (
normalize_media_source,
normalize_music_type,
resolve_media_identity,
)
from app.utils.singleton import Singleton
from app.utils.string import StringUtils
from app.utils.system import SystemUtils
from app.foundation.singleton import Singleton
from app.domain.string import StringUtils
from app.infrastructure.system import SystemUtils
# 下载器锁
downloader_lock = threading.Lock()
@@ -4001,7 +4002,7 @@ class TransferChain(ChainBase, ConfigReloadMixin, metaclass=Singleton):
raise OperationInterrupted()
file_path = Path(file_item.path)
# 自动整理按 app/helper/transferhistory.py 的统一判定去重(失败记录放行重试、
# 自动整理按 app/services/history.py 的统一判定去重(失败记录放行重试、
# 成功但源文件已变化放行交 overwrite_mode 决断);手动整理可清理失败记录,
# 或按用户确认清理成功记录。
if (not force or reorganize) and not preview:
+4 -4
View File
@@ -3,14 +3,14 @@ from dataclasses import dataclass
from typing import Literal, Optional, Tuple, Union
from app.chain import ChainBase
from app.core.config import settings
from app.core.security import get_password_hash, verify_password
from app.platform.config import settings
from app.security.access import get_password_hash, verify_password
from app.db.models.user import User
from app.db.user_oper import UserOper
from app.log import logger
from app.platform.log import logger
from app.schemas import AuthCredentials, AuthInterceptCredentials
from app.schemas.types import ChainEventType
from app.utils.otp import OtpUtils
from app.security.otp import OtpUtils
PASSWORD_INVALID_CREDENTIALS_MESSAGE = "用户名、密码或验证码错误"
+3 -3
View File
@@ -13,11 +13,11 @@ from typing import Any, Callable, List, Optional, Tuple
from pydantic import BaseModel
from app.chain import ChainBase
from app.core.config import global_vars
from app.core.event import Event, eventmanager
from app.platform.config import global_vars
from app.platform.events import Event, eventmanager
from app.db.models import Workflow
from app.db.workflow_oper import WorkflowOper
from app.log import logger
from app.platform.log import logger
from app.schemas import ActionContext, ActionFlow, Action, ActionExecution, ActionResult
from app.schemas.types import EventType
from app.workflow import WorkFlowManager