Flutter Transmission RPC控制插件dart_transmission_rpc的使用

发布于 1周前 作者 htzhanglong 来自 Flutter

Flutter Transmission RPC 控制插件 dart_transmission_rpc 的使用

概述

dart_transmission_rpc 是一个用 Dart 实现的 Transmission RPC 客户端,支持 rpc-version>=14。更多详细信息可以查看 Transmission/rpc-spec.md

功能

会话功能

  • ✅ session-get
  • ✅ session-set
  • ✅ session-stats
  • ✅ blocklist-update
  • ✅ port-test
  • ✅ session-close
  • ✅ queue-move-top
  • ✅ queue-move-up
  • ✅ queue-move-down
  • ✅ queue-move-bottom
  • ✅ free-space
  • ✅ group-set
  • ✅ group-get

种子功能

  • ✅ torrent-start
  • ✅ torrent-start-now
  • ✅ torrent-stop
  • ✅ torrent-verify
  • ✅ torrent-reannounce
  • ✅ torrent-set
  • ✅ torrent-get
  • ✅ torrent-add
  • ✅ torrent-remove
  • ✅ torrent-set-location
  • ✅ torrent-rename-path

开始使用

添加依赖

使用 dart pub add 命令

dart pub add dart_transmission_rpc

或者手动添加到 pubspec.yaml

dependencies:
  ...
  dart_transmission_rpc: any  # 或指定版本

然后运行 dart pub getflutter pub get

使用示例

初始化客户端

import 'package:dart_transmission_rpc/client.dart';

final client = TransmissionRpcClient(
  username: "admin", 
  password: "123456"
);
await client.init();

获取会话信息

// 获取会话信息
final sessionInfo = await client.sessionGet(null);
print(sessionInfo.param?.version);

获取种子信息

// 获取种子信息
final torrentInfo = await client.torrentGet([
  TorrentGetArgument.name,
  TorrentGetArgument.id,
  TorrentGetArgument.hashString,
  TorrentGetArgument.addedDate,
  TorrentGetArgument.pieces,
]);
print(torrentInfo.param?.torrents);

添加种子

// 添加种子
await client.torrentAdd(
  TorrentAddRequestArgs(
    fileInfo: TorrentAddFileInfo.byMetainfo(
        io.File("demo/demo_test.torrent").readAsBytesSync()),
    downloadDir: "/downloads/complete",
    labels: ["test", "test1"],
  ),
);

// 或通过磁力链接添加种子
await client.torrentAdd(
  TorrentAddRequestArgs(
    fileInfo: TorrentAddFileInfo.byFilename(
        "magnet:?xt=urn:btih:cce82738e2f9217c5631549b0b8c1dfe12331503&dn=debian-12.5.0-i386-netinst.iso"),
    downloadDir: "/downloads",
    labels: ["test", "test1", "test2"],
  ),
);

其他操作

启动种子

await client.torrentStart(const TorrentIds([TorrentId(id: 2)]));

停止种子

await client.torrentStop(const TorrentIds([TorrentId(id: 2)]));

验证种子

await client.torrentVerify(const TorrentIds([TorrentId(id: 2)]));

重新公告

await client.torrentReannounce(const TorrentIds([TorrentId(id: 2)]));

设置种子位置

final result1 = await client.torrentAdd(
  TorrentAddRequestArgs(
    fileInfo: TorrentAddFileInfo.byMetainfo(
        io.File("demo/demo_test.torrent").readAsBytesSync()),
    downloadDir: "/downloads/complete",
  ),
);

final ids = TorrentIds([TorrentId(id: result1.param!.torrent!.id.id!.toInt())]);
await client.torrentSetLocation(
    TorrentSetLocationArgs(ids: ids, location: "/downloads"));

重命名路径

final result1 = await client.torrentAdd(
  TorrentAddRequestArgs(
    fileInfo: TorrentAddFileInfo.byMetainfo(
        io.File("demo/demo_test.torrent").readAsBytesSync()),
    downloadDir: "/downloads/complete",
  ),
);

final ids = TorrentIds([TorrentId(id: result1.param!.torrent!.id.id!.toInt())]);
await client.torrentRenamePath(TorrentRenamePathArgs(
    id: ids.first,
    oldPath: "debian-12.5.0-i386-netinst.iso",
    newName: "debian-12.5.0-i386-netinst.rename.iso"));

完整示例代码

import 'dart:io' as io;
import 'package:dart_transmission_rpc/client.dart';

Future<void> main() async {
  final client = TransmissionRpcClient(
    username: "admin", 
    password: "123456"
  );
  await client.init();

  // 获取会话信息
  final sessionInfo = await client.sessionGet(null);
  print(sessionInfo.param?.version);

  // 获取种子信息
  final torrentInfo = await client.torrentGet([
    TorrentGetArgument.name,
    TorrentGetArgument.id,
    TorrentGetArgument.hashString,
    TorrentGetArgument.addedDate,
    TorrentGetArgument.pieces,
  ]);
  print(torrentInfo.param?.torrents);

  // 添加种子
  await client.torrentAdd(
    TorrentAddRequestArgs(
      fileInfo: TorrentAddFileInfo.byMetainfo(
          io.File("demo/demo_test.torrent").readAsBytesSync()),
      downloadDir: "/downloads/complete",
      labels: ["test", "test1"],
    ),
  );

  // 通过磁力链接添加种子
  await client.torrentAdd(
    TorrentAddRequestArgs(
      fileInfo: TorrentAddFileInfo.byFilename(
          "magnet:?xt=urn:btih:cce82738e2f9217c5631549b0b8c1dfe12331503&dn=debian-12.5.0-i386-netinst.iso"),
      downloadDir: "/downloads",
      labels: ["test", "test1", "test2"],
    ),
  );
}

更多关于Flutter Transmission RPC控制插件dart_transmission_rpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Transmission RPC控制插件dart_transmission_rpc的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 dart_transmission_rpc 插件来控制 Transmission BitTorrent 客户端的示例代码。这个插件允许你通过 RPC (Remote Procedure Call) 接口与 Transmission 客户端进行交互。

首先,确保你已经在 Flutter 项目中添加了 dart_transmission_rpc 依赖。你可以在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  dart_transmission_rpc: ^最新版本号  # 请替换为实际的最新版本号

然后运行 flutter pub get 来获取依赖。

下面是一个示例代码,展示如何使用 dart_transmission_rpc 来获取 Transmission 客户端的会话状态:

import 'package:flutter/material.dart';
import 'package:dart_transmission_rpc/dart_transmission_rpc.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  TransmissionClient? _client;
  SessionInfo? _sessionInfo;
  String _status = "Connecting...";

  @override
  void initState() {
    super.initState();
    connectToTransmission();
  }

  void connectToTransmission() async {
    // 替换为你的 Transmission RPC 地址、端口、用户名和密码
    const rpcUrl = "http://your-transmission-rpc-address:9091/rpc";
    const rpcUsername = "your-rpc-username";
    const rpcPassword = "your-rpc-password";

    try {
      _client = await TransmissionClient.connect(rpcUrl, rpcUsername, rpcPassword);
      _sessionInfo = await _client!.getSessionInfo();
      setState(() {
        _status = "Connected!";
      });
    } catch (e) {
      setState(() {
        _status = "Failed to connect: ${e.message}";
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Transmission RPC Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                _status,
                style: TextStyle(fontSize: 24),
              ),
              if (_sessionInfo != null) {
                Text(
                  "Download Speed: ${_sessionInfo!.downloadSpeed!} KB/s",
                  style: TextStyle(fontSize: 18),
                ),
                Text(
                  "Upload Speed: ${_sessionInfo!.uploadSpeed!} KB/s",
                  style: TextStyle(fontSize: 18),
                ),
                Text(
                  "Active Torrents: ${_sessionInfo!.activeTorrentCount!}",
                  style: TextStyle(fontSize: 18),
                ),
              }
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _client?.close();
    super.dispose();
  }
}

解释

  1. 依赖导入:首先,我们导入了 dart_transmission_rpc 包。
  2. 连接 Transmission:在 initState 方法中,我们尝试连接到 Transmission RPC 服务器。连接成功后,我们获取会话信息并更新 UI。
  3. UI 更新:根据连接状态和会话信息,我们更新 UI 以显示相关信息。
  4. 资源释放:在 dispose 方法中,我们确保在组件销毁时关闭客户端连接。

注意事项

  • 请确保 Transmission RPC 服务器正在运行,并且你已经正确配置了 RPC 地址、端口、用户名和密码。
  • dart_transmission_rpc 插件的具体 API 和方法可能会随着版本的更新而变化,请参考最新的文档。

希望这个示例代码能帮助你理解如何使用 dart_transmission_rpc 插件来控制 Transmission BitTorrent 客户端。如果你有更具体的需求或问题,欢迎进一步提问!

回到顶部