feat: add transcriptions collection
This commit is contained in:
@@ -19,6 +19,7 @@ import {
|
|||||||
Newspaper,
|
Newspaper,
|
||||||
Mail,
|
Mail,
|
||||||
Users,
|
Users,
|
||||||
|
Mic,
|
||||||
} from "lucide-react";
|
} from "lucide-react";
|
||||||
|
|
||||||
const allowRtf = process.env.ALLOW_RTF === "true";
|
const allowRtf = process.env.ALLOW_RTF === "true";
|
||||||
@@ -141,6 +142,35 @@ export default function Home() {
|
|||||||
</Card>
|
</Card>
|
||||||
</Link>
|
</Link>
|
||||||
|
|
||||||
|
{/* Transcriptions */}
|
||||||
|
<Link href="/transcriptions" className="block group h-full">
|
||||||
|
<Card className="h-full transition-all group-hover:shadow-md group-hover:ring-foreground/20">
|
||||||
|
<CardHeader>
|
||||||
|
<div className="flex items-center gap-3">
|
||||||
|
<div className="flex items-center justify-center size-10 rounded-lg bg-primary/10 text-primary">
|
||||||
|
<Mic className="size-5" />
|
||||||
|
</div>
|
||||||
|
<div className="flex-1 min-w-0">
|
||||||
|
<CardTitle className="text-xl font-bold">
|
||||||
|
Transcriptions
|
||||||
|
</CardTitle>
|
||||||
|
<CardDescription>
|
||||||
|
Lectures & conversations
|
||||||
|
</CardDescription>
|
||||||
|
</div>
|
||||||
|
<Badge variant="secondary">Coming Soon</Badge>
|
||||||
|
</div>
|
||||||
|
</CardHeader>
|
||||||
|
<CardContent>
|
||||||
|
<p className="text-sm text-muted-foreground">
|
||||||
|
Transcriptions of Śrīla Prabhupāda's lectures, morning
|
||||||
|
walks, room conversations, and dialogues — the living voice of
|
||||||
|
the Founder-Ācārya preserved in text.
|
||||||
|
</p>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
</Link>
|
||||||
|
|
||||||
{/* Disciples */}
|
{/* Disciples */}
|
||||||
<Link href="/disciples" className="block group h-full">
|
<Link href="/disciples" className="block group h-full">
|
||||||
<Card className="h-full transition-all group-hover:shadow-md group-hover:ring-foreground/20">
|
<Card className="h-full transition-all group-hover:shadow-md group-hover:ring-foreground/20">
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
import type { Metadata } from "next";
|
||||||
|
import Link from "next/link";
|
||||||
|
import { PageHeader } from "@/components/page-header";
|
||||||
|
import { buildOgMeta } from "@/lib/og";
|
||||||
|
import { Mic, Clock } from "lucide-react";
|
||||||
|
|
||||||
|
export function generateMetadata(): Metadata {
|
||||||
|
return buildOgMeta({
|
||||||
|
title: "Transcriptions",
|
||||||
|
detail: "Lectures & conversations",
|
||||||
|
quote:
|
||||||
|
"Transcriptions of Śrīla Prabhupāda's lectures, morning walks, room conversations, and dialogues — the living voice of the Founder-Ācārya preserved in text.",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function TranscriptionsPage() {
|
||||||
|
return (
|
||||||
|
<div className="min-h-screen bg-background">
|
||||||
|
<PageHeader>
|
||||||
|
<Link
|
||||||
|
href="/"
|
||||||
|
className="text-sm text-muted-foreground hover:text-foreground transition-colors"
|
||||||
|
>
|
||||||
|
← Home
|
||||||
|
</Link>
|
||||||
|
<h1 className="mt-3 text-3xl font-bold text-foreground">
|
||||||
|
Transcriptions
|
||||||
|
</h1>
|
||||||
|
<p className="mt-1 text-muted-foreground">
|
||||||
|
Lectures & conversations of Śrīla Prabhupāda
|
||||||
|
</p>
|
||||||
|
</PageHeader>
|
||||||
|
|
||||||
|
<main className="max-w-5xl mx-auto px-6 py-8">
|
||||||
|
<div className="flex flex-col items-center justify-center py-24 text-center">
|
||||||
|
<div className="flex items-center justify-center size-20 rounded-2xl bg-primary/10 text-primary mb-6">
|
||||||
|
<Mic className="size-10" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 className="text-2xl font-bold text-foreground mb-2">
|
||||||
|
Coming Soon
|
||||||
|
</h2>
|
||||||
|
|
||||||
|
<p className="text-muted-foreground max-w-md mb-8">
|
||||||
|
We are working on indexing thousands of transcriptions of Śrīla
|
||||||
|
Prabhupāda's lectures, morning walks, room conversations, and
|
||||||
|
dialogues into our database. This section will be available shortly.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div className="flex items-center gap-2 text-sm text-muted-foreground/60">
|
||||||
|
<Clock className="size-4" />
|
||||||
|
<span>Under active development</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -84,6 +84,8 @@ const CONTENT_TYPE_DESCRIPTIONS: Record<string, string> = {
|
|||||||
"Back to Godhead — the magazine founded by Śrīla Prabhupāda in 1944 to present the timeless science of Kṛṣṇa consciousness.",
|
"Back to Godhead — the magazine founded by Śrīla Prabhupāda in 1944 to present the timeless science of Kṛṣṇa consciousness.",
|
||||||
"other-documents":
|
"other-documents":
|
||||||
"Writings and analyses by His Divine Grace A.C. Bhaktivedanta Swami Prabhupāda.",
|
"Writings and analyses by His Divine Grace A.C. Bhaktivedanta Swami Prabhupāda.",
|
||||||
|
transcriptions:
|
||||||
|
"Transcriptions of Śrīla Prabhupāda's lectures, morning walks, room conversations, and dialogues — the living voice of the Founder-Ācārya preserved in text.",
|
||||||
};
|
};
|
||||||
|
|
||||||
function getFallbackQuote(title: string, code?: string): string {
|
function getFallbackQuote(title: string, code?: string): string {
|
||||||
@@ -263,6 +265,24 @@ export function ogForOtherDocument(docTitle: string, chapterTitle?: string) {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** OG metadata for a transcription. */
|
||||||
|
export function ogForTranscription(name: string, meta?: string) {
|
||||||
|
return buildOgMeta({
|
||||||
|
title: name,
|
||||||
|
detail: meta || undefined,
|
||||||
|
quote: CONTENT_TYPE_DESCRIPTIONS.transcriptions,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** OG metadata for the transcriptions index. */
|
||||||
|
export function ogForTranscriptions() {
|
||||||
|
return buildOgMeta({
|
||||||
|
title: "Transcriptions",
|
||||||
|
detail: "Lectures & conversations",
|
||||||
|
quote: CONTENT_TYPE_DESCRIPTIONS.transcriptions,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** OG metadata for the disciples directory. */
|
/** OG metadata for the disciples directory. */
|
||||||
export function ogForDisciples() {
|
export function ogForDisciples() {
|
||||||
return buildOgMeta({
|
return buildOgMeta({
|
||||||
|
|||||||
@@ -324,3 +324,74 @@ model Disciple {
|
|||||||
@@index([tags])
|
@@index([tags])
|
||||||
@@map("disciples")
|
@@map("disciples")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// ContentBlock — embedded document for rich text content within transcriptions
|
||||||
|
//
|
||||||
|
// text: the actual text content (may contain inline HTML for bold/italic)
|
||||||
|
// format: formatting hint — "paragraph" | "heading" | "quote" | "verse" | "note"
|
||||||
|
// alignment: text alignment — "left" | "center" | "right" (default: left)
|
||||||
|
// speaker: who is speaking this block (for dialogues — e.g., "Prabhupāda", "Devotee")
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
type ContentBlock {
|
||||||
|
text String
|
||||||
|
format String @default("paragraph")
|
||||||
|
alignment String @default("left")
|
||||||
|
speaker String?
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
// Transcription — lectures and conversations of Śrīla Prabhupāda
|
||||||
|
//
|
||||||
|
// slug: URL-friendly unique identifier (e.g., "720911-lecture-los-angeles")
|
||||||
|
// name: display title (e.g., "Lecture on Bhagavad-gītā 2.13")
|
||||||
|
// type: "lecture" | "conversation"
|
||||||
|
// date: date of the transcription
|
||||||
|
// year: extracted year for filtering/grouping
|
||||||
|
// month: extracted month (1-12) for filtering
|
||||||
|
// day: extracted day for filtering
|
||||||
|
// place: location where it was delivered (e.g., "Los Angeles", "Vṛndāvana")
|
||||||
|
// context: additional context (e.g., "Morning Walk", "Room Conversation", "Arrival Address")
|
||||||
|
// reference: scripture reference if applicable (e.g., "BG 2.13", "SB 1.2.6")
|
||||||
|
// summary: brief description of the content (for OG images, search results)
|
||||||
|
// content: array of ContentBlock embedded documents (the actual transcription)
|
||||||
|
// tags: array of tags for categorization (e.g., ["science", "reincarnation", "guru"])
|
||||||
|
// participants: array of named participants (e.g., ["Prabhupāda", "Bob Cohen", "Śyāmasundara"])
|
||||||
|
// language: primary language of the transcription (default: "en")
|
||||||
|
// source: origin of the transcription (e.g., "Vedabase", "BBT Archives")
|
||||||
|
// durationMinutes: approximate duration in minutes (if known)
|
||||||
|
// isPublished: whether the transcription is ready for public display
|
||||||
|
// notes: internal editorial notes (not shown in UI)
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
model Transcription {
|
||||||
|
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||||
|
slug String @unique
|
||||||
|
name String
|
||||||
|
type String // "lecture" | "conversation"
|
||||||
|
date String? // date as written (e.g., "September 11, 1972")
|
||||||
|
year Int?
|
||||||
|
month Int?
|
||||||
|
day Int?
|
||||||
|
place String?
|
||||||
|
context String?
|
||||||
|
reference String?
|
||||||
|
summary String?
|
||||||
|
content ContentBlock[]
|
||||||
|
tags String[]
|
||||||
|
participants String[]
|
||||||
|
language String @default("en")
|
||||||
|
source String?
|
||||||
|
durationMinutes Int?
|
||||||
|
isPublished Boolean @default(false)
|
||||||
|
notes String?
|
||||||
|
|
||||||
|
@@index([type])
|
||||||
|
@@index([year])
|
||||||
|
@@index([year, month])
|
||||||
|
@@index([place])
|
||||||
|
@@index([tags])
|
||||||
|
@@index([reference])
|
||||||
|
@@index([participants])
|
||||||
|
@@index([isPublished])
|
||||||
|
@@map("transcriptions")
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user