ente/lib/services/remote_assets_service.dart

58 lines
1.8 KiB
Dart

import "dart:io";
import "package:logging/logging.dart";
import "package:path_provider/path_provider.dart";
import "package:photos/core/network/network.dart";
class RemoteAssetsService {
static final _logger = Logger("RemoteAssetsService");
RemoteAssetsService._privateConstructor();
static final RemoteAssetsService instance =
RemoteAssetsService._privateConstructor();
Future<File> getAsset(String remotePath) async {
final path = await _getLocalPath(remotePath);
final file = File(path);
if (await file.exists()) {
_logger.info("Returning cached file for $remotePath");
return file;
} else {
final tempFile = File(path + ".temp");
await _downloadFile(remotePath, tempFile.path);
await tempFile.rename(path);
return File(path);
}
}
Future<String> _getLocalPath(String remotePath) async {
return (await getTemporaryDirectory()).path +
"/assets/" +
_urlToFileName(remotePath);
}
String _urlToFileName(String url) {
// Remove the protocol part (http:// or https://)
String fileName = url
.replaceAll(RegExp(r'https?://'), '')
// Replace all non-alphanumeric characters except for underscores and periods with an underscore
.replaceAll(RegExp(r'[^\w\.]'), '_');
// Optionally, you might want to trim the resulting string to a certain length
// Replace periods with underscores for better readability, if desired
fileName = fileName.replaceAll('.', '_');
return fileName;
}
Future<void> _downloadFile(String url, String savePath) async {
_logger.info("Downloading " + url);
final existingFile = File(savePath);
if (await existingFile.exists()) {
await existingFile.delete();
}
await NetworkClient.instance.getDio().download(url, savePath);
}
}