Search / static /reader-contract.js
vomebook's picture
Add audio and video playback
dbfea4d verified
Raw
History Blame Contribute Delete
2.69 kB
(function (root) {
"use strict";
const ReaderMode = Object.freeze({
UNSUPPORTED: 0,
ORIGINAL: 1,
CONVERTED: 2,
PENDING: 3,
FAILED: 4,
});
const modes = Object.freeze({
pdf: "pdf", epub: "epub", docx: "docx", html: "html", htm: "html", txt: "text", md: "markdown", markdown: "markdown",
jpg: "image", jpeg: "image", png: "image", gif: "image", bmp: "image", webp: "image",
mp3: "audio", wav: "audio", m4a: "audio", flac: "audio", mpga: "audio", audio: "audio",
mp4: "video", mov: "video", video: "video",
});
const articleExtensions = Object.freeze(Object.keys(modes));
function capability(extension) {
const normalized = String(extension || "").toLowerCase();
return Object.freeze({
extension: normalized,
mode: modes[normalized] || null,
readerMode: modes[normalized] ? ReaderMode.ORIGINAL : ReaderMode.UNSUPPORTED,
article: !!modes[normalized],
});
}
function clampNumber(value, minimum, maximum, fallback) {
const numeric = Math.round(Number(value));
return Number.isFinite(numeric) ? Math.min(maximum, Math.max(minimum, numeric)) : fallback;
}
function readerUrl(record, basePath) {
const source = record && (record.ReaderLink || record.readerLink || record.Link || record.link);
const readerExtension = record && (record.ReaderExtension || record.readerExtension || record.Extension || record.extension);
if (!source || capability(readerExtension).readerMode === ReaderMode.UNSUPPORTED) return "";
const params = new URLSearchParams({
url: source,
title: (record.File || record.name || "") + ((record.Extension || record.extension) ? "." + (record.Extension || record.extension) : ""),
ext: readerExtension || "",
});
if (record.DownloadLink || record.downloadLink) params.set("download", record.DownloadLink || record.downloadLink);
if (record.OcrUrl || record.ocrUrl) params.set("ocr", record.OcrUrl || record.ocrUrl);
if (record.ReturnUrl || record.returnUrl) params.set("return", record.ReturnUrl || record.returnUrl);
const repo = String(record.Repo || record.repo || "").split("/").pop();
const folder = Array.isArray(record.Folder || record.folder) ? (record.Folder || record.folder).join("/") : "";
if (repo) params.set("path", repo + (folder ? "/" + folder : ""));
if (record.FolderUrl || record.folderUrl) params.set("folder_url", record.FolderUrl || record.folderUrl);
return (basePath || "/reader.html") + "?" + params.toString();
}
root.VoiceOfMLReader = Object.freeze({ ReaderMode, articleExtensions, capability, clampNumber, readerUrl });
})(typeof self !== "undefined" ? self : window);