Merge pull request #632 from NBA2K1/path-optimizations

Path optimizations
This commit is contained in:
Moustapha Kodjo Amadou 2025-12-18 17:09:33 +01:00 committed by GitHub
commit e342fe16fb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 49 additions and 71 deletions

View file

@ -75,14 +75,12 @@ class MBridge {
var query = htmlXPath.query(xpath); var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) { if (query.nodes.length > 1) {
for (var element in query.attrs) { for (var element in query.attrs) {
attrs.add(element!.trim().trimLeft().trimRight()); attrs.add(element!.trim());
} }
} }
//Return one attr //Return one attr
else if (query.nodes.length == 1) { else if (query.nodes.length == 1) {
String attr = query.attr != null String attr = query.attr != null ? query.attr!.trim() : "";
? query.attr!.trim().trimLeft().trimRight()
: "";
if (attr.isNotEmpty) { if (attr.isNotEmpty) {
attrs = [attr]; attrs = [attr];
} }
@ -102,7 +100,7 @@ class MBridge {
statusMap = element; statusMap = element;
for (var element in statusMap.entries) { for (var element in statusMap.entries) {
if (element.key.toString().toLowerCase().contains( if (element.key.toString().toLowerCase().contains(
status.toLowerCase().trim().trimLeft().trimRight(), status.toLowerCase().trim(),
)) { )) {
return switch (element.value as int) { return switch (element.value as int) {
0 => Status.ongoing, 0 => Status.ongoing,

View file

@ -48,7 +48,6 @@ import 'package:media_kit/generated/libmpv/bindings.dart' as generated;
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart'; import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart';
import 'package:numberpicker/numberpicker.dart'; import 'package:numberpicker/numberpicker.dart';
import 'package:path/path.dart' as p;
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
@ -930,7 +929,7 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo
if (Platform.isAndroid && useLibass) { if (Platform.isAndroid && useLibass) {
try { try {
final subDir = await getApplicationDocumentsDirectory(); final subDir = await getApplicationDocumentsDirectory();
final fontPath = p.join(subDir.path, 'subfont.ttf'); final fontPath = path.join(subDir.path, 'subfont.ttf');
final data = await rootBundle.load('assets/fonts/subfont.ttf'); final data = await rootBundle.load('assets/fonts/subfont.ttf');
final bytes = data.buffer.asInt8List( final bytes = data.buffer.asInt8List(
data.offsetInBytes, data.offsetInBytes,
@ -2310,7 +2309,9 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo
); );
final dir = await StorageProvider() final dir = await StorageProvider()
.getGalleryDirectory(); .getGalleryDirectory();
final file = File(p.join(dir!.path, "$name.png")); final file = File(
path.join(dir!.path, "$name.png"),
);
file.writeAsBytesSync(imageBytes!); file.writeAsBytesSync(imageBytes!);
if (context.mounted) { if (context.mounted) {
botToast(context.l10n.picture_saved, second: 3); botToast(context.l10n.picture_saved, second: 3);

View file

@ -309,7 +309,7 @@ Future<void> downloadChapter(
if (!file.existsSync()) { if (!file.existsSync()) {
pages.add( pages.add(
PageUrl( PageUrl(
page.url.trim().trimLeft().trimRight(), page.url.trim(),
headers: pageHeaders, headers: pageHeaders,
fileName: p.join( fileName: p.join(
chapterDirectory.path, chapterDirectory.path,
@ -325,7 +325,7 @@ Future<void> downloadChapter(
if (!file.existsSync()) { if (!file.existsSync()) {
pages.add( pages.add(
PageUrl( PageUrl(
page.url.trim().trimLeft().trimRight(), page.url.trim(),
headers: pageHeaders, headers: pageHeaders,
fileName: p.join(mangaMainDirectory.path, "$chapterName.mp4"), fileName: p.join(mangaMainDirectory.path, "$chapterName.mp4"),
), ),

View file

@ -5,8 +5,7 @@ import 'package:mangayomi/models/settings.dart';
import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart';
import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/router/router.dart'; import 'package:mangayomi/router/router.dart';
import 'package:path/path.dart'; import 'package:mangayomi/utils/extensions/others.dart';
import 'package:path_provider/path_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'storage_usage.g.dart'; part 'storage_usage.g.dart';
@ -16,33 +15,24 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
String build() { String build() {
_getTotalDiskSpace().then((value) { _getTotalDiskSpace().then((value) {
if (!ref.mounted) return; if (!ref.mounted) return;
state = _formatBytes(value); state = value.formattedFileSize();
}); });
return "0.00 B"; return "0.00 B";
} }
final String _cacheImageMangaPath = join('Mangayomi', 'cacheimagemanga'); final _storage = StorageProvider();
final String _cacheDownloadPath = join('Mangayomi', 'downloads');
Future<void> clearCache({bool showToast = true}) async { Future<void> clearCache({bool showToast = true}) async {
final tempPath = (await getTemporaryDirectory()).path;
String? msg; String? msg;
try { try {
final dir = Directory(join(tempPath, _cacheImageMangaPath)); final dir = await _storage.getCacheDirectory('cacheimagemanga');
if (dir.existsSync()) { if (dir.existsSync()) {
await dir.delete(recursive: true); await dir.delete(recursive: true);
} }
msg = "0.00 B"; msg = "0.00 B";
} catch (_) {} } catch (_) {}
try { try {
final dir = Directory(join(tempPath, _cacheDownloadPath)); await _storage.deleteTmpDirectory();
if (dir.existsSync()) {
await dir.delete(recursive: true);
}
msg = "0.00 B";
} catch (_) {}
try {
await StorageProvider().deleteTmpDirectory();
} catch (_) {} } catch (_) {}
if (msg != null && showToast) { if (msg != null && showToast) {
state = msg; state = msg;
@ -53,14 +43,10 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
} }
Future<int> _getTotalDiskSpace() async { Future<int> _getTotalDiskSpace() async {
final tempPath = (await getTemporaryDirectory()).path;
try { try {
return await _getdirectorySize( return await _getdirectorySize(
Directory(join(tempPath, _cacheImageMangaPath)), await _storage.getCacheDirectory('cacheimagemanga'),
) + );
await _getdirectorySize(
Directory(join(tempPath, _cacheDownloadPath)),
);
} catch (_) {} } catch (_) {}
return 0; return 0;
} }
@ -79,19 +65,6 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
} catch (_) {} } catch (_) {}
return 0; return 0;
} }
String _formatBytes(int bytes) {
const units = ['B', 'KB', 'MB', 'GB'];
int unitIndex = 0;
double size = bytes.toDouble();
while (size >= 1024 && unitIndex < units.length - 1) {
size /= 1024;
unitIndex++;
}
return '${size.toStringAsFixed(2)} ${units[unitIndex]}';
}
} }
@riverpod @riverpod

View file

@ -10,7 +10,6 @@ import 'package:http_client_helper/http_client_helper.dart';
import 'package:mangayomi/providers/storage_provider.dart'; import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/services/http/m_client.dart'; import 'package:mangayomi/services/http/m_client.dart';
import 'package:path/path.dart'; import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:extended_image_library/src/network/extended_network_image_provider.dart' import 'package:extended_image_library/src/network/extended_network_image_provider.dart'
as image_provider; as image_provider;
@ -214,7 +213,7 @@ class CustomExtendedNetworkImageProvider
@override @override
final bool printError; final bool printError;
/// The max duration to cahce image. /// The max duration to cache image.
/// After this time the cache is expired and the image is reloaded. /// After this time the cache is expired and the image is reloaded.
@override @override
final Duration? cacheMaxAge; final Duration? cacheMaxAge;
@ -317,15 +316,9 @@ class CustomExtendedNetworkImageProvider
return cachedData; return cachedData;
} }
final Directory cacheImagesDirectory = Directory( final Directory cacheImagesDirectory = await StorageProvider()
join( .createCacheDirectory(imageCacheFolderName);
(await getTemporaryDirectory()).path,
'Mangayomi',
imageCacheFolderName ?? 'cacheimagecover',
),
);
Uint8List? data; Uint8List? data;
await StorageProvider().createDirectorySafely(cacheImagesDirectory.path);
final File cacheFile = File(join(cacheImagesDirectory.path, md5Key)); final File cacheFile = File(join(cacheImagesDirectory.path, md5Key));
// exist, try to find cache image file // exist, try to find cache image file

View file

@ -342,7 +342,7 @@ Future<void> pushToMangaReaderDetail({
mangaM ?? mangaM ??
Manga( Manga(
imageUrl: getManga!.imageUrl, imageUrl: getManga!.imageUrl,
name: getManga.name!.trim().trimLeft().trimRight(), name: getManga.name!.trim(),
genre: getManga.genre?.map((e) => e.toString()).toList() ?? [], genre: getManga.genre?.map((e) => e.toString()).toList() ?? [],
author: getManga.author ?? "", author: getManga.author ?? "",
status: getManga.status ?? Status.unknown, status: getManga.status ?? Status.unknown,

View file

@ -86,6 +86,20 @@ class StorageProvider {
return Directory(tmpPath); return Directory(tmpPath);
} }
Future<Directory> getCacheDirectory(String? imageCacheFolderName) async {
final cacheImagesDirectory = path.join(
(await getApplicationCacheDirectory()).path,
imageCacheFolderName ?? 'cacheimagecover',
);
return Directory(cacheImagesDirectory);
}
Future<Directory> createCacheDirectory(String? imageCacheFolderName) async {
final cachePath = await getCacheDirectory(imageCacheFolderName);
await createDirectorySafely(cachePath.path);
return cachePath;
}
Future<String> _tempDirectoryPath() async { Future<String> _tempDirectoryPath() async {
final defaultDirectory = await getDirectory(); final defaultDirectory = await getDirectory();
return path.join(defaultDirectory!.path, 'tmp'); return path.join(defaultDirectory!.path, 'tmp');

View file

@ -326,7 +326,7 @@ extension DocumentExtension on Document? {
var htmlXPath = HtmlXPath.node(dom); var htmlXPath = HtmlXPath.node(dom);
var query = htmlXPath.query(xpath); var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) { if (query.nodes.length > 1) {
return query.attrs.map((e) => e!.trim().trimLeft().trimRight()).toList(); return query.attrs.map((e) => e!.trim()).toList();
} }
return []; return [];
} }
@ -365,7 +365,7 @@ extension ElementtExtension on Element {
var htmlXPath = HtmlXPath.node(this); var htmlXPath = HtmlXPath.node(this);
var query = htmlXPath.query(xpath); var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) { if (query.nodes.length > 1) {
return query.attrs.map((e) => e!.trim().trimLeft().trimRight()).toList(); return query.attrs.map((e) => e!.trim()).toList();
} }
return []; return [];
} }

View file

@ -10,18 +10,22 @@ import 'package:intl/intl.dart';
import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart'; import 'package:mangayomi/modules/manga/reader/u_chap_data_preload.dart';
import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart';
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
import 'package:mangayomi/providers/storage_provider.dart';
import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/utils/headers.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
extension FileFormatter on num { extension FileFormatter on num {
String formattedFileSize({bool base1024 = true}) { String formattedFileSize({bool base1024 = true}) {
if (this <= 0) return "0.00 B";
final base = base1024 ? 1024 : 1000; final base = base1024 ? 1024 : 1000;
if (this <= 0) return "0"; final units = base1024
final units = ["B", "kB", "MB", "GB", "TB"]; ? ["B", "KiB", "MiB", "GiB", "TiB"]
int digitGroups = (log(this) / log(base)).round(); : ["B", "kB", "MB", "GB", "TB"];
int digitGroups = (log(this) / log(base)).floor().clamp(
0,
units.length - 1,
);
return "${NumberFormat("#,##0.#").format(this / pow(base, digitGroups))} ${units[digitGroups]}"; return "${NumberFormat("#,##0.#").format(this / pow(base, digitGroups))} ${units[digitGroups]}";
} }
} }
@ -121,7 +125,7 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
), ),
) )
: CustomExtendedNetworkImageProvider( : CustomExtendedNetworkImageProvider(
data.pageUrl!.url.trim().trimLeft().trimRight(), data.pageUrl!.url.trim(),
cache: true, cache: true,
cacheMaxAge: const Duration(days: 7), cacheMaxAge: const Duration(days: 7),
showCloudFlareError: showCloudFlareError, showCloudFlareError: showCloudFlareError,
@ -144,13 +148,8 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
Future<File?> _getCachedImageFile(String url, {String? cacheKey}) async { Future<File?> _getCachedImageFile(String url, {String? cacheKey}) async {
try { try {
final String key = cacheKey ?? keyToMd5(url); final String key = cacheKey ?? keyToMd5(url);
final Directory cacheImagesDirectory = Directory( final Directory cacheImagesDirectory = await StorageProvider()
join( .getCacheDirectory('cacheimagemanga');
(await getTemporaryDirectory()).path,
'Mangayomi',
'cacheimagemanga',
),
);
if (cacheImagesDirectory.existsSync()) { if (cacheImagesDirectory.existsSync()) {
await for (final FileSystemEntity file in cacheImagesDirectory.list()) { await for (final FileSystemEntity file in cacheImagesDirectory.list()) {
if (file.path.endsWith(key)) { if (file.path.endsWith(key)) {

View file

@ -61,7 +61,7 @@
// var query = xpath(expression); // var query = xpath(expression);
// if (query.isNotEmpty) { // if (query.isNotEmpty) {
// return query // return query
// .map((e) => (e.value ?? "").trim().trimLeft().trimRight()) // .map((e) => (e.value ?? "").trim())
// .toList(); // .toList();
// } // }
// } catch (_) {} // } catch (_) {}