Flutter视频下载插件flutter_youtube_downloader的使用

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

Flutter视频下载插件flutter_youtube_downloader的使用

flutter_youtube_downloader 是一个用于提取和下载YouTube视频URL的Flutter插件。

使用方法

1. 添加依赖到 pubspec.yaml 文件

首先,需要在项目的 pubspec.yaml 文件中添加插件依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_youtube_downloader:

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

2. 修改 AndroidManifest.xml 文件

如果你是针对 Android API 29+ 的设备,请确保在 AndroidManifest.xml 文件中添加以下配置:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
    
    <application
        tools:replace="android:label" 
        android:requestLegacyExternalStorage="true">
        
        <activity>
            <!-- Your activity configurations -->
        </activity>
     
    </application>
</manifest>

3. 警告

注意不要在视频标题中添加多余的点号 (...)。例如:

错误示例:

final result = await FlutterYoutubeDownloader.downloadVideo(
  youTube_link, "Video Title goes Here...", 18);

正确示例:

final result = await FlutterYoutubeDownloader.downloadVideo(
  youTube_link, "Video Title goes Here", 18);

4. 示例代码

以下是完整的示例代码,展示如何使用 flutter_youtube_downloader 插件来提取和下载YouTube视频。

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

import 'package:flutter_youtube_downloader/flutter_youtube_downloader.dart';

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

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

class _MyAppState extends State<MyApp> {
  String? _extractedLink = 'Loading...';
  String? youTube_link = "https://www.youtube.com/watch?v=nRhYQlg8fVw";

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

  // 提取YouTube视频链接
  Future<void> extractYoutubeLink() async {
    String? link;
    try {
      link = await FlutterYoutubeDownloader.extractYoutubeLink(youTube_link!, 18);
    } on PlatformException {
      link = 'Failed to Extract YouTube Video Link.';
    }

    if (!mounted) return;

    setState(() {
      _extractedLink = link;
    });
  }

  // 下载YouTube视频
  Future<void> downloadVideo() async {
    final result = await FlutterYoutubeDownloader.downloadVideo(
        youTube_link!, "Video Title goes Here", 18);
    print(result);
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Youtube Link Downloader example app'),
        ),
        body: Center(
          child: Text('Extracted Link : $_extractedLink\n'),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: downloadVideo,
          child: const Icon(Icons.download_rounded),
        ),
      ),
    );
  }
}

开始使用

该项目是一个 Flutter 插件包的起点,包含了平台特定的实现代码(如 Android 和 iOS)。更多关于 Flutter 开发的帮助文档可以查看 Flutter 官方文档


这个Markdown文档详细介绍了如何在Flutter项目中集成并使用`flutter_youtube_downloader`插件来提取和下载YouTube视频,并提供了完整的示例代码供参考。

更多关于Flutter视频下载插件flutter_youtube_downloader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter视频下载插件flutter_youtube_downloader的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,使用flutter_youtube_downloader插件可以方便地实现YouTube视频的下载功能。以下是一个简单的代码示例,展示了如何使用该插件进行视频下载。

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

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

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

接下来,你需要配置Android和iOS的权限和设置,以允许应用下载文件。

Android配置

android/app/src/main/AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

并在android/app/build.gradle文件中配置minSdkVersiontargetSdkVersion(如果尚未配置):

android {
    compileSdkVersion 30

    defaultConfig {
        applicationId "com.example.yourapp"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
    }
    ...
}

iOS配置

ios/Runner/Info.plist中添加以下权限请求:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
<key>UIFileSharingEnabled</key>
<true/>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to save files in photo library</string>

Flutter代码示例

在你的Flutter项目中,你可以使用以下代码来下载YouTube视频:

import 'package:flutter/material.dart';
import 'package:flutter_youtube_downloader/flutter_youtube_downloader.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('YouTube Video Downloader'),
        ),
        body: DownloadPage(),
      ),
    );
  }
}

class DownloadPage extends StatefulWidget {
  @override
  _DownloadPageState createState() => _DownloadPageState();
}

class _DownloadPageState extends State<DownloadPage> {
  final _controller = TextEditingController();
  FlutterYoutubeDownloader? _downloader;

  @override
  void initState() {
    super.initState();
    _downloader = FlutterYoutubeDownloader();
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }

  Future<void> _requestPermissions() async {
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      Map<Permission, PermissionStatus> statuses = await [
        Permission.storage,
      ].request();
      status = statuses[Permission.storage]!;
    }
    if (status.isGranted) {
      // Permissions granted, proceed with download
      _downloadVideo();
    } else {
      // Permissions denied, show message to user
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Storage permission denied')),
      );
    }
  }

  Future<void> _downloadVideo() async {
    String videoUrl = _controller.text;
    if (videoUrl.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Please enter a valid YouTube video URL')),
      );
      return;
    }

    try {
      var videoId = YouTubeExtractor.getVideoIdFromUrl(videoUrl);
      if (videoId == null) {
        throw Exception('Invalid YouTube video URL');
      }

      var file = await _downloader!.getVideoWithBestQuality(
        videoId,
        progressListener: (progress) {
          print('Download progress: ${progress.progressInPercent}%');
        },
      );

      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Download complete: ${file.path}')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Download failed: ${e.toString()}')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          TextField(
            controller: _controller,
            decoration: InputDecoration(
              labelText: 'Enter YouTube Video URL',
              border: OutlineInputBorder(),
            ),
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () async {
              await _requestPermissions();
            },
            child: Text('Download Video'),
          ),
        ],
      ),
    );
  }
}

在这个示例中,我们首先请求存储权限,然后用户输入YouTube视频的URL,点击“Download Video”按钮后,将尝试下载视频并显示下载进度或错误信息。

注意:由于YouTube的服务条款可能限制或禁止视频下载,因此使用此类插件可能涉及法律和版权问题。请确保你的应用使用符合相关法律和YouTube服务条款的方式下载视频。

回到顶部