chore: update project context
This commit is contained in:
+147
-2
@@ -64,7 +64,12 @@ knowledgebase/
|
|||||||
│ ├── disciples/ → 4,747 initiated disciples directory
|
│ ├── disciples/ → 4,747 initiated disciples directory
|
||||||
│ │ ├── page.tsx → Disciples browser (letter nav, suffix filter, search, sort, pagination)
|
│ │ ├── page.tsx → Disciples browser (letter nav, suffix filter, search, sort, pagination)
|
||||||
│ │ └── disciples-browser.tsx → Client component
|
│ │ └── disciples-browser.tsx → Client component
|
||||||
│ ├── transcriptions/page.tsx → Coming Soon page
|
│ ├── transcriptions/ → 3,787 transcriptions (lectures, conversations, philosophy, dictations)
|
||||||
|
│ │ ├── page.tsx → Browse by year / place / type (3 views)
|
||||||
|
│ │ ├── year/[year]/page.tsx → Year listing, grouped by month
|
||||||
|
│ │ ├── place/[place]/page.tsx → Place listing
|
||||||
|
│ │ ├── type/[type]/page.tsx → Type listing (lecture/conversation), year sidebar
|
||||||
|
│ │ └── [slug]/page.tsx → Individual transcription reading page
|
||||||
│ └── api/
|
│ └── api/
|
||||||
│ ├── og/route.tsx → Dynamic OG image generator (Noto Sans, Prabhupāda image)
|
│ ├── og/route.tsx → Dynamic OG image generator (Noto Sans, Prabhupāda image)
|
||||||
│ ├── books/ → Book/verse API routes
|
│ ├── books/ → Book/verse API routes
|
||||||
@@ -83,6 +88,11 @@ knowledgebase/
|
|||||||
│ ├── reading-settings.tsx → Theme/font/size/justify accessibility panel
|
│ ├── reading-settings.tsx → Theme/font/size/justify accessibility panel
|
||||||
│ ├── mobile-nav.tsx → Left-slide drawer for mobile sidebar navigation
|
│ ├── mobile-nav.tsx → Left-slide drawer for mobile sidebar navigation
|
||||||
│ ├── site-footer.tsx → Global footer (About + Home links)
|
│ ├── site-footer.tsx → Global footer (About + Home links)
|
||||||
|
│ ├── audio-player/ → Site-wide floating audio player
|
||||||
|
│ │ ├── audio-context.tsx → React context + provider, manages <audio> element
|
||||||
|
│ │ ├── floating-player.tsx → Floating player UI (desktop bar / mobile pill)
|
||||||
|
│ │ ├── audio-wave.tsx → Reusable animated audio wave bars
|
||||||
|
│ │ └── index.ts → Barrel exports
|
||||||
│ ├── logo.tsx → Theme-aware logo component
|
│ ├── logo.tsx → Theme-aware logo component
|
||||||
│ └── theme-provider.tsx → next-themes wrapper
|
│ └── theme-provider.tsx → next-themes wrapper
|
||||||
├── lib/
|
├── lib/
|
||||||
@@ -94,6 +104,7 @@ knowledgebase/
|
|||||||
│ ├── source-reference.ts → Source reference from URL (for copy attribution)
|
│ ├── source-reference.ts → Source reference from URL (for copy attribution)
|
||||||
│ ├── disciples.ts → Disciples data access (by letter, place, year, search)
|
│ ├── disciples.ts → Disciples data access (by letter, place, year, search)
|
||||||
│ ├── letters.ts → Letters data access (by year, recipient, location)
|
│ ├── letters.ts → Letters data access (by year, recipient, location)
|
||||||
|
│ ├── transcriptions.ts → Transcriptions data access (reads from Prisma/MongoDB)
|
||||||
│ ├── utils.ts → cn() helper
|
│ ├── utils.ts → cn() helper
|
||||||
│ ├── [book].ts → Per-book data access layers (nod, tlc, iso, noi, ej, ek, etc.)
|
│ ├── [book].ts → Per-book data access layers (nod, tlc, iso, noi, ej, ek, etc.)
|
||||||
│ ├── other-documents.ts → Other Documents data access
|
│ ├── other-documents.ts → Other Documents data access
|
||||||
@@ -313,6 +324,39 @@ model Disciple {
|
|||||||
@@index([tags])
|
@@index([tags])
|
||||||
@@map("disciples")
|
@@map("disciples")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ContentBlock {
|
||||||
|
text String
|
||||||
|
format String @default("paragraph")
|
||||||
|
alignment String @default("left")
|
||||||
|
speaker String?
|
||||||
|
}
|
||||||
|
|
||||||
|
model Transcription {
|
||||||
|
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||||
|
slug String @unique
|
||||||
|
name String
|
||||||
|
type String // "lecture" | "conversation"
|
||||||
|
date String?
|
||||||
|
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?
|
||||||
|
audioUrl String?
|
||||||
|
isPublished Boolean @default(false)
|
||||||
|
notes String?
|
||||||
|
|
||||||
|
@@map("transcriptions")
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -463,11 +507,27 @@ Seed script: `npx tsx scripts/seed-disciples.ts`
|
|||||||
- Multi-recipient groups are split by `,`, `;`, ` and `, ` & `
|
- Multi-recipient groups are split by `,`, `;`, ` and `, ` & `
|
||||||
- Trailing punctuation (`:`, `,`, `.`) cleaned from names
|
- Trailing punctuation (`:`, `,`, `.`) cleaned from names
|
||||||
|
|
||||||
|
### Transcriptions (stored in `transcriptions` collection)
|
||||||
|
|
||||||
|
3,787 transcriptions of Śrīla Prabhupāda's lectures and conversations (1966–1977), plus 59 philosophy discussions and 12 SB dictations.
|
||||||
|
|
||||||
|
- **Lectures** (2,179): Bhagavad-gītā, Śrīmad-Bhāgavatam, Caitanya-caritāmṛta, Nectar of Devotion, Īśopaniṣad, Brahma-saṁhitā, and general lectures
|
||||||
|
- **Conversations** (1,537): Morning walks, room conversations, interviews, press conferences, initiations
|
||||||
|
- **Philosophy Discussions** (59): Western philosophers discussed with Śyāmasundara and Hayagrīva
|
||||||
|
- **SB Dictations** (12): Śrīmad-Bhāgavatam 3rd Canto translation/purport dictations
|
||||||
|
- **Audio**: 99.1% have linked audio recordings from Cloudflare R2 (`audioUrl` field)
|
||||||
|
- **Empty content**: 30 transcriptions (Hindi/Bengali lectures) have no English text but may have audio
|
||||||
|
|
||||||
|
Data layer: `lib/transcriptions.ts` (reads from Prisma/MongoDB, NOT local JSON files)
|
||||||
|
|
||||||
|
Seed script: `cd knowledgebase && npx tsx scripts/seed-transcriptions.ts`
|
||||||
|
|
||||||
### Other
|
### Other
|
||||||
|
|
||||||
| Content | Collection |
|
| Content | Collection |
|
||||||
|---------|-----------|
|
|---------|-----------|
|
||||||
| Glossary (2,749 entries) | `glossary` |
|
| Glossary (2,749 entries) | `glossary` |
|
||||||
|
| Transcriptions (3,787 entries) | `transcriptions` collection |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -582,6 +642,27 @@ IAST transliteration → Devanagari via `indic-transliteration` library. Key fix
|
|||||||
| `/letters/location/Los%20Angeles` | All letters from a specific location |
|
| `/letters/location/Los%20Angeles` | All letters from a specific location |
|
||||||
| `/letters/[slug]` | Individual letter reader with prev/next navigation |
|
| `/letters/[slug]` | Individual letter reader with prev/next navigation |
|
||||||
|
|
||||||
|
### Transcriptions
|
||||||
|
|
||||||
|
```
|
||||||
|
/transcriptions → Browse by year / place / type
|
||||||
|
/transcriptions?view=year → Year grid view
|
||||||
|
/transcriptions?view=place → Place grid view
|
||||||
|
/transcriptions?view=type → Lecture vs Conversation cards
|
||||||
|
/transcriptions/year/[year] → Year listing, grouped by month
|
||||||
|
/transcriptions/place/[place] → Place listing
|
||||||
|
/transcriptions/type/[type] → Type listing (lecture/conversation), year sidebar
|
||||||
|
/transcriptions/[slug] → Individual transcription reading page
|
||||||
|
```
|
||||||
|
|
||||||
|
Each transcription page shows:
|
||||||
|
- Title, type badge (Lecture/Conversation), date, place, reference, duration
|
||||||
|
- Participants list
|
||||||
|
- Play Audio button (links to Cloudflare R2 mp3)
|
||||||
|
- Content blocks: paragraphs with speaker labels, verses (centered italic), quotes (border-left), notes
|
||||||
|
- Prev/next navigation within same year
|
||||||
|
- `?hl=` text highlight sharing support with OG image
|
||||||
|
|
||||||
### Other routes
|
### Other routes
|
||||||
|
|
||||||
| Route | Content |
|
| Route | Content |
|
||||||
@@ -685,6 +766,28 @@ SSR and DS have parent chapters with sub-chapters stored as individual `prose_ch
|
|||||||
- All 104 content pages have `generateMetadata` with contextual fallback descriptions
|
- All 104 content pages have `generateMetadata` with contextual fallback descriptions
|
||||||
- When `?hl=` is present, the actual selected text is extracted from DB content for the OG quote
|
- When `?hl=` is present, the actual selected text is extracted from DB content for the OG quote
|
||||||
|
|
||||||
|
### Audio Player
|
||||||
|
|
||||||
|
A site-wide floating audio player for transcription recordings (and future music library). Built with framer-motion for animations.
|
||||||
|
|
||||||
|
- **Desktop**: Centered floating bar (max-width 680px) with cover image, track info, transport controls (prev/play/next), volume slider, source link, close button
|
||||||
|
- **Mobile**: Auto-minimizes to a floating pill (cover image with circular progress ring and audio wave animation) after 8 seconds of inactivity. Tap to expand. Full player shows two rows: track info row + centered transport controls
|
||||||
|
- **Z-index**: `z-40` — below text selection toolbar (z-80), drawers (z-90), modals (z-100)
|
||||||
|
- **Hidden when selection toolbar is active** on mobile to avoid overlap
|
||||||
|
- **Forced dark surface** (`bg-[#1c1c1e]`) for accessibility contrast regardless of theme
|
||||||
|
- **Keyboard shortcuts**: Space (play/pause), ←/→ (seek ±10s), ↑/↓ (volume), M (mute), Esc (close)
|
||||||
|
- **Progress seeker**: 8px tall bar at top of player, click/drag to seek
|
||||||
|
- **Volume**: Persisted to localStorage. Mobile relies on hardware volume buttons
|
||||||
|
- **framer-motion**: Spring animations for enter/exit, AnimatePresence for minimize/expand transitions, motion.div for audio wave bars
|
||||||
|
|
||||||
|
Components:
|
||||||
|
- `components/audio-player/audio-context.tsx` — React context + provider, manages `<audio>` element
|
||||||
|
- `components/audio-player/floating-player.tsx` — Floating player UI
|
||||||
|
- `components/audio-player/audio-wave.tsx` — Reusable animated audio wave bars
|
||||||
|
- `components/audio-player/index.ts` — Barrel exports
|
||||||
|
|
||||||
|
The `AudioPlayerProvider` wraps the entire app in `layout.tsx`. The `FloatingPlayer` is rendered before `SiteFooter`.
|
||||||
|
|
||||||
### Site Footer
|
### Site Footer
|
||||||
- Global footer on every page with © year, About link, Home link
|
- Global footer on every page with © year, About link, Home link
|
||||||
|
|
||||||
@@ -803,6 +906,42 @@ make run # Build + start Go API on :8080
|
|||||||
|
|
||||||
Glossary is browsed via `/glossary/{letter}` routes (A-Z). Each letter page shows terms grouped by base letter (diacritical variants mapped: Ā→A, Ś→S, Ṛ→R, etc.). Single entry view with prev/next navigation.
|
Glossary is browsed via `/glossary/{letter}` routes (A-Z). Each letter page shows terms grouped by base letter (diacritical variants mapped: Ā→A, Ś→S, Ṛ→R, etc.). Single entry view with prev/next navigation.
|
||||||
|
|
||||||
|
## Transcription JSON Schema
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"slug": "720911sb-los-angeles",
|
||||||
|
"name": "Śrīmad-Bhāgavatam 1.2.6",
|
||||||
|
"type": "lecture",
|
||||||
|
"date": "September 11, 1972",
|
||||||
|
"year": 1972,
|
||||||
|
"month": 9,
|
||||||
|
"day": 11,
|
||||||
|
"place": "Los Angeles",
|
||||||
|
"context": null,
|
||||||
|
"reference": "SB 1.2.6",
|
||||||
|
"durationMinutes": 45,
|
||||||
|
"participants": ["Prabhupāda", "Devotees"],
|
||||||
|
"audioUrl": "https://s3.prabhupadasays.com/sp-audio/...",
|
||||||
|
"content": [
|
||||||
|
{
|
||||||
|
"text": "So Kṛṣṇa consciousness movement...",
|
||||||
|
"format": "paragraph",
|
||||||
|
"alignment": "left",
|
||||||
|
"speaker": "Prabhupāda"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"text": "<i>oṁ namo bhagavate...</i>",
|
||||||
|
"format": "verse",
|
||||||
|
"alignment": "center",
|
||||||
|
"speaker": null
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Content block formats: `"paragraph"` (body text), `"verse"` (centered italic), `"quote"` (translation/purport), `"heading"` (TEXT/TRANSLATION/PURPORT labels), `"note"` (editorial notes).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Known Issues
|
## Known Issues
|
||||||
@@ -817,4 +956,10 @@ Glossary is browsed via `/glossary/{letter}` routes (A-Z). Each letter page show
|
|||||||
|
|
||||||
5. **CSS zoom for font scaling**: `zoom` property works in Chrome/Safari/Edge but may not work in older Firefox (< 126). A `transform: scale()` fallback is provided via `@supports not (zoom: 1.1)`.
|
5. **CSS zoom for font scaling**: `zoom` property works in Chrome/Safari/Edge but may not work in older Firefox (< 126). A `transform: scale()` fallback is provided via `@supports not (zoom: 1.1)`.
|
||||||
|
|
||||||
6. **Password protection requires ACCESS_KEY at runtime**: The `PasswordGate` component checks the server at runtime via `/api/verify-access`. The env var must be available when the server is running, not just at build time.
|
6. **Password protection requires ACCESS_KEY at runtime**: The `PasswordGate` component checks the server at runtime via `/api/verify-access`. The env var must be available when the server is running, not just at build time.
|
||||||
|
|
||||||
|
7. **Transcription BSON fallback** — 1 document stores content as `contentJson` string due to BSON wire protocol limits; `getTranscription()` transparently parses it
|
||||||
|
|
||||||
|
8. **Empty transcriptions** — 30 entries have no English text content (Hindi/Bengali recordings); the UI shows "No transcription available" with the audio player still accessible
|
||||||
|
|
||||||
|
9. **Audio player z-index** — Player is hidden when text selection toolbar is active on mobile to avoid overlap
|
||||||
Reference in New Issue
Block a user