Commit Graph
299 Commits
Author SHA1 Message Date
zarzet e61ff64adc feat(mornye): cache motion covers and refine player and search
Save album motion videos in app storage during downloads and prefer offline playback with an aspect-aware layout. Add cache management for saved videos.

Center active lyrics on opening, expand lyrics during manual scrolling, and adjust landscape header spacing. Group search rows and skeletons with dividers and remove redundant result icons.

Validation: Flutter analysis clean; 723 tests passed, 4 skipped; iOS simulator build installed.
2026-09-19 17:26:26 +07:00
zarzet 63e1a9b9c8 feat(ui): add Mornye glass theme and adaptive music player
Add a selectable Mornye theme with shared glass controls, dialogs, sheets, notifications, and collection headers while retaining Material components.

Update player artwork, lyrics transitions and highlighting, synchronized rolling time labels, volume controls, and compact navigation. Unify metadata, Library, search, and extension surfaces; preserve restored artwork and report extension load failures.

Validation: full Flutter analyzer clean; 713 tests passed and 4 skipped; pinned Dart formatting and diff checks passed; signed ARM64 and ARM32 release APKs built and verified.
2026-09-19 12:10:10 +07:00
zarzet f0ed293d48 feat: add opt-in Discord Rich Presence on Android
Use the official Discord Social SDK through JNI to share built-in player activity, clear presence when playback stops, and guard against late callbacks after disabling. Package the SDK optionally through SPOTIFLAC_DISCORD_SDK_DIR with license notices.

Credit: @itsmegaaa for the Rich Presence initiative and contribution in #575 and #576.

Validation: 15 Dart tests, scoped Flutter analysis, and one Android 16 ARM64 SDK/JNI instrumentation test passed. Visible presence on a signed-in Discord profile remains unverified.
2026-09-17 02:12:24 +07:00
zarzet aa99726439 feat(backend): migrate production backend to Rust
Replace the Go backend with the Rust workspace and route Android/iOS through
UniFFI bindings. Include the migrated extension runtime, network, providers,
media metadata, downloads and library operations, with version 5.0.0+147.

Remove Go sources, adapters, native build selection and CI dependencies.
Build Rust unconditionally and lock the iOS Rust pod using a relative path.
Retain legacy source and migration evidence in a local ignored archive.

Validation: Android Kotlin compile and 53 native tests; Swift Rust-branch
equivalence and syntax; CocoaPods install; workflow, shell, Ruby, plist and
diff checks. Reuse the preceding 100 Rust tests, fmt/Clippy and five-ABI
build checkpoint; no new APK or iOS application build for this cleanup.

Known follow-up: URL/URLSearchParams globals are missing from the Rust JS
runtime. A controlled extension replay confirms a URL-resolution regression;
this commit does not fix that runtime gap.
2026-09-14 22:58:27 +07:00
zarzet 1da0da18a6 feat(backup): allow selecting categories and settings-only backups 2026-09-08 19:51:25 +07:00
zarzet 259fb5b6c0 fix(backup): allow selecting SFLB archives for restore 2026-09-07 19:38:14 +07:00
zarzet 81ce677149 fix(download): remove legacy HIGH quality conversion 2026-09-07 01:20:28 +07:00
zarzet 4b7e731474 feat(about): show compiled short Git commit 2026-09-06 14:54:35 +07:00
zarzet 1dc4e77f42 refactor(i18n): share supported language choices
Use one non-generated language catalog in setup and appearance settings. Filter supported locale codes once and retain the resulting immutable picker list.
2026-09-06 14:05:09 +07:00
zarzet a1ee346f2f chore(logging): sanitize diagnostics and reduce noise 2026-08-31 01:49:49 +07:00
zarzet 897fb7d523 feat(backup): stream versioned ZIP archives 2026-08-30 23:19:09 +07:00
zarzet 892d152e5c fix(resolver): retire unavailable resolver endpoints 2026-08-30 18:51:20 +07:00
zarzet d0a9868c2d feat(resolver): add cross-platform fallback chain 2026-08-30 16:55:16 +07:00
zarzet e9bb3ae303 feat(l10n): merge Crowdin translation updates (#531)
Merge Crowdin changes per key so translations from PR #531 are retained without dropping localization keys added on main. Normalize locale filenames for Flutter, keep incomplete languages behind the 70% production threshold, and retain them in Crowdin for continued translation.
2026-08-30 12:59:48 +07:00
zarzet 29db940d63 fix(security): encrypt extension storage at rest 2026-08-29 18:52:16 +07:00
zarzet 887a8ede12 feat(metadata): limit embedded cover resolution 2026-08-28 13:21:05 +07:00
zarzet 933a3c49e2 fix(library): persist artwork previews and stabilize completion 2026-08-27 21:42:38 +07:00
zarzet 2b117415ae feat: add file format library quality label 2026-08-27 16:50:46 +07:00
zarzet 1a7c20111a feat(library): add lyrics filtering and metadata actions 2026-08-27 01:44:06 +07:00
zarzet 0de4135966 fix(ui): smooth metadata transitions and refine settings 2026-08-26 22:36:54 +07:00
zarzet c6437d8428 feat(library): add bit depth quality label mode 2026-08-23 11:42:47 +07:00
zarzet b1180a70a7 fix(library): restore live folder scan progress 2026-08-22 13:43:06 +07:00
zarzet b780aae38f fix(library): open folder actions on row tap 2026-08-22 13:37:06 +07:00
zarzet 60624436a6 feat(library): support multiple storage folders 2026-08-22 11:15:42 +07:00
zarzet ea63291db8 refactor(metadata): move cover resolution to extensions 2026-08-19 13:12:29 +07:00
zarzet bdb10a2ae6 chore(deps): update Flutter and Go dependencies 2026-08-19 11:59:28 +07:00
zarzet 29609b6084 refactor(extensions): prioritize configurable settings 2026-08-17 21:04:53 +07:00
zarzet 2e115308b7 feat(filename): add provider traceability tags 2026-08-17 20:51:27 +07:00
zarzet f7439c6793 feat(library): add combined quality label #511 2026-08-11 16:56:12 +07:00
zarzet dacc5abde0 feat(logs): copy selected entries #511 2026-08-11 16:12:05 +07:00
zarzet 6ad993e27d fix(lyrics): respect extension provider selection #511 2026-08-11 15:46:33 +07:00
zarzet 5237aed25e feat(download): add automatic lossy conversion 2026-08-11 15:19:45 +07:00
zarzet bad48ea0fd feat(settings): reveal nested search results 2026-08-01 19:23:58 +07:00
zarzet f7a0c8e993 feat(settings): search nested options 2026-08-01 19:08:35 +07:00
zarzet 12f2b12570 style(settings): restore connected group layout 2026-07-29 21:03:24 +07:00
zarzet cc93c5020d feat(settings): polish search and navigation layout 2026-07-29 19:27:30 +07:00
zarzet 6e60f33fd0 feat(settings): add searchable settings index 2026-07-29 17:13:33 +07:00
zarzet dc4c75363c refactor(extensions): share extension rows 2026-07-29 17:11:51 +07:00
zarzet 309777cc71 refactor(settings): unify settings components 2026-07-29 17:11:34 +07:00
zarzet fa0c7b20b5 refactor(ui): unify sliver page headers 2026-07-29 17:10:24 +07:00
zarzet 1e973d5ecb style(dart): apply repository formatting 2026-07-29 14:14:42 +07:00
zarzet 662558e3e6 fix(ui): sanitize user-facing errors 2026-07-29 01:43:04 +07:00
zarzet 454ef53977 feat(library): add quality label display modes 2026-07-27 17:25:39 +07:00
zarzet ef3e019a3a feat(library): playlists filter view and configurable default view
Add a fourth Playlists chip/page to the Library filter pager, rendered
as an album-style grid of playlist cells (search filters by name, page
provider short-circuits since playlists come from libraryCollections).
Add a defaultLibraryView setting (last used / all / albums / singles /
playlists) in Library settings, applied on startup and whenever the
shell switches back to the Library tab.
2026-07-27 02:12:35 +07:00
zarzet ac56e76b62 feat(appearance): manual toggle to force backdrop blur on lower device tiers 2026-07-27 01:39:16 +07:00
zarzet 2ce793d68f perf(ui): scope scan rebuilds, aspect-bound MediaQuery, lazy duplicate list 2026-07-26 22:25:07 +07:00
zarzet cb8064a317 refactor(dart): consolidate duplicated lookup, filename, and search-provider helpers 2026-07-26 18:52:26 +07:00
zarzet a21d5bcb33 feat(library): ISRC duplicate detection beyond FLAC with review sheet
The download-time ISRC index now also parses mp3, m4a, ogg, and opus
tags through the existing native readers instead of skipping everything
but .flac. Library settings gain a Review duplicates sheet that groups
history and local-library rows sharing an ISRC via SQL over the
attached databases (no filesystem walk, SAF-safe), shows quality
badges, and offers keep-best and per-copy delete with confirmation.
2026-07-26 18:49:58 +07:00
zarzet d38a368f63 chore(about): credit blackgold8282 (Korean) and BrandQc (French) as translators 2026-07-26 18:12:40 +07:00
zarzet 984beb92e8 feat(l10n): merge Crowdin updates, enable Korean at 98%
Merge origin/l10n_main (PR #428) with a per-key three-way resolution:
Crowdin values win only where main did not change the key since the
last sync, so the unused-key removal, store->repo wording sweep, and
ICU plural fixes survive. Korean is restored at 98% completion and
mapped again in crowdin.yml and both language pickers; ar/hi/nl/zh-CN/
zh-TW stay dropped (37% and below).
2026-07-26 18:12:25 +07:00