bgmi


Namebgmi JSON
Version 4.5.0 PyPI version JSON
download
home_pagehttps://github.com/BGmi/BGmi
SummaryBGmi is a cli tool for subscribed bangumi.
upload_time2024-04-17 17:25:45
maintainerTrim21
docs_urlNone
authorRicterZ
requires_python<4.0.0,>=3.8.0
licenseMIT
keywords bangumi bgmi feed
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # BGmi

BGmi 是一个用来追番的命令行程序.

[![](https://img.shields.io/pypi/v/bgmi.svg)](https://pypi.python.org/pypi/bgmi)
![](https://img.shields.io/pypi/pyversions/bgmi)
[![test](https://github.com/BGmi/BGmi/actions/workflows/test.yaml/badge.svg)](https://github.com/BGmi/BGmi/actions/workflows/test.yaml)
[![](https://codecov.io/gh/BGmi/BGmi/branch/master/graph/badge.svg)](https://codecov.io/gh/BGmi/BGmi/branch/master/graph/badge.svg)
[![](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/BGmi/BGmi/blob/master/LICENSE)

## TODO

## 更新日志

### v4

- 命令自动补全,使用 `bgmi completion zsh/bash` 生成
- 添加 `mikan_url` 配置,用于配置蜜柑计划镜像站。
- 添加 `proxy` 设置
- 新 WEB UI
- 将配置项 `transmission.rpc_url` 重命名为 `transmission.rpc_host`.
- 修复 Transmission 配置的默认值.

### v3

- 新增配置项 `global_include_keywords` ,用于设置全局包含关键词。
- 新增配置项 `save_path_map` ,用于设置不同动画的下载路径。
- 使用 [TOML](https://github.com/toml-lang/toml) 作为配置文件
- 不再支持 python3.7
- 不再支持 python3.6
- 支持[扩展下载方式](./docs/downloader.md)
- 移除迅雷离线
- 支持 [qbittorrent-webapi](https://www.qbittorrent.org/)
- 停止支持 python2,3.4 和 3.5
- Transmission rpc 认证设置
- 支持 [deluge-rpc](https://www.deluge-torrent.org/)
- 使用最大和最小集数筛选搜索结果

## 特性

- 多个数据源可选: [bangumi_moe](https://bangumi.moe), [mikan_project](https://mikanani.me) 或者[dmhy](https://share.dmhy.org/)
- 使用 aria2, transmission, qbittorrent 或者 deluge 来下载你的番剧.
- 提供一个管理和观看订阅番剧的前端.
- 弹幕支持
- 提供 uTorrent 支持的 RSS Feed 和移动设备支持的 ICS 格式日历.
- Bangumi Script: 添加自己的番剧解析器
- 番剧放松列表和剧集信息
- 下载番剧时的过滤器(支持关键词,字幕组和正则)
- 多平台支持: Windows, \*nux 以及 Router system

![](./images/bgmi_cli.png?raw=true)
![](https://github.com/BGmi/BGmi-frontend/raw/master/.github/images/example.png)
![](https://github.com/BGmi/BGmi-frontend/raw/master/.github/images/example2.png)

## 安装

使用 [pipx](https://pypa.github.io/pipx/) 安装(推荐):

```bash
pipx install bgmi
```

### 使用 pip 安装稳定版本:

```bash
pip install bgmi
```

### 或者从源码安装(不推荐)

```bash
git clone https://github.com/BGmi/BGmi
cd BGmi
git checkout master
python -m pip install -U pip
pip install .
```

### 初始化`BGmi`

```bash
bgmi install
```

## 升级(仅 pipx 安装)

```bash
pipx upgrade bgmi
bgmi upgrade
```

## 升级(仅 pip 安装)

```bash
pip install bgmi -U
bgmi upgrade
```

在升级后请确保运行`bgmi upgrade`

## 使用 Docker

见 [BGmi/bgmi-docker-all-in-one](https://github.com/BGmi/bgmi-docker-all-in-one)

## 使用

查看可用的命令

```bash
bgmi --help
```

**`--help`选项同样适用于所有的子命令,readme 仅介绍了一些基础用法。**

## 命令自动补全

### bash

```shell
bgmi completion bash > ~/.bash_completion.d/bgmi
```

### zsh

#### oh-my-zsh
```shell
bgmi completion zsh > .oh-my-zsh/completions/_bgmi
```

我不使用其他的 zsh 插件管理器,具体的安装方法请查询你使用的插件管理器文档

## 配置 BGmi

BGmi 提供两种方式配置BGmi的各项运行参数,分别为配置文件与环境变量。

### 配置文件
bgmi 的配置文件位于 `${BGMI_PATH}/config.toml`, 在未设置 `BGMI_PATH` 环境变量时,`${BGMI_PATH}` 默认为 `~/.bgmi/`。

查看当前 `BGmi` 设置:

```bash
bgmi config # 查看当前各项设置默认值.
```

```toml
data_source = "bangumi_moe" # bangumi source,!!! 请不要手动修改此选项 !!!
download_delegate = "aria2-rpc" # 番剧下载工具 (aria2-rpc, transmission-rpc, deluge-rpc, qbittorrent-webapi)
tmp_path = "tmp/tmp" # tmp dir
save_path = "tmp/bangumi" # 下载番剧保存地址
max_path = 3 # 抓取数据时每个番剧最大抓取页数
bangumi_moe_url = "https://bangumi.moe"
share_dmhy_url = "https://share.dmhy.org"
mikan_url = "https://mikanani.me"
mikan_username = "" # 蜜柑计划的用户名
mikan_password = "" # 蜜柑计划的密码
enable_global_filters = true
global_filters = [
    "Leopard-Raws",
    "hevc",
    "x265",
    "c-a Raws",
    "U3-Web",
]

proxy = '' # http proxy example: http://127.0.0.1:1080

[save_path_map] # 针对每部番剧设置下载路径
'致不灭的你 第二季' = '/home/trim21/downloads/bangumi/致不灭的你/s2/' # 如果使用绝对路径,可能导致 web-ui 无法正确显示视频文件。
'致不灭的你 第三季' = './致不灭的你/s3/' # 以 save_path 为基础路径的相对路径

[http]
admin_token = "dYMj-Z4bDRoQfd3x" # web ui 的密码
danmaku_api_url = ""
serve_static_files = false

[aria2]
rpc_url = "http://localhost:6800/rpc" # aria2c RPC URL (不是 jsonrpc URL, 如果你的 aria2c 运行在 localhost:6800, 对应的链接为 `http://localhost:6800/rpc`)
rpc_token = "token:" # aria2c RPC token (如果没有设置 token, 留空或者设置为 `token:`)

[transmission]
rpc_host = "127.0.0.1"
rpc_port = 9091
rpc_username = "your_username"
rpc_password = "your_password"
rpc_path = "/transmission/rpc" # transmission http rpc 的请求路径

[qbittorrent]
rpc_host = "127.0.0.1"
rpc_port = 8080
rpc_username = "admin"
rpc_password = "adminadmin"
category = ""

[deluge]
rpc_url = "http://127.0.0.1:8112/json"
rpc_password = "deluge"
```

### 环境变量
当 BGmi 的配置文件还未初始化时,各项运行参数可由环境变量进行配置

环境变量以 `BGMI_` 开头,全大写命名,且各级配置以 `_` 进行分割,如:
```
BGMI_DATA_SOURCE=bangumi_moe    # 对应配置文件中的 data_source = "bangumi_moe"
BGMI_HTTP_ADMIN_TOKEN=dYMj-Z4bDRoQfd3x    # 对应配置文件 [http] 分段中的 admin_token = "dYMj-Z4bDRoQfd3x"
...
```

环境变量 *暂不支持* 配置以下项目
```
enable_global_include_keywords
enable_global_filters
global_include_keywords
global_filters
[save_path_map]
```
注: 当配置文件生成完毕后,运行配置将会以配置文件为准,环境变量仅用于生成第一份配置文件。

## 修改配置

使用 `bgmi config set ...keys  --value '...'` 命令可以修改配置。

如:

```shell
bgmi config set http admin_token --value 'my super secret token'
```

或者

```shell
bgmi config set max_path --value '3'

```

不能用来修改复杂配置,如 `global_filters`,请手动修改配置文件。

## 支持的数据源

- [bangumi_moe(default)](https://bangumi.moe)
- [mikan_project](https://mikanani.me)
- [dmhy](https://share.dmhy.org/)

### 更换换数据源

**更换数据源会清空番剧数据库, 但是 bgmi script 不受影响.** 之前下载的视频文件不会删除, 但是不会在前端显示

**如果更换的源为 `mikan_project`, 请先配置 `MIKAN_USERNAME` 和 `MIKAN_PASSWORD`**, 其它源不受影响

```bash
bgmi source mikan_project
```

**切换数据源必需使用bgmi source命令,不能手动修改配置文件。手动修改配置文件会导致 bgmi 报错**

### 设置下载方式

修改配置文件和对应的配置项

```toml
download_delegate = "aria2-rpc" # download delegate
```

内置可用的选项包括 `aria2-rpc`, `transmission-rpc`, `qbittorrent-webapi` 以及 `deluge-rpc`。

### 查看目前正在更新的新番

```bash
bgmi cal
```

订阅番剧:

```bash
bgmi add "进击的巨人 第三季" "刃牙" "哆啦A梦"
bgmi add "高分少女" --episode 0
```

添加番剧的同时设置下载路径:

```bash
bgmi add "高分少女" --episode 0 --save-path './高分少女/S1/'
```

退订:

```bash
bgmi delete "Re:CREATORS"
```

更新番剧列表并且下载番剧:

```bash
bgmi update --download # update all
bgmi update "从零开始的魔法书" --download
```

设置筛选条件:

```bash
bgmi list # 列出目前订阅的番剧
bgmi fetch "Re:CREATORS"
# include和exclude会忽略大小写。`720p`和`720P`的效果是相同的
bgmi filter "Re:CREATORS" --subtitle "DHR動研字幕組,豌豆字幕组" --include 720P --exclude BIG5
bgmi fetch "Re:CREATORS"
# 删除subtitle,include和exclude,添加正则匹配
bgmi filter "Re:CREATORS" --subtitle "" --include "" --exclude "" --regex "..."
bgmi filter "Re:CREATORS" --regex "(DHR動研字幕組|豌豆字幕组).*(720P)"
bgmi fetch "Re:CREATORS"
```

## 设置全局过滤关键词


### 包含

默认不启用全局包含关键词,你可以设置 `enable_global_include_keywords = true` 启动此功能。

```toml
enable_global_include_keywords = true
global_include_keywords = ['1080']
```


### 排除

有一些默认定义的全局过滤关键词,默认会排除标题包含以下关键词的种子。
可以使用 `enable_global_filters = false` 禁止过滤全局关键词,

```toml
enable_global_filters = true
global_filters = [
  "Leopard-Raws",
  "hevc",
  "x265",
  "c-a Raws",
  "U3-Web",
]
```

最后使用`bgmi fetch`来看看筛选的结果.

搜索番剧并下载:

```bash
bgmi search '为美好的世界献上祝福!' --regex-filter '.*动漫国字幕组.*为美好的世界献上祝福!].*720P.*'

```

使用`--min-episode`和`--max-episode`来根据集数筛选下载结果

```bash
bgmi search 海贼王 --min-episode 800 --max-episode 820
# 下载
bgmi search 海贼王 --min-episode 800 --max-episode 820 --download
```

`bgmi search`命令默认不会显示重复的集数, 如果要显示重复的集数来方便过滤, 在命令后加上`--dupe`来显示全部的搜索结果

手动修改最近下载的剧集

```bash
bgmi list
bgmi mark "Re:CREATORS" 1
```

## 使用`bgmi_http`

1.先下载所有更新中番剧的封面

```bash
bgmi cal --download-cover
```

2.根据你是否使用 nginx, 设置`serve_static_files`(使用 nginx 的情况下使用默认设置`false`, 不使用的情况下设置为`true`)

3.下载前端的静态文件(你可能在安装的时候已经下载过了):

```bash
bgmi install
```

4.在`8888`端口启动 BGmi HTTP 服务器:

```bash
bgmi_http --port=8888 --address=0.0.0.0
```

### 在 Windows 上使用`bgmi_http`

参照上面启动服务器, 然后访问[http://localhost:8888/](http://localhost:8888/).

### 在\*nux 上使用 bgmi_http

可以让`BGmi`帮助你生成对应的 nginx 配置文件

```bash
bgmi gen nginx.conf --server-name bgmi.whatever.com
```

你也可以手动写一份 nginx 配置, 来满足你的更多需求(比如启用 https), 这是一份例子

```bash
server {
    listen 80;
    server_name bgmi;

    autoindex on;
    charset utf-8;

    location /bangumi {
        # ~/.bgmi/bangumi
        # alias到你的`SAVE_PATH` 注意以/结尾
        alias /path/to/bangumi/;
    }

    location /api {
        proxy_pass http://127.0.0.1:8888;
    }

    location /resource {
        proxy_pass http://127.0.0.1:8888;
    }

    location / {
        # alias到你的`BGMI_PATH/front_static/`注意以/结尾
        alias /path/to/front_static/;
    }
}
```

或者添加一个 aria2c 前端之类的, 具体办法百度上有很多,不在此赘述.

macOS launchctl service controller

参照 [issue #77](https://github.com/BGmi/BGmi/pull/77)自行设置

[me.ricterz.bgmi.plist](https://github.com/BGmi/BGmi/blob/master/bgmi/others/me.ricterz.bgmi.plist)

## 弹幕支持

BGmi 使用[`DPlayer`](https://github.com/DIYgod/DPlayer)做为前端播放器

如果你想要添加弹幕支持, 在这里[DPlayer#related-projects](https://github.com/DIYgod/DPlayer#related-projects)选择一个后端自行搭建, 或者使用`DPlayer`提供的现成接口`https://api.prprpr.me/dplayer/`

然后修改配置文件:

```toml
[bgmi_http]
danmaku_api_url = "https://api.prprpr.me/dplayer/"  # This api is provided by dplayer official
```

设置你的`bgmi_http`, 享受弹幕支援吧.

## 调试

log 文件位于`{BGMI_PATH}/tmp/`

## 卸载

由于 pip 的限制, 你需要手动清理`BGmi`产生的位于`~/.bgmi`的文件

同样, `BMmi`添加到你系统的定时任务也不会被自动删除, 请手动删除.

\*nix:

    请手动清理crontab

windows:

```bash
schtasks /Delete /TN 'bgmi updater'
```

## 如果你对 python 有一点了解, 并且觉得还不够的话, 下面是为你准备的.

## Bangumi Script

你可以写一个`BGmi Script`来解析你自己的想看的番剧或者美剧. BGmi 会加载你的 script, 视作一个番剧来对待. 而你所需要做的只是继承`ScriptBase`类, 然后实现特定的方法, 再把你的 script 文件放到`BGMI_PATH/script`文件夹内.

Example: [./tests/script_example.py](./tests/script_example.py)

`get_download_url()`返回一个`dict`, 以对应集数为键, 对应的下载链接为值

```python
{
    1: 'http://example.com/Bangumi/1/1.mp4',
    2: 'http://example.com/Bangumi/1/2.torrent',
    3: 'http://example.com/Bangumi/1/3.mp4'
}
```

## Download hook

你可以在下载完成前或下载完成后执行一些操作, 比如移动文件, 重命名文件等等. 将你的 hook 文件放到`BGMI_PATH/hooks`文件夹内即可.

```python
from loguru import logger
from bgmi.script import HookBase


# 只需要继承 HookBase 类,实现里面的方法即可,类名字可任意设置
class Hook(HookBase):
    # 在添加了下载任务之后执行
    def post_add_download(self) -> None:
        logger.info('post add download')

    # 在更新了状态,下载之前进行执行
    def pre_add_download(self) -> None:
        logger.info('pre add download')
```

## BGmi 数据源

通过扩展`bgmi.website.base.BaseWebsite`类并且实现对应的三个方法,你也可以简单的添加一个数据源

每个方法具体的意义和返回值格式请参照每个方法对应的注释

```python
from typing import List, Optional

from bgmi.website.base import BaseWebsite
from bgmi.website.model import Episode, WebsiteBangumi


class DataSource(BaseWebsite):
    def search_by_keyword(
        self, keyword: str, count: int
    ) -> List[Episode]:  # pragma: no cover
        """

        :param keyword: search key word
        :param count: how many page to fetch from website
        :return: list of episode search result
        """
        raise NotImplementedError

    def fetch_bangumi_calendar(self,) -> List[WebsiteBangumi]:  # pragma: no cover
        """
        return a list of all bangumi and a list of all subtitle group

        list of bangumi dict:
        update time should be one of ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Unknown']
        """
        raise NotImplementedError

    def fetch_episode_of_bangumi(
        self, bangumi_id: str, max_page: int, subtitle_list: Optional[List[str]] = None
    ) -> List[Episode]:  # pragma: no cover
        """
        get all episode by bangumi id

        :param bangumi_id: bangumi_id
        :param subtitle_list: list of subtitle group
        :type subtitle_list: list
        :param max_page: how many page you want to crawl if there is no subtitle list
        :type max_page: int
        :return: list of bangumi
        """
        raise NotImplementedError


    def fetch_single_bangumi(self, bangumi_id: str) -> WebsiteBangumi:
        """
        fetch bangumi info when updating

        :param bangumi_id: bangumi_id, or bangumi['keyword']
        :type bangumi_id: str
        :rtype: WebsiteBangumi
        """
        # return WebsiteBangumi(keyword=bangumi_id) if website don't has a page contains episodes and info
```

## License

[MIT License](./LICENSE)

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/BGmi/BGmi",
    "name": "bgmi",
    "maintainer": "Trim21",
    "docs_url": null,
    "requires_python": "<4.0.0,>=3.8.0",
    "maintainer_email": "i@trim21.me",
    "keywords": "bangumi, bgmi, feed",
    "author": "RicterZ",
    "author_email": "ricterzheng@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/33/d2/e402662a8327fa74862506e39aaa81d75531d3fcdda9765efa5f0615a36b/bgmi-4.5.0.tar.gz",
    "platform": null,
    "description": "# BGmi\n\nBGmi \u662f\u4e00\u4e2a\u7528\u6765\u8ffd\u756a\u7684\u547d\u4ee4\u884c\u7a0b\u5e8f.\n\n[![](https://img.shields.io/pypi/v/bgmi.svg)](https://pypi.python.org/pypi/bgmi)\n![](https://img.shields.io/pypi/pyversions/bgmi)\n[![test](https://github.com/BGmi/BGmi/actions/workflows/test.yaml/badge.svg)](https://github.com/BGmi/BGmi/actions/workflows/test.yaml)\n[![](https://codecov.io/gh/BGmi/BGmi/branch/master/graph/badge.svg)](https://codecov.io/gh/BGmi/BGmi/branch/master/graph/badge.svg)\n[![](https://img.shields.io/badge/License-MIT-blue.svg)](https://github.com/BGmi/BGmi/blob/master/LICENSE)\n\n## TODO\n\n## \u66f4\u65b0\u65e5\u5fd7\n\n### v4\n\n- \u547d\u4ee4\u81ea\u52a8\u8865\u5168\uff0c\u4f7f\u7528 `bgmi completion zsh/bash` \u751f\u6210\n- \u6dfb\u52a0 `mikan_url` \u914d\u7f6e\uff0c\u7528\u4e8e\u914d\u7f6e\u871c\u67d1\u8ba1\u5212\u955c\u50cf\u7ad9\u3002\n- \u6dfb\u52a0 `proxy` \u8bbe\u7f6e\n- \u65b0 WEB UI\n- \u5c06\u914d\u7f6e\u9879 `transmission.rpc_url` \u91cd\u547d\u540d\u4e3a `transmission.rpc_host`.\n- \u4fee\u590d Transmission \u914d\u7f6e\u7684\u9ed8\u8ba4\u503c.\n\n### v3\n\n- \u65b0\u589e\u914d\u7f6e\u9879 `global_include_keywords` \uff0c\u7528\u4e8e\u8bbe\u7f6e\u5168\u5c40\u5305\u542b\u5173\u952e\u8bcd\u3002\n- \u65b0\u589e\u914d\u7f6e\u9879 `save_path_map` \uff0c\u7528\u4e8e\u8bbe\u7f6e\u4e0d\u540c\u52a8\u753b\u7684\u4e0b\u8f7d\u8def\u5f84\u3002\n- \u4f7f\u7528 [TOML](https://github.com/toml-lang/toml) \u4f5c\u4e3a\u914d\u7f6e\u6587\u4ef6\n- \u4e0d\u518d\u652f\u6301 python3.7\n- \u4e0d\u518d\u652f\u6301 python3.6\n- \u652f\u6301[\u6269\u5c55\u4e0b\u8f7d\u65b9\u5f0f](./docs/downloader.md)\n- \u79fb\u9664\u8fc5\u96f7\u79bb\u7ebf\n- \u652f\u6301 [qbittorrent-webapi](https://www.qbittorrent.org/)\n- \u505c\u6b62\u652f\u6301 python2\uff0c3.4 \u548c 3.5\n- Transmission rpc \u8ba4\u8bc1\u8bbe\u7f6e\n- \u652f\u6301 [deluge-rpc](https://www.deluge-torrent.org/)\n- \u4f7f\u7528\u6700\u5927\u548c\u6700\u5c0f\u96c6\u6570\u7b5b\u9009\u641c\u7d22\u7ed3\u679c\n\n## \u7279\u6027\n\n- \u591a\u4e2a\u6570\u636e\u6e90\u53ef\u9009: [bangumi_moe](https://bangumi.moe), [mikan_project](https://mikanani.me) \u6216\u8005[dmhy](https://share.dmhy.org/)\n- \u4f7f\u7528 aria2, transmission, qbittorrent \u6216\u8005 deluge \u6765\u4e0b\u8f7d\u4f60\u7684\u756a\u5267.\n- \u63d0\u4f9b\u4e00\u4e2a\u7ba1\u7406\u548c\u89c2\u770b\u8ba2\u9605\u756a\u5267\u7684\u524d\u7aef.\n- \u5f39\u5e55\u652f\u6301\n- \u63d0\u4f9b uTorrent \u652f\u6301\u7684 RSS Feed \u548c\u79fb\u52a8\u8bbe\u5907\u652f\u6301\u7684 ICS \u683c\u5f0f\u65e5\u5386.\n- Bangumi Script: \u6dfb\u52a0\u81ea\u5df1\u7684\u756a\u5267\u89e3\u6790\u5668\n- \u756a\u5267\u653e\u677e\u5217\u8868\u548c\u5267\u96c6\u4fe1\u606f\n- \u4e0b\u8f7d\u756a\u5267\u65f6\u7684\u8fc7\u6ee4\u5668(\u652f\u6301\u5173\u952e\u8bcd,\u5b57\u5e55\u7ec4\u548c\u6b63\u5219)\n- \u591a\u5e73\u53f0\u652f\u6301: Windows, \\*nux \u4ee5\u53ca Router system\n\n![](./images/bgmi_cli.png?raw=true)\n![](https://github.com/BGmi/BGmi-frontend/raw/master/.github/images/example.png)\n![](https://github.com/BGmi/BGmi-frontend/raw/master/.github/images/example2.png)\n\n## \u5b89\u88c5\n\n\u4f7f\u7528 [pipx](https://pypa.github.io/pipx/) \u5b89\u88c5(\u63a8\u8350):\n\n```bash\npipx install bgmi\n```\n\n### \u4f7f\u7528 pip \u5b89\u88c5\u7a33\u5b9a\u7248\u672c:\n\n```bash\npip install bgmi\n```\n\n### \u6216\u8005\u4ece\u6e90\u7801\u5b89\u88c5\uff08\u4e0d\u63a8\u8350\uff09\n\n```bash\ngit clone https://github.com/BGmi/BGmi\ncd BGmi\ngit checkout master\npython -m pip install -U pip\npip install .\n```\n\n### \u521d\u59cb\u5316`BGmi`\n\n```bash\nbgmi install\n```\n\n## \u5347\u7ea7\uff08\u4ec5 pipx \u5b89\u88c5\uff09\n\n```bash\npipx upgrade bgmi\nbgmi upgrade\n```\n\n## \u5347\u7ea7\uff08\u4ec5 pip \u5b89\u88c5\uff09\n\n```bash\npip install bgmi -U\nbgmi upgrade\n```\n\n\u5728\u5347\u7ea7\u540e\u8bf7\u786e\u4fdd\u8fd0\u884c`bgmi upgrade`\n\n## \u4f7f\u7528 Docker\n\n\u89c1 [BGmi/bgmi-docker-all-in-one](https://github.com/BGmi/bgmi-docker-all-in-one)\n\n## \u4f7f\u7528\n\n\u67e5\u770b\u53ef\u7528\u7684\u547d\u4ee4\n\n```bash\nbgmi --help\n```\n\n**`--help`\u9009\u9879\u540c\u6837\u9002\u7528\u4e8e\u6240\u6709\u7684\u5b50\u547d\u4ee4\uff0creadme \u4ec5\u4ecb\u7ecd\u4e86\u4e00\u4e9b\u57fa\u7840\u7528\u6cd5\u3002**\n\n## \u547d\u4ee4\u81ea\u52a8\u8865\u5168\n\n### bash\n\n```shell\nbgmi completion bash > ~/.bash_completion.d/bgmi\n```\n\n### zsh\n\n#### oh-my-zsh\n```shell\nbgmi completion zsh > .oh-my-zsh/completions/_bgmi\n```\n\n\u6211\u4e0d\u4f7f\u7528\u5176\u4ed6\u7684 zsh \u63d2\u4ef6\u7ba1\u7406\u5668\uff0c\u5177\u4f53\u7684\u5b89\u88c5\u65b9\u6cd5\u8bf7\u67e5\u8be2\u4f60\u4f7f\u7528\u7684\u63d2\u4ef6\u7ba1\u7406\u5668\u6587\u6863\n\n## \u914d\u7f6e BGmi\n\nBGmi \u63d0\u4f9b\u4e24\u79cd\u65b9\u5f0f\u914d\u7f6eBGmi\u7684\u5404\u9879\u8fd0\u884c\u53c2\u6570\uff0c\u5206\u522b\u4e3a\u914d\u7f6e\u6587\u4ef6\u4e0e\u73af\u5883\u53d8\u91cf\u3002\n\n### \u914d\u7f6e\u6587\u4ef6\nbgmi \u7684\u914d\u7f6e\u6587\u4ef6\u4f4d\u4e8e `${BGMI_PATH}/config.toml`, \u5728\u672a\u8bbe\u7f6e `BGMI_PATH` \u73af\u5883\u53d8\u91cf\u65f6\uff0c`${BGMI_PATH}` \u9ed8\u8ba4\u4e3a `~/.bgmi/`\u3002\n\n\u67e5\u770b\u5f53\u524d `BGmi` \u8bbe\u7f6e:\n\n```bash\nbgmi config # \u67e5\u770b\u5f53\u524d\u5404\u9879\u8bbe\u7f6e\u9ed8\u8ba4\u503c.\n```\n\n```toml\ndata_source = \"bangumi_moe\" # bangumi source\uff0c!!! \u8bf7\u4e0d\u8981\u624b\u52a8\u4fee\u6539\u6b64\u9009\u9879 !!!\ndownload_delegate = \"aria2-rpc\" # \u756a\u5267\u4e0b\u8f7d\u5de5\u5177 (aria2-rpc, transmission-rpc, deluge-rpc, qbittorrent-webapi)\ntmp_path = \"tmp/tmp\" # tmp dir\nsave_path = \"tmp/bangumi\" # \u4e0b\u8f7d\u756a\u5267\u4fdd\u5b58\u5730\u5740\nmax_path = 3 # \u6293\u53d6\u6570\u636e\u65f6\u6bcf\u4e2a\u756a\u5267\u6700\u5927\u6293\u53d6\u9875\u6570\nbangumi_moe_url = \"https://bangumi.moe\"\nshare_dmhy_url = \"https://share.dmhy.org\"\nmikan_url = \"https://mikanani.me\"\nmikan_username = \"\" # \u871c\u67d1\u8ba1\u5212\u7684\u7528\u6237\u540d\nmikan_password = \"\" # \u871c\u67d1\u8ba1\u5212\u7684\u5bc6\u7801\nenable_global_filters = true\nglobal_filters = [\n    \"Leopard-Raws\",\n    \"hevc\",\n    \"x265\",\n    \"c-a Raws\",\n    \"U3-Web\",\n]\n\nproxy = '' # http proxy example: http://127.0.0.1:1080\n\n[save_path_map] # \u9488\u5bf9\u6bcf\u90e8\u756a\u5267\u8bbe\u7f6e\u4e0b\u8f7d\u8def\u5f84\n'\u81f4\u4e0d\u706d\u7684\u4f60 \u7b2c\u4e8c\u5b63' = '/home/trim21/downloads/bangumi/\u81f4\u4e0d\u706d\u7684\u4f60/s2/' # \u5982\u679c\u4f7f\u7528\u7edd\u5bf9\u8def\u5f84\uff0c\u53ef\u80fd\u5bfc\u81f4 web-ui \u65e0\u6cd5\u6b63\u786e\u663e\u793a\u89c6\u9891\u6587\u4ef6\u3002\n'\u81f4\u4e0d\u706d\u7684\u4f60 \u7b2c\u4e09\u5b63' = './\u81f4\u4e0d\u706d\u7684\u4f60/s3/' # \u4ee5 save_path \u4e3a\u57fa\u7840\u8def\u5f84\u7684\u76f8\u5bf9\u8def\u5f84\n\n[http]\nadmin_token = \"dYMj-Z4bDRoQfd3x\" # web ui \u7684\u5bc6\u7801\ndanmaku_api_url = \"\"\nserve_static_files = false\n\n[aria2]\nrpc_url = \"http://localhost:6800/rpc\" # aria2c RPC URL (\u4e0d\u662f jsonrpc URL, \u5982\u679c\u4f60\u7684 aria2c \u8fd0\u884c\u5728 localhost:6800, \u5bf9\u5e94\u7684\u94fe\u63a5\u4e3a `http://localhost:6800/rpc`)\nrpc_token = \"token:\" # aria2c RPC token (\u5982\u679c\u6ca1\u6709\u8bbe\u7f6e token, \u7559\u7a7a\u6216\u8005\u8bbe\u7f6e\u4e3a `token:`)\n\n[transmission]\nrpc_host = \"127.0.0.1\"\nrpc_port = 9091\nrpc_username = \"your_username\"\nrpc_password = \"your_password\"\nrpc_path = \"/transmission/rpc\" # transmission http rpc \u7684\u8bf7\u6c42\u8def\u5f84\n\n[qbittorrent]\nrpc_host = \"127.0.0.1\"\nrpc_port = 8080\nrpc_username = \"admin\"\nrpc_password = \"adminadmin\"\ncategory = \"\"\n\n[deluge]\nrpc_url = \"http://127.0.0.1:8112/json\"\nrpc_password = \"deluge\"\n```\n\n### \u73af\u5883\u53d8\u91cf\n\u5f53 BGmi \u7684\u914d\u7f6e\u6587\u4ef6\u8fd8\u672a\u521d\u59cb\u5316\u65f6\uff0c\u5404\u9879\u8fd0\u884c\u53c2\u6570\u53ef\u7531\u73af\u5883\u53d8\u91cf\u8fdb\u884c\u914d\u7f6e\n\n\u73af\u5883\u53d8\u91cf\u4ee5 `BGMI_` \u5f00\u5934\uff0c\u5168\u5927\u5199\u547d\u540d\uff0c\u4e14\u5404\u7ea7\u914d\u7f6e\u4ee5 `_` \u8fdb\u884c\u5206\u5272\uff0c\u5982:\n```\nBGMI_DATA_SOURCE=bangumi_moe    # \u5bf9\u5e94\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684 data_source = \"bangumi_moe\"\nBGMI_HTTP_ADMIN_TOKEN=dYMj-Z4bDRoQfd3x    # \u5bf9\u5e94\u914d\u7f6e\u6587\u4ef6 [http] \u5206\u6bb5\u4e2d\u7684 admin_token = \"dYMj-Z4bDRoQfd3x\"\n...\n```\n\n\u73af\u5883\u53d8\u91cf *\u6682\u4e0d\u652f\u6301* \u914d\u7f6e\u4ee5\u4e0b\u9879\u76ee\n```\nenable_global_include_keywords\nenable_global_filters\nglobal_include_keywords\nglobal_filters\n[save_path_map]\n```\n\u6ce8: \u5f53\u914d\u7f6e\u6587\u4ef6\u751f\u6210\u5b8c\u6bd5\u540e\uff0c\u8fd0\u884c\u914d\u7f6e\u5c06\u4f1a\u4ee5\u914d\u7f6e\u6587\u4ef6\u4e3a\u51c6\uff0c\u73af\u5883\u53d8\u91cf\u4ec5\u7528\u4e8e\u751f\u6210\u7b2c\u4e00\u4efd\u914d\u7f6e\u6587\u4ef6\u3002\n\n## \u4fee\u6539\u914d\u7f6e\n\n\u4f7f\u7528 `bgmi config set ...keys  --value '...'` \u547d\u4ee4\u53ef\u4ee5\u4fee\u6539\u914d\u7f6e\u3002\n\n\u5982\uff1a\n\n```shell\nbgmi config set http admin_token --value 'my super secret token'\n```\n\n\u6216\u8005\n\n```shell\nbgmi config set max_path --value '3'\n\n```\n\n\u4e0d\u80fd\u7528\u6765\u4fee\u6539\u590d\u6742\u914d\u7f6e\uff0c\u5982 `global_filters`\uff0c\u8bf7\u624b\u52a8\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u3002\n\n## \u652f\u6301\u7684\u6570\u636e\u6e90\n\n- [bangumi_moe(default)](https://bangumi.moe)\n- [mikan_project](https://mikanani.me)\n- [dmhy](https://share.dmhy.org/)\n\n### \u66f4\u6362\u6362\u6570\u636e\u6e90\n\n**\u66f4\u6362\u6570\u636e\u6e90\u4f1a\u6e05\u7a7a\u756a\u5267\u6570\u636e\u5e93, \u4f46\u662f bgmi script \u4e0d\u53d7\u5f71\u54cd.** \u4e4b\u524d\u4e0b\u8f7d\u7684\u89c6\u9891\u6587\u4ef6\u4e0d\u4f1a\u5220\u9664, \u4f46\u662f\u4e0d\u4f1a\u5728\u524d\u7aef\u663e\u793a\n\n**\u5982\u679c\u66f4\u6362\u7684\u6e90\u4e3a `mikan_project`, \u8bf7\u5148\u914d\u7f6e `MIKAN_USERNAME` \u548c `MIKAN_PASSWORD`**, \u5176\u5b83\u6e90\u4e0d\u53d7\u5f71\u54cd\n\n```bash\nbgmi source mikan_project\n```\n\n**\u5207\u6362\u6570\u636e\u6e90\u5fc5\u9700\u4f7f\u7528bgmi source\u547d\u4ee4\uff0c\u4e0d\u80fd\u624b\u52a8\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u3002\u624b\u52a8\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u4f1a\u5bfc\u81f4 bgmi \u62a5\u9519**\n\n### \u8bbe\u7f6e\u4e0b\u8f7d\u65b9\u5f0f\n\n\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u548c\u5bf9\u5e94\u7684\u914d\u7f6e\u9879\n\n```toml\ndownload_delegate = \"aria2-rpc\" # download delegate\n```\n\n\u5185\u7f6e\u53ef\u7528\u7684\u9009\u9879\u5305\u62ec `aria2-rpc`, `transmission-rpc`, `qbittorrent-webapi` \u4ee5\u53ca `deluge-rpc`\u3002\n\n### \u67e5\u770b\u76ee\u524d\u6b63\u5728\u66f4\u65b0\u7684\u65b0\u756a\n\n```bash\nbgmi cal\n```\n\n\u8ba2\u9605\u756a\u5267:\n\n```bash\nbgmi add \"\u8fdb\u51fb\u7684\u5de8\u4eba \u7b2c\u4e09\u5b63\" \"\u5203\u7259\" \"\u54c6\u5566A\u68a6\"\nbgmi add \"\u9ad8\u5206\u5c11\u5973\" --episode 0\n```\n\n\u6dfb\u52a0\u756a\u5267\u7684\u540c\u65f6\u8bbe\u7f6e\u4e0b\u8f7d\u8def\u5f84:\n\n```bash\nbgmi add \"\u9ad8\u5206\u5c11\u5973\" --episode 0 --save-path './\u9ad8\u5206\u5c11\u5973/S1/'\n```\n\n\u9000\u8ba2:\n\n```bash\nbgmi delete \"Re:CREATORS\"\n```\n\n\u66f4\u65b0\u756a\u5267\u5217\u8868\u5e76\u4e14\u4e0b\u8f7d\u756a\u5267:\n\n```bash\nbgmi update --download # update all\nbgmi update \"\u4ece\u96f6\u5f00\u59cb\u7684\u9b54\u6cd5\u4e66\" --download\n```\n\n\u8bbe\u7f6e\u7b5b\u9009\u6761\u4ef6:\n\n```bash\nbgmi list # \u5217\u51fa\u76ee\u524d\u8ba2\u9605\u7684\u756a\u5267\nbgmi fetch \"Re:CREATORS\"\n# include\u548cexclude\u4f1a\u5ffd\u7565\u5927\u5c0f\u5199\u3002`720p`\u548c`720P`\u7684\u6548\u679c\u662f\u76f8\u540c\u7684\nbgmi filter \"Re:CREATORS\" --subtitle \"DHR\u52d5\u7814\u5b57\u5e55\u7d44,\u8c4c\u8c46\u5b57\u5e55\u7ec4\" --include 720P --exclude BIG5\nbgmi fetch \"Re:CREATORS\"\n# \u5220\u9664subtitle\uff0cinclude\u548cexclude\uff0c\u6dfb\u52a0\u6b63\u5219\u5339\u914d\nbgmi filter \"Re:CREATORS\" --subtitle \"\" --include \"\" --exclude \"\" --regex \"...\"\nbgmi filter \"Re:CREATORS\" --regex \"(DHR\u52d5\u7814\u5b57\u5e55\u7d44|\u8c4c\u8c46\u5b57\u5e55\u7ec4).*(720P)\"\nbgmi fetch \"Re:CREATORS\"\n```\n\n## \u8bbe\u7f6e\u5168\u5c40\u8fc7\u6ee4\u5173\u952e\u8bcd\n\n\n### \u5305\u542b\n\n\u9ed8\u8ba4\u4e0d\u542f\u7528\u5168\u5c40\u5305\u542b\u5173\u952e\u8bcd\uff0c\u4f60\u53ef\u4ee5\u8bbe\u7f6e `enable_global_include_keywords = true` \u542f\u52a8\u6b64\u529f\u80fd\u3002\n\n```toml\nenable_global_include_keywords = true\nglobal_include_keywords = ['1080']\n```\n\n\n### \u6392\u9664\n\n\u6709\u4e00\u4e9b\u9ed8\u8ba4\u5b9a\u4e49\u7684\u5168\u5c40\u8fc7\u6ee4\u5173\u952e\u8bcd\uff0c\u9ed8\u8ba4\u4f1a\u6392\u9664\u6807\u9898\u5305\u542b\u4ee5\u4e0b\u5173\u952e\u8bcd\u7684\u79cd\u5b50\u3002\n\u53ef\u4ee5\u4f7f\u7528 `enable_global_filters = false` \u7981\u6b62\u8fc7\u6ee4\u5168\u5c40\u5173\u952e\u8bcd\uff0c\n\n```toml\nenable_global_filters = true\nglobal_filters = [\n  \"Leopard-Raws\",\n  \"hevc\",\n  \"x265\",\n  \"c-a Raws\",\n  \"U3-Web\",\n]\n```\n\n\u6700\u540e\u4f7f\u7528`bgmi fetch`\u6765\u770b\u770b\u7b5b\u9009\u7684\u7ed3\u679c.\n\n\u641c\u7d22\u756a\u5267\u5e76\u4e0b\u8f7d:\n\n```bash\nbgmi search '\u4e3a\u7f8e\u597d\u7684\u4e16\u754c\u732e\u4e0a\u795d\u798f\uff01' --regex-filter '.*\u52a8\u6f2b\u56fd\u5b57\u5e55\u7ec4.*\u4e3a\u7f8e\u597d\u7684\u4e16\u754c\u732e\u4e0a\u795d\u798f\uff01].*720P.*'\n\n```\n\n\u4f7f\u7528`--min-episode`\u548c`--max-episode`\u6765\u6839\u636e\u96c6\u6570\u7b5b\u9009\u4e0b\u8f7d\u7ed3\u679c\n\n```bash\nbgmi search \u6d77\u8d3c\u738b --min-episode 800 --max-episode 820\n# \u4e0b\u8f7d\nbgmi search \u6d77\u8d3c\u738b --min-episode 800 --max-episode 820 --download\n```\n\n`bgmi search`\u547d\u4ee4\u9ed8\u8ba4\u4e0d\u4f1a\u663e\u793a\u91cd\u590d\u7684\u96c6\u6570, \u5982\u679c\u8981\u663e\u793a\u91cd\u590d\u7684\u96c6\u6570\u6765\u65b9\u4fbf\u8fc7\u6ee4, \u5728\u547d\u4ee4\u540e\u52a0\u4e0a`--dupe`\u6765\u663e\u793a\u5168\u90e8\u7684\u641c\u7d22\u7ed3\u679c\n\n\u624b\u52a8\u4fee\u6539\u6700\u8fd1\u4e0b\u8f7d\u7684\u5267\u96c6\n\n```bash\nbgmi list\nbgmi mark \"Re:CREATORS\" 1\n```\n\n## \u4f7f\u7528`bgmi_http`\n\n1.\u5148\u4e0b\u8f7d\u6240\u6709\u66f4\u65b0\u4e2d\u756a\u5267\u7684\u5c01\u9762\n\n```bash\nbgmi cal --download-cover\n```\n\n2.\u6839\u636e\u4f60\u662f\u5426\u4f7f\u7528 nginx, \u8bbe\u7f6e`serve_static_files`(\u4f7f\u7528 nginx \u7684\u60c5\u51b5\u4e0b\u4f7f\u7528\u9ed8\u8ba4\u8bbe\u7f6e`false`, \u4e0d\u4f7f\u7528\u7684\u60c5\u51b5\u4e0b\u8bbe\u7f6e\u4e3a`true`)\n\n3.\u4e0b\u8f7d\u524d\u7aef\u7684\u9759\u6001\u6587\u4ef6(\u4f60\u53ef\u80fd\u5728\u5b89\u88c5\u7684\u65f6\u5019\u5df2\u7ecf\u4e0b\u8f7d\u8fc7\u4e86):\n\n```bash\nbgmi install\n```\n\n4.\u5728`8888`\u7aef\u53e3\u542f\u52a8 BGmi HTTP \u670d\u52a1\u5668:\n\n```bash\nbgmi_http --port=8888 --address=0.0.0.0\n```\n\n### \u5728 Windows \u4e0a\u4f7f\u7528`bgmi_http`\n\n\u53c2\u7167\u4e0a\u9762\u542f\u52a8\u670d\u52a1\u5668, \u7136\u540e\u8bbf\u95ee[http://localhost:8888/](http://localhost:8888/).\n\n### \u5728\\*nux \u4e0a\u4f7f\u7528 bgmi_http\n\n\u53ef\u4ee5\u8ba9`BGmi`\u5e2e\u52a9\u4f60\u751f\u6210\u5bf9\u5e94\u7684 nginx \u914d\u7f6e\u6587\u4ef6\n\n```bash\nbgmi gen nginx.conf --server-name bgmi.whatever.com\n```\n\n\u4f60\u4e5f\u53ef\u4ee5\u624b\u52a8\u5199\u4e00\u4efd nginx \u914d\u7f6e, \u6765\u6ee1\u8db3\u4f60\u7684\u66f4\u591a\u9700\u6c42(\u6bd4\u5982\u542f\u7528 https), \u8fd9\u662f\u4e00\u4efd\u4f8b\u5b50\n\n```bash\nserver {\n    listen 80;\n    server_name bgmi;\n\n    autoindex on;\n    charset utf-8;\n\n    location /bangumi {\n        # ~/.bgmi/bangumi\n        # alias\u5230\u4f60\u7684`SAVE_PATH` \u6ce8\u610f\u4ee5/\u7ed3\u5c3e\n        alias /path/to/bangumi/;\n    }\n\n    location /api {\n        proxy_pass http://127.0.0.1:8888;\n    }\n\n    location /resource {\n        proxy_pass http://127.0.0.1:8888;\n    }\n\n    location / {\n        # alias\u5230\u4f60\u7684`BGMI_PATH/front_static/`\u6ce8\u610f\u4ee5/\u7ed3\u5c3e\n        alias /path/to/front_static/;\n    }\n}\n```\n\n\u6216\u8005\u6dfb\u52a0\u4e00\u4e2a aria2c \u524d\u7aef\u4e4b\u7c7b\u7684, \u5177\u4f53\u529e\u6cd5\u767e\u5ea6\u4e0a\u6709\u5f88\u591a,\u4e0d\u5728\u6b64\u8d58\u8ff0.\n\nmacOS launchctl service controller\n\n\u53c2\u7167 [issue #77](https://github.com/BGmi/BGmi/pull/77)\u81ea\u884c\u8bbe\u7f6e\n\n[me.ricterz.bgmi.plist](https://github.com/BGmi/BGmi/blob/master/bgmi/others/me.ricterz.bgmi.plist)\n\n## \u5f39\u5e55\u652f\u6301\n\nBGmi \u4f7f\u7528[`DPlayer`](https://github.com/DIYgod/DPlayer)\u505a\u4e3a\u524d\u7aef\u64ad\u653e\u5668\n\n\u5982\u679c\u4f60\u60f3\u8981\u6dfb\u52a0\u5f39\u5e55\u652f\u6301, \u5728\u8fd9\u91cc[DPlayer#related-projects](https://github.com/DIYgod/DPlayer#related-projects)\u9009\u62e9\u4e00\u4e2a\u540e\u7aef\u81ea\u884c\u642d\u5efa, \u6216\u8005\u4f7f\u7528`DPlayer`\u63d0\u4f9b\u7684\u73b0\u6210\u63a5\u53e3`https://api.prprpr.me/dplayer/`\n\n\u7136\u540e\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\uff1a\n\n```toml\n[bgmi_http]\ndanmaku_api_url = \"https://api.prprpr.me/dplayer/\"  # This api is provided by dplayer official\n```\n\n\u8bbe\u7f6e\u4f60\u7684`bgmi_http`, \u4eab\u53d7\u5f39\u5e55\u652f\u63f4\u5427.\n\n## \u8c03\u8bd5\n\nlog \u6587\u4ef6\u4f4d\u4e8e`{BGMI_PATH}/tmp/`\n\n## \u5378\u8f7d\n\n\u7531\u4e8e pip \u7684\u9650\u5236, \u4f60\u9700\u8981\u624b\u52a8\u6e05\u7406`BGmi`\u4ea7\u751f\u7684\u4f4d\u4e8e`~/.bgmi`\u7684\u6587\u4ef6\n\n\u540c\u6837, `BMmi`\u6dfb\u52a0\u5230\u4f60\u7cfb\u7edf\u7684\u5b9a\u65f6\u4efb\u52a1\u4e5f\u4e0d\u4f1a\u88ab\u81ea\u52a8\u5220\u9664, \u8bf7\u624b\u52a8\u5220\u9664.\n\n\\*nix:\n\n    \u8bf7\u624b\u52a8\u6e05\u7406crontab\n\nwindows:\n\n```bash\nschtasks /Delete /TN 'bgmi updater'\n```\n\n## \u5982\u679c\u4f60\u5bf9 python \u6709\u4e00\u70b9\u4e86\u89e3, \u5e76\u4e14\u89c9\u5f97\u8fd8\u4e0d\u591f\u7684\u8bdd, \u4e0b\u9762\u662f\u4e3a\u4f60\u51c6\u5907\u7684.\n\n## Bangumi Script\n\n\u4f60\u53ef\u4ee5\u5199\u4e00\u4e2a`BGmi Script`\u6765\u89e3\u6790\u4f60\u81ea\u5df1\u7684\u60f3\u770b\u7684\u756a\u5267\u6216\u8005\u7f8e\u5267. BGmi \u4f1a\u52a0\u8f7d\u4f60\u7684 script, \u89c6\u4f5c\u4e00\u4e2a\u756a\u5267\u6765\u5bf9\u5f85. \u800c\u4f60\u6240\u9700\u8981\u505a\u7684\u53ea\u662f\u7ee7\u627f`ScriptBase`\u7c7b, \u7136\u540e\u5b9e\u73b0\u7279\u5b9a\u7684\u65b9\u6cd5, \u518d\u628a\u4f60\u7684 script \u6587\u4ef6\u653e\u5230`BGMI_PATH/script`\u6587\u4ef6\u5939\u5185.\n\nExample: [./tests/script_example.py](./tests/script_example.py)\n\n`get_download_url()`\u8fd4\u56de\u4e00\u4e2a`dict`, \u4ee5\u5bf9\u5e94\u96c6\u6570\u4e3a\u952e, \u5bf9\u5e94\u7684\u4e0b\u8f7d\u94fe\u63a5\u4e3a\u503c\n\n```python\n{\n    1: 'http://example.com/Bangumi/1/1.mp4',\n    2: 'http://example.com/Bangumi/1/2.torrent',\n    3: 'http://example.com/Bangumi/1/3.mp4'\n}\n```\n\n## Download hook\n\n\u4f60\u53ef\u4ee5\u5728\u4e0b\u8f7d\u5b8c\u6210\u524d\u6216\u4e0b\u8f7d\u5b8c\u6210\u540e\u6267\u884c\u4e00\u4e9b\u64cd\u4f5c, \u6bd4\u5982\u79fb\u52a8\u6587\u4ef6, \u91cd\u547d\u540d\u6587\u4ef6\u7b49\u7b49. \u5c06\u4f60\u7684 hook \u6587\u4ef6\u653e\u5230`BGMI_PATH/hooks`\u6587\u4ef6\u5939\u5185\u5373\u53ef.\n\n```python\nfrom loguru import logger\nfrom bgmi.script import HookBase\n\n\n# \u53ea\u9700\u8981\u7ee7\u627f HookBase \u7c7b\uff0c\u5b9e\u73b0\u91cc\u9762\u7684\u65b9\u6cd5\u5373\u53ef\uff0c\u7c7b\u540d\u5b57\u53ef\u4efb\u610f\u8bbe\u7f6e\nclass Hook(HookBase):\n    # \u5728\u6dfb\u52a0\u4e86\u4e0b\u8f7d\u4efb\u52a1\u4e4b\u540e\u6267\u884c\n    def post_add_download(self) -> None:\n        logger.info('post add download')\n\n    # \u5728\u66f4\u65b0\u4e86\u72b6\u6001\uff0c\u4e0b\u8f7d\u4e4b\u524d\u8fdb\u884c\u6267\u884c\n    def pre_add_download(self) -> None:\n        logger.info('pre add download')\n```\n\n## BGmi \u6570\u636e\u6e90\n\n\u901a\u8fc7\u6269\u5c55`bgmi.website.base.BaseWebsite`\u7c7b\u5e76\u4e14\u5b9e\u73b0\u5bf9\u5e94\u7684\u4e09\u4e2a\u65b9\u6cd5,\u4f60\u4e5f\u53ef\u4ee5\u7b80\u5355\u7684\u6dfb\u52a0\u4e00\u4e2a\u6570\u636e\u6e90\n\n\u6bcf\u4e2a\u65b9\u6cd5\u5177\u4f53\u7684\u610f\u4e49\u548c\u8fd4\u56de\u503c\u683c\u5f0f\u8bf7\u53c2\u7167\u6bcf\u4e2a\u65b9\u6cd5\u5bf9\u5e94\u7684\u6ce8\u91ca\n\n```python\nfrom typing import List, Optional\n\nfrom bgmi.website.base import BaseWebsite\nfrom bgmi.website.model import Episode, WebsiteBangumi\n\n\nclass DataSource(BaseWebsite):\n    def search_by_keyword(\n        self, keyword: str, count: int\n    ) -> List[Episode]:  # pragma: no cover\n        \"\"\"\n\n        :param keyword: search key word\n        :param count: how many page to fetch from website\n        :return: list of episode search result\n        \"\"\"\n        raise NotImplementedError\n\n    def fetch_bangumi_calendar(self,) -> List[WebsiteBangumi]:  # pragma: no cover\n        \"\"\"\n        return a list of all bangumi and a list of all subtitle group\n\n        list of bangumi dict:\n        update time should be one of ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Unknown']\n        \"\"\"\n        raise NotImplementedError\n\n    def fetch_episode_of_bangumi(\n        self, bangumi_id: str, max_page: int, subtitle_list: Optional[List[str]] = None\n    ) -> List[Episode]:  # pragma: no cover\n        \"\"\"\n        get all episode by bangumi id\n\n        :param bangumi_id: bangumi_id\n        :param subtitle_list: list of subtitle group\n        :type subtitle_list: list\n        :param max_page: how many page you want to crawl if there is no subtitle list\n        :type max_page: int\n        :return: list of bangumi\n        \"\"\"\n        raise NotImplementedError\n\n\n    def fetch_single_bangumi(self, bangumi_id: str) -> WebsiteBangumi:\n        \"\"\"\n        fetch bangumi info when updating\n\n        :param bangumi_id: bangumi_id, or bangumi['keyword']\n        :type bangumi_id: str\n        :rtype: WebsiteBangumi\n        \"\"\"\n        # return WebsiteBangumi(keyword=bangumi_id) if website don't has a page contains episodes and info\n```\n\n## License\n\n[MIT License](./LICENSE)\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "BGmi is a cli tool for subscribed bangumi.",
    "version": "4.5.0",
    "project_urls": {
        "Homepage": "https://github.com/BGmi/BGmi",
        "Repository": "https://github.com/BGmi/BGmi"
    },
    "split_keywords": [
        "bangumi",
        " bgmi",
        " feed"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3f780823b6f7c97dcbc4e793eb39461ebded44b20be784d0fc89ba1073ec6c57",
                "md5": "bb4429a2ec977a9ac5f69627d13a5da1",
                "sha256": "5df1edfa208db2d9f8ffe725d57973cb83d3f28ec6ee0d34ebeef8bee1d734c4"
            },
            "downloads": -1,
            "filename": "bgmi-4.5.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bb4429a2ec977a9ac5f69627d13a5da1",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0.0,>=3.8.0",
            "size": 60456,
            "upload_time": "2024-04-17T17:25:42",
            "upload_time_iso_8601": "2024-04-17T17:25:42.871367Z",
            "url": "https://files.pythonhosted.org/packages/3f/78/0823b6f7c97dcbc4e793eb39461ebded44b20be784d0fc89ba1073ec6c57/bgmi-4.5.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "33d2e402662a8327fa74862506e39aaa81d75531d3fcdda9765efa5f0615a36b",
                "md5": "0b3f5f9b9eb404792207463aefcbdb86",
                "sha256": "6f816b75ef4c5eb91a7ee4c2867ca5b2d6d2d254e6c337852f313c4776c3b424"
            },
            "downloads": -1,
            "filename": "bgmi-4.5.0.tar.gz",
            "has_sig": false,
            "md5_digest": "0b3f5f9b9eb404792207463aefcbdb86",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0.0,>=3.8.0",
            "size": 54565,
            "upload_time": "2024-04-17T17:25:45",
            "upload_time_iso_8601": "2024-04-17T17:25:45.964006Z",
            "url": "https://files.pythonhosted.org/packages/33/d2/e402662a8327fa74862506e39aaa81d75531d3fcdda9765efa5f0615a36b/bgmi-4.5.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-17 17:25:45",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "BGmi",
    "github_project": "BGmi",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "bgmi"
}
        
Elapsed time: 0.24867s