2024-01-31 16:19:55 +01:00
// Copyright (c) 2024 Julian Müller (ChaoticByte)
"use strict" ;
import { Recorder } from "./recorder.js" ;
async function api _is _online ( settings ) {
const ping _response = await fetch ( settings . api _url + "/ping" ) . catch ( _ => {
return 0 ;
} ) ;
return ping _response . status == 200 ;
}
( async ( ) => {
// Get Elements
let startBtn = document . getElementById ( "startBtn" ) ;
let stopBtn = document . getElementById ( "stopBtn" ) ;
let audioPrev = document . getElementById ( "audioPrev" ) ;
let transcribeBtn = document . getElementById ( "transcribeBtn" ) ;
let transcriptText = document . getElementById ( "transcript" ) ;
2025-06-08 14:08:13 +02:00
let copyBtn = document . getElementById ( "copyBtn" ) ;
2024-01-31 16:19:55 +01:00
// Load Settings
const settings _resp = await fetch ( "settings.json" ) ;
const settings = await settings _resp . json ( ) ;
while ( settings . api _url . endsWith ( '/' ) ) {
settings . api _url = settings . api _url . substring ( 0 , settings . api _url . length - 1 ) ;
}
if ( await api _is _online ( settings ) ) {
2025-06-08 14:08:13 +02:00
// Audio Recorder
2024-01-31 16:19:55 +01:00
let audioBlob ;
const recorder = new Recorder ( startBtn , stopBtn , async ( blob ) => {
audioBlob = blob ;
audioPrev . src = URL . createObjectURL ( audioBlob ) ;
audioPrev . load ( ) ;
audioPrev . classList . remove ( "nodisplay" ) ;
transcribeBtn . classList . remove ( "nodisplay" ) ;
} ) ;
recorder . init ( ) ;
2025-06-08 14:08:13 +02:00
// Handlers
copyBtn . addEventListener ( "click" , ( ) => {
navigator . clipboard . writeText ( transcriptText . innerText ) ;
} ) ;
2024-01-31 16:19:55 +01:00
startBtn . addEventListener ( "click" , ( ) => {
2025-06-08 14:08:13 +02:00
// Recording
2024-01-31 16:19:55 +01:00
audioPrev . classList . add ( "nodisplay" ) ;
transcribeBtn . classList . add ( "nodisplay" ) ;
transcriptText . innerText = "" ;
2025-06-08 14:08:13 +02:00
copyBtn . classList . add ( "nodisplay" ) ;
} ) ;
2024-01-31 16:19:55 +01:00
transcribeBtn . addEventListener ( "click" , async ( ) => {
2025-06-08 14:08:13 +02:00
// Transcription
2024-01-31 16:19:55 +01:00
transcribeBtn . disabled = true ;
transcriptText . classList . add ( "loading" ) ;
2025-06-08 14:08:13 +02:00
copyBtn . classList . add ( "nodisplay" ) ;
2024-01-31 16:19:55 +01:00
const formData = new FormData ( ) ;
formData . append ( "audio" , audioBlob ) ;
let response = await fetch ( settings . api _url , {
method : 'POST' ,
body : formData
} ) ;
let t = await response . text ( ) ;
transcriptText . innerText = t ;
2025-06-08 14:08:13 +02:00
if ( transcriptText . innerText . length > 0 ) {
copyBtn . classList . remove ( "nodisplay" ) ;
}
2024-01-31 16:19:55 +01:00
transcriptText . classList . remove ( "loading" ) ;
transcribeBtn . disabled = false ;
} ) ;
// init done.
startBtn . classList . remove ( "nodisplay" ) ;
} else {
transcriptText . innerText = "Can't reach API :("
}
} ) ( ) ;