From df2ce103e1247b7b7d1f65984cd0b677434b5c7b Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 26 Aug 2026 14:07:08 +0800 Subject: [PATCH] fix(architecture): move media auxiliary mixin into _base package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit media_auxiliary 作为模块共享 Mixin 放在 app/modules 顶层会被视为 业务模块,导致 anilist/bangumi/douban/imdb/themoviedb 跨模块直接 依赖,违反模块间禁止导入的架构约束。移入模块共享样板包 app/modules/_base(模块发现跳过)并同步依赖基线。 --- app/modules/{ => _base}/media_auxiliary.py | 0 app/modules/anilist/__init__.py | 2 +- app/modules/bangumi/__init__.py | 2 +- app/modules/douban/__init__.py | 2 +- app/modules/imdb/__init__.py | 2 +- app/modules/themoviedb/__init__.py | 2 +- .../architecture/dependency-baseline.json | 37 +++++++++++-------- tests/test_media_auxiliary.py | 2 +- 8 files changed, 27 insertions(+), 22 deletions(-) rename app/modules/{ => _base}/media_auxiliary.py (100%) diff --git a/app/modules/media_auxiliary.py b/app/modules/_base/media_auxiliary.py similarity index 100% rename from app/modules/media_auxiliary.py rename to app/modules/_base/media_auxiliary.py diff --git a/app/modules/anilist/__init__.py b/app/modules/anilist/__init__.py index 1c4474e06..e084d9728 100644 --- a/app/modules/anilist/__init__.py +++ b/app/modules/anilist/__init__.py @@ -10,7 +10,7 @@ from app.domain.meta.metabase import MetaBase from app.domain.scraper import MediaScraperHelper from app.modules import _ModuleBase from app.modules.anilist.anilist import AniListApi -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.runtime.log import logger from app.schemas.types import ( MediaRecognizeType, diff --git a/app/modules/bangumi/__init__.py b/app/modules/bangumi/__init__.py index 563177489..287a31728 100644 --- a/app/modules/bangumi/__init__.py +++ b/app/modules/bangumi/__init__.py @@ -12,7 +12,7 @@ from app.domain.meta.metabase import MetaBase from app.domain.scraper import MediaScraperHelper from app.modules import _ModuleBase from app.modules.bangumi.bangumi import BangumiApi -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.runtime.log import logger from app.schemas.types import ( MediaRecognizeType, diff --git a/app/modules/douban/__init__.py b/app/modules/douban/__init__.py index 7170efd27..5e1ca5524 100644 --- a/app/modules/douban/__init__.py +++ b/app/modules/douban/__init__.py @@ -21,7 +21,7 @@ from app.foundation.text import convert as zhconv_convert from app.modules import _ModuleBase from app.modules.douban.apiv2 import DoubanApi from app.modules.douban.scraper import DoubanScraper -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.runtime.execution import retry from app.runtime.log import logger from app.runtime.rate import rate_limit_exponential diff --git a/app/modules/imdb/__init__.py b/app/modules/imdb/__init__.py index 05cf48548..e332ad97f 100644 --- a/app/modules/imdb/__init__.py +++ b/app/modules/imdb/__init__.py @@ -11,7 +11,7 @@ from app.domain.meta.metabase import MetaBase from app.domain.scraper import MediaScraperHelper from app.foundation.text import convert as zhconv_convert from app.modules import _ModuleBase -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.runtime.settings import RuntimeSettingsCompat settings = RuntimeSettingsCompat() diff --git a/app/modules/themoviedb/__init__.py b/app/modules/themoviedb/__init__.py index b5e1c0ccf..d17b3756b 100644 --- a/app/modules/themoviedb/__init__.py +++ b/app/modules/themoviedb/__init__.py @@ -15,7 +15,7 @@ from app.domain.media import is_media_source_enabled, is_media_source_selected from app.domain.meta.metabase import MetaBase from app.foundation.text import convert as zhconv_convert from app.modules import _ModuleBase -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.modules.themoviedb.category import CategoryHelper from app.modules.themoviedb.scraper import TmdbScraper from app.modules.themoviedb.tmdb_cache import TmdbCache diff --git a/tests/fixtures/architecture/dependency-baseline.json b/tests/fixtures/architecture/dependency-baseline.json index f6040a470..acc28bd07 100644 --- a/tests/fixtures/architecture/dependency-baseline.json +++ b/tests/fixtures/architecture/dependency-baseline.json @@ -13,8 +13,8 @@ "runtime_to_db": [], "workflow_to_db": [] }, - "edge_count": 6804, - "edge_sha256": "3e9a93795c6cfb5bc78e4871ae7c11b064ec0a2ea4f545ce94a6c0c696800df4", + "edge_count": 6809, + "edge_sha256": "0e5ab6c1e8d428de4edbc0ee162f17130143946c483967aaf49bca8c7c75b105", "edges": [ "app -> app.runtime", "app -> app.runtime.compat", @@ -4113,6 +4113,14 @@ "app.modules._base.downloader -> app.runtime.log", "app.modules._base.downloader -> app.schemas", "app.modules._base.downloader -> app.schemas.types", + "app.modules._base.media_auxiliary -> app.domain", + "app.modules._base.media_auxiliary -> app.domain.context", + "app.modules._base.media_auxiliary -> app.domain.media", + "app.modules._base.media_auxiliary -> app.domain.meta", + "app.modules._base.media_auxiliary -> app.domain.meta.metabase", + "app.modules._base.media_auxiliary -> app.domain.metainfo", + "app.modules._base.media_auxiliary -> app.schemas", + "app.modules._base.media_auxiliary -> app.schemas.types", "app.modules._base.mediaserver -> app.application", "app.modules._base.mediaserver -> app.application.mediaserver", "app.modules._base.mediaserver -> app.domain", @@ -4154,8 +4162,9 @@ "app.modules.anilist -> app.domain.meta.metabase", "app.modules.anilist -> app.domain.scraper", "app.modules.anilist -> app.modules", + "app.modules.anilist -> app.modules._base", + "app.modules.anilist -> app.modules._base.media_auxiliary", "app.modules.anilist -> app.modules.anilist.anilist", - "app.modules.anilist -> app.modules.media_auxiliary", "app.modules.anilist -> app.runtime", "app.modules.anilist -> app.runtime.log", "app.modules.anilist -> app.runtime.settings", @@ -4179,8 +4188,9 @@ "app.modules.bangumi -> app.domain.meta.metabase", "app.modules.bangumi -> app.domain.scraper", "app.modules.bangumi -> app.modules", + "app.modules.bangumi -> app.modules._base", + "app.modules.bangumi -> app.modules._base.media_auxiliary", "app.modules.bangumi -> app.modules.bangumi.bangumi", - "app.modules.bangumi -> app.modules.media_auxiliary", "app.modules.bangumi -> app.runtime", "app.modules.bangumi -> app.runtime.log", "app.modules.bangumi -> app.runtime.settings", @@ -4251,9 +4261,10 @@ "app.modules.douban -> app.foundation", "app.modules.douban -> app.foundation.text", "app.modules.douban -> app.modules", + "app.modules.douban -> app.modules._base", + "app.modules.douban -> app.modules._base.media_auxiliary", "app.modules.douban -> app.modules.douban.apiv2", "app.modules.douban -> app.modules.douban.scraper", - "app.modules.douban -> app.modules.media_auxiliary", "app.modules.douban -> app.runtime", "app.modules.douban -> app.runtime.execution", "app.modules.douban -> app.runtime.log", @@ -4548,8 +4559,9 @@ "app.modules.imdb -> app.foundation", "app.modules.imdb -> app.foundation.text", "app.modules.imdb -> app.modules", + "app.modules.imdb -> app.modules._base", + "app.modules.imdb -> app.modules._base.media_auxiliary", "app.modules.imdb -> app.modules.imdb.api", - "app.modules.imdb -> app.modules.media_auxiliary", "app.modules.imdb -> app.runtime", "app.modules.imdb -> app.runtime.log", "app.modules.imdb -> app.runtime.settings", @@ -4920,14 +4932,6 @@ "app.modules.lrclib -> app.runtime.settings", "app.modules.lrclib -> app.schemas", "app.modules.lrclib -> app.schemas.types", - "app.modules.media_auxiliary -> app.domain", - "app.modules.media_auxiliary -> app.domain.context", - "app.modules.media_auxiliary -> app.domain.media", - "app.modules.media_auxiliary -> app.domain.meta", - "app.modules.media_auxiliary -> app.domain.meta.metabase", - "app.modules.media_auxiliary -> app.domain.metainfo", - "app.modules.media_auxiliary -> app.schemas", - "app.modules.media_auxiliary -> app.schemas.types", "app.modules.musicbrainz -> app.adapters", "app.modules.musicbrainz -> app.adapters.network", "app.modules.musicbrainz -> app.adapters.network.http", @@ -5260,7 +5264,8 @@ "app.modules.themoviedb -> app.foundation", "app.modules.themoviedb -> app.foundation.text", "app.modules.themoviedb -> app.modules", - "app.modules.themoviedb -> app.modules.media_auxiliary", + "app.modules.themoviedb -> app.modules._base", + "app.modules.themoviedb -> app.modules._base.media_auxiliary", "app.modules.themoviedb -> app.modules.themoviedb.category", "app.modules.themoviedb -> app.modules.themoviedb.scraper", "app.modules.themoviedb -> app.modules.themoviedb.tmdb_cache", @@ -7320,6 +7325,7 @@ "app.modules", "app.modules._base", "app.modules._base.downloader", + "app.modules._base.media_auxiliary", "app.modules._base.mediaserver", "app.modules._base.notification", "app.modules.acoustid", @@ -7388,7 +7394,6 @@ "app.modules.jellyfin.jellyfin", "app.modules.listenbrainz", "app.modules.lrclib", - "app.modules.media_auxiliary", "app.modules.musicbrainz", "app.modules.musicbrainz.music_cache", "app.modules.musixmatch", diff --git a/tests/test_media_auxiliary.py b/tests/test_media_auxiliary.py index 7060e486e..e82f9c5a6 100644 --- a/tests/test_media_auxiliary.py +++ b/tests/test_media_auxiliary.py @@ -6,7 +6,7 @@ from unittest.mock import patch from app.chain.search import SearchChain from app.domain.context import MediaInfo -from app.modules.media_auxiliary import MediaAuxiliaryProviderMixin +from app.modules._base.media_auxiliary import MediaAuxiliaryProviderMixin from app.schemas.types import MediaSource, MediaType