60 lines
1.6 KiB
TypeScript
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(),
|
|
};
|
|
}
|