Been a long while! After 2 months of work, the Android app is finally done. It is a standalone native player with a phone-first interface built with Jetpack Compose, and it runs the same Rust core as the desktop app, so sources, playback and library features are shared. You can install it via Obtainium. Since this is the first released version, there might be some rough spots. Rufin Connect is also rebuilt to go with it, and I want to improve both based on feedback.
- Building the Android player had a lot of challenges, for which I had to improvise. It also made me rethink some UX choices on the desktop too, and now all clients resemble each other, including the web. The Android app is also reliable in multiple layouts beyond the regular vertical screen: landscape mode, foldables, tablets, and TVs.
- Home and individual pages for collections have a new look now, which provides more functionality for smaller screens.
- Rufin Connect can now stream your local library to another device. Adding a device is faster, and Connect performs better overall.
- Preferences gets a new look: a sidebar with more categories, including Storage, where you can see and manage the space the cache uses.
- The equalizer gets a new layout. You can choose a graphic equalizer with 10, 18 or 31 bands or a parametric one, save presets per device, and import AutoEQ/APO files. Crossfeed is also added.
- The visualizer gets more settings and better preset management.
- A sleep timer is added.
- You can share the server link of a track from the context menu. On Android, you can also share the song or selected lyrics as a card.
- A Details dialog is added for tracks, albums and artists.
- Metadata editing now works on a selection. The tracks you selected are listed on the side of the editor, so you can move between them without closing it. You can also look tags up on MusicBrainz and AcoustID, with fingerprints calculated on your device.
- Playlists and smart playlists can be organized into folders.
- Search can now find tracks by their lyrics. This works by reading lyrics Rufin has already cached, and you can enable automatic lyrics download to keep the cache up-to-date.
- Rufin now has a mini player, and the window now adapts down to phone sizes.
- You can choose a starting page instead of Home.
- Sorting tracks by artist or album artist now orders albums by year and tracks by disc and track number.
- There is a new "Use sort tags" setting, off by default. Artists and albums sort by their name unless you enable it.
- Context menu actions now apply to everything you selected, so you can do batch actions.
- "Go to" gets folder and server destinations.
- Deleted built-in smart playlists such as Most Skipped no longer come back.
- You can now set the public address and the local address of a music server separately.
- Playback status, including pauses and seeks, is now reported to Navidrome/OpenSubsonic servers.
- Loaded lyrics are exposed over MPRIS with xesam:asText, so external tools and shell extensions can show them.
- Web UI is refined to match the GTK desktop after the recent changes, and it also can show preferences and metadata editing.
- Cover corners are less rounded and match the pane radius, so less of the artwork gets cut.
- Download transcoding is configurable now. This also fixes transcoded downloads from Jellyfin failing as unauthorized.
- Flatpak runtime is updated to GNOME 51.
- Fixed album and artist radios not using the server mixes, so AudioMuse-AI works for them as well.
- Fixed Jellyfin tracks not using their own cover when distinct covers are enabled, thanks to @luniiya.
- Fixed an issue with editing a server address failing silently when the password was not entered again.
- Fixed an issue with some track names being duplicated.
- Fixed Plex refreshes failing on titles with invalid Unicode. Those tracks are imported regardless now.
- Fixed buttons turning all white under some system theme overrides.
- Fixed the release date missing in the album grid for local files.
- Fixed the Playlists route appearing empty in some cases.
- Fixed imported playlists not finding existing tracks in Flatpak.
- Fixed empty slots on Home reacting to hover, thanks to @PonyLucky.
- Replaced the misaligned repeat and shuffle icons.
- And several other smaller fixes and improvements.
Changelog
- chore(deps): update gstreamer-rust monorepo to v0.25.4 by @rufin-renovate in #1257
- fix(deps): update rust crate loro to v1.16.2 by @rufin-renovate, @screwys in #1259
- chore(deps): update renovatebot/github-action action to v46.3.3 by @rufin-renovate, @screwys in #1258
- chore(i18n): update translations by @weblate, @Jhxnnat in #1261
- chore(deps): update rust crate constant_time_eq to 0.6.0 by @rufin-renovate in #1262
- fix(connect): encrypt local secrets and remove discarded profile storage by @screwys in #1263
- fix(discord): use Last.fm covers with the app icon fallback by @screwys in #1264
- fix(i18n): keep credential warning link under app control by @screwys in #1265
- chore(i18n): update translations by @weblate, @aguhadug in #1266
- fix(radio): use server mixes for Jellyfin and Navidrome by @screwys in #1268
- fix(discord): resolve listed MusicBrainz covers and accept Last.fm images by @screwys in #1269
- fix(sources): contain provider credentials across discovery and redirects by @screwys in #1270
- chore(deps): update rust crate thiserror to v2.0.21 by @rufin-renovate in #1271
- chore(i18n): update translations by @weblate, @JavCaRR in #1274
- chore(deps): update rust crate lindera to v6.1.0 by @rufin-renovate in #1276
- chore(deps): update rust crate hyper-util to v0.1.21 by @rufin-renovate, @screwys in #1275
- chore(deps): update rust crate lindera to v6.2.0 by @rufin-renovate in #1282
- chore(deps): update renovatebot/github-action action to v46.3.4 by @rufin-renovate, @screwys in #1281
- chore(i18n): update translations by @weblate in #1285
- chore(i18n): update translations by @weblate, @JavCaRR in #1286
- chore(i18n): update translations by @weblate in #1288
- chore(deps): update renovatebot/github-action action to v46.3.5 by @rufin-renovate in #1291
- feat: android app by @screwys in #1292
- fix: disable hover effect on empty home row slots by @PonyLucky in #1297
- fix: use known Connect addresses and reuse texture-cache test fixtures by @screwys in #1300
- fix: claim unused memory on glibc by @screwys in #1302
- refactor(memory): remove probes and simplify allocator startup by @screwys in #1307
- refactor: replace catalog and playback ownership across clients by @screwys in #1312
- fix(connect): remove obsolete cache cleanup by @screwys in #1314
- feat(navigation): add starting page and keep page on source switch by @screwys in #1317
- fix(smart-playlists): no more auto creation by @screwys in #1318
- Add Debian dev deps install instructions by @Jonany in #1320
- feat(downloads): add configurable transcoding and fix local builds by @screwys in #1319
- fix: preserve file playback and artwork progress by @screwys in #1321
- fix(gtk): preserve button icon contrast under theme overrides by @screwys in #1330
- feat(connect): replace profile sync and add peer streaming by @screwys in #1331
- feat(ui): new preferences modal by @screwys in #1332
- feat(visualizer): more configuration settings by @screwys in #1333
- fix(playback): avoid blocking file decoders on allocation queries by @screwys in #1334
- feat(equalizer): add saved presets and advanced audio controls by @screwys in #1336
- fix(library): apply context-menu actions to selected items by @screwys in #1337
- fix(playback): restart the current song on row activation by @screwys in #1338
- perf(library): make browsing cheaper and add database recovery by @screwys in #1339
- fix(cast): trace UPnP commands and renderer faults by @screwys in #1340
- feat(metadata): add batch editing and cached MusicBrainz lookup by @screwys in #1341
- fix(playback): unite activity, presence and server reporting by @screwys in #1343
- fix(player): enable fullscreen dynamic background by default by @screwys in #1342
- fix(cast): start playback on empty UPnP renderers by @screwys in #1344
- perf(release): shrink binaries and fix playback format changes by @screwys in #1346
- feat(playlists): add folders on desktop and Android by @screwys in #1345
- feat(media): add track, album and artist details by @screwys in #1347
- feat(menus): add folder and server destinations to Go to by @screwys in #1348
- fix(library): keep showcase text and disc headers visible by @screwys in #1349
- fix(ui): align player tables and refine controls by @screwys in #1350
- fix(playlists): keep smart playlists global and load pins cheaply by @screwys in #1351
- fix(ui): simplify route loading and Home refresh by @screwys in #1352
- feat: more control and better preset managament across visualizer and equalizer by @screwys in #1354
- perf: simplify browsing, playback, and preferences by @screwys in #1355
- feat(lyrics): enable searching tracks by lyrics by @screwys in #1356
- refactor(playback): correctness improvements by @screwys in #1358
- fix(gtk): stop now-playing bars from requesting frames when nothing changes by @screwys in #1360
- test(playback): record crossfade levels as buffers render by @screwys in #1361
- fix(cache): show download progress on the Cache page instead of a toast by @screwys in #1359
- perf(android): optimize Android build profiles by @screwys in #1362
- feat(playback): surround output on Android and Dolby/DTS bitstream passthrough by @screwys in #1363
- fix(android): size the ring buffer to the AudioTrack so playback starts without a skip by @screwys in #1366
- perf(build): optimize dev profiles, build a universal APK and narrow CI by @screwys in #1368
- ci: lint Android in parallel, fix its Rust cache and build macOS Intel only for releases by @screwys in #1374
- ci(rpm): build Fedora 45 RPMs in COPR by @screwys in #1377
- fix(deps): update pulldown-cmark and yanked crates, ignore pin-utils advisory by @screwys in #1379
- security: update docs by @screwys in #1380
- perf(library)!: serve library reads from a resident catalog by @screwys in #1381
- feat(desktop): expose loaded lyrics over MPRIS xesam:asText by @screwys in #1382
- fix(sources): use a track's own Jellyfin cover when distinct covers are enabled by @luniiya in #1372
- fix(ui): give the right panel one top padding instead of per-module toolbar margins by @screwys in #1383
- fix(ui): give covers the panes' 8px corner radius by @screwys in #1384
- fix(artwork): scale covers by their shortest side so wide art stays sharp by @screwys in #1385
- Update CONTRIBUTING.md by @screwys in #1387
- clients: redesign for mobile by @screwys in #1386
- mail: update maintainer mail by @screwys in #1388
- chore(i18n): update translations by @weblate, @houtarou-d, @aguhadug, @screwys in #1293
- mail: update remaining maintainer addresses by @screwys in #1389
- ui: add the mini player and narrow window layouts by @screwys in #1390
- web: follow GTK's layout, preferences and metadata by @screwys in #1391
- android: fix stuck Home and Emby lyrics at start by @screwys in #1393
- chore(i18n): update translations by @weblate in #1392
- release: write scoped bot commit subjects by @screwys in #1394
- clients: add song and lyrics sharing, polish player by @screwys in #1395
- i18n: update translations by @weblate in #1396
- docs: refine guidelines by @screwys in #1397
- android: covers wait for their load; Saved gets facts and Select by @screwys in #1398
- sources: local addresses and offline fallback by @screwys in #1399
- i18n: update translations by @weblate in #1400
- home: show Plex hubs with artists, keep card widths by @screwys in #1401
- ui/player: compact bar and short single pane by @screwys in #1403
- build: use cargo's binary instead of a copy by @screwys in #1402
- ui/shell: render Home whichever startup event lands last by @screwys in #1404
- clients: share server links from menus by @screwys in #1405
- i18n: update translations by @weblate in #1406
- ui/menus: separate the rating from Details by @screwys in #1407
- flatpak: update to GNOME 51 by @screwys in #1409
- playback: add a sleep timer by @screwys in #1408
- i18n: update translations by @weblate in #1410
- android: polish sheets, settings, overview and motion by @screwys in #1414
- playlists: resolve file entries in host paths by @screwys in #1415
- i18n: update translations by @weblate in #1416
- readme: refresh features, add Android and credits by @screwys in #1417
- credits: read sponsors without the org scope by @screwys in #1418
- android: publish per-ABI APKs on release by @screwys in #1419
- flathub: update description by @screwys in #1420
- feat: add onboarding by @screwys in #1421
- docs: update screenshots by @screwys in #1423
- i18n: update translations by @weblate in #1422
- docs: requantize README hero without dithering streaks by @screwys in #1424
New Contributors
- @PonyLucky made their first contribution in #1297
- @Jonany made their first contribution in #1320
- @luniiya made their first contribution in #1372
Full Changelog: v0.16.6...v0.17.0