APIキーを入力するオプションの実装
This commit is contained in:
parent
177a98d312
commit
b38b39dab3
|
|
@ -30,8 +30,16 @@ async function build(browser) {
|
||||||
outfile: `${outdir}/injected/page-script.js`,
|
outfile: `${outdir}/injected/page-script.js`,
|
||||||
format: "iife",
|
format: "iife",
|
||||||
}),
|
}),
|
||||||
|
esbuild.build({
|
||||||
|
...common,
|
||||||
|
entryPoints: ["src/options/options.ts"],
|
||||||
|
outfile: `${outdir}/options/options.js`,
|
||||||
|
format: "iife",
|
||||||
|
}),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
cpSync("src/options/options.html", `${outdir}/options/options.html`);
|
||||||
|
|
||||||
cpSync(`manifest.${browser}.json`, `${outdir}/manifest.json`);
|
cpSync(`manifest.${browser}.json`, `${outdir}/manifest.json`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"description": "Extract and work with YouTube playlist data",
|
"description": "Extract and work with YouTube playlist data",
|
||||||
"permissions": ["storage"],
|
"permissions": ["storage"],
|
||||||
"host_permissions": ["https://www.googleapis.com/*"],
|
|
||||||
"background": {
|
"background": {
|
||||||
"service_worker": "background/service-worker.js"
|
"service_worker": "background/service-worker.js"
|
||||||
},
|
},
|
||||||
|
|
@ -15,6 +14,13 @@
|
||||||
"run_at": "document_idle"
|
"run_at": "document_idle"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"action": {
|
||||||
|
"default_popup": "options/options.html"
|
||||||
|
},
|
||||||
|
"options_ui": {
|
||||||
|
"page": "options/options.html",
|
||||||
|
"open_in_tab": false
|
||||||
|
},
|
||||||
"web_accessible_resources": [
|
"web_accessible_resources": [
|
||||||
{
|
{
|
||||||
"resources": ["injected/page-script.js"],
|
"resources": ["injected/page-script.js"],
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
"version": "0.1.1",
|
"version": "0.1.1",
|
||||||
"description": "Extract and work with YouTube playlist data",
|
"description": "Extract and work with YouTube playlist data",
|
||||||
"permissions": ["storage"],
|
"permissions": ["storage"],
|
||||||
"host_permissions": ["https://www.googleapis.com/*"],
|
|
||||||
"background": {
|
"background": {
|
||||||
"scripts": ["background/service-worker.js"]
|
"scripts": ["background/service-worker.js"]
|
||||||
},
|
},
|
||||||
|
|
@ -15,6 +14,13 @@
|
||||||
"run_at": "document_idle"
|
"run_at": "document_idle"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"action": {
|
||||||
|
"default_popup": "options/options.html"
|
||||||
|
},
|
||||||
|
"options_ui": {
|
||||||
|
"page": "options/options.html",
|
||||||
|
"open_in_tab": false
|
||||||
|
},
|
||||||
"web_accessible_resources": [
|
"web_accessible_resources": [
|
||||||
{
|
{
|
||||||
"resources": ["injected/page-script.js"],
|
"resources": ["injected/page-script.js"],
|
||||||
|
|
|
||||||
87
src/options/options.html
Normal file
87
src/options/options.html
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: "Roboto", "Arial", sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 16px;
|
||||||
|
min-width: 360px;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
h2 {
|
||||||
|
font-size: 16px;
|
||||||
|
margin: 0 0 12px;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
display: block;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #606060;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
input[type="text"] {
|
||||||
|
width: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 8px 10px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 6px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-family: "Roboto Mono", monospace;
|
||||||
|
}
|
||||||
|
.hint {
|
||||||
|
font-size: 11px;
|
||||||
|
color: #999;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
.actions {
|
||||||
|
margin-top: 12px;
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
padding: 6px 16px;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-radius: 16px;
|
||||||
|
background: #fff;
|
||||||
|
font-size: 13px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
background: #f2f2f2;
|
||||||
|
}
|
||||||
|
button.primary {
|
||||||
|
background: #065fd4;
|
||||||
|
color: #fff;
|
||||||
|
border-color: #065fd4;
|
||||||
|
}
|
||||||
|
button.primary:hover {
|
||||||
|
background: #0554b8;
|
||||||
|
}
|
||||||
|
.status {
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 8px;
|
||||||
|
color: #1a8a1a;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h2>YT Playlist Features</h2>
|
||||||
|
<label for="apiKey">YouTube Data API Key</label>
|
||||||
|
<input type="text" id="apiKey" placeholder="..." />
|
||||||
|
<div class="hint">
|
||||||
|
Leave blank to use the default key.
|
||||||
|
<a
|
||||||
|
href="https://console.cloud.google.com/apis/credentials"
|
||||||
|
target="_blank"
|
||||||
|
>Get your own key</a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
<div class="actions">
|
||||||
|
<button class="primary" id="save">Save</button>
|
||||||
|
<button id="clear">Clear</button>
|
||||||
|
</div>
|
||||||
|
<div class="status" id="status"></div>
|
||||||
|
<script src="options.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
32
src/options/options.ts
Normal file
32
src/options/options.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
import browser from "webextension-polyfill";
|
||||||
|
|
||||||
|
const input = document.getElementById("apiKey") as HTMLInputElement;
|
||||||
|
const saveBtn = document.getElementById("save") as HTMLButtonElement;
|
||||||
|
const clearBtn = document.getElementById("clear") as HTMLButtonElement;
|
||||||
|
const status = document.getElementById("status") as HTMLDivElement;
|
||||||
|
|
||||||
|
function flash(text: string) {
|
||||||
|
status.textContent = text;
|
||||||
|
setTimeout(() => { status.textContent = ""; }, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load
|
||||||
|
browser.storage.sync.get("apiKey").then((result) => {
|
||||||
|
input.value = (result.apiKey as string) || "";
|
||||||
|
});
|
||||||
|
|
||||||
|
// Save
|
||||||
|
saveBtn.addEventListener("click", () => {
|
||||||
|
const key = input.value.trim();
|
||||||
|
if (key) {
|
||||||
|
browser.storage.sync.set({ apiKey: key }).then(() => flash("Saved"));
|
||||||
|
} else {
|
||||||
|
browser.storage.sync.remove("apiKey").then(() => flash("Using default key"));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Clear
|
||||||
|
clearBtn.addEventListener("click", () => {
|
||||||
|
input.value = "";
|
||||||
|
browser.storage.sync.remove("apiKey").then(() => flash("Cleared"));
|
||||||
|
});
|
||||||
Loading…
Reference in New Issue
Block a user