Skip to content

Commit fdc36ed

Browse files
committed
Implemented static overrides
1 parent a96ad70 commit fdc36ed

File tree

4 files changed

+114
-9
lines changed

4 files changed

+114
-9
lines changed

src/helpers/configs/default_config.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,14 @@ module.exports = {
3434
// How frequently in milliseconds to check for updates
3535
updateInterval: 1000,
3636

37-
// Preferred provider of the album artwork
38-
// Supported: "apple", "bandcamp", "deezer", "qobuz", "spotify", "soundcloud" and "tidal"
39-
// Use "musichoarders" to use closest fit from all services above
40-
whereToFetchOnline: "musichoarders",
37+
// Preferred provider of the album artwork. Supported values
38+
// "staticcverrides" (for values from `config/staticoverrides.js`)
39+
// "musichoarders" (for closest fit from servicese below)
40+
// "apple", "bandcamp", "deezer", "qobuz", "spotify", "soundcloud" and "tidal"
41+
whereToFetchOnline: "staticoverrides",
4142

4243
// Preferred provider of the rpc button (as above + "youtube")
43-
changeButtonProvider: "spotify",
44+
changeButtonProvider: "staticoverrides",
4445

4546
// Whether to use persistent cache for MusicHoarders queries
4647
persistentMusicHoardersCache: false,
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
2+
// Include your static overrides here
3+
// Overrides may use album artist name or album name in keys, most specific combination being used first
4+
// Overrides must contain fetchedFrom, artworkUrl and joinUrl in aggregate value to be used
5+
// For example:
6+
/*
7+
module.exports = [
8+
{key: {albumArtist: "Artist1", albumName: "Album1"},
9+
value: {fetchedFrom: "Example1", artworkUrl: "example1.jpg", joinUrl: "example1"}},
10+
11+
{key: {albumName: "Album2"},
12+
value: {joinUrl: "example2a"}},
13+
{key: {albumArtist: "Artist1", albumName: "Album2"},
14+
value: {fetchedFrom: "Example2b", artworkUrl: "example2b.jpg", joinUrl: "example2b"}},
15+
16+
{key: {albumArtist: "Artist1"},
17+
value: {fetchedFrom: "Example3", artworkUrl: "example3.jpg"}},
18+
{key: {albumName: "Album3"},
19+
value: {joinUrl: "example3"}},
20+
]
21+
*/
22+
// will return:
23+
24+
// for "Album1" by "Artist1":
25+
// {fetchedFrom: "Example1", artworkUrl: "example1.jpg", joinUrl: "example1"}
26+
// (no tricks here, key is exact match and values are complete)
27+
28+
// for "Album2" by "Artist1":
29+
// {fetchedFrom: "Example2b", artworkUrl: "example2b.jpg", joinUrl: "example2b"}
30+
// (because the most specific key is used first)
31+
32+
// for "Album3" by "Artist1":
33+
// {fetchedFrom: "Example3", artworkUrl: "example3.jpg", joinUrl: "example3"}
34+
// (because partial information gets combined)
35+
36+
// for "Album4" by "Artist1" or "Album1", "Album2", "Album3" by "Artist2":
37+
// nothing
38+
// (because some values wouldn't be set)
39+
40+
41+
module.exports = [
42+
43+
]

src/rpc/format.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55

66
const fs = require('fs');
77
const log = require('../helpers/lager.js');
8-
const config = require('../helpers/configLoader.js').getOrInit('config.js');
8+
const cl = require('../helpers/configLoader.js');
9+
const config = cl.getOrInit('config.js');
910
const axios = require('axios');
1011
const yt = require("ytsr");
1112
const path = require("path");
1213

14+
let staticOverridesFetcher = new (require('./staticOverridesFetcher.js'))(cl.getOrInit('staticoverrides.js'));
1315
let musichoardersFetcher = new (require('./musichoardersFetcher.js'))(config.rpc.persistentMusicHoardersCache);
1416

1517
// These functions, 'fetchers', provide uniform inteface for simple access to the APIs
@@ -18,6 +20,12 @@ let musichoardersFetcher = new (require('./musichoardersFetcher.js'))(config.rpc
1820
// In order to be as simple as possible, the functions may throw exceptions or not return anything.
1921
// They are expected to be called through the `fetchSafely()` wrapper.
2022
const fetchers = {
23+
"staticoverrides": async (metadata) => {
24+
return staticOverridesFetcher.fetch(metadata);
25+
},
26+
"musichoarders": async (metadata) => {
27+
return musichoardersFetcher.fetch("musichoarders", metadata);
28+
},
2129
"apple": async (metadata) => { // Doesn't rely on MusicHoarders, keep it that way, just in case
2230
if ((metadata.ALBUMARTIST || metadata.artist) && metadata.title)
2331
{
@@ -44,9 +52,6 @@ const fetchers = {
4452
"deezer": async (metadata) => {
4553
return musichoardersFetcher.fetch("deezer", metadata);
4654
},
47-
"musichoarders": async (metadata) => {
48-
return musichoardersFetcher.fetch("musichoarders", metadata);
49-
},
5055
"qobuz": async (metadata) => {
5156
return musichoardersFetcher.fetch("qobuz", metadata);
5257
},

src/rpc/staticOverridesFetcher.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
2+
class StaticOverridesFetcher
3+
{
4+
/** Overrides data to use */
5+
#data
6+
7+
constructor(rawData)
8+
{
9+
this.#data = {};
10+
for (let v of rawData)
11+
{
12+
// Use key stringified with sorted keys
13+
this.#data[JSON.stringify(v.key, Object.keys(v.key).sort())] = v.value;
14+
}
15+
}
16+
17+
fetch(metadata)
18+
{
19+
let result = {};
20+
21+
for (let v of StaticOverridesFetcher.createPowerset(metadata.ALBUMARTIST,
22+
metadata.album))
23+
{
24+
let lookup_result = this.#data[JSON.stringify(v)];
25+
26+
if (lookup_result)
27+
{
28+
if (!result.fetchedFrom && lookup_result.fetchedFrom)
29+
result.fetchedFrom = lookup_result.fetchedFrom;
30+
if (!result.artworkUrl && lookup_result.artworkUrl)
31+
result.artworkUrl = lookup_result.artworkUrl;
32+
if (!result.joinUrl && lookup_result.joinUrl)
33+
result.joinUrl = lookup_result.joinUrl;
34+
35+
if (result.fetchedFrom && result.artworkUrl && result.joinUrl)
36+
return result;
37+
}
38+
}
39+
}
40+
41+
static createPowerset(albumArtist, albumName)
42+
{
43+
let result = [];
44+
45+
if (albumArtist && albumName)
46+
result.push({albumArtist, albumName});
47+
if (albumArtist)
48+
result.push({albumArtist});
49+
if (albumName)
50+
result.push({albumName});
51+
52+
return result;
53+
}
54+
}
55+
56+
module.exports = StaticOverridesFetcher;

0 commit comments

Comments
 (0)