ASMRManager


NameASMRManager JSON
Version 2.6.8 PyPI version JSON
download
home_pageNone
Summarydownload, manage and play the voices on asmr.one
upload_time2025-08-06 17:17:56
maintainerNone
docs_urlNone
authorNone
requires_python>=3.12
licenseMIT
keywords asmr downloader music player manager cli tui commandline terminal
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # ASMRManager

<details>
  <summary>

## →目录←

  </summary>

<!--toc:start-->

- [ASMRManager](#asmrmanager)
  - [功能介绍](#功能介绍)
    - [下载](#下载)
    - [管理](#管理)
    - [播放](#播放)
  - [使用方法](#使用方法)
  - [命令行补全](#命令行补全)
  - [使用示例](#使用示例)
  - [关于`dl search/get`的使用(作品,标签,文件的过滤细节)](#关于dl-searchget的使用作品标签文件的过滤细节)
  - [多线程下载相关](#多线程下载相关)
  - [其他](#其他)
  <!--toc:end-->

</details>
包含下载,管理,播放(命令行 TUI)的 https://asmr.one 的 CLI 管理工具。

## 功能介绍

### 下载

- 支持网站所支持的所有索引方式(关键词,标签,会社,价格,声优,日期,时长,年龄分级等等)以及排序方式。
- (仅)支持调用 IDM 或 aria2 下载。
- 支持高度自定义的过滤规则,可实现对作品的标签,文件名进行过滤,按需下载。
- 支持音频文件的格式转换。

```
> asmr dl search --help
[03/03/25 22:48:19] INFO     Run program with: dl search --help
Usage: asmr dl search [OPTIONS] [KEYWORDS]...

  search and download ASMR

  The argument are some keywords to filter the title or id of an ASMR.
  Specially, you can pass a keyword starts with `!` to exclude works
  containing this word, eg: `!中文版`

  the [multiple] options means you can add multiple same option such as:

      --tags tag1 --tags tag2 --no-tags tag3

  for options like --rate, --sell, --price, --duration you should give an
  interval like:

      --rate 3.9:4.7 --sell 1000: --price :200 --duration 10:60

  the interval a:b means a <= x < b, if a or b is not given i.e. a: or :b, it
  means no lower or upper limit

  for --duration, expressions like `1.5h(1.5 hours)`, `10m(10 minutes)` are
  allowed, or by default, the unit is minute.

  --force will check the download RJ files again though it is already     in
  the database, it work just like update

  --replace option will first delte the original file, then add the new file
  to download queue(i.e. IDM or aria2)

  --order=nsfw will only show the full age ASMRs

  for other --order values, you can refer to the website for explicit meaning

Options:
  -t, --tags TEXT                 tags to include[multiple]
  -nt, --no-tags TEXT             tags to exclude[multiple]
  -v, --vas TEXT                  voice actor(cv) to include[multiple]
  -nv, --no-vas TEXT              voice actor(cv) to exclude[multiple]
  -c, --circle TEXT               circle(社团) to include
  -nc, --no-circle TEXT           circle(社团) to exclude[multiple]
  -a, --age [general|r15|adult]   age limitation to include[multiple]
  -na, --no-age [general|r15|adult]
                                  age limitation to exclude[multiple]
  -l, --lang [JPN|ENG|CHI_HANS|CHI_HANT|CHI|KO_KR|SPA|ITA|GER|FRE]
                                  language to include[multiple]
  -nl, --no-lang [JPN|ENG|CHI_HANS|CHI_HANT|CHI|KO_KR|SPA|ITA|GER|FRE]
                                  language to exclude[multiple]
  -r, --rate TEXT                 rating interval
  -s, --sell TEXT                 selling interval
  -pr, --price TEXT               pirce interval
  -d, --duration TEXT             duration interval
  --all / --select                download all RJs  [default: select]
  -p, --page INTEGER              page of the search result, speicify to 0 if
                                  you want to download all pages  [default: 1]
  --subtitle / --no-subtitle      if the ASMR has subtitle(中文字幕)  [default:
                                  no-subtitle]
  -o, --order [create_date|rating|release|dl_count|price|rate_average_2dp|review_count|id|nsfw|random]
                                  ordering of the search result  [default:
                                  release]
  --asc / --desc                  ascending or descending
  --force / --check-db            force download even if the RJ id exists in
                                  database,or by default, RJ already in the
                                  database will be skipped
  --replace / --no-replace        replace the file if it exists  [default: no-
                                  replace]
  --check-name / --ignore-name    check and filter out asmr by filenames,
                                  rules are in the config file  [default:
                                  check-name]
  --check-tag / --ignore-tag      check and filter out asmr by tags, rules are
                                  in the config file  [default: check-tag]
  -h, --help                      Show this message and exit.
```

### 管理

可以对本地作品进行评分,评论(仅本地)。
也支持使用预定义的SQL脚本进行搜索(仓库提供了一些模板,例如 [search.sql](./asmrmanager/filemanager/resources/sqls.example/search.sql))

### 播放

非常简陋的终端播放界面,支持歌词显示,按照歌词信息快进,切换歌曲,支持以pygame(sdl)或mpd做为后端<del>,可以预见的将来应该会完善一下(但感觉够用了应该不会再加啥功能了)</del>,且不会再添加更多功能。如需更高级的播放功能,请使用第三方播放器,配合`asmr view add` 命令使用。
![tui-screenshot](./assets/tui-screenshot.png)

## 使用方法

> [!NOTE]
> 推荐使用 `pipx` 替代 `pip` 进行安装,以避免环境污染。
> 安装方法:`pip install pipx`

本工具支持 `python >= 3.12`,安装方法如下:

```shell
pip install ASMRManager[依赖]
```

可选则的依赖项有 `idm`,`aria2`,`tui`,`pygame`,`mpd`,`subtitle`,`all`,多个依赖使用逗号分隔,其中`all`为安装所有依赖。
具体功能如下:

- 下载:`idm` 或 `aria2` 二选一,`idm` 为 windows 平台专用,`aria2` 为跨平台。
- 播放:`pygame` 或 `mpd` 二选一。
- 其他:`tui` 为可视化命令行界面。`subtitle` 使用faster-whisper生成字幕文件。

其中,idm 与 aria2 至少安装其一,以实现最基础的下载功能,其余选项可随意按需添加。

示例: `pip install ASMRManager[idm,tui]`

---

之后再运行 `asmr` 命令,会生成示例的配置文件和 sql 文件,此处以 windows 举例:

```
2023-10-22 14:36:21 - INFO - First time to run, copy default sqls to C:\Users\slqy\AppData\Local\asmrmanager\asmrmanager\sqls
2023-10-22 14:36:21 - INFO - An example config file has been copied to C:\Users\slqy\AppData\Local\asmrmanager\asmrmanager\config.toml, please modify it and run this command again
```

之后按照说明修改 `config.toml` 文件,如果使用 sql 的话,也可以对 sql 文件夹进行修改。

若有不明白的地方可使用 sqlite 数据库工具查看目录下的 data.db 文件。

完成后使用 `asmr -h` 查看各命令的使用说明,对于子命令不清楚的同样可以查看帮助,例如 `asmr dl -h`。
常用的命令有:

- `dl search` 搜索并下载。
- `info` 搜索某个 RJID 的具体信息
- `file check` 检查下载目录下的文件是否按照规则被正确下载,并验证文件完整性
- `file store` 将下载文件转移到存储目录(STORAGE_PATH),并执行相应文件格式转换(详情见config.toml的before_store字段)
- `view` 将选择文件并移动到 VIEW_PATH
- `pl add` 将某个音声添加到用户的云端播放列表(配合 `pl create` 使用)
- `pl vote up/down/add` 对相关标签进行投票,或添加新标签
- `review` 为某个作品评分并评论(本地)

更多使用示例可参考[这一小节](#使用示例)。

> 使用命令时,如果不输入 RJID ,将会自动使用上一次命令的RJID。

另外本工具提供基于 `trogon` 的可视化命令行界面,在安装`tui`依赖后使用 `asmr tui` 即可打开。

## 命令行补全

仅支持 Bash/Fish/Zsh,详情可参考[官方文档](https://click.palletsprojects.com/en/8.1.x/shell-completion)。

```shell
# fish
_ASMR_COMPLETE=fish_source asmr > ~/.config/fish/completions/asmr.fish

# bash
_ASMR_COMPLETE=bash_source asmr > ~/.asmr-complete.bash
echo '. ~/.asmr-complete.bash' >> ~/.bashrc

# zsh
_ASMR_COMPLETE=zsh_source asmr > ~/.asmr-complete.zsh
echo '. ~/.asmr-complete.zsh' >> ~/.zshrc
```

## 使用示例

搜索最近更新的40个(一页)作品并下载:

```shell
asmr dl search -o release --desc  # 选择并下载
asmr dl search -o release --desc --all  # 下载全部
```

下载`治愈`标签下销量大于等于5000的全部的作品:

```shell
asmr dl search --tags 治愈 --sell 5000: --page 0 --all  # --page 0 会遍历下载所有页,否则默认只会下载第一页
```

下载某个社团下的全年龄并包含中文字幕的作品:

```shell
asmr dl search --circle Yostar --age general --subtitle
```

根据RJ/VJ/BJ号下载(下述输入格式适用于一切需要输入单个或多个ID的场合):

```shell
asmr dl get RJ299717
asmr dl get 299717  # RJ可以省略;对于8位RJ号,第一位的0也可以省略
asmr dl get VJ015443
asmr dl get 100000029  # 对于BJ与VJ,网站为了兼容RJ所使用的特殊ID
asmr dl get 300015443  # 本项目存储VJ与BJ所使用的ID("3" + 8位VJ号,BJ则为"4" + 8位BJ号)
```

检查下载目录下文件是否下载完全(默认会计算hash并向服务器验证,较为耗时。可使用 --offline 跳过)

```shell
asmr file check
asmr file check --list | xargs asmr dl get --force   # 重新下载所有不完整的文件,以bash shell为例
```

将下载的文件转移到存储目录(STORAGE_PATH),并执行相应文件格式转换(详情见config.toml的before_store字段)

```shell
asmr file store --all
```

比较本地文件与服务器文件的差异:

![diff](./assets/diff.png)

简单的关键词搜索(本地数据库):

```shell
asmr query 治愈 --limit 3  # 搜索字段有:标题,社团名和标签名
asmr query 治愈 --limit 3 --raw | jq .[].id | xargs -n1 asmr info # 输出为json格式,获取详细信息
```

标签投票(对于\*nix用户,安装命令行补全后可以更快捷地找到想要的tag;windows用户也可以选择不传入tag,交互式选择tag)

```shell
asmr vote up -t ASMR
asmr vote down -t 497
asmr vote up  # 不传入-t参数,会进入交互式选择模式
```

播放列表管理

```shell
asmr pl list # 列出所有播放列表
asmr pl create myplaylist --desc "An example playlist" --privacy PRIVATE  # 创建一个播放列表,并将权限设置为私密。
asmr pl add myplaylist RJ123456  # 将音声添加到myplaylist播放列表中
asmr pl show myplaylist  # 展示myplaylist播放列表中的音声
```

生成字幕文件,目前仅支持LRC格式:

```shell
asmr utils subtitle
```

## 关于`dl search/get`的使用(作品,标签,文件的过滤细节)

命令执行过程中会进行如下的检查与过滤操作:

1. 开始下载前:检查RJ号是否应该下载,如果本地文件不存在或者数据库无记录都会执行下载操作。可以通过 `--force` 强制执行下载。
1. 获取音声信息后:检查音声的tags,如果包含tag_filters里指定的tag,则跳过下载。可以通过 `--ignore-tag` 来强制下载。
1. 获取下载文件后:检查文件的名称和路径,如果不符合filename_filters里指定的规则,则跳过下载。可以通过`--ignore-name`来强制下载。
1. 添加下载任务时:如果检测到本地有同名文件,则跳过该文件的下载。可以通过`--replace`来强制覆盖存在的文件。

## 多线程下载相关

由于网站对下载并无相关限制,因此没必要设置过高的线程数,一般来说单文件1~2即可。
对于 `IDM` 设置方法如下:
![IDM](./assets/IDM.png)

对于 `aria2` 修改配置 `max-connection-per-server = 2` 即可:

## 其他

感谢 <https://asmr.one>丰富了我的夜生活。
另外网站运营不易,请合理使用本工具。

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "ASMRManager",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.12",
    "maintainer_email": null,
    "keywords": "asmr, downloader, music, player, manager, cli, tui, commandline, terminal",
    "author": null,
    "author_email": "SLQY <sqiyel@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e9/ca/7b94da5731b67576d567a4e37e0ce1f318451e33d95e7e0b731d704d65b9/asmrmanager-2.6.8.tar.gz",
    "platform": null,
    "description": "# ASMRManager\n\n<details>\n  <summary>\n\n## \u2192\u76ee\u5f55\u2190\n\n  </summary>\n\n<!--toc:start-->\n\n- [ASMRManager](#asmrmanager)\n  - [\u529f\u80fd\u4ecb\u7ecd](#\u529f\u80fd\u4ecb\u7ecd)\n    - [\u4e0b\u8f7d](#\u4e0b\u8f7d)\n    - [\u7ba1\u7406](#\u7ba1\u7406)\n    - [\u64ad\u653e](#\u64ad\u653e)\n  - [\u4f7f\u7528\u65b9\u6cd5](#\u4f7f\u7528\u65b9\u6cd5)\n  - [\u547d\u4ee4\u884c\u8865\u5168](#\u547d\u4ee4\u884c\u8865\u5168)\n  - [\u4f7f\u7528\u793a\u4f8b](#\u4f7f\u7528\u793a\u4f8b)\n  - [\u5173\u4e8e`dl search/get`\u7684\u4f7f\u7528\uff08\u4f5c\u54c1\uff0c\u6807\u7b7e\uff0c\u6587\u4ef6\u7684\u8fc7\u6ee4\u7ec6\u8282\uff09](#\u5173\u4e8edl-searchget\u7684\u4f7f\u7528\u4f5c\u54c1\u6807\u7b7e\u6587\u4ef6\u7684\u8fc7\u6ee4\u7ec6\u8282)\n  - [\u591a\u7ebf\u7a0b\u4e0b\u8f7d\u76f8\u5173](#\u591a\u7ebf\u7a0b\u4e0b\u8f7d\u76f8\u5173)\n  - [\u5176\u4ed6](#\u5176\u4ed6)\n  <!--toc:end-->\n\n</details>\n\u5305\u542b\u4e0b\u8f7d\uff0c\u7ba1\u7406\uff0c\u64ad\u653e(\u547d\u4ee4\u884c TUI)\u7684 https://asmr.one \u7684 CLI \u7ba1\u7406\u5de5\u5177\u3002\n\n## \u529f\u80fd\u4ecb\u7ecd\n\n### \u4e0b\u8f7d\n\n- \u652f\u6301\u7f51\u7ad9\u6240\u652f\u6301\u7684\u6240\u6709\u7d22\u5f15\u65b9\u5f0f(\u5173\u952e\u8bcd\uff0c\u6807\u7b7e\uff0c\u4f1a\u793e\uff0c\u4ef7\u683c\uff0c\u58f0\u4f18\uff0c\u65e5\u671f\uff0c\u65f6\u957f\uff0c\u5e74\u9f84\u5206\u7ea7\u7b49\u7b49)\u4ee5\u53ca\u6392\u5e8f\u65b9\u5f0f\u3002\n- \uff08\u4ec5\uff09\u652f\u6301\u8c03\u7528 IDM \u6216 aria2 \u4e0b\u8f7d\u3002\n- \u652f\u6301\u9ad8\u5ea6\u81ea\u5b9a\u4e49\u7684\u8fc7\u6ee4\u89c4\u5219\uff0c\u53ef\u5b9e\u73b0\u5bf9\u4f5c\u54c1\u7684\u6807\u7b7e\uff0c\u6587\u4ef6\u540d\u8fdb\u884c\u8fc7\u6ee4\uff0c\u6309\u9700\u4e0b\u8f7d\u3002\n- \u652f\u6301\u97f3\u9891\u6587\u4ef6\u7684\u683c\u5f0f\u8f6c\u6362\u3002\n\n```\n> asmr dl search --help\n[03/03/25 22:48:19] INFO     Run program with: dl search --help\nUsage: asmr dl search [OPTIONS] [KEYWORDS]...\n\n  search and download ASMR\n\n  The argument are some keywords to filter the title or id of an ASMR.\n  Specially, you can pass a keyword starts with `!` to exclude works\n  containing this word, eg: `!\u4e2d\u6587\u7248`\n\n  the [multiple] options means you can add multiple same option such as:\n\n      --tags tag1 --tags tag2 --no-tags tag3\n\n  for options like --rate, --sell, --price, --duration you should give an\n  interval like:\n\n      --rate 3.9:4.7 --sell 1000: --price :200 --duration 10:60\n\n  the interval a:b means a <= x < b, if a or b is not given i.e. a: or :b, it\n  means no lower or upper limit\n\n  for --duration, expressions like `1.5h(1.5 hours)`, `10m(10 minutes)` are\n  allowed, or by default, the unit is minute.\n\n  --force will check the download RJ files again though it is already     in\n  the database, it work just like update\n\n  --replace option will first delte the original file, then add the new file\n  to download queue(i.e. IDM or aria2)\n\n  --order=nsfw will only show the full age ASMRs\n\n  for other --order values, you can refer to the website for explicit meaning\n\nOptions:\n  -t, --tags TEXT                 tags to include[multiple]\n  -nt, --no-tags TEXT             tags to exclude[multiple]\n  -v, --vas TEXT                  voice actor(cv) to include[multiple]\n  -nv, --no-vas TEXT              voice actor(cv) to exclude[multiple]\n  -c, --circle TEXT               circle(\u793e\u56e2) to include\n  -nc, --no-circle TEXT           circle(\u793e\u56e2) to exclude[multiple]\n  -a, --age [general|r15|adult]   age limitation to include[multiple]\n  -na, --no-age [general|r15|adult]\n                                  age limitation to exclude[multiple]\n  -l, --lang [JPN|ENG|CHI_HANS|CHI_HANT|CHI|KO_KR|SPA|ITA|GER|FRE]\n                                  language to include[multiple]\n  -nl, --no-lang [JPN|ENG|CHI_HANS|CHI_HANT|CHI|KO_KR|SPA|ITA|GER|FRE]\n                                  language to exclude[multiple]\n  -r, --rate TEXT                 rating interval\n  -s, --sell TEXT                 selling interval\n  -pr, --price TEXT               pirce interval\n  -d, --duration TEXT             duration interval\n  --all / --select                download all RJs  [default: select]\n  -p, --page INTEGER              page of the search result, speicify to 0 if\n                                  you want to download all pages  [default: 1]\n  --subtitle / --no-subtitle      if the ASMR has subtitle(\u4e2d\u6587\u5b57\u5e55)  [default:\n                                  no-subtitle]\n  -o, --order [create_date|rating|release|dl_count|price|rate_average_2dp|review_count|id|nsfw|random]\n                                  ordering of the search result  [default:\n                                  release]\n  --asc / --desc                  ascending or descending\n  --force / --check-db            force download even if the RJ id exists in\n                                  database,or by default, RJ already in the\n                                  database will be skipped\n  --replace / --no-replace        replace the file if it exists  [default: no-\n                                  replace]\n  --check-name / --ignore-name    check and filter out asmr by filenames,\n                                  rules are in the config file  [default:\n                                  check-name]\n  --check-tag / --ignore-tag      check and filter out asmr by tags, rules are\n                                  in the config file  [default: check-tag]\n  -h, --help                      Show this message and exit.\n```\n\n### \u7ba1\u7406\n\n\u53ef\u4ee5\u5bf9\u672c\u5730\u4f5c\u54c1\u8fdb\u884c\u8bc4\u5206\uff0c\u8bc4\u8bba\uff08\u4ec5\u672c\u5730\uff09\u3002\n\u4e5f\u652f\u6301\u4f7f\u7528\u9884\u5b9a\u4e49\u7684SQL\u811a\u672c\u8fdb\u884c\u641c\u7d22(\u4ed3\u5e93\u63d0\u4f9b\u4e86\u4e00\u4e9b\u6a21\u677f\uff0c\u4f8b\u5982 [search.sql](./asmrmanager/filemanager/resources/sqls.example/search.sql))\n\n### \u64ad\u653e\n\n\u975e\u5e38\u7b80\u964b\u7684\u7ec8\u7aef\u64ad\u653e\u754c\u9762\uff0c\u652f\u6301\u6b4c\u8bcd\u663e\u793a\uff0c\u6309\u7167\u6b4c\u8bcd\u4fe1\u606f\u5feb\u8fdb\uff0c\u5207\u6362\u6b4c\u66f2\uff0c\u652f\u6301\u4ee5pygame(sdl)\u6216mpd\u505a\u4e3a\u540e\u7aef<del>\uff0c\u53ef\u4ee5\u9884\u89c1\u7684\u5c06\u6765\u5e94\u8be5\u4f1a\u5b8c\u5584\u4e00\u4e0b(\u4f46\u611f\u89c9\u591f\u7528\u4e86\u5e94\u8be5\u4e0d\u4f1a\u518d\u52a0\u5565\u529f\u80fd\u4e86)</del>\uff0c\u4e14\u4e0d\u4f1a\u518d\u6dfb\u52a0\u66f4\u591a\u529f\u80fd\u3002\u5982\u9700\u66f4\u9ad8\u7ea7\u7684\u64ad\u653e\u529f\u80fd\uff0c\u8bf7\u4f7f\u7528\u7b2c\u4e09\u65b9\u64ad\u653e\u5668\uff0c\u914d\u5408`asmr view add` \u547d\u4ee4\u4f7f\u7528\u3002\n![tui-screenshot](./assets/tui-screenshot.png)\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n> [!NOTE]\n> \u63a8\u8350\u4f7f\u7528 `pipx` \u66ff\u4ee3 `pip` \u8fdb\u884c\u5b89\u88c5\uff0c\u4ee5\u907f\u514d\u73af\u5883\u6c61\u67d3\u3002\n> \u5b89\u88c5\u65b9\u6cd5\uff1a`pip install pipx`\n\n\u672c\u5de5\u5177\u652f\u6301 `python >= 3.12`\uff0c\u5b89\u88c5\u65b9\u6cd5\u5982\u4e0b\uff1a\n\n```shell\npip install ASMRManager[\u4f9d\u8d56]\n```\n\n\u53ef\u9009\u5219\u7684\u4f9d\u8d56\u9879\u6709 `idm`\uff0c`aria2`\uff0c`tui`\uff0c`pygame`\uff0c`mpd`\uff0c`subtitle`\uff0c`all`\uff0c\u591a\u4e2a\u4f9d\u8d56\u4f7f\u7528\u9017\u53f7\u5206\u9694\uff0c\u5176\u4e2d`all`\u4e3a\u5b89\u88c5\u6240\u6709\u4f9d\u8d56\u3002\n\u5177\u4f53\u529f\u80fd\u5982\u4e0b\uff1a\n\n- \u4e0b\u8f7d\uff1a`idm` \u6216 `aria2` \u4e8c\u9009\u4e00\uff0c`idm` \u4e3a windows \u5e73\u53f0\u4e13\u7528\uff0c`aria2` \u4e3a\u8de8\u5e73\u53f0\u3002\n- \u64ad\u653e\uff1a`pygame` \u6216 `mpd` \u4e8c\u9009\u4e00\u3002\n- \u5176\u4ed6\uff1a`tui` \u4e3a\u53ef\u89c6\u5316\u547d\u4ee4\u884c\u754c\u9762\u3002`subtitle` \u4f7f\u7528faster-whisper\u751f\u6210\u5b57\u5e55\u6587\u4ef6\u3002\n\n\u5176\u4e2d\uff0cidm \u4e0e aria2 \u81f3\u5c11\u5b89\u88c5\u5176\u4e00\uff0c\u4ee5\u5b9e\u73b0\u6700\u57fa\u7840\u7684\u4e0b\u8f7d\u529f\u80fd\uff0c\u5176\u4f59\u9009\u9879\u53ef\u968f\u610f\u6309\u9700\u6dfb\u52a0\u3002\n\n\u793a\u4f8b\uff1a `pip install ASMRManager[idm,tui]`\n\n---\n\n\u4e4b\u540e\u518d\u8fd0\u884c `asmr` \u547d\u4ee4\uff0c\u4f1a\u751f\u6210\u793a\u4f8b\u7684\u914d\u7f6e\u6587\u4ef6\u548c sql \u6587\u4ef6\uff0c\u6b64\u5904\u4ee5 windows \u4e3e\u4f8b\uff1a\n\n```\n2023-10-22 14:36:21 - INFO - First time to run, copy default sqls to C:\\Users\\slqy\\AppData\\Local\\asmrmanager\\asmrmanager\\sqls\n2023-10-22 14:36:21 - INFO - An example config file has been copied to C:\\Users\\slqy\\AppData\\Local\\asmrmanager\\asmrmanager\\config.toml, please modify it and run this command again\n```\n\n\u4e4b\u540e\u6309\u7167\u8bf4\u660e\u4fee\u6539 `config.toml` \u6587\u4ef6\uff0c\u5982\u679c\u4f7f\u7528 sql \u7684\u8bdd\uff0c\u4e5f\u53ef\u4ee5\u5bf9 sql \u6587\u4ef6\u5939\u8fdb\u884c\u4fee\u6539\u3002\n\n\u82e5\u6709\u4e0d\u660e\u767d\u7684\u5730\u65b9\u53ef\u4f7f\u7528 sqlite \u6570\u636e\u5e93\u5de5\u5177\u67e5\u770b\u76ee\u5f55\u4e0b\u7684 data.db \u6587\u4ef6\u3002\n\n\u5b8c\u6210\u540e\u4f7f\u7528 `asmr -h` \u67e5\u770b\u5404\u547d\u4ee4\u7684\u4f7f\u7528\u8bf4\u660e\uff0c\u5bf9\u4e8e\u5b50\u547d\u4ee4\u4e0d\u6e05\u695a\u7684\u540c\u6837\u53ef\u4ee5\u67e5\u770b\u5e2e\u52a9\uff0c\u4f8b\u5982 `asmr dl -h`\u3002\n\u5e38\u7528\u7684\u547d\u4ee4\u6709\uff1a\n\n- `dl search` \u641c\u7d22\u5e76\u4e0b\u8f7d\u3002\n- `info` \u641c\u7d22\u67d0\u4e2a RJID \u7684\u5177\u4f53\u4fe1\u606f\n- `file check` \u68c0\u67e5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684\u6587\u4ef6\u662f\u5426\u6309\u7167\u89c4\u5219\u88ab\u6b63\u786e\u4e0b\u8f7d\uff0c\u5e76\u9a8c\u8bc1\u6587\u4ef6\u5b8c\u6574\u6027\n- `file store` \u5c06\u4e0b\u8f7d\u6587\u4ef6\u8f6c\u79fb\u5230\u5b58\u50a8\u76ee\u5f55(STORAGE_PATH)\uff0c\u5e76\u6267\u884c\u76f8\u5e94\u6587\u4ef6\u683c\u5f0f\u8f6c\u6362(\u8be6\u60c5\u89c1config.toml\u7684before_store\u5b57\u6bb5)\n- `view` \u5c06\u9009\u62e9\u6587\u4ef6\u5e76\u79fb\u52a8\u5230 VIEW_PATH\n- `pl add` \u5c06\u67d0\u4e2a\u97f3\u58f0\u6dfb\u52a0\u5230\u7528\u6237\u7684\u4e91\u7aef\u64ad\u653e\u5217\u8868(\u914d\u5408 `pl create` \u4f7f\u7528)\n- `pl vote up/down/add` \u5bf9\u76f8\u5173\u6807\u7b7e\u8fdb\u884c\u6295\u7968\uff0c\u6216\u6dfb\u52a0\u65b0\u6807\u7b7e\n- `review` \u4e3a\u67d0\u4e2a\u4f5c\u54c1\u8bc4\u5206\u5e76\u8bc4\u8bba(\u672c\u5730)\n\n\u66f4\u591a\u4f7f\u7528\u793a\u4f8b\u53ef\u53c2\u8003[\u8fd9\u4e00\u5c0f\u8282](#\u4f7f\u7528\u793a\u4f8b)\u3002\n\n> \u4f7f\u7528\u547d\u4ee4\u65f6\uff0c\u5982\u679c\u4e0d\u8f93\u5165 RJID \uff0c\u5c06\u4f1a\u81ea\u52a8\u4f7f\u7528\u4e0a\u4e00\u6b21\u547d\u4ee4\u7684RJID\u3002\n\n\u53e6\u5916\u672c\u5de5\u5177\u63d0\u4f9b\u57fa\u4e8e `trogon` \u7684\u53ef\u89c6\u5316\u547d\u4ee4\u884c\u754c\u9762\uff0c\u5728\u5b89\u88c5`tui`\u4f9d\u8d56\u540e\u4f7f\u7528 `asmr tui` \u5373\u53ef\u6253\u5f00\u3002\n\n## \u547d\u4ee4\u884c\u8865\u5168\n\n\u4ec5\u652f\u6301 Bash/Fish/Zsh\uff0c\u8be6\u60c5\u53ef\u53c2\u8003[\u5b98\u65b9\u6587\u6863](https://click.palletsprojects.com/en/8.1.x/shell-completion)\u3002\n\n```shell\n# fish\n_ASMR_COMPLETE=fish_source asmr > ~/.config/fish/completions/asmr.fish\n\n# bash\n_ASMR_COMPLETE=bash_source asmr > ~/.asmr-complete.bash\necho '. ~/.asmr-complete.bash' >> ~/.bashrc\n\n# zsh\n_ASMR_COMPLETE=zsh_source asmr > ~/.asmr-complete.zsh\necho '. ~/.asmr-complete.zsh' >> ~/.zshrc\n```\n\n## \u4f7f\u7528\u793a\u4f8b\n\n\u641c\u7d22\u6700\u8fd1\u66f4\u65b0\u768440\u4e2a(\u4e00\u9875)\u4f5c\u54c1\u5e76\u4e0b\u8f7d\uff1a\n\n```shell\nasmr dl search -o release --desc  # \u9009\u62e9\u5e76\u4e0b\u8f7d\nasmr dl search -o release --desc --all  # \u4e0b\u8f7d\u5168\u90e8\n```\n\n\u4e0b\u8f7d`\u6cbb\u6108`\u6807\u7b7e\u4e0b\u9500\u91cf\u5927\u4e8e\u7b49\u4e8e5000\u7684\u5168\u90e8\u7684\u4f5c\u54c1\uff1a\n\n```shell\nasmr dl search --tags \u6cbb\u6108 --sell 5000: --page 0 --all  # --page 0 \u4f1a\u904d\u5386\u4e0b\u8f7d\u6240\u6709\u9875\uff0c\u5426\u5219\u9ed8\u8ba4\u53ea\u4f1a\u4e0b\u8f7d\u7b2c\u4e00\u9875\n```\n\n\u4e0b\u8f7d\u67d0\u4e2a\u793e\u56e2\u4e0b\u7684\u5168\u5e74\u9f84\u5e76\u5305\u542b\u4e2d\u6587\u5b57\u5e55\u7684\u4f5c\u54c1\uff1a\n\n```shell\nasmr dl search --circle Yostar --age general --subtitle\n```\n\n\u6839\u636eRJ/VJ/BJ\u53f7\u4e0b\u8f7d\uff08\u4e0b\u8ff0\u8f93\u5165\u683c\u5f0f\u9002\u7528\u4e8e\u4e00\u5207\u9700\u8981\u8f93\u5165\u5355\u4e2a\u6216\u591a\u4e2aID\u7684\u573a\u5408\uff09\uff1a\n\n```shell\nasmr dl get RJ299717\nasmr dl get 299717  # RJ\u53ef\u4ee5\u7701\u7565\uff1b\u5bf9\u4e8e8\u4f4dRJ\u53f7\uff0c\u7b2c\u4e00\u4f4d\u76840\u4e5f\u53ef\u4ee5\u7701\u7565\nasmr dl get VJ015443\nasmr dl get 100000029  # \u5bf9\u4e8eBJ\u4e0eVJ\uff0c\u7f51\u7ad9\u4e3a\u4e86\u517c\u5bb9RJ\u6240\u4f7f\u7528\u7684\u7279\u6b8aID\nasmr dl get 300015443  # \u672c\u9879\u76ee\u5b58\u50a8VJ\u4e0eBJ\u6240\u4f7f\u7528\u7684ID\uff08\"3\" + 8\u4f4dVJ\u53f7\uff0cBJ\u5219\u4e3a\"4\" + 8\u4f4dBJ\u53f7\uff09\n```\n\n\u68c0\u67e5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u4e0b\u8f7d\u5b8c\u5168\uff08\u9ed8\u8ba4\u4f1a\u8ba1\u7b97hash\u5e76\u5411\u670d\u52a1\u5668\u9a8c\u8bc1\uff0c\u8f83\u4e3a\u8017\u65f6\u3002\u53ef\u4f7f\u7528 --offline \u8df3\u8fc7\uff09\n\n```shell\nasmr file check\nasmr file check --list | xargs asmr dl get --force   # \u91cd\u65b0\u4e0b\u8f7d\u6240\u6709\u4e0d\u5b8c\u6574\u7684\u6587\u4ef6\uff0c\u4ee5bash shell\u4e3a\u4f8b\n```\n\n\u5c06\u4e0b\u8f7d\u7684\u6587\u4ef6\u8f6c\u79fb\u5230\u5b58\u50a8\u76ee\u5f55(STORAGE_PATH)\uff0c\u5e76\u6267\u884c\u76f8\u5e94\u6587\u4ef6\u683c\u5f0f\u8f6c\u6362(\u8be6\u60c5\u89c1config.toml\u7684before_store\u5b57\u6bb5)\n\n```shell\nasmr file store --all\n```\n\n\u6bd4\u8f83\u672c\u5730\u6587\u4ef6\u4e0e\u670d\u52a1\u5668\u6587\u4ef6\u7684\u5dee\u5f02\uff1a\n\n![diff](./assets/diff.png)\n\n\u7b80\u5355\u7684\u5173\u952e\u8bcd\u641c\u7d22\uff08\u672c\u5730\u6570\u636e\u5e93\uff09\uff1a\n\n```shell\nasmr query \u6cbb\u6108 --limit 3  # \u641c\u7d22\u5b57\u6bb5\u6709\uff1a\u6807\u9898\uff0c\u793e\u56e2\u540d\u548c\u6807\u7b7e\u540d\nasmr query \u6cbb\u6108 --limit 3 --raw | jq .[].id | xargs -n1 asmr info # \u8f93\u51fa\u4e3ajson\u683c\u5f0f\uff0c\u83b7\u53d6\u8be6\u7ec6\u4fe1\u606f\n```\n\n\u6807\u7b7e\u6295\u7968\uff08\u5bf9\u4e8e\\*nix\u7528\u6237\uff0c\u5b89\u88c5\u547d\u4ee4\u884c\u8865\u5168\u540e\u53ef\u4ee5\u66f4\u5feb\u6377\u5730\u627e\u5230\u60f3\u8981\u7684tag\uff1bwindows\u7528\u6237\u4e5f\u53ef\u4ee5\u9009\u62e9\u4e0d\u4f20\u5165tag\uff0c\u4ea4\u4e92\u5f0f\u9009\u62e9tag\uff09\n\n```shell\nasmr vote up -t ASMR\nasmr vote down -t 497\nasmr vote up  # \u4e0d\u4f20\u5165-t\u53c2\u6570\uff0c\u4f1a\u8fdb\u5165\u4ea4\u4e92\u5f0f\u9009\u62e9\u6a21\u5f0f\n```\n\n\u64ad\u653e\u5217\u8868\u7ba1\u7406\n\n```shell\nasmr pl list # \u5217\u51fa\u6240\u6709\u64ad\u653e\u5217\u8868\nasmr pl create myplaylist --desc \"An example playlist\" --privacy PRIVATE  # \u521b\u5efa\u4e00\u4e2a\u64ad\u653e\u5217\u8868\uff0c\u5e76\u5c06\u6743\u9650\u8bbe\u7f6e\u4e3a\u79c1\u5bc6\u3002\nasmr pl add myplaylist RJ123456  # \u5c06\u97f3\u58f0\u6dfb\u52a0\u5230myplaylist\u64ad\u653e\u5217\u8868\u4e2d\nasmr pl show myplaylist  # \u5c55\u793amyplaylist\u64ad\u653e\u5217\u8868\u4e2d\u7684\u97f3\u58f0\n```\n\n\u751f\u6210\u5b57\u5e55\u6587\u4ef6\uff0c\u76ee\u524d\u4ec5\u652f\u6301LRC\u683c\u5f0f\uff1a\n\n```shell\nasmr utils subtitle\n```\n\n## \u5173\u4e8e`dl search/get`\u7684\u4f7f\u7528\uff08\u4f5c\u54c1\uff0c\u6807\u7b7e\uff0c\u6587\u4ef6\u7684\u8fc7\u6ee4\u7ec6\u8282\uff09\n\n\u547d\u4ee4\u6267\u884c\u8fc7\u7a0b\u4e2d\u4f1a\u8fdb\u884c\u5982\u4e0b\u7684\u68c0\u67e5\u4e0e\u8fc7\u6ee4\u64cd\u4f5c\uff1a\n\n1. \u5f00\u59cb\u4e0b\u8f7d\u524d\uff1a\u68c0\u67e5RJ\u53f7\u662f\u5426\u5e94\u8be5\u4e0b\u8f7d\uff0c\u5982\u679c\u672c\u5730\u6587\u4ef6\u4e0d\u5b58\u5728\u6216\u8005\u6570\u636e\u5e93\u65e0\u8bb0\u5f55\u90fd\u4f1a\u6267\u884c\u4e0b\u8f7d\u64cd\u4f5c\u3002\u53ef\u4ee5\u901a\u8fc7 `--force` \u5f3a\u5236\u6267\u884c\u4e0b\u8f7d\u3002\n1. \u83b7\u53d6\u97f3\u58f0\u4fe1\u606f\u540e\uff1a\u68c0\u67e5\u97f3\u58f0\u7684tags\uff0c\u5982\u679c\u5305\u542btag_filters\u91cc\u6307\u5b9a\u7684tag\uff0c\u5219\u8df3\u8fc7\u4e0b\u8f7d\u3002\u53ef\u4ee5\u901a\u8fc7 `--ignore-tag` \u6765\u5f3a\u5236\u4e0b\u8f7d\u3002\n1. \u83b7\u53d6\u4e0b\u8f7d\u6587\u4ef6\u540e\uff1a\u68c0\u67e5\u6587\u4ef6\u7684\u540d\u79f0\u548c\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u7b26\u5408filename_filters\u91cc\u6307\u5b9a\u7684\u89c4\u5219\uff0c\u5219\u8df3\u8fc7\u4e0b\u8f7d\u3002\u53ef\u4ee5\u901a\u8fc7`--ignore-name`\u6765\u5f3a\u5236\u4e0b\u8f7d\u3002\n1. \u6dfb\u52a0\u4e0b\u8f7d\u4efb\u52a1\u65f6\uff1a\u5982\u679c\u68c0\u6d4b\u5230\u672c\u5730\u6709\u540c\u540d\u6587\u4ef6\uff0c\u5219\u8df3\u8fc7\u8be5\u6587\u4ef6\u7684\u4e0b\u8f7d\u3002\u53ef\u4ee5\u901a\u8fc7`--replace`\u6765\u5f3a\u5236\u8986\u76d6\u5b58\u5728\u7684\u6587\u4ef6\u3002\n\n## \u591a\u7ebf\u7a0b\u4e0b\u8f7d\u76f8\u5173\n\n\u7531\u4e8e\u7f51\u7ad9\u5bf9\u4e0b\u8f7d\u5e76\u65e0\u76f8\u5173\u9650\u5236\uff0c\u56e0\u6b64\u6ca1\u5fc5\u8981\u8bbe\u7f6e\u8fc7\u9ad8\u7684\u7ebf\u7a0b\u6570\uff0c\u4e00\u822c\u6765\u8bf4\u5355\u6587\u4ef61\uff5e2\u5373\u53ef\u3002\n\u5bf9\u4e8e `IDM` \u8bbe\u7f6e\u65b9\u6cd5\u5982\u4e0b\uff1a\n![IDM](./assets/IDM.png)\n\n\u5bf9\u4e8e `aria2` \u4fee\u6539\u914d\u7f6e `max-connection-per-server = 2` \u5373\u53ef\uff1a\n\n## \u5176\u4ed6\n\n\u611f\u8c22 <https://asmr.one>\u4e30\u5bcc\u4e86\u6211\u7684\u591c\u751f\u6d3b\u3002\n\u53e6\u5916\u7f51\u7ad9\u8fd0\u8425\u4e0d\u6613\uff0c\u8bf7\u5408\u7406\u4f7f\u7528\u672c\u5de5\u5177\u3002\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "download, manage and play the voices on asmr.one",
    "version": "2.6.8",
    "project_urls": {
        "repository": "https://github.com/slqy123/ASMRManager"
    },
    "split_keywords": [
        "asmr",
        " downloader",
        " music",
        " player",
        " manager",
        " cli",
        " tui",
        " commandline",
        " terminal"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0d07649326170aae437fac1748b268293ec649f1017fa575bd3c643b2eba8397",
                "md5": "d7d585eac5d0e64edc20213f0ff96dfc",
                "sha256": "deb183b2a4dea25f5d1abf687faf17714f16c185a87ccd8b5ba9180685af6ff4"
            },
            "downloads": -1,
            "filename": "asmrmanager-2.6.8-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "d7d585eac5d0e64edc20213f0ff96dfc",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.12",
            "size": 81615,
            "upload_time": "2025-08-06T17:17:53",
            "upload_time_iso_8601": "2025-08-06T17:17:53.257145Z",
            "url": "https://files.pythonhosted.org/packages/0d/07/649326170aae437fac1748b268293ec649f1017fa575bd3c643b2eba8397/asmrmanager-2.6.8-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e9ca7b94da5731b67576d567a4e37e0ce1f318451e33d95e7e0b731d704d65b9",
                "md5": "fed30452d40750422e16232baab67d04",
                "sha256": "8e7dfa4d257f8417a5d1f6bdc9bd46e8e9a41f3ade8a754b035031657917d003"
            },
            "downloads": -1,
            "filename": "asmrmanager-2.6.8.tar.gz",
            "has_sig": false,
            "md5_digest": "fed30452d40750422e16232baab67d04",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.12",
            "size": 66628,
            "upload_time": "2025-08-06T17:17:56",
            "upload_time_iso_8601": "2025-08-06T17:17:56.754707Z",
            "url": "https://files.pythonhosted.org/packages/e9/ca/7b94da5731b67576d567a4e37e0ce1f318451e33d95e7e0b731d704d65b9/asmrmanager-2.6.8.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-06 17:17:56",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "slqy123",
    "github_project": "ASMRManager",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "asmrmanager"
}
        
Elapsed time: 1.71965s