{"id":20808409,"url":"https://github.com/std4453/mikanarr","last_synced_at":"2025-05-07T06:05:58.849Z","repository":{"id":42368486,"uuid":"359895303","full_name":"std4453/mikanarr","owner":"std4453","description":"Mikanarr, a bridge between Mikan Anime and Sonarr","archived":false,"fork":false,"pushed_at":"2023-02-14T00:37:39.000Z","size":3834,"stargazers_count":48,"open_issues_count":17,"forks_count":10,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-07T06:05:51.560Z","etag":null,"topics":["rss","sonarr","torrent"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/std4453.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-04-20T17:15:45.000Z","updated_at":"2025-02-19T07:04:25.000Z","dependencies_parsed_at":"2023-02-08T05:30:44.816Z","dependency_job_id":"beb9decb-0163-4c60-aa09-1411136e0edf","html_url":"https://github.com/std4453/mikanarr","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/std4453%2Fmikanarr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/std4453%2Fmikanarr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/std4453%2Fmikanarr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/std4453%2Fmikanarr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/std4453","download_url":"https://codeload.github.com/std4453/mikanarr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252823918,"owners_count":21809713,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rss","sonarr","torrent"],"created_at":"2024-11-17T19:48:32.311Z","updated_at":"2025-05-07T06:05:58.830Z","avatar_url":"https://github.com/std4453.png","language":"JavaScript","funding_links":[],"categories":["JavaScript"],"sub_categories":[],"readme":"# Mikanarr\n\n[![CircleCI](https://circleci.com/gh/std4453/mikanarr/tree/master.svg?style=svg)](https://circleci.com/gh/std4453/mikanarr/tree/master)\n\n*Mikanarr* 由 *Mikan Anime* 与 *Sonarr* 混合而成，负责打通两者之间的桥梁，作为自动下载动画的关键一步存在。\n\n关于整个媒体栈的详细信息，请参考 [我的博客](https://blog.std4453.com:444/nas-from-zero-media-part/) ，本文件仅阐述项目的使用方法。\n\n## 简介\n\n[Sonarr](https://sonarr.tv/) 基于 RSS 推送寻找符合需求的发布（*Release*）并下载，然而， [Mikan Anime](https://mikanani.me/) 的 RSS 推送格式与 Sonarr 接受的格式并不兼容，因此我们在前者的返回格式上进行变换，以符合后者的要求。\n\n此外， Sonarr 基于 RSS 推送项目的标题（*Title*）对项目对应的剧集、语言、制式进行识别，然而该识别算法并非完美，在标准化程度较差的日本动画中译领域尤甚，因此我们也对标题进行变换，以保证能够被 Sonarr 正确识别并抓取。\n\n该过程要求用户提供标题的模板格式以及对应的语言、制式信息，为了方便管理，我们提供了一套简单的前/后端系统用于操作。\n\n## 使用\n\n首先你需要一个正常运行且可访问的 Sonarr 实例，并 [获取 API Key](https://github.com/Sonarr/Sonarr/wiki/API) 。\n\n接着，创建并填写 `.env` 文件，如：\n\n```env\nSONARR_API_KEY=aaaabbbbccccddddeeeeffff1145141919810\nSONARR_HOST=https://sonarr.yourdomain.com/\nADMIN_USERNAME=mikanarr\nADMIN_PASSWORD=your_admin_password\n```\n\n`ADMIN_USERNAME` 和 `ADMIN_PASSWORD` 用于登陆系统，未登陆无法访问。\n\n然后运行（需要 Node.js 环境）：\n\n```bash\n$ yarn build\n$ yarn start\n```\n\n将会在 `12306` 端口运行服务器。\n\n此时，可以访问 `http://localhost:12306` 进入 Mikanarr 网页端：\n\n![Mikanarr 网页端截图](images/screenshot1.png)\n\n在网页中，你可以搜索、排序、添加、删除、编辑条目，主要需要填写的字段包括：\n\n- `Remote`: 远程地址，即 Mikan Anime 中对应剧集 （可以包含字幕组） 的 RSS 推送地址，选填。\n- `Pattern`: 标题模板，只有匹配至少一条的项目会被返回，模板本身为 [正则表达式](https://en.wikipedia.org/wiki/Regular_expression) ，表达式中需要包含 [命名捕获组](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges) （即 `(?\u003cepisode\u003e\\d+)` )，用于提供剧集信息。\n- `Series`: 系列名称，网页端会从 Sonarr 获取所有系列名称，如果没有找到需要的系列，可能需要首先在 Sonarr 中添加系列。\n- `Season`: 季度代码，网页端会从 Sonarr 获取所有季度，并显示其监视状态。\n- `Offset`: 剧集号偏移量，用于修复从第一季开始的序号和从本季开始的序号。如`-26`。\n- `Language`: 语言，为剧集对应语言的英文名，如 `Chinese`，需要符合系列所需的语言设定，否则无法被 Sonarr 抓取。\n- `Quality`: 质量，可用的值可以参考 [Sonarr 源码](https://github.com/Sonarr/Sonarr/blob/develop/src/NzbDrone.Core/Parser/QualityParser.cs) ，Sonarr 似乎不支持对 RSS 推送的项目自动检测质量，网页端默认填写的值为 `WEBDL 1080p`。\n\n在创建和编辑页面中，侧边栏会自动根据 *Remote* 字段中的地址获取 RSS 推送中的项目，并高亮显示与模板所匹配的项目：\n\n![Mikanarr 网页端截图](images/screenshot2.png)\n\n注意， `Pattern` 的内容为 **正则表达式** ，而种子标题中常见的 `[]` 为正则表达式中的特殊字符，需要进行转义处理，你可以点击输入框后的 ESCAPE 按钮快速转义输入框中的内容，或点击 EPISODE 按钮快速复制剧集的命名捕获组。\n\n举例说明，如果你想要抓取的剧集标题为：\n\n```\n[Lilith-Raws] 如果究极进化的完全沉浸 RPG 比现实还更像垃圾游戏的话 / Full Dive - 03 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]\n```\n\n将其黏贴到输入框后点击 ESCAPE，你会得到：\n\n```\n\\[Lilith-Raws\\] 如果究极进化的完全沉浸 RPG 比现实还更像垃圾游戏的话 / Full Dive - 03 \\[Baha\\]\\[WEB-DL\\]\\[1080p\\]\\[AVC AAC\\]\\[CHT\\]\\[MP4\\]\n```\n\n然后点击 EPISODE ，将框内的 `03` 替换为复制的内容，得到：\n\n```\n\\[Lilith-Raws\\] 如果究极进化的完全沉浸 RPG 比现实还更像垃圾游戏的话 / Full Dive - (?\u003cepisode\u003e\\d+) \\[Baha\\]\\[WEB-DL\\]\\[1080p\\]\\[AVC AAC\\]\\[CHT\\]\\[MP4\\]\n```\n\n再正确填入其他字段，你就完成了一条抓取模板的编辑。\n\n当然，更方便的方法是找到 Mikan Anime 上对应的 RSS 推送地址，填入 *Remote* 字段后，在侧边栏中选择所需的条目，即可完成前两步操作。\n\n---\n\n为了获取变换后的的 RSS 推送，你可以将 Mikan Anime 的域名部分（`mikanani.me`）直接替换为 Mikanarr 部署的域名，比如从：\n\n```\nhttps://mikanani.me/RSS/MyBangumi?token=\u003c你的个人Token\u003e\n```\n\n得到：\n\n```\nhttps://\u003cMikanarr域名\u003e/RSS/MyBangumi?token=\u003c你的个人Token\u003e\n```\n\n将这一地址添加到 Sonarr 中，就能让他自动抓取你想要的剧集了，酷吧？\n\n如果你填入了 *Remote* 字段，也可以点击 *PROXY* 按钮一键拷贝。\n\n## 其他\n\n### 部署\n\n你可以使用 [Docker](https://www.docker.com/) 进行部署，我们的 Docker Image 在 [`std4453/mikanarr`](https://hub.docker.com/r/std4453/mikanarr) 。\n\n你也可以使用 [`build_docker.sh`](build_docker.sh) 自行构建 Docker Image。\n\n构建得到的镜像不包含 `.env` 文件，你需要在 `docker run` 的时候指定对应的环境变量。\n\n此外，数据文件不应包含在 Docker Image 和 Docker Container 中，你应当从宿主机将数据文件夹 `data/` 挂载到容器中的 `/usr/app/data` 。\n\n如果你使用 `docker-compose` ，这里有一份 `docker-compose.yml` 模板：\n\n```yaml\nversion: \"3.9\"\n\nservices:\n  mikanarr:\n    image: std4453/mikanarr\n    volumes:\n      - ./data:/usr/src/app/data\n    env_file: .env\n    restart: unless-stopped\n```\n\n这会使用同一份 `.env` 文件启动应用。\n\n### 安全\n\n- `/RSS` 开头的路径会用于转换 RSS 推送。\n- `/proxy` 用于允许前端请求 Mikan Anime 的 RSS 推送地址，仅允许请求 `https://mikanani.me` 域名下的 URL 。\n- `/sonarr` 用于反代对 Sonarr API 的请求，避免客户端保存 API Key 。\n- `/api` 开头的路径用于访问和操作数据。\n- 其他地址会得到 `build/` 下的对应静态文件，未找到则会得到 `index.html` 。由于前端使用了 Hash Router ，所有前端 HTML 请求应当仅访问 `/` 路径。\n\n考虑到实现的简单性，我们并没有对服务器进行访问控制，你可以基于上面的描述自行添加访问控制，比如 [HTTP Basic Auth](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication) 。其中 `/RSS` 下的路径需要由 Sonarr 访问，无法使用 HTTP Auth ，且不会直接暴露用户数据，可以考虑不进行访问控制。\n\n### 开发\n\n我们使用同一个 `package.json` 同时覆盖前端和后端代码，这不是良好的实践，但很方便。\n\n除此之外，以下文件构成一个基本的 [`create-react-app`](https://create-react-app.dev/) 应用：\n\n```\nsrc/\npublic/\nbuild/   （构建得到）\n```\n\n以下文件仅为后端代码使用：\n\n```\nserver/  \ndata/   （数据文件）\n.env    （配置文件）\n```\n\n进行前端开发时，你可以使用 `yarn dev:web` ，它使用 `react-scripts dev` 在本地启动一个 Dev Server 。\n\n为了访问后端 API ，前端开发时需要有一个运行中的后端服务器，你可以使用 `yarn dev:server` 或者直接 `yarn start` 来启动一个。我们假定开发时的后端地址为 `http://localhost:12306` ，你也可以更改 `package.json` 中的 `proxy` 字段来更改。\n\n`yarn dev:server` 也用于开发后端代码，它会使用 [`nodemon`](https://nodemon.io/) 监听 `server/` 中的文件，当文件改变时自动重启服务器。开发后端时不需要运行中的前端实例。\n\n构建完成之后后端服务器会直接 serve 前端代码，届时只需要 `yarn start` 启动一份。\n\n## 作者\n\n张海川 - Haichuan Zhang - [me@std4453.com](mailto:me@std4453.com) - [Homepage](https://blog.std4453.com:444)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstd4453%2Fmikanarr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstd4453%2Fmikanarr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstd4453%2Fmikanarr/lists"}