플러터(Flutter)

[플러터(Flutter)] - 유튜브 동영상 메타 데이터 가져오기 (youtube_explode_dart)

HANBEEN 2021. 8. 23. 15:18
반응형

사용 목적 👀

유튜브의 영상을 실행시켜주는 youtube_player는 예제가 잘 되어있어 쉽게 작동이 됐지만, 문제는 해당 영상의 타이틀이나, 유튜버의 이름을 가져와야 해서 youtube_explode_dart를 사용하게 되었다. 사실 단일 영상의 경우 따로 서버에 저장해서 가져오는 방법을 사용해도 되지만, 우리가 이 라이브러리를 쓰는 이유는 만약 영상이 단일 영상이 아닌 채널의 형태로 되어있다면, 각 영상의 ID와 제목은 다 다를 것이다. 이를 가져오기 위해 우리는 이 라이브러리를 써야 했다.

사용 방법 👀

https://pub.dev/packages/youtube_explode_dart

 

youtube_explode_dart | Dart Package

A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key.

pub.dev

처음에 이 사용방법 때문에 엄청 애를 먹었다. 

Readme 예시에서는 1.9.1 버전을 사용하는데, install에서는 1.10.4 가 표기되어있다.

때문에 먼저 1.9.1 예시를 따라 해 보려고 했다.

import 'package:youtube_explode_dart/youtube_explode_dart.dart';

var yt = YoutubeExplode();

var video = yt.videos.get('https://youtube.com/watch?v=Dpp1sIL1m5Q'); 

var title = video.title; // "Scamazon Prime"
var author = video.author; // "Jim Browning"
var duration = video.duration; // Instance of Duration - 0:19:48.00000

이러한 예시가 있었는데 저 타이틀이나 이름을 가져오는 과정에서 video.title 같은 방법을 사용하는데 

애초에 title이란 게 불러와지지가 않는다..  이것 때문에 1차적으로 고생을 했다. 
( command + click을 통하여 함수 내부로 엄청 들어갔다 나왔다 했지만 알 수 없었다.. )

 

이대로는 모르겠어서 Example 부분에 있는 함수를 똑같이 사용해보기로 했다

// ignore_for_file: avoid_print
import 'package:youtube_explode_dart/youtube_explode_dart.dart';

import 'package:youtube_explode_dart/src/youtube_explode_base.dart';

Future<void> main() async {
  var yt = YoutubeExplode();
  var video =
      await yt.videos.get('https://www.youtube.com/watch?v=AI7ULzgf8RU');

  print('Title: ${video.title}');

  // Close the YoutubeExplode's http client.
  yt.close();
}

이렇게 입력을 하니 video에서 title을 불러와지는 게 가능했다.. 딱히 달라진 것도 없는 것 같은데 왜 안됐었을까 보니

바로 asnyc ~ await의 차이였다. get ('url')을 통해 접속해서 정보를 받아와야 하는데, 정보를 받아올 시간을 안 주고 넘어가서 그런 것 같다. 때문에 정보를 받아올 시간을 주려고 await을 이용한 것 같다 

 

이제는 되겠지 하고 기분 좋게 실행해본 결과.. 

왠지 라이브러리가 최신 버전이 아니라서 안 먹히는 것 같은 느낌적인 느낌이 들었다. 

혹시 모르니 버전을 올리려고 1.10.4로 바꾸니,, 

이건 또 무슨 일..  이것 때문에 엄청 찾아보고 물어보기도 했으나 진전이 없었다..

(사실 이때 아주 조금 관두고 싶은 마음이 올라왔다.)

 

하루 쉬고 다시 심기일전해서 구글링을 하다가 희망을 발견했다.

https://github.com/Hexer10/youtube_explode_dart/issues/156

 

FatalFailureException: Failed to perform an HTTP request to YouTube due to a fatal failure. E/flutter ( 8968): In most cases, th

Hi, In my app am downloading youtube viodes using youtube_id youtube_explode_dart but it showing FatalFailureException Failed to perform an HTTP request to YouTube due to a fatal failure. E/flutter...

github.com

나랑 똑같이 고생하는 사람을 발견했고 여기서 해답을 얻을 수 있었다.

바로 라이브러리는 최신 버전 1.10.4를 사용하는 게 맞았고, 이 라이브러리를 사용하려면 아래처럼 dependency를 추가해줘야 한다

dependency_overrides:
  meta: ^1.7.0
  json_annotation: ^4.1.0

추가하고 다시 pub get을 해보니 경고는 뜨지만, 작동은 잘 됐다 😭 

(pubspec.yaml에 dependency는 있지만 dependency_overrides라는 칸은 따로 없어서 그냥 저대로 복붙 해서 써줬다.. 이게 맞나?)

 

그러고 나서 코드를 실행해본 결과!!

경고는 뜨지만 드디어 작동이 된다,, 휴,, 

 

이제 일반 비디오가 아닌 플레이리스트에서도 잘 되나 확인해보고, 앱에 뿌리는 것 까지 해봐야겠다..

 

반응형