diff --git a/package.json b/package.json index 1da9a17..ba4cb24 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "scripts": { "clean": "rm -Rf build", "build": "tsc", - "dev": "BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true BONOB_SONOS_AUTO_REGISTER=false nodemon ./src/app.ts", + "dev": "BONOB_SONOS_SERVICE_NAME=bonobDev BONOB_SONOS_DEVICE_DISCOVERY=true BONOB_SONOS_AUTO_REGISTER=true nodemon ./src/app.ts", "register-dev": "ts-node ./src/register.ts http://$(hostname):4534", "test": "jest --testPathIgnorePatterns=build" } diff --git a/src/server.ts b/src/server.ts index fd046f8..6deb41e 100644 --- a/src/server.ts +++ b/src/server.ts @@ -325,6 +325,12 @@ function server( } }); + app.get("/stream/artistRadio/:id", async (req, res) => { + const id = req.params["id"]!; + console.log(`----------> Streaming artist radio!! ${id}`) + res.status(404).send() + }); + app.get("/:type/:id/art/size/:size", (req, res) => { const authToken = accessTokens.authTokenFor( req.query[BONOB_ACCESS_TOKEN_HEADER] as string diff --git a/src/smapi.ts b/src/smapi.ts index f13182b..301f7cb 100644 --- a/src/smapi.ts +++ b/src/smapi.ts @@ -333,7 +333,7 @@ function bindSmapiSoapServiceToExpress( i8n: I8N ) { const sonosSoap = new SonosSoap(bonobUrl, linkCodes); - + const urlWithToken = (accessToken: string) => bonobUrl.append({ searchParams: { @@ -385,13 +385,30 @@ function bindSmapiSoapServiceToExpress( ) => auth(musicService, accessTokens, soapyHeaders?.credentials) .then(splitId(id)) - .then(async ({ musicLibrary, accessToken, typeId }) => - musicLibrary.track(typeId!).then((it) => ({ - getMediaMetadataResult: track( - urlWithToken(accessToken), - it - ), - })) + .then(async ({ musicLibrary, accessToken, type, typeId }) => { + console.log(`!!! getMediaMetadata->${id}`) + switch (type) { + case "track": return musicLibrary.track(typeId!).then((it) => ({ + getMediaMetadataResult: track( + urlWithToken(accessToken), + it, + ), + })); + case "artistRadio": return { + getMediaMetadataResult: { + id, + itemType: "stream", + title: "Foobar100", + mimeType: 'audio/x-scpls', + // streamMetadata: { + // logo: "??" + // } + } + } + default: + throw `Unsupported search by:${id}`; + } + } ), search: async ( { id, term }: { id: string; term: string }, @@ -439,7 +456,7 @@ function bindSmapiSoapServiceToExpress( index, count, }: // recursive, - { id: string; index: number; count: number; recursive: boolean }, + { id: string; index: number; count: number; recursive: boolean }, _, soapyHeaders: SoapyHeaders, ) => @@ -464,12 +481,18 @@ function bindSmapiSoapServiceToExpress( relatedBrowse: artist.similarArtists.filter(it => it.inLibrary).length > 0 ? [ - { - id: `relatedArtists:${artist.id}`, - type: "RELATED_ARTISTS", - }, - ] + { + id: `relatedArtists:${artist.id}`, + type: "RELATED_ARTISTS", + }, + ] : [], + relatedPlay: { + id: `artistRadio:${artist.id}`, + itemType: "stream", + title: "Foobar radio", + canPlay: true + } }, }; }); @@ -527,7 +550,7 @@ function bindSmapiSoapServiceToExpress( index, count, }: // recursive, - { id: string; index: number; count: number; recursive: boolean }, + { id: string; index: number; count: number; recursive: boolean }, _, soapyHeaders: SoapyHeaders, { headers }: Pick @@ -538,7 +561,7 @@ function bindSmapiSoapServiceToExpress( const paging = { _index: index, _count: count }; const lang = i8n((headers["accept-language"] || "en-US") as LANG); logger.debug( - `Fetching metadata type=${type}, typeId=${typeId}, lang=${lang}` + `Fetching metadata type=${type}, typeId=${typeId}` ); const albums = (q: AlbumQuery): Promise => diff --git a/src/sonos.ts b/src/sonos.ts index 3d99c99..d060141 100644 --- a/src/sonos.ts +++ b/src/sonos.ts @@ -10,7 +10,7 @@ import { URLBuilder } from "./url_builder"; export const SONOS_LANG = ["en-US", "da-DK", "de-DE", "es-ES", "fr-FR", "it-IT", "ja-JP", "nb-NO", "nl-NL", "pt-BR", "sv-SE", "zh-CN"] -export const PRESENTATION_AND_STRINGS_VERSION = "19"; +export const PRESENTATION_AND_STRINGS_VERSION = "20"; // NOTE: manifest requires https for the URL, // otherwise you will get an error trying to register @@ -20,6 +20,7 @@ export type Capability = | "alFavorites" | "ucPlaylists" | "extendedMD" + | "radioExtendedMD" | "contextHeaders" | "authorizationHeader" | "logging" @@ -32,6 +33,7 @@ export const BONOB_CAPABILITIES: Capability[] = [ "ucPlaylists", "extendedMD", "logging", + "radioExtendedMD" ]; export type Device = {