mirror of
https://gitlab.rlp.net/proj-wise2526-video2document/video2document.git
synced 2026-06-15 18:01:52 +02:00
Combined Frontend with backend, and implemented the extractor function into the module structure
This commit is contained in:
@@ -55,4 +55,22 @@ rl.on("line", data =>{
|
|||||||
|
|
||||||
// ----------------------------------------------------------- ELECTRON ----------------------------------------------------------- //
|
// ----------------------------------------------------------- ELECTRON ----------------------------------------------------------- //
|
||||||
|
|
||||||
// TODO - Add Electron support to the project
|
let mainWindow;
|
||||||
|
|
||||||
|
function createWindow() {
|
||||||
|
mainWindow = new electron.BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: false,
|
||||||
|
contextIsolation: true,
|
||||||
|
preload: `${mainDir}/electron/main/preload.js`
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
mainWindow.loadFile('./electron/main/index.html');
|
||||||
|
}
|
||||||
|
|
||||||
|
electron.app.whenReady().then(createWindow);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Generated
+1355
-5
File diff suppressed because it is too large
Load Diff
+4
-5
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"type": "module",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cli-progress": "^3.12.0",
|
"cli-progress": "^3.12.0",
|
||||||
|
"electron": "^39.1.1",
|
||||||
|
"express": "^5.1.0",
|
||||||
"ffmpeg-static": "^5.2.0",
|
"ffmpeg-static": "^5.2.0",
|
||||||
"fluent-ffmpeg": "^2.1.3",
|
"fluent-ffmpeg": "^2.1.3"
|
||||||
"express": "^5.1.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cli-progress": "^3.11.6",
|
"@types/cli-progress": "^3.11.6",
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
"test": "tests"
|
"test": "tests"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"start": "electron main.js",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -31,5 +32,3 @@
|
|||||||
"author": "",
|
"author": "",
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -8,3 +8,11 @@ fs = require("fs")
|
|||||||
readline = require("readline")
|
readline = require("readline")
|
||||||
config = require("./config/config")
|
config = require("./config/config")
|
||||||
|
|
||||||
|
ffmpegPath = require('ffmpeg-static');
|
||||||
|
ffmpeg = require('fluent-ffmpeg');
|
||||||
|
path = require('path');
|
||||||
|
cliProgress = require('cli-progress');
|
||||||
|
|
||||||
|
// { app, BrowserWindow, ipcMain, dialog } = require('electron');
|
||||||
|
|
||||||
|
electron = require('electron');
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
|
||||||
|
// Ensure ffmpeg binary is available
|
||||||
|
if (!ffmpegPath) {
|
||||||
|
throw new Error('FFmpeg binary not found!');
|
||||||
|
}
|
||||||
|
ffmpeg.setFfmpegPath(ffmpegPath);
|
||||||
|
|
||||||
|
// Prepare output directory (always storage/audio under project root)
|
||||||
|
const outputDir = `${__dirname}/../../../storage/audio`;
|
||||||
|
if (!fs.existsSync(outputDir)) {
|
||||||
|
fs.mkdirSync(outputDir, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
name:"extraction-video-to-audio", // Unique name for our function that will later be used to get the function from the map via "mapFunctions.get("example").function()"
|
||||||
|
type:"extractor", // value used to differentiate each module to order them in the UI
|
||||||
|
displayname:"Default extractor", // The displayname used within the UI
|
||||||
|
async function(parameter){
|
||||||
|
/*
|
||||||
|
parameter structure:
|
||||||
|
{
|
||||||
|
inputVideoPath: String, // Path to the file
|
||||||
|
outputType: String // Audio file output format
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
let progressBar = new cliProgress.SingleBar({
|
||||||
|
format: 'Processing |{bar}| {percentage}% | {timemark}',
|
||||||
|
barCompleteChar: '\u2588',
|
||||||
|
barIncompleteChar: '\u2591',
|
||||||
|
hideCursor: true
|
||||||
|
});
|
||||||
|
try {
|
||||||
|
// if (meta.url === `file://${process.argv[1]}`) {
|
||||||
|
this.extractAudioFromVideo(parameter.inputVideoPath, progressBar, parameter.outputType)
|
||||||
|
.then(() => console.log('Audio extraction successful.'))
|
||||||
|
.catch((err) => console.error(err));
|
||||||
|
// }
|
||||||
|
} catch (error) {
|
||||||
|
console.log(parameter.outputType);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
// Derive input and output paths
|
||||||
|
// const inputVideoPath = process.argv[2];
|
||||||
|
// console.log(process.argv);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extracts audio from a video using ffmpeg.
|
||||||
|
* - Converts video to WAV (16 kHz, Mono, PCM optional if needed)
|
||||||
|
* - Shows CLI progress bar
|
||||||
|
* - Handles errors gracefully (without errors)
|
||||||
|
*/
|
||||||
|
extractAudioFromVideo: async function (videoFilePath, progressBar, outputType){
|
||||||
|
let inputVideoName = path.basename(videoFilePath, path.extname(videoFilePath));
|
||||||
|
let outputAudioPath = path.join(outputDir, `${inputVideoName}.${outputType}`);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
try {
|
||||||
|
ffmpeg(videoFilePath)
|
||||||
|
.outputFormat(outputType)
|
||||||
|
// .audioCodec('pcm_s16le')
|
||||||
|
.audioChannels(1)
|
||||||
|
.audioFrequency(16000)
|
||||||
|
// .setFfmpegPath("./ffmpeg.exe")
|
||||||
|
.on('progress', (progress) => {
|
||||||
|
if (!progressBar.isActive) progressBar.start(100, 0, { timemark: '00:00:00' });
|
||||||
|
if (progress.percent) {
|
||||||
|
progressBar.update(progress.percent, { timemark: progress.timemark });
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('end', () => {
|
||||||
|
progressBar.update(100, { timemark: 'done' });
|
||||||
|
progressBar.stop();
|
||||||
|
console.log(`Extraction completed: ${outputAudioPath}`);
|
||||||
|
resolve();
|
||||||
|
})
|
||||||
|
.on('error', (err) => {
|
||||||
|
progressBar.stop();
|
||||||
|
console.error(`failed_audio_extraction on type ${outputType}: ${err.message}`);
|
||||||
|
reject(err);
|
||||||
|
})
|
||||||
|
.save(outputAudioPath);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,5 +5,9 @@ module.exports = {
|
|||||||
|
|
||||||
// We are now calling the example function from the example folder
|
// We are now calling the example function from the example folder
|
||||||
mapFunctions.get("example").function("Startup")
|
mapFunctions.get("example").function("Startup")
|
||||||
|
|
||||||
|
// 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"})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user