window.lastplaybutton = null; /** * Load setting language dropdown */ function load_setting_language() { $("#setting_language").empty().off('change'); getLanguages(() => { window.languages.forEach((lang) => { let $option = $("").attr("value", lang).text(lang); $("#setting_language").append($option); }); $("#setting_language").on('change', function () { change_droparea_enable(); }); }); } /** * Load setting category dropdown */ function load_setting_category() { $("#setting_category").empty().off('change'); getCategories(() => { window.categories.forEach((cat) => { let $option = $("").attr("value", cat).text(cat); $("#setting_category").append($option); }); $("#setting_category").on('change', function () { change_droparea_enable(); }); }); } /** * Load setting voice dropdown */ function load_setting_voice() { $("#setting_voice").empty().off('change'); getVoiceTypes(() => { window.voiceTypes.forEach((voice) => { let $option = $("").attr("value", voice).text(voice); $("#setting_voice").append($option); }); $("#setting_voice").on('change', function () { change_droparea_enable(); }); }); } /** * Get soundbank files from server based on category, language, and voice * @param {String} category * @param {String} language * @param {String} voice */ function getSoundBankFiles(category, language, voice) { let URL = `FileManager/ListSoundbank/${language}/${voice}/${category}`; fetchAPI(URL, "GET", {}, null, (okdata) => { $("#file-list").empty(); if (Array.isArray(okdata) && okdata.length > 0) { okdata.forEach((file) => { // get only the file name from the full path let fileName = file.split(/[/\\]/).pop(); let $li = $("
  • ").text(fileName); $("#file-list").append($li); }); } }, (errdata) => { alert("Error getting soundbank files : " + errdata.message); }); } /** * Enable or disable drop area based on selections */ function change_droparea_enable() { let selected_category = $("#setting_category").val(); let selected_language = $("#setting_language").val(); let selected_voice = $("#setting_voice").val(); $("#file-list").empty(); $("#searchfilelist").val(""); $("#searchfilelist").off('input').on('input', function () { let searchTerm = $(this).val().toLowerCase(); $("#file-list li").each(function () { let fileName = $(this).text().toLowerCase(); if (fileName.includes(searchTerm)) { $(this).show(); } else { $(this).hide(); } }); }); console.log(`Selected Category: ${selected_category}, Language: ${selected_language}, Voice: ${selected_voice}`); if (selected_category && selected_language && selected_voice) { $("#drop-area").removeClass("disabled"); getSoundBankFiles(selected_category, selected_language, selected_voice); } else { $("#drop-area").addClass("disabled"); } } /** * Get Soundbank path from server */ function get_soundbank_path() { $("#setting_path").val(""); fetchAPI("Settings/SoundbankDirectory", "GET", {}, null, (okdata) => { if (okdata.message && okdata.message.trim().length > 0) { let path = okdata.message.trim(); //console.log("Soundbank path retrieved: " + path); $("#setting_path").val(path); } }, (errdata) => { alert("Error getting soundbank path : " + errdata.message); }); } function download(path, filename) { let downloadurl = `/api/FileManager/${path}`; let reqdata = { filename: filename }; fetch(downloadurl, { method: 'POST', headers: {}, body: JSON.stringify(reqdata) }) .then(response => { if (!response.ok) { throw new Error("Network response was not ok"); } return response.blob(); }) .then(blob => { const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); }) .catch(errdata => { alert("Error downloading paging result file: " + errdata.message); }); } function play(path, filename, cbplay = null) { let playurl = `/api/FileManager/${path}`; let reqdata = { filename: filename }; fetch(playurl, { method: 'POST', body: JSON.stringify(reqdata) }).then(response => { if (!response.ok) { throw new Error("Network response was not ok"); } return response.blob(); }).then(blob => { const url = window.URL.createObjectURL(blob); const player = document.getElementById("audioplayer"); if (player) { player.pause(); if (window.lastplaybutton){ let $icon = $(window.lastplaybutton).find("i"); $icon.removeClass("fa-stop").addClass("fa-play"); } player.src = url; player.load(); $("#audioplayer").show(); player.play(); player.onplay = () => { console.log("Playing audio file: " + filename); if (cbplay && typeof cbplay === "function") { cbplay(); } } player.onended = () => { console.log("Finished playing audio file: " + filename); window.URL.revokeObjectURL(url); }; player.onerror = (e) => { alert("Error playing audio file: " + filename); }; } }).catch(errdata => { alert("Error playing soundbank result file: " + errdata.message); }); } function get_pagingresult_files() { const url = `FileManager/PagingResultList`; $("#tbody_resultpaging").empty(); fetchAPI(url, "GET", {}, null, (okdata) => { if (Array.isArray(okdata) && okdata.length > 0) { console.log("Paging result files: ", JSON.stringify(okdata)); okdata.forEach((file) => { let filename = file.split(/[/\\]/).pop(); let $tr = $(""); let $tdtitle = $("").text(filename); // add button inside td to download the file let $btndownload = $("").addClass("btn btn-primary").html(""); let $btnplay = $("").addClass("btn btn-primary").html(""); $btndownload.on('click', function () { download("DownloadPagingResultFile", filename); }); $btnplay.on('click', function () { let $icon = $(this).find("i"); if ($icon.hasClass("fa-stop")) { // stop playback const player = document.getElementById("audioplayer"); if (player) { player.pause(); window.URL.revokeObjectURL(player.src); window.lastplaybutton = null; $icon.removeClass("fa-stop").addClass("fa-play"); } } else { // start playback play("PlayPagingResultFile", filename, () => { window.lastplaybutton = $btnplay; $icon.removeClass("fa-play").addClass("fa-stop"); }); } }); let $tdbutton = $("").append($btndownload).append($btnplay).addClass("text-center"); $tr.append($tdtitle); $tr.append($tdbutton); $("#tbody_resultpaging").append($tr); }); } }, (errdata) => { alert("Error getting paging result files : " + errdata.message); }); } function get_soundbankresult_files() { const url = `FileManager/SoundbankResultList`; $("#tbody_resultsoundbank").empty(); fetchAPI(url, "GET", {}, null, (okdata) => { if (Array.isArray(okdata) && okdata.length > 0) { console.log("Soundbank result files: ", JSON.stringify(okdata)); okdata.forEach((file) => { let filename = file.split(/[/\\]/).pop(); let $tr = $(""); let $tdtitle = $("").text(filename); // add button inside td to download and play the file let $btndownload = $("").addClass("btn btn-primary").html(""); let $btnplay = $("").addClass("btn btn-primary").html(""); let $tdbutton = $("").append($btndownload).append($btnplay).addClass("text-center"); $btndownload.on('click', function () { download("DownloadSoundbankResultFile", filename); }); $btnplay.on('click', function () { let $icon = $(this).find("i"); if ($icon.hasClass("fa-stop")) { // stop playback const player = document.getElementById("audioplayer"); if (player) { player.pause(); window.URL.revokeObjectURL(player.src); window.lastplaybutton = null; $icon.removeClass("fa-stop").addClass("fa-play"); } } else { // start playback play("PlaySoundbankResultFile", filename, () => { window.lastplaybutton = $btnplay; $icon.removeClass("fa-play").addClass("fa-stop"); }); } }); $tr.append($tdtitle); $tr.append($tdbutton); $("#tbody_resultsoundbank").append($tr); }); } }, (errdata) => { alert("Error getting soundbank result files : " + errdata.message); }); } $(document).ready(function () { console.log("filemanagement.js xx loaded"); load_setting_category(); load_setting_language(); load_setting_voice(); get_soundbank_path(); setTimeout(() => { change_droparea_enable(); }, 1000); get_pagingresult_files(); get_soundbankresult_files(); $("#save_directory").off('click').on('click', function () { let new_path = $("#setting_path").val(); if (new_path && new_path.trim().length > 0) { fetchAPI("Settings/SoundbankDirectory", "POST", {}, { directory: new_path }, (okdata) => { alert("Soundbank directory path saved successfully."); }, (errdata) => { alert("Error saving soundbank directory path : " + errdata.message); }); } else { alert("Please enter a valid soundbank directory path."); } }); $("#drop-area").on('dragover', function (e) { e.preventDefault(); e.stopPropagation(); $(this).addClass('dragover'); }).on('dragleave', function (e) { e.preventDefault(); e.stopPropagation(); $(this).removeClass('dragover'); }).on('drop', function (e) { e.preventDefault(); e.stopPropagation(); $(this).removeClass('dragover'); if ($(this).hasClass('disabled')) { alert("Please select Category, Language, and Voice Type before uploading files."); return; } let lang = $("#setting_language").val().trim(); let category = $("#setting_category").val().trim(); let voice = $("#setting_voice").val().trim(); let files = e.originalEvent.dataTransfer.files; if (lang && lang.length > 0) { if (category && category.length > 0) { if (voice && voice.length > 0) { if (files.length > 0) { // check if each file have type audio/wav , size more than 0, and name ends with .wav let allValid = true; for (let i = 0; i < files.length; i++) { let file = files[i]; if (file.type !== 'audio/wav' && !file.name.toLowerCase().endsWith('.wav')) { allValid = false; } if (file.size <= 0) { allValid = false; } } if (allValid) { if (confirm(`Are you sure want to upload ${files.length} file(s) to the soundbank directory for Category: ${$("#setting_category").val()}, Language: ${$("#setting_language").val()}, Voice Type: ${$("#setting_voice").val()}?`)) { let url = `api/FileManager/UploadSoundbank/${lang}/${voice}/${category}`; const formdata = new FormData(); for (let i = 0; i < files.length; i++) { formdata.append('files', files[i]); } try { fetch(url, { method: 'POST', body: formdata }) .then(response => response.json()) .then(okdata => { console.log("Upload result: ", JSON.stringify(okdata)); change_droparea_enable(); alert("Files uploaded successfully to soundbank directory."); }) .catch(errdata => { alert("Error uploading files to soundbank directory : " + errdata.message); }); } catch (err) { alert("Error preparing file upload: " + err.message); } } } else alert("Please upload only valid WAV audio files. Type must be audio/wav and size must be more than 0 bytes."); } else alert("No files detected for upload."); } else alert("Please select Voice Type before uploading files."); } else alert("Please select Category before uploading files."); } else alert("Please select Language before uploading files."); }); });