Code Monkey home page Code Monkey logo

navidrome / navidrome Goto Github PK

View Code? Open in Web Editor NEW
10.0K 76.0 773.0 41.35 MB

๐ŸŽงโ˜๏ธ Modern Music Server and Streamer compatible with Subsonic/Airsonic

Home Page: https://www.navidrome.org

License: GNU General Public License v3.0

Go 72.04% Shell 0.25% Makefile 0.48% JavaScript 26.41% HTML 0.21% CSS 0.02% Dockerfile 0.06% C++ 0.48% C 0.04%
music subsonic-server subsonic music-server airsonic streaming-audio streaming-api madsonic streamer self-hosted

navidrome's Introduction

Navidrome logo

Navidrome Music Server ย Tweet

Last Release Build Downloads Docker Pulls Dev Chat Subreddit Contributor Covenant

Navidrome is an open source web-based music collection server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device. It's like your personal Spotify!

Note: The master branch may be in an unstable or even broken state during development. Please use releases instead of the master branch in order to get a stable set of binaries.

Any feedback is welcome! If you need/want a new feature, find a bug or think of any way to improve Navidrome, please file a GitHub issue or join the discussion in our Subreddit. If you want to contribute to the project in any other way (ui/backend dev, translations, themes), please join the chat in our Discord server.

Installation

See instructions on the project's website

Cloud Hosting

PikaPods has partnered with us to offer you an officially supported, cloud-hosted solution. A share of the revenue helps fund the development of Navidrome at no additional cost for you.

PikaPods

Features

  • Handles very large music collections
  • Streams virtually any audio format available
  • Reads and uses all your beautifully curated metadata
  • Great support for compilations (Various Artists albums) and box sets (multi-disc albums)
  • Multi-user, each user has their own play counts, playlists, favourites, etc...
  • Very low resource usage
  • Multi-platform, runs on macOS, Linux and Windows. Docker images are also provided
  • Ready to use binaries for all major platforms, including Raspberry Pi
  • Automatically monitors your library for changes, importing new files and reloading new metadata
  • Themeable, modern and responsive Web interface based on Material UI
  • Compatible with all Subsonic/Madsonic/Airsonic clients
  • Transcoding on the fly. Can be set per user/player. Opus encoding is supported
  • Translated to various languages

Documentation

All documentation can be found in the project's website: https://www.navidrome.org/docs. Here are some useful direct links:

Screenshots

navidrome's People

Contributors

aldrinjenson avatar alekseylobanov avatar armedev avatar caiocotts avatar certuna avatar christophernewton avatar crazygolem avatar deluan avatar dependabot-preview[bot] avatar dependabot[bot] avatar deuill avatar dnouv avatar ericgaspar avatar jvoisin avatar k-kumar-01 avatar kgarner7 avatar mill1000 avatar neilchauhan2 avatar nelyah avatar orlea avatar ritikpandey1 avatar rochakjain361 avatar rsammelson avatar samarsault avatar srichter avatar sumnerevans avatar vs49688 avatar whorfin avatar william-lohan avatar yashjipkate avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

navidrome's Issues

Last.FM Integration

  • scrobble
  • getArtistInfo2
  • getTopSongs
  • getSimilarSongs
  • getAlbumInfo

There should be a way to disable the integration, for those users concerned with privacy.

Prebuilt Raspberry Pi Docker images

I know this is already on the roadmap, but I wanted a way to vote for it, so I created this issue :)

As far as I'm concerned, either a binary or a Docker image that works on Raspberry Pi (Raspbian Buster) would be great!

Playlist management + import / export

Hello! First of all, thanks for your work! Looks very promising.

Actually using Airsonic.

I wanted to ask if it will be possible to have a playlist management (i saw smart / dynamic playlists on the road map) but i'd like to be able to manage standarf m3u / m3u8 playlists with the ability to import - export them as mine are very precious to me :-)


Added by @deluan to track progress:

Tasks:

  • Add playlist REST endpoint
  • Create/Delete playlists
  • Browse/Play/Add to Queue playlists
  • Remove tracks
  • Edit playlist details (Name, Comment, Public)
  • Reorder tracks
  • Import M3U/PLS files
  • Export to M3U files
  • One-way sync of imported playlists
  • View as albums, artists, songs. Similar to iTunes Will be implemented as part of a larger overhaul of the UI

OGG suport

Hi,
I think navidrome not support ogg files. All my album on ogg are name [Unknown Album] and i can't listen it

And navidrome can't get metadata from ogg

"Stay Signed in"

Add an option in the login window to keep the session valid for 1 week of inactivity

Artists view is not working with Music Stash (Android client)

Music Stash is using an API that was introduced in API version 1.11.0 (I think) to get artist info (getArtistInfo2) when browsing by artist and choosing an artist to view. Navidrome returns a 404 for getArtistInfo2 and getTopSongs.

I know Music Stash is not necessarily the only client being targeted, and that Navidrome is advertised as using API version 1.8.0, so if this is just a known "won't fix", then please close this ticket.

[Feature Request]: Smart Playlist based on skip to play ratio.

This project sounds amazing!

If we could get smart playlists based on the skip to play ratio, we had a perfect dynamic playlist, that adjusts to our momentary listening Habits.

Lets say i have 6 root playlists :

Pacing: calm, active, neutral
Style: acoustic, electronic, mixed

All my music is sorted into these lists.

Now i do a smart list from calm and acoustic, which is dynamically updating by the skip to play ratio. Then songs with a ratio of < 1 will be played more often and songs with a ratio of > 1 will be played less.

If some one can recommend any other client based server, where this is possible please let me know.

Compilation tracks not included in Artist view

image

This album is a V/A compilation. When I filter on the artist though:
http://localhost:4533/app#/album?filter={%22artist_id%22:%22cd4187b19abbcad3526c0e87460c19c8%22}&order=ASC&sort=year
I see only the regular albums of the artist:

image

The compilation tracks are not included, indicating that the filter only works on Album Artists, not Artists. Should probably be fixable with a WHERE EXISTS in the underlying sql query, so both Album Artist and Artist fields are included (and possibly in the future, fields like Composer, Arranger, Producer, etc too)

[WebUI] display year range for albums with tracks from different years

Many compilation albums (both multi-artist and single-artist) have songs from different years on them. So you tag them with their individual years, and that year will be used in searches, filters, smart playlists etc. That's the theory.

Navidrome does store individual years per track in its DB, but in the album view only shows the highest number. This can be fixed by not having a single Year attribute for an album, but two fields (query of the max and min of the track years) and for the UI a simple embedded if-query to display either the range ("1976-1989") or a single year.

Binary doesn't start if `./music` and/or `./data` are not created

Just built from master and starting ./navidrone yields

[ORM]2020/01/26 16:09:24 register db Ping `default`, unable to open database file: no such file or directory
panic: register db Ping `default`, unable to open database file: no such file or directory

just creating the data dir fixes it, but I wonder if it shouldn't be created automatically.

A similar error a second or two later if ./music doesn't exist:

ERRO[0002] Error importing MediaFolder                   error="open ./music: no such file or directory" folder=./music

adding it to the README could also be a possible resolution, but at least the first one should probably be a better error message, maybe after creating the dir?

Otherwise I can report that building with go 1.13 / nodejs 13.3 on FreeBSD 11.3 works flawlessly.

DB locking issues

So I'm using a custom web UI that supports subsonic API servers. My client mimics the classic iTunes UI so to populate the library I have to make a lot of API requests to retrieve all information. It looks like every time a Subsonic API endpoint is hit, you're updating the DB with 'last access time'. I'm not sure if this is the only issue, but a good portion of the API calls I'm making are failing due to this locking issue. (Some are also 'Invalid login' messages, but not sure if that's related or something else).

If you want to test it out, here's the docker command to run my client. My library is pretty massive (over 80k songs) so this issue may only be a problem on larger libraries.

version: '3'
services:
  qooxtunes:
    container_name: qooxtunes
    image: alexphillips/qooxtunes
    ports:
      - 80:80
      - 443:443

Add a preference to disable external lookups

With LastFM integration ( #18 ) right around the corner, it would be nice to have a preference to disable external lookups: I'm not at ease with that my music player leaking information to third parties :/

Problems with spaces in folder names in the media library

Had a folder called ./music/Band Name/Album Name (2008) with some MP3s (also with spaces) in them.

First I got

ERRO[0002] Error importing MediaFolder                   error="open music/music/: no such file or directory" folder=./music
ERRO[0002] Errors while scanning media. Please check the logs              
ERRO[0002] Error scanning media folder                   error="errors while scanning media" folder=./music

then I renamed Band Name to Band_Name and I got

ERRO[0002] Error importing MediaFolder                   error="open music/music/Band_Name: no such file or directory" folder=./music
ERRO[0002] Errors while scanning media. Please check the logs              
ERRO[0002] Error scanning media folder                   error="errors while scanning media" folder=./music

if I just copy one of the files to ./music/test.mp3 this is found.

This is FreeBSD, but I can't imagine the folder reading to be really different than on Linux.

Simplify first login process

My initial idea is that the first time you run the app, it will always redirect you to the /user/create page and won't let you navigate to anything else while you don't create an admin user.

[Unknown Artist/Album] when brackets present in filepath

A majority of the entries in the Albums and Songs view show up as [Unknown Artist] and [Unknown Album] for me. I think I've narrowed it down to the bracket characters [] being present in the filepath. I organize folders like "Artist/[Date] Album/#. Title.ext." The only items that show up correctly in these views seem to be the stragglers that I haven't yet cleaned up naming scheme on.

Interestingly, in most cases the top level of the Artists view is fine, even if every song by a particular artist has a bracket in the filepath (i.e. the album artists seem to be picked up from the tags). Same story as before if I click on an artist though.

navidrome-error

Implement Multi-user

Also allow Annotations (Starred, Rating, LastPlayed, PlayCounts, etc..) per user

Add support for themes in the web interface

As @deluan said:

Because Navidrome uses Material-UI, it is just a matter of generating a new theme (a json file) and using it.

It would be nice to document this somewhere, to enable people to create/share themes, maybe done via generators like this one.

Years not showing up for many albums

It looks like parsing the year for some of my music is failing. I think I've tracked it down to the use of TDRC vs TYER tags. I use beets to manage my music collection, and pull metadata from MusicBrainz. beets (and other MusicBrainz based taggers, I think) will use the TDRC tag for release date rather than the TYER tag (which is just the year). ffmpeg then reports the date metadata output using the TDRC field, which can be a date string rather than a simple integer year.

It looks like the format in TDRC can be: yyyy, yyyy-mm, or yyyy-mm-dd. Lots of taggers that use MusicBrainz will use TDRC rather than the separate TDAT, TIME, TRDA, and TYER. The fact that TDRC also incorporates the TIME tag means it might be possible to find one with a time stamp added as well, but I've never run across one yet.

Reimplement persistence with Storm/bbolt

  • Implement repositories
    • Artist
    • Album
    • MediaFile
    • Property
    • Index
    • NowPlaying
    • Playlist
    • Checksums
  • Add transactions
  • Remover LedisDB Repositories (or rewrite it?)
  • Refactor interfaces
    • GetStarred
    • Optional QueryParams

m4b support

Is m4b support planned? I added my audiobook library but Navidrome doesn't seem to recognize m4b files.

Reimplement Playlists

Now that we don't interact with iTunes anymore, playlists must be maintained in the DB

Large library issues

In my test library for this I have 152k songs just a hair over 4tb. After about 40-43k songs processed it starts to noticeably slow down processing. I think the spawning of ffmpeg is taking its toll maybe as the gap between spawns is growing. its been running for about 5hrs and at 78k processed so far db size is 75mb. after I do this i will turn on trace and rescan again. i wanted to let this run its course for science ! heh

I havent looked at the db etc for structure or indexes (I am a db guy in real life) so ill have a peak at queries after its done too. staying about 130-138mb mem usage during processing according to ps in the docker. If you like ill just use this to keep a running list regarding initial load

Create distributables

Need to embed ffmpeg and ui bundle. Also document build steps for various platforms

Packaged versions should be generated in the pipeline, for the following platforms:

  • MacOS
  • Linux
  • Windows
  • Docker

Base url option?

Hi there, i tested navidrome and really love it, simple light weight and awesome addition to my home server setup.

I have one suggestion / issue

The ability to add a base url to navidrome so it can be accessed at a sub directory

I.e. myawesomedomain.com/music

I did attempt this with nginx but this failed to work (as a work around i grabbed a free subdomain from my provider to go to music.myawesomedomain.com) however i would love to have it as a /music

I can post the nginx config i used if needed but im sure its down it a call back to root instead of a base url.

This was running on a Pi4 b 4Gb ram with nginx 1.17.6

Thanks and great work

Web UI

Implement a simple UI, using React-Admin with the following features:

  • Manage users
  • Simple Library Browsing
  • Music Player
  • Manage Playlists
  • Configuration
  • Rescan (with scan status indicator) - covered by #130
  • Simple Statistics (Dashboard) - maybe later

Some clients aren't getting cover art while browsing by folder

I've tried a couple of Android subsonic clients (D-Sub and Music Stash so far), and D-Sub will show cover art where Music Stash doesn't. Looking at Navidrome logs, it looks like D-Sub is making separate getCoverArt calls where Music Stash does not... both are calling getAlbumList2. When connecting to AirSonic, both clients get cover art.

I've tried digging into the Subsonic API schema to see where the disconnect is but I'm unable to find it. I can try to provide logs if that will help as long as I know what I'm looking for.

Web-player idle timeout settings

While the web player in Navidrome is very simple it fits my needs perfectly. The only issue I have with it is if I have to pause for a while when I come back and press play I'm automatically logged out which is just a bit annoying.

Understandably this is a security feature, but would love it if there was a way to disable or increase this timeout to prevent this from happening.

Add genre navigation

It would be really cool to be able to browse by genres in a Subsonic client (I use play:sub) and in the web interface.

Is this planned soon?

Unable to create Admin account

I spun up the docker and upon going to http://localhost:4533 or the URI I set up, I am not prompted to create an admin account. My yml is below and a screenshot of the page.

Screen Shot 2020-01-26 at 10 41 00 AM


services:
  navidrome:
    image: deluan/navidrome
    container_name: navidrome
    restart: always
    environment:
      ND_MUSICFOLDER: /music
      ND_DBPATH: /data/navidrome.db
      ND_SCANINTERVAL: 1m
      ND_LOGLEVEL: info
      ND_PORT: 4533
    ports:
      - 4533:4533
    volumes:
      - ${USERDIR}/assets/navidrome:/data
      - /mnt/media/music:/music
    networks:
      - traefik
    labels:
      - "traefik.enable=true"
      ## HTTP Routers
      - "traefik.http.routers.navidrome-rtr.entrypoints=https"
      - "traefik.http.routers.navidrome-rtr.rule=Host(`navidrome.${DOMAINNAME}`)"
      - "traefik.http.routers.navidrome-rtr.tls=true"
      - "traefik.http.routers.navidrome-rtr.tls.certresolver=dns-cloudflare"
      ## Middlewares
      - "traefik.http.routers.navidrome-rtr.middlewares=noauth-chain@file"
      ## HTTP Services
      - "traefik.http.routers.navidrome-rtr.service=navidrome-svc"
      - "traefik.http.services.navidrome-svc.loadbalancer.server.port=4533"

networks:
  traefik:
    name: traefik
    external: true```

Suport Subsonic API calls with POST instead of GET

That's how some clients talk to the Subsonic API. Ex: play:Sub

Example request:

curl -v -X POST -H 'Content-Type: application/x-www-form-urlencoded' 'http://localhost:4533/rest/ping.view' --data 'c=client&v=1.8.0&f=json&u=user&p=password'

panic: runtime error: invalid memory address or nil pointer dereference

Version affected: v0.4.1 (22d57a7)

Description:
Running navidrome with docker-compose with log level DEBUG and scan music folder mounted with goofys

$ docker-compose logs -f navidrome
navidrome_1              | panic: runtime error: invalid memory address or nil pointer dereference
navidrome_1              | [signal SIGSEGV: segmentation violation code=0x1 addr=0x38 pc=0x922c97]
navidrome_1              | 
navidrome_1              | goroutine 11 [running]:
navidrome_1              | github.com/deluan/navidrome/scanner.(*Metadata).Size(...)
navidrome_1              | 	/src/scanner/metadata_ffmpeg.go:43
navidrome_1              | github.com/deluan/navidrome/scanner.(*TagScanner).toMediaFile(0xc00017e6f0, 0xc000285bc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
navidrome_1              | 	/src/scanner/tag_scanner.go:245 +0x487
navidrome_1              | github.com/deluan/navidrome/scanner.(*TagScanner).loadTracks(0xc00017e6f0, 0xc00040ac80, 0x40, 0x1937c38, 0x0, 0x0, 0x0, 0x0)
navidrome_1              | 	/src/scanner/tag_scanner.go:216 +0x125
navidrome_1              | github.com/deluan/navidrome/scanner.(*TagScanner).processChangedDir(0xc00017e6f0, 0x0, 0x0, 0xc00040ac80, 0x40, 0xc00031f8c0, 0xc00031f800, 0x0, 0x0)
navidrome_1              | 	/src/scanner/tag_scanner.go:154 +0x351
navidrome_1              | github.com/deluan/navidrome/scanner.(*TagScanner).Scan(0xc00017e6f0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc00003e5e8)
navidrome_1              | 	/src/scanner/tag_scanner.go:61 +0x3ab
navidrome_1              | github.com/deluan/navidrome/scanner.(*Scanner).Rescan(0xc000186e00, 0xc00002404f, 0x6, 0xc000001b00, 0x0, 0x1)
navidrome_1              | 	/src/scanner/scanner.go:37 +0x18e
navidrome_1              | github.com/deluan/navidrome/scanner.(*Scanner).RescanAll(0xc000186e00, 0x0, 0x5, 0xc00003e7a8)
navidrome_1              | 	/src/scanner/scanner.go:50 +0xcf
navidrome_1              | github.com/deluan/navidrome/server.(*Server).initScanner.func1(0xc000186ea0, 0x34630b8a000)
navidrome_1              | 	/src/server/server.go:79 +0x5a
navidrome_1              | created by github.com/deluan/navidrome/server.(*Server).initScanner
navidrome_1              | 	/src/server/server.go:76 +0x172

No config file created automatically on Windows

So I would really want to submit a proper issue text here, but this issue is fairly small. There is currently no way to configure the windows binary at all, as the software does not automatically create a config file (navidrome.toml) in where the changes should be made, so I hope you can fix this.

Best Regards, -Loke

Make the 'Sort' tags searchable

Musicbrainz uses the sort fields (specifically the 'Sort Artist' and the 'Sort Album Artist' fields) to store romanised versions of the content in the 'Artist' and the 'Album Artist' fields respectively for records that use non-Latin scripts. Making these fields searchable would immensely help in navigating media that do not have romanised data in any of the main tags.

Putting the UI search aside, piping them to work with the Subsonic API might require merging the sort fields with their non-sorted counterparts as the Subsonic API does not have separate fields for the sort tags. A possible implementation can be found in a modified fork of Airsonic, named Jpsonic which specifically caters to this issue.

The Musicbrainz styling guideline, however uses the field in a last_name, first_name format for individual artists. The field is used as-is compared to its non-sort counterpart if it's an alias or a band name. Articles are handled differently as well (The Strokes would become Strokes, The). The complete styling guideline can be found here. Regardless of these factors, the comma is always the delimiter; and so it might be a possible idea to tokenise and flip the tokens based on the position of the comma, check if the resultant is the same as the non-sort counterpart, and append to the sanitised string only if it's different, which would almost certainly be the case for non-Latin tags.

Listing the fields that should be searchable:

  • Sort Album Artist
  • Sort Artist
  • Sort Album
  • Sort Title

Scanning not done on full library

Just spun this up in docker and it automatically started scanning. It finished but only made into the 'B's. Hitting refresh on the UI doesn't seem to kick off a new scan. If it does, then it finishes almost immediately with no new files.

Compilations get incorrectly sorted in Album view

image

Compilation albums seem to get inserted into the Album list (sort by Artist) according to the first track artist on that compilation.

Compilation albums should either get their own category in the Library tree on the left (preferred way to handle them I think), or get sorted in the Album list either first before A or last after Z (preference #2), or least ideal, under the "V" for Various Artists.

[WebUI] display multiple genres for album

The navidrome db stores Genre for individual tracks. Many albums have songs from different genres on them. In the Album view, the navidrome UI only displays one genre, even if the album has tracks with different genres tagged (note: not multiple genres per track, just a different genre for each track). The UI should display it as a list, for example "Pop, Disco, House, Hip-Hop".

Makefile: check_go_env problem

I was just trying to build this on a new vm and I noticed that

check_go_env:
        @(test -n "${GOPATH}" && hash go) || (echo "\nERROR: GO environment not setup properly!\n"; exit 1)

could be a bit problematic. I've not done a lot of go for 2 years, but the docs currently say

Create your workspace directory, $HOME/go. (If you'd like to use a different directory, you will need to set the GOPATH environment variable.)

But even if I put the checkout in this correct folder, this will fail if you don't set GOPATH, but this shouldn't be needed when it's in exactly this folder?

Add support for forcing a complete re-scan

It would be nice to be able to force navidrome to rescan the music folder, while ignoring the timestamps.

Bonus point if this is made accessible to admin users via a button in the web interface.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.