Skip to content

Commit

Permalink
feat: Gérer la saisie d'une adresse complète de Kodi.
Browse files Browse the repository at this point in the history
  • Loading branch information
regseb committed Jul 5, 2020
1 parent d297809 commit 3ad60d5
Show file tree
Hide file tree
Showing 10 changed files with 179 additions and 130 deletions.
23 changes: 13 additions & 10 deletions src/_locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@
"message": "No address"
},
"notifications_unconfigured_message": {
"message": "IP address of Kodi Web server is missing in options."
"message": "Address of Kodi Web server is missing in options."
},

"notifications_badHost_title": {
"notifications_badAddress_title": {
"message": "Address invalid"
},
"notifications_badHost_message": {
"message": "IP address of Kodi Web server $ADDRESS$ is invalid.",
"notifications_badAddress_message": {
"message": "Address of Kodi Web server $ADDRESS$ is invalid.",
"placeholders": {
"address": {
"content": "$1"
Expand All @@ -60,7 +60,7 @@
"message": "Kodi not found"
},
"notifications_notFound_message": {
"message": "IP address of Kodi Web server $ADDRESS$ is invalid or Kodi's remote control isn't enabled.",
"message": "Address of Kodi Web server $ADDRESS$ is invalid or Kodi's remote control isn't enabled.",
"placeholders": {
"address": {
"content": "$1"
Expand Down Expand Up @@ -210,22 +210,25 @@
"options_serverModeSingle_textcontent": {
"message": "Configure one server"
},
"options_serverHost_textcontent": {
"message": "IP address:"
"options_serverAddress_textcontent": {
"message": "Address:"
},
"options_serverAddress_title": {
"message": "IP address or full address (for example : 192.168.0.1, ws://192.168.0.1:9090/jsonrpc, etc.)"
},
"options_serverModeMulti_textcontent": {
"message": "Configure many servers"
},
"options_serverHosts_textcontent": {
"message": "IP address"
"options_serverAddresses_textcontent": {
"message": "Address"
},
"options_serverNames_textcontent": {
"message": "Name"
},
"options_serverAdd_textcontent": {
"message": "Add server"
},
"options_serverHost_placeholder": {
"options_serverAddress_placeholder": {
"message": "192.168.0.1"
},
"options_serverName_placeholder": {
Expand Down
23 changes: 13 additions & 10 deletions src/_locales/fr/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,14 +41,14 @@
"message": "Aucune adresse"
},
"notifications_unconfigured_message": {
"message": "L'adresse IP du serveur Web de Kodi n'est pas renseignée."
"message": "L'adresse du serveur Web de Kodi n'est pas renseignée."
},

"notifications_badHost_title": {
"notifications_badAddress_title": {
"message": "Adresse invalide"
},
"notifications_badHost_message": {
"message": "L'adresse IP du serveur Web de Kodi $ADDRESS$ est invalide.",
"notifications_badAddress_message": {
"message": "L'adresse du serveur Web de Kodi $ADDRESS$ est invalide.",
"placeholders": {
"address": {
"content": "$1"
Expand All @@ -60,7 +60,7 @@
"message": "Kodi non trouvé"
},
"notifications_notFound_message": {
"message": "L'adresse IP du serveur Web de Kodi $ADDRESS$ est invalide ; ou le contrôle à distance n'est pas activé dans Kodi.",
"message": "L'adresse du serveur Web de Kodi $ADDRESS$ est invalide ; ou le contrôle à distance n'est pas activé dans Kodi.",
"placeholders": {
"address": {
"content": "$1"
Expand Down Expand Up @@ -210,22 +210,25 @@
"options_serverModeSingle_textcontent": {
"message": "Configurer un seul serveur"
},
"options_serverHost_textcontent": {
"message": "Adresse IP :"
"options_serverAddress_textcontent": {
"message": "Adresse :"
},
"options_serverAddress_title": {
"message": "Adresse IP ou adresse complète (par exemple : 192.168.0.1, ws://192.168.0.1:9090/jsonrpc, etc.)"
},
"options_serverModeMulti_textcontent": {
"message": "Configurer plusieurs serveurs"
},
"options_serverHosts_textcontent": {
"message": "Adresse IP"
"options_serverAddresses_textcontent": {
"message": "Adresse"
},
"options_serverNames_textcontent": {
"message": "Nom"
},
"options_serverAdd_textcontent": {
"message": "Ajouter un serveur"
},
"options_serverHost_placeholder": {
"options_serverAddress_placeholder": {
"message": "192.168.0.1"
},
"options_serverName_placeholder": {
Expand Down
84 changes: 43 additions & 41 deletions src/background/migrate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,52 @@
* @module
*/

browser.storage.local.get().then((config) => {
if (!("config-version" in config)) {
browser.storage.local.get().then((current) => {
if ("config-version" in current) {
let config = current;
if (1 === config["config-version"]) {
const actions = Object.entries(config)
.filter(([k, v]) => k.startsWith("menus-") && v)
.map(([k]) => k.slice(6))
.reverse();
const contexts = Object.entries(config)
.filter(([k, v]) => k.startsWith("contexts-") && v)
.map(([k]) => k.slice(9));

config = {
"config-version": 2,
"server-mode": "single",
"server-list": [{
host: config["connection-host"],
name: "",
}],
"server-active": 0,
"general-history": config["general-history"],
"menu-actions": actions,
"menu-contexts": contexts,
"youtube-playlist": config["youtube-playlist"],
};
}
if (2 === config["config-version"]) {
const servers = config["server-list"].map((server) => ({
address: server.host,
name: server.name,
}));

config["config-version"] = 3;
config["server-list"] = servers;
}

// Nettoyer la configuration pour garder seulement les propriétés
// nécessaire.
browser.storage.local.clear();
browser.storage.local.set(config);
} else {
browser.storage.local.clear();
browser.storage.local.set({
"config-version": 2,
"config-version": 3,
"server-mode": "single",
"server-list": [{ host: "", name: "" }],
"server-list": [{ address: "", name: "" }],
"server-active": 0,
"general-history": false,
"menu-actions": ["send", "insert", "add"],
Expand All @@ -17,42 +56,5 @@ browser.storage.local.get().then((config) => {
],
"youtube-playlist": "playlist",
});
} else if (1 === config["config-version"]) {
const actions = Object.entries(config)
.filter(([k, v]) => k.startsWith("menus-") && v)
.map(([k]) => k.slice(6))
.reverse();
const contexts = Object.entries(config)
.filter(([k, v]) => k.startsWith("contexts-") && v)
.map(([k]) => k.slice(9));

browser.storage.local.clear();
browser.storage.local.set({
"config-version": 2,
"server-mode": "single",
"server-list": [{
host: config["connection-host"],
name: "",
}],
"server-active": 0,
"general-history": config["general-history"],
"menu-actions": actions,
"menu-contexts": contexts,
"youtube-playlist": config["youtube-playlist"],
});
} else {
// Nettoyer la configuration en gardant seulement les propriétés
// nécessaire.
browser.storage.local.clear();
browser.storage.local.set({
"config-version": config["config-version"],
"server-mode": config["server-mode"],
"server-list": config["server-list"],
"server-active": config["server-active"],
"general-history": config["general-history"],
"menu-actions": config["menu-actions"],
"menu-contexts": config["menu-contexts"],
"youtube-playlist": config["youtube-playlist"],
});
}
});
78 changes: 49 additions & 29 deletions src/core/jsonrpc/kodi.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,28 +20,60 @@ export const Kodi = class {
/**
* Vérifie la connexion à Kodi.
*
* @param {string} host L'adresse IP (ou le nom de domaine) du serveur
* hébergeant Kodi.
* @param {string} address L'adresse IP ou l'adresse complète du service de
* Kodi.
* @returns {Promise.<object>} Une promesse tenue si Kodi est accessible ;
* sinon une promesse rompue.
*/
static async check(host) {
const kodi = new Kodi(host);
static async check(address) {
const kodi = new Kodi(address);
const result = await kodi.send("JSONRPC.Version");
kodi.close();
return result;
}

/**
* Construit une URL vers le service de Kodi.
*
* @param {string} address L'adresse IP ou l'adresse complête du service de
* Kodi.
* @returns {Promise.<URL>} Une promesse contenant l'URL.
*/
static build(address) {
if ("" === address) {
throw new PebkacError("unconfigured");
}
let url;
try {
url = new URL(address);
} catch {
// Si la connexion avec l'adresse complète n'a pas fonctionnée :
// essayer avec l'adresse IP (en y ajoutant le protocol, le port et
// le chemin).
try {
url = new URL("ws://" + address + ":9090/jsonrpc");
} catch {
throw new PebkacError("badAddress", address);
}
// Si l'URL est incorrecte (car l'adresse IP a été corrigée par le
// constructeur).
if (url.hostname !== address.toLowerCase()) {
throw new PebkacError("badAddress", address);
}
}
return url;
}

/**
* Crée un client JSON-RPC pour contacter Kodi.
*
* @param {?string} [host=null] L'adresse IP (ou le nom de domaine) du
* serveur hébergeant Kodi ; ou
* <code>null</code> pour récupérer l'adresse
* dans la configuration.
* @param {?string} [address=null] L'adresse IP ou l'adresse complète du
* service de Kodi ; ou <code>null</code>
* pour récupérer l'adresse dans la
* configuration.
*/
constructor(host = null) {
this.host = host;
constructor(address = null) {
this.address = address;
this.jsonrpc = null;

this.application = new Application(this);
Expand Down Expand Up @@ -70,30 +102,18 @@ export const Kodi = class {
*/
async send(method, params) {
if (null === this.jsonrpc) {
let host;
if (null === this.host) {
let address;
if (null === this.address) {
const config = await browser.storage.local.get([
"server-list",
"server-active",
]);
host = config["server-list"][config["server-active"]].host;
address = config["server-list"][config["server-active"]]
.address;
} else {
host = this.host;
}
if ("" === host) {
throw new PebkacError("unconfigured");
}
let url;
try {
url = new URL("ws://" + host + ":9090/jsonrpc");
} catch {
throw new PebkacError("badHost", host);
}
// Si l'URL est incorrecte (car le nom de domaine a été corrigé
// par le constructeur).
if (url.hostname !== host.toLowerCase()) {
throw new PebkacError("badHost", host);
address = this.address;
}
const url = Kodi.build(address);

try {
this.jsonrpc = await JSONRPC.open(url);
Expand All @@ -106,7 +126,7 @@ export const Kodi = class {
this.playlist.handleNotification(event);
});
} catch {
throw new PebkacError("notFound", host);
throw new PebkacError("notFound", address);
}
}

Expand Down
6 changes: 6 additions & 0 deletions src/options/img/help.svg
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
19 changes: 12 additions & 7 deletions src/options/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@ <h3 data-i18n-textcontent="server-title"></h3>
</label>
</summary>
<div>
<label data-i18n-textcontent="server-host">
{}
<input name="host_0" type="text" required autocomplete="off"
spellcheck="false" data-i18n-placeholder="server-host" />
<label data-i18n-textcontent="server-address"
data-i18n-title="server-address">
{} <sup><object data="img/help.svg"></object></sup>
<input name="address_0" type="text" required autocomplete="off"
spellcheck="false" data-i18n-placeholder="server-address" />
</label>
</div>
</details>
Expand All @@ -35,7 +36,10 @@ <h3 data-i18n-textcontent="server-title"></h3>
<table>
<thead>
<tr>
<th data-i18n-textcontent="server-hosts"></th>
<th data-i18n-textcontent="server-addresses"
data-i18n-title="server-address">
{} <sup><object data="img/help.svg"></object></sup>
</th>
<th data-i18n-textcontent="server-names"></th>
<th></th>
</tr>
Expand All @@ -53,8 +57,9 @@ <h3 data-i18n-textcontent="server-title"></h3>
<template>
<tr>
<td>
<input name="host_" type="text" required autocomplete="off"
spellcheck="false" data-i18n-placeholder="server-host" />
<input name="address_" type="text" required autocomplete="off"
spellcheck="false"
data-i18n-placeholder="server-address" />
</td>
<td>
<input name="name_" type="text" required autocomplete="off"
Expand Down

0 comments on commit 3ad60d5

Please sign in to comment.