mirror of
https://github.com/immich-app/immich.git
synced 2026-05-24 16:42:30 -04:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 687f43c976 | |||
| f8b5371c18 |
@@ -16,7 +16,6 @@ import 'package:immich_mobile/providers/asset_viewer/video_player_value_provider
|
|||||||
import 'package:immich_mobile/providers/cast.provider.dart';
|
import 'package:immich_mobile/providers/cast.provider.dart';
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
import 'package:immich_mobile/services/api.service.dart';
|
||||||
import 'package:immich_mobile/services/app_settings.service.dart';
|
import 'package:immich_mobile/services/app_settings.service.dart';
|
||||||
import 'package:immich_mobile/services/asset.service.dart';
|
|
||||||
import 'package:immich_mobile/utils/debounce.dart';
|
import 'package:immich_mobile/utils/debounce.dart';
|
||||||
import 'package:immich_mobile/utils/hooks/interval_hook.dart';
|
import 'package:immich_mobile/utils/hooks/interval_hook.dart';
|
||||||
import 'package:immich_mobile/widgets/asset_viewer/custom_video_player_controls.dart';
|
import 'package:immich_mobile/widgets/asset_viewer/custom_video_player_controls.dart';
|
||||||
@@ -103,19 +102,7 @@ class NativeVideoViewerPage extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final videoSource = useMemoized<Future<VideoSource?>>(() => createSource());
|
final videoSource = useMemoized<Future<VideoSource?>>(createSource);
|
||||||
final aspectRatio = useState<double?>(asset.aspectRatio);
|
|
||||||
useMemoized(() async {
|
|
||||||
if (!context.mounted || aspectRatio.value != null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
aspectRatio.value = await ref.read(assetServiceProvider).getAspectRatio(asset);
|
|
||||||
} catch (error) {
|
|
||||||
log.severe('Error getting aspect ratio for asset ${asset.fileName}: $error');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
void checkIfBuffering() {
|
void checkIfBuffering() {
|
||||||
if (!context.mounted) {
|
if (!context.mounted) {
|
||||||
@@ -361,18 +348,10 @@ class NativeVideoViewerPage extends HookConsumerWidget {
|
|||||||
// This remains under the video to avoid flickering
|
// This remains under the video to avoid flickering
|
||||||
// For motion videos, this is the image portion of the asset
|
// For motion videos, this is the image portion of the asset
|
||||||
if (!isVideoReady.value || asset.isMotionPhoto) Center(key: ValueKey(asset.id), child: image),
|
if (!isVideoReady.value || asset.isMotionPhoto) Center(key: ValueKey(asset.id), child: image),
|
||||||
if (aspectRatio.value != null && !isCasting)
|
if (!isCasting)
|
||||||
Visibility.maintain(
|
Visibility.maintain(
|
||||||
key: ValueKey(asset),
|
|
||||||
visible: isVisible.value,
|
visible: isVisible.value,
|
||||||
child: Center(
|
child: Center(child: isCurrent ? NativeVideoPlayerView(onViewReady: initController) : null),
|
||||||
key: ValueKey(asset),
|
|
||||||
child: AspectRatio(
|
|
||||||
key: ValueKey(asset),
|
|
||||||
aspectRatio: aspectRatio.value!,
|
|
||||||
child: isCurrent ? NativeVideoPlayerView(key: ValueKey(asset), onViewReady: initController) : null,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
if (showControls) const Center(child: CustomVideoPlayerControls()),
|
if (showControls) const Center(child: CustomVideoPlayerControls()),
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -142,20 +142,7 @@ class NativeVideoViewer extends HookConsumerWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
final videoSource = useMemoized<Future<VideoSource?>>(() => createSource());
|
final videoSource = useMemoized<Future<VideoSource?>>(createSource);
|
||||||
final aspectRatio = useState<double?>(null);
|
|
||||||
|
|
||||||
useMemoized(() async {
|
|
||||||
if (!context.mounted || aspectRatio.value != null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
aspectRatio.value = await ref.read(assetServiceProvider).getAspectRatio(asset);
|
|
||||||
} catch (error) {
|
|
||||||
log.severe('Error getting aspect ratio for asset ${asset.name}: $error');
|
|
||||||
}
|
|
||||||
}, [asset.heroTag]);
|
|
||||||
|
|
||||||
void checkIfBuffering() {
|
void checkIfBuffering() {
|
||||||
if (!context.mounted) {
|
if (!context.mounted) {
|
||||||
@@ -320,20 +307,6 @@ class NativeVideoViewer extends HookConsumerWidget {
|
|||||||
Timer(const Duration(milliseconds: 200), checkIfBuffering);
|
Timer(const Duration(milliseconds: 200), checkIfBuffering);
|
||||||
}
|
}
|
||||||
|
|
||||||
Size? videoContextSize(double? videoAspectRatio, BuildContext? context) {
|
|
||||||
Size? videoContextSize;
|
|
||||||
if (videoAspectRatio == null || context == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
final contextAspectRatio = context.width / context.height;
|
|
||||||
if (videoAspectRatio > contextAspectRatio) {
|
|
||||||
videoContextSize = Size(context.width, context.width / aspectRatio.value!);
|
|
||||||
} else {
|
|
||||||
videoContextSize = Size(context.height * aspectRatio.value!, context.height);
|
|
||||||
}
|
|
||||||
return videoContextSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
ref.listen(currentAssetNotifier, (_, value) {
|
ref.listen(currentAssetNotifier, (_, value) {
|
||||||
final playerController = controller.value;
|
final playerController = controller.value;
|
||||||
if (playerController != null && value != asset) {
|
if (playerController != null && value != asset) {
|
||||||
@@ -421,19 +394,16 @@ class NativeVideoViewer extends HookConsumerWidget {
|
|||||||
children: [
|
children: [
|
||||||
// Hide thumbnail once video is visible to avoid it showing in background when zooming out on video.
|
// Hide thumbnail once video is visible to avoid it showing in background when zooming out on video.
|
||||||
if (!isVisible.value || controller.value == null) Center(key: ValueKey(asset.heroTag), child: image),
|
if (!isVisible.value || controller.value == null) Center(key: ValueKey(asset.heroTag), child: image),
|
||||||
if (aspectRatio.value != null && !isCasting && isCurrent)
|
if (!isCasting)
|
||||||
Visibility.maintain(
|
Visibility.maintain(
|
||||||
key: ValueKey(asset),
|
|
||||||
visible: isVisible.value,
|
visible: isVisible.value,
|
||||||
child: PhotoView.customChild(
|
child: PhotoView.customChild(
|
||||||
key: ValueKey(asset),
|
|
||||||
enableRotation: false,
|
enableRotation: false,
|
||||||
disableScaleGestures: disableScaleGestures,
|
disableScaleGestures: disableScaleGestures,
|
||||||
// Transparent to avoid a black flash when viewer becomes visible but video isn't loaded yet.
|
// Transparent to avoid a black flash when viewer becomes visible but video isn't loaded yet.
|
||||||
backgroundDecoration: const BoxDecoration(color: Colors.transparent),
|
backgroundDecoration: const BoxDecoration(color: Colors.transparent),
|
||||||
scaleStateChangedCallback: (state) => scaleStateNotifier?.value = state,
|
scaleStateChangedCallback: (state) => scaleStateNotifier?.value = state,
|
||||||
childSize: videoContextSize(aspectRatio.value, context),
|
child: isCurrent ? NativeVideoPlayerView(onViewReady: initController) : null,
|
||||||
child: NativeVideoPlayerView(key: ValueKey(asset), onViewReady: initController),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (showControls) const Center(child: VideoViewerControls()),
|
if (showControls) const Center(child: VideoViewerControls()),
|
||||||
|
|||||||
+2
-2
@@ -1241,8 +1241,8 @@ packages:
|
|||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
path: "."
|
||||||
ref: e132bc3
|
ref: "4d39883"
|
||||||
resolved-ref: e132bc3ecc6a6d8fc2089d96f849c8a13129500e
|
resolved-ref: "4d39883a7582d42e6ca88dcf4b0320f20efc2562"
|
||||||
url: "https://github.com/immich-app/native_video_player"
|
url: "https://github.com/immich-app/native_video_player"
|
||||||
source: git
|
source: git
|
||||||
version: "1.3.1"
|
version: "1.3.1"
|
||||||
|
|||||||
+1
-1
@@ -57,7 +57,7 @@ dependencies:
|
|||||||
native_video_player:
|
native_video_player:
|
||||||
git:
|
git:
|
||||||
url: https://github.com/immich-app/native_video_player
|
url: https://github.com/immich-app/native_video_player
|
||||||
ref: 'e132bc3'
|
ref: '4d39883'
|
||||||
network_info_plus: ^6.1.3
|
network_info_plus: ^6.1.3
|
||||||
octo_image: ^2.1.0
|
octo_image: ^2.1.0
|
||||||
openapi:
|
openapi:
|
||||||
|
|||||||
Reference in New Issue
Block a user