parent
c1d13cba4e
commit
aad1c895cb
|
@ -36,8 +36,8 @@ Future<void> download(String id) async {
|
||||||
var manifest = await yt.videos.streamsClient.getManifest(id);
|
var manifest = await yt.videos.streamsClient.getManifest(id);
|
||||||
var streams = manifest.audioOnly;
|
var streams = manifest.audioOnly;
|
||||||
|
|
||||||
// Get the last audio track (the one with the highest bitrate).
|
// Get the audio track with the highest bitrate.
|
||||||
var audio = streams.last;
|
var audio = streams.withHighestBitrate();
|
||||||
var audioStream = yt.videos.streamsClient.get(audio);
|
var audioStream = yt.videos.streamsClient.get(audio);
|
||||||
|
|
||||||
// Compose the file name removing the unallowed characters in windows.
|
// Compose the file name removing the unallowed characters in windows.
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import 'package:http/http.dart';
|
import 'package:http/http.dart' as http;
|
||||||
|
|
||||||
import '../exceptions/exceptions.dart';
|
import '../exceptions/exceptions.dart';
|
||||||
import '../videos/streams/streams.dart';
|
import '../videos/streams/streams.dart';
|
||||||
|
|
||||||
class YoutubeHttpClient {
|
class YoutubeHttpClient extends http.BaseClient {
|
||||||
final Client _httpClient = Client();
|
final http.Client _httpClient = http.Client();
|
||||||
|
|
||||||
final Map<String, String> _defaultHeaders = const {
|
final Map<String, String> _defaultHeaders = const {
|
||||||
'user-agent':
|
'user-agent':
|
||||||
|
@ -15,7 +15,7 @@ class YoutubeHttpClient {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Throws if something is wrong with the response.
|
/// Throws if something is wrong with the response.
|
||||||
void _validateResponse(BaseResponse response, int statusCode) {
|
void _validateResponse(http.BaseResponse response, int statusCode) {
|
||||||
var request = response.request;
|
var request = response.request;
|
||||||
if (request.url.host.endsWith('.google.com') &&
|
if (request.url.host.endsWith('.google.com') &&
|
||||||
request.url.path.startsWith('/sorry/')) {
|
request.url.path.startsWith('/sorry/')) {
|
||||||
|
@ -35,22 +35,9 @@ class YoutubeHttpClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Response> get(dynamic url, {Map<String, String> headers}) {
|
|
||||||
return _httpClient.get(url, headers: {...?headers, ..._defaultHeaders});
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Response> post(dynamic url, {Map<String, String> headers}) {
|
|
||||||
return _httpClient.post(url, headers: {...?headers, ..._defaultHeaders});
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<Response> head(dynamic url, {Map<String, String> headers}) {
|
|
||||||
return _httpClient.head(url, headers: {...?headers, ..._defaultHeaders});
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String> getString(dynamic url,
|
Future<String> getString(dynamic url,
|
||||||
{Map<String, String> headers, bool validate = true}) async {
|
{Map<String, String> headers, bool validate = true}) async {
|
||||||
var response =
|
var response = await get(url, headers: {...?headers, ..._defaultHeaders});
|
||||||
await _httpClient.get(url, headers: {...?headers, ..._defaultHeaders});
|
|
||||||
|
|
||||||
if (validate) {
|
if (validate) {
|
||||||
_validateResponse(response, response.statusCode);
|
_validateResponse(response, response.statusCode);
|
||||||
|
@ -63,8 +50,7 @@ class YoutubeHttpClient {
|
||||||
{Map<String, String> body,
|
{Map<String, String> body,
|
||||||
Map<String, String> headers,
|
Map<String, String> headers,
|
||||||
bool validate = true}) async {
|
bool validate = true}) async {
|
||||||
var response = await _httpClient.post(url,
|
var response = await post(url, headers: headers, body: body);
|
||||||
headers: {...?headers, ..._defaultHeaders}, body: body);
|
|
||||||
|
|
||||||
if (validate) {
|
if (validate) {
|
||||||
_validateResponse(response, response.statusCode);
|
_validateResponse(response, response.statusCode);
|
||||||
|
@ -87,10 +73,9 @@ class YoutubeHttpClient {
|
||||||
// yield* response.stream;
|
// yield* response.stream;
|
||||||
// } else {
|
// } else {
|
||||||
for (var i = 0; i < streamInfo.size.totalBytes; i += 9898989) {
|
for (var i = 0; i < streamInfo.size.totalBytes; i += 9898989) {
|
||||||
var request = Request('get', url);
|
var request = http.Request('get', url);
|
||||||
request.headers['range'] = 'bytes=$i-${i + 9898989}';
|
request.headers['range'] = 'bytes=$i-${i + 9898989 - 1}';
|
||||||
request.headers.addAll(_defaultHeaders);
|
var response = await send(request);
|
||||||
var response = await request.send();
|
|
||||||
if (validate) {
|
if (validate) {
|
||||||
_validateResponse(response, response.statusCode);
|
_validateResponse(response, response.statusCode);
|
||||||
}
|
}
|
||||||
|
@ -110,7 +95,12 @@ class YoutubeHttpClient {
|
||||||
return int.tryParse(response.headers['content-length'] ?? '');
|
return int.tryParse(response.headers['content-length'] ?? '');
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Closes the [Client] assigned to this [YoutubeHttpClient].
|
@override
|
||||||
/// Should be called after this is not used anymore.
|
|
||||||
void close() => _httpClient.close();
|
void close() => _httpClient.close();
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<http.StreamedResponse> send(http.BaseRequest request) {
|
||||||
|
request.headers.addAll(_defaultHeaders);
|
||||||
|
return _httpClient.send(request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
name: youtube_explode_dart
|
name: youtube_explode_dart
|
||||||
description: A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key.
|
description: A port in dart of the youtube explode library. Supports several API functions without the need of Youtube API Key.
|
||||||
version: 1.2.2
|
version: 1.2.3
|
||||||
homepage: https://github.com/Hexer10/youtube_explode_dart
|
homepage: https://github.com/Hexer10/youtube_explode_dart
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
|
Loading…
Reference in New Issue