Marc Sanny
Marc Sanny

Reputation: 1141

Flutter Youtube Video Upload

I would like to know if there is any method or api to upload videos to youtube directly from my flutter application? One way would be to use webview, but it's not so comfortable and user-friendly. Thank You very much for any suggestions

Upvotes: 4

Views: 2313

Answers (2)

eriel marimon
eriel marimon

Reputation: 1380

Use googleapis Youtube Data:

My Upload Snippet:

static Future<Video> upload() async {
  var youTubeApi = await getYoutubeApi();

  File f = File('assets/sample-mp4-file-small.mp4');
  Stream<List<int>> stream = f.openRead();
  Media m = Media(stream, (await f.length()));
  Video video = Video(
    snippet: VideoSnippet(
      title: 'Pong Map Test Video',
      description: 'Test Upload for Pong Map app',
      categoryId: '22',
    ),
  );

  return await youTubeApi.videos.insert(
    video,
    ['snippet', 'status'],
    uploadMedia: m,
  );
}

My Full example with Auth

import 'dart:io';

import 'package:googleapis/youtube/v3.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:extension_google_sign_in_as_googleapis_auth/extension_google_sign_in_as_googleapis_auth.dart';
import 'package:shared/services/toast_utility.dart';

class YoutubeService {
  static Future<YouTubeApi> getYoutubeApi() async {
    final GoogleSignIn googleSignIn = GoogleSignIn(
      scopes: <String>[
        YouTubeApi.youtubeReadonlyScope,
        YouTubeApi.youtubeUploadScope
      ],
    );
    await googleSignIn.signIn();

    // final GoogleSignInAccount? googleSignInAccount = await googleSignIn.signIn();
    var httpClient = await googleSignIn.authenticatedClient();
    if (httpClient == null) {
      print("You didn't allow to proceed with YouTube access");
    }

    return YouTubeApi(httpClient!);
  }

  static Future<VideoListResponse> listYoutubePlaylists() async {
    var youTubeApi = await getYoutubeApi();
    var data = await youTubeApi.videos.list(
      ['snippet'],
      chart: "mostPopular",
    );
    return data;
  }

  static Future<Video> upload() async {
    var youTubeApi = await getYoutubeApi();

    File f = File('assets/sample-mp4-file-small.mp4');
    Stream<List<int>> stream = f.openRead();
    Media m = Media(stream, (await f.length()));
    Video video = Video(
      snippet: VideoSnippet(
        title: 'Test Video',
        description: 'Test Upload for My App',
        categoryId: '22',
      ),
    );

    return await youTubeApi.videos.insert(
      video,
      ['snippet', 'status'],
      uploadMedia: m,
    );
  }
}

Note that you do need extension_google_sign_in_as_googleapis_auth and google_sign_in both in your pubspec.yaml for authorization. And of course the googleapis package.

Upvotes: 3

wafL
wafL

Reputation: 655

Google provides API tools for YouTube. You can learn more here.

Furthermore, there is a package that implements that same api in a more friendly way, as shown here.

Upvotes: 2

Related Questions