`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.
152 lines
4.5 KiB
YAML
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/
|