Преглед на файлове

Merge pull request #530 from ente-io/video-loader

Video loader
Ashil преди 2 години
родител
ревизия
0803130e5f
променени са 7 файла, в които са добавени 70 реда и са изтрити 4 реда
  1. 0 2
      lib/core/cache/video_cache_manager.dart
  2. 12 0
      lib/db/files_db.dart
  3. 1 0
      lib/models/file.dart
  4. 37 0
      lib/services/files_service.dart
  5. 16 1
      lib/ui/viewer/file/video_widget.dart
  6. 3 0
      lib/utils/diff_fetcher.dart
  7. 1 1
      pubspec.yaml

+ 0 - 2
lib/core/cache/video_cache_manager.dart

@@ -1,5 +1,3 @@
-
-
 import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 import 'package:flutter_cache_manager/flutter_cache_manager.dart';
 
 
 class VideoCacheManager {
 class VideoCacheManager {

+ 12 - 0
lib/db/files_db.dart

@@ -56,6 +56,7 @@ class FilesDB {
   static const columnFileDecryptionHeader = 'file_decryption_header';
   static const columnFileDecryptionHeader = 'file_decryption_header';
   static const columnThumbnailDecryptionHeader = 'thumbnail_decryption_header';
   static const columnThumbnailDecryptionHeader = 'thumbnail_decryption_header';
   static const columnMetadataDecryptionHeader = 'metadata_decryption_header';
   static const columnMetadataDecryptionHeader = 'metadata_decryption_header';
+  static const columnFileSize = 'file_size';
 
 
   // MMD -> Magic Metadata
   // MMD -> Magic Metadata
   static const columnMMdEncodedJson = 'mmd_encoded_json';
   static const columnMMdEncodedJson = 'mmd_encoded_json';
@@ -79,6 +80,7 @@ class FilesDB {
     ...addUniqueConstraintOnCollectionFiles(),
     ...addUniqueConstraintOnCollectionFiles(),
     ...addPubMagicMetadataColumns(),
     ...addPubMagicMetadataColumns(),
     ...createOnDeviceFilesAndPathCollection(),
     ...createOnDeviceFilesAndPathCollection(),
+    ...addFileSizeColumn(),
   ];
   ];
 
 
   final dbConfig = MigrationConfig(
   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 {
   Future<void> clearTable() async {
     final db = await instance.database;
     final db = await instance.database;
     await db.delete(filesTable);
     await db.delete(filesTable);
@@ -1377,6 +1387,7 @@ class FilesDB {
     row[columnExif] = file.exif;
     row[columnExif] = file.exif;
     row[columnHash] = file.hash;
     row[columnHash] = file.hash;
     row[columnMetadataVersion] = file.metadataVersion;
     row[columnMetadataVersion] = file.metadataVersion;
+    row[columnFileSize] = file.fileSize;
     row[columnMMdVersion] = file.mMdVersion ?? 0;
     row[columnMMdVersion] = file.mMdVersion ?? 0;
     row[columnMMdEncodedJson] = file.mMdEncodedJson ?? '{}';
     row[columnMMdEncodedJson] = file.mMdEncodedJson ?? '{}';
     row[columnMMdVisibility] =
     row[columnMMdVisibility] =
@@ -1460,6 +1471,7 @@ class FilesDB {
     file.exif = row[columnExif];
     file.exif = row[columnExif];
     file.hash = row[columnHash];
     file.hash = row[columnHash];
     file.metadataVersion = row[columnMetadataVersion] ?? 0;
     file.metadataVersion = row[columnMetadataVersion] ?? 0;
+    file.fileSize = row[columnFileSize];
 
 
     file.mMdVersion = row[columnMMdVersion] ?? 0;
     file.mMdVersion = row[columnMMdVersion] ?? 0;
     file.mMdEncodedJson = row[columnMMdEncodedJson] ?? '{}';
     file.mMdEncodedJson = row[columnMMdEncodedJson] ?? '{}';

+ 1 - 0
lib/models/file.dart

@@ -37,6 +37,7 @@ class File extends EnteFile {
   String? fileDecryptionHeader;
   String? fileDecryptionHeader;
   String? thumbnailDecryptionHeader;
   String? thumbnailDecryptionHeader;
   String? metadataDecryptionHeader;
   String? metadataDecryptionHeader;
+  int? fileSize;
 
 
   String? mMdEncodedJson;
   String? mMdEncodedJson;
   int mMdVersion = 0;
   int mMdVersion = 0;

+ 37 - 0
lib/services/files_service.dart

@@ -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;
+    }
+  }
+}

+ 16 - 1
lib/ui/viewer/file/video_widget.dart

@@ -6,8 +6,10 @@ import 'package:chewie/chewie.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 import 'package:flutter/material.dart';
 import 'package:logging/logging.dart';
 import 'package:logging/logging.dart';
+import 'package:photos/core/configuration.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/core/constants.dart';
 import 'package:photos/models/file.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/thumbnail_widget.dart';
 import 'package:photos/ui/viewer/file/video_controls.dart';
 import 'package:photos/ui/viewer/file/video_controls.dart';
 import 'package:photos/utils/file_util.dart';
 import 'package:photos/utils/file_util.dart';
@@ -45,6 +47,7 @@ class _VideoWidgetState extends State<VideoWidget> {
     super.initState();
     super.initState();
     if (widget.file.isRemoteFile) {
     if (widget.file.isRemoteFile) {
       _loadNetworkVideo();
       _loadNetworkVideo();
+      _setFileSizeIfNull();
     } else if (widget.file.isSharedMediaToAppSandbox) {
     } else if (widget.file.isSharedMediaToAppSandbox) {
       final localFile = io.File(getSharedMediaFilePath(widget.file));
       final localFile = io.File(getSharedMediaFilePath(widget.file));
       if (localFile.existsSync()) {
       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() {
   void _loadNetworkVideo() {
     getFileFromServer(
     getFileFromServer(
       widget.file,
       widget.file,
       progressCallback: (count, total) {
       progressCallback: (count, total) {
         if (mounted) {
         if (mounted) {
           setState(() {
           setState(() {
-            _progress = count / total;
+            _progress = count / (widget.file.fileSize ?? total);
             if (_progress == 1) {
             if (_progress == 1) {
               showShortToast(context, "Decrypting video...");
               showShortToast(context, "Decrypting video...");
             }
             }

+ 3 - 0
lib/utils/diff_fetcher.dart

@@ -71,6 +71,9 @@ class DiffFetcher {
           file.thumbnailDecryptionHeader =
           file.thumbnailDecryptionHeader =
               item["thumbnail"]["decryptionHeader"];
               item["thumbnail"]["decryptionHeader"];
           file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
           file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
+          if (item["info"] != null) {
+            file.fileSize = item["info"]["fileSize"];
+          }
 
 
           final fileDecryptionKey = decryptFileKey(file);
           final fileDecryptionKey = decryptFileKey(file);
           final encodedMetadata = await CryptoUtil.decryptChaCha(
           final encodedMetadata = await CryptoUtil.decryptChaCha(

+ 1 - 1
pubspec.yaml

@@ -31,7 +31,7 @@ dependencies:
   connectivity: ^3.0.3
   connectivity: ^3.0.3
   cupertino_icons: ^1.0.0
   cupertino_icons: ^1.0.0
   device_info: ^2.0.2
   device_info: ^2.0.2
-  dio: ^4.0.0
+  dio: ^4.0.6
   dots_indicator: ^2.0.0
   dots_indicator: ^2.0.0
   dotted_border: ^2.0.0+2
   dotted_border: ^2.0.0+2
   email_validator: ^2.0.1
   email_validator: ^2.0.1