Skip to content

Commit 919bf51

Browse files
committed
Improved static overrides so that artwork and join URL can have distinct sources
1 parent fdc36ed commit 919bf51

File tree

4 files changed

+94
-80
lines changed

4 files changed

+94
-80
lines changed

config/dummy

Whitespace-only changes.

src/helpers/configs/default_staticoverrides.js

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,42 @@
11

22
// 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
3+
// Override's key may use album artist name or album name, most specific combination being used first
4+
// Override's value must contain artworkFrom and artworkUrl or joinFrom and joinUrl or all four
55
// For example:
66
/*
77
module.exports = [
88
{key: {albumArtist: "Artist1", albumName: "Album1"},
9-
value: {fetchedFrom: "Example1", artworkUrl: "example1.jpg", joinUrl: "example1"}},
9+
value: {artworkFrom: "Example1", artworkUrl: "example1.jpg", joinFrom: "Example1", joinUrl: "example1"}},
1010
1111
{key: {albumName: "Album2"},
1212
value: {joinUrl: "example2a"}},
1313
{key: {albumArtist: "Artist1", albumName: "Album2"},
14-
value: {fetchedFrom: "Example2b", artworkUrl: "example2b.jpg", joinUrl: "example2b"}},
14+
value: {artworkFrom: "Example2b", artworkUrl: "example2b.jpg", joinFrom: "Example2b", joinUrl: "example2b"}},
1515
1616
{key: {albumArtist: "Artist1"},
17-
value: {fetchedFrom: "Example3", artworkUrl: "example3.jpg"}},
18-
{key: {albumName: "Album3"},
19-
value: {joinUrl: "example3"}},
17+
value: {artworkFrom: "Example3", artworkUrl: "example3.jpg"}},
18+
19+
{key: {albumName: "Album4"},
20+
value: {joinFrom: "Example4", joinUrl: "example4.jpg"}},
2021
]
2122
*/
2223
// will return:
2324

2425
// for "Album1" by "Artist1":
25-
// {fetchedFrom: "Example1", artworkUrl: "example1.jpg", joinUrl: "example1"}
26-
// (no tricks here, key is exact match and values are complete)
26+
// {artworkFrom: "Example1", artworkUrl: "example1.jpg", joinFrom: "Example1", joinUrl: "example1"}
27+
// (no tricks here, the key is an exact match)
2728

2829
// for "Album2" by "Artist1":
29-
// {fetchedFrom: "Example2b", artworkUrl: "example2b.jpg", joinUrl: "example2b"}
30+
// {artworkFrom: "Example2b", artworkUrl: "example2b.jpg", joinFrom: "Example2b", joinUrl: "example2b"}
3031
// (because the most specific key is used first)
3132

3233
// for "Album3" by "Artist1":
33-
// {fetchedFrom: "Example3", artworkUrl: "example3.jpg", joinUrl: "example3"}
34-
// (because partial information gets combined)
34+
// {fetchedFrom: "Example3", artworkUrl: "example3.jpg"}
35+
// (because it is the best match for given album)
3536

36-
// for "Album4" by "Artist1" or "Album1", "Album2", "Album3" by "Artist2":
37-
// nothing
38-
// (because some values wouldn't be set)
37+
// for "Album4" by "Artist1":
38+
// {artworkFrom: "Example3", artworkUrl: "example3.jpg", joinFrom: "Example4", joinUrl: "example4.jpg"}
39+
// (partial matches for "Album4" and "Artist1" get combined)
3940

4041

4142
module.exports = [

src/rpc/format.js

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,18 @@ const fetchers = {
8181
* Safe wrapper for calling a fetcher in try-catch block
8282
* @param {string} fetcherName name of the fetcher to use
8383
* @param {Object} metadata VLC metadata
84-
* @returns {!{fetchedFrom: string, artworkUrl: string, joinUrl: string}}
84+
* @returns {!{artworkFrom: string, artworkUrl: string, joinFrom: string, joinUrl: string}}
8585
*/
8686
async function fetchSafely(fetcherName, metadata)
8787
{
8888
let returnValue;
8989
try
9090
{
9191
returnValue = await fetchers[fetcherName](metadata);
92+
if (returnValue && fetcherName !== "staticoverrides")
93+
{
94+
returnValue.artworkFrom = returnValue.joinFrom = returnValue.fetchedFrom;
95+
}
9296
}
9397
catch (err)
9498
{
@@ -105,19 +109,19 @@ async function fetchSafely(fetcherName, metadata)
105109
* @param {string} preferredArtworkProvider name of preferred artwork fetcher
106110
* @param {string} preferredJoinProvider name of preferred join fetcher
107111
* @param {Object} metadata VLC metadata
108-
* @returns {!{artworkUrl: string, artworkFrom: string, joinUrl: string, joinFrom: string}}
112+
* @returns {!{artworkFrom: string, artworkUrl: string, joinFrom: string, joinUrl: string}}
109113
*/
110114
async function combinedFetch(preferredArtworkProvider, preferredJoinProvider, metadata)
111115
{
112-
let artworkUrl, artworkFrom, joinUrl, joinFrom;
116+
let artworkFrom, artworkUrl, joinFrom, joinUrl;
113117
let results = [];
114118

115119
// First try fetching artwork URL using preferred provider
116120
results[preferredArtworkProvider] = await fetchSafely(preferredArtworkProvider, metadata);
117121
if(results[preferredArtworkProvider].artworkUrl)
118122
{
123+
artworkFrom = results[preferredArtworkProvider].artworkFrom;
119124
artworkUrl = results[preferredArtworkProvider].artworkUrl;
120-
artworkFrom = results[preferredArtworkProvider].fetchedFrom;
121125
}
122126

123127
// Next try fetching join URL from preferred provider
@@ -128,20 +132,20 @@ async function combinedFetch(preferredArtworkProvider, preferredJoinProvider, me
128132
// Set it separately, in case both preferred providers are the same
129133
if (results[preferredJoinProvider].joinUrl)
130134
{
135+
joinFrom = results[preferredJoinProvider].joinFrom;
131136
joinUrl = results[preferredJoinProvider].joinUrl;
132-
joinFrom = results[preferredJoinProvider].fetchedFrom;
133137
}
134138

135139
// Try using preferred join provider as a backup artwork provider and vice versa
136140
if (!artworkUrl && results[preferredJoinProvider].artworkUrl)
137141
{
142+
artworkFrom = results[preferredJoinProvider].artworkFrom;
138143
artworkUrl = results[preferredJoinProvider].artworkUrl;
139-
artworkFrom = results[preferredJoinProvider].fetchedFrom;
140144
}
141145
if (!joinUrl && results[preferredArtworkProvider].joinUrl)
142146
{
147+
joinFrom = results[preferredArtworkProvider].joinFrom;
143148
joinUrl = results[preferredArtworkProvider].joinUrl;
144-
joinFrom = results[preferredArtworkProvider].fetchedFrom;
145149
}
146150

147151
// In case either still isn't set, iterate all other providers
@@ -153,13 +157,13 @@ async function combinedFetch(preferredArtworkProvider, preferredJoinProvider, me
153157
results[availableProviderNames[ii]] = await fetchSafely(availableProviderNames[ii], metadata);
154158
if(!artworkUrl && results[availableProviderNames[ii]].artworkUrl)
155159
{
160+
artworkFrom = results[availableProviderNames[ii]].artworkFrom;
156161
artworkUrl = results[availableProviderNames[ii]].artworkUrl;
157-
artworkFrom = results[availableProviderNames[ii]].fetchedFrom;
158162
}
159163
if (!joinUrl && results[availableProviderNames[ii]].joinUrl)
160164
{
165+
joinFrom = results[availableProviderNames[ii]].joinFrom;
161166
joinUrl = results[availableProviderNames[ii]].joinUrl;
162-
joinFrom = results[availableProviderNames[ii]].fetchedFrom;
163167
}
164168
}
165169
}

src/rpc/staticOverridesFetcher.js

Lines changed: 65 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,65 @@
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;
1+
2+
/**
3+
* Fetcher of static overrides
4+
*/
5+
class StaticOverridesFetcher
6+
{
7+
/** @type {!Object} #data structure for storing the lookup data */
8+
#data = {};
9+
10+
constructor(rawData)
11+
{
12+
for (let v of rawData)
13+
{
14+
// Use key stringified with sorted keys
15+
this.#data[JSON.stringify(v.key, Object.keys(v.key).sort())] = v.value;
16+
}
17+
}
18+
19+
/**
20+
* @param {!Object} VLC metadata
21+
* @returns {!{artworkFrom: ?string, artworkUrl: ?string, joinFrom: ?string, joinUrl: ?string}}
22+
*/
23+
fetch(metadata)
24+
{
25+
let result = {};
26+
27+
for (let v of StaticOverridesFetcher.createPowerset(metadata.ALBUMARTIST || metadata.artist,
28+
metadata.album))
29+
{
30+
let lookup_result = this.#data[JSON.stringify(v)];
31+
32+
if (lookup_result)
33+
{
34+
if (!result.artworkUrl && lookup_result.artworkUrl)
35+
{
36+
result.artworkFrom = lookup_result.artworkFrom;
37+
result.artworkUrl = lookup_result.artworkUrl;
38+
}
39+
if (!result.joinUrl && lookup_result.joinUrl)
40+
{
41+
result.joinFrom = lookup_result.joinFrom;
42+
result.joinUrl = lookup_result.joinUrl;
43+
}
44+
}
45+
}
46+
47+
return result;
48+
}
49+
50+
static createPowerset(albumArtist, albumName)
51+
{
52+
let result = [];
53+
54+
if (albumArtist && albumName)
55+
result.push({albumArtist, albumName});
56+
if (albumArtist)
57+
result.push({albumArtist});
58+
if (albumName)
59+
result.push({albumName});
60+
61+
return result;
62+
}
63+
}
64+
65+
module.exports = StaticOverridesFetcher;

0 commit comments

Comments
 (0)