Metadata-Version: 2.1
Name: ASMRManager
Version: 2.9.3
Summary: download, manage and play the voices on asmr.one
Keywords: asmr,downloader,music,player,manager,cli,tui,commandline,terminal
Author-Email: SLQY <sqiyel@gmail.com>
License: MIT
Project-URL: repository, https://github.com/slqy123/ASMRManager
Requires-Python: >=3.12
Requires-Dist: aiohttp>=3.8.6
Requires-Dist: chardet>=5.1.0
Requires-Dist: click>=8.1.3
Requires-Dist: pylrc==0.1.2
Requires-Dist: rich>=13.0.0
Requires-Dist: SQLAlchemy>=2.0.36
Requires-Dist: textual>=1
Requires-Dist: mutagen>=1.46.0
Requires-Dist: appdirs>=1.4.4
Requires-Dist: toml>=0.10.2
Requires-Dist: beaupy>=3.11.0
Requires-Dist: asyncstdlib>=3.13.1
Requires-Dist: xxhash>=3.5.0
Provides-Extra: pygame
Requires-Dist: pygame>=2.5.0; extra == "pygame"
Provides-Extra: mpd
Requires-Dist: python-mpd2>=3.1.0; extra == "mpd"
Provides-Extra: aria2
Requires-Dist: aioaria2>=1.3.4; extra == "aria2"
Provides-Extra: idm
Requires-Dist: comtypes>=1.2.0; extra == "idm"
Provides-Extra: tui
Requires-Dist: trogon>=0.4.0; extra == "tui"
Provides-Extra: player
Requires-Dist: sounddevice>=0.5.3; extra == "player"
Requires-Dist: soundfile>=0.13.1; extra == "player"
Provides-Extra: subtitle
Requires-Dist: faster-whisper>=1.1.1; extra == "subtitle"
Requires-Dist: ctranslate2>=4.6.0; extra == "subtitle"
Provides-Extra: image
Requires-Dist: textual-image>=0.8.5; extra == "image"
Provides-Extra: dev
Requires-Dist: pyinstrument>=4.6.2; extra == "dev"
Requires-Dist: viztracer>=0.16.3; extra == "dev"
Requires-Dist: ruff>=0.11.5; extra == "dev"
Requires-Dist: mypy>=1.15.0; extra == "dev"
Provides-Extra: all
Requires-Dist: asmrmanager[aria2,idm,image,player,subtitle,tui]; extra == "all"
Description-Content-Type: text/markdown

# ASMRManager

<details>
  <summary>

## →目录←

  </summary>

<!--toc:start-->

- [ASMRManager](#asmrmanager)
  - [功能介绍](#功能介绍)
    - [下载](#下载)
    - [管理](#管理)
    - [播放](#播放)
  - [使用方法](#使用方法)
  - [命令行补全](#命令行补全)
  - [使用示例](#使用示例)
  - [常见问题与使用提示](#常见问题与使用提示)
    - [IDM 不会自动下载，只能一个一个文件下载](#idm-不会自动下载只能一个一个文件下载)
    - [Windows CMD 中的显示错误问题（选项重复，无高亮显示）](#windows-cmd-中的显示错误问题选项重复无高亮显示)
    - [关于`dl search/get`的使用（作品，标签，文件的过滤细节）](#关于dl-searchget的使用作品标签文件的过滤细节)
    - [多线程下载相关](#多线程下载相关)
  - [其他](#其他)
<!--toc:end-->

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

## 功能介绍

### 下载

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

### 管理

下载的音声作品元数据会存储在本地 SQLite 数据库中，基于此提供了以下功能（仅本地）：

- 对作品进行评分，评论。
- 使用预定义的SQL脚本进行查询(仓库提供了一些模板，例如 [search.sql](./asmrmanager/filemanager/resources/sqls.example/search.sql))

同时也提供网站以下API接口的CLI实现：

- 管理用户播放列表
- 对作品标签进行投票

### 播放

非常简陋的终端播放界面，支持歌词显示，按照歌词信息快进，切换歌曲<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`，`player`，`tui`，`subtitle`，`image`，`all`，多个依赖使用逗号分隔，其中`all`为安装所有依赖。
具体功能如下：

- 下载：`idm` 或 `aria2` 二选一，`idm` 为 windows 平台专用，`aria2` 为跨平台。
- 播放： `player` 使用内置的命令行播放器，使用 `sounddevice` 库作为后端。
- 其他：`tui` 为可视化命令行界面。`image`提供在支持图像显示协议终端渲染作品封面的功能。`subtitle` 使用faster-whisper生成字幕文件。

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

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

---

之后再运行 `asmr` 命令，会生成示例的[配置文件](./asmrmanager/filemanager/resources/config.example.toml)和 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
```

预览搜索结果（不下载）
```shell
asmr dl search --preview --all  # 返回表格
# 也可以返回可解析的json数据，自定义下载规则，例如：
asmr dl search --json --all | jq '.[].id' | awk '$1 % 2 == 0' | xargs asmr dl get
# 将下载所有RJ号为偶数的作品
```

根据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 --all
asmr file check --all --list | xargs asmr dl get --force --replace   # 重新下载所有不完整的文件，以bash shell为例
```

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

```shell
asmr file store --all --check offline
# --check none，默认值，表示不检查文件完整性直接存储
# --check offline 只检查本地文件是否存在
# --check online 同时会向服务器验证hash
```

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

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

打开音声所在文件夹(linux 上调用xdg-open，windows使用explorer.exe)：

```shell
asmr which --show <ID>
```

简单的关键词搜索（本地数据库）：

```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
```

## 常见问题与使用提示

### IDM 不会自动下载，只能一个一个文件下载

默认不自动开始下载是预期内行为，IDM目前开放的API好像不支持后台静默下载。想要自动下载的话就无法在后台下载，也无法控制同时下载的文件数。

本应用会将下载任务发送到IDM的`主要下载队列`中，你需要打开IDM，点击开始队列才能下载。
如果想控制同时下载的文件数，可以找到`主要下载队列`，右键`编辑队列`即可修改。

### Windows CMD 中的显示错误问题（选项重复，无高亮显示）

Windows CMD缺少非常多的终端高级特性的支持，如需获得正确的显示效果，推荐使用 Windows Terminal + PowerShell。
其中 Windows Terminal 为 win11 的默认终端，win10 也可以直接从微软商店安装。

### 关于`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>丰富了我的夜生活。
另外网站运营不易，请合理使用本工具。
