
后端前端音视频【免费下载链接】Auto_BangumiAutoBangumi - 全自动追番工具项目地址https://gitcode.com/gh_mirrors/au/Auto_Bangumi点击查看免费下载AutoBangumi 3.12023-08是一次影响深远的架构升级后端新增了独立管理 RSS 订阅与种子的RSS Engine模块、可插拔的Search Engine搜索模块前端同步引入 i18n、PWA 与 RSS 管理页面并完成前后端仓库合并与数据库层迁移到sqlmodel。本文以 docs/changelog/3.1.md 为骨架结合当前仓库源码逐项还原这些能力的实现细节、API 形态与使用方式帮助读者理解 AutoBangumi 全自动追番流水线的核心骨架并能在自己的部署中正确配置订阅、搜索与批量管理。3.1 版本概况仓库、发布与文档的三线重构3.1 版本在功能之外做了三项工程化调整直接决定了后续版本的开发与维护方式合并后端和前端仓库优化项目目录结构当前仓库根目录下backend/FastAPI 异步 SQLModel 后端与webui/Vue 3 Vite 前端并存正是这次合并的产物。backend/src/module/下按api/、database/、parser/、rss/、searcher/、downloader/、notification/等域组织前后端共用一套发布流程。优化版本发布工作流程仓库内 scripts/generate-beta-notes.sh 等脚本承担了版本说明生成等发布辅助工作保证 changelog 与版本节奏一致。Wiki 迁移到 VitePress从 3.1 起文档体系迁移到 VitePress 站点docs/目录中的config/、deploy/、feature/、changelog/等分区即是该迁移后的沉淀。RSS Engine让 AutoBangumi 独立接管订阅、去重与投递3.1 最重要的后端能力是新增RSS Engine模块——在此之前的版本依赖外部工具维护 RSS 订阅3.1 起 AutoBangumi 可以独立更新和管理 RSS 订阅并将种子直接发送到下载器。该模块由 rss/engine.py 中的RSSEngine类与 rss/analyser.py 中的RSSAnalyser类共同构成前者负责订阅生命周期与种子投递后者负责把种子标题解析为番剧/电影数据。RSSItem 数据模型一次订阅的核心字段每一次 RSS 订阅在数据库中对应一条RSSItem记录定义于 models/rss.py字段类型默认值说明idint自增主键订阅 IDnamestr无订阅名称未指定时由引擎自动从 RSS 源读取channel/titleurlstrhttps://mikanani.meRSS 链接地址带唯一索引aggregateboolFalse是否聚合订阅源多字幕组合并订阅parserstrmikan标题/海报解析器类型合法值为mikan、tmdb、parserenabledboolTrue订阅是否启用connection_statusstr无最近一次抓取连接状态healthy/errorlast_checked_atstr无最近一次检查时间UTC ISO 8601last_errorstr无最近一次抓取错误信息connection_status、last_checked_at、last_error三个字段让管理员能在 UI 上直接看到每个订阅的健康状况而不仅是能不能下载。添加订阅自动读取标题与去重RSSEngine.add_rss()是订阅的入口engine.py。当用户不提供name时引擎会通过RequestContent.get_rss_title()request_contents.py请求 XML 并提取channel/title作为订阅名避免手动命名。去重逻辑在 database/rss.py 的RSSDatabase.add()中按 URL 判断URL 已存在时直接返回失败但若该订阅因删除番剧而被自动停用enabledFalse重新订阅同一 URL 会被视为恢复更新的意图自动重新启用——避免出现番剧静默断更的隐蔽故障。刷新流水线抓取、去重、匹配、投递RSSEngine.refresh_rss()engine.py是整条自动追番流水线的心脏完整流程为取活跃订阅未指定rss_id时通过db.rss.search_active()取全部启用的订阅指定时只刷新单条。并发抓取同主机限速按urlparse(item.url).netloc把订阅按主机分组asyncio.gather并行处理不同站点同一站点内每条订阅间隔RSS_PER_HOST_DELAY 2.0秒见 engine.py避免对同一站点瞬间爆发请求触发 HTTP 429 限流。整体并发由asyncio.Semaphore(5)控制。URL 级去重db.torrent.check_new()database/torrent.py按种子 URL 过滤掉数据库已存在的记录保证重复订阅的种子不会重复下载——即使同一个种子同时出现在多个聚合订阅源里也只处理一次。内存匹配每轮刷新只加载一次活跃番剧列表db.bangumi.search_all()逐种子调用match_torrent()匹配番剧。匹配命中且通过番剧filter排除规则用,分隔的关键词被编译为正则见_get_filter_pattern()的种子才挂上bangumi_id被排除的种子不会关联番剧避免影响后续 offset 建议计算。偏好去重对设置了preferred_group首选字幕组或preferred_resolution首选分辨率的番剧_select_preference_skips()会按内容身份 媒体类型 规范化季度 集数分组同一集只保留偏好得分最高、修订号更高的版本多字幕组不再重复下载同一集未设置偏好的番剧保持匹配即下载全部的旧行为。投递下载器通过client.add_torrent()投递到 qBittorrent / aria2 等下载客户端。AddResult.FAILED的种子不入库否则按 URL 去重后永远不会重试下一轮刷新时源中仍在则会重新匹配重试并发出DownloadFailureEvent通知ADDED与DUPLICATE下载器里已有同一种子都视为成功。状态回写每轮把connection_status/last_checked_at/last_error写回数据库仅在健康 → 故障转换时发送RssFailureEvent避免对持续故障的订阅每轮重复轰炸通知。订阅管理 API增删改查与手动刷新RSS Engine的 API 全部集中在 api/rss.py 的/rss路由下均需登录鉴权方法路径作用GET/rss列出全部订阅POST/rss/add添加订阅自动读取标题、按 URL 去重PATCH/rss/update/{rss_id}更新订阅名称/URL/聚合/解析器/启用状态PATCH/rss/disable/{rss_id}禁用单个订阅POST/rss/disable/many批量禁用POST/rss/enable/many批量启用DELETE/rss/delete/{rss_id}删除单个订阅同时清理引用该订阅的种子记录避免外键约束报错POST/rss/delete/many批量删除POST/rss/refresh/all手动刷新全部订阅POST/rss/refresh/{rss_id}手动刷新单个订阅GET/rss/torrent/{rss_id}查询某订阅已收录的种子POST/rss/analysis分析 RSS 链接返回解析出的番剧/电影数据POST/rss/collect按季节收集整季种子POST/rss/subscribe将搜索结果订阅为番剧其中/rss/refresh/all与/rss/refresh/{rss_id}即 changelog 中提到的RSS 订阅手动刷新 API批量端点/enable/many、/disable/many、/delete/many即批量管理 RSS 订阅 API。对应数据库层的enable_batch/disable_batch/delete_list实现见 database/rss.py。种子到番剧解析链路RSSAnalyserrss/analyser.py负责把种子标题解析为Bangumi或Movietorrents_to_data()逐种子调用TitleParser.raw_parser()提取番剧/电影身份并按(episode_type, title_raw, season)身份去重official_title_parser()根据订阅的parser字段决定标题与海报补全方式mikan解析器从 Mikan 主页抓取官方标题与海报tmdb解析器则通过 TMDB 按番剧原名、季度、语言本地化标题与海报补全后的官方标题会去除/:.\等路径非法字符re.sub(r[/:.\\], , ...)为后续重命名、落盘路径安全兜底。Search Engine插件式搜索引擎把搜索变成订阅3.1 的第二个新模块是Search Engine——按关键词搜索种子并将结果解析为收集或订阅任务。核心实现位于 searcher/searcher.py 的SearchTorrent类配合 searcher/provider.py 的站点适配层。插件式搜索源配置每个搜索源由ProviderConfigURL 模板 解析器描述默认配置定义在 conf/search_provider.py{ mikan: { url: https://mikanani.me/RSS/Search?searchstr%s, parser: mikan }, anibt: { url: https://anibt.net/rss/magnets.xml?q%s, parser: tmdb }, nyaa: { url: https://nyaa.si/?pagerssq%sc0_0f0, parser: tmdb }, dmhy: { url: http://dmhy.org/topics/rss/rss.xml?keyword%s, parser: tmdb } }URL 中的%s是搜索关键词占位符由search_url()用str.replace而非正则替换填入拼接后的关键词避免关键词中的正则特殊字符破坏模板parser字段决定搜索结果如何解析Mikan 源用mikan解析器其余站点统一用tmdb解析器做标题本地化与海报补全配置文件位于config/search_provider.json未存在时首次运行会自动生成默认配置。save_provider()保存后立即生效无需重启并兼容旧版{site: url}字符串格式——旧配置中已有站点缺失parser字段时按mikan 站点用 mikan其余用 tmdb补齐。搜索到订阅的完整链路SearchTorrent.analyse_keyword()searcher.py是搜索核心用关键词构造RSSItemsearch_url(site, keywords)拉取该站点的 RSS 种子列表逐种子解析为Bangumi/Movie此处跳过逐条 Mikan 主页抓取与海报下载保证交互式搜索响应迅速用special_url()根据已解析字段group_name、title_raw、season_raw、subtitle、source、dpi反查该番剧在站点上的专属订阅链接按专属链接去重后通过 TMDB 查询带 512 条上限的 LRU 缓存补全本地化标题与海报以json.dumps逐条yield配合 FastAPI 的EventSourceResponse实现流式返回前端边收边渲染。搜索结果前端选中后调用/rss/subscribe落库为正式订阅。api/rss.py 中的订阅端点有一个易踩的细节前端传上来的是站点名nyaa/dmhy而解析器只认识mikan/tmdb因此这里会按搜索源配置把站点名映射为其配置的解析器已是解析器类型的值包括与站点同名的mikan原样透传不做站点映射。字幕组特定规则订阅粒度的专属配置3.1 支持为单独的字幕组配置专属规则。在 AutoBangumi 中字幕组信息通过filter排除规则与番剧的preferred_group/preferred_resolution偏好共同作用番剧filter用,分隔多个关键词刷新时编译为正则过滤掉不需要的字幕组/版本_get_filter_pattern()非法正则自动降级为逐词转义的纯文本匹配preferred_group与preferred_resolution触发按集的偏好去重_select_preference_skips()让同集只留最优版本RSSEngine.download_bangumi()engine.py在手动下载整部番剧时同样套用filter与release_fits_bangumi()匹配校验。IPv6 监听支持changelog 提到在环境变量中设置IPV61即可开启 IPv6 监听。对应实现见 backend/src/main.pyif os.getenv(IPV6): host :: else: host os.getenv(HOST, 0.0.0.0)设置IPV61后 uvicorn 监听地址从默认的0.0.0.0仅 IPv4切换为::IPv6 双栈适用于纯 IPv6 或双栈网络环境下的部署。工程化变更sqlmodel、无缝更新与统一 API3.1 同时完成了一批影响运行期稳定性的基础设施改造数据库结构改用sqlmodel管理全部表模型RSSItem、Torrent、Bangumi等均由 SQLModel 定义异步会话封装在Database门面database/combine.py中每张表对应一个*Database仓储类。SQLite 写事务通过BEGIN IMMEDIATE串行化begin_write()避免并发写者读到不一致状态。版本管理与无缝更新数据库迁移与 schema 版本管理集中在 database/migrations.py配合update/模块在启动时自动执行迁移实现软件升级时数据无缝衔接。统一 API 格式API 响应统一为APIResponse/ResponseModel含msg_en与msg_zh双语消息字段u_response()帮助函数统一封装成功/失败返回。API 响应语言选项双语消息机制配合前端i18n不同语言环境的用户看到对应语言的错误提示。数据库 mock 测试3.1 起引入数据库层 mock 测试仓库backend/test/下test_database*.py、test_engine_wal.py等即是对该基础设施的持续验证。前端i18n、PWA 与 RSS 管理页3.1 前端的四项变化同样可以在当前仓库中验证i18n 支持webui/src/i18n/下的zh-CN.json与en.json即 3.1 引入的双语词条由useMyI18n组合式函数驱动。PWA 支持webui/public/下的pwa-192.png、pwa-512.png图标与webui/vite.config.ts中的 PWA 插件配置共同提供离线缓存与安装能力。RSS 管理页面webui/src/pages/index/下的订阅管理视图对接/rss系列 API支持列表查看、启停、删除与手动刷新。搜索顶栏webui/src/components/search/组件对接流式搜索 API展示实时搜索结果并可一键订阅。小结AutoBangumi 3.1 的价值在于把追番这件事的关键链路全部收归自身RSS Engine让订阅管理、去重、投递形成闭环Search Engine让搜索到订阅成为一条可配置的插件化流水线sqlmodel数据库层与版本迁移机制则为此后每一版的无缝升级奠定了基础。理解这一版的架构就理解了 AutoBangumi 后续版本聚合订阅 → 解析匹配 → 偏好去重 → 投递下载这条核心管线的骨架——无论是排查断更、调优字幕组偏好还是扩展搜索源都可以从本文涉及的 engine.py、searcher.py、search_provider.py 与 api/rss.py 出发深入探索。赞分享后端前端音视频【免费下载链接】Auto_BangumiAutoBangumi - 全自动追番工具项目地址https://gitcode.com/gh_mirrors/au/Auto_Bangumi点击查看免费下载相关推荐AutoBangumi 3.1 版本解析RSS Engine 与 Search Engine 双引擎架构及追番自动化能力详解AutoBangumi 3.1 版本解析RSS Engine 与 Search Engine 双引擎架构及追番自动化能力详解 本文以 AutoBangumi后端前端音视频Flutter Engine架构演进史从Sky Engine到现代跨平台解决方案Flutter Engine架构演进史从Sky Engine到现代跨平台解决方案 Flutter Engine作为谷歌跨平台开发框架的核心渲染引擎其架构设计跨平台图形学前端动画花园一站式跨平台追番解决方案如何革新你的观影体验动画花园一站式跨平台追番解决方案如何革新你的观影体验 在数字娱乐内容碎片化的今天动漫爱好者常常面临内容分散、平台限制、观影记录无法同步等痛点。动画花园A音视频移动开发视频创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考