Implement Search API

This commit is contained in:
Hexah 2020-02-21 23:48:37 +01:00
parent c1724f2554
commit 0aec322140
5 changed files with 68 additions and 2 deletions

View File

@ -13,4 +13,8 @@
## 0.0.4
- Fix #3 : Head request to ge the content length
- Fix error when getting videos without any keyword.
- Fix error when getting videos without any keyword.
## 0.0.5
- Implement Search Api (`SearchExtension`)

View File

@ -1,3 +1,4 @@
export 'channel_extension.dart';
export 'helpers_extension.dart';
export 'playlist_extension.dart';
export 'search_extension.dart';

View File

@ -0,0 +1,58 @@
import 'dart:convert';
import '../models/models.dart';
import '../youtube_explode_base.dart';
import 'helpers_extension.dart';
/// Search extension for YoutubeExplode
extension SearchExtension on YoutubeExplode {
Future<Map<String, dynamic>> _getSearchResults(String query, int page) async {
var url =
'https://youtube.com/search_ajax?style=json&search_query=${Uri.encodeQueryComponent(query)}&page=$page&hl=en';
var raw = (await client.get(url)).body;
return json.decode(raw);
}
/// Searches videos using given query up to [maxPages] count.
Future<List<Video>> searchVideos(String query, [int maxPages = 5]) async {
var videos = <Video>[];
for (var page = 1; page <= maxPages; page++) {
var resultsJson = await _getSearchResults(query, page);
var countDelta = 0;
var videosJson = resultsJson['video'] as List<dynamic>;
if (videosJson == null) {
break;
}
for (var videoJson in videosJson) {
var id = videoJson['encrypted_id'];
var author = videoJson['author'];
var uploadDate = DateTime.fromMillisecondsSinceEpoch(1581602398 * 1000);
var title = videoJson['title'];
var description = videoJson['description'];
var duration = Duration(seconds: videoJson['length_seconds']);
var viewCount =
int.parse((videoJson['views'] as String).stripNonDigits);
var likeCount = videoJson['likes'];
var dislikeCount = videoJson['dislikes'];
var keyWords = RegExp(r'"[^\"]+"|\S+')
.allMatches(videoJson['keywords'])
.map((e) => e.group(0))
.toList();
var statistics = Statistics(viewCount, likeCount, dislikeCount);
var thumbnails = ThumbnailSet(id);
videos.add(Video(id, author, uploadDate, title, description, thumbnails,
duration, keyWords, statistics));
countDelta++;
}
if (countDelta <= 0) {
break;
}
}
return videos;
}
}

View File

@ -40,4 +40,7 @@ class Video {
this.duration,
this.keyWords,
this.statistics);
@override
String toString() => 'Video($id): $title';
}

View File

@ -1,6 +1,6 @@
name: youtube_explode_dart
description: A port in dart of the youtube explode library. Support serveral API functions.
version: 0.0.4
version: 0.0.5
homepage: https://github.com/Hexer10/youtube_explode_dart
environment: