diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..68ed7e3 Binary files /dev/null and b/.env.example differ diff --git a/electron/main/index.html b/electron/main/index.html index a8430af..b4bfb5f 100644 --- a/electron/main/index.html +++ b/electron/main/index.html @@ -9,9 +9,20 @@
-
+
+ + + + +
+ @@ -20,28 +31,32 @@

Drag and drop video file

+
No video chosen
-
- - +
+ +
+ +
- +
- +
- + -
+
0%
diff --git a/electron/main/languages.js b/electron/main/languages.js index 6262dc0..271c3aa 100644 --- a/electron/main/languages.js +++ b/electron/main/languages.js @@ -1,5 +1,9 @@ var languageOptions = { "eng":{ + "flagPath": "flags/united-kingdom-flag-png-large.jpg", + "labelKI": "Select ki:", + "labelTranscription": "Select transcription:", + "labelLanguage": "Select language:", "title": "Video to document", "h1": "Video to document", "p1": "Drag and drop video file", @@ -11,6 +15,10 @@ var languageOptions = { "submitButton": "Submit" }, "de":{ + "flagPath": "flags/germany-flag-png-large.jpg", + "labelKI": "Waehle KI:", + "labelTranscription": "Waehle Transkription:", + "labelLanguage": "Waehle Sprache:", "title": "Video zu Dokument", "h1": "Video zu Dokument", "p1": "Video per Drag & Drop ablegen", @@ -22,6 +30,10 @@ var languageOptions = { "submitButton": "Absenden" }, "in":{ + "flagPath": "flags/india-flag-png-large.png", + "labelKI": "की का चयन करें:", + "labelTranscription": "प्रतिलेखन चुनें:", + "labelLanguage": "भाषा चुने:", "title": "दस्तावेज़ के लिए वीडियो", "h1": "दस्तावेज़ के लिए वीडियो", "p1": "वीडियो फ़ाइल खींचें और छोड़ें", diff --git a/electron/main/preload.js b/electron/main/preload.js index 355ace4..b027cde 100644 --- a/electron/main/preload.js +++ b/electron/main/preload.js @@ -4,12 +4,24 @@ try { contextBridge.exposeInMainWorld("explorer", { onFileDrop: (file) => webUtils.getPathForFile(file) }) - contextBridge.exposeInMainWorld("extractor", { - extract: (file) => ipcRenderer.send("extract", file) + contextBridge.exposeInMainWorld("submit", { + submit: (meeting_specifications) => {ipcRenderer.send("file_submit", meeting_specifications)} }) contextBridge.exposeInMainWorld("electronAPI", { getFilePath: (file) => {return webUtils.getPathForFile(file)} }) + + contextBridge.exposeInMainWorld("onStartup", { + getModuleNames: () => ipcRenderer.invoke('get-module-names') + }) + + + + ipcRenderer.on("progress", (event, resp) => { + alert(`Finished step ${resp.curstep} of ${resp.totalsteps}`) + }) + + ipcRenderer.on("error", (event, err) => {alert(err)}) } catch (error) { console.log("Error in preload.js"); -} \ No newline at end of file +} diff --git a/electron/main/renderer.js b/electron/main/renderer.js index 2291f64..fcdd894 100644 --- a/electron/main/renderer.js +++ b/electron/main/renderer.js @@ -16,26 +16,72 @@ uploadContainer.addEventListener("drop", (e) => { e.preventDefault() const files = e.dataTransfer.files const filePath = window.explorer.onFileDrop(files[0]) - var holdy = filePath + ""; - if(holdy.endsWith(".mp4") || holdy.endsWith(".mov") || holdy.endsWith(".avi") || holdy.endsWith( ".mkv")){ - console.log(filePath) - + const testEndings = [".mp4", ".mov", ".avi", ".mkv"]; + var pathToLower = filePath.toLowerCase(); + if(testEndings.some(e => pathToLower.endsWith(e))){ + document.getElementById("progressbar").style.visibility = "visible"; const files1 = e.dataTransfer.files; handleFiles(files1); + }else{ + alert('The given file is not compatible. These are the available types: [".mp4", ".mov", ".avi", ".mkv"].'); } + } catch (error) { console.log("Error in renderer.js with the listerner for the drop function"); } }) +window.addEventListener('load', async (e) => { + try { + console.log("test"); + loadLanguageOptions(); + const value = await window.onStartup.getModuleNames(); + loadAiOptions(value.ai_modules); + loadTranscriptionOptions(value.transcription_modules); - window.addEventListener('load', (e) => { - console.log("test"); - loadLanguageOptions(); + } catch (error) { + + } + }); language_option.addEventListener('change', (e)=>{ - const select = document.getElementById('language_option'); - console.log(select.value); - changeLanguage(select.value); + try { + const select = document.getElementById('language_option'); + changeLanguage(select.value); + } catch (error) { + + } + }); + +videoUpload.addEventListener("change", () => { + try { + activateSubmitBtn(videoUpload.files.length > 0); + } catch (error) { + console.log(error); + } + +}); + +//listener for the file explorer search when something got selected +videoUpload.addEventListener('change', () => { + try { + handleFiles(videoUpload.files); + } catch (error) { + console.log("Error in manualBtn EventListener change"); + console.log(error); + } + +}); + +//listener for the file explorer search +manualUploadBtn.addEventListener('click', () => { + try { + videoUpload.click(); + } catch (error) { + console.log("Error in manualBtn EventListener click"); + console.log(error); + } + +}); \ No newline at end of file diff --git a/electron/main/script.js b/electron/main/script.js index c66c976..81f4d54 100644 --- a/electron/main/script.js +++ b/electron/main/script.js @@ -1,45 +1,82 @@ -//listener for the file explorer search -manualUploadBtn.addEventListener('click', () => { - try { - videoUpload.click(); - } catch (error) { - console.log("Error in manualBtn EventListener click"); - } - -}); //function to check if one checkbox is at least klicked function checkBoxes() { try { const checkboxes = document.querySelectorAll('input[name="docFormat"]'); let isChecked = false; - + var checkedCounter = 0; checkboxes.forEach(function(checkbox){ if(checkbox.checked){ isChecked = true; + checkedCounter++; } }); if(isChecked){ //Code to submit the video + var selectedCheckboxes = {}; + checkboxes.forEach(function(checkbox){ + if(checkbox.checked){ + selectedCheckboxes[checkbox.nextElementSibling.textContent] = ""; + } + }); + + const testEndings = [".mp4", ".mov", ".avi", ".mkv"]; var pathTest = window.electronAPI.getFilePath(videoUpload.files[0]); - if(pathTest.endsWith(".mp4") || holdy.endsWith(".mov") || holdy.endsWith(".avi") || holdy.endsWith( ".mkv")){ - window.extractor.extract({inputVideoPath: pathTest, outputType:"wav"}) + var pathToLower = pathTest.toLowerCase(); + if(testEndings.some(e => pathToLower.endsWith(e))){ + document.getElementById("progressbar").style.visibility = "visible"; + //assembly of the json for the main + + const selectedStyles = [checkedCounter]; + var iter = 0; + checkboxes.forEach(function(checkbox){ + if(checkbox.checked){ + console.log(checkbox.value); + selectedStyles[iter] = {iter: checkbox.value}; + iter++; + } + }); + console.log(selectedCheckboxes); + const outputType = document.getElementById("output_type"); + const transcriptionType = document.getElementById("transkript_type"); + const aiType = document.getElementById("ai_type"); + const sendingPackage = { + "video": { + "module":"extraction-video-to-audio", + "inputVideoPath": pathTest, + "outputType": outputType.value + }, + "transcription": { + "module": transcriptionType.value + }, + "document": { + "module":aiType.value, + "styles": selectedStyles + } + }; + window.submit.submit(sendingPackage) + }else{ + alert('The given file is not compatible. These are the available types: [".mp4", ".mov", ".avi", ".mkv"].'); } } else { //language only english at the moment alert('Please select at least one document type.'); } } catch (error) { - console.log(error) + console.log("Error in script.js checkBoxes function"); + console.log(error); } -// mapFunctions.get("extraction-video-to-audio").function({inputVideoPath:"./a.mp4", outputType:"wav"}) } //language changing feature function changeLanguage(language) { try { + document.getElementById('labelLanguageFlag').src = languageOptions[language].flagPath; + document.getElementById('labelKI').textContent = languageOptions[language].labelKI; + document.getElementById('labelTranscription').textContent = languageOptions[language].labelTranscription; + document.getElementById('labelLanguage').textContent = languageOptions[language].labelLanguage; document.getElementById('title').textContent = languageOptions[language].title; document.getElementById('h1').textContent = languageOptions[language].h1; document.getElementById('p1').textContent = languageOptions[language].p1; @@ -49,34 +86,30 @@ function changeLanguage(language) { document.getElementById('label_format').textContent = languageOptions[language].label_format; document.getElementById('label_summary').textContent = languageOptions[language].label_summary; document.getElementById('submitButton').textContent = languageOptions[language].submitButton; + } catch (error) { + console.log("Error in script.js changeLanguage function"); console.log(error); } } -//listener for the file explorer search when something got selected -videoUpload.addEventListener('change', () => { - try { - handleFiles(videoUpload.files); - } catch (error) { - console.log("Error in manualBtn EventListener change"); - } - -}); - //function to display the file path in the drop down box function handleFiles(files) { try { if (files.length > 0) { const file = files[0]; if (file.type.startsWith('video/')) { + const filePath = window.explorer.onFileDrop(files[0]) videoUpload.files = files; fileName.textContent = `Chosen video: ${file.name}`; + generateThumbnail(filePath); + activateSubmitBtn(true); } } } catch (error) { console.log("Error in script.js handleFiles function"); + console.log(error); } } @@ -89,6 +122,7 @@ function updateProgressBar(bar, value){ bar.querySelector(".progress_text").textContent = `${value}%`; } catch (error) { console.log("Error in scripts.js updateProgressBar function"); + console.log(error); } } @@ -97,12 +131,13 @@ function updateProgressBar(bar, value){ function loadAiOptions(options){ try { var menu = document.getElementById('ai_type'); + var object_holdy; + var choice ; + object_holdy = options for(i = 0; i < options.length; i++){ - var opty = options[i]; - var namey = "option" + i; - var choice = document.createElement(namey); - choice.textContent = "t"; - choice.value = i; + choice = document.createElement('option'); + choice.textContent = object_holdy[i].displayname; + choice.value = object_holdy[i].name; menu.appendChild(choice); } } catch (error) { @@ -111,6 +146,25 @@ function loadAiOptions(options){ } } +//function to load transcription options to the drop down list +function loadTranscriptionOptions(options){ + try { + var menu = document.getElementById('transkript_type'); + var object_holdy; + var choice ; + object_holdy = options + for(i = 0; i < options.length; i++){ + choice = document.createElement('option'); + choice.textContent = object_holdy[i].displayname; + choice.value = object_holdy[i].name; + menu.appendChild(choice); + } + } catch (error) { + console.log("Error in script.js function loadTranscriptionOptions"); + console.log(error); + } +} + //function to load language options to the drop down list function loadLanguageOptions(){ try { @@ -129,4 +183,32 @@ function loadLanguageOptions(){ console.log("Error in script.js loadLanguageOptions function"); console.log(error); } -} \ No newline at end of file +} + +function activateSubmitBtn(hasFile){ + try { + submitButton.disabled = !hasFile; + } catch (error) { + console.log(error); + } +} + +function deaktivateProgressbar(){ + try { + document.getElementById("progressbar").style.visibility = "hidden"; + } catch (error) { + console.log(error); + } +} + +//Video thumbnail generation +function generateThumbnail(path){ + const videoElement = document.getElementById("previewThumbnail"); + while (videoElement.firstChild) videoElement.removeChild(videoElement.firstChild); + videoElement.src = path; + videoElement.type = "video/mov"; + videoElement.load(); + videoElement.style.maxWidth = 40; + videoElement.style.maxHeight = 40; + videoElement.autoplay = false; +} diff --git a/electron/main/style.css b/electron/main/style.css index e9abb50..0912516 100644 --- a/electron/main/style.css +++ b/electron/main/style.css @@ -5,46 +5,71 @@ body { justify-content: center; align-items: center; height: 100vh; - background-color: #555; + background-color: #f2f3f4; gap: 15px; margin: 0; } - - + + .upload-container { background: white; padding: 40px; border-radius: 12px; box-shadow: 0 4px 10px rgba(0,0,0,0.1); text-align: center; - width: 400px; + width: 350px; + height: 200px; transition: border 0.3s, background-color 0.3s; - border: 2px dashed #ccc; + border: 2px dashed #7378c9; } - - + + .upload-container.dragover { border-color: #007BFF; background-color: #eaf0ff; } - - + + .upload-container p { margin: 0 0 15px 0; font-size: 16px; color: #555; } - - + + .file-name { margin-top: 10px; font-size: 14px; color: #333; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +#thumbnailContainer { + width: 100%; + display: flex; + justify-content: center; + margin-bottom: 15px; +} + +#thumbnailImage { + width: 200px; + height: auto; + border-radius: 10px; + box-shadow: 0px 4px 10px rgba(0,0,0,0.1); + object-fit: cover; } - +#previewThumbnail { + width: 150px; + height: 100px; + /*border: 1px dashed black;*/ +} + .custom-btn { padding: 10px 20px; + margin-top: 10px; background-color: #007BFF; color: white; border: none; @@ -52,27 +77,27 @@ body { cursor: pointer; font-size: 14px; } - - + + .custom-btn:hover { background-color: #0056b3; } - + .submit-btn:hover { background-color: #0056b3; } - + input[type="file"] { display: none; } - + .checkbox-container{ margin-top: 8px; display: flex; align-items: center; gap: 5px; } - + .checkbox-group { margin-top: 15px; margin-bottom: 15px; @@ -81,9 +106,11 @@ gap: 5px; gap: 10px; align-items: flex-start; } - + .submit-btn { padding: 10px 20px; + margin-top: 10px; + margin-bottom: 10px; background-color: #007BFF; color: white; border: none; @@ -91,24 +118,33 @@ gap: 5px; cursor: pointer; font-size: 14px; } - + +.submit-btn:disabled { + opacity: 0.5; + cursor: not-allowed; + pointer-events: none; +} + .mitte { - background-color: #f2f3f4; + background-color: #FDFCFA; display: flex; + width: 700px; flex-direction: column; align-items: center; padding: 5% 50px; margin-top: 20px; gap: 10px; - border: 1px; + border: 0px; border-color: black; border-style: solid; + border-radius: 6px; + box-shadow: 0px 4px 10px rgba(0,0,0,0.1); } - + h1 { align-content: center; } - + .progressbar{ position: relative; width: 210px; @@ -116,15 +152,16 @@ h1 { background: rgb(42, 46, 78); border-radius: 5px; overflow: hidden; + visibility: hidden; } - + .progress_fill{ width: 0%; height: 100%; background: green; transition: all 0.2s; } - + .progress_text{ position: absolute; top: 50%; @@ -133,15 +170,19 @@ h1 { color: white; } -.flagsBtns { + +.dropdownMenus { display: flex; justify-content: flex-end; + margin-top: 1px; + gap: 150px; + padding: 2px 10px 2px 10px; } -.de_Btn, .eng_Btn, .in_Btn { - padding: 8px 16px; - color: white; - border: none; - border-radius: 8px; - cursor: pointer; +#ai_type, #transkript_type, #language_option { + padding: 3px; +} + +.labelDiv { + gap: 200px; } \ No newline at end of file diff --git a/main.js b/main.js index 1482f06..0171128 100644 --- a/main.js +++ b/main.js @@ -58,22 +58,159 @@ rl.on("line", data =>{ let mainWindow; function createWindow() { - mainWindow = new electron.BrowserWindow({ - width: 800, - height: 600, - webPreferences: { - nodeIntegration: false, - contextIsolation: true, - preload: `${mainDir}/electron/main/preload.js` - } - }); + mainWindow = new electron.BrowserWindow({ + width: 800, + height: 800, + webPreferences: { + nodeIntegration: false, + contextIsolation: true, + preload: `${mainDir}/electron/main/preload.js` + } + }); - mainWindow.loadFile('./electron/main/index.html'); + mainWindow.loadFile('./electron/main/index.html'); } electron.app.whenReady().then(createWindow); -electron.ipcMain.on("extract", (event, args) => { - mapFunctions.get("extraction-video-to-audio").function(args) -}) \ No newline at end of file +// electron.ipcMain.on("extract", (event, args) => { +// mapFunctions.get("extraction-video-to-audio").function(args) +// }) + +// setTimeout(() => { +// mainWindow.webContents.send("fuck", "worked uwu") +// }, 5000); + +electron.ipcMain.handle('get-module-names', async () => { + let module_array = { + "ai_modules":[], + "transcription_modules":[] + } + mapFunctions.forEach(e => { + switch(e.type){ + case "llm": + module_array.ai_modules.push({"name": e.name, "displayname": e.displayname}) + break; + case "transcription": + module_array.transcription_modules.push({"name": e.name, "displayname": e.displayname}) + break; + } + }) + // console.log(module_array); + return module_array +}); + + +// electron.ipcMain.on("get_modules", async (event, args) => { +// let module_array = { +// "ai_modules":[], +// "transcription_modules":[] +// } +// mapFunctions.forEach(e => { +// switch(e.type){ +// case "llm": +// module_array.ai_modules.push({"name": e.name, "displayname": e.displayname}) +// break; +// case "transcription": +// module_array.transcription_modules.push({"name": e.name, "displayname": e.displayname}) +// break; +// } +// }) +// console.log(module_array); + +// mainWindow.webContents.send("modules", module_array) +// }) + + + +electron.ipcMain.on("file_submit", async (event, args) => { + try { + let curstep = 0 + let totalsteps = 2 + args.document.styles.length + + if(args.document.styles.length == 0) + throw new Error("At least one Document Style needed"); + + + console.log(args); + let audiopath = "" + let transcriptpath = "" + + // This code handles the Video to Audio extraction module call + await mapFunctions.get("module-handler").function(args.video.module, {inputVideoPath: args.video.inputVideoPath, outputType: args.video.outputType}).then(resp => { + // console.log(resp); + audiopath = resp + curstep++ + mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps}) + }).catch(err => { + mainWindow.webContents.send("error", err) + return + }) + + + // TODO implement transcription module + // // This code handles the Audio to Text transcription module call + // await mapFunctions.get("module-handler").function(args.transcription.module, audiopath).then(resp => { + // console.log(resp); + // transcriptpath = resp + // curstep++ + // mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps}) + // }).catch(err => { + // mainWindow.webContents.send("error", err) + // return + // }) + + // TODO implement documentation module + // // This code handles the Text to Document processing module call + // for (let i = 0; i < args.document.styles.length; i++) { + // await mapFunctions.get("module-handler").function(args.document.module, {prompt: args.document.styles[i].prompt, transcript: transcriptpath}).then(resp => { + // console.log(resp); + // transcriptpath = resp + // curstep++ + // mainWindow.webContents.send("progress", {curstep:curstep, totalsteps:totalsteps}) + // }).catch(err => { + // mainWindow.webContents.send("error", err) + // return + // }) + // } + + + } catch (error) { + console.log(error); + } +}) + + + +let q = +{ + video: { + module: "String", // The name of the module, idk if we ever implement other extraction modules, the default one is extraction-video-to-audio + inputVideoPath: "String", // See script.js on line 27 for an example of what this should look like + outputType: "String" // The file format to be used for the audio output file, such as wav, mp3, flac and so on + }, + transcription:{ + module: "String" // The module name of the transcription model you want to use + }, + document:{ + module: "String", // The module name of the AI model you want to use to create the document + styles: [ // An array of all the document styles/prompts you want to have the document be processed with + { + prompt: "String", + } + ] + } +} + + +let q1 = { + "ai_modules": [ + {name:"abc", displayname:"ABC"}, + {name:"qeg", displayname:"aqghegahu"} + ], + "transcription_modules": [ + {name:"abc", displayname:"ABC"}, + {name:"qeg", displayname:"aqghegahu"} + ] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 52b523c..175bfea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@google/genai": "^1.30.0", "@types/axios": "^0.9.36", "cli-progress": "^3.12.0", "dotenv": "^17.2.3", @@ -73,6 +74,88 @@ "global-agent": "^3.0.0" } }, + "node_modules/@google/genai": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/@google/genai/-/genai-1.30.0.tgz", + "integrity": "sha512-3MRcgczBFbUat1wIlZoLJ0vCCfXgm7Qxjh59cZi2X08RgWLtm9hKOspzp7TOg1TV2e26/MLxR2GR5yD5GmBV2w==", + "dependencies": { + "google-auth-library": "^10.3.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@modelcontextprotocol/sdk": "^1.20.1" + }, + "peerDependenciesMeta": { + "@modelcontextprotocol/sdk": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -101,6 +184,15 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -206,7 +298,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.2.tgz", "integrity": "sha512-uWN8YqxXxqFMX2RqGOrumsKeti4LlmIMIyV0lgut4jx7KQBcBiW6vkDtIBvHnHIquwNfJhk8v2OtmO8zXWHfPA==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -287,6 +378,17 @@ "node": ">=8" } }, + "node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", @@ -299,6 +401,38 @@ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "engines": { + "node": "*" + } + }, "node_modules/body-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", @@ -325,6 +459,14 @@ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "optional": true }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -333,6 +475,11 @@ "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -428,6 +575,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/concat-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", @@ -485,6 +648,41 @@ "dev": true, "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -618,6 +816,19 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -783,6 +994,11 @@ "url": "https://opencollective.com/express" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -810,6 +1026,28 @@ "pend": "~1.2.0" } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/ffmpeg-static": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-5.2.0.tgz", @@ -855,6 +1093,32 @@ "node": ">=18" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -892,6 +1156,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -941,6 +1252,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -986,6 +1316,31 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "engines": { + "node": ">=14" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -1026,6 +1381,18 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -1173,6 +1540,28 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "license": "ISC" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -1192,6 +1581,25 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -1208,6 +1616,11 @@ "node": ">=8" } }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -1281,6 +1694,28 @@ "node": ">=4" } }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1295,6 +1730,42 @@ "node": ">= 0.6" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", @@ -1353,6 +1824,11 @@ "node": ">=8" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, "node_modules/parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -1366,6 +1842,29 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -1502,6 +2001,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -1628,6 +2141,25 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1696,6 +2228,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/sprintf-js": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", @@ -1733,6 +2276,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1745,6 +2302,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -1845,7 +2414,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1897,6 +2465,14 @@ "node": ">= 0.8" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -1909,11 +2485,124 @@ "which": "bin/which" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index f85f30e..6ac1c4b 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "dependencies": { + "@google/genai": "^1.30.0", "@types/axios": "^0.9.36", "cli-progress": "^3.12.0", "dotenv": "^17.2.3", diff --git a/requires.js b/requires.js index 03c5b7a..e947400 100644 --- a/requires.js +++ b/requires.js @@ -16,3 +16,4 @@ cliProgress = require('cli-progress'); // { app, BrowserWindow, ipcMain, dialog } = require('electron'); electron = require('electron'); +genai = require("@google/genai"); \ No newline at end of file diff --git a/services/modules/extraction/ffmpegExtractor.js b/services/modules/extraction/ffmpegExtractor.js index ffec9c0..2f00b15 100644 --- a/services/modules/extraction/ffmpegExtractor.js +++ b/services/modules/extraction/ffmpegExtractor.js @@ -1,4 +1,3 @@ - // Ensure ffmpeg binary is available if (!ffmpegPath) { throw new Error('FFmpeg binary not found!'); @@ -32,11 +31,11 @@ module.exports = { hideCursor: true }); try { - // if (meta.url === `file://${process.argv[1]}`) { + return new Promise((resolve, reject) => { this.extractAudioFromVideo(parameter.inputVideoPath, progressBar, parameter.outputType) - .then(() => console.log('Audio extraction successful.')) + .then((resp) => resolve(resp)) .catch((err) => console.error(err)); - // } + }) } catch (error) { console.log(parameter.outputType); @@ -75,7 +74,7 @@ module.exports = { progressBar.update(100, { timemark: 'done' }); progressBar.stop(); console.log(`Extraction completed: ${outputAudioPath}`); - resolve(); + resolve(outputAudioPath); }) .on('error', (err) => { progressBar.stop(); @@ -89,5 +88,4 @@ module.exports = { } }); } - } \ No newline at end of file diff --git a/services/modules/llm-chat_gpt/chatgpt.js b/services/modules/llm-chat_gpt/chatgpt.js index 6e9034e..8446af5 100644 --- a/services/modules/llm-chat_gpt/chatgpt.js +++ b/services/modules/llm-chat_gpt/chatgpt.js @@ -1,6 +1,6 @@ module.exports = { name:"chatgpt", // Unique name for our function that will later be used to get the function from the map via "mapFunctions.get("example").function()" - type:"document", // value used to differentiate each module to order them in the UI + type:"llm", // value used to differentiate each module to order them in the UI displayname:"ChatGPT", // The displayname used within the UI async function(parameter){ // TODO add code to actually send the transcript to ChatGPT and get a response back diff --git a/services/modules/llm-gemini/gemini.js b/services/modules/llm-gemini/gemini.js index d28dda8..7ba043c 100644 --- a/services/modules/llm-gemini/gemini.js +++ b/services/modules/llm-gemini/gemini.js @@ -1,14 +1,10 @@ -const fs = require("fs"); -const path = require("path"); -const { GoogleGenAI } = require("@google/genai"); // Import Google Gemini AI SDK - const outputDir = path.join(__dirname, "../../../storage/documents"); // path for output directory if (!fs.existsSync(outputDir)) { fs.mkdirSync(outputDir, { recursive: true }); // Create output directory if it doesn't exist } -const ai = new GoogleGenAI({ +const ai = new genai.GoogleGenAI({ apiKey: process.env.GOOGLE_API_KEY // Ensure Google API key is set in environment variables: export GOOGLE_API_KEY="your_api_key_here" }); diff --git a/services/modules/utility/@startup.js b/services/modules/utility/@startup.js index dcf64c8..e4e6f04 100644 --- a/services/modules/utility/@startup.js +++ b/services/modules/utility/@startup.js @@ -9,5 +9,8 @@ module.exports = { // mapFunctions.get("extraction-video-to-audio").function({inputVideoPath:"./a.mp4", outputType:"wav"}) // mapFunctions.get("extraction-video-to-audio").function({inputVideoPath:"./b.mp4", outputType:"wav"}) // mapFunctions.get("extraction-video-to-audio").function({inputVideoPath:"./b.mp4", outputType:"flac"}) + + // mapFunctions.get("ipc-handler").function("extraction-video-to-audio", {inputVideoPath:"./a.mp4", outputType:"flac"}) + } } \ No newline at end of file diff --git a/services/modules/utility/module-handler.js b/services/modules/utility/module-handler.js new file mode 100644 index 0000000..1e06115 --- /dev/null +++ b/services/modules/utility/module-handler.js @@ -0,0 +1,16 @@ +module.exports = { + name:"module-handler", // Unique name for our function that will later be used to get the function from the map via "mapFunctions.get("example").function()" + async function(module,parameter){ + return new Promise(async (resolve, reject) => { + if(mapFunctions.get(module) == undefined){ + reject("requested modules not found") + return + } + mapFunctions.get(module).function(parameter).then((result) => { + resolve(result) + }).catch((err) => { + reject(err) + }); + }) + } +} \ No newline at end of file diff --git a/services/pipeline/jobs/transcribeLatest.ts b/services/pipeline/jobs/transcribeLatest.ts index fc75ad5..f632eee 100644 --- a/services/pipeline/jobs/transcribeLatest.ts +++ b/services/pipeline/jobs/transcribeLatest.ts @@ -1,6 +1,7 @@ // services/pipeline/jobs/transcribeLatest.ts import path from 'path'; import fs from 'fs'; +// @ts-ignore: module has no type declarations or cannot be resolved in current TS config import assembly from '../../modules/transcription/assembly'; /**