Feishin

github.com/jeffvli/feishin
Feishin

A desktop or self-hosted web music player for Navidrome, Jellyfin and OpenSubsonic compatible music servers. A fork with support for Plex is also available.

Open Source

Feishin Source Code

Author

jeffvli

Description

A modern self-hosted music player.

#jellyfin#music-player#navidrome#self-hosted#subsonic#subsonic-client

Homepage

https://feishin.vercel.app

Repository

  • LicenseGPL-3.0
  • Created25 Jul 22
  • Primary languageTypeScript
  • Size61,984 KB
  • Stars10,143
  • Forks564
  • Watchers10,143

Language Usage

Language Usage

Project Health

  • Last commit4 hours ago
  • Open issues291
  • Latest releasev1.17.0

Recent Commits

  • Anand Hegde(14 Oct 26)

    feat(player): add Up Next queue for Play next (#2505) * feat(player): add Up Next queue for Play next Play next now adds songs to an Up Next section that sits directly after the current song, in the order they were added. Songs leave Up Next when they start playing, shuffle and replacing the queue keep it next, and playing another song moves it after that song. The play queue labels the section. A new "Up next queue" setting (on by default) restores the previous Play next behavior when turned off. Closes #1595 * fix(player): keep album group column working with queue sections getRowItem returned undefined for every row when group headers were present and no getItem accessor was used, which is the play queue's setup, so the album group column — the one column that renders purely from getRowItem — went blank as soon as the Up Next sections were shown. Fall back to the expanded row model like the no-groups branch. Also resolve the album group header's play index through the row id instead of the display row index, which no longer matches the data index when group header rows are interleaved. * style(player): restyle queue section rows Paint full-width surface bands on group header rows (including across pinned columns), style the section label/count row, and label the tail section Queue instead of the removed Next from queue string * fix(player): correct auto-follow scroll with queue group rows Map data index to row index accounting for inserted group header rows, so scrollToIndex no longer lands on a group header or the wrong row when Up Next sections are present. Defer the follow scroll a tick so it applies to the updated queue row model instead of the stale pre-change layout, which caused the viewport to jump down, back up, and down again on track change * fix(player): keep queue drops above the up next block Bottom-edge drops in the first Queue section pull items into Up Next, or reflow them under the block after regroup. Items dropped there stay pinned above the block; regroup and sync preserve the gap. Boundary check shared by desktop and remote reorder paths. --------- Co-authored-by: jeffvli <[email protected]>

  • Matt Van Horn(14 Oct 26)

    fix: initialize new playlists as private (#2540) Fixes #2534 Co-authored-by: Matt Van Horn <[email protected]>

  • Alicia Sykes(14 Oct 26)

    chore: disable analytics by default in docker-compose (#2610)

  • Hosted Weblate(11 Oct 26)

    Translated using Weblate Currently translated at 85.3% (1256 of 1471 strings) (German) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/ Co-authored-by: Achim Walz <[email protected]>

  • Hosted Weblate(05 Oct 26)

    Translated using Weblate Currently translated at 99.8% (1469 of 1471 strings) (Estonian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/et/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Chinese (Traditional Han script)) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/zh_Hant/ Translated using Weblate Currently translated at 83.2% (1224 of 1471 strings) (German) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/ Translated using Weblate Currently translated at 83.2% (1224 of 1471 strings) (German) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/de/ Translated using Weblate Currently translated at 98.7% (1453 of 1471 strings) (French) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Spanish) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Spanish) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/ Co-authored-by: Fordas <[email protected]> Co-authored-by: KosmoMoustache <[email protected]> Co-authored-by: York <[email protected]> Co-authored-by: kek w <[email protected]> Co-authored-by: rimasx <[email protected]> Co-authored-by: rvf1-k <[email protected]> Co-authored-by: vahrina <[email protected]>

  • Hosted Weblate(03 Oct 26)

    Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Indonesian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/id/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Czech) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/cs/ Co-authored-by: Arif Budiman <[email protected]> Co-authored-by: Fjuro <[email protected]>

  • NekoPaw(02 Oct 26)

    Keep favorite badges visible over loaded artwork (#2545) * fix(library): keep favorite badge above artwork

  • jeffvli(02 Oct 26)

    refactor(player): replace seekToTimestamp state with seek event (#2570)

  • Hosted Weblate(01 Oct 26)

    Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Ukrainian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/uk/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Catalan) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ca/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Polish) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/ Translated using Weblate Currently translated at 100.0% (1471 of 1471 strings) (Spanish) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/es/ Co-authored-by: Fordas <[email protected]> Co-authored-by: Gerard Gascón <[email protected]> Co-authored-by: Viktor Varvaruk <[email protected]> Co-authored-by: skajmer <[email protected]>

  • jeffvli(30 Sept 26)

    fix: error due to originalYear domain type change to nullable

  • jeffvli(30 Sept 26)

    feat(api): re-add fallback dates to Navidrome normalization (#2509)

  • jeffvli(30 Sept 26)

    docs: add additional AI disclosures in CONTRIBUTING.md

  • Hosted Weblate(30 Sept 26)

    Translated using Weblate Currently translated at 100.0% (1469 of 1469 strings) (Polish) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/pl/ Co-authored-by: Michał <[email protected]>

  • jayse(30 Sept 26)

    fix(player): reset fullscreen title scroll state per track (#2529) The scroll-mode title could render blank (particularly for short titles): overflow was measured once per title with no re-check after webfonts settled, and a previous title's scroll position/animation could persist into the next one. Remount the scroll track per title, snap back to origin plus cancel animations when the title fits, and re-check overflow once webfonts are ready. The scroll viewport now also spans the full available width (centered when the title fits) so the overflow measurement is well-defined in every alignment. Fixes jeffvli/feishin#2485 Co-authored-by: janviernine <[email protected]>

  • Andrew Herron(30 Sept 26)

    Audiobook support (#2462) * feat(player): support Jellyfin player position item property to resume playback When an item is resumable, Jellyfin returns an `item.UserData.PlaybackPositionTicks` property. Map this to a new `resumePositionMs` song property and seek to it when playback begins. * feat(player): report playback position for Jellyfin resumable media Jellyfin persists the resume position from progress and stop reports for item types that are resumable (e.g. AudioBook). Progress is reported every 10 seconds, and the stop scrobble is sent. The stop is sent before the new track's start because Jellyfin clears the session's now-playing item on any stop report. * feat(library): extend Jellyfin library type support to allow audiobooks

  • Dyredhead(30 Sept 26)

    feat(ui): show playlist icons in collapsed sidebar (#2512) * feat(ui): show playlist icons in collapsed sidebar When the sidebar playlist list setting is on, the collapsed sidebar now lists playlist images with a name tooltip, the same context menu and drag/drop, and an accent ring on the currently playing playlist. A header links to the playlists page, toggles the list, and creates a playlist. The expanded sidebar gets a divider above its playlist section. Owned/shared list logic is shared in useSidebarPlaylistItems instead of being duplicated per section. * feat(ui): add hover play overlay to collapsed sidebar playlists Hovering a collapsed sidebar playlist icon scales it up and shows a play button styled like the table image column. The button follows the play button behavior setting, has the shared play tooltip, and holding it shuffles. The name tooltip opens without delay and icons request the table image size. * fix(ui): pad collapsed sidebar playlists header like nav items Long translations of the header label overflowed the collapsed sidebar.

  • jeffvli(29 Sept 26)

    fix(library): keep album group image size local The album group size input bumped general.imageRes.table whenever the entered size was >= the current table resolution, silently rewriting a global setting that affects every table.

  • Gerard Gascón(29 Sept 26)

    fix: do not call butternchurn visualizer cleanup on playback resume (#2518)

  • Anand Hegde(29 Sept 26)

    fix: use lowercase macos for the default window bar style (#2507) getFrame() returned 'macOS' while the renderer's Platform.MACOS is 'macos'. On a fresh macOS profile the settings sync saw a difference five seconds after launch and showed the restart-required toast; dismissing it restarted the app, often in the middle of adding a server.

  • Hosted Weblate(29 Sept 26)

    Translated using Weblate Currently translated at 98.2% (1444 of 1469 strings) (French) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/ Co-authored-by: KosmoMoustache <[email protected]>

  • Hosted Weblate(27 Sept 26)

    Translated using Weblate Currently translated at 100.0% (1469 of 1469 strings) (Ukrainian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/uk/ Co-authored-by: Viktor Varvaruk <[email protected]>

  • Hosted Weblate(24 Sept 26)

    Translated using Weblate Currently translated at 99.7% (1465 of 1469 strings) (Russian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/ Translated using Weblate Currently translated at 98.2% (1443 of 1469 strings) (French) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/ Co-authored-by: Artyom Rybakov <[email protected]> Co-authored-by: KosmoMoustache <[email protected]>

  • Hosted Weblate(23 Sept 26)

    Translated using Weblate Currently translated at 99.7% (1465 of 1469 strings) (Russian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/ Translated using Weblate Currently translated at 95.5% (1403 of 1469 strings) (French) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/fr/ Co-authored-by: Artyom Rybakov <[email protected]> Co-authored-by: KosmoMoustache <[email protected]>

  • Xela(22 Sept 26)

    fix(visualizer): capture stereo in system loopback (#2495) Chromium getDisplayMedia defaults to mono with voice processing on. Explicitly request 2 channels and disable AGC, echo, and noise filters.

  • strecke(22 Sept 26)

    fix(library): keep favorite songs mounted when empty (#2493) Prevent unmounting Favorite Songs when switching to an empty source (e.g. switching between favorites and ratings with 0 tracks). - Query favorites and ratings in parallel when capabilities allow - Only unmount when neither source has tracks - Display centered empty state string when active source has no tracks - Hide "View all" header button when there are no songs

  • Hosted Weblate(22 Sept 26)

    Translated using Weblate Currently translated at 98.1% (1442 of 1469 strings) (Russian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/ Translated using Weblate Currently translated at 98.1% (1442 of 1469 strings) (Russian) Translation: feishin/Translation Translate-URL: https://hosted.weblate.org/projects/feishin/translation/ru/ Co-authored-by: Artyom Rybakov <[email protected]> Co-authored-by: DanisimoR <[email protected]>

  • strecke(22 Sept 26)

    fix(library): keep top songs mounted when empty (#2488) Prevent unmounting Top Songs when switching to personal with 0 plays, which previously destroyed the toggle and locked the user out. - Query community and personal top songs in parallel - Only unmount when both sources return no tracks - Display centered empty state string when active source has no tracks - Hide "View all" header button when there are no songs

  • Paul(22 Sept 26)

    fix: show logout button when SERVER_LOCK=true (#2487)

  • Gabriele Mancini(22 Sept 26)

    fix(player): ignore drag release on playerbar fullscreen toggle (#2486)

  • Atirna(22 Sept 26)

    fix(api): preserve Jellyfin single album songs (#2422)

Feishin Reviews

More Music Players

⚠️ This section is still a work in progress ⚠️
Check back soon, or help us complete it by submiting a pull request on GitHub.
Or submit an entry here

About the Data: Feishin

Change History

Edit Feishin Data

You can edit Feishin's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

Origin Data

Modify Data

API

You can access Feishin's data programmatically via our API. Simply make a GET request to:

https://api.awesome-privacy.xyz/v1/services/feishin

The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.

Share Feishin

Help your friends compare Music Players, and pick privacy-respecting software and services.
Share Feishin and Awesome Privacy with your network!