Git Product home page Git Product logo

bonob's Introduction

bonob

A sonos SMAPI implementation to allow registering sources of music with sonos.

Support for Subsonic API clones (tested against Navidrome and Gonic).

Build

Features

  • Integrates with Subsonic API clones (Navidrome, Gonic)
  • Browse by Artist, Albums, Random, Favourites, Top Rated, Playlist, Genres, Years, Recently Added Albums, Recently Played Albums, Most Played Albums
  • Artist & Album Art
  • View Related Artists via Artist -> '...' -> Menu -> Related Arists
  • Now playing & Track Scrobbling
  • Search by Album, Artist, Track
  • Playlist editing through sonos app.
  • Marking of songs as favourites and with ratings through the sonos app.
  • Localization (only en-US, da-DK, nl-NL & fr-FR supported currently, require translations for other languages). Sonos localization and supported languages
  • Auto discovery of sonos devices
  • Discovery of sonos devices using seed IP address
  • Auto registration with sonos on start
  • Multiple registrations within a single household.
  • Transcoding within subsonic clone
  • Custom players by mime type, allowing custom transcoding rules for different file types

Running

bonob is packaged as an OCI image to both the docker hub registry and github registry.

ie.

docker pull docker.io/simojenki/bonob

or

docker pull ghcr.io/simojenki/bonob
tag description
latest Latest release, intended to be stable
master Lastest build from master, probably works, however is currently under test
vX.Y.Z Fixed release versions from tags, for those that want to pin to a specific release

Full sonos device auto-discovery and auto-registration using docker --network host

docker run \
    -e BNB_SONOS_AUTO_REGISTER=true \
    -e BNB_SONOS_DEVICE_DISCOVERY=true \
    -p 4534:4534 \
    --network host \
    simojenki/bonob

Now open http://localhost:4534 in your browser, you should see sonos devices, and service configuration. Bonob will auto-register itself with your sonos system on startup.

Full sonos device auto-discovery and auto-registration on custom port by using a sonos seed device, without requiring docker host networking

docker run \
    -e BNB_PORT=3000 \
    -e BNB_SONOS_SEED_HOST=192.168.1.123 \
    -e BNB_SONOS_AUTO_REGISTER=true \
    -e BNB_SONOS_DEVICE_DISCOVERY=true \
    -p 3000:3000 \
    simojenki/bonob

Bonob will now auto-register itself with sonos on startup, updating the registration if the configuration has changed. Bonob should show up in the "Services" list on http://localhost:3000

Running bonob on a different network to your sonos devices

Running bonob outside of your lan will require registering your bonob install with your sonos devices from within your LAN.

If you are using bonob over the Internet, you do this at your own risk and should use TLS.

Start bonob outside the LAN with sonos discovery & registration disabled as they are meaningless in this case, ie.

docker run \
    -e BNB_PORT=4534 \
    -e BNB_SONOS_SERVICE_NAME=MyAwesomeMusic \
    -e BNB_SECRET=changeme \
    -e BNB_URL=https://my-server.example.com/bonob \
    -e BNB_SONOS_AUTO_REGISTER=false \
    -e BNB_SONOS_DEVICE_DISCOVERY=false \
    -e BNB_SUBSONIC_URL=https://my-navidrome-service.com:4533 \
    -p 4534:4534 \
    simojenki/bonob

Now within the LAN that contains the sonos devices run bonob the registration process.

Using auto-discovery

docker run \
    --rm \
    --network host \
    simojenki/bonob register https://my-server.example.com/bonob

Using a seed host

docker run \
    --rm \
    -e BNB_SONOS_SEED_HOST=192.168.1.163 \
    simojenki/bonob register https://my-server.example.com/bonob

Running bonob and navidrome using docker-compose

version: "3"
services:
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1000 # should be owner of volumes
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      # Optional: put your config options customization here. Examples:
      ND_SCANSCHEDULE: 1h
      ND_LOGLEVEL: info  
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
    volumes:
      - "/tmp/navidrome/data:/data"
      - "/tmp/navidrome/music:/music:ro"
  bonob:
    image: simojenki/bonob:latest
    user: 1000:1000 # should be owner of volumes
    ports:
      - "4534:4534"
    restart: unless-stopped
    environment:
      BNB_PORT: 4534
      # ip address of your machine running bonob
      BNB_URL: http://192.168.1.111:4534  
      BNB_SECRET: changeme
      BNB_SONOS_AUTO_REGISTER: "true"
      BNB_SONOS_DEVICE_DISCOVERY: "true"
      BNB_SONOS_SERVICE_ID: 246
      # ip address of one of your sonos devices
      BNB_SONOS_SEED_HOST: 192.168.1.121
      BNB_SUBSONIC_URL: http://navidrome:4533

Running bonob on synology

See this issue

Configuration

item default value description
BNB_PORT 4534 Default http port for bonob to listen on
BNB_URL http://$(hostname):4534 URL (including path) for bonob so that sonos devices can communicate. This must be either the public IP or DNS entry of the bonob instance so that the sonos devices can communicate with it.
BNB_SECRET bonob secret used for encrypting credentials
BNB_AUTH_TIMEOUT 1h Timeout for the sonos auth token, described in the format ms, ie. '5s' == 5 seconds, '11h' == 11 hours. In the case of using Navidrome this should be less than the value for ND_SESSIONTIMEOUT
BNB_LOG_LEVEL info Log level. One of ['debug', 'info', 'warn', 'error']
BNB_SERVER_LOG_REQUESTS false Whether or not to log http requests
BNB_SONOS_AUTO_REGISTER false Whether or not to try and auto-register on startup
BNB_SONOS_DEVICE_DISCOVERY true Enable/Disable sonos device discovery entirely. Setting this to 'false' will disable sonos device search, regardless of whether a seed host is specified.
BNB_SONOS_SEED_HOST undefined sonos device seed host for discovery, or ommitted for for auto-discovery
BNB_SONOS_SERVICE_NAME bonob service name for sonos
BNB_SONOS_SERVICE_ID 246 service id for sonos
BNB_SUBSONIC_URL http://$(hostname):4533 URL for subsonic clone
BNB_SUBSONIC_CUSTOM_CLIENTS undefined Comma delimeted mime types for custom subsonic clients when streaming.

Must specify the source mime type and optionally the transcoded mime type.

For example;

If you want to simply re-encode some flacs, then you could specify just "audio/flac".

However;

if your subsonic server will transcode the track then you need to specify the resulting mime type, ie. "audio/flac>audio/mp3"

If you want to specify many something like; "audio/flac>audio/mp3,audio/ogg" would use client = 'bonob+audio/flac' for flacs, and 'bonob+audio/ogg' for oggs.

Disclaimer: Getting this configuration wrong will cause sonos to refuse to play your music, by all means experiment, however know that this may well break your setup.

BNB_SUBSONIC_ARTIST_IMAGE_CACHE undefined Path for caching of artist images that are sourced externally. ie. Navidrome provides spotify URLs. Remember to provide a volume-mapping for Docker, when enabling this cache.
BNB_SCROBBLE_TRACKS true Whether to scrobble the playing of a track if it has been played for >30s
BNB_REPORT_NOW_PLAYING true Whether to report a track as now playing
BNB_ICON_FOREGROUND_COLOR undefined Icon foreground color in sonos app, must be a valid svg color
BNB_ICON_BACKGROUND_COLOR undefined Icon background color in sonos app, must be a valid svg color
TZ UTC Your timezone from the tz database ie. 'Australia/Melbourne'

Initialising service within sonos app

  • Configure bonob, make sure to set BNB_URL. bonob must be accessible from your sonos devices on BNB_URL, otherwise it will fail to initialise within the sonos app, so make sure you test this in your browser by putting BNB_URL in the address bar and seeing the bonob information page
  • Start bonob
  • Open sonos app on your device
  • Settings -> Services & Voice -> + Add a Service
  • Select your Music Service, default name is 'bonob', can be overriden with configuration BNB_SONOS_SERVICE_NAME
  • Press 'Add to Sonos' -> 'Linking sonos with bonob' -> Authorize
  • Your device should open a browser and you should now see a login screen, enter your subsonic clone credentials
  • You should get 'Login successful!'
  • Go back into the sonos app and complete the process
  • You should now be able to play music on your sonos devices from you subsonic clone
  • Within the subsonic clone a new player will be created, 'bonob (username)', so you can configure transcoding specifically for sonos

Re-registering your bonob service with sonos App

Generally speaking you will not need to do this very often. However on occassion bonob will change the implementation of the authentication between sonos and bonob, which will require a re-registration. Your sonos app will complain about not being able to browse the service, to re-register execute the following steps (taken from the iOS app);

  • Open the sonos app
  • Settings -> Services & Voice
  • Your bonob service, will likely have name of either 'bonob' or $BNB_SONOS_SERVICE_NAME
  • Reauthorize Account
  • Authorize
  • Enter credentials, you should see 'Login Successful!'
  • Done

Service should now be registered and everything should work as expected.

Multiple registrations within a single household.

It's possible to register multiple Subsonic clone users for the bonob service in Sonos. Basically this consist of repeating the Sonos app "Add a service" steps for each additional user. Afterwards the Sonos app displays a dropdown underneath the service, allowing to switch between users.

Implementing a different music source other than a subsonic clone

  • Implement the MusicService/MusicLibrary interface
  • Startup bonob with your new implementation.

Transcoding

Transcode everything

The simplest transcoding solution is to simply change the player ('bonob') in your subsonic server to transcode all content to something sonos supports (ie. mp3 & flac)

Audio file type specific transcoding

Disclaimer: The following configuration is more complicated, and if you get the configuration wrong sonos will refuse to play your content.

In some situations you may wish to have different 'Players' within your Subsonic server so that you can configure different transcoding options depending on the file type. For example if you have flacs with a mixture of frequency formats where not all are supported by sonos See issue #52 & Sonos supported audio formats

In this case you could set;

# This is equivalent to setting BNB_SUBSONIC_CUSTOM_CLIENTS="audio/flac>audio/flac"
BNB_SUBSONIC_CUSTOM_CLIENTS="audio/flac"

This would result in 2 players in Navidrome, one called 'bonob', the other called 'bonob+audio/flac'. You could then configure a custom flac transcoder in Navidrome that re-samples the flacs to a sonos supported format, ie Using something like this or this:

ffmpeg -i %s -af aformat=sample_fmts=s16|s32:sample_rates=8000|11025|16000|22050|24000|32000|44100|48000 -f flac -

Note for Sonos S1: 24-bit depth is only supported by Sonos S2, so if your system is still on Sonos S1, transcoding should convert all FLACs to 16-bit:

ffmpeg -i %s -af aformat=sample_fmts=s16:sample_rates=8000|11025|16000|22050|24000|32000|44100|48000 -f flac -

Alternatively perhaps you have some aac (audio/mpeg) files that will not play in sonos (ie. voice recordings from an iPhone), however you do not want to transcode all everything, just those audio/mpeg files. Let's say you want to transcode them to mp3s, you could set the following;

BNB_SUBSONIC_CUSTOM_CLIENTS="audio/mpeg>audio/mp3"

And then configure the 'bonob+audio/mpeg' player in your subsonic server.

Changing Icon colors

-e BNB_ICON_FOREGROUND_COLOR=white \
-e BNB_ICON_BACKGROUND_COLOR=darkgrey

White & Dark Grey

-e BNB_ICON_FOREGROUND_COLOR=chartreuse \
-e BNB_ICON_BACKGROUND_COLOR=fuchsia

Chartreuse & Fuchsia

-e BNB_ICON_FOREGROUND_COLOR=lime \
-e BNB_ICON_BACKGROUND_COLOR=aliceblue

Lime & Alice Blue

-e 'BNB_ICON_FOREGROUND_COLOR=#1db954' \
-e 'BNB_ICON_BACKGROUND_COLOR=#121212'

Spotify-ish

Credits

bonob's People

Contributors

bjw-s avatar dependabot[bot] avatar dhalem avatar dlehammer avatar jnth avatar laurentlbm avatar maziara avatar simojenki 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

bonob's Issues

Docker-compose error even with demo?

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.bonob.environment.BNB_SONOS_AUTO_REGISTER contains true, which is an invalid type, it should be a string, number, or a null

  BNB_SONOS_AUTO_REGISTER: true
  BNB_SONOS_DEVICE_DISCOVERY: true

Now true to my eyes looks like a string... and it is as provided too...

Bonob crash during playback

Hi,

The Bonob container just restarted with this error in the log:

image

Synology is exporting the logs from new to old, so... at the bottom you can see the start of the error ;)

Do you have any idea what could have caused this?

Use with Airsonic-Advanced

Hi @simojenki

Thanks for creating this!

Do you have any plans to make it work with Airsonic-Advanced? The current state of Gonic and Navidrome do not meet my needs.

I tried the using bonob and airsonic-advanced and get the attached errors.

errors.txt

The docker-compose file is:

version: "3"
services:
  bonob:
    image: simojenki/bonob:latest
    container_name: bonob
    restart: unless-stopped
    network_mode: "host"
    user: 1000:1000 # should be owner of volumes
    ports:
      - "4534:4534"
    environment:
      BNB_PORT: 4534
      # ip address of your machine running bonob
      BNB_URL: http://10.168.0.123:4534
      BNB_SECRET: "changeme"
      BNB_SONOS_AUTO_REGISTER: "true"
      BNB_SONOS_DEVICE_DISCOVERY: "true"
      BNB_SONOS_SERVICE_ID: 246
      BNB_SUBSONIC_URL: http://10.168.0.123:4040
      # ip address of one of your sonos devices
      #BNB_SONOS_SEED_HOST: 192.168.1.121

Unable to authenticate with local service

Thank you for this software, excited to get it running.
Using a Docker container with full Sonos device auto-discovery and auto-registration on port 3000 and using one of my speakers as a seed device, I successfully register the bonob service.

The first time I selected it, it asked for authentication. I thought this is the local Sonos authentication account.
I entered that and it gave me a network error - I cannot get back to the screen to re-enter credentials (whatever they may be).
"Try again" brings me back to the screen. "Not now" clears closes the window.

Despite restarting and resetting the BONOB services as different containers, and settings, selection of the service always gives me the Error screen.

image

Synology - unable to login in Sonos for Navidrome

Hi all,

I 've installed Navidrome on my Synology NAS, it's OK, it's working fine.
I've installed Bonob, I can show user interface on 4534 port, I can show bonob in Sonos Service list...
but when I click on Bonob, Sonos say me "a problem occurred during startup, please check your network connection".
No web page open, I can't login in Navidrome.

Can you help me ?

BNB_SONOS_DEVICE_DISCOVERY = true
BNB_SONOS_AUTO_REGISTER = true
BNB_SONOS_SEED_HOST = 192.168.0.41
BNB_SUBSONIC_URL = http://192.168.0.20:4533
BNB_PORT = 4534

macOS binary

for people running their music servers on Macs, would you consider providing a macOS binary?

problem starting up

This isn't a bug report or anything, just having issues installing and running bonob. I'm using the docker-compose setup file from the readme. I can login to and play music from navidrome. When I go to try to pull up bonob in the browser, it doesn't connect. I'm running on a raspberry pi 4.

Docker ps shows things like

simojenki/bonob:latest    "docker-entrypoint.s…"   7 minutes ago   Restarting (132) 29 seconds ago.

Looking at the docker log I just see a bunch of entries that say

Node.js[1]: ../src/util.cc:188:double node::GetCurrentTimeInMicroseconds(): Assertion `(0) == (uv_gettimeofday(&tv))' failed.`

Seems like bonob is having issues starting up? I don't know much about docker, so there's that too.

docker-compose file for bonob looks like this:

bonob:
    image: simojenki/bonob:latest
    user: 1000:1000 # should be owner of volumes
    ports:
      - "4534:4534"
    restart: unless-stopped
    environment:
      BNB_PORT: 4534
      # ip address of your machine running bonob
      BNB_URL: http://10.0.1.2:4534  
      BNB_SECRET: changeme
      BNB_SONOS_AUTO_REGISTER: "true"
      BNB_SONOS_DEVICE_DISCOVERY: "true"
      BNB_SONOS_SERVICE_ID: 246
      # ip address of one of your sonos devices
      BNB_SONOS_SEED_HOST: 10.0.1.52
      BNB_SUBSONIC_URL: http://navidrome:4533

Any ideas?

Delete services from Sonos devices

Hi,

I've just discovered bonob after finding Navidrome.
This both of them looks like a great replacement for the SMB share option of Sonos.

Compliments for how this works together nicely!

After looking at this docs I have 1 small question... How do I remove the "bonob music service" from my Sonos devices?
I can delete the login, but after that I'm still seeing in the services list. The list found here:
Settings -> Services & Voice -> + Add a Service

Am I overseeing this option? Is it done automatically, or...?

Oh... And... Is is possible to add an icon to the service? That just looks better in the services list :)

Thank you for the reaction and keep up the nice work!

triggerUncaughtException when playing a song

Hi,

Any idea what happend here?

today at 15:00:59{"message":"deb6dd82-0439-43e3-9a28-b6566ab4e7be bnb<- GET /stream/track/86a822a20a6be6b5e2820bb739e9b084?{}, headers={\"connection\":\"close\",\"host\":\"192.168.11.250:4534\",\"range\":\"bytes=589824-\",\"accept\":\"*/*\",\"user-agent\":\"Linux UPnP/1.0 Sonos/68.2-28040 (ZPS18)\",\"bnbt\":\"*****\",\"bnbk\":\"*****\",\"x-sonos-swgen\":\"2\",\"x-sonos-firmware\":\"68.2-28040\",\"x-sonos-muse-api\":\"1.28.0\",\"x-sonos-id-hash\":\"OKPuPQxyhJN8Dj25ghOZpZ6idO0pG2N2YA09bWKLpj4=\"}","level":"info","service":"bonob","timestamp":"2022-05-04 15:00:59"}
today at 15:00:59node:internal/process/promises:279
today at 15:00:59            triggerUncaughtException(err, true /* fromPromise */);
today at 15:00:59            ^
today at 15:00:59
today at 15:00:59[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "Subsonic failed with: Error: read ECONNRESET".] {
today at 15:00:59  code: 'ERR_UNHANDLED_REJECTION'
today at 15:00:59}
today at 15:01:10{"message":"Starting bonob with config {\"port\":4534,\"bonobUrl\":{\"url\":\"http://192.168.11.250:4534/\"},\"secret\":\"*******\",\"authTimeout\":\"1h\",\"icons\":{\"foregroundColor\":\"white\",\"backgroundColor\":\"darkgrey\"},\"sonos\":{\"serviceName\":\"musicbox\",\"discovery\":{\"enabled\":true},\"autoRegister\":false,\"sid\":246},\"subsonic\":{\"url\":\"http://172.17.0.1:4533\"},\"scrobbleTracks\":true,\"reportNowPlaying\":true}","level":"info","service":"bonob","timestamp":"2022-05-04 15:01:10"}

My NAS reported a container "stop", the song ended and after that... Sonos didn't continue to the next song.
At the navidrome site I'm not seeing an error.

After bonob started I played the song another time and this time it continued with the next one :)

Oh... this was the first time I've seen this behavior!


Bonob version: 0.6.2
Navidrome version: 0.47.5

Bonos container stops right after starting

I've had Bonos running great since this was first posted but in the last week or so the container started crashing and will not restart. I've tried killing and recreating but still get the same issue. Next step is to remove everything and start from scratch, but I figured I'd check if there's an easy fix.

de:internal/fs/utils:343,
    throw err;,
    ^,
,
Error: ENOENT: no such file or directory, open '/web/icons/navidrome-artists.svg',
    at Object.openSync (node:fs:582:3),
    at Object.readFileSync (node:fs:450:35),
    at icon (/bonob/server.js:47:6),
    at Object.<anonymous> (/bonob/server.js:50:21),
    at Module._compile (node:internal/modules/cjs/loader:1101:14),
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10),
    at Module.load (node:internal/modules/cjs/loader:981:32),
    at Function.Module._load (node:internal/modules/cjs/loader:822:12),
    at Module.require (node:internal/modules/cjs/loader:1005:19),
    at require (node:internal/modules/cjs/helpers:94:18) {,�
  errno: -2,,
  syscall: 'open',,
  code: 'ENOENT',,
  path: '/web/icons/navidrome-artists.svg',
},

Internal server error with "browse by this artist"

Hi,

Do you have any idea why I get an internal server error in bonob when I choose "browse by this artist"? I'm not having the official English translation for this, but you can access the "page" in the Sonos iOS App by:

  • Go to album
  • Press ...
  • Choose "more"
  • Choose "browse by this artist"
  • Sonos App is giving the error that I can't browse the music

The following is happening in the bonob logs:


{"message":{"level":"info","data":"Trying SonosSoap from path /Test/TestService.php"},"level":"info","service":"bonob","timestamp":"2021-09-06 21:25:09"}

{"message":"Fetching metadata type=054778610ba1de6f0c973a4571dc3fe4, typeId=undefined, acceptLanguage=nl-NL, en-US;q=0.9","level":"debug","service":"bonob","timestamp":"2021-09-06 21:25:09"}

{"message":{"level":"debug","data":"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"  xmlns:tns=\"http://www.sonos.com/Services/1.1\"><soap:Body><soap:Fault><soap:Code><soap:Value>SOAP-ENV:Server</soap:Value><soap:Subcode><soap:value>InternalServerError</soap:value></soap:Subcode></soap:Code><soap:Reason><soap:Text>Unsupported getMetadata id=054778610ba1de6f0c973a4571dc3fe4</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>"},"level":"debug","service":"bonob","timestamp":"2021-09-06 21:25:09"}

I'm using the master at the moment, the one with the new icons ;)

Scrobbling issues

Hey @simojenki, I'm finally adding Last.fm scrobbling to Navidrome, and now that I took a deeper look on how bonob is scrobbling, I'm seeing some issues:

  1. It is sending duplicated scrobbles. Every song I play in Sonos causes bonob to call /rest/scrobble twice. Maybe you meant to call one time as a "now playing" call? If that is the case, the "now playing" call should not pass submission=true as argument

  2. It would be better to send the scrobble (submission=true) after the song is playing for a while, as documented here: https://www.last.fm/api/scrobbling#when-is-a-scrobble-a-scrobble I understand that this may not be feasible, as you don't have control on when the Sonos player is actually playing the song, so this is just a "nice to have"

  3. It would be good to have an option to disable scrobbling altogether, as Sonos itself has support for it.

  4. Something we may not have control over: All scrobbles are sent to the same account in Last.fm. Do you think we could come up with way to identify the Navidrome user and pass different URLs (with different user/token) to the Sonos player?

Anyway, thanks again for this nice piece of software!

Folder view

First and foremost - thank you for bonob! I have a big audio collection and navidrome+bonob feels quite right for me. My collection is organized alphabetically - in folders by names of an artist while tagging is not always good. That is why I really need folder view. Is it possible to get anyhow?

Translations

Hi,

I just did another "dive" into bonob.
When looking at the "catalog" under bonob under the music icon in the Sonos app I have English and Dutch items mixed.
Is it possible to translate, for example, the "Starred" category in the list?

Or... is this linked to the Navidrome language settings? In case it is I don't understand the mix of English and Dutch.

Just asking so life can be easier for family members when I'm doing playing/testing.

Thanks for the reaction.

EHOSTUNREACH

Hello
I'm using this configuration

version: '3.3'
services:
    bonob:
        network_mode: host
        environment:
            - BNB_PORT=4534
            - BNB_URL=http://<local machine>:4534  
            - BNB_SECRET=<secret>
            - BNB_SONOS_SERVICE_ID=246
            - BNB_SONOS_SEED_HOST=<sonos ip>
            - BNB_SUBSONIC_URL=<navidrome url>
        ports:
            - '4534:4534'
        image: simojenki/bonob

(Ive also tried without network_mod:host)

Unfortunately I always seem to get problems contacting the sonos device. I've use console on the box and for some reason it can't curl to the sonos (even though I can from my machine outside of docker)

bonob-bonob-1  | {"message":"Starting bonob with config {\"port\":4534,\"bonobUrl\":{\"url\":\"http://<sonos IP>:4534/\"},\"secret\":\"*******\",\"authTimeout\":\"1h\",\"icons\":{},\"sonos\":{\"serviceName\":\"bonob\",\"discovery\":{\"enabled\":true,\"seedHost\":\"<sonos IP>\"},\"autoRegister\":false,\"sid\":246},\"subsonic\":{\"url\":\"<navidrome url>\"},\"scrobbleTracks\":true,\"reportNowPlaying\":true}","level":"info","service":"bonob","timestamp":"2022-10-15 11:58:21"}
bonob-bonob-1  | {"message":"Trying to discover sonos devices using seed <sonos IP>","level":"info","service":"bonob","timestamp":"2022-10-15 11:58:21"}
bonob-bonob-1  | {"message":"Listening on 4534 available @ http://<sonos IP>:4534/","level":"info","service":"bonob","timestamp":"2022-10-15 11:58:22"}
bonob-bonob-1  | {"service":"bonob","cause":{"message":"request to http://<sonos IP>:1400/ZoneGroupTopology/Control failed, reason: connect EHOSTUNREACH <sonos IP>:1400","type":"system","errno":"EHOSTUNREACH","code":"EHOSTUNREACH"},"level":"error","message":"Failed looking for sonos devices","timestamp":"2022-10-15 11:58:25"}

No playlists available in bonob

Hello, thanks for your work on this project. I have Navidrome set up and bonob is added to my Sonos app as a service. I can play all available music without issue, but my 20+ playlists do not appear in Sonos. These playlists are available on the Navidrome web interface as well as the DSub app. I tried removing bonob and reauthorizing it, hoping to refresh the playlists, but this was unsuccessful. Any thoughts?

Deployment error

Hello @simojenki!

I really want to enjoy your interesting solution on my Sonos system, but when I try to deploy that as a stack on Portainer 2.11.0, running on a host OS DietPi on RPI4 (4GB RAM) with Docker + Portainer, I am getting the following error in Portainer:

Deployment error
failed to deploy a stack: services.bonob.environment.BNB_SONOS_AUTO_REGISTER must be a string, number or null

Here is the docker compose file/stack that I am using:

version: "3"
services:
  navidrome:
    image: deluan/navidrome:latest
    user: 1000:1000 #should be owner of volumes
    ports:
      - "8091:4533"
    restart: unless-stopped
    environment:
      # Optional: put your config options customization here. Examples:
      ND_SCANSCHEDULE: 4h
      ND_LOGLEVEL: info  
      ND_SESSIONTIMEOUT: 24h
      ND_BASEURL: ""
    volumes:
      - "/mnt/sd200gb/appdata/navidrome:/data"
      - "/mnt/storage/music:/music:ro"
  bonob:
    image: simojenki/bonob:latest
    user: 1000:1000 #should be owner of volumes
    ports:
      - "4534:4534"
    restart: unless-stopped
    environment:
      BNB_PORT: 4534
      # ip address of your machine running bonob
      BNB_URL: http://10.0.0.4:4534
      BNB_SECRET: changeme
      BNB_SONOS_AUTO_REGISTER: true
      BNB_SONOS_DEVICE_DISCOVERY: true
      BNB_SONOS_SERVICE_ID: 246
      # ip address of one of your sonos devices
      BNB_SONOS_SEED_HOST: 10.0.0.81
      BNB_SUBSONIC_URL: http://navidrome:4533

I can't understand how "true" is not considered as string.
Your help is very much appreciated!
Many thanks in advance!

Wrong name when connecting to service

Hi,

When you use a custom name for bonob you will still see bonob as the name of the service when you're connecting with Sonos.

This probably says it all:

IMG_4134

On other screens I see "musicbox", as expected.

Strange uri when not using network host (use docker container id instead of IP)

Starting Bonob with Docker

$ sudo docker run -d  --name=bonob   \
                -e BONOB_SONOS_SERVICE_NAME=navidrome \
                -e BONOB_SONOS_AUTO_REGISTER=true  \
                -e BONOB_WEB_ADRESS=http://192.168.1.23:4534 \
                -e BONOB_SONOS_SEED_HOST=192.168.1.5 \
                -e BONOB_NAVIDROME_URL=http://192.168.1.23 \
                -p 4534:4534 \
                simojenki/bonob

e6176817ca2a5062952de977f26f4fa9ff88dc0bbf13e889fed98a8f01c58d7c

What i see in web interface (192.168.1.23:4534)

{"name":"navidrome","sid":246,"uri":"http://e6176817ca2a:4534/ws/sonos","secureUri":"http://e6176817ca2a:4534/ws/sonos","strings":{"uri":"http://e6176817ca2a:4534/sonos/strings.xml","version":"18"},"presentation":{"uri":"http://e6176817ca2a:4534/sonos/presentationMap.xml","version":"18"},"pollInterval":1200,"authType":"AppLink"}

ARM support

Any chance of publishing Docker image for ARM?

Would be helpful for folks trying to run a Navidrome/gonic + bonob setup from a Raspberry Pi. 😉

Error: getaddrinfo EAI_AGAIN

Hi,

Since this morning I'm the Sonos app isn't getting data from bonob...
I've tried to register the Sonos app to bonob, but when I do that I get the error:
Error: getaddrinfo EAI_AGAIN

This is happening with the master and the latest.

Nothing has changed since yesterday... Do you have any idea where to look for a solution?

This is the error in the bonob logs:

{"message":{"level":"debug","data":"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"  xmlns:tns=\"http://www.sonos.com/Services/1.1\"><soap:Body><soap:Fault><soap:Code><soap:Value>SOAP-ENV:Server</soap:Value><soap:Subcode><soap:value>InternalServerError</soap:value></soap:Subcode></soap:Code><soap:Reason><soap:Text>Error: getaddrinfo EAI_AGAIN nas***********</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>"},"level":"debug","service":"bonob","timestamp":"2021-09-09 07:47:48"}

There is a second bonob account in the Sonos App, that can't show albums either, but it does display the main menu. I assume that is coming from bonob also.

As soon as I'm trying to get albums I m'n not getting anything, but I do get this in the logs:


{"message":{"level":"info","data":"Handling POST on /ws/sonos"},"level":"info","service":"bonob","timestamp":"2021-09-09 07:58:46"}

{"message":{"level":"debug","data":"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><credentials xmlns=\"http://www.sonos.com/Services/1.1\"><loginToken><token>***********</token><householdId>Sonos_4CK********************lR</householdId></loginToken><deviceId>78-*******:E</deviceId><deviceProvider>Sonos</deviceProvider></credentials></s:Header><s:Body><getMetadata xmlns=\"http://www.sonos.com/Services/1.1\"><id>albums</id><index>0</index><count>100</count></getMetadata></s:Body></s:Envelope>"},"level":"debug","service":"bonob","timestamp":"2021-09-09 07:58:46"}

{"message":{"level":"info","data":"Attempting to bind to /ws/sonos"},"level":"info","service":"bonob","timestamp":"2021-09-09 07:58:46"}

{"message":{"level":"info","data":"Trying SonosSoap from path /Test/TestService.php"},"level":"info","service":"bonob","timestamp":"2021-09-09 07:58:46"}

{"message":"Fetching metadata type=albums, typeId=undefined, acceptLanguage=nl-NL, en-US;q=0.9","level":"debug","service":"bonob","timestamp":"2021-09-09 07:58:46"}

{"message":{"level":"debug","data":"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"  xmlns:tns=\"http://www.sonos.com/Services/1.1\"><soap:Body><soap:Fault><soap:Code><soap:Value>SOAP-ENV:Server</soap:Value><soap:Subcode><soap:value>InternalServerError</soap:value></soap:Subcode></soap:Code><soap:Reason><soap:Text>Error: getaddrinfo EAI_AGAIN nas***********</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>"},"level":"debug","service":"bonob","timestamp":"2021-09-09 07:58:51"}

::ffff:192.168.11.20 - - [09/Sep/2021:05:58:51 +0000] "POST /ws/sonos HTTP/1.1" 500 - "-" "Linux UPnP/1.0 Sonos/64.3-20120 (ICRU_iPhone12,1)"

Thanks!

Error with setup on Synology NAS

Hi,
I've been trying for a while to get this up and running. I read through one of the other comments related to Synology NAS and followed the instructions in there and I FINALLY started making progress.

I'm able to get to the point where I add the service through the Sonos app and it asks me to authorize my navidrome server.
When logging in with my navidrome credentials, I get the following error:

Login failed!

Subsonic failed with:
Error:
getaddrinfo ENOTFOUND simojenki-bonob1

I'm fairly novice when it comes to using Docker, so it's been a challenge. If someone can steer me in the direction to resolve this, I'd be thrilled.

thank you!

Entire system freezes while reproducing music through bonob

I installed bonob on a raspberry pi 4 through a docker container (arm64). It has been working fine for several months but today it is second time in a period of around 2-3 weeks that it crashes. While I am reproducing music from my sonos app, I get at some point an error message in the app while I am scrolling through my library saying that this sons cannot be reproduced or something similar. The error starts to appear many times as a notification in the sonos app. At the same time, the raspberry pi freezes. So much that I cannot access heedlessly through ssh. I have to connect it to a monitor and then use the keyboard to login to the terminal. Even logging in takes around 10 min and the first thing I do is a "sudo reboot" to avoid the cold unplugging/re-plugging the power. Do you know what could be the issue? It is difficult to see any logs since, as described before, the system freezes entirely.

"Top rated" menu option missing

Hi,

I think bonob is missing the "Top rated" menu option in the overview.
Now there is "Starred" (favorieten in Dutch), it is matching the favorites option in Navidrome.
I would expect that "Starred" is doing something with the "stars" in Navidrome and not the "hearts".

Should it not be better to:

  • Match the "Starred" on the "Top rated" overview in Navidrome
  • Add a "Favorites" option to bonob and match that to the "Favorites" in bonob?

And when you ask me... I would order the Favorites based on Album title and not, as done in Navidrome, based on picking/heart click order.

I case you agree I can provide the translations and a additional icon. You will need a "star" for the "Top rated" entry, the favorites icon is already created :)

Icon for each "folder"

Hi,

Now all the "folders" like artists, albums, playlists, etc. have the same folder like icon.
Is it possible to given them their own icons/image?

For "started" (/favorites) I would expect a, commonly used, start icon, etc., etc.
I came up with the thought after seeing the icons in the music library of the sonos app.

No idea if this is an option, but it would be nice to have a dedicated item for each option.
In that way you can navigation on icons without reading all the text :)

Feature Request: Starred Songs

Unless I’m mistaken, the current menu option will only show starred albums, not songs. This might be an issue with the subsonic api, but could you add an option to just show starred songs (or play all starred albums)?

Observations on performance of rating interface

The rating interface works better than I had imagined.
Thank you!
I have some performance observations to share, that might influence future work.
In my environment, from the Sonos Controller it takes a few seconds between when I press the star, and the rating is updated on the controller. It seems like there is quite a bit of latency somewhere.

This is in contrast to the Sonos Widget on Android, which seems to update the rating immediately, and the rating operation feels much more interactive.

I cannot account for the differences in behavior between the sonos controller, and the sonos widget, but they are worth noting.

Someday, I'm going to figure out how to host a node app for development, and then I'll be able to give you much better diagnostic information.

"Now Playing" is set to previous song

I just noticed that the "Now Playing" request (/rest/scrobble?submission=false) is sent at the beginning of a new song, but using the id of the previous one, causing this:

Screen Shot 2021-10-14 at 10 46 42 AM

I can confirm in the logs that it is sending the Now Playing after the real Scrobble, and both with the same id (the id of the song that just finished playing)

No genres in Sonos Controller on Mac and in App

When I go to genres on the Sonos Controller on a Mac the list stays empty...

The request according to the log:

{"message":"Fetching metadata type=genres, typeId=undefined, acceptLanguage=nl-NL, en-US;q=0.9","level":"debug","service":"bonob","timestamp":"2021-08-28 08:30:00"}

The response according to the log:

{"message":{"level":"debug","data":"<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"  xmlns:tns=\"http://www.sonos.com/Services/1.1\"><soap:Body><soap:Fault><soap:Code><soap:Value>SOAP-ENV:Server</soap:Value><soap:Subcode><soap:value>InternalServerError</soap:value></soap:Subcode></soap:Code><soap:Reason><soap:Text>TypeError: Cannot read property &apos;map&apos; of undefined</soap:Text></soap:Reason></soap:Fault></soap:Body></soap:Envelope>"},"level":"debug","service":"bonob","timestamp":"2021-08-28 08:30:00"}

I have this issue on the "master" in combination with:

    -e BONOB_ICON_FONT_COLOR=red \
    -e BONOB_ICON_FONT_FAMILY=Arial \

Question about basic usage on how to play music continuously

I managed to set up bonob (on a raspberry pi thanks to the developer and using navidrome as subsonic interface) however I only have one last issue that maybe it is just me I don't get it right. Most of my tracks are single tracks taken from an album, so it happens that for instance when I go to play a song from the folder "Recently added" or "Random" I would like that all the songs from that folder are played automatically but instead only one song is played and then there is no possibility to go to the next one unless I manually select it and click play. As I understand, this happens because bonob only plays the song of the album. If that album had 2 tracks, then the next track would be played and no more.

I attach a screenshot of what I mean to hopefully be more clear. Down below there is the "Most played" folder.

Screenshot_20211225-172113

I would like to have the possibility to reproduce all the tracks in this folder (and maybe choose if I want them shuffled and/or repeated), while at the moment it seems I can only click on the specific album and then only the tracks of that album are streamed.

Play music from bonob through new assistant "Hey Sonos"

Sonos recently released their new voice assistant "Hey Sonos". Do you know if there is a way to configure this functionality to work with bonob? Unfortunately, it seems that it is not compatible by looking at one of the settings screen:

Screenshot_20220630-182510

Feature Request: Sonos Rating interface

I've always wanted to be able to rate songs in the sonos controller.
The sonos interface supports it. I'd love to learn what it takes to turn this feature on and help out the project by trying to add the rating interface to this.

Any thoughts on this?

Thanks.

Bonob via Docker on Synology NAS issue

Hi,
I seem to have an issue here with Bonob not finding my Sonos device.
This is the message I'm getting when launching Bonob:

bonob (246) Expected config {"name":"bonob","sid":246,"uri":"http://simojenki-bonob1:4534/ws/sonos","secureUri":"http://simojenki-bonob1:4534/ws/sonos","strings":{"uri":"http://simojenki-bonob1:4534/sonos/strings.xml","version":"18"},"presentation":{"uri":"http://simojenki-bonob1:4534/sonos/presentationMap.xml","version":"18"},"pollInterval":1200,"authType":"AppLink"} No existing service registration Re-register Devices Services 0

Screenshot: https://www.screenpresso.com/=T4BZb

My settings are:

NAS and Sonos connected to the same network.
Bonob has been installed via the official Docker image. Bnob using custom Ports:
Local: 4000
Container Port: 4534

voice integrations

Hello!
I love this project and the integration is fantastic,
however I know spouse approval will 100% ride on voice integration with either sonos or alexa,
any chance this is on the roadmap?

Docker commands not working and no error/log output

Hi there, I was trying out bonob to connect to my navidrome instance, and I'm running the following:

$ docker run -e BNB_SONOS_AUTO_REGISTER=true -e BNB_SONOS_DEVICE_DISCOVERY=true -p 3000:3000 -e BNB_PORT=3000 -e BNB_SONOS_SEED_HOST=<my sonos device IP> simojenki/bonob

When I run that command, I get zero output, so I'm not even sure where to start debugging... I tried the same command with a few other tags (v0.6.0 and v0.5.0) and get the same result. I've confirmed I can run $ docker run hello-world and get the expected response, so I don't think it's an issue with my Docker. Any thoughts?

Looking at the output of docker container list --all, it looks like they're exiting with exit code 132:

CONTAINER ID   IMAGE                    COMMAND                  CREATED              STATUS                            PORTS     NAMES
3f58a3e1ecd0   simojenki/bonob          "docker-entrypoint.s…"   13 seconds ago       Exited (132) 10 seconds ago                 suspicious_yalow
2e73651cba24   simojenki/bonob:v0.5.0   "docker-entrypoint.s…"   About a minute ago   Exited (132) About a minute ago             quirky_ride
16cde7e80c99   simojenki/bonob          "docker-entrypoint.s…"   5 minutes ago        Exited (132) 5 minutes ago                  lucid_edison
e06e7307b4ef   hello-world              "/hello"                 5 minutes ago        Exited (0) 5 minutes ago                    gallant_sammet

Albums are sorted by artists, not by album title

Hi,

Is it me, or is the sorting of the album incorrect?
When you request the list the albums are sorted by artist and under the artist by album...
I would expect everything be sorted by album title when I choose "album", just as it is done in Navidrome.

It this something that can be changed?
It feels like a (strong word) bug, but I have no idea if it is a limitation by Sonos, Navidrome or by design...?

transcoding to mp3 gives the song is not encoded correctly errors

Hi,
using default mp3 audio settings for navidrome transcoding results in no songs being able to play because of an encoding error from sonos. Encoded songs play fine in other players and if I turn off transcoding the portion of my collection that is flac and mp3 in a supported bitrate play fine through bonob to my sonos system.

Looking at the logs I get output in navidrome for both transcoding and non transcoding bonob requests ie:
transcoding:
time="2021-09-11T15:27:18Z" level=info msg="Streaming file" artist="Charles Bradley" bitRate=192 cached=true format=mp3 originalBitRate=865 originalFormat=flac title="Dusty Blue" transcoding=true user=chris

time="2021-09-11T15:27:18Z" level=info msg="Now Playing" artist="Charles Bradley" player="bonob [bonob]" title="Dusty Blue" user=chris

non transcoding:
time="2021-09-11T15:24:49Z" level=info msg="Streaming file" artist="Charles Bradley" bitRate=0 cached=false format=raw originalBitRate=975 originalFormat=flac title="Strictly Reserved for You" transcoding=false user=chris

time="2021-09-11T15:24:49Z" level=info msg="Now Playing" artist="Charles Bradley" player="bonob [bonob]" title="Strictly Reserved for You" user=chris

but log output in bonob only incremements for non transcoding (there's a bunch of tokens in here so I will only clean this up and post it if really needed).

Docker restart with ECONNRESET when getting album?

Hi,

Out of the blue (for me) my bonob container restarted in the logs I have this error:

2021-08-23 09:28:38,stderr,      [Symbol(query)]: [

2021-08-23 09:28:38,stderr,    params: URLSearchParams {

2021-08-23 09:28:38,stderr,"    },
"
2021-08-23 09:28:38,stderr,      'User-Agent': 'bonob'

2021-08-23 09:28:38,stderr,"      Accept: 'application/json, text/plain, */*',
"
2021-08-23 09:28:38,stderr,    headers: {

2021-08-23 09:28:38,stderr,"    method: 'get',
"
2021-08-23 09:28:38,stderr,"    url: 'http://nas:4533/rest/getAlbum',
"
2021-08-23 09:28:38,stderr,  config: {

2021-08-23 09:28:38,stderr,"  syscall: 'read',
"
2021-08-23 09:28:38,stderr,"  code: 'ECONNRESET',
"
2021-08-23 09:28:38,stderr,"  errno: -104,
"
2021-08-23 09:28:38,stderr,    at TCP.onStreamRead (node:internal/stream_base_commons:211:20) {

2021-08-23 09:28:38,stderr,<ref *1> Error: read ECONNRESET

2021-08-23 09:28:38,stderr,

2021-08-23 09:28:38,stderr,          ^

2021-08-23 09:28:38,stderr,"          triggerUncaughtException(err, true /* fromPromise */);
"
2021-08-23 09:28:38,stderr,node:internal/process/promises:246

Any idea what was going one? This was a first for me!
It sounds like an exception that would be nice to be handled or that will try to get the album again?

Oh... bonob is talking with Navidrome version 0.45.0 (and the Navidrome container was up).

I will monitor it an report it when this happens more often.

Unable to play 'Song' access denied

I have Navidrome installed and working in the web UI, bonob is installed and i have it linked to my sonos application. I can browse all my music but when I select one I get an error "Unable to play 'song' access denied" in the Sonos app. Any ideas where I'm going wrong ?

version: "3"
services:
  navidrome:
    image: deluan/navidrome:latest
    container_name: navidrome
    user: 1040:100
    ports:
      - "4533:4533"
    restart: unless-stopped
    environment:
      ND_LOGLEVEL: info  
    volumes:
      - /volume1/music:/music:ro
      - /volume1/docker/navidrome:/data
  bonob:
    image: simojenki/bonob:latest
    container_name: bonob
    user: 1040:100
    ports:
      - "4534:4534"
    restart: unless-stopped
    environment:
      BNB_PORT: 4534
      BNB_URL: http:/192.168.0.100:4534  
      BNB_SECRET: psswrd-is-lik2e-this-aye
      BNB_SONOS_AUTO_REGISTER: "true"
      BNB_SONOS_DEVICE_DISCOVERY: "true"
      BNB_SONOS_SERVICE_ID: 246
      BNB_SONOS_SEED_HOST: 192.168.0.18
      BNB_SUBSONIC_URL: http://192.168.0.100:4533
      TZ: Europe/London

Alphabet navigation

Hi,

Is it possible to add/activate the alphabet navigation? The list of albums is long and the large icons are taking up lots of space.

A alphabet navigation, like this:

navigation

would be (really) welcome. I have no idea if this is supported for services ;)

When that's not the case... Can it be an idea to make it possible to switch from full album covers into a small cover with the album text besides it on smaller screens?

(Sorry for yet another request)

Place Config outside docker container

Hi,
great job so far (missing folder view so far).
Which folder must i map to place the config outside the docker container (i normally re-create my container with the latest image with Portainer).
thanks
K.

Not all albums visible in albums list/overview

Hi,

When you look at the albums overview it stopt after seeing 100 covers.
When you do the same with the SMB connection of the Sonos App you can see all covers, in my case 251.

How can I see all covers in the albums list? It now just stops :(

And I know why I could find an album by scrolling ;)

[Feature Request] Non-Docker version

Is it possible to get a non-docker version of this? The project looks amazing but I don't run a docker environment (LXC install of Navidrome).

An error occurred while adding tracks to the Queue (701)

Hey, thanks for this project! I'm trying to configure it with my hosted instance (not in my local network). I can browse all my collection (awesome!), but I'm getting this error when I try to play any song (tried different formats, but even plain MP3 320 does not work):
Screen Shot 2021-05-09 at 8 09 07 PM

I also tried a Navidrome instance in my local network, reconfigured everything and got the exact same error. And when I try to play the song, no logs are generated.

Any clues?

Not an issue...

Got a Nanopim4 server running navidrome in docker and i got some sonos speakers as well...
But im so sad that your implimentatio of navidrome and sonos don´t run on ARM device..
is it posibel to code it for ARM as well :-) i know a lot of people would be so glad.

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.