Merge remote-tracking branch 'origin/master' into feature-webapp
This commit is contained in:
@@ -228,7 +228,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedBroadcastZoneRow.find('td');
|
||||
/** @type {BroadcastZone} */
|
||||
let bz = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
SoundChannel: cells.eq(2).text(),
|
||||
Box: cells.eq(3).text(),
|
||||
@@ -250,7 +250,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedBroadcastZoneRow.find('td');
|
||||
/** @type {BroadcastZone} */
|
||||
let bz = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
SoundChannel: cells.eq(2).text(),
|
||||
Box: cells.eq(3).text(),
|
||||
|
||||
@@ -175,7 +175,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedlanguagerow.find('td');
|
||||
/** @type {Language} */
|
||||
let ll = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
tag: cells.eq(1).text(),
|
||||
language: cells.eq(2).text()
|
||||
}
|
||||
@@ -194,7 +194,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedlanguagerow.find('td');
|
||||
/** @type {Language} */
|
||||
let ll = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
tag: cells.eq(1).text(),
|
||||
language: cells.eq(2).text()
|
||||
}
|
||||
|
||||
@@ -305,7 +305,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedmessagerow.find('td');
|
||||
/** @type {MessageBank} */
|
||||
let mb = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
language: cells.eq(2).text(),
|
||||
aNN_ID: parseInt(cells.eq(3).text()),
|
||||
@@ -329,7 +329,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedmessagerow.find('td');
|
||||
/** @type {MessageBank} */
|
||||
let mb = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
language: cells.eq(2).text(),
|
||||
aNN_ID: parseInt(cells.eq(3).text()),
|
||||
|
||||
@@ -252,7 +252,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedschedulerow.find('td');
|
||||
/** @type {ScheduleBank} */
|
||||
let sr = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
day: cells.eq(2).text(),
|
||||
time: cells.eq(3).text(),
|
||||
@@ -277,7 +277,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedschedulerow.find('td');
|
||||
/** @type {ScheduleBank} */
|
||||
let sr = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
day: cells.eq(2).text(),
|
||||
time: cells.eq(3).text(),
|
||||
|
||||
@@ -98,8 +98,9 @@ function fill_soundbanktablebody(vv) {
|
||||
* @param {String} language
|
||||
* @param {String} category
|
||||
* @param {String} voiceType
|
||||
* @param {Function} cb callback function when done
|
||||
*/
|
||||
function reloadSoundbankFiles(language, category, voiceType) {
|
||||
function reloadSoundbankFiles(language, category, voiceType, cb=null) {
|
||||
window.select2data = [];
|
||||
$('#modalpath').empty().trigger('change');
|
||||
if (language && language.length > 0) {
|
||||
@@ -117,6 +118,7 @@ function reloadSoundbankFiles(language, category, voiceType) {
|
||||
width: '100%',
|
||||
dropdownParent: $('#soundbankmodal')
|
||||
});
|
||||
if (cb) cb();
|
||||
}
|
||||
}, (errdata) => {
|
||||
alert("Error loading soundbank files : " + errdata.message);
|
||||
@@ -278,6 +280,7 @@ $(document).ready(function () {
|
||||
* @type {SoundBank}
|
||||
*/
|
||||
let nsb = {
|
||||
index: 0,
|
||||
Description: description,
|
||||
TAG: tag,
|
||||
Category: category,
|
||||
@@ -302,7 +305,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedsoundrow.find('td');
|
||||
/** @type {SoundBank} */
|
||||
let sb = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
description: cells.eq(1).text(),
|
||||
tag: cells.eq(2).text(),
|
||||
category: cells.eq(3).text(),
|
||||
@@ -325,7 +328,7 @@ $(document).ready(function () {
|
||||
let cells = window.selectedsoundrow.find('td');
|
||||
/** @type {SoundBank} */
|
||||
let sb = {
|
||||
index: cells.eq(0).text(),
|
||||
index: Number(cells.eq(0).text()),
|
||||
Description: cells.eq(1).text(),
|
||||
TAG: cells.eq(2).text(),
|
||||
Category: cells.eq(3).text(),
|
||||
@@ -336,16 +339,24 @@ $(document).ready(function () {
|
||||
if (confirm(`Are you sure to edit soundbank [${sb.index}] Description=${sb.Description} Tag=${sb.TAG}?`)) {
|
||||
$modal.modal('show');
|
||||
clearSoundbankModal();
|
||||
SetupEventForCategoryLanguageVoiceType();
|
||||
$modalindex.val(sb.index).prop('disabled', true);
|
||||
$modaldescription.val(sb.Description);
|
||||
$modaltag.val(sb.TAG);
|
||||
$modalcategory.val(sb.Category);
|
||||
selected_category = sb.Category;
|
||||
$modallanguage.val(sb.Language);
|
||||
selected_language = sb.Language;
|
||||
$modalvoicetype.val(sb.VoiceType);
|
||||
$('#modalpath').val(sb.Path).trigger('change');
|
||||
selected_voicetype = sb.VoiceType;
|
||||
// load soundbank files for selected language, category, voiceType
|
||||
reloadSoundbankFiles(selected_language, selected_category, selected_voicetype, () => {
|
||||
// set selected path
|
||||
$('#modalpath').val(getFilenameFromPath(sb.Path)).trigger('change');
|
||||
});
|
||||
|
||||
|
||||
SetupEventForCategoryLanguageVoiceType();
|
||||
|
||||
// event on Click save button
|
||||
$modal.off('click.soundbanksave').on('click.soundbanksave', '#soundbanksave', function () {
|
||||
let description = $modaldescription.val().trim();
|
||||
@@ -388,7 +399,7 @@ $(document).ready(function () {
|
||||
sb.Language = language;
|
||||
sb.VoiceType = voiceType;
|
||||
sb.Path = path;
|
||||
fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PUT", {}, sb, (okdata) => {
|
||||
fetchAPI(APIURL + "UpdateByIndex/" + sb.index, "PATCH", {}, sb, (okdata) => {
|
||||
reloadSoundBank(APIURL);
|
||||
alert("Success update soundbank : " + okdata.message);
|
||||
}, (errdata) => {
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -287,7 +286,6 @@
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/soundchannel.js"></script>
|
||||
<script src="assets/js/broadcastzones.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -92,7 +91,6 @@
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/languagelink.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -54,7 +53,6 @@
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/log.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS NewGeneration 17092025</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -40,7 +39,6 @@
|
||||
</section>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -134,7 +133,6 @@
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/messagebank.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -1325,7 +1324,6 @@
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -20,7 +19,6 @@
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -113,7 +112,6 @@
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/soundbank.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -32,7 +31,6 @@
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -178,7 +177,6 @@
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/schedulebank.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -7,7 +7,6 @@
|
||||
<title>AAS_NewGen_08OKT25</title>
|
||||
<link rel="stylesheet" href="assets/bootstrap/css/bootstrap.min.css">
|
||||
<link rel="stylesheet" href="assets/css/bss-overrides.css">
|
||||
<link rel="stylesheet" href="assets/css/select2.min.css">
|
||||
<link rel="stylesheet" href="assets/css/Login-Form-Basic-icons.css">
|
||||
<link rel="stylesheet" href="assets/css/styles.css">
|
||||
</head>
|
||||
@@ -200,7 +199,6 @@
|
||||
</div>
|
||||
<script src="assets/bootstrap/js/bootstrap.min.js"></script>
|
||||
<script src="assets/js/bs-init.js"></script>
|
||||
<script src="assets/js/select2.min.js"></script>
|
||||
<script src="assets/js/usermanagement.js"></script>
|
||||
</body>
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ lateinit var audioPlayer: AudioPlayer
|
||||
val StreamerOutputs: MutableMap<String, BarixConnection> = HashMap()
|
||||
lateinit var udpreceiver: UDPReceiver
|
||||
lateinit var tcpreceiver: TCPReceiver
|
||||
const val version = "0.0.5 (09/10/2025)"
|
||||
const val version = "0.0.6 (14/10/2025)"
|
||||
// AAS 64 channels
|
||||
const val max_channel = 64
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin
|
||||
private var _sd: Int = 0
|
||||
private var _vu: Int = 0
|
||||
private var _onlinecounter = 0
|
||||
private val udp = DatagramSocket(0)
|
||||
private val inet = InetSocketAddress(ipaddress, port)
|
||||
private val maxUDPsize = 1000
|
||||
private var _tcp: Socket? = null
|
||||
@@ -105,26 +104,26 @@ class BarixConnection(val index: UInt, var channel: String, val ipaddress: Strin
|
||||
fun SendData(data: ByteArray, cbOK: Consumer<String>, cbFail: Consumer<String>) {
|
||||
if (data.isNotEmpty()) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
|
||||
val bb = ByteBuffer.wrap(data)
|
||||
while(bb.hasRemaining()){
|
||||
try {
|
||||
val chunk = ByteArray(if (bb.remaining() > maxUDPsize) maxUDPsize else bb.remaining())
|
||||
bb.get(chunk)
|
||||
//println("Buffer remain: $bufferRemain, sending chunk size: ${chunk.size}")
|
||||
while(bufferRemain<chunk.size){
|
||||
delay(10)
|
||||
//println("Waiting until buffer enough..")
|
||||
DatagramSocket().use{ udp ->
|
||||
val bb = ByteBuffer.wrap(data)
|
||||
while(bb.hasRemaining()){
|
||||
try {
|
||||
val chunk = ByteArray(if (bb.remaining() > maxUDPsize) maxUDPsize else bb.remaining())
|
||||
bb.get(chunk)
|
||||
//println("Buffer remain: $bufferRemain, sending chunk size: ${chunk.size}")
|
||||
while(bufferRemain<chunk.size){
|
||||
delay(10)
|
||||
//println("Waiting until buffer enough..")
|
||||
}
|
||||
udp.send(DatagramPacket(chunk, chunk.size, inet))
|
||||
delay(2)
|
||||
} catch (e: Exception) {
|
||||
cbFail.accept("SendData to $ipaddress:$port failed, message: ${e.message}")
|
||||
return@launch
|
||||
}
|
||||
udp.send(DatagramPacket(chunk, chunk.size, inet))
|
||||
delay(2)
|
||||
} catch (e: Exception) {
|
||||
cbFail.accept("SendData to $ipaddress:$port failed, message: ${e.message}")
|
||||
return@launch
|
||||
}
|
||||
cbOK.accept("SendData to $channel ($ipaddress:$port) succeeded, ${data.size} bytes sent")
|
||||
}
|
||||
cbOK.accept("SendData to $channel ($ipaddress:$port) succeeded, ${data.size} bytes sent")
|
||||
|
||||
}
|
||||
|
||||
} else cbFail.accept("SendData to $ipaddress:$port failed, data is empty")
|
||||
|
||||
@@ -3,8 +3,10 @@ package barix
|
||||
import codes.Somecodes.Companion.ValidString
|
||||
import kotlinx.coroutines.*
|
||||
import org.tinylog.Logger
|
||||
import java.io.DataInputStream
|
||||
import java.net.ServerSocket
|
||||
import java.net.Socket
|
||||
import java.nio.ByteBuffer
|
||||
import java.util.function.Consumer
|
||||
|
||||
@Suppress("unused")
|
||||
@@ -38,31 +40,35 @@ class TCP_Barix_Command_Server {
|
||||
socketMap[key] = socket
|
||||
Logger.info { "Start communicating with Streamer Output with IP : $key" }
|
||||
try{
|
||||
val din = socket.getInputStream()
|
||||
while (isActive) {
|
||||
|
||||
if (din.available()>0){
|
||||
val bb = ByteArray(din.available())
|
||||
din.read(bb)
|
||||
// B4A format, 4 bytes di depan adalah size
|
||||
val str = String(bb, 4, bb.size - 4)
|
||||
if (ValidString(str)) {
|
||||
// Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$
|
||||
pattern.find(str)?.let { matchResult ->
|
||||
val (vu, buffremain, statusdata) = matchResult.destructured
|
||||
val status = BarixStatus(
|
||||
socket.inetAddress.hostAddress,
|
||||
vu.toInt(),
|
||||
buffremain.toInt(),
|
||||
statusdata.toIntOrNull() ?: 0
|
||||
)
|
||||
//Logger.info { "Received valid command from $key : $status" }
|
||||
cb.accept(status)
|
||||
} ?: run {
|
||||
Logger.warn { "Invalid command format from $key : $str" }
|
||||
}
|
||||
val din = DataInputStream(socket.getInputStream())
|
||||
while (isActive) {
|
||||
val length = ByteArray(4)
|
||||
din.readFully(length)
|
||||
val readlength = ByteBuffer.wrap(length).getInt()
|
||||
//println("Read Length : $readlength")
|
||||
val bb = ByteArray(readlength)
|
||||
din.readFully(bb)
|
||||
// B4A format, 4 bytes di depan adalah size
|
||||
val str = String(bb)
|
||||
//println("Received from $key : $str")
|
||||
if (ValidString(str)) {
|
||||
// Valid command from Barix is in format $"STATUSBARIX;VU;BuffRemain;StatusData"$
|
||||
pattern.find(str)?.let { matchResult ->
|
||||
val (vu, buffremain, statusdata) = matchResult.destructured
|
||||
val status = BarixStatus(
|
||||
socket.inetAddress.hostAddress,
|
||||
vu.toInt(),
|
||||
buffremain.toInt(),
|
||||
statusdata.toIntOrNull() ?: 0
|
||||
)
|
||||
//Logger.info { "Received valid command from $key : $status" }
|
||||
cb.accept(status)
|
||||
} ?: run {
|
||||
Logger.warn { "Invalid command format from $key : $str" }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} catch (ex:Exception){
|
||||
Logger.error { "Error in communication with Streamer Output with IP $key, Message : ${ex.message}" }
|
||||
|
||||
@@ -62,6 +62,14 @@ class Somecodes {
|
||||
return Soundbank_directory.resolve(language.name).resolve(voice.name).resolve(category.name)
|
||||
}
|
||||
|
||||
fun SoundbankDirectory(language: String, voice: String, category: String) : Path{
|
||||
return SoundbankDirectory(
|
||||
Language.valueOf(language),
|
||||
VoiceType.valueOf(voice),
|
||||
Category.valueOf(category)
|
||||
)
|
||||
}
|
||||
|
||||
fun ExtractFilesFromClassPath(resourcePath: String, outputDir: Path) {
|
||||
try {
|
||||
val resource = Somecodes::class.java.getResource(resourcePath)
|
||||
|
||||
@@ -104,7 +104,7 @@ class MariaDB(
|
||||
List.clear()
|
||||
try {
|
||||
val statement = connection.createStatement()
|
||||
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName}")
|
||||
val resultSet = statement?.executeQuery("SELECT * FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG")
|
||||
while (resultSet?.next() == true) {
|
||||
val soundbank = Soundbank(
|
||||
resultSet.getLong("index").toUInt(),
|
||||
@@ -225,7 +225,7 @@ class MariaDB(
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Description ")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM ${super.dbName} ORDER BY Category, Language, VoiceType, TAG ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Description, TAG, Category, Language, VoiceType, Path) SELECT Description, TAG, Category, Language, VoiceType, Path FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
@@ -1250,9 +1250,9 @@ class MariaDB(
|
||||
// use a temporary table to reorder the index
|
||||
statement?.executeUpdate("CREATE TABLE IF NOT EXISTS $tempdb_name LIKE ${super.dbName}")
|
||||
statement?.executeUpdate("TRUNCATE TABLE $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("INSERT INTO $tempdb_name (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language FROM ${super.dbName} ORDER BY `index` ")
|
||||
statement?.executeUpdate("TRUNCATE TABLE ${super.dbName}")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, Repeat, Language FROM $tempdb_name")
|
||||
statement?.executeUpdate("INSERT INTO ${super.dbName} (Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language) SELECT Date_Time, Source, Type, Message, SB_TAGS, BroadcastZones, `Repeat`, Language FROM $tempdb_name")
|
||||
statement?.executeUpdate("DROP TABLE $tempdb_name")
|
||||
Logger.info("${super.dbName} table resorted by index" as Any)
|
||||
// reload the local list
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package database
|
||||
|
||||
import content.Category
|
||||
|
||||
data class Soundbank(
|
||||
var index: UInt,
|
||||
var Description: String,
|
||||
@@ -8,4 +10,45 @@ data class Soundbank(
|
||||
var Language: String,
|
||||
var VoiceType: String,
|
||||
var Path: String,
|
||||
)
|
||||
){
|
||||
|
||||
/**
|
||||
* Check if all fields are not empty
|
||||
*/
|
||||
fun isNotEmpty(): Boolean{
|
||||
if (Description.isNotEmpty()){
|
||||
if (TAG.isNotEmpty()){
|
||||
if (Category.isNotEmpty()){
|
||||
if (Language.isNotEmpty()){
|
||||
if (VoiceType.isNotEmpty()){
|
||||
if (Path.isNotEmpty()){
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Category is valid
|
||||
*/
|
||||
fun ValidCategory() : Boolean{
|
||||
return content.Category.entries.any{ it.name == this.Category}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if VoiceType is valid
|
||||
*/
|
||||
fun ValidVoiceType() : Boolean{
|
||||
return content.VoiceType.entries.any{ it.name == this.VoiceType}
|
||||
}
|
||||
/**
|
||||
* Check if Language is valid
|
||||
*/
|
||||
fun ValidLanguage() : Boolean{
|
||||
return content.Language.entries.any{ it.name == this.Language}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -254,33 +254,28 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
post("Add") {
|
||||
try {
|
||||
val addvalue = objectmapper.readValue(it.body(), Soundbank::class.java)
|
||||
if (ValidString(addvalue.Description)) {
|
||||
if (ValidString(addvalue.TAG)) {
|
||||
if (ValidString(addvalue.Category)) {
|
||||
if (ValidString(addvalue.Language)) {
|
||||
if (ValidString(addvalue.Path)) {
|
||||
// check apakah TAG sudah ada untuk language dan category yang sama
|
||||
val exists = db.soundDB.List.any { sb ->
|
||||
sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category
|
||||
}
|
||||
if (!exists) {
|
||||
if (ValidFile(addvalue.Path)) {
|
||||
if (db.soundDB.Add(addvalue)) {
|
||||
db.soundDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to add soundbank to database")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid TAG")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Description")))
|
||||
} catch (_: Exception) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body")))
|
||||
if (addvalue.isNotEmpty()){
|
||||
// check apakah TAG sudah ada untuk language, category dan voicetype yang sama
|
||||
val exists = db.soundDB.List.any { sb ->
|
||||
sb.TAG == addvalue.TAG && sb.Language == addvalue.Language && sb.Category == addvalue.Category && sb.VoiceType == addvalue.VoiceType
|
||||
}
|
||||
if (!exists) {
|
||||
val absolutepath = Somecodes.SoundbankDirectory(Language.valueOf(addvalue.Language), VoiceType.valueOf(addvalue.VoiceType), Category.valueOf(addvalue.Category)).resolve(addvalue.Path)
|
||||
if (Files.isRegularFile(absolutepath)) {
|
||||
addvalue.Path = absolutepath.toAbsolutePath().toString()
|
||||
if (db.soundDB.Add(addvalue)) {
|
||||
db.soundDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Failed to add soundbank to database")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("TAG=${addvalue.TAG} already exists for the same Language=${addvalue.Language} and Category=${addvalue.Category}")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Some fields are empty")))
|
||||
|
||||
} catch (e: Exception) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid request body, Message: ${e.message}")))
|
||||
}
|
||||
}
|
||||
delete("List") {
|
||||
@@ -309,68 +304,78 @@ class WebApp(val listenPort: Int, val userlist: List<Pair<String, String>>) {
|
||||
patch("UpdateByIndex/{index}") {
|
||||
// update by index
|
||||
val index = it.pathParam("index").toUIntOrNull()
|
||||
if (index == null) {
|
||||
// tidak ada path param index
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
|
||||
} else {
|
||||
if (index!=null){
|
||||
val sb = db.soundDB.List.find { xx -> xx.index == index }
|
||||
if (sb == null) {
|
||||
// soundbank dengan index tersebut tidak ditemukan
|
||||
it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found")))
|
||||
} else {
|
||||
// soundbank dengan index tersebut ditemukan, sekarang update
|
||||
val json: JsonNode = objectmapper.readTree(it.body())
|
||||
if (json.isEmpty) {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("UpdateByIndex with index=$index has empty body")))
|
||||
} else {
|
||||
val _description = json.get("Description").asText("")
|
||||
val _tag = json.get("TAG").asText("")
|
||||
val _category = json.get("Category").asText("")
|
||||
val _language = json.get("Language").asText("")
|
||||
val _path = json.get("Path").asText("")
|
||||
var changed = false
|
||||
if (ValidString(_description) && _description != sb.Description) {
|
||||
sb.Description = _description
|
||||
changed = true
|
||||
}
|
||||
if (ValidString(_tag) && _tag != sb.TAG) {
|
||||
sb.TAG = _tag
|
||||
changed = true
|
||||
}
|
||||
if (ValidString(_category) && _category != sb.Category) {
|
||||
if (Category.entries.any { cat ->
|
||||
cat.name == _category
|
||||
}) {
|
||||
sb.Category = _category
|
||||
changed = true
|
||||
if (sb!=null){
|
||||
try{
|
||||
//println("index=$index, body=${it.body()}")
|
||||
val newsb = objectmapper.readValue(it.body(), Soundbank::class.java)
|
||||
//println("newsb=$newsb")
|
||||
if (newsb.isNotEmpty()){
|
||||
var varchanged = false
|
||||
if (newsb.Description != sb.Description) {
|
||||
sb.Description = newsb.Description
|
||||
varchanged = true
|
||||
}
|
||||
if (newsb.TAG != sb.TAG) {
|
||||
sb.TAG = newsb.TAG
|
||||
varchanged = true
|
||||
}
|
||||
if (newsb.ValidCategory()) {
|
||||
if (newsb.Category != sb.Category){
|
||||
sb.Category = newsb.Category
|
||||
varchanged = true
|
||||
}
|
||||
} else {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Category")))
|
||||
return@patch
|
||||
}
|
||||
}
|
||||
if (ValidString(_language) && _language != sb.Language) {
|
||||
sb.Language = _language
|
||||
changed = true
|
||||
}
|
||||
if (ValidString(_path) && _path != sb.Path) {
|
||||
if (ValidFile(_path)) {
|
||||
sb.Path = _path
|
||||
changed = true
|
||||
if (newsb.ValidLanguage()) {
|
||||
if (newsb.Language != sb.Language){
|
||||
sb.Language = newsb.Language
|
||||
varchanged = true
|
||||
}
|
||||
} else {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Path, file does not exist")))
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid Language")))
|
||||
return@patch
|
||||
}
|
||||
}
|
||||
if (changed) {
|
||||
if (db.soundDB.UpdateByIndex(index.toInt(), sb)) {
|
||||
db.soundDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update soundbank with index $index")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index")))
|
||||
if (newsb.ValidVoiceType()) {
|
||||
if (newsb.VoiceType != sb.VoiceType){
|
||||
sb.VoiceType = newsb.VoiceType
|
||||
varchanged = true
|
||||
}
|
||||
} else {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid VoiceType")))
|
||||
return@patch
|
||||
}
|
||||
|
||||
val newpath = Somecodes.SoundbankDirectory(newsb.Language, newsb.VoiceType, newsb.Category).resolve(newsb.Path)
|
||||
if (Files.isRegularFile(newpath)){
|
||||
if (newpath.toAbsolutePath().toString() != sb.Path) {
|
||||
sb.Path = newpath.toAbsolutePath().toString()
|
||||
varchanged = true
|
||||
}
|
||||
} else {
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid path")))
|
||||
return@patch
|
||||
}
|
||||
|
||||
if (varchanged) {
|
||||
//println("Some fields changed for index=$index, updating...")
|
||||
if (db.soundDB.UpdateByIndex(index.toInt(), sb)) {
|
||||
db.soundDB.Resort()
|
||||
it.result(objectmapper.writeValueAsString(resultMessage("OK")))
|
||||
} else it.status(500).result(objectmapper.writeValueAsString(resultMessage("Failed to update soundbank with index $index")))
|
||||
} else it.status(400)
|
||||
.result(objectmapper.writeValueAsString(resultMessage("Nothing has changed for soundbank with index $index")))
|
||||
} else Exception("Some fields are empty")
|
||||
} catch(e: Exception){
|
||||
it.status(400).result(objectmapper.writeValueAsString(resultMessage("Unable to parse request body to Soundbank, Message: ${e.message}")))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else it.status(404).result(objectmapper.writeValueAsString(resultMessage("Soundbank with index $index not found")))
|
||||
} else it.status(400).result(objectmapper.writeValueAsString(resultMessage("Invalid index")))
|
||||
|
||||
}
|
||||
get("ExportXLSX") {
|
||||
val xlsxdata = db.soundDB.Export_XLSX()
|
||||
|
||||
Reference in New Issue
Block a user