Skip to content

Commit

Permalink
core: revert 1fbea99 & use clients
Browse files Browse the repository at this point in the history
was too unstable and same client couldnt be used again
  • Loading branch information
MSOB7YY committed May 18, 2024
1 parent ca68161 commit 67f11e5
Show file tree
Hide file tree
Showing 6 changed files with 70 additions and 87 deletions.
8 changes: 0 additions & 8 deletions lib/class/http_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import 'dart:io';

import 'package:queue/queue.dart';

import 'package:namida/class/http_response_wrapper.dart';

class HttpMultiRequestManager {
HttpMultiRequestManager({this.listsMaxItems = 2});
final int listsMaxItems;
Expand All @@ -23,12 +21,6 @@ class HttpMultiRequestManager {
return minimum;
}

HttpClientResponseWrapper getWrapper() {
final int listsIndex = _getEffectiveIndex();
final client = _mainClients[listsIndex];
return HttpClientResponseWrapper(client);
}

Future<T> execute<T>(Future<T> Function() closure) async {
final int listsIndex = _getEffectiveIndex();
_runningRequestsCount[listsIndex]++;
Expand Down
47 changes: 24 additions & 23 deletions lib/class/http_response_wrapper.dart
Original file line number Diff line number Diff line change
@@ -1,48 +1,49 @@
import 'dart:io';

class HttpClientResponseWrapper {
HttpClientResponseWrapper(this.client);
class HttpClientWrapper {
HttpClientWrapper() : _client = HttpClient();

bool get isClosed => _closed;

final HttpClient client;
bool _closed = false;

HttpClientRequest? _request;
HttpClientResponse? _response;
final HttpClient _client;

Future<HttpClientResponse?> getUrlNullable(Uri url, {Map<String, String>? headers}) async {
if (_closed) return null;
try {
_request = await client.getUrl(url);
if (headers != null) {
for (final h in headers.entries) {
_request!.headers.set(h.key, h.value);
}
}
_response = await _request!.close();
return _response!;
return await getUrl(url);
} catch (_) {
return null;
}
}

Future<HttpClientResponse> getUrl(Uri url, {Map<String, String>? headers}) async {
if (_closed) throw Exception('socket is closed');
_request = await client.getUrl(url);
Future<HttpClientResponse?> getUrlWithHeadersNullable(Uri url, {Map<String, String>? headers}) async {
try {
return await getUrlWithHeaders(url, headers);
} catch (_) {
return null;
}
}

Future<HttpClientResponse> getUrl(Uri url) async {
if (_closed) throw Exception('client is closed');
final request = await _client.getUrl(url);
return await request.close();
}

Future<HttpClientResponse> getUrlWithHeaders(Uri url, Map<String, String>? headers) async {
if (_closed) throw Exception('client is closed');
final request = await _client.getUrl(url);
if (headers != null) {
for (final h in headers.entries) {
_request!.headers.set(h.key, h.value);
request.headers.set(h.key, h.value);
}
}
_response = await _request!.close();
return _response!;
return await request.close();
}

Future<void> close() async {
final socket = await _response?.detachSocket();
await socket?.close();
_request?.abort();
_closed = true;
_client.close(force: true);
}
}
13 changes: 5 additions & 8 deletions lib/controller/lyrics_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -317,9 +317,7 @@ class _LRCSearchManager with PortsProvider<SendPort> {
final recievePort = ReceivePort();
sendPort.send(recievePort.sendPort);

final mainClient = HttpClient();

HttpClientResponseWrapper? clientResponse;
HttpClientWrapper? mainRequester;

String substringArtist(String artist) {
int maxIndex = -1;
Expand All @@ -331,7 +329,7 @@ class _LRCSearchManager with PortsProvider<SendPort> {
Future<List<LyricsModel>> fetchLRCBasedLyricsFromInternet({
_LRCSearchDetails? details,
String customQuery = '',
required HttpClientResponseWrapper requester,
required HttpClientWrapper requester,
}) async {
if (customQuery == '' && details == null) return [];
String formatTime(int seconds) {
Expand Down Expand Up @@ -415,14 +413,13 @@ class _LRCSearchManager with PortsProvider<SendPort> {
StreamSubscription? streamSub;
streamSub = recievePort.listen((p) async {
if (PortsProvider.isDisposeMessage(p)) {
mainClient.close(force: true);
recievePort.close();
streamSub?.cancel();
return;
}
clientResponse?.close();
clientResponse = HttpClientResponseWrapper(mainClient);
final c = clientResponse!; // instance so it can be closed
mainRequester?.close();
mainRequester = HttpClientWrapper();
final c = mainRequester!; // instance so it can be closed

var lyrics = <LyricsModel>[];
if (p is List<_LRCSearchDetails>) {
Expand Down
4 changes: 2 additions & 2 deletions lib/controller/thumbnail_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ class _YTThumbnailDownloadManager with PortsProvider<SendPort> {
sendPort.send(recievePort.sendPort);

final httpManager = HttpMultiRequestManager();
final requesters = <String, Map<String, HttpClientResponseWrapper>?>{}; // itemId: {urlPath: HttpClientResponseWrapper}
final requesters = <String, Map<String, HttpClientWrapper>?>{}; // itemId: {urlPath: HttpClientWrapper}

const bool deleteOldExtracted = true;

Expand Down Expand Up @@ -299,7 +299,7 @@ class _YTThumbnailDownloadManager with PortsProvider<SendPort> {
requesters[id] ??= {};
for (final url in urls) {
final urlPath = url.substring(url.lastIndexOf('/') + 1);
requesters[id]?[urlPath] = httpManager.getWrapper();
requesters[id]?[urlPath] = HttpClientWrapper();

final destinationFileTemp = File("${destinationFile.path}.temp");
destinationFileTemp.createSync(recursive: true);
Expand Down
83 changes: 38 additions & 45 deletions lib/youtube/controller/youtube_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1727,8 +1727,7 @@ class _YTDownloadManager with PortsProvider<SendPort> {
final recievePort = ReceivePort();
sendPort.send(recievePort.sendPort);

final httpManager = HttpMultiRequestManager();
final requesters = <String, HttpClientResponseWrapper?>{}; // filePath
final requesters = <String, HttpClientWrapper?>{}; // filePath

StreamSubscription? streamSub;
streamSub = recievePort.listen((p) async {
Expand All @@ -1737,7 +1736,6 @@ class _YTDownloadManager with PortsProvider<SendPort> {
requester?.close();
}
requesters.clear();
httpManager.closeClients();
recievePort.close();
streamSub?.cancel();
return;
Expand All @@ -1761,55 +1759,50 @@ class _YTDownloadManager with PortsProvider<SendPort> {
final moveToRequiredBytes = p['moveToRequiredBytes'] as int?;
final progressPort = p['progressPort'] as SendPort;

requesters[filePath] = httpManager.getWrapper();
requesters[filePath] = HttpClientWrapper();
final file = File(filePath);
file.createSync(recursive: true);
final fileStream = file.openWrite(mode: FileMode.append);
await httpManager.execute(() async {
final requester = requesters[filePath];
if (requester == null) return; // always non null tho
try {
final headers = {'range': 'bytes=$downloadStartRange-'};
final response = await requester.getUrl(Uri.parse(url), headers: headers);
final downloadStream = response.asBroadcastStream();

await for (final data in downloadStream) {
fileStream.add(data);
progressPort.send(data.length);
}
if (moveTo != null && moveToRequiredBytes != null) {
try {
final fileStats = file.statSync();
const allowance = 1024; // 1KB allowance
if (fileStats.size >= moveToRequiredBytes - allowance) {
File? newFile;
try {
newFile = file.renameSync(moveTo);
} catch (_) {
try {
newFile = file.copySync(moveTo);
if (newFile.existsSync() && newFile.lengthSync() >= moveToRequiredBytes - allowance) {
file.deleteSync();
}
} catch (_) {}
}
}
} catch (_) {}
}
return sendPort.send(MapEntry(filePath, true));
} catch (e) {
return sendPort.send(MapEntry(filePath, false));
} finally {
try {
requester.close();
requesters[filePath] = null;
} catch (_) {}
final requester = requesters[filePath];
if (requester == null) return; // always non null tho
try {
final headers = {'range': 'bytes=$downloadStartRange-'};
final response = await requester.getUrlWithHeaders(Uri.parse(url), headers);
final downloadStream = response.asBroadcastStream();

await for (final data in downloadStream) {
fileStream.add(data);
progressPort.send(data.length);
}
bool? movedSuccessfully;
if (moveTo != null && moveToRequiredBytes != null) {
try {
await fileStream.flush();
await fileStream.close(); // closing file.
final fileStats = file.statSync();
const allowance = 1024; // 1KB allowance
if (fileStats.size >= moveToRequiredBytes - allowance) {
final movedFile = file.moveSync(
moveTo,
goodBytesIfCopied: (fileLength) => fileLength >= moveToRequiredBytes - allowance,
);
if (movedFile == null) movedSuccessfully = false;
}
} catch (_) {}
}
});
return sendPort.send(MapEntry(filePath, movedSuccessfully ?? true));
} catch (_) {
// client force closed
return sendPort.send(MapEntry(filePath, false));
} finally {
try {
final req = requesters.remove(filePath);
await req?.close();
} catch (_) {}
try {
await fileStream.flush();
await fileStream.close(); // closing file.
} catch (_) {}
}
}
}
});
Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: namida
description: A Beautiful and Feature-rich Music Player, With YouTube & Video Support Built in Flutter
publish_to: "none"
version: 2.4.41-beta+240518205
version: 2.4.43-beta+240518207

environment:
sdk: ">=3.1.4 <4.0.0"
Expand Down

0 comments on commit 67f11e5

Please sign in to comment.