import { createSignal, createEffect, onMount, For, Show } from 'solid-js'; interface Transcript { playlist: string; channel: string; filename: string; path: string; size: number; modified: string; } const API_URL = 'http://localhost:8000'; export default function TranscriptViewer() { const [transcripts, setTranscripts] = createSignal([]); const [selectedTranscript, setSelectedTranscript] = createSignal(null); const [transcriptContent, setTranscriptContent] = createSignal(''); const [searchQuery, setSearchQuery] = createSignal(''); const [filteredTranscripts, setFilteredTranscripts] = createSignal([]); const [isLoading, setIsLoading] = createSignal(false); onMount(() => { fetchTranscripts(); }); createEffect(() => { const query = searchQuery().toLowerCase(); if (query) { setFilteredTranscripts( transcripts().filter( (t) => t.filename.toLowerCase().includes(query) || t.channel.toLowerCase().includes(query) || t.playlist.toLowerCase().includes(query) ) ); } else { setFilteredTranscripts(transcripts()); } }); const fetchTranscripts = async () => { try { const response = await fetch(`${API_URL}/api/transcripts`); const data = await response.json(); setTranscripts(data); setFilteredTranscripts(data); } catch (error) { console.error('Error fetching transcripts:', error); } }; const loadTranscript = async (transcript: Transcript) => { setIsLoading(true); setSelectedTranscript(transcript); try { const response = await fetch(`${API_URL}/api/transcript/${transcript.path}`); const content = await response.text(); setTranscriptContent(content); } catch (error) { console.error('Error loading transcript:', error); setTranscriptContent('Fehler beim Laden des Transkripts'); } setIsLoading(false); }; const downloadTranscript = (transcript: Transcript) => { const link = document.createElement('a'); link.href = `${API_URL}/api/transcript/${transcript.path}`; link.download = transcript.filename; link.click(); }; const formatFileSize = (bytes: number) => { if (bytes < 1024) return bytes + ' B'; if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB'; return (bytes / (1024 * 1024)).toFixed(1) + ' MB'; }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit', }); }; const getPlaylistIcon = (playlist: string) => { if (playlist.includes('tech')) return '💻'; if (playlist.includes('people')) return '👥'; if (playlist.includes('musik')) return '🎵'; if (playlist.includes('gaming')) return '🎮'; return '📁'; }; return (
{/* Search Bar */}
setSearchQuery(e.currentTarget.value)} placeholder="Transkripte durchsuchen..." class="w-full px-4 py-2 bg-gray-700 text-white rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Transcript List */}

Transkripte ({filteredTranscripts().length})

{(transcript) => (
loadTranscript(transcript)} >
{getPlaylistIcon(transcript.playlist)} {transcript.playlist}

{transcript.filename.replace(/_/g, ' ').replace('.txt', '')}

{transcript.channel} {formatFileSize(transcript.size)}
{formatDate(transcript.modified)}
)}
{filteredTranscripts().length === 0 && (
{searchQuery() ? 'Keine Transkripte gefunden' : 'Noch keine Transkripte vorhanden'}
)}
{/* Transcript Content Viewer */}

Transkript-Inhalt

Lade Transkript...

								{transcriptContent()}
							

Kein Transkript ausgewählt

Wähle ein Transkript aus der Liste aus

{/* Statistics */}
{transcripts().length}
Gesamt
{formatFileSize(transcripts().reduce((sum, t) => sum + t.size, 0))}
Speicher
{[...new Set(transcripts().map((t) => t.channel))].length}
Kanäle
); }