This commit is contained in:
simojenki
2021-08-15 07:52:50 +10:00
parent 368274c65b
commit 0b381b4ab1
4 changed files with 49 additions and 18 deletions

View File

@@ -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"
}

View File

@@ -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

View File

@@ -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<Request, 'headers'>
@@ -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<GetMetadataResponse> =>

View File

@@ -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 = {