⚠️ CRITICAL data-loss fix — upgrade strongly recommended if you were on 1.7.0 / 1.7.1
Root cause: Load() in AchievementBadgeService wrapped the entire deserialise + migrate + evaluate loop in a single try/catch. Any exception at any stage (stale profile schema, an unrecognised enum value, a null where something non-null was expected) hit the outer catch, which silently wiped _userProfiles to an empty dict. The next Save() call — triggered moments later by startup re-evaluation, preferences POST, login-ping, quest creation, equip/unequip, basically anything — then stamped {} on badges.json via the atomic write. Every user's badges, counters, prestige, bought, equipped, pinned, compare-history — permanently gone. The atomic-write pattern even cleanly overwrote the last good file on disk.
Fix in v1.7.2:
- Parse failures now quarantine
badges.json→badges.json.corrupt-<timestamp>and set a_loadFailedflag.Save()is refused for the rest of the process, so your real file can't be overwritten with an empty one. - Per-profile errors during
SyncDefinitions/EvaluateBadgesare caught individually — one bad profile can't poison every user. Save()now writesbadges.json.bakbefore each atomic rename, giving a one-step revert path for future incidents.
If you were hit: check <JF>/config/plugins/configurations/achievementbadges/ for badges.json.corrupt-* (v1.7.2 would have quarantined if there's still a cause today) or your Jellyfin automatic backups. If none survived — sorry, truly. There's no recovery.
Other fixes
🔧 Settings panel stuck on "Loading settings..."
The language-change handler kicked off multiple async chains and if any threw silently the panel got stuck. Now awaits the preference POST, fetches fresh prefs, and always falls through to re-render with a safety catch.
👥 Friends drawer (rebuilt)
- Floating people button bottom-right of the achievements page with a red badge for pending requests.
- Xbox-style right-side drawer with three tabs: Friends / Requests / Find.
- Bi-directional friendship with a proper request → accept flow (no more silent following):
POST /friends/{id}sends a requestPOST /friends/{id}/acceptcreates the mutual linkDELETE /friends/{id}removes / declines from both sides
- Type-to-search user picker in the Find tab — no more giant dropdown of every server user.
- Auto-accept when the target has already requested us.
- Per-side privacy enforced (equipped preview respects the friend's own privacy toggles).
🇫🇷 French translations from @frenchyx24
All 171 hand-translated French badge titles + descriptions merged from issue #5. Thanks @frenchyx24! Validated on import (id regex, 500-char cap, HTML/CR/LF stripped — standard safety).
🌍 i18n
+17 new friends-drawer keys × 8 languages (676 UI keys per file total).
MD5: 5EE8F99DEAA927EDD81FD0844C9403E5