Files
lidify/frontend/features/audiobook/hooks/useAudiobookData.ts
2025-12-25 18:58:06 -06:00

60 lines
1.6 KiB
TypeScript

"use client";
import { useParams } from "next/navigation";
import { useAudiobookQuery } from "@/hooks/useQueries";
import { api } from "@/lib/api";
export function useAudiobookData() {
const params = useParams();
const audiobookId = params.id as string;
const { data: audiobook, isLoading, refetch } = useAudiobookQuery(audiobookId);
// Calculate hero image for color extraction
const heroImage = audiobook?.coverUrl
? api.getCoverArtUrl(audiobook.coverUrl, 1200)
: null;
// Extract metadata from audioFiles
const getMetadata = () => {
if (!audiobook) return null;
if (!audiobook.audioFiles?.[0]?.metaTags) {
return {
narrator: audiobook.narrator || null,
genre: null,
publishedYear: null,
description: audiobook.description || null,
};
}
const metaTags = audiobook.audioFiles[0].metaTags;
// Extract narrator from description or tagComment
let narrator = audiobook.narrator;
if (!narrator || narrator.trim() === "") {
const desc = audiobook.description || metaTags.tagComment || "";
const narratorMatch = desc.match(/(?:Read by|Narrated by):\s*(.+)/i);
if (narratorMatch) {
narrator = narratorMatch[1].trim();
}
}
return {
narrator: narrator || null,
genre: metaTags.tagGenre || null,
publishedYear: metaTags.tagDate || null,
description: audiobook.description || metaTags.tagComment || null,
};
};
return {
audiobookId,
audiobook,
isLoading,
refetch,
heroImage,
metadata: getMetadata(),
};
}