Flutter音频书架管理插件audiobookshelf_api的使用

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

Flutter音频书架管理插件audiobookshelf_api的使用

Pub Version GitHub Workflow Status Codecov

audiobookshelf_api 是一个Dart库,用于与自托管的有声书和播客服务器 audiobookshelf 的API进行交互。该库支持 audiobookshelf v2.2.15 版本。

特性

  • 提供了每个 audiobookshelf API端点的Dart惯用包装。
  • 提供了通过Dart Stream 访问 audiobookshelf 的Socket.IO接口。
  • 所有的响应模式都是 freezed 对象。

使用方法

认证/登录

要访问大多数API端点,需要一个 token。这个token可以在创建 AudiobookshelfApi 对象时提供,或者通过登录获取。

final api = AudiobookshelfApi(baseUrl: Uri.https('abs.example.com'));

final loginResponse = await api.login(username: 'username', password: 'password');
if (loginResponse == null) {
  throw Exception('Error logging in');
}

// 登录后,token将被写入 `AudiobookshelfApi` 对象。
// 它可以被存储以供将来使用。
final token = api.token;

final apiWithToken = AudiobookshelfApi(
  baseUrl: Uri.https('abs.example.com'),
  token: token,
);
API

AudiobookshelfApi 类的设置几乎完全模仿API URL。例如,继续上面的例子,获取一个图书馆并打印其名称:

final getLibraryResponse = await api.libraries.get(
  libraryId: loginResponse.userDefaultLibraryId,
);
if (getLibraryResponse == null) {
  throw Exception('Error getting default library');
}

// e.g. 'Audiobooks'
print(getLibraryResponse.library.name);
Socket

要使用Socket,首先设置回调函数,然后初始化它。

final onInitSub = api.socket.miscEvents.onInit.listen((initEvent) {
  // e.g. 'username'
  print(initEvent.username);
});
api.socket.init();

await onInitSub.cancel();
清理

完成操作后,确保调用 dispose 方法清理 AudiobookshelfApi 对象。

api.dispose();
进一步使用

查看 audiobookshelfAPI文档 以获取更多信息。


示例代码

import 'package:audiobookshelf_api/audiobookshelf_api.dart';

void main() async {
  final api = AudiobookshelfApi(baseUrl: Uri.https('abs.example.com'));

  final loginResponse = await api.login(username: 'username', password: 'password');
  if (loginResponse == null) {
    throw Exception('Error logging in');
  }

  // 登录后,token将被存储在 `AudiobookshelfApi` 对象中,并且可以跳过登录步骤:
  // `AudiobookshelfApi(baseUrl: Uri.https('abs.example.com'), token: token)`
  //
  // e.g. 'exJhbGciOiJI6IkpXVCJ9.eyJ1c2Vyi5NDEyODc4fQ.ZraBFohS4Tg39NszY'
  print(api.token);

  final getLibraryResponse = await api.libraries.get(
    libraryId: loginResponse.userDefaultLibraryId,
  );
  if (getLibraryResponse == null) {
    throw Exception('Error getting default library');
  }

  // e.g. 'Audiobooks'
  print(getLibraryResponse.library.name);

  // 要使用Socket,设置回调函数并初始化它。
  final onInitSub = api.socket.miscEvents.onInit.listen((initEvent) {
    // e.g. 'username'
    print(initEvent.username);
  });
  api.socket.init();

  await onInitSub.cancel();

  // 完成后,确保释放 `AudiobookshelfApi` 实例。
  api.dispose();
}

更多关于Flutter音频书架管理插件audiobookshelf_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter音频书架管理插件audiobookshelf_api的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用audiobookshelf_api插件的一个基本示例。假设你已经将audiobookshelf_api插件添加到你的pubspec.yaml文件中并运行了flutter pub get

首先,确保你的pubspec.yaml文件中包含以下依赖项:

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

然后,你可以按照以下步骤在你的Flutter项目中使用audiobookshelf_api插件。

1. 导入插件

在你的Dart文件中导入插件:

import 'package:audiobookshelf_api/audiobookshelf_api.dart';

2. 初始化插件

通常,你可能需要在应用启动时初始化插件。这里假设插件有一个初始化方法(具体方法名称和参数请参考插件的官方文档):

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  // 假设audiobookshelf_api有一个initialize方法
  await AudiobookshelfApi.initialize();
  
  runApp(MyApp());
}

3. 使用插件功能

以下是一个简单的示例,展示如何使用插件管理音频书籍。这包括添加书籍、获取书籍列表和播放书籍。请注意,这些方法和类的具体实现取决于插件的API设计,以下代码仅为示例:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await AudiobookshelfApi.initialize();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Audio Book Shelf Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: AudioBookShelfHome(),
    );
  }
}

class AudioBookShelfHome extends StatefulWidget {
  @override
  _AudioBookShelfHomeState createState() => _AudioBookShelfHomeState();
}

class _AudioBookShelfHomeState extends State<AudioBookShelfHome> {
  List<AudioBook> books = [];

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

  Future<void> _fetchBooks() async {
    // 假设有一个获取书籍列表的方法
    List<AudioBook> fetchedBooks = await AudiobookshelfApi.getBooks();
    setState(() {
      books = fetchedBooks;
    });
  }

  Future<void> _addBook(String title, String url) async {
    // 假设有一个添加书籍的方法
    AudioBook newBook = AudioBook(title: title, url: url);
    await AudiobookshelfApi.addBook(newBook);
    _fetchBooks();
  }

  Future<void> _playBook(AudioBook book) async {
    // 假设有一个播放书籍的方法
    await AudiobookshelfApi.playBook(book);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Audio Book Shelf'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            ElevatedButton(
              onPressed: () async {
                String title = 'Sample Book';
                String url = 'http://example.com/samplebook.mp3';
                await _addBook(title, url);
              },
              child: Text('Add Book'),
            ),
            SizedBox(height: 16),
            Expanded(
              child: ListView.builder(
                itemCount: books.length,
                itemBuilder: (context, index) {
                  AudioBook book = books[index];
                  return ListTile(
                    title: Text(book.title),
                    trailing: IconButton(
                      icon: Icon(Icons.play_arrow),
                      onPressed: () => _playBook(book),
                    ),
                  );
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

// 假设AudioBook是一个简单的数据模型
class AudioBook {
  final String title;
  final String url;

  AudioBook({required this.title, required this.url});
}

注意事项

  1. 插件API:上述代码中的AudiobookshelfApi.initialize(), AudiobookshelfApi.getBooks(), AudiobookshelfApi.addBook(newBook), 和 AudiobookshelfApi.playBook(book)等方法名称和参数是假设的。你需要参考audiobookshelf_api插件的实际文档来调用正确的方法和传递正确的参数。

  2. 错误处理:在实际应用中,你应该添加适当的错误处理逻辑,比如使用try-catch块来捕获和处理可能的异常。

  3. 权限:如果你的应用需要访问设备存储或网络,请确保在AndroidManifest.xmlInfo.plist文件中添加了必要的权限声明。

  4. UI设计:上述UI仅为示例,你可以根据自己的需求进行自定义设计。

希望这个示例能帮助你开始在Flutter项目中使用audiobookshelf_api插件!

回到顶部