'Keep voice clips' setting (default off). When on, /api/voice/transcribe saves the audio (0600) to the owner-only ZFS subvol at /var/lib/void/ voice-clips (CT 311 mp0, replicated to Z3) + a voice_clips row (migration 029, transcript+metadata in void-db). New clips list/play/delete API + Settings UI. Storage path is configurable (VOICE_CLIPS_DIR). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
27 lines
962 B
JavaScript
27 lines
962 B
JavaScript
import { pool } from '../pool.js';
|
|
|
|
export async function create({ transcript = '', duration_ms = null, bytes = null, mime = null, path }) {
|
|
const { rows } = await pool.query(
|
|
`INSERT INTO voice_clips (transcript, duration_ms, bytes, mime, path)
|
|
VALUES ($1,$2,$3,$4,$5) RETURNING *`,
|
|
[transcript, duration_ms, bytes, mime, path]);
|
|
return rows[0];
|
|
}
|
|
|
|
export async function list(limit = 100) {
|
|
const { rows } = await pool.query(
|
|
`SELECT id, transcript, duration_ms, bytes, mime, created_at
|
|
FROM voice_clips ORDER BY created_at DESC LIMIT $1`, [limit]);
|
|
return rows;
|
|
}
|
|
|
|
export async function get(id) {
|
|
const { rows } = await pool.query(`SELECT * FROM voice_clips WHERE id = $1`, [id]);
|
|
return rows[0] || null;
|
|
}
|
|
|
|
export async function remove(id) {
|
|
const { rows } = await pool.query(`DELETE FROM voice_clips WHERE id = $1 RETURNING path`, [id]);
|
|
return rows[0] || null; // returns {path} so the caller can unlink the file
|
|
}
|