commit
0803130e5f
7 changed files with 70 additions and 4 deletions
2
lib/core/cache/video_cache_manager.dart
vendored
2
lib/core/cache/video_cache_manager.dart
vendored
|
@ -1,5 +1,3 @@
|
|||
|
||||
|
||||
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
|
||||
|
||||
class VideoCacheManager {
|
||||
|
|
|
@ -56,6 +56,7 @@ class FilesDB {
|
|||
static const columnFileDecryptionHeader = 'file_decryption_header';
|
||||
static const columnThumbnailDecryptionHeader = 'thumbnail_decryption_header';
|
||||
static const columnMetadataDecryptionHeader = 'metadata_decryption_header';
|
||||
static const columnFileSize = 'file_size';
|
||||
|
||||
// MMD -> Magic Metadata
|
||||
static const columnMMdEncodedJson = 'mmd_encoded_json';
|
||||
|
@ -79,6 +80,7 @@ class FilesDB {
|
|||
...addUniqueConstraintOnCollectionFiles(),
|
||||
...addPubMagicMetadataColumns(),
|
||||
...createOnDeviceFilesAndPathCollection(),
|
||||
...addFileSizeColumn(),
|
||||
];
|
||||
|
||||
final dbConfig = MigrationConfig(
|
||||
|
@ -331,6 +333,14 @@ class FilesDB {
|
|||
];
|
||||
}
|
||||
|
||||
static List<String> addFileSizeColumn() {
|
||||
return [
|
||||
'''
|
||||
ALTER TABLE $filesTable ADD COLUMN $columnFileSize INTEGER;
|
||||
''',
|
||||
];
|
||||
}
|
||||
|
||||
Future<void> clearTable() async {
|
||||
final db = await instance.database;
|
||||
await db.delete(filesTable);
|
||||
|
@ -1377,6 +1387,7 @@ class FilesDB {
|
|||
row[columnExif] = file.exif;
|
||||
row[columnHash] = file.hash;
|
||||
row[columnMetadataVersion] = file.metadataVersion;
|
||||
row[columnFileSize] = file.fileSize;
|
||||
row[columnMMdVersion] = file.mMdVersion ?? 0;
|
||||
row[columnMMdEncodedJson] = file.mMdEncodedJson ?? '{}';
|
||||
row[columnMMdVisibility] =
|
||||
|
@ -1460,6 +1471,7 @@ class FilesDB {
|
|||
file.exif = row[columnExif];
|
||||
file.hash = row[columnHash];
|
||||
file.metadataVersion = row[columnMetadataVersion] ?? 0;
|
||||
file.fileSize = row[columnFileSize];
|
||||
|
||||
file.mMdVersion = row[columnMMdVersion] ?? 0;
|
||||
file.mMdEncodedJson = row[columnMMdEncodedJson] ?? '{}';
|
||||
|
|
|
@ -37,6 +37,7 @@ class File extends EnteFile {
|
|||
String? fileDecryptionHeader;
|
||||
String? thumbnailDecryptionHeader;
|
||||
String? metadataDecryptionHeader;
|
||||
int? fileSize;
|
||||
|
||||
String? mMdEncodedJson;
|
||||
int mMdVersion = 0;
|
||||
|
|
37
lib/services/files_service.dart
Normal file
37
lib/services/files_service.dart
Normal file
|
@ -0,0 +1,37 @@
|
|||
// ignore: import_of_legacy_library_into_null_safe
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/network.dart';
|
||||
|
||||
class FilesService {
|
||||
late Configuration _config;
|
||||
late Dio _dio;
|
||||
late Logger _logger;
|
||||
FilesService._privateConstructor() {
|
||||
_config = Configuration.instance;
|
||||
_dio = Network.instance.getDio();
|
||||
_logger = Logger("FilesService");
|
||||
}
|
||||
static final FilesService instance = FilesService._privateConstructor();
|
||||
|
||||
Future<int> getFileSize(int uploadedFileID) async {
|
||||
try {
|
||||
final response = await _dio.post(
|
||||
Configuration.instance.getHttpEndpoint() + "/files/size",
|
||||
options: Options(
|
||||
headers: {
|
||||
"X-Auth-Token": _config.getToken(),
|
||||
},
|
||||
),
|
||||
data: {
|
||||
"fileIDs": [uploadedFileID],
|
||||
},
|
||||
);
|
||||
return response.data["size"];
|
||||
} catch (e) {
|
||||
_logger.severe(e);
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -6,8 +6,10 @@ import 'package:chewie/chewie.dart';
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:logging/logging.dart';
|
||||
import 'package:photos/core/configuration.dart';
|
||||
import 'package:photos/core/constants.dart';
|
||||
import 'package:photos/models/file.dart';
|
||||
import 'package:photos/services/files_service.dart';
|
||||
import 'package:photos/ui/viewer/file/thumbnail_widget.dart';
|
||||
import 'package:photos/ui/viewer/file/video_controls.dart';
|
||||
import 'package:photos/utils/file_util.dart';
|
||||
|
@ -45,6 +47,7 @@ class _VideoWidgetState extends State<VideoWidget> {
|
|||
super.initState();
|
||||
if (widget.file.isRemoteFile) {
|
||||
_loadNetworkVideo();
|
||||
_setFileSizeIfNull();
|
||||
} else if (widget.file.isSharedMediaToAppSandbox) {
|
||||
final localFile = io.File(getSharedMediaFilePath(widget.file));
|
||||
if (localFile.existsSync()) {
|
||||
|
@ -68,13 +71,25 @@ class _VideoWidgetState extends State<VideoWidget> {
|
|||
}
|
||||
}
|
||||
|
||||
void _setFileSizeIfNull() {
|
||||
if (widget.file.fileSize == null &&
|
||||
widget.file.ownerID == Configuration.instance.getUserID()) {
|
||||
FilesService.instance
|
||||
.getFileSize(widget.file.uploadedFileID)
|
||||
.then((value) {
|
||||
widget.file.fileSize = value;
|
||||
setState(() {});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void _loadNetworkVideo() {
|
||||
getFileFromServer(
|
||||
widget.file,
|
||||
progressCallback: (count, total) {
|
||||
if (mounted) {
|
||||
setState(() {
|
||||
_progress = count / total;
|
||||
_progress = count / (widget.file.fileSize ?? total);
|
||||
if (_progress == 1) {
|
||||
showShortToast(context, "Decrypting video...");
|
||||
}
|
||||
|
|
|
@ -71,6 +71,9 @@ class DiffFetcher {
|
|||
file.thumbnailDecryptionHeader =
|
||||
item["thumbnail"]["decryptionHeader"];
|
||||
file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
|
||||
if (item["info"] != null) {
|
||||
file.fileSize = item["info"]["fileSize"];
|
||||
}
|
||||
|
||||
final fileDecryptionKey = decryptFileKey(file);
|
||||
final encodedMetadata = await CryptoUtil.decryptChaCha(
|
||||
|
|
|
@ -31,7 +31,7 @@ dependencies:
|
|||
connectivity: ^3.0.3
|
||||
cupertino_icons: ^1.0.0
|
||||
device_info: ^2.0.2
|
||||
dio: ^4.0.0
|
||||
dio: ^4.0.6
|
||||
dots_indicator: ^2.0.0
|
||||
dotted_border: ^2.0.0+2
|
||||
email_validator: ^2.0.1
|
||||
|
|
Loading…
Add table
Reference in a new issue