chapters-converter/public/index.html
2023-12-15 20:44:19 +01:00

108 lines
2.3 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>Podcast chapter converter</title>
<style>
#container {
display: flex;
align-items: center;
}
.hidden {
display: none;
}
</style>
</head>
<body>
<script src="/bundle.js"></script>
<script>
function convert() {
output.value = window.encoders[to.value](
shift_timestamps(
window.parsers[from.value](input.value),
parseInt(offset.value)
)
);
}
function download(data, filename, type) {
var file = new Blob([data], { type: type });
var a = document.createElement("a"),
url = URL.createObjectURL(file);
a.href = url;
a.download = filename;
document.body.appendChild(a);
a.click();
setTimeout(function () {
document.body.removeChild(a);
window.URL.revokeObjectURL(url);
}, 0);
}
function download_output() {
download(
output.value,
"chapters." + to.value,
"application/json"
);
}
function fromchange() {
offset.value = 0;
if (from.value == "youtube") {
offset_container.classList.remove("hidden");
} else {
offset_container.classList.add("hidden");
}
}
</script>
<h1>Convert podcast chapters</h1>
<div id="container">
<div>
<label>
From:
<select id="from" onchange="fromchange()">
<option value="audacity">Audacity labels export</option>
<option value="youtube">
Youtube plaintext timestamps
</option>
</select>
</label>
<div id="offset_container" class="hidden">
<label>
Offset (to compensate for video intro not present on
audio):<br />
<input type="number" id="offset" size="6" />s
</label>
</div>
<div>
<textarea rows="40" cols="60" id="input"></textarea>
</div>
</div>
<div>
<button onClick="convert()">Convert→</button>
</div>
<div>
<label>
To:
<select id="to" onchange="convert()">
<option value="json">
JSON Chapters (for Castapod)
</option>
<option value="youtube">
Youtube plaintext timestamps
</option>
</select>
</label>
<button onclick="download_output()">download</button>
<div>
<textarea rows="40" cols="60" id="output"></textarea>
</div>
</div>
</div>
<script>
fromchange();
</script>
</body>
</html>