From 6cb0a921c96d8a0186879123422e63d8d6975455 Mon Sep 17 00:00:00 2001 From: Patrick Britton Date: Tue, 10 Feb 2026 18:57:47 -0600 Subject: [PATCH] Phase 4: FFmpeg conditional import (web-safe), remove unused dio + pointycastle (~230KB saved) --- .../lib/providers/quip_upload_provider.dart | 3 +- .../lib/screens/admin/quip_repair_screen.dart | 3 +- .../screens/compose/video_editor_screen.dart | 3 +- .../quips/create/quip_metadata_screen.dart | 3 +- sojorn_app/lib/services/media/ffmpeg.dart | 2 + sojorn_app/lib/services/media/ffmpeg_io.dart | 4 ++ .../lib/services/media/ffmpeg_stub.dart | 48 +++++++++++++++++++ .../lib/services/video_stitching_service.dart | 4 +- sojorn_app/pubspec.lock | 24 ---------- sojorn_app/pubspec.yaml | 2 - 10 files changed, 59 insertions(+), 37 deletions(-) create mode 100644 sojorn_app/lib/services/media/ffmpeg.dart create mode 100644 sojorn_app/lib/services/media/ffmpeg_io.dart create mode 100644 sojorn_app/lib/services/media/ffmpeg_stub.dart diff --git a/sojorn_app/lib/providers/quip_upload_provider.dart b/sojorn_app/lib/providers/quip_upload_provider.dart index bb4b409..bd00267 100644 --- a/sojorn_app/lib/providers/quip_upload_provider.dart +++ b/sojorn_app/lib/providers/quip_upload_provider.dart @@ -1,7 +1,6 @@ import 'dart:io'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_new/return_code.dart'; +import '../services/media/ffmpeg.dart'; import 'package:path_provider/path_provider.dart'; import '../services/auth_service.dart'; import '../services/api_service.dart'; diff --git a/sojorn_app/lib/screens/admin/quip_repair_screen.dart b/sojorn_app/lib/screens/admin/quip_repair_screen.dart index 4dd93f6..97ac1a3 100644 --- a/sojorn_app/lib/screens/admin/quip_repair_screen.dart +++ b/sojorn_app/lib/screens/admin/quip_repair_screen.dart @@ -1,8 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_new/return_code.dart'; +import '../../services/media/ffmpeg.dart'; import 'package:path_provider/path_provider.dart'; import '../../services/image_upload_service.dart'; import '../../providers/api_provider.dart'; diff --git a/sojorn_app/lib/screens/compose/video_editor_screen.dart b/sojorn_app/lib/screens/compose/video_editor_screen.dart index d94cb7e..958cc6f 100644 --- a/sojorn_app/lib/screens/compose/video_editor_screen.dart +++ b/sojorn_app/lib/screens/compose/video_editor_screen.dart @@ -6,8 +6,7 @@ import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:path_provider/path_provider.dart'; import 'package:video_player/video_player.dart'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_new/return_code.dart'; +import '../../services/media/ffmpeg.dart'; import '../../models/sojorn_media_result.dart'; import '../../theme/app_theme.dart'; diff --git a/sojorn_app/lib/screens/quips/create/quip_metadata_screen.dart b/sojorn_app/lib/screens/quips/create/quip_metadata_screen.dart index 0489b41..f2e52a8 100644 --- a/sojorn_app/lib/screens/quips/create/quip_metadata_screen.dart +++ b/sojorn_app/lib/screens/quips/create/quip_metadata_screen.dart @@ -2,8 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:video_player/video_player.dart'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_new/return_code.dart'; +import '../../../services/media/ffmpeg.dart'; import 'package:path_provider/path_provider.dart'; import '../../../providers/quip_upload_provider.dart'; import '../../../services/image_upload_service.dart'; diff --git a/sojorn_app/lib/services/media/ffmpeg.dart b/sojorn_app/lib/services/media/ffmpeg.dart new file mode 100644 index 0000000..6c779c4 --- /dev/null +++ b/sojorn_app/lib/services/media/ffmpeg.dart @@ -0,0 +1,2 @@ +/// Conditional export: web gets the stub, mobile/desktop gets the real package. +export 'ffmpeg_stub.dart' if (dart.library.io) 'ffmpeg_io.dart'; diff --git a/sojorn_app/lib/services/media/ffmpeg_io.dart b/sojorn_app/lib/services/media/ffmpeg_io.dart new file mode 100644 index 0000000..f6eccfa --- /dev/null +++ b/sojorn_app/lib/services/media/ffmpeg_io.dart @@ -0,0 +1,4 @@ +/// Mobile/desktop: re-export the real ffmpeg_kit_flutter_new classes. +export 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; +export 'package:ffmpeg_kit_flutter_new/ffmpeg_session.dart'; +export 'package:ffmpeg_kit_flutter_new/return_code.dart'; diff --git a/sojorn_app/lib/services/media/ffmpeg_stub.dart b/sojorn_app/lib/services/media/ffmpeg_stub.dart new file mode 100644 index 0000000..0d395c3 --- /dev/null +++ b/sojorn_app/lib/services/media/ffmpeg_stub.dart @@ -0,0 +1,48 @@ +/// Web-safe stubs that mirror the ffmpeg_kit_flutter_new API surface. +/// These classes compile on web but always return failure / no-op. + +class FFmpegKit { + static Future execute(String command) async { + return FFmpegSession._(); + } + + static Future executeAsync( + String command, [ + Function? completeCallback, + Function? logCallback, + Function? statisticsCallback, + ]) async { + final session = FFmpegSession._(); + completeCallback?.call(session); + return session; + } + + static Future executeWithArguments( + List arguments, [ + Function? completeCallback, + Function? logCallback, + Function? statisticsCallback, + ]) async { + final session = FFmpegSession._(); + completeCallback?.call(session); + return session; + } +} + +class FFmpegSession { + FFmpegSession._(); + + Future getReturnCode() async => ReturnCode._(-1); + Future getOutput() async => null; + Future getAllLogsAsString() async => null; +} + +class ReturnCode { + final int _value; + ReturnCode._(this._value); + + static bool isSuccess(ReturnCode? code) => false; + + @override + String toString() => 'ReturnCode($_value)'; +} diff --git a/sojorn_app/lib/services/video_stitching_service.dart b/sojorn_app/lib/services/video_stitching_service.dart index cf157a2..f97b27d 100644 --- a/sojorn_app/lib/services/video_stitching_service.dart +++ b/sojorn_app/lib/services/video_stitching_service.dart @@ -1,7 +1,5 @@ import 'dart:io'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_kit.dart'; -import 'package:ffmpeg_kit_flutter_new/ffmpeg_session.dart'; -import 'package:ffmpeg_kit_flutter_new/return_code.dart'; +import 'media/ffmpeg.dart'; import 'package:path_provider/path_provider.dart'; class VideoStitchingService { diff --git a/sojorn_app/pubspec.lock b/sojorn_app/pubspec.lock index 8173e28..aa6784a 100644 --- a/sojorn_app/pubspec.lock +++ b/sojorn_app/pubspec.lock @@ -345,22 +345,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.1" - dio: - dependency: "direct main" - description: - name: dio - sha256: b9d46faecab38fc8cc286f80bc4d61a3bb5d4ac49e51ed877b4d6706efe57b25 - url: "https://pub.dev" - source: hosted - version: "5.9.1" - dio_web_adapter: - dependency: transitive - description: - name: dio_web_adapter - sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" - url: "https://pub.dev" - source: hosted - version: "2.1.1" fake_async: dependency: transitive description: @@ -1469,14 +1453,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" - pointycastle: - dependency: "direct main" - description: - name: pointycastle - sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5" - url: "https://pub.dev" - source: hosted - version: "4.0.0" pool: dependency: transitive description: diff --git a/sojorn_app/pubspec.yaml b/sojorn_app/pubspec.yaml index 2501202..cf84b8b 100644 --- a/sojorn_app/pubspec.yaml +++ b/sojorn_app/pubspec.yaml @@ -20,7 +20,6 @@ dependencies: # HTTP & API http: ^1.2.2 - dio: ^5.7.0 # UI & Utilities cupertino_icons: ^1.0.8 @@ -63,7 +62,6 @@ dependencies: # E2EE Cryptography cryptography: ^2.5.0 convert: ^3.1.1 - pointycastle: ^4.0.0 file_picker: ^10.3.10 universal_html: ^2.0.8