123 Commits

Author SHA1 Message Date
Deluan
ce957a29f0
Fix pipeline. 2026-01-02 20:24:14 +00:00
Deluan
a82794581a
Use sync/atomic package, now that we are at Go 1.19 2026-01-02 20:23:40 +00:00
Deluan
6013e30f7b
Make ffmpeg path configurable, also finds it automatically in current folder. Fixes #1932 2026-01-02 20:22:41 +00:00
Deluan
041f91ad53
Add getShares and createShare Subsonic endpoints 2026-01-02 20:21:59 +00:00
Deluan
5916024859
Fix tests and lint errors, plus a bit of refactor 2026-01-02 20:21:59 +00:00
Kendall Garner
3242ae96b7
Get album info (when available) from Last.fm, add getAlbumInfo endpoint (#2061)
* lastfm album.getInfo, getAlbuminfo(2) endpoints

* ... for description and reduce not found log level

* address first comments

* return all images

* Update migration timestamp

* Handle a few edge cases

* Add CoverArtPriority option to retrieve albumart from external sources

* Make agents methods more descriptive

* Use Last.fm name consistently

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:21:18 +00:00
Kendall Garner
2fb60b92ca
ReplayGain support + audio normalization (web player) (#1988)
* ReplayGain support

- extract ReplayGain tags from files, expose via native api
- use metadata to normalize audio in web player

* make pre-push happy

* remove unnecessary prints

* remove another unnecessary print

* add tooltips, see metadata

* address comments, use settings instead

* remove console.log

* use better language for gain modes
2026-01-02 20:21:18 +00:00
Kendall Garner
2cab4a4352
Add Internet Radio support (#2063)
* add internet radio support

* Add dynamic sidebar icon to Radios

* Fix typos

* Make URL suffix consistent

* Fix typo

* address feedback

* Don't need to preload when playing Internet Radios

* Reorder migration, or else it won't be applied

* Make Radio list view responsive

Also added filter by name, removed RadioActions and RadioContextMenu, and added a default radio icon, in case of favicon is not available.

* Simplify StreamField usage

* fix button, hide progress on mobile

* use js styles over index.css

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:21:17 +00:00
Deluan
d4cc09f06c
Remove size from public image ID JWT 2026-01-02 20:21:16 +00:00
Deluan
7179dffbb9
Skip trying to read cover art from mediafile if it does not have one 2026-01-02 20:20:18 +00:00
Deluan
203a0f3657
Fallback extracting tags using ffmpeg 2026-01-02 20:20:18 +00:00
Deluan
b7aefb3719
Load artwork from embedded 2026-01-02 20:20:17 +00:00
gauth-fr
558c669252
Add global Downsampling feature (#1575)
* Add global downsampling feature

* Default to Opus &  consider player transcoder

* Add a test case for DefaultDownsamplingFormat

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:19:50 +00:00
Reo
39de2e6a88
Fix Misleading Error Message on unreadable Media due to Permission (#1873)
* fix(taglib): Fix misleading error message on unreadable media - #1576

Signed-off-by: reo <reo_999@proton.me>

* fix(taglib): Add unit test and exclude scan for only unreadable file - #1576

Signed-off-by: reo <reo_999@proton.me>

* fix(taglib): Add unit test and exclude scan for only unreadable file - #1576

Signed-off-by: reo <reo_999@proton.me>

* fix(taglib): Add unit test and exclude scan for only unreadable file - #1576

Signed-off-by: reo <reo_999@proton.me>

* fix(taglib): Add unit test and exclude scan for only unreadable file - #1576

Signed-off-by: reo <reo_999@proton.me>

* fix(taglib): Add unit test and exclude scan for only unreadable file - #1576

Signed-off-by: reo <reo_999@proton.me>

* Fix test and simplify code a bit

We don't need to expose the type of error: `taglib.Parse()` always return nil

* Fix comment

Signed-off-by: reo <reo_999@proton.me>
Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:18:17 +00:00
Deluan
c4d13acadb
Fix background images when BaseURL is specified 2026-01-02 20:17:48 +00:00
Deluan
f729efebbc
Add nilerr linter 2026-01-02 20:15:58 +00:00
Deluan
2b15f4a4ba
Optimize AlbumRepository.GetAll and add a GetAllWithoutGenres method specifically for Subsonic API, where multiple-genres are not required 2026-01-02 20:09:30 +00:00
Deluan
3ea764141f
Use new rest lib (Update receives all columns that need to be updated) 2026-01-02 20:09:03 +00:00
Steve Richter
310ce67c2e
Listenbrainz scrobbling (#1424)
* Refactor session_keys to its own package

* Adjust play_tracker

- Don't send external NowPlaying/Scrobble for tracks with unknown artist
- Continue to the next agent on error

* Implement ListenBrainz Agent and Auth Router

* Implement frontend for ListenBrainz linking

* Update listenBrainzRequest

- Don't marshal Player to json
- Rename Track to Title

* Return ErrRetryLater on ListenBrainz server errors

* Add tests for listenBrainzAgent

* Add tests for ListenBrainz Client

* Adjust ListenBrainzTokenDialog to handle errors better

* Refactor listenbrainz.formatListen and listenBrainzRequest structs

* Refactor agent auth_routers

* Refactor session_keys to agents package

* Add test for listenBrainzResponse

* Add tests for ListenBrainz auth_router

* Update ListenBrainzTokenDialog and auth_router

* Adjust player scrobble toggle
2026-01-02 20:09:02 +00:00
certuna
1a61f322c0
Rename manifest.json to manifest.webmanifest (#1399)
* Rename manifest.json to manifest.webmanifest

browser consoles keep complaining that the manifest doesn't have the `.webmanifest` extension.

* FIx manifest.webmanifest references

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:08:57 +00:00
caiocotts
f2cf716bcd
Add x-total-count to Subsonic API getAlbumList (#1360)
* Add x-total-count to Subsonic API getAlbumList

* Rename variable

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 20:08:00 +00:00
Deluan
e4bcb90672
Only import playlists from configured paths in option PlaylistsPath. Closes #1181
Syntax is Ant-style Globs, with support for '**' (any subfolder). Default: '.:**' (or '.;**' in Windows`, meaning all folders and subfolders under `MusicFolder`
2026-01-02 20:06:54 +00:00
Deluan
b96344ca93
Some small refactorings 2026-01-02 20:06:13 +00:00
caio
bf706177d0
Support local paths as urls in playlists. 2026-01-02 20:06:11 +00:00
Deluan
6d46689622
Implement Scrobble buffering/retrying 2026-01-02 20:05:07 +00:00
Deluan
6a254c8b67
Pass userId explicitly to UserPropsRepository methods 2026-01-02 20:05:06 +00:00
Deluan
a52a88d1d7
Move user properties (like session keys) to their own table 2026-01-02 20:05:05 +00:00
Deluan
ffd1aa7e89
Refactor: Consolidate scrobbling logic in play_tracker 2026-01-02 20:05:05 +00:00
Deluan
5db24ff145
Send NowPlaying and Scrobbles to Last.fm 2026-01-02 20:05:04 +00:00
Deluan
aa20f7d68e
Implement Last.FM Web authentication flow 2026-01-02 20:05:04 +00:00
Deluan
f468522c72
Implement Last.FM Desktop Auth flow endpoints 2026-01-02 20:05:04 +00:00
Deluan Quintão
5590fa3550
Encrypt passwords in DB (#1187)
* Encode/Encrypt passwords in DB

* Only decrypts passwords if it is necessary

* Add tests for encryption functions
2026-01-02 20:04:16 +00:00
Deluan
969e3a91d2
Make MockRepo names more consistent 2026-01-02 19:32:16 +00:00
Yash Jipkate
3d8ee76b40
Create share table and repository. (#930)
* Add share table and repository

* Add datastore mock

* Try fixing indent

* Try fixing indent - 2

* Try fixing indent - 3

* Implement rest.Repository and rest.Persistance

* Renew date

* Better error handling

* Improve field name

* Fix json name conventionally
2026-01-02 19:31:52 +00:00
Deluan
887ad99e07
Embed Last.FM error responses, making the tests faster 2026-01-02 19:31:51 +00:00
Deluan Quintão
48ca8e3174
Retry calls to Last.FM without MBIDs when if returns artist invalid (#1138)
* Call Last.FM's getInfo again without mbid when artist is not found

* Call Last.FM's getSimilar again without mbid when artist is not found

* Call Last.FM's getTopTracks again without mbid when artist is not found
2026-01-02 19:31:51 +00:00
Steve Richter
4a7bcd4f5f
User management improvements (#1101)
* Show more descriptive success messages for User actions

* Check username uniqueness when creating/updating User

* Adjust translations

* Add tests for `validateUsernameUnique()`

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 19:31:10 +00:00
Brian Schrameck
4264a5c6ef
BPM metadata enhancement (#1087)
* BPM metadata enhancement

Related to #1036.

Adds BPM to the stored metadata about MediaFiles.

Displays BPM in the following locations:
- Listing songs in the song list (desktop, sortable)
- Listing songs in playlists (desktop, sortable)
- Listing songs in albums (desktop)
- Expanding song details

When listing, shows a blank field if no BPM is present. When showing song details, shows a question mark.

Updates test MP3 file to have BPM tag. Updated test to ensure tag is read correctly.

Updated localization files. Most languages just use "BPM" as discovered during research on Wikipedia. However, a couple use some different nomenclature. Spanish uses PPM and Japanese uses M.M.

* Enhances support for BPM metadata extraction

- Supports reading floating point BPM (still storing it as an integer) and FFmpeg as the extractor
- Replaces existing .ogg test file with one that shouldn't fail randomly
- Adds supporting tests for both FFmpeg and TagLib

* Addresses various issues with PR #1087.

- Adds index for BPM. Removes drop column as it's not supported by SQLite (duh).
- Removes localizations for BPM as those will be done in POEditor.
- Moves BPM before Comment in Song Details and removes BPM altogether if it's empty.
- Omits empty BPM in JSON responses, eliminating need for FunctionField.
- Fixes copy/paste error in ffmpeg_test.
2026-01-02 19:26:43 +00:00
Deluan
7a187775e5
Fix create first login 2026-01-02 19:26:42 +00:00
Deluan
2531df5f97
Fix DevAutoCreateAdminPassword 2026-01-02 19:26:42 +00:00
whorfin
35aa640cfe
Improve scanner (#1054)
* Handle subdirectories without rx permission correctly
Allow ogg files w/o metadata, having taglib behave more like ffmpeg

* Fix test for walk_dir_tree, fix full reading of files in permission-
constrained directories, allow directories with leading ellipses

* Sorted directory traversal is preferred, and cleanup tests

* Small refactoring to clean-up `loadDir` function and to remove some "warnings" from IntelliJ

Co-authored-by: Deluan <deluan@navidrome.org>
2026-01-02 19:26:41 +00:00
Deluan
10cf2372f8
Move project to Navidrome GitHub organization 2026-01-02 19:20:16 +00:00
Deluan
5385b950c9
Add support for multi-line tags 2026-01-02 19:19:34 +00:00
Deluan
92ebe8191a
WIP 2026-01-02 19:18:26 +00:00
Deluan
321c2fc4f1
Move mock datastore to tests package 2026-01-02 19:18:25 +00:00
Deluan
743fe03330
Fix ignoring hidden folders when scanning 2026-01-02 19:17:20 +00:00
Deluan
049ac70b2b Add "real" TopSongs 2020-10-20 22:53:52 -04:00
Deluan
e9e09a7480 Add dedicated SimilarArtists call 2020-10-20 16:07:31 -04:00
Deluan
19ead8f7e8 Add initial spotify client implementation 2020-10-20 16:07:31 -04:00
Deluan
eb74dad7cd Add initial last.fm client implementation 2020-10-20 16:07:31 -04:00