From d64f745f6432a15be20aa76492714e37e1535ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Phil=C3=A9as?= Date: Tue, 26 Dec 2023 21:32:22 +0100 Subject: [PATCH] Add a check of mixed resolution when creating movie. --- lib/lang/en.dart | 4 ++ lib/lang/fr.dart | 6 ++- .../widgets/create_movie_button.dart | 39 +++++++++++++++++++ lib/pages/save_video/widgets/save_button.dart | 3 +- 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lib/lang/en.dart b/lib/lang/en.dart index a4c85f1..7edb2c1 100644 --- a/lib/lang/en.dart +++ b/lib/lang/en.dart @@ -212,4 +212,8 @@ const Map en = { 'useAlternativeCalendarColors': 'Use alternative calendar colors', 'useAlternativeCalendarColorsDescription': 'Changes green and red in calendar to blue and yellow. Useful for colorblind people.', + 'mixedResolutionAlert' : 'Mixed Resolutions detected', + 'mixedResolutionAlertDescription' : 'At least one snippet seems to have a different resolution.\n\n' + 'This can cause unexpected results when using your film.\n\n' + 'Try to delete theses files or move them to a different profile.' }; diff --git a/lib/lang/fr.dart b/lib/lang/fr.dart index 77f38e7..02a3641 100644 --- a/lib/lang/fr.dart +++ b/lib/lang/fr.dart @@ -213,5 +213,9 @@ const Map fr = { 'Lorsqu\'il est activé, sélectionner des dates passées filtrera les vidéos par cette date. Lorsqu\'il est désactivé, toutes les vidéos seront affichées. Fonctionne uniquement avec le sélecteur de fichiers expérimental.', 'useAlternativeCalendarColors': 'Utilisez des couleurs de calendrier alternatives', 'useAlternativeCalendarColorsDescription': - 'Change le vert et le rouge dans le calendrier en bleu et jaune. Utile pour les personnes daltoniennes.' + 'Change le vert et le rouge dans le calendrier en bleu et jaune. Utile pour les personnes daltoniennes.', + 'mixedResolutionAlert' : 'Mix de résolutions détecté.', + 'mixedResolutionAlertDescription' : 'Au moins une vidéo semble avoir un mix de résolutions.\n\n' + 'Cela peut produire des résultats innatendus lorsque vous utilisez votre film.\n\n' + 'Essayez de supprimer ces fichiers ou de les déplacer dans un autre profil.' }; diff --git a/lib/pages/home/create_movie/widgets/create_movie_button.dart b/lib/pages/home/create_movie/widgets/create_movie_button.dart index 584ae4e..adfac09 100644 --- a/lib/pages/home/create_movie/widgets/create_movie_button.dart +++ b/lib/pages/home/create_movie/widgets/create_movie_button.dart @@ -39,6 +39,8 @@ class _CreateMovieButtonState extends State { final VideoCountController controller = Get.find(); bool isProcessing = false; String progress = ''; + String usedResolution = ''; + var mixedResolutionError = []; void _openVideo(String filePath) async { await OpenFilex.open(filePath); @@ -153,6 +155,27 @@ class _CreateMovieButtonState extends State { } }); + // Checks if there is a mix of horizontal/vertical videos by comparing their resolution. + await executeFFprobe( + '-v quiet -show_entries stream=width,height -of default=nw=1:nk=1 "$currentVideo"') + .then((session) async { + final returnCode = await session.getReturnCode(); + if (ReturnCode.isSuccess(returnCode)) { + final sessionLog = await session.getOutput(); + if (sessionLog == usedResolution) { + return; + } else if (usedResolution == '' && sessionLog!.isNotEmpty) { + usedResolution = sessionLog; + } else { + mixedResolutionError.add(currentVideo); + } + } else { + final sessionLog = await session.getLogsAsString(); + Utils.logError('${logTag}Error checking if $currentVideo was recorded on v1.5'); + Utils.logError('${logTag}Error: $sessionLog'); + } + }); + // Make sure all selected videos have a subtitles and audio stream before creating movie, and finally check their resolution, resizes if necessary. // To avoid asking permission for every single video, we make a copy and leave the original untouched if (!isV1point5) { @@ -278,6 +301,22 @@ class _CreateMovieButtonState extends State { }); } + // Show an error if multiple resolutions is detected. + if(mixedResolutionError.isNotEmpty) { + showDialog( + barrierDismissible: false, + context: Get.context!, + builder: (context) => CustomDialog( + isDoubleAction: false, + title: 'mixedResolutionAlert'.tr, + content: "${'mixedResolutionAlertDescription'.tr}\n\n${mixedResolutionError.toString()}", + actionText: 'Ok', + actionColor: Colors.red, + action: () => Get.offAllNamed(Routes.HOME), + ), + ); + } + if (mounted) { setState(() { progress = '$currentIndex / ${selectedVideos.length}'; diff --git a/lib/pages/save_video/widgets/save_button.dart b/lib/pages/save_video/widgets/save_button.dart index cd1d4ba..a61582e 100644 --- a/lib/pages/save_video/widgets/save_button.dart +++ b/lib/pages/save_video/widgets/save_button.dart @@ -328,8 +328,7 @@ class _SaveButtonState extends State { final returnCode = await session.getReturnCode(); if (ReturnCode.isSuccess(returnCode)) { final sessionLog = await session.getOutput(); - Utils.logInfo('résultat ffprobe : $sessionLog'); - // 4:3 vidéos (ex : produced by pixel devices in photo modes), will be scaled up to fit into 1080x1920. + // 4:3 videos (ex : produced by pixel devices in photo modes), will be scaled up to fit into 1080x1920. if (sessionLog!.contains('4:3')) { scale = 'scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920'; Utils.logInfo('${logTag}4/3 video detected, cropping to 9/16.');