Files
plezy/pubspec.yaml
T
edde746 3ae7aa554b fix(prefs): recover a preference store whose bytes are not valid UTF-8
`File.readAsString` reports a UTF-8 decode failure as a FileSystemException,
not a FormatException, so three guards written for that case never ran. The
preflight's `on FormatException` branch was unreachable and its
`on FileSystemException` sibling waved the document through; the plugin then
threw the same FileSystemException, which failed the FormatException/TypeError
test that decides repairability; and quarantine's lossy-decode fallback sat
dead behind a rethrow. A store with one bad high byte — a UTF-16 BOM, a stray
0x80 — therefore reached the user as a failure screen with no Repair button
and no way forward at all.

Read bytes and decode explicitly instead, at both sites. Classification moves
into describeStoreDamage, so a failure that surfaces after the preflight
passed is judged by re-reading the file rather than by the error's type: a
denied or locked store is indistinguishable from a decode failure by type or
message, and offering a destructive repair for a permissions problem would
reset every setting and risk the vault key over something a chmod fixes.
isCorruptStoreError went with it, having no remaining callers.

A repair that quarantines the store and then cannot reopen it no longer
strands the process either. The repaired future was built straight from the
cache loader, bypassing the self-healing reset sharedCache installs, so a
failed reopen parked a rejected future in _cacheFuture and every later attempt
replayed that stale error — with the damaged file already moved aside, so a
restart would have booted cleanly.

CorruptPreferenceStoreException now carries reopenSafe and a derived,
content-free shape: byte length, whether it decoded, whether every byte is
zero. #1732 arrived as "FormatException at offset 0" and nothing else, which
cannot separate an all-zero file from a non-JSON first character from bytes
that are not UTF-8; these can, and never quote the document.

Cover the loop against the real desktop backend rather than a fake.
shared_preferences_linux is pure Dart, byte-identical to the Windows
implementation, and exposes fs/pathProvider, so pointing it at a temp
directory exercises the genuine read, parse, cache and write path on any host
— the join between preflight, classification and reopen where every one of
these defects lived, and which had no coverage at all.
2026-08-01 06:59:20 +02:00

152 lines
4.5 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
# Drives the real desktop preference backend against a temp file in tests, so
# the #1732 corrupt-store repair loop is covered on any host and not only on
# a Windows/Linux runner. Both classes expose `fs`/`pathProvider` for this.
shared_preferences_linux: ^2.4.1
path_provider_linux: ^2.2.1
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
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/