Sign in

    open-list

    OpenList API 的 MoonBit 客户端:认证、用户、管理、文件系统、公开接口与分享六个子模块

    openlist
    http
    client
    api
    alist
    Download zip
    Version
    0.1.0
    License
    Apache-2.0
    Last updated
    15 hours ago
    Downloads
    2

    #q2316367743/open-list

    MoonBit 版 OpenList API 客户端: 一个门面(OpenListClient)+ 六个功能域子模块,HTTP 层用 q2316367743/moonhttp。

    • 支持 OpenList 的两种认证方式:永久 token,或账号密码(首次请求前 自动登录换取限时 token)。
    • 六个域各自独立成包,但共享同一份认证状态:client.auth().login(...) 之后, client.fs() 立刻可用。
    • 每个端点都有类型化方法;没封装的端点用 client.request(...) 逃生通道。
    • 契约以 OpenList v4 服务端源码为准(官方 API 文档有出入的地方在 docs/ 里逐条标出)。

    #安装

    moon add q2316367743/open-list

    #快速开始

    ///|
    async fn main {
    // 方式一:永久 token
    let client = @open-list.create_open_list_client_with_token(
    "https://openlist.example.com",
    "YOUR_PERMANENT_TOKEN",
    )

    // 方式二:账号密码(第一次需要认证的请求前自动登录)
    let client = @open-list.create_open_list_client(
    @open-list.Settings::new("https://openlist.example.com"),
    @open-list.Credentials::password("admin", "your-password"),
    )

    try {
    let entries = client.fs().list("/")
    println("共 \{entries.total} 项")
    println(client.public().init_status().initialized)
    } catch {
    @open-list.OpenListError::Api(error) => println("业务错误 \{error.code}: \{error.message}")
    error => println("请求失败:\{error.message()}")
    }
    }

    #六个子模块

    访问器包覆盖
    client.auth()src/auth登录(明文 / 预哈希 / LDAP)、退出、两步验证
    client.user()src/user/api/me、改资料、自己的 SSH 公钥
    client.admin()src/admin元信息、用户、存储、驱动、设置、索引
    client.fs()src/fs列目录 / 读取、文件管理、上传(流式 / 分片)、归档、离线下载
    client.public()src/public站点设置、离线下载工具、归档扩展名、初始化
    client.share()src/share分享记录的增删改查与启停

    OpenListClient 还提供:

    成员说明
    settings()连接设置(base_url 已去掉结尾 /)
    token() / set_token(String?) / is_logged_in()共享认证状态
    request(method, path, query?, body?, headers?)直接调用任意 /api/...,返回信封里的 data

    匿名访问(如 /api/public/*)用 create_open_list_client_with_token(base_url, ""): 空 token 表示不发 Authorization 头。

    #文档

    技术文档在 docs/:

    #开发

    moon check # 静态检查 moon test # 全部测试(不联网,注入 Mock 传输层) moon fmt # 格式化 moon info # 更新 .mbti moon run src/main # 真机联调程序(永久 token 模式,见 docs/09)

    #已知限制

    • 账号密码凭证下,并发首次调用可能发出两次登录请求(结果一致)。
    • token 过期不主动刷新,只在这次请求收到 401 时重登一次。
    • 时间统一是 RFC3339 字符串;开放取值集合用 String / Int,不建枚举。
    • SSO、WebAuthn、任务域、扫描、种子等未封装,见 docs/08。

    ApiError

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    ArchiveContent

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    ArchiveMetaResponse

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    Credentials

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    DirResp

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    DriverConfig

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    DriverInfo

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    DriverItem

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    FileHash

    文件域入参:上传哈希与批量重命名的一对名字。

    FsGetResponse

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    FsListResponse

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    IndexProgress

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    InitStatus

    公共域模型再导出:初始化状态。

    上传与任务相关模型再导出:分片会话、任务信息与直链。

    ListSort

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    Meta

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    Method

    门面:把子包里对使用者有意义的类型从根包再导出一份。

    这样开发者只 import 一个 @moonhttp 就能拿到全部公开类型, 不必记住每个类型归属哪个子包。子包结构本身仍然保留, 需要精细控制的使用者(例如自己实现 Transport)可以直接依赖对应子包。

    约定:凡是出现在公开签名里的类型,都在定义它的包里再导出一次, 因此各层之间不会出现「要用这个 API 却不知道类型该从哪 import」的情况。 请求体的相关类型也一并再导出:with_data_from_form 的入参是 FormData, serialize_body 的返回值是 SerializedBody,流式请求体(docs/20)的载荷 是 StreamBody——自定义传输实现按 RequestBody::Stream 解构时要用到它。 进度回调的两个类型同理:with_on_upload_progress 的入参是 ProgressCallback。

    MultipartInitResponse

    上传与任务相关模型再导出:分片会话、任务信息与直链。

    ObjResp

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    OpenListError

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    PageResult

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    PasswordCredentials

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    RenameObject

    文件域入参:上传哈希与批量重命名的一对名字。

    SSHPublicKey

    用户域模型再导出:/api/me 与 /api/admin/user/* 共用。

    SearchResult

    文件域模型再导出:目录项、列表/详情响应、搜索结果与归档。

    SessionSnapshot

    上传与任务相关模型再导出:分片会话、任务信息与直链。

    SettingItem

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    Settings

    核心类型再导出:连接设置、凭证、统一错误与全部分页结果。

    OpenListClient 的构造参数与六个域子模块的返回值都用这些类型。

    SharingResponse

    分享域响应模型再导出。

    SharingUpdateRequest

    分享域的创建 / 更新入参。

    Storage

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    StorageDetails

    管理域模型再导出:元信息、存储、设置项、驱动与索引进度。

    TaskInfo

    上传与任务相关模型再导出:分片会话、任务信息与直链。

    Transport

    传输层抽象也一并再导出:自定义传输实现是公开的扩展点。

    UpdateIndexRequest

    管理域的索引更新入参。

    UpdateMeRequest

    请求体类型再导出:各域方法的入参。

    User

    用户域模型再导出:/api/me 与 /api/admin/user/* 共用。

    UserResponse

    用户域模型再导出:/api/me 与 /api/admin/user/* 共用。

    OpenListClient

    pub struct OpenListClient {
    // private fields
    }

    OpenList 客户端:认证状态的持有者,也是六个 API 域子模块的入口。

    由一个服务器信息(Settings)与一份凭证(Credentials)创建, 创建时就把六个子模块派生好——auth / user / admin / fs / public / share。它们共享同一份认证状态:用账号密码登录后拿到的限时 token 对所有子模块立即生效,set_token 也一样。

    子模块的字段是私有的,只能由客户端派生(见 docs/00-architecture.md)。

    OpenListClient::admin

    管理子模块:元信息、用户、存储、驱动、设置与索引(需要管理员权限)。

    OpenListClient::auth

    认证子模块:登录(明文 / 预哈希 / LDAP)、退出、token 与两步验证。

    OpenListClient::fs

    文件子模块:列目录、读写、管理、上传(含分片)与归档。

    OpenListClient::is_logged_in

    fn OpenListClient::is_logged_in(self : OpenListClient) -> Bool

    是否已持有可用 token(永久 token,或账号密码换来的限时 token)。

    OpenListClient::public

    公共子模块:站点设置、离线下载工具、归档扩展名与站点初始化。

    OpenListClient::request

    async fn OpenListClient::request(self : OpenListClient, http_method :
    Method
    , path : String, query? : Json, body? : Json, headers? : Array[(String, String)]) -> Json raise
    OpenListError

    逃生通道:直接请求任意 /api/... 端点,返回信封里的 data(原样 Json)。

    官方客户端没有把它封装成方法的端点(SSO、WebAuthn、/api/task/* 等, 清单见 docs/08-unsupported-endpoints.md)都可以用它调用。认证、账号密码 凭证的 401 重登、信封检查与 code != 200 抛 Api 都在这一层自动完成:

    let status = client.request(Method::Get, "/api/public/init_status")

    OpenListClient::set_token

    fn OpenListClient::set_token(self : OpenListClient, token : String?) -> Unit

    直接覆盖 token,用于从本地持久化状态恢复会话,或主动让 token 失效。

    OpenListClient::settings

    连接设置(创建时固化进客户端)。

    OpenListClient::share

    分享子模块:创建 / 查询 / 启停分享链接。

    OpenListClient::token

    fn OpenListClient::token(self : OpenListClient) -> String?

    当前 token:永久凭证就是它本身;账号密码凭证在登录成功前是 None。

    OpenListClient::user

    当前用户子模块:/api/me 与自己的 SSH 公钥。

    create_open_list_client

    创建客户端:服务器信息 + 凭证。

    凭证支持 OpenList 的两种认证方式:

    // 1. 永久 token(后台生成的,直接拿来用)
    let client = create_open_list_client(
    Settings::new("https://openlist.example.com"),
    Credentials::token("..."),
    )

    // 2. 账号密码:第一次需要认证的请求前自动登录,换取限时 token

    let client = create_open_list_client(
    Settings::new("https://openlist.example.com"),
    Credentials::password("admin", "secret"),
    )

    let files = client.fs().list("/")

    create_open_list_client_with_token

    fn create_open_list_client_with_token(base_url : String, token : String) -> OpenListClient

    用永久 token 创建客户端(create_open_list_client 的常用简写)。