filmopen_app
Generated by scripts/package_digest.py; regenerate, never edit.
A desktop browser for FilmOpen projects: a folder of plain JSON files that describes a film completely (characters, outfits, locations, props, styles, the script as folders and scenes, shots, cues, models, platforms, plugins, render batches, commentary and official pointers). Every entity is a versioned file per author, can be forked, and an _official.json pointer names the version the project has chosen. See docs/FilmOpen-Project-Specification v1.0.md. How the application itself is built is in docs/software/ (the Software Specification, in parts, with a generated page per package).
Flutter. 16 files, 4,525 lines under lib/; 1222 tests in 124 files. The application: no barrel; lib/main.dart wires the packages together.
Depends on
Section titled “Depends on”- filmopen_comps — uses
CompsAccessToken,CompsAssembler,CompsCancellation,CompsEvent,CompsException,CompsPreparedBundle,CompsPublisher,CompsUploadReceipt,PortableCompsMediaPreparer,compsFileSource,createCompsFileWorkspace - filmopen_format — uses
Author,BatchStem,Catalogue,Deliverable,Entity,FileNameParser,FilmProject,JsonShape,JsonShapeException,MediaKind,MediaStage,SetRecord,ShortName,VersionStem,WarningKind,naturalCompare,newUsageId,numField,projectKeyOf,stringField,takeNamed - filmopen_store — uses
AppLog,LineLogSink,LogLevel,UnavailableUsageLog,UsageLog,openFileLogSink,openUsageLog - filmopen_l10n — uses nothing by name the digest could see
- filmopen_ui — uses
Breakpoints,ChromeClearance,ChromeInsets,EmptyState,SectionCard,ShortNameField,SidebarSplitView,SlideOut,buildTheme,kLongMessage,kMonoFontFallback,showMessage - filmopen_platform — uses
AudioSource,CredentialStore,IncomingLinks,KeyVerifier,UnavailableAudioSource,UnavailableCredentialStore,UnavailableIncomingLinks,UnavailableKeyVerifier,canRevealFiles,createDeviceAudioSource,createDeviceBackgroundTransfers,createDeviceCredentialStore,createDeviceIncomingLinks,hasAppFiles,isDesktop,jobsDirectory,logFilePath,logLevelFromEnvironment,readEnvironment,revealInFileManager,syncDirectory,usageDirectory - filmopen_state — uses
AccountAuthentication,AccountLedger,AccountProjects,AccountSnapshot,AccountSnapshots,AutomationHost,ClipboardAsksMessenger,Command,CommandAllowedKeys,CommandCaller,CommandRegistry,CommandValidator,CommunityGroups,CompPostException,CompPostOutcome,CompPostState,CompPoster,CompPosting,DeviceRegistration,DraftsNotSettledException,EntitySelection,ExitTasks,InsertionAppBinding,LeavingOutcome,LeavingResult,Lending,MediaClient,NavIndex,NoAccountLedger,NoAccountProjectsand 73 more - filmopen_media — uses
MediaStore,PlayableFile,ProjectMedia - filmopen_insertion — uses
Function,InsertionService,InsertionSource,InsertionTarget,maxImportBytesWeb - filmopen_jobs — uses
JobAction,JobActionAck,JobPhase,JobView,JobViews,describeJobError - filmopen_media_ui — uses
Function,canChooseFiles - filmopen_insertion_ui — uses
Function,InsertionActions,settleFileDrops - filmopen_account — uses
AccountBalanceReader,AccountGroupsClient,AccountLedgerReader,AccountLending,AccountMedia,AccountProfileButton,AccountProjectsClient,AccountProviderFunding,FilmOpenAccountAuth,accountAuthProblem,accountBalanceReaderProvider,accountErrorData,accountModelProvider,freshAccessToken - filmopen_sharing — uses
AccountUsernameChoice,FilmOpenSharingCard,driveAccountProvider,sharingModelProvider,sharingTargetFor,showAliasDialog - filmopen_sync — uses
SyncService,SyncTarget - filmopen_jobs_ui — uses
ActivityPage,SharePage - filmopen_device — uses
DeviceRegistrar,DeviceSlugStore,claimDeviceName,deviceName - filmopen_keys — uses
GeneralKeysSection,HttpKeyVerifier,KeyCards,KeyStatus,KeyringEmptyLine,UsageSection,openExternalLink,providerKeysProvider - filmopen_assistant_ui — uses
AssistantDock,AssistantTextModelPicker - filmopen_browser — uses
BrowserPage,BrowserTree,Function,openAssistantWrite - filmopen_recorder — uses
PictureSize,Recorder - filmopen_relay — uses
RelayClient,RemoteControlCard,canHoldRelaySocket - filmopen_support — uses
CommentaryButton,CommentaryChoiceBox,CommentaryPhase,HttpReportSender,NoReportSender,RecordingCommentary,RecordingFlash,ReportFacts,ReportFlow,SupportAccount,UnsentReports,commentaryChoiceProvider,supportTicketUrl - filmopen_dictation — uses
DictationEngineCard,DictationSettingsCard,Transcriber,UnavailableTranscriber,createDeviceTranscriber,dictateShortName,dictationRouteProvider - filmopen_plugin_host — uses
closePluginProcesses,createPluginRuntime,installAssistantService,pluginsSettled,pokeLendingSupplier,refreshAssistantReadiness,startRenders,startServers - filmopen_plugins_ui — uses
PluginsTab,openPluginDocs - filmopen_plugin_dev — uses
showPluginDevPage - filmopen_render — uses
BackendRenderManager,ManagedRenderProducer,RenderAttentionManager,RenderBackend,RenderJob,RenderManager,RenderRoute,isRenderJobId,renderProducerKind - filmopen_render_ui — uses
Function,GpuPage,GpuStatus,GpuStatusKind,RenderQueue,RenderQueueItem,gpuSessionsProvider,gpuStatusProvider,mintedLinks,mintedMedia,prepareRender,prepareRenderBeforeWriting,refreshLocalStatus,registerAutoReferences,registerMachineCommand,registerRenderCommands,renderActionOver,renderQueueProvider,renderResolutionsOf,renderSettingsPicked,renderSettledValue,renderSmallestResolution - filmopen_timeline_ui — uses
MonitorViews - filmopen_engine — uses
EngineException,FakeEngine,LoggingEngine,MediaProbe,TimelineEngine - filmopen_engine_android — uses
AndroidEngine - filmopen_engine_mlt — uses
MltEngine,MltTexture - filmopen_engine_mpv — uses
MpvEngine - filmopen_plugins — uses nothing by name the digest could see
- filmopen_automation (dev) — uses nothing by name the digest could see
- filmopen_exchange (dev) — uses nothing by name the digest could see
- filmopen_tree (dev) — uses nothing by name the digest could see
- filmopen_forms (dev) — uses nothing by name the digest could see
- filmopen_compare (dev) — uses nothing by name the digest could see
- filmopen_prompt_ui (dev) — uses nothing by name the digest could see
- filmopen_test_support (dev) — uses nothing by name the digest could see
Third-party: flutter_riverpod, file_selector, shared_preferences, app_links, http.
Used by
Section titled “Used by”No package of FilmOpen.
lib/app.dart
Section titled “lib/app.dart”- class
FilmOpenAppconst FilmOpenApp({super.key})
- class
PastePlainText— Paste as plain text — Control-Shift-V, Command-Shift-V on a Mac, what a dictation tool sends — runs the focused field’s own paste, as Control-V does (§9).const PastePlainText({super.key, required this.child})— Wraps [child], whose focused field gets the plain paste.final Widget child— The subtree whose focused field the shortcut pastes into.
- class
_PastePlain— The paste-as-plain-text keys, as the log names them.final String keys
- class
DraftsBeforeExit— Closing the window writes every open draft before the app exits.const DraftsBeforeExit({super.key, required this.child})final Widget childstatic const Duration limit— The whole exit’s budget: the leaving, then the exit tasks with what it left.static const Duration quick— How long the leaving is waited for, at most, out of [limit].static const Duration savingAfter— How long the leaving runs before Saving changes… shows.
- class
_DraftsBeforeExitState
lib/binding.dart
Section titled “lib/binding.dart”- class
FilmOpenBinding— The product’s binding: Flutter’s own, with its messenger’s sends passing through the clipboard asks (§4.2).
lib/command_wiring.dart
Section titled “lib/command_wiring.dart”- function
void wireCommands(ProviderContainer container, {@visibleForTesting CommandValidator? validator})— Installs the command registry’s validator, session and authority, then registers the core commands (§7.3). - class
_JsonShapeValidator— The registry’s validator over the plug-ins’JsonShape: a schema it cannot read isschema-unsupported, never its text; a problem is its path and code, never the value, and an argument the schema does not take is an…
lib/comps_composition.dart
Section titled “lib/comps_composition.dart”- typedef
typedef CompDraft— A comp’s draft and, for each of itssourceids, the local file it is. - typedef
typedef CompProbe— Measures the file at a path: the selected timeline engine’sprobe(§19.1). - function
Future<CompDraft> compDraftOf(FilmProject project, MediaStore? store, SetRecord comp, {Author? viewer, CompProbe? probe})— Maps [comp] to the comps service’s draft JSON, each medium resolved through [store] to a local file (§6.17). - function
Future<void> _probed(Map<String, Object?> media, String path, CompProbe probe, void Function(Map<String, Object?> data) step)— Fills a clip’s missing width, height and duration, or a sound’s missing duration, from [probe] (§6.17): the record’s facts first; a refused probe leaves them unknown. - function
Future<String> _fileOf(ProjectMedia found, MediaStore? store)— The local file [found] is, or a refusal saying why there is none. - function
({Map<String, Object?> media, String kindFrom}) _mediaOf(FilmProject project, ProjectMedia found, Map<String, dynamic> item, int n, String referenc…— One media entry of the draft — the item’s ids, its kind and label, what its record measured and asked — and whether its kind came from the take’s deliverable or the file. - function
String _nameOf(FilmProject project, String? source, Author? viewer)— The entity’s name in use for [viewer], from the version stem the item was made for; the stem where none is found. - variable
const kCompsPublishHost— The comps publishing service of this build: the development service in a build with development mode (§6.17). - variable
const _definiteRefusals— The revision codes after which a revision is not published (filmopen_comps’s INTEGRATING.md);not-foundcounts only as the account that began it, which the page ensures before it checks. - function
CompPoster compPosterOver(Ref ref)— The poster the app installs over [compPosterProvider] off the web: the comps service as the signed-in account. - class
AppCompPoster— Posts comps throughfilmopen_comps: [prepare] composes and prepares with no request, [publish] sends (§6.17).AppCompPoster({ required http.Client client, required this.project, required this.store, required this.viewer, required this.account, required this…— A poster over [client], reading the open project, its media and the viewer, and the account’s id and token.final FilmProject? Function() project— The open project, null while none is.final MediaStore? Function() store— The open project’s media store, null where it has none.final Author? Function() viewer— The viewer, whose names in use label the media.final Future<String?> Function() account— The signed-in account’s id, null while nobody is signed in.final CompProbe? probe— Measures a clip or a sound whose record lacks its facts; null where no engine measures.final CompsAccessToken accessToken— The account’s fresh token, asked for only when a request goes.
lib/consts.dart
Section titled “lib/consts.dart”- variable
const String kAppVersion— Must matchversion:in pubspec.yaml; the About dialog shows it. - variable
const String kSpecUrl - variable
const String kAppBuild— The CI run that made this build (--dart-define=FILMOPEN_BUILD),devfor any other. - variable
const String kAppCommit— The commit CI built (FILMOPEN_COMMIT),localfor any other build. - variable
const String kAppBuiltAt— When this build was made, an instant in UTC to the second (FILMOPEN_BUILT_AT, which every script that builds or runs the app passes); empty in a build made without one. - getter
String get appVersionWithBuildNumber—0.1.0+dev: the version the device’s registration sends. - getter
String get appBuildStamp— The build’s stamp, shown on About and sent with the device’s registration (filmopen_state’sbuild_stamp.dart).
lib/insertion_attention.dart
Section titled “lib/insertion_attention.dart”- class
AttentionInsertionService— The application’s insertion service with exact manager attention.AttentionInsertionService(this.insertion, this.manager)— Composes the installed insertion and render manager without changing their shared contracts.final InsertionService insertion— The service that owns insertion, binding and film mutation.final RenderManager manager— The manager that owns render attention policy and its offered actions.
lib/library_file_io.dart
Section titled “lib/library_file_io.dart”- function
bool fileExists(String path)— Whether a file is at [path]. - function
void openAndClose(String path)— Opens the library at [path] once and closes it again; throws the loader’s error where it does not load.
lib/library_file_stub.dart
Section titled “lib/library_file_stub.dart”- function
bool fileExists(String path)— Never: the web has no disk to look on. - function
void openAndClose(String path)— Never reached: the web never looks for a library.
lib/main.dart
Section titled “lib/main.dart”- function
Future<void> main(List<String> arguments)— [arguments] is the command line. - function
Future<void> runFilmOpen(List<String> arguments, {SharedPreferencesWithCache? isolatedPreferences, void Function()? afterRuntimeAttached})— Starts the app, with preferences of an agent build’s own where it supplies them. - function
void logFlutterError(FlutterErrorDetails details)— Writes a Flutter error report to the log: its library, its context — what was being done, as the reporter said —, the exception and the stack. - variable
const _media3Notice— AndroidX Media3’s notice on the licence page (§19.16): Apache-2.0, by reference, as Media3 publishes it. - function
Future<void> _startLog()— Opens the log before anything else can fail. - variable
const _remoteControlKey— Where Remote control’s switch is kept: a preference of this device, off when never set (§6.6c). - class
_PreferenceSlugs— The device’s claimed name kept in the app’s preferences, under the key the registrar scopes (§6.6b).final SharedPreferencesWithCache preferences
lib/queue_composition.dart
Section titled “lib/queue_composition.dart”- function
void listenQueue(ProviderContainer container)— Starts terminal listening before restore and settles when the open film or viewer changes (§6.15). - function
QueueRunner queueRunnerOver(Ref ref)— The runner the app installs over [queueRunnerProvider]: this app’s [RenderQueue] andInsertionService.current. - class
AppQueueRunner— Runs the render queue’s passes and reads its items’ jobs; a pass’s start and end are told on [changes].AppQueueRunner(this.queue, this.container, {@visibleForTesting this.backend})— A runner over [queue] and [container]; [backend] replaces the current manager’s in a test.final ProviderContainer container— The providers used by preparation.final RenderBackend? backend— A test’s stand-in backend, else the current manager’s is read at each call.final RenderQueue queue— The app’s one render queue, whose lock is this app’s.void dispose()— Ends [changes]’ own part.
lib/screens/dashboard.dart
Section titled “lib/screens/dashboard.dart”- function
Future<String?> sendingToken(Future<String?> Function() fresh, { bool Function(Object error) refused = sessionRefused, })— The session’s token for sending a recording, from [fresh]: null — the sign-in, with nothing sent (Software Specification §6.8) — where the account’s server refuses the session, as [refused] tells; any other failure st… - function
bool sessionRefused(Object error)— Whether [error] is the account’s server refusing the session — a refresh token revoked, used up or expired: an error the account reads as a failure, answered with a4xx. - variable
final _shareSignInProvider— The Share page’s sign-in, by the open film’s target when a row asks (§9.7). - class
_ShareSignIn— A row’s sign-in: the account’s for a film on FilmOpen Cloud — the account’s popup, then a wait for it to be signed in, at most 30 s — and the Sharing model’s Google sign-in for any other.final Ref refFuture<bool> begin(String job, String reason)void cancel(String job)— Ends the wait the job [job] started: the account’s where it was the account’s, else Google’s.
- class
Dashboard— The window: a narrow navigation rail on the left, one page on the right.const Dashboard({super.key})
- class
_DashboardState - variable
const double _drawerWidth— The drawer’s width where it holds the tree, at most: the rail and a tree about as wide as the wide layout’s default. - variable
const double _drawerMinWidth— The drawer’s width where it holds the tree, at least: the rail, its divider and the tree’s own minimum, even where the window is narrower than a phone’s. - class
_MenuButton— The menu button at the upper left of a narrow window, floating over the page’s first row (§9.1): it opens the drawer, and while the drawer is open it is a back arrow that closes it.final bool openfinal VoidCallback onPressed
- variable
const double kRailWidth— The rail’s width; the page begins past it and its divider. - class
_NavRailfinal int indexfinal double top— The room left above the first section for the menu button, in the drawer.final int costing— How many GPU servers started from this app may still cost: GPU’s badge, none at 0.final GpuStatus gpu— The option a render will use: GPU’s two lines.final ValueChanged<int> onSelected
- class
_HelpButton— The rail’s ?: opens the support dialog — Get Support, where a recording starts, and About — and is a stop button while a recording runs. - class
_RailButtonfinal String identifier— The semantics identifier an agent taps.final String labelfinal IconData iconfinal IconData selectedIconfinal bool selectedfinal VoidCallback onTapfinal int badge— The count the icon’s badge shows, none at 0; [badgeLabel] says what it counts, after the button’s name in its tooltip and its label.final String? badgeLabelfinal List<String> lines— Lines under the label, one line each, ellipsised rather than wrapped — a lone line has the room of two, as the account’s lone status line has —; said by the tooltip after the badge’s sentence, then [linesNote], and so…final String? linesNote— What the tooltip adds after [lines].
lib/screens/settings_models.dart
Section titled “lib/screens/settings_models.dart”- variable
const settingsModelKinds— The kinds of render Settings → Models offers a default for, in their order: those a place asks by (§9.4). - typedef
typedef _Model— A model with a route here, its routes one per plug-in, platform and key — the place within a route is the render’s to choose. - class
SettingsModelsTab— Settings → Models (§9.4): at Prototype or Final, the default model of each kind of render that has a model with a route here, and the assistant’s text model.const SettingsModelsTab({super.key, this.backend})— The page; [backend] answers which routes run each model, the application’s where none is given.final RenderBackend? backend
- class
_SettingsModelsTabState - class
_KindRow— One kind’s default at one stage: its model, and the route where the model has more than one.final String kindfinal String stagefinal List<_Model> modelsfinal Catalogue cataloguefinal RenderBackend? backend
- class
_KindRowState
lib/screens/settings_page.dart
Section titled “lib/screens/settings_page.dart”- class
SettingsPage— Settings (Software Specification §9.4): General, the cards Settings always had and the app’s keys (§6.7), Plugins, each plug-in’s own keys on its page, and Models, the default model of each kind of render — chos…const SettingsPage({super.key})
- class
_SettingsPageState - variable
const generalListKey— The key of General’s list, which a test scrolls. - function
List<(int, String, IconData)> _pages(AppLocalizations l10n)— Settings’ pages, in their order: each one’s tab, name and icon. - class
_PageTab— A page as a tab to the semantics: its name, whether it is the one shown, and a tap that shows it — the one shape the list’s rows and the pull-down’s stand-ins share (§9.4).final bool selectedfinal Widget child
- class
_SettingsList— The list beside the page, at the browser’s sidebar: the title, then one row per page, the page shown drawn as the tree draws its selected row.final Widget titlefinal int selected
- class
_SettingsPicker— The labelled pull-down above the page below 700 px of window, with the list’s two pages (settings.page).final int selected
- class
_LanguagePullDown— The language (§9.4): a pull-down drawn as the microphone’s beside it is, with room for the languages to come — System first, chosen while no language is and keeping none, never the one it resolves to; then each lang… - function
Future<bool> _openPluginDocs(Uri uri)— A plug-in’s guide opened in the browser, and the address logged: a public page of the documentation site, which says which site this build’s Docs reaches (§9.4). - class
_GeneralTab— The cards Settings always had. - class
_ExportEncoderCard— Export encoder (§9.4, §19): Automatic or Software only, the encoder the dock’s MP4 export asks for. - class
_NotSavedLine— A preference that could not be saved (§9.4): the sentence that says so, and Try again.final String identifier— The semantics identifier of Try again.final String messagefinal VoidCallback onRetry
- class
_IdentityCard— The username (§9.4): its box, and what came of the last change. - class
_IdentityCardState - class
_LibraryCard— The shared library folder (§14.5): where it is, choose another, go back to the app’s own. - class
_LogsCard— The log: verbosity, and where the file is. - class
_DevelopmentCard— Development mode (§9.5): whether the rules about who may do what warn instead of refusing. - class
_AboutCard - function
Entity? selectedEntity({FilmProject? project, Selection? selection, Author? viewer})— The entity the tree has selected, where it has one — the developer page’s Save what it makes to — or null where it names no one version. - function
Entity? devPageSource(WidgetRef ref)— [selectedEntity] read from the providers, for the two screens that open the developer page. - class
_DevelopmentFolder - class
_DevelopmentFolderState - class
_PathLine— A path in monospace with, when the platform allows, a small button that shows it in the file browser.final String textfinal String? revealPath
- function
Future<void> _reveal(BuildContext context, String path) - class
_Segments— A segmented button that fits the card it is in.final String identifierfinal T selectedfinal ValueChanged<T> onChanged
lib/screens/support_dialog.dart
Section titled “lib/screens/support_dialog.dart”- class
SupportDialog— The rail’s ?: Get Support, where a person starts a recording, and About — the app, its version, the specification it reads and the open-source notices.const SupportDialog({super.key, required this.onRecord, required this.onSendReport})final VoidCallback onRecord— Starts a recording; called after the dialog is gone.final void Function(String stamp) onSendReport— Opens the recording with that stamp to describe and send it; called after the dialog is gone.
- class
_TabInView— The tab the dialog’s tab bar has selected, as tall as its content.final List<Widget> tabs
- class
_Tab— One tab’s content: padded, and scrolling when the window is short.final List<Widget> children
lib/screens/watch_page.dart
Section titled “lib/screens/watch_page.dart”- class
WatchPage— The rail’s Watch (§9.1): tutorials and featured works, each a marked placeholder.const WatchPage({super.key})
lib/timeline_engine_selection.dart
Section titled “lib/timeline_engine_selection.dart”- function
bool Function(String path) engineLibraryExists— Whether a file is at a path: the disk, unless a test says otherwise. - function
void Function(String path) engineLibraryLoads— Opens a library once and closes it, throwing where it does not load: the loader, unless a test says otherwise. - typedef
typedef EngineNotice— One notice of an engine’s library for the licence page: the packages it names, its text’s asset, and the asset of a licence text appended to it (the LGPL’s), if any. - class
EngineAdapter— One engine the build may name: its name, where its library is on each platform, how its engine is made, and the notices its libraries ship with.const EngineAdapter({required this.name, required this.libraryDir, required this.libraryFileName, required this.factory, this.noticeEntries = _none})— An adapter named [name], whose library [libraryFileName] names in [libraryDir] (null on a platform it has no native build for, or for an engine with no library), whose engines [factory] makes, and whose libraries’ not…final String name— The name the build gives inFILMOPEN_ENGINEand the wrappers’--engine.final String Function() libraryDir— The folder the engine opens its library from on this machine.final String? Function(TargetPlatform platform) libraryFileName— The library’s file name on a platform, or null where this engine has none to load there.final TimelineEngine Function() factory— A new engine of this kind, unwrapped.final List<EngineNotice> Function(TargetPlatform platform) noticeEntries— The notices of the libraries this engine ships on a platform, in the licence page’s order (§19.16).String? libraryPath(TargetPlatform platform)— The library’s path on [platform], or null where there is none to load.
- variable
final engineAdapters— Every engine a build may name, by name; a second native engine is one more row (§19.16). - variable
const platformDefaultEngines— Each platform’s default engine is MLT on Linux and Windows and Android on Android. - function
List<EngineAdapter> shippedEngineAdapters({TargetPlatform? platform, bool web = kIsWeb})— The adapters whose library is in this bundle, whatever the build selected: the licence page names their notices, since what ships is what the engines’ native builds put beside the app (§19.16). - function
List<EngineNotice> _mltNotices(TargetPlatform platform)— MLT’s libraries’ notices (§19): LGPL FFmpeg and MLT, linked dynamically and replaceable, their sources offered in their notices; SDL2 under zlib; on Linux OpenH264, the software H.264 encoder, under BSD-2-Clause, and… - function
List<EngineNotice> _mpvNotices(TargetPlatform platform)— libmpv’s libraries’ notices: mpv and libplacebo (and FFmpeg on Linux) under the LGPL-2.1, libass, on Linux the subtitles’ font libraries, OpenH264; on Windows FFmpeg under the LGPL-3.0 with the GPL-3.0’s text (beside… - function
TimelineEngine Function() selectTimelineEngine({TargetPlatform? platform, bool web = kIsWeb, String requested = const String.fromEnvironment('FILMO…— The factory of the engine the build names in [requested] (FILMOPEN_ENGINE), said asengine.select.startand thenengine.selected, withengine.select.failedbetween them where the named engine cannot be had; th…