Introduction
In this tutorial, we'll delve into the process of calculating the total duration of videos contained within a zip archive using Node.js. This can be particularly useful for media management, video editing, or any scenario where you need to quickly assess the total video footage in a compressed file.
Prerequisites:
Installation:
Node.js and npm (or yarn) installed on your system.
Create a new Node.js project:
mkdir video-duration-calculator
cd video-duration-calculator
npm init -y
Install required dependencies:
npm install unzipper get-video-duration path fs
Code Implementation index.ts
:
import * as fs from "fs";
import { getVideoDurationInSeconds } from "get-video-duration";
import * as unzipper from "unzipper";
import * as path from "path";
async function calculateTotalDuration(zipFilePath: string): Promise<number> {
try {
let totalDurationSeconds = 0;
const directory = await unzipper.Open.file(zipFilePath);
for (const entry of directory.files) {
if (entry.path.match(/\.(mp4|mov|avi|mkv)$/i)) {
const videoData = await entry.buffer();
// Construct the temporary file path (cross-platform compatible)
const tempFilePath = `./temp_${entry.path.replace(/[/\\]/g, "_")}`;
console.log("Entry name:", entry.path);
console.log("Temporary file path:", tempFilePath);
// Ensure the directory exists (cross-platform compatible)
const dirName = tempFilePath.substring(
0,
tempFilePath.lastIndexOf(path.sep)
);
if (!fs.existsSync(dirName)) {
fs.mkdirSync(dirName, { recursive: true });
}
fs.writeFileSync(tempFilePath, videoData);
try {
await new Promise((resolve) => setTimeout(resolve, 100));
const duration = await getVideoDurationInSeconds(tempFilePath);
totalDurationSeconds += duration;
} catch (readError) {
console.error(
`Error reading video duration from ${tempFilePath}:`,
readError
);
} finally {
try {
fs.unlinkSync(tempFilePath);
} catch (deleteError) {
console.error(
`Error deleting temporary file ${tempFilePath}:`,
deleteError
);
}
}
}
}
const totalDurationMinutes = totalDurationSeconds / 60;
return parseFloat(totalDurationMinutes.toFixed(2));
} catch (error) {
console.error("Error calculating total duration:", error);
throw error;
}
}
// Example usage (adjust the path according to your OS)
const zipFilePath =
process.platform === "win32"
? "C:\\Users\\your-username\\Downloads\\video-test-duretion.zip"
: "/home/lcom/Documents/video-test-duretion.zip";
calculateTotalDuration(zipFilePath)
.then((totalDurationMinutes) => {
console.log(`Total duration of videos =>: ${totalDurationMinutes} minutes`);
})
.catch((error) => {
console.error("Error:", error);
});
Explanation:
- Unzipping: The code uses the unzipper library to extract the video files from the zip archive.
- Temporary File Creation: Each extracted video is saved to a temporary file.
- Video Duration Calculation: The get-video-duration library is used to calculate the duration of each temporary video file.
- Total Duration Calculation: The total duration of all videos is calculated by summing up the individual durations.
- Cleanup: Temporary files are deleted after processing.
- Cross-Platform Compatibility:
- The code is designed to work on both Windows and Linux systems by using the path.sep property to determine the correct file separator.
Remember to:
- Replace the placeholder zipFilePath with the actual path to your zip file.
- Install the required dependencies (unzipper and get-video-duration) using npm install.
- Adjust the code and error handling as needed for your specific use case.
- By following these steps and understanding the code's logic, you can effectively calculate the total video duration from a zip archive using Node.js.
Thank you for reading. For more blog https://dev.to/slk5611
Top comments (0)