Files
plezy/pubspec.yaml
T
edde746 3f49bcabf8 fix(prefs): replace the desktop preference store atomically
Upstream shared_preferences_windows and _linux write the whole preference
document with a bare `writeAsStringSync`. That opens with the default
`FileMode.write`, which truncates the live file before writing it, so every
single preference write has a window in which the only copy on disk is empty
or half-written. A crash, power loss, forced reboot or antivirus interception
inside that window leaves a document that fails to parse on every subsequent
launch — and the store holds the credential-vault key, so the loss is not
recoverable by rewriting it. This is the corruption class behind #1732; the
recovery path already landed is a band-aid over it.

Vendor both packages under packages/ — the convention saf_util and
wakelock_plus already follow — and stage, flush, then rename over the target.
The flush has to precede the rename or it could publish contents that were
never committed, the same corruption by another route. Staging uses one fixed
sibling name rather than a stamped one, because the file is a plaintext copy
of the vault key, tracker refresh tokens and Seerr cookies; it is created in
the target's own directory so rename stays on one volume and the mode matches
what the canonical file would have had, and a stale one is swept once the
canonical document has been read cleanly. Both deltas are marked in-source and
in provenance.json with the refresh contract.

Atomicity is proven, not asserted. A hard link to the store observes the old
document after a write, which only holds when the directory entry was replaced
— truncate-in-place would have rewritten the shared inode, and that test does
fail against unpatched upstream. Upstream's own suites still pass unchanged in
both packages and now run in CI, so the patch keeps the contract it inherited.
Windows `MoveFileExW` replacement semantics cannot be proven on a POSIX runner
or a memory file system, so they get their own test on the existing
windows-latest job, including replacement while a reader holds the file open —
antivirus and Search Indexer both do.
2026-08-01 06:59:20 +02:00

162 lines
5.0 KiB
YAML

name: plezy
description: "A beautiful Plex and Jellyfin client for Flutter"
publish_to: "none"
version: 2.11.1+125
environment:
sdk: ">=3.12.0 <4.0.0"
flutter: ">=3.44.0"
dependencies:
flutter:
sdk: flutter
intl: ^0.20.2
json_annotation: ^4.12.0
shared_preferences: ^2.5.4
cached_network_image_ce: ^4.9.0
http: ^1.2.0
url_launcher: ^6.3.0
uuid: ^4.4.0
window_manager: ^0.5.1
logger: ^2.7.0
package_info_plus: ^9.0.0
device_info_plus: ^12.3.0
provider: ^6.1.2
flex_color_picker: ^3.8.0
qr_flutter: ^4.1.0
slang: ^4.14.0
slang_flutter: ^4.14.0
duration: ^4.0.3
connectivity_plus:
git:
url: https://github.com/fluttercommunity/plus_plugins
ref: bf04cdf66598dc3fca274b8b1db2b92b0bf6b73e
path: packages/connectivity_plus/connectivity_plus
os_media_controls:
git:
url: https://github.com/edde746/media_controls
ref: 75556a968a4a1ebc42fbb8c31942c2418d4326e1
rate_limiter: ^1.0.0
wakelock_plus:
path: packages/wakelock_plus
path_provider: ^2.1.0
path: ^1.9.0
universal_gamepad: ^1.5.7
drift: ^2.31.0
crypto: ^3.0.7
cryptography: ^2.9.0
file_picker: ^11.0.2
saf_util:
# Vendored upstream 3.1.0 with a pending Result lifecycle fix (CHANGELOG) —
# upstream still double-replies MethodChannel results and crashes the Activity.
path: packages/saf_util
saf_stream: ^3.1.0
material_symbols_icons: ^4.2951.0
web_socket_channel: ^3.0.1
dart_discord_presence: ^1.2.0
flutter_svg: ^2.2.3
# Fork note: 41c16be creates the desktop temp parent before opening the
# partial file, independently fixing upstream #649's missing-directory case.
# Upstream's later target-directory fallback is unnecessary while this fork
# retains its same-filesystem move and resume-data cleanup implementation.
# No per-host trust bypass is carried: Plezy has no app-wide certificate
# exception policy, and weakening only background downloads would make API
# and playback behavior inconsistent. Revisit only with an explicit,
# host-scoped trust setting shared by every media-server HTTP client.
background_downloader:
git:
url: https://github.com/edde746/background_downloader
ref: 021e2075260e324b7440a5c81b57bf0242d35020
sentry_flutter: ^9.25.0
auto_updater:
git:
url: https://github.com/edde746/auto_updater
path: packages/auto_updater
ref: 9e150f7
cupertino_http: ^3.0.2
cronet_http: ^1.6.0
win_http: ^0.2.2
collection: ^1.18.0
freezed_annotation: ^3.1.0
xml: ^7.0.1
string_similarity: ^2.2.0
unorm_dart: ^0.3.2
dev_dependencies:
flutter_test:
sdk: flutter
flutter_lints: ^6.0.0
# Root analysis traverses packages/saf_util and consumes its lint profile.
mgenware_dart_lints: ^8.0.0
fake_async: ^1.3.3
stream_channel: ^2.1.4
build_runner: ^2.13.0
json_serializable: ^6.7.1
slang_build_runner: ^4.14.0
sentry_dart_plugin: ^3.3.0
# Used by the explicit check-unused-* CI steps; its analyzer plugin is disabled.
dart_code_linter: ^4.1.8
drift_dev: ^2.28.3
shared_preferences_platform_interface: ^2.4.0
path_provider_platform_interface: ^2.1.0
# Drive the real desktop preference backends against a temp file in tests, so
# the #1732 corrupt-store repair loop and the vendored atomic write are both
# covered against genuine file I/O. All four expose `fs`/`pathProvider`.
# The two shared_preferences packages resolve to the vendored copies below.
shared_preferences_linux: ^2.4.1
shared_preferences_windows: ^2.4.1
path_provider_linux: ^2.2.1
path_provider_windows: ^2.3.0
plugin_platform_interface: ^2.1.0
freezed: ^3.2.5
analyzer: 10.2.0
dependency_overrides:
auto_updater_platform_interface:
git:
url: https://github.com/edde746/auto_updater
ref: 9e150f7
path: packages/auto_updater_platform_interface
auto_updater_macos:
git:
url: https://github.com/edde746/auto_updater
ref: 9e150f7
path: packages/auto_updater_macos
auto_updater_windows:
git:
url: https://github.com/edde746/auto_updater
ref: 9e150f7
path: packages/auto_updater_windows
# Vendored 2.4.1 with an atomic store replacement (CHANGELOG, provenance.json)
# — upstream truncates the live preference document on every write, which is
# the corruption behind #1732.
shared_preferences_windows:
path: packages/shared_preferences_windows
shared_preferences_linux:
path: packages/shared_preferences_linux
sentry:
org: plezy
project: plezy
url: https://bugs.plezy.app
upload_sources: true
commits: false
flutter:
uses-material-design: true
assets:
- assets/plezy.png
- assets/plezy_adaptive_foreground.svg
- assets/plex_chevron.svg
- assets/jellyfin_icon.svg
- assets/trakt_circlemark.svg
- assets/mal_mark.svg
- assets/anilist_mark.svg
- assets/simkl_mark.svg
- assets/seerr_mark.svg
- assets/go-noto-current-regular.ttf
- assets/shaders/nvscaler/
- assets/shaders/artcnn/
- assets/shaders/anime4k/
- assets/player_icons/
- assets/rating_icons/