- Added eager selfbot voice connection establishment to ensure video capture works seamlessly during voice channel joins. - Introduced a manual video watch command for selfbots to allow operators to initiate screen recording of other members' streams. - Enhanced video recording functionality to split recordings into segments based on user activity, similar to voice recordings. - Fixed mobile navigation issues by extending the navbar to include all items and ensuring responsive form controls. - Standardized error handling across frontend components to improve user experience during failures.
4.3 KiB
4.3 KiB
Spec: Recordings v2 — transcription, search, filters, leaderboard, sessions
Konteks
4 fitur lanjutan untuk halaman /recordings (dipilih user):
- Tampilkan transkripsi + search by kata kunci
- Filter lanjutan: by channel + rentang tanggal
- Kelompokkan klip jadi "sesi rapat" + autoplay berurutan + export satu sesi
- Leaderboard bicara per user + ringkasan
Fakta terverifikasi (2026-08-30)
voice_recordingskolom: id, user_id, username, avatar_url, guild_id, channel_id, channel_name, filename, size_bytes, download_url, upload_status, upload_error, created_at, uploaded_at, transcription (schemashared/database/schema.ts:246). Index user_id/channel_id/created_at.- Transcription 0/10.640 terisi prod:
AI_VOICE_TRANSCRIPTION_ENABLEDdefault false (config/index.ts:333) & tidak diset di BWS env →transcribeRecording(voiceTranscriber.ts) langsung return null.AI_LLM_BASE_URL+AI_LLM_API_KEYSUDAH dikonfig (Whisper via router GMW). - Transcriber hardcode
language: "en"(voiceTranscriber.ts:34) — salah utk ucapan campur id/en. Utk auto-detect: hapus paramlanguage(Whisper auto-detect jika tidak diberikan). - Backend
RecordingsService.getRecent(recordings.service.ts) TIDAK selecttranscription; SUDAH dukung filterchannelId+userId+cursor; belum dukung date-range & keyword search.RecordingRowinterface juga tak punyatranscription. - Tidak ada kolom
session_id/duration_ms→ sesi grouping = heuristik (channel sama + gap created_at), durasi leaderboard = estimasi dari size_bytes (MP3 128kbps: durasi_s ≈ size_bytes*8/128000).
Keputusan desain
- Aktifkan transkripsi (fondasi): transcriber auto-detect (hapus
language:"en"), set secret BWSAI_VOICE_TRANSCRIPTION_ENABLED=true(dibaca runtime oleh bws-exec saat service start). Rekaman BARU dapat transkripsi. Backfill rekaman lama TIDAK dilakukan (pilih user: fokus baru; file OGG lama kemungkinan besar sudah tidak dipakai). - Backend — perluas
getRecent:- select
transcription(+ interface RecordingRow + FE type) - filter baru:
q(ILIKE on transcription + username),startDate/endDate(created_at range, bigint ms) - endpoint baru
recordings.summary: agregasi per user → {user_id, username, avatar_url, clips, est_duration_s, words, last_at}.wordsdihitung dari transcription (tokenisasi spasi). Return sorted by clips.
- select
- Frontend:
- Kartu: tampilkan transkripsi (collapse/expand line-clamp) + durasi estimasi.
- Toolbar: search box (q), Select channel, date range (start/end), speaker (sudah ada), reset filter.
- Tab/segment "Tape Deck" vs "Leaderboard": leaderboard render summary per user + klik → filter deck by user itu.
- Sesi grouping (deck view): klip di-group jadi sesi bila channel sama & gap antar klip < SESSION_GAP_MS (default 120s). Header sesi (channel, waktu mulai, jumlah klip, total durasi). Autoplay tombol "Play session" & "Export session WAV" (concat klip sesi via lib/audio/wav.ts yg sudah ada).
Perubahan file
Gateway (Tahap 1)
voiceTranscriber.ts: hapus barislanguage: "en".- (secret) set
AI_VOICE_TRANSCRIPTION_ENABLED=truevia bws.
Backend (Tahap 2)
recordings.service.ts: interface + select + getRecent tambah transcription; tambah filter q/startDate/endDate; method getSummary() untuk leaderboard.orpc/router.ts: procedurrecordings.listschema tambah fields; prosedur barurecordings.summary.
Frontend (Tahap 3-5)
lib/types/recording.ts: tambah transcription, est_duration_s opsional, Summary type.lib/api/recordings.ts: list tambah q/startDate/endDate; + summary().hooks/use-recordings.ts: propagate filter baru ke key+call; hook useRecordingsSummary.app/(dashboard)/recordings/view.tsx: toolbar search+channel+date, kartu transkripsi, tab leaderboard, grouping sesi + autoplay + export sesi.
Verification
- tiap tahap: gateway
pnpm build+biome check src/; backendpnpm buildbiome check src/ tests/; FEpnpm build+biome check src/.
- CI Build & Deploy hijau tiap tahap; deploy landing dicek via
systemctl show gmw-<svc>.service --property=ActiveEnterTimestamp. - Tahap 1c: setelah deploy + rekaman baru, cek
SELECT COUNT(*) FROM voice_recordings WHERE transcription IS NOT NULL.