Flutter YouTube API集成插件youtube_api_client的使用

Flutter YouTube API 集成插件 youtube_api_client 的使用

YouTube API 客户端 (youtube_api_client)

这个插件是从 youtube_api 分叉而来,并进行了全面重构和改进。它是一个用于通过 API 与 YouTube 服务器交互以获取数据的 Flutter 插件,支持 iOS 和 Android 平台。

特性

  • 按关键词或 ID 搜索视频、播放列表和频道。
  • 根据地区代码获取热门视频。

使用方法

要使用此插件,在 pubspec.yaml 文件中添加 youtube_api_client 作为依赖项。

示例

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:youtube_api_client/youtube_api.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DemoApp(),
    );
  }
}

class DemoApp extends StatefulWidget {
  [@override](/user/override)
  _DemoAppState createState() => _DemoAppState();
}

class _DemoAppState extends State<DemoApp> {
  static String _key = "YOUR_API_KEY"; // 替换为你的 API 密钥

  final _youtube = YoutubeApi(_key);
  List<ApiResult> _result = [];

  Future<void> callAPI() async {
    String query = "Flutter";
    _result = await _youtube.search(
      query,
      options: SearchOptions(
        order: Order.relevance,
        videoDuration: VideoDuration.any,
      ),
    );

    // 获取仅频道类型的结果
    _result = await _youtube.search(
      query,
      options: SearchOptions(
        type: [ResultType.channel],
      ),
    );

    // 获取下一页结果
    _result = (await _youtube.nextPage()) ?? [];

    // 按 ID 搜索视频
    _result = await _youtube.searchVideosById([
      "4AoFA19gbLo"
    ], parts: {
      VideoPart.snippet,
      VideoPart.contentDetails,
    });

    // 按 ID 搜索播放列表
    _result = await _youtube
        .searchPlaylistsById(["PLjxrf2q8roU0WrDTm4tUB430Mja7dQEVP"]);

    // 按 ID 搜索频道
    _result = await _youtube.searchChannelsById([
      "UCwXdFgeE9KYzlDdR7TG9cMw"
    ], parts: {
      ChannelPart.snippet,
      ChannelPart.brandingSettings,
    });

    setState(() {});
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    callAPI();
    print('hello');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.blue[100],
      appBar: AppBar(
        title: Text('YouTube API'),
      ),
      body: ListView(
        children: _result.map<Widget>(listItem).toList(),
      ),
    );
  }

  Widget listItem(ApiResult obj) {
    return Card(
      child: Container(
        margin: EdgeInsets.symmetric(vertical: 7.0),
        padding: EdgeInsets.all(12.0),
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            if (obj.snippet != null) ...[
              if (obj.snippet!.thumbnails != null)
                Padding(
                  padding: const EdgeInsets.only(right: 20.0),
                  child: Image.network(
                    obj.snippet!.thumbnails![ThumbnailResolution.default_]?.url ??
                        '',
                    width: 120.0,
                  ),
                ),
            ],
            Expanded(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text(
                    obj.url,
                    softWrap: true,
                  ),
                  if (obj is YoutubeVideo)
                    ..._buildVideoElements(obj)
                  else if (obj is YoutubeChannel)
                    ..._buildChannelElements(obj)
                  else if (obj is YoutubePlaylist)
                    ..._buildPlaylistElements(obj)
                ],
              ),
            )
          ],
        ),
      ),
    );
  }

  List<Widget> _buildVideoElements(YoutubeVideo obj) => [
        if (obj.snippet != null) ...[
          Text(
            obj.snippet!.title ?? '',
            style: TextStyle(fontSize: 18.0),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 3.0),
            child: Text(
              obj.snippet!.channelTitle ?? '',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
          Text("publishedAt: ${obj.snippet!.publishedAt}"),
          Text("tags: ${obj.snippet!.tags?.take(3).join(", ")}"),
          Text("category: ${obj.snippet!.category?.name}"),
        ],
        if (obj.contentDetails != null) ...[
          Text("duration: ${obj.contentDetails?.duration}"),
        ],
      ];

  List<Widget> _buildChannelElements(YoutubeChannel obj) => [
        if (obj.snippet != null) ...[
          Text(
            obj.snippet!.title ?? '',
            style: TextStyle(fontSize: 18.0),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 3.0),
            child: Text(
              obj.snippet!.customUrl ?? '',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
          Text("publishedAt: ${obj.snippet!.publishedAt}"),
          Text("description: ${obj.snippet!.description}"),
        ],
        if (obj.brandingSettings != null) ...[
          Text(
            obj.brandingSettings!.country ?? '',
            style: TextStyle(fontSize: 18.0),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 3.0),
            child: Text(
              obj.brandingSettings!.keywords.toString(),
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
          Text("moderateComments: ${obj.brandingSettings!.moderateComments}"),
          Text("unsubscribedTrailer: ${obj.brandingSettings!.unsubscribedTrailer}"),
        ],
      ];

  List<Widget> _buildPlaylistElements(YoutubePlaylist obj) => [
        if (obj.snippet != null) ...[
          Text(
            obj.snippet!.title ?? '',
            style: TextStyle(fontSize: 18.0),
          ),
          Padding(
            padding: EdgeInsets.symmetric(vertical: 3.0),
            child: Text(
              obj.snippet!.channelTitle ?? '',
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
          Text("publishedAt: ${obj.snippet!.publishedAt}"),
        ],
      ];
}

更多关于Flutter YouTube API集成插件youtube_api_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter YouTube API集成插件youtube_api_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


youtube_api_client 是一个用于在 Flutter 应用中集成 YouTube API 的插件。它允许你与 YouTube 的数据 API 进行交互,例如搜索视频、获取视频信息、获取频道信息等。以下是如何在 Flutter 项目中使用 youtube_api_client 插件的详细步骤。

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 youtube_api_client 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  youtube_api_client: ^1.0.0 # 请查看最新版本

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

2. 获取 YouTube API 密钥

要使用 YouTube Data API,你需要一个 API 密钥。你可以通过以下步骤获取:

  1. 访问 Google Cloud Console
  2. 创建一个新的项目或选择一个现有项目。
  3. 在“API 和服务”部分,启用“YouTube Data API v3”。
  4. 在“凭据”部分,创建一个 API 密钥。

3. 初始化 YoutubeApiClient

在你的 Flutter 代码中,导入 youtube_api_client 并初始化 YoutubeApiClient

import 'package:youtube_api_client/youtube_api_client.dart';

class YouTubeService {
  final YoutubeApiClient _client;

  YouTubeService(String apiKey) : _client = YoutubeApiClient(apiKey: apiKey);

  // 其他方法...
}

4. 使用 YoutubeApiClient 进行 API 调用

搜索视频

你可以使用 search 方法来搜索视频。

Future<void> searchVideos(String query) async {
  final searchResponse = await _client.search(
    q: query,
    maxResults: 10,
    type: 'video',
  );

  for (var item in searchResponse.items) {
    print('Title: ${item.snippet.title}');
    print('Description: ${item.snippet.description}');
    print('Video ID: ${item.id.videoId}');
  }
}

获取视频信息

你可以使用 videos 方法来获取特定视频的详细信息。

Future<void> getVideoInfo(String videoId) async {
  final videoResponse = await _client.videos(
    id: videoId,
  );

  for (var video in videoResponse.items) {
    print('Title: ${video.snippet.title}');
    print('Description: ${video.snippet.description}');
    print('View Count: ${video.statistics.viewCount}');
  }
}

获取频道信息

你可以使用 channels 方法来获取特定频道的详细信息。

Future<void> getChannelInfo(String channelId) async {
  final channelResponse = await _client.channels(
    id: channelId,
  );

  for (var channel in channelResponse.items) {
    print('Channel Title: ${channel.snippet.title}');
    print('Description: ${channel.snippet.description}');
    print('Subscribers: ${channel.statistics.subscriberCount}');
  }
}

5. 错误处理

在使用 API 时,可能会遇到各种错误,例如网络问题、API 配额限制等。你可以使用 try-catch 块来捕获并处理这些错误。

Future<void> searchVideos(String query) async {
  try {
    final searchResponse = await _client.search(
      q: query,
      maxResults: 10,
      type: 'video',
    );

    for (var item in searchResponse.items) {
      print('Title: ${item.snippet.title}');
    }
  } catch (e) {
    print('Error: $e');
  }
}
回到顶部