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);
if (query.nodes.length > 1) {
for (var element in query.attrs) {
attrs.add(element!.trim().trimLeft().trimRight());
attrs.add(element!.trim());
}
}
//Return one attr
else if (query.nodes.length == 1) {
String attr = query.attr != null
? query.attr!.trim().trimLeft().trimRight()
: "";
String attr = query.attr != null ? query.attr!.trim() : "";
if (attr.isNotEmpty) {
attrs = [attr];
}
@ -102,7 +100,7 @@ class MBridge {
statusMap = element;
for (var element in statusMap.entries) {
if (element.key.toString().toLowerCase().contains(
status.toLowerCase().trim().trimLeft().trimRight(),
status.toLowerCase().trim(),
)) {
return switch (element.value as int) {
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_controls/src/controls/extensions/duration.dart';
import 'package:numberpicker/numberpicker.dart';
import 'package:path/path.dart' as p;
import 'package:path/path.dart' as path;
import 'package:path_provider/path_provider.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) {
try {
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 bytes = data.buffer.asInt8List(
data.offsetInBytes,
@ -2310,7 +2309,9 @@ mp.register_script_message('call_button_${button.id}_long', button${button.id}lo
);
final dir = await StorageProvider()
.getGalleryDirectory();
final file = File(p.join(dir!.path, "$name.png"));
final file = File(
path.join(dir!.path, "$name.png"),
);
file.writeAsBytesSync(imageBytes!);
if (context.mounted) {
botToast(context.l10n.picture_saved, second: 3);

View file

@ -309,7 +309,7 @@ Future<void> downloadChapter(
if (!file.existsSync()) {
pages.add(
PageUrl(
page.url.trim().trimLeft().trimRight(),
page.url.trim(),
headers: pageHeaders,
fileName: p.join(
chapterDirectory.path,
@ -325,7 +325,7 @@ Future<void> downloadChapter(
if (!file.existsSync()) {
pages.add(
PageUrl(
page.url.trim().trimLeft().trimRight(),
page.url.trim(),
headers: pageHeaders,
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/storage_provider.dart';
import 'package:mangayomi/router/router.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:mangayomi/utils/extensions/others.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'storage_usage.g.dart';
@ -16,33 +15,24 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
String build() {
_getTotalDiskSpace().then((value) {
if (!ref.mounted) return;
state = _formatBytes(value);
state = value.formattedFileSize();
});
return "0.00 B";
}
final String _cacheImageMangaPath = join('Mangayomi', 'cacheimagemanga');
final String _cacheDownloadPath = join('Mangayomi', 'downloads');
final _storage = StorageProvider();
Future<void> clearCache({bool showToast = true}) async {
final tempPath = (await getTemporaryDirectory()).path;
String? msg;
try {
final dir = Directory(join(tempPath, _cacheImageMangaPath));
final dir = await _storage.getCacheDirectory('cacheimagemanga');
if (dir.existsSync()) {
await dir.delete(recursive: true);
}
msg = "0.00 B";
} catch (_) {}
try {
final dir = Directory(join(tempPath, _cacheDownloadPath));
if (dir.existsSync()) {
await dir.delete(recursive: true);
}
msg = "0.00 B";
} catch (_) {}
try {
await StorageProvider().deleteTmpDirectory();
await _storage.deleteTmpDirectory();
} catch (_) {}
if (msg != null && showToast) {
state = msg;
@ -53,14 +43,10 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
}
Future<int> _getTotalDiskSpace() async {
final tempPath = (await getTemporaryDirectory()).path;
try {
return await _getdirectorySize(
Directory(join(tempPath, _cacheImageMangaPath)),
) +
await _getdirectorySize(
Directory(join(tempPath, _cacheDownloadPath)),
);
await _storage.getCacheDirectory('cacheimagemanga'),
);
} catch (_) {}
return 0;
}
@ -79,19 +65,6 @@ class TotalChapterCacheSizeState extends _$TotalChapterCacheSizeState {
} catch (_) {}
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

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/services/http/m_client.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'
as image_provider;
@ -214,7 +213,7 @@ class CustomExtendedNetworkImageProvider
@override
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.
@override
final Duration? cacheMaxAge;
@ -317,15 +316,9 @@ class CustomExtendedNetworkImageProvider
return cachedData;
}
final Directory cacheImagesDirectory = Directory(
join(
(await getTemporaryDirectory()).path,
'Mangayomi',
imageCacheFolderName ?? 'cacheimagecover',
),
);
final Directory cacheImagesDirectory = await StorageProvider()
.createCacheDirectory(imageCacheFolderName);
Uint8List? data;
await StorageProvider().createDirectorySafely(cacheImagesDirectory.path);
final File cacheFile = File(join(cacheImagesDirectory.path, md5Key));
// exist, try to find cache image file

View file

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

View file

@ -86,6 +86,20 @@ class StorageProvider {
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 {
final defaultDirectory = await getDirectory();
return path.join(defaultDirectory!.path, 'tmp');

View file

@ -326,7 +326,7 @@ extension DocumentExtension on Document? {
var htmlXPath = HtmlXPath.node(dom);
var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) {
return query.attrs.map((e) => e!.trim().trimLeft().trimRight()).toList();
return query.attrs.map((e) => e!.trim()).toList();
}
return [];
}
@ -365,7 +365,7 @@ extension ElementtExtension on Element {
var htmlXPath = HtmlXPath.node(this);
var query = htmlXPath.query(xpath);
if (query.nodes.length > 1) {
return query.attrs.map((e) => e!.trim().trimLeft().trimRight()).toList();
return query.attrs.map((e) => e!.trim()).toList();
}
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/more/settings/reader/providers/reader_state_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/reg_exp_matcher.dart';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as p;
extension FileFormatter on num {
String formattedFileSize({bool base1024 = true}) {
if (this <= 0) return "0.00 B";
final base = base1024 ? 1024 : 1000;
if (this <= 0) return "0";
final units = ["B", "kB", "MB", "GB", "TB"];
int digitGroups = (log(this) / log(base)).round();
final units = base1024
? ["B", "KiB", "MiB", "GiB", "TiB"]
: ["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]}";
}
}
@ -121,7 +125,7 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
),
)
: CustomExtendedNetworkImageProvider(
data.pageUrl!.url.trim().trimLeft().trimRight(),
data.pageUrl!.url.trim(),
cache: true,
cacheMaxAge: const Duration(days: 7),
showCloudFlareError: showCloudFlareError,
@ -144,13 +148,8 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
Future<File?> _getCachedImageFile(String url, {String? cacheKey}) async {
try {
final String key = cacheKey ?? keyToMd5(url);
final Directory cacheImagesDirectory = Directory(
join(
(await getTemporaryDirectory()).path,
'Mangayomi',
'cacheimagemanga',
),
);
final Directory cacheImagesDirectory = await StorageProvider()
.getCacheDirectory('cacheimagemanga');
if (cacheImagesDirectory.existsSync()) {
await for (final FileSystemEntity file in cacheImagesDirectory.list()) {
if (file.path.endsWith(key)) {

View file

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