Update Audiobookshelf API key instructions and improve chapter merging

Replaces outdated Audiobookshelf API token instructions with new API key generation steps across documentation and UI. Enhances chapter merging logic to detect and handle book titles in metadata, prioritizing filename extraction for chapter names, and updates logging and documentation to reflect these changes. Adds ASIN copy-to-clipboard feature in AudiobookDetailsModal.
This commit is contained in:
kikootwo
2026-01-14 12:17:41 -05:00
parent 307b63fab4
commit b3f89d67bb
8 changed files with 175 additions and 36 deletions
@@ -43,6 +43,7 @@ export function AudiobookDetailsModal({
const [requestError, setRequestError] = useState<string | null>(null);
const [mounted, setMounted] = useState(false);
const [showInteractiveSearch, setShowInteractiveSearch] = useState(false);
const [asinCopied, setAsinCopied] = useState(false);
useEffect(() => {
setMounted(true);
@@ -123,6 +124,16 @@ export function AudiobookDetailsModal({
}
};
const handleCopyAsin = async () => {
try {
await navigator.clipboard.writeText(asin);
setAsinCopied(true);
setTimeout(() => setAsinCopied(false), 2000);
} catch (err) {
console.error('Failed to copy ASIN:', err);
}
};
if (!isOpen || !mounted) return null;
const modalContent = (
@@ -291,6 +302,40 @@ export function AudiobookDetailsModal({
</div>
)}
{/* ASIN */}
<div>
<p className="text-sm text-gray-500 dark:text-gray-400 mb-1">ASIN</p>
<button
onClick={handleCopyAsin}
className="group flex items-center gap-2 text-gray-700 dark:text-gray-300 hover:text-blue-600 dark:hover:text-blue-400 transition-colors"
title="Click to copy ASIN"
>
<span className="font-mono text-sm">{asin}</span>
<svg
className="w-4 h-4 flex-shrink-0"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
>
{asinCopied ? (
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M5 13l4 4L19 7"
/>
) : (
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"
/>
)}
</svg>
</button>
</div>
{/* Availability Status */}
{isAvailable && (
<div>