Compare commits

...

4 Commits

10 changed files with 176 additions and 68 deletions
Vendored
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -19,7 +19,7 @@
</label> </label>
<nav class="menu1"> <nav class="menu1">
<a href="custom_document.html" class="li1">Custom document</a> <a href="custom_document.html" class="li1">Manage document types</a>
<a href="" class="li1">Help</a> <a href="" class="li1">Help</a>
</nav> </nav>
</nav> </nav>
+20 -16
View File
@@ -3,35 +3,39 @@ const { contextBridge, ipcRenderer, webUtils } = require('electron')
try { try {
contextBridge.exposeInMainWorld("explorer", { contextBridge.exposeInMainWorld("explorer", {
onFileDrop: (file) => webUtils.getPathForFile(file) onFileDrop: (file) => webUtils.getPathForFile(file)
}) });
contextBridge.exposeInMainWorld("submit", { contextBridge.exposeInMainWorld("submit", {
submit: (meeting_specifications) => {ipcRenderer.send("file_submit", meeting_specifications)} submit: (meeting_specifications) => ipcRenderer.send("file_submit", meeting_specifications)
}) });
// ALLE electronAPI Funktionen in EINEM Objekt
contextBridge.exposeInMainWorld("electronAPI", { contextBridge.exposeInMainWorld("electronAPI", {
getFilePath: (file) => {return webUtils.getPathForFile(file)} getFilePath: (file) => webUtils.getPathForFile(file),
}) saveSpeakerMapping: (data) => ipcRenderer.send("save-speaker-mapping", data)
});
contextBridge.exposeInMainWorld("onStartup", { contextBridge.exposeInMainWorld("onStartup", {
getModuleNames: () => ipcRenderer.invoke('get-module-names') getModuleNames: () => ipcRenderer.invoke('get-module-names')
}) });
contextBridge.exposeInMainWorld('electron', { contextBridge.exposeInMainWorld('electron', {
progress: (callback) => ipcRenderer.on('progress', callback) progress: (callback) => ipcRenderer.on('progress', callback)
}) });
contextBridge.exposeInMainWorld('audios', { contextBridge.exposeInMainWorld('audios', {
speakerAudios: (callback) => ipcRenderer.on('speakerAudios', callback) speakerAudios: (callback) => ipcRenderer.on('speakerAudios', callback)
}) });
contextBridge.exposeInMainWorld("submitSpeaker", { contextBridge.exposeInMainWorld("submitSpeaker", {
speaker_submit: (speaker_names) => {ipcRenderer.send("speaker_submit", speaker_names)} speaker_submit: (speaker_names) => ipcRenderer.send("speaker_submit", speaker_names)
}) });
contextBridge.exposeInMainWorld("download", { contextBridge.exposeInMainWorld("download", {
file_download: () => {ipcRenderer.send("file_download")} file_download: () => ipcRenderer.send("file_download")
}) });
ipcRenderer.on("error", (event, err) => { alert(err) });
ipcRenderer.on("error", (event, err) => {alert(err)})
} catch (error) { } catch (error) {
console.log("Error in preload.js"); console.log("Error in preload.js", error);
} }
+56 -47
View File
@@ -5,8 +5,8 @@ function checkBoxes() {
const checkboxes = document.querySelectorAll('input[name="docFormat"]'); const checkboxes = document.querySelectorAll('input[name="docFormat"]');
let isChecked = false; let isChecked = false;
var checkedCounter = 0; var checkedCounter = 0;
checkboxes.forEach(function(checkbox){ checkboxes.forEach(function (checkbox) {
if(checkbox.checked){ if (checkbox.checked) {
isChecked = true; isChecked = true;
checkedCounter++; checkedCounter++;
} }
@@ -15,24 +15,24 @@ function checkBoxes() {
if (isChecked) { if (isChecked) {
//Code to submit the video //Code to submit the video
var selectedCheckboxes = {}; var selectedCheckboxes = {};
checkboxes.forEach(function(checkbox){ checkboxes.forEach(function (checkbox) {
if(checkbox.checked){ if (checkbox.checked) {
selectedCheckboxes[checkbox.nextElementSibling.textContent] = ""; selectedCheckboxes[checkbox.nextElementSibling.textContent] = "";
} }
}); });
const testEndings = [".mp4", ".mov", ".avi", ".mkv"]; const testEndings = [".mp4", ".mov", ".avi", ".mkv"];
var pathTest = window.electronAPI.getFilePath(videoUpload.files[0]); var pathTest = window.electronAPI.getFilePath(videoUpload.files[0]);
var pathToLower = pathTest.toLowerCase(); var pathToLower = pathTest.toLowerCase();
if(testEndings.some(e => pathToLower.endsWith(e))){ if (testEndings.some(e => pathToLower.endsWith(e))) {
//assembly of the json for the main //assembly of the json for the main
var typeCheckbox; var typeCheckbox;
if(document.getElementById("docFormat").checked) typeCheckbox = document.getElementById("docFormat").value; if (document.getElementById("docFormat").checked) typeCheckbox = document.getElementById("docFormat").value;
if(document.getElementById("docFormatSummary1").checked) typeCheckbox = document.getElementById("docFormatSummary1").value; if (document.getElementById("docFormatSummary1").checked) typeCheckbox = document.getElementById("docFormatSummary1").value;
if(document.getElementById("docFormatSummary2").checked) typeCheckbox = document.getElementById("docFormatSummary2").value; if (document.getElementById("docFormatSummary2").checked) typeCheckbox = document.getElementById("docFormatSummary2").value;
if(document.getElementById("docFormatSummary3").checked) typeCheckbox = document.getElementById("docFormatSummary3").value; if (document.getElementById("docFormatSummary3").checked) typeCheckbox = document.getElementById("docFormatSummary3").value;
if(document.getElementById("docFormatCustom").checked) typeCheckbox = document.getElementById("docFormatCustom").value; if (document.getElementById("docFormatCustom").checked) typeCheckbox = document.getElementById("docFormatCustom").value;
document.getElementById("testy").style.visibility = "visible" document.getElementById("testy").style.visibility = "visible"
document.getElementById("box1").style.backgroundColor = "red"; document.getElementById("box1").style.backgroundColor = "red";
@@ -45,20 +45,20 @@ function checkBoxes() {
const aiType = document.getElementById("ai_type"); const aiType = document.getElementById("ai_type");
const sendingPackage = { const sendingPackage = {
"video": { "video": {
"module":"extraction-video-to-audio", "module": "extraction-video-to-audio",
"inputVideoPath": pathTest "inputVideoPath": pathTest
}, },
"transcription": { "transcription": {
"module": transcriptionType.value "module": transcriptionType.value
}, },
"document": { "document": {
"module":aiType.value, "module": aiType.value,
"type": typeCheckbox, "type": typeCheckbox,
"outputType": outputType.value "outputType": outputType.value
} }
}; };
window.submit.submit(sendingPackage) window.submit.submit(sendingPackage)
}else{ } else {
alert('The given file is not compatible. These are the available types: [".mp4", ".mov", ".avi", ".mkv"].'); alert('The given file is not compatible. These are the available types: [".mp4", ".mov", ".avi", ".mkv"].');
} }
@@ -71,7 +71,7 @@ function checkBoxes() {
console.log("Error in script.js checkBoxes function"); console.log("Error in script.js checkBoxes function");
console.log(error); console.log(error);
} }
} }
//language changing feature //language changing feature
@@ -95,7 +95,7 @@ function changeLanguage(language) {
console.log("Error in script.js changeLanguage function"); console.log("Error in script.js changeLanguage function");
console.log(error); console.log(error);
} }
} }
//function to display the file path in the drop down box //function to display the file path in the drop down box
@@ -129,17 +129,17 @@ function updateProgressBar(bar, value) {
console.log("Error in scripts.js updateProgressBar function"); console.log("Error in scripts.js updateProgressBar function");
console.log(error); console.log(error);
} }
} }
//function to load ai options to the drop down list //function to load ai options to the drop down list
function loadAiOptions(options){ function loadAiOptions(options) {
try { try {
var menu = document.getElementById('ai_type'); var menu = document.getElementById('ai_type');
var object_holdy; var object_holdy;
var choice ; var choice;
object_holdy = options object_holdy = options
for(i = 0; i < options.length; i++){ for (i = 0; i < options.length; i++) {
choice = document.createElement('option'); choice = document.createElement('option');
choice.textContent = object_holdy[i].displayname; choice.textContent = object_holdy[i].displayname;
choice.value = object_holdy[i].name; choice.value = object_holdy[i].name;
@@ -152,13 +152,13 @@ function loadAiOptions(options){
} }
//function to load transcription options to the drop down list //function to load transcription options to the drop down list
function loadTranscriptionOptions(options){ function loadTranscriptionOptions(options) {
try { try {
var menu = document.getElementById('transkript_type'); var menu = document.getElementById('transkript_type');
var object_holdy; var object_holdy;
var choice ; var choice;
object_holdy = options object_holdy = options
for(i = 0; i < options.length; i++){ for (i = 0; i < options.length; i++) {
choice = document.createElement('option'); choice = document.createElement('option');
choice.textContent = object_holdy[i].displayname; choice.textContent = object_holdy[i].displayname;
choice.value = object_holdy[i].name; choice.value = object_holdy[i].name;
@@ -171,13 +171,13 @@ function loadTranscriptionOptions(options){
} }
//function to load data type options to the drop down list //function to load data type options to the drop down list
function loadDataTypeOptions(options){ function loadDataTypeOptions(options) {
try { try {
var menu = document.getElementById('output_type'); var menu = document.getElementById('output_type');
var object_holdy; var object_holdy;
var choice ; var choice;
object_holdy = options object_holdy = options
for(i = 0; i < options.length; i++){ for (i = 0; i < options.length; i++) {
choice = document.createElement('option'); choice = document.createElement('option');
choice.textContent = object_holdy[i].displayname; choice.textContent = object_holdy[i].displayname;
choice.value = object_holdy[i].name; choice.value = object_holdy[i].name;
@@ -190,13 +190,13 @@ function loadDataTypeOptions(options){
} }
//function to load language options to the drop down list //function to load language options to the drop down list
function loadLanguageOptions(){ function loadLanguageOptions() {
try { try {
var menu = document.getElementById('language_option'); var menu = document.getElementById('language_option');
var object_holdy; var object_holdy;
var choice ; var choice;
object_holdy = Object.keys(languageOptions); object_holdy = Object.keys(languageOptions);
for(i = 0; i < object_holdy.length; i++){ for (i = 0; i < object_holdy.length; i++) {
choice = document.createElement('option'); choice = document.createElement('option');
choice.textContent = object_holdy[i]; choice.textContent = object_holdy[i];
choice.value = object_holdy[i]; choice.value = object_holdy[i];
@@ -209,17 +209,17 @@ function loadLanguageOptions(){
} }
//function to load speaker options to the drop down list //function to load speaker options to the drop down list
function loadSpeakerOptions(options){ function loadSpeakerOptions(options) {
try { try {
var menu = document.getElementById('cur_speaker'); var menu = document.getElementById('cur_speaker');
var l = document.getElementById('cur_speaker').options.length -1; var l = document.getElementById('cur_speaker').options.length - 1;
for(i = l; i >= 0; i--){ for (i = l; i >= 0; i--) {
menu.remove(i); menu.remove(i);
} }
var object_holdy; var object_holdy;
var choice; var choice;
object_holdy = Object.keys(options); object_holdy = Object.keys(options);
for(i = 0; i < object_holdy.length; i++){ for (i = 0; i < object_holdy.length; i++) {
choice = document.createElement('option'); choice = document.createElement('option');
choice.textContent = options[object_holdy[i]].name; choice.textContent = options[object_holdy[i]].name;
choice.value = object_holdy[i]; choice.value = object_holdy[i];
@@ -233,7 +233,7 @@ function loadSpeakerOptions(options){
} }
//function to load speaker audio file options to the drop down list //function to load speaker audio file options to the drop down list
function loadSpeakerAudio(option){ function loadSpeakerAudio(option) {
try { try {
var menu = document.getElementById('speakerAudioViewer'); var menu = document.getElementById('speakerAudioViewer');
var aud = document.createElement("source"); var aud = document.createElement("source");
@@ -246,7 +246,7 @@ function loadSpeakerAudio(option){
} }
function activateSubmitBtn(hasFile){ function activateSubmitBtn(hasFile) {
try { try {
document.getElementById("submitButton").disabled = !hasFile; document.getElementById("submitButton").disabled = !hasFile;
} catch (error) { } catch (error) {
@@ -254,7 +254,7 @@ function activateSubmitBtn(hasFile){
} }
} }
function deaktivateProgressbar(){ function deaktivateProgressbar() {
try { try {
document.getElementById("progressbar").style.visibility = "hidden"; document.getElementById("progressbar").style.visibility = "hidden";
} catch (error) { } catch (error) {
@@ -263,7 +263,7 @@ function deaktivateProgressbar(){
} }
//Video thumbnail generation //Video thumbnail generation
function generateThumbnail(path){ function generateThumbnail(path) {
const videoElement = document.getElementById("previewThumbnail"); const videoElement = document.getElementById("previewThumbnail");
while (videoElement.firstChild) videoElement.removeChild(videoElement.firstChild); while (videoElement.firstChild) videoElement.removeChild(videoElement.firstChild);
videoElement.src = path; videoElement.src = path;
@@ -281,7 +281,7 @@ let currentStep = 1;
const totalSteps = steps.length; const totalSteps = steps.length;
function showStep(stepNumber) { function showStep(stepNumber) {
if (stepNumber < 1 || stepNumber > totalSteps){ if (stepNumber < 1 || stepNumber > totalSteps) {
console.error("StepNumber out of Bounds", stepNumber); console.error("StepNumber out of Bounds", stepNumber);
return; return;
} }
@@ -292,7 +292,7 @@ function showStep(stepNumber) {
document.querySelector(`.step-item[data-step="${stepNumber}"]`).classList.add("active"); document.querySelector(`.step-item[data-step="${stepNumber}"]`).classList.add("active");
const activeBtn = document.querySelector(`.step-item[data-step="${stepNumber}"]`); const activeBtn = document.querySelector(`.step-item[data-step="${stepNumber}"]`);
if(activeBtn) activeBtn.classList.add("active"); if (activeBtn) activeBtn.classList.add("active");
prevBtn.disabled = stepNumber == 1; prevBtn.disabled = stepNumber == 1;
nextBtn.disabled = stepNumber === totalSteps; nextBtn.disabled = stepNumber === totalSteps;
@@ -303,31 +303,40 @@ function showStep(stepNumber) {
//Audio value setter //Audio value setter
var speakerAudios = {}; var speakerAudios = {};
var speakerEndValues = {}; var speakerEndValues = {};
function setSpeakerAudiosValue(valy){ function setSpeakerAudiosValue(valy) {
try { try {
speakerAudios = valy; speakerAudios = valy;
speakerRewriten = valy; speakerRewriten = valy;
document.getElementById("speakerAudioViewer").src = valy.speakerA.src; document.getElementById("speakerAudioViewer").src = valy.speakerA.src;
} catch (error) { } catch (error) {
} }
} }
function rewriteSpeakerName(){ function rewriteSpeakerName() {
try { try {
var tempy = document.getElementById("cur_speaker").value; const oldKey = document.getElementById("cur_speaker").value;
speakerAudios[tempy].name = document.getElementById("newSpeaker").value; const newName = document.getElementById("newSpeaker").value;
speakerAudios[oldKey].name = newName;
loadSpeakerOptions(speakerAudios); loadSpeakerOptions(speakerAudios);
// IPC-Aufruf an Electron main process
window.electronAPI.saveSpeakerMapping({
speakerId: oldKey,
speakerName: newName
});
} catch (error) { } catch (error) {
console.log("\n\n\n" + error + "\n\n\n") console.log(error);
} }
} }
function sendSpeakerPackages(){ function sendSpeakerPackages() {
try { try {
window.submitSpeaker.speaker_submit(speakerAudios); window.submitSpeaker.speaker_submit(speakerAudios);
} catch (error) { } catch (error) {
} }
} }
+16
View File
@@ -103,7 +103,23 @@ electron.ipcMain.handle('get-module-names', async () => {
return module_array return module_array
}); });
electron.ipcMain.on("save-speaker-mapping", (event, data) => {
const filePath = "/Users/mikehughes/PROJ/video2document/storage/speakerMapping/speakerMapping.json";
const payload = {
speakerId: data.speakerId,
speakerName: data.speakerName,
updated: new Date().toISOString()
};
try {
fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), "utf8");
console.log("Speaker mapping saved!");
} catch (error) {
console.error("Failed to save speaker mapping", error);
}
});
// electron.ipcMain.on("get_modules", async (event, args) => { // electron.ipcMain.on("get_modules", async (event, args) => {
// let module_array = { // let module_array = {
// "ai_modules":[], // "ai_modules":[],
+8 -4
View File
@@ -450,6 +450,7 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz",
"integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"undici-types": "~7.16.0" "undici-types": "~7.16.0"
} }
@@ -1305,7 +1306,8 @@
"version": "0.0.1534754", "version": "0.0.1534754",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1534754.tgz",
"integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==", "integrity": "sha512-26T91cV5dbOYnXdJi5qQHoTtUoNEqwkHcAyu/IKtjIAxiEqPMrDiRkDOPWVsGfNZGmlQVHQbZRSjD8sxagWVsQ==",
"license": "BSD-3-Clause" "license": "BSD-3-Clause",
"peer": true
}, },
"node_modules/diff": { "node_modules/diff": {
"version": "4.0.2", "version": "4.0.2",
@@ -3488,9 +3490,10 @@
} }
}, },
"node_modules/qs": { "node_modules/qs": {
"version": "6.14.0", "version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
"license": "BSD-3-Clause",
"dependencies": { "dependencies": {
"side-channel": "^1.1.0" "side-channel": "^1.1.0"
}, },
@@ -4204,6 +4207,7 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"devOptional": true, "devOptional": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
@@ -0,0 +1,70 @@
const fs = require('fs');
const path = require('path');
const module_exports = {
name: "replace_speaker",
type: "processor",
displayname: "Speaker Name Replacer",
description: "Replaces speaker placeholder names with actual names based on a mapping in HTML files",
async function({ inputHtmlPath, speakerMappingPath }) {
return await this.replaceNames(inputHtmlPath, speakerMappingPath);
},
replaceNames: async function(inputHtmlPath, speakerMappingPath) {
try {
const htmlContent = await fs.promises.readFile(inputHtmlPath, "utf-8");
const mappingData = await fs.promises.readFile(speakerMappingPath, "utf-8");
let speakerMap = {};
try {
const parsed = JSON.parse(mappingData);
if (parsed.speakerId && parsed.speakerName) {
speakerMap[parsed.speakerId] = parsed.speakerName;
} else {
Object.assign(speakerMap, parsed);
}
} catch (e) {
const lines = mappingData.trim().split('\n');
lines.forEach(line => {
const [placeholder, realName] = line.split(',').map(s => s.trim());
if (placeholder && realName) speakerMap[placeholder] = realName;
});
}
let outputContent = htmlContent;
Object.entries(speakerMap).forEach(([placeholder, realName]) => {
const regex = new RegExp(`[\$begin:math:text$\\\\\[\]\?\$\{placeholder\}\[\\$end:math:text$\\]]?`, 'g');
outputContent = outputContent.replace(regex, realName);
});
await fs.promises.writeFile(inputHtmlPath, outputContent, "utf-8");
return inputHtmlPath;
} catch (error) {
console.error("Error replacing speaker names:", error);
throw error;
}
}
};
module.exports = module_exports;
if (require.main === module) {
(async () => {
const args = process.argv.slice(2);
if (args.length < 2) process.exit(1);
const [inputHtmlPath, speakerMappingPath] = args;
if (!fs.existsSync(inputHtmlPath)) process.exit(1);
if (!fs.existsSync(speakerMappingPath)) process.exit(1);
try {
await module_exports.replaceNames(inputHtmlPath, speakerMappingPath);
} catch (err) {
process.exit(1);
}
})();
}
@@ -0,0 +1,5 @@
{
"speakerId": "speakerB",
"speakerName": "Peter",
"updated": "2026-01-10T13:54:55.608Z"
}