Metadata-Version: 2.4
Name: pypang
Version: 0.3.0
Summary: Baidu Netdisk client with CLI commands and a matching FastAPI Web UI.
Author: huangzhong
Maintainer: huangzhong
License: MIT License
        
        Copyright (c) 2026 huangzhong
        
        Permission is hereby granted, free of charge, to any person obtaining a copy
        of this software and associated documentation files (the "Software"), to deal
        in the Software without restriction, including without limitation the rights
        to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
        copies of the Software, and to permit persons to whom the Software is
        furnished to do so, subject to the following conditions:
        
        The above copyright notice and this permission notice shall be included in all
        copies or substantial portions of the Software.
        
        THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
        IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
        FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
        AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
        LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
        OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
        SOFTWARE.
        
Project-URL: Homepage, https://github.com/HzForelsket/pypang
Project-URL: Repository, https://github.com/HzForelsket/pypang
Project-URL: Issues, https://github.com/HzForelsket/pypang/issues
Keywords: baidu,baidupan,netdisk,fastapi,cli
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Environment :: Web Environment
Classifier: Framework :: FastAPI
Classifier: Intended Audience :: End Users/Desktop
Classifier: Intended Audience :: System Administrators
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet
Classifier: Topic :: System :: Archiving
Classifier: Topic :: Utilities
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: fastapi<1.0,>=0.115
Requires-Dist: jinja2<4.0,>=3.1
Requires-Dist: python-multipart<1.0,>=0.0.9
Requires-Dist: requests<3.0,>=2.32
Requires-Dist: uvicorn<1.0,>=0.32
Dynamic: license-file

# pypang

`pypang` 是一个基于百度网盘开放平台接口的命令行客户端，同时提供本地 Web UI。它参考了 [bypy](https://github.com/houtianze/bypy) 的使用习惯，默认兼容 `bypy` 的应用目录 `/apps/bypy`。

## 特性

- CLI 和 Web UI 两套使用方式
- OAuth 授权，默认支持 `redirect_uri=oob`
- 文件浏览、上传、下载、重命名、移动、删除、建目录
- 多配置分别保存 token，可读取当前目录的 `config.json`
- Bash 下支持命令、选项和网盘路径 Tab 补全(需手动开启)
- CLI/Web 下载支持断点续传和校验
- 单文件超过百度开放平台上限时自动按卷上传

## 快速开始

安装：

```bash
pip install pypang
```

查看当前配置：

```bash
pypang config show
```

如果使用默认 `bypy` 配置，一般可以直接获取授权链接：

```bash
pypang auth url
```

浏览器打开授权链接后，从百度返回页复制 `code`，再执行：

```bash
pypang auth code <code>
```

列出网盘应用目录：

```bash
pypang ls /
```

启动 Web UI：

```bash
pypang serve
```

浏览器访问：

```text
http://127.0.0.1:8080
```

## 安装

### PyPI 安装

```bash
pip install pypang
```

### 源码安装

```bash
python -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .
```

## 配置与授权

### 默认配置

没有额外配置时，`pypang` 会使用内置的 `bypy` 应用配置：

- 应用目录：`/apps/bypy`
- 授权方式：`oob`
- 默认按普通用户档位运行
- CLI/Web 下载并发默认取 `8`
- 单文件下载默认开启分段并发，默认连接数为 `4`

运行状态默认保存在：

```text
~/.pypang/state.json
```

临时文件默认保存在：

```text
~/.pypang/tmp
```

### 修改配置

设置应用信息：

```bash
pypang config set --app-key your-app-key --secret-key your-secret-key --app-name myapp --app-root /apps/myapp --redirect-uri oob
```

只修改 Web UI 监听地址，不影响 token：

```bash
pypang config set --listen-host 0.0.0.0 --listen-port 8080
```

按会员档位调整上传分片和下载并发：

```bash
pypang config set --membership-tier vip --upload-chunk-mb 16 --cli-download-workers 4 --web-download-workers 4
```

调整单文件并发下载：

```bash
pypang config set --single-file-parallel-enabled --single-file-download-workers 4
```

调整网盘路径补全缓存时间，单位为秒，默认 `60`；设为 `0` 可关闭缓存：

```bash
pypang config set --completion-cache-seconds 120
```

### config.json

如果当前目录存在 `config.json`，程序会优先读取它。多应用示例：

```json
{
  "default": "myapp",
  "apps": [
    {
      "id": "bypy",
      "label": "bypy",
      "app_key": "q8WE4EpCsau1oS0MplgMKNBn",
      "secret_key": "PA4MhwB5RE7DacKtoP2i8ikCnNzAqYTD",
      "app_name": "bypy",
      "app_root": "/apps/bypy"
    },
    {
      "id": "myapp",
      "label": "我的应用",
      "app_key": "your-app-key",
      "secret_key": "your-secret-key",
      "app_name": "myapp",
      "app_root": "/apps/myapp"
    }
  ]
}
```

指定其他 `config.json` 路径：

```bash
export BAIDUPANWEB_LEGACY_CONFIG=/path/to/config.json
```

## Bash 补全

`pypang` 支持 Bash 下的命令、选项和网盘路径 Tab 补全。远端目录候选会追加 `/`，可以继续进入下一层；远端目录列表默认缓存 60 秒，避免连续按 Tab 时反复请求 API。

启用用户级 Bash 补全：

```bash
pypang open completion
```

它会写入：

```text
~/.pypang/completion.bash
~/.bashrc
```

新开的 Bash 会自动生效。当前 Bash 想立即生效，可执行：

```bash
source ~/.bashrc
```

关闭用户级 Bash 补全：

```bash
pypang close completion
```

当前 Bash 想立即取消，可执行：

```bash
complete -r pypang
```

临时启用，不修改 `~/.bashrc`：

```bash
source <(pypang completion bash)
```

注意：这是 Bash 补全，不会在 `dash`、`fish` 等非 Bash shell 中生效。

## CLI 常用命令

查看账号信息和容量：

```bash
pypang whoami
pypang quota
```

列目录和建目录：

```bash
pypang ls /
pypang mkdir /docs
```

上传文件：

```bash
pypang put ./local.txt /docs/remote.txt
```

上传目标也可以是目录：

```bash
pypang put ./local.txt /docs/
```

下载文件：

```bash
pypang get /docs/remote.txt ./downloads/
```

强制重新下载，不使用断点续传：

```bash
pypang get /docs/remote.txt ./downloads/ --no-resume
```

临时关闭单文件分段并发：

```bash
pypang get /docs/remote.txt ./downloads/ --no-single-file-parallel
```

重命名、移动、删除：

```bash
pypang rename /docs/remote.txt archive.txt
pypang mv /docs/archive.txt /history
pypang rm /history/archive.txt
```

命令别名：

- `ls` = `list`
- `put` = `upload`
- `get` = `download`
- `mv` = `move`
- `rm` = `delete`
- `whoami` = `info`

## Web UI

本机启动：

```bash
pypang serve
```

指定地址：

```bash
pypang serve --host 127.0.0.1 --port 8080
```

无桌面服务器可对外监听：

```bash
pypang config set --listen-host 0.0.0.0 --listen-port 8080
pypang serve
```

然后通过公网 IP、内网穿透、反向代理或 SSH 端口转发访问：

```text
http://服务器地址:8080
```

Web UI 授权流程：

1. 打开 Web UI
2. 点击授权按钮
3. 在百度返回页复制 `code`
4. 回到 Web UI 手动提交 `code`
5. 授权完成后即可上传、下载和管理文件

## 上传与下载行为

### 下载

下载流程：

```text
filemetas(dlink=1) -> dlink + access_token + User-Agent
```

CLI 下载和 Web UI 的“保存到服务器”会生成 `.part` 临时文件，并基于 `Range` 请求自动续传未完成部分。

恢复与校验规则：

- 下载前会扫描目标目录，检查已有正式文件和 `.part` 文件
- 本地文件大小已满足远端大小时，优先校验并复用
- 校验失败会删除错误文件后重新下载
- 远端 `md5` 合法时使用 MD5 校验，否则退回到大小校验
- Web UI 传输卡片会显示 `进行中 / 等待中 / 已完成`

### 上传

上传流程：

```text
locateupload -> precreate -> superfile2 -> create
```

单文件未超过平台上限时按普通流程上传。超过当前账号档位允许的单文件上限时，会在远端创建 `原文件名.parts` 目录并按卷上传。

多卷上传规则：

- 多卷命名为 `原文件名.001`、`原文件名.002`、`原文件名.003`
- 多卷默认并发上传 `4` 个卷
- 分卷预计算保持单线程顺序进行
- 多卷目录会额外写入 `extract.sh`，下载后可用它合并分卷
- 单卷大小默认跟随账号身份：普通用户 `4GB`、普通会员 `10GB`、超级会员 `20GB`
- 可用 `--upload-volume-gb` 手动设置单卷大小，实际值会限制在当前账号上限内

设置单卷大小：

```bash
pypang config set --upload-volume-gb 8
```

## 项目结构

```text
pypang/
  app.py
  cli.py
  client.py
  completion.py
  config.py
  storage.py
  static/
  templates/
app.list.json
README.md
requirements.txt
```

## 参考

- bypy: https://github.com/houtianze/bypy
- 百度网盘开放平台文档索引: https://pan.baidu.com/union/doc/nksg0sbfs
- OAuth 授权码模式: https://pan.baidu.com/union/doc/al0rwqzzl
- 文件列表: https://pan.baidu.com/union/doc/nksg0sat9
- 文件信息: https://pan.baidu.com/union/doc/Fksg0sbcm
- 上传域名: https://pan.baidu.com/union/doc/Mlvw5hfnr
- 预上传: https://pan.baidu.com/union/doc/3ksg0s9r7
- 分片上传: https://pan.baidu.com/union/doc/nksg0s9vi
- 创建文件: https://pan.baidu.com/union/doc/rksg0sa17
- 下载文件: https://pan.baidu.com/union/doc/pkuo3snyp
- 管理文件: https://pan.baidu.com/union/doc/mksg0s9l4
