Skip to content

Commit 3ad60d5

Browse files
committed
feat: Gérer la saisie d'une adresse complète de Kodi.
1 parent d297809 commit 3ad60d5

File tree

10 files changed

+179
-130
lines changed

10 files changed

+179
-130
lines changed

src/_locales/en/messages.json

+13-10
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@
4141
"message": "No address"
4242
},
4343
"notifications_unconfigured_message": {
44-
"message": "IP address of Kodi Web server is missing in options."
44+
"message": "Address of Kodi Web server is missing in options."
4545
},
4646

47-
"notifications_badHost_title": {
47+
"notifications_badAddress_title": {
4848
"message": "Address invalid"
4949
},
50-
"notifications_badHost_message": {
51-
"message": "IP address of Kodi Web server $ADDRESS$ is invalid.",
50+
"notifications_badAddress_message": {
51+
"message": "Address of Kodi Web server $ADDRESS$ is invalid.",
5252
"placeholders": {
5353
"address": {
5454
"content": "$1"
@@ -60,7 +60,7 @@
6060
"message": "Kodi not found"
6161
},
6262
"notifications_notFound_message": {
63-
"message": "IP address of Kodi Web server $ADDRESS$ is invalid or Kodi's remote control isn't enabled.",
63+
"message": "Address of Kodi Web server $ADDRESS$ is invalid or Kodi's remote control isn't enabled.",
6464
"placeholders": {
6565
"address": {
6666
"content": "$1"
@@ -210,22 +210,25 @@
210210
"options_serverModeSingle_textcontent": {
211211
"message": "Configure one server"
212212
},
213-
"options_serverHost_textcontent": {
214-
"message": "IP address:"
213+
"options_serverAddress_textcontent": {
214+
"message": "Address:"
215+
},
216+
"options_serverAddress_title": {
217+
"message": "IP address or full address (for example : 192.168.0.1, ws://192.168.0.1:9090/jsonrpc, etc.)"
215218
},
216219
"options_serverModeMulti_textcontent": {
217220
"message": "Configure many servers"
218221
},
219-
"options_serverHosts_textcontent": {
220-
"message": "IP address"
222+
"options_serverAddresses_textcontent": {
223+
"message": "Address"
221224
},
222225
"options_serverNames_textcontent": {
223226
"message": "Name"
224227
},
225228
"options_serverAdd_textcontent": {
226229
"message": "Add server"
227230
},
228-
"options_serverHost_placeholder": {
231+
"options_serverAddress_placeholder": {
229232
"message": "192.168.0.1"
230233
},
231234
"options_serverName_placeholder": {

src/_locales/fr/messages.json

+13-10
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,14 @@
4141
"message": "Aucune adresse"
4242
},
4343
"notifications_unconfigured_message": {
44-
"message": "L'adresse IP du serveur Web de Kodi n'est pas renseignée."
44+
"message": "L'adresse du serveur Web de Kodi n'est pas renseignée."
4545
},
4646

47-
"notifications_badHost_title": {
47+
"notifications_badAddress_title": {
4848
"message": "Adresse invalide"
4949
},
50-
"notifications_badHost_message": {
51-
"message": "L'adresse IP du serveur Web de Kodi $ADDRESS$ est invalide.",
50+
"notifications_badAddress_message": {
51+
"message": "L'adresse du serveur Web de Kodi $ADDRESS$ est invalide.",
5252
"placeholders": {
5353
"address": {
5454
"content": "$1"
@@ -60,7 +60,7 @@
6060
"message": "Kodi non trouvé"
6161
},
6262
"notifications_notFound_message": {
63-
"message": "L'adresse IP du serveur Web de Kodi $ADDRESS$ est invalide ; ou le contrôle à distance n'est pas activé dans Kodi.",
63+
"message": "L'adresse du serveur Web de Kodi $ADDRESS$ est invalide ; ou le contrôle à distance n'est pas activé dans Kodi.",
6464
"placeholders": {
6565
"address": {
6666
"content": "$1"
@@ -210,22 +210,25 @@
210210
"options_serverModeSingle_textcontent": {
211211
"message": "Configurer un seul serveur"
212212
},
213-
"options_serverHost_textcontent": {
214-
"message": "Adresse IP :"
213+
"options_serverAddress_textcontent": {
214+
"message": "Adresse :"
215+
},
216+
"options_serverAddress_title": {
217+
"message": "Adresse IP ou adresse complète (par exemple : 192.168.0.1, ws://192.168.0.1:9090/jsonrpc, etc.)"
215218
},
216219
"options_serverModeMulti_textcontent": {
217220
"message": "Configurer plusieurs serveurs"
218221
},
219-
"options_serverHosts_textcontent": {
220-
"message": "Adresse IP"
222+
"options_serverAddresses_textcontent": {
223+
"message": "Adresse"
221224
},
222225
"options_serverNames_textcontent": {
223226
"message": "Nom"
224227
},
225228
"options_serverAdd_textcontent": {
226229
"message": "Ajouter un serveur"
227230
},
228-
"options_serverHost_placeholder": {
231+
"options_serverAddress_placeholder": {
229232
"message": "192.168.0.1"
230233
},
231234
"options_serverName_placeholder": {

src/background/migrate.js

+43-41
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,52 @@
22
* @module
33
*/
44

5-
browser.storage.local.get().then((config) => {
6-
if (!("config-version" in config)) {
5+
browser.storage.local.get().then((current) => {
6+
if ("config-version" in current) {
7+
let config = current;
8+
if (1 === config["config-version"]) {
9+
const actions = Object.entries(config)
10+
.filter(([k, v]) => k.startsWith("menus-") && v)
11+
.map(([k]) => k.slice(6))
12+
.reverse();
13+
const contexts = Object.entries(config)
14+
.filter(([k, v]) => k.startsWith("contexts-") && v)
15+
.map(([k]) => k.slice(9));
16+
17+
config = {
18+
"config-version": 2,
19+
"server-mode": "single",
20+
"server-list": [{
21+
host: config["connection-host"],
22+
name: "",
23+
}],
24+
"server-active": 0,
25+
"general-history": config["general-history"],
26+
"menu-actions": actions,
27+
"menu-contexts": contexts,
28+
"youtube-playlist": config["youtube-playlist"],
29+
};
30+
}
31+
if (2 === config["config-version"]) {
32+
const servers = config["server-list"].map((server) => ({
33+
address: server.host,
34+
name: server.name,
35+
}));
36+
37+
config["config-version"] = 3;
38+
config["server-list"] = servers;
39+
}
40+
41+
// Nettoyer la configuration pour garder seulement les propriétés
42+
// nécessaire.
43+
browser.storage.local.clear();
44+
browser.storage.local.set(config);
45+
} else {
746
browser.storage.local.clear();
847
browser.storage.local.set({
9-
"config-version": 2,
48+
"config-version": 3,
1049
"server-mode": "single",
11-
"server-list": [{ host: "", name: "" }],
50+
"server-list": [{ address: "", name: "" }],
1251
"server-active": 0,
1352
"general-history": false,
1453
"menu-actions": ["send", "insert", "add"],
@@ -17,42 +56,5 @@ browser.storage.local.get().then((config) => {
1756
],
1857
"youtube-playlist": "playlist",
1958
});
20-
} else if (1 === config["config-version"]) {
21-
const actions = Object.entries(config)
22-
.filter(([k, v]) => k.startsWith("menus-") && v)
23-
.map(([k]) => k.slice(6))
24-
.reverse();
25-
const contexts = Object.entries(config)
26-
.filter(([k, v]) => k.startsWith("contexts-") && v)
27-
.map(([k]) => k.slice(9));
28-
29-
browser.storage.local.clear();
30-
browser.storage.local.set({
31-
"config-version": 2,
32-
"server-mode": "single",
33-
"server-list": [{
34-
host: config["connection-host"],
35-
name: "",
36-
}],
37-
"server-active": 0,
38-
"general-history": config["general-history"],
39-
"menu-actions": actions,
40-
"menu-contexts": contexts,
41-
"youtube-playlist": config["youtube-playlist"],
42-
});
43-
} else {
44-
// Nettoyer la configuration en gardant seulement les propriétés
45-
// nécessaire.
46-
browser.storage.local.clear();
47-
browser.storage.local.set({
48-
"config-version": config["config-version"],
49-
"server-mode": config["server-mode"],
50-
"server-list": config["server-list"],
51-
"server-active": config["server-active"],
52-
"general-history": config["general-history"],
53-
"menu-actions": config["menu-actions"],
54-
"menu-contexts": config["menu-contexts"],
55-
"youtube-playlist": config["youtube-playlist"],
56-
});
5759
}
5860
});

src/core/jsonrpc/kodi.js

+49-29
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,60 @@ export const Kodi = class {
2020
/**
2121
* Vérifie la connexion à Kodi.
2222
*
23-
* @param {string} host L'adresse IP (ou le nom de domaine) du serveur
24-
* hébergeant Kodi.
23+
* @param {string} address L'adresse IP ou l'adresse complète du service de
24+
* Kodi.
2525
* @returns {Promise.<object>} Une promesse tenue si Kodi est accessible ;
2626
* sinon une promesse rompue.
2727
*/
28-
static async check(host) {
29-
const kodi = new Kodi(host);
28+
static async check(address) {
29+
const kodi = new Kodi(address);
3030
const result = await kodi.send("JSONRPC.Version");
3131
kodi.close();
3232
return result;
3333
}
3434

35+
/**
36+
* Construit une URL vers le service de Kodi.
37+
*
38+
* @param {string} address L'adresse IP ou l'adresse complête du service de
39+
* Kodi.
40+
* @returns {Promise.<URL>} Une promesse contenant l'URL.
41+
*/
42+
static build(address) {
43+
if ("" === address) {
44+
throw new PebkacError("unconfigured");
45+
}
46+
let url;
47+
try {
48+
url = new URL(address);
49+
} catch {
50+
// Si la connexion avec l'adresse complète n'a pas fonctionnée :
51+
// essayer avec l'adresse IP (en y ajoutant le protocol, le port et
52+
// le chemin).
53+
try {
54+
url = new URL("ws://" + address + ":9090/jsonrpc");
55+
} catch {
56+
throw new PebkacError("badAddress", address);
57+
}
58+
// Si l'URL est incorrecte (car l'adresse IP a été corrigée par le
59+
// constructeur).
60+
if (url.hostname !== address.toLowerCase()) {
61+
throw new PebkacError("badAddress", address);
62+
}
63+
}
64+
return url;
65+
}
66+
3567
/**
3668
* Crée un client JSON-RPC pour contacter Kodi.
3769
*
38-
* @param {?string} [host=null] L'adresse IP (ou le nom de domaine) du
39-
* serveur hébergeant Kodi ; ou
40-
* <code>null</code> pour récupérer l'adresse
41-
* dans la configuration.
70+
* @param {?string} [address=null] L'adresse IP ou l'adresse complète du
71+
* service de Kodi ; ou <code>null</code>
72+
* pour récupérer l'adresse dans la
73+
* configuration.
4274
*/
43-
constructor(host = null) {
44-
this.host = host;
75+
constructor(address = null) {
76+
this.address = address;
4577
this.jsonrpc = null;
4678

4779
this.application = new Application(this);
@@ -70,30 +102,18 @@ export const Kodi = class {
70102
*/
71103
async send(method, params) {
72104
if (null === this.jsonrpc) {
73-
let host;
74-
if (null === this.host) {
105+
let address;
106+
if (null === this.address) {
75107
const config = await browser.storage.local.get([
76108
"server-list",
77109
"server-active",
78110
]);
79-
host = config["server-list"][config["server-active"]].host;
111+
address = config["server-list"][config["server-active"]]
112+
.address;
80113
} else {
81-
host = this.host;
82-
}
83-
if ("" === host) {
84-
throw new PebkacError("unconfigured");
85-
}
86-
let url;
87-
try {
88-
url = new URL("ws://" + host + ":9090/jsonrpc");
89-
} catch {
90-
throw new PebkacError("badHost", host);
91-
}
92-
// Si l'URL est incorrecte (car le nom de domaine a été corrigé
93-
// par le constructeur).
94-
if (url.hostname !== host.toLowerCase()) {
95-
throw new PebkacError("badHost", host);
114+
address = this.address;
96115
}
116+
const url = Kodi.build(address);
97117

98118
try {
99119
this.jsonrpc = await JSONRPC.open(url);
@@ -106,7 +126,7 @@ export const Kodi = class {
106126
this.playlist.handleNotification(event);
107127
});
108128
} catch {
109-
throw new PebkacError("notFound", host);
129+
throw new PebkacError("notFound", address);
110130
}
111131
}
112132

src/options/img/help.svg

+6
Loading

src/options/index.html

+12-7
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@ <h3 data-i18n-textcontent="server-title"></h3>
1919
</label>
2020
</summary>
2121
<div>
22-
<label data-i18n-textcontent="server-host">
23-
{}
24-
<input name="host_0" type="text" required autocomplete="off"
25-
spellcheck="false" data-i18n-placeholder="server-host" />
22+
<label data-i18n-textcontent="server-address"
23+
data-i18n-title="server-address">
24+
{} <sup><object data="img/help.svg"></object></sup>
25+
<input name="address_0" type="text" required autocomplete="off"
26+
spellcheck="false" data-i18n-placeholder="server-address" />
2627
</label>
2728
</div>
2829
</details>
@@ -35,7 +36,10 @@ <h3 data-i18n-textcontent="server-title"></h3>
3536
<table>
3637
<thead>
3738
<tr>
38-
<th data-i18n-textcontent="server-hosts"></th>
39+
<th data-i18n-textcontent="server-addresses"
40+
data-i18n-title="server-address">
41+
{} <sup><object data="img/help.svg"></object></sup>
42+
</th>
3943
<th data-i18n-textcontent="server-names"></th>
4044
<th></th>
4145
</tr>
@@ -53,8 +57,9 @@ <h3 data-i18n-textcontent="server-title"></h3>
5357
<template>
5458
<tr>
5559
<td>
56-
<input name="host_" type="text" required autocomplete="off"
57-
spellcheck="false" data-i18n-placeholder="server-host" />
60+
<input name="address_" type="text" required autocomplete="off"
61+
spellcheck="false"
62+
data-i18n-placeholder="server-address" />
5863
</td>
5964
<td>
6065
<input name="name_" type="text" required autocomplete="off"

0 commit comments

Comments
 (0)