Flutter未知功能插件yt的探索使用

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

Flutter未知功能插件yt的探索使用

简介

yt 是一个用于与多个 Google REST API(包括 YouTube Data API 和 YouTube Live Streaming API)交互的原生 Dart 接口。本文将详细介绍如何在 Flutter 应用中使用 yt 插件,包括获取授权凭据、使用 Data API 和 Live Streaming API 的示例代码。

表格目录

如何与 googleapis 包不同

  • yt 不是生成的,而是手动编码并仅限于 YouTube API。
  • 由于不是生成的,该包包含额外的有用功能,如命令行界面(CLI)和实验性的聊天机器人。
  • 更集中的文档和示例。

发布新闻

新功能 v2.2.x(预发布)

  • 重构了 OAuth 代码,移除了防止在浏览器中使用的 dart:io 依赖项。现在该包可以在所有 Dart/Flutter 支持的平台上使用。
  • 使用 google_sign_in 包进行身份验证,自动切换到 google_sign_in_web 用于浏览器应用。

新功能 v2.0.x

  • 包含了一个 CLI 工具,可以返回任何当前受支持的 API 调用的数据。
  • 永久移除了 Cloud Vision API 支持,并将其作为独立的包提供。
  • 临时移除了缓存支持。

开始使用

pubspec.yaml 文件中添加依赖:

dependencies:
  yt: ^2.2.5+6

获取授权凭据

YouTube API 访问需要访问令牌或 API 密钥,具体取决于 API 和访问的信息类型。通常,只读公共信息可以通过 API 密钥访问,而其他信息则需要访问令牌。

YAML 文件

identifier: [client id from the API console]
secret: [client secret from the API console]

JSON 文件

{
  "identifier": "[client id from the API console]",
  "secret": "[client secret from the API console]"
}

使用 CLI 生成 JSON 文件:

# 确保你已经在 Google API 控制台创建了应用实例
# 确保你已经激活了 CLI 工具 "pub global activate yt"

yt authorize

# 按照提示提供 clientID、clientSecret,然后使用浏览器进行身份验证并生成一次性代码

生成的凭据文件将保存为 $HOME/.yt/credentials.json

使用 Data API

import 'package:yt/yt.dart';

void main() async {
  // 如果你使用 "yt authorize" 生成了凭据文件
  final yt = Yt.withOAuth();

  // 列出播放列表
  var playlistResponse = await yt.playlists.list(
    channelId: '[youtube channel id]', maxResults: 25
  );

  playlistResponse.items.forEach((playlist) => print('${playlist.snippet?.title}'));
}

上传视频

final yt = await Yt.withOAuth();

final body = <String, dynamic>{
  'snippet': {
    'title': 'TEST title',
    'description': 'Test Description',
    'tags': ['tag1', 'tag2'],
    'categoryId': "22"
  },
  'status': {
    'privacyStatus': 'private',
    "embeddable": true,
    "license": "youtube"
  }
};

final videoItem = await yt.videos.insert(
  body: body,
  videoFile: File('[path to a video to upload]'),
  notifySubscribers: false
);

print(videoItem);

使用 Live Streaming API

import 'package:yt/yt.dart';

void main() async {
  final yt = await Yt.withOAuth();

  // 创建直播广播
  final broadcastItem = await yt.broadcast.insert(
    body: {
      'snippet': {
        'title': 'TEST Broadcast',
        'description': 'Test',
        'scheduledStartTime': DateTime.now().add(Duration(hours: 2)).toUtc().toIso8601String()
      },
      'status': {'privacyStatus': 'private'},
      'contentDetails': {
        'monitorStream': {
          'enableMonitorStream': false,
          'broadcastStreamDelayMs': 10
        },
        'enableDvr': true,
        'enableContentEncryption': true,
        'enableEmbed': true,
        'recordFromStart': true,
        'startWithSlate': false
      }
    },
    part: 'snippet,status,contentDetails'
  );

  // 绑定直播广播到现有流
  await yt.broadcast.bind(
    broadcastId: broadcastItem.id,
    streamId: '[one of your valid stream ids]'
  );

  // 上传缩略图
  await yt.thumbnails.set(
    videoId: broadcastItem.id,
    thumbnail: File('[path to an image to upload]')
  );
}

下载 LiveChat

import 'package:yt/yt.dart';

void main() async {
  final yt = await Yt.withOAuth();

  var broadcastResponse = await yt.broadcast.list(broadcastStatus: 'active');

  if (broadcastResponse.items.isNotEmpty) {
    // 下载并输出到标准输出
    await yt.chat.downloadHistory(liveBroadcastItem: broadcastResponse.items.first);
  }
}

实验性聊天机器人

import 'package:yt/yt.dart';

void main() async {
  final yt = await Yt.withOAuth();

  var broadcastResponse = await yt.broadcast.list(broadcastStatus: 'active');

  if (broadcastResponse.items.isEmpty) {
    broadcastResponse = await yt.broadcast.list(broadcastStatus: 'upcoming', maxResults: 1);
  }

  if (broadcastResponse.items.isNotEmpty) {
    final liveBroadcastItem = broadcastResponse.items.first;

    // 设置聊天机器人
    final chatbot = Chatbot.fromYaml(File('chatbot.yaml'));

    // 提供 TimeStore 以确保聊天机器人不会重复回答
    await yt.chat.answerBot(liveBroadcastItem: liveBroadcastItem, chatbot: chatbot);
  }
}

在 Flutter 中使用

import 'package:flutter/material.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:yt/yt.dart';

class YtLoginGenerator implements TokenGenerator {
  final GoogleSignIn _googleSignIn = GoogleSignIn(
    scopes: [
      'https://www.googleapis.com/auth/youtube',
    ],
  );

  @override
  Future<Token> generate() async {
    var _currentUser = await _googleSignIn.signInSilently();

    if (_currentUser == null) _currentUser = await _googleSignIn.signIn();

    final token = (await _currentUser!.authentication).accessToken;

    if (token == null) throw Exception();

    return Token(
        accessToken: token, expiresIn: 3599, scope: null, tokenType: '');
  }
}

class MyFlutterApp extends StatefulWidget {
  @override
  _MyFlutterAppState createState() => _MyFlutterAppState();
}

class _MyFlutterAppState extends State<MyFlutterApp> {
  final items = <Playlist>[];
  late final Yt yt;
  Playlists? playlists;

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

  void _init() async {
    yt = await Yt.withGenerator(YtLoginGenerator());
  }

  void _getPlaylists() async {
    items.clear();
    setState(() {
      items.addAll(await yt.playlists.list(mine: true));
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('YouTube Playlists')),
      body: ListView.builder(
        itemCount: items.length,
        itemBuilder: (context, index) {
          final playlist = items[index];
          return ListTile(
            title: Text(playlist.snippet?.title ?? ''),
            subtitle: Text(playlist.snippet?.channelTitle ?? ''),
          );
        },
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _getPlaylists,
        child: Icon(Icons.add),
      ),
    );
  }
}

void main() {
  runApp(MaterialApp(home: MyFlutterApp()));
}

可用示例

  • example.dart - (命令行)显示各种 YouTube 数据
  • livechat_example.dart - (命令行)聊天机器人将在 LiveChat 会话中回答一组问题
  • flutter_youtube - 一个简单的 Flutter 应用,可在 Web 和移动平台上运行,允许用户输入关键词以获取匹配的 YouTube 视频及其图像和标题

YouTube REST API 命令行界面

通过 dart pub 安装

pub global activate yt

如果出现错误,可以参考 Dart SDK 文档 解决。

通过 Homebrew 安装

brew tap faithoflifedev/yt
brew install yt

使用方法:

yt --help

支持的 API 命令

Data API

Live Streaming API

自定义功能(实验性)

  • 从 LiveChat 下载聊天历史
  • LiveChat 简单聊天机器人功能

下一步计划

  • 扩展 API 命令

重大变更

v2.0.x 2.1.x

  • Yt.withOAuthYt.withKey 现在返回 Yt 对象而不是 Future<Yt>

v2.0.x 从 v1.2.x

  • Yt 对象现在返回 Future,对特定 API 模块的引用不再是 Future

贡献

欢迎任何来自开源社区的帮助和支持:

  • 发现问题?
    • 请填写详细的 bug 报告。
  • 需要功能?
    • 提交功能请求并说明使用场景。
  • 正在使用并喜欢该项目?
    • 推广项目:撰写文章或帖子介绍它。
    • 进行捐赠。
  • 有项目使用此包?
    • 交叉推广,告诉我你的项目,我会添加链接。
  • 是开发者?
    • 修复 bug 并发送拉取请求。
    • 实现新功能。
    • 改进单元测试。
  • 已经帮助过?
    • 非常感谢你、贡献者和所有使用该项目的人!

如果你能贡献 1 小时的时间,就能做出很多贡献,因为其他人也会这样做,只需成为其中的一员并从你的 1 小时开始。


更多关于Flutter未知功能插件yt的探索使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter未知功能插件yt的探索使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在探索和使用Flutter中的未知功能插件(如yt)时,重要的是要确保代码的稳定性和安全性。虽然我不能直接提供一个名为yt的特定插件的详细使用案例(因为yt并不是一个广为人知的Flutter插件名称,可能是某个特定项目或自定义插件),但我可以展示如何安全地集成和使用一个Flutter插件的一般步骤。

假设yt插件存在,并且它提供了某种特定的功能(比如视频播放、数据处理等),以下是一个如何集成和使用它的示例流程:

1. 添加插件依赖

首先,你需要在pubspec.yaml文件中添加该插件的依赖。如果yt插件在pub.dev上有记录,你可以这样添加:

dependencies:
  flutter:
    sdk: flutter
  yt: ^x.y.z  # 假设x.y.z是版本号

然后运行flutter pub get来下载并安装依赖。

2. 导入插件

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

import 'package:yt/yt.dart';

3. 使用插件功能

假设yt插件提供了一个名为playVideo的函数来播放视频,你可以这样使用它:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('YT Plugin Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 假设playVideo是一个异步函数,需要传入视频URL
              try {
                await YtPlugin.playVideo('https://www.example.com/video.mp4');
              } catch (e) {
                print('Error playing video: $e');
              }
            },
            child: Text('Play Video'),
          ),
        ),
      ),
    );
  }
}

注意:上面的代码示例是基于假设的YtPlugin类和playVideo方法。实际使用时,你需要根据yt插件的文档来调整代码。

4. 错误处理和日志记录

在使用任何第三方插件时,添加适当的错误处理和日志记录是很重要的。这有助于调试和确保应用的稳定性。

5. 阅读文档和示例

最后,不要忘记阅读yt插件的官方文档和示例代码。这将为你提供更详细的使用指南和最佳实践。

由于yt不是一个广为人知的Flutter插件名称,如果它是一个自定义插件或特定项目的插件,你可能需要联系插件的开发者或查看项目文档来获取更具体的信息和代码示例。

重要提示:在集成和使用任何第三方插件时,请确保你信任其来源,并检查其安全性和稳定性。在生产环境中使用之前,进行充分的测试。

回到顶部