Skip to content

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.

  • 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, NoAccountProjects and 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.

No package of FilmOpen.

  • class FilmOpenApp
    • const 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 child
    • static 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
  • class FilmOpenBinding — The product’s binding: Flutter’s own, with its messenger’s sends passing through the clipboard asks (§4.2).
  • 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 is schema-unsupported, never its text; a problem is its path and code, never the value, and an argument the schema does not take is an…
  • typedef typedef CompDraft — A comp’s draft and, for each of its source ids, the local file it is.
  • typedef typedef CompProbe — Measures the file at a path: the selected timeline engine’s probe (§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-found counts 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 through filmopen_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.
  • variable const String kAppVersion — Must match version: 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), dev for any other.
  • variable const String kAppCommit — The commit CI built (FILMOPEN_COMMIT), local for 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’s build_stamp.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.
  • 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.
  • 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.
  • 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
  • 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] and InsertionService.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.
  • 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 a 4xx.
  • 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 ref
    • Future<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 open
    • final VoidCallback onPressed
  • variable const double kRailWidth — The rail’s width; the page begins past it and its divider.
  • class _NavRail
    • final int index
    • final 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 _RailButton
    • final String identifier — The semantics identifier an agent taps.
    • final String label
    • final IconData icon
    • final IconData selectedIcon
    • final bool selected
    • final VoidCallback onTap
    • final 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? badgeLabel
    • final 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].
  • 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 kind
    • final String stage
    • final List<_Model> models
    • final Catalogue catalogue
    • final RenderBackend? backend
  • class _KindRowState
  • 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 selected
    • final 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 title
    • final 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 message
    • final 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 text
    • final String? revealPath
  • function Future<void> _reveal(BuildContext context, String path)
  • class _Segments — A segmented button that fits the card it is in.
    • final String identifier
    • final T selected
    • final ValueChanged<T> onChanged
  • 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
  • class WatchPage — The rail’s Watch (§9.1): tutorials and featured works, each a marked placeholder.
    • const WatchPage({super.key})
  • 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 in FILMOPEN_ENGINE and 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 as engine.select.start and then engine.selected, with engine.select.failed between them where the named engine cannot be had; th…