Repository navigation
Expand file tree
/
Copy pathcompression.js
More file actions
165 lines (141 loc) · 6.24 KB
/
Copy pathcompression.js
File metadata and controls
165 lines (141 loc) · 6.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
// Queue for images and cancel
let processing = false;
let imageQueue = [];
let outputLocationpath;
let compressionValue;
// Compression
const compressImages = () => {
setInterval(() => {
if (imageQueue.length && processing) {
processing = true;
sharp(imageQueue[0]).jpeg({
quality: compressionValue
}).toFile(outputLocationpath + path.basename(imageQueue[0].toString()), (err, info) => {
if (err) {
document.getElementById('textArea').value += "\nError on image: " + path.basename(imageQueue[0].toString()) + ". " + err;
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
} else {
if (imageQueue[0] !== undefined){
document.getElementById('textArea').value += "\nCompressed Image: " + path.basename(imageQueue[0].toString());
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
}
}
});
// Shift Queue
imageQueue.shift();
}
// Queue is done
if (imageQueue.length == 0 && processing) {
processing = false;
document.getElementById('start').innerText = "Start Compression";
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
document.getElementById('textArea').value += "\nCompression finished!";
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
}
}, 500);
}
// Helper functions
const checkFolders = (importFolder, exportFolder) => {
if (importFolder.length === 0 || exportFolder.length === 0) {
document.getElementById('textArea').value += "Missing import/export folder!";
return false;
}
return true;
}
// Event Listeners
document.getElementById('start').addEventListener('click', () => {
// Images are being processed
if (processing) {
clearQueue();
return;
}
// Reset
document.getElementById('textArea').value = "";
imageQueue = [];
clearInterval(compressImages);
// Import export folders
let importFolderLocation = document.getElementById('importChooser').files;
let exportFolderLocation = document.getElementById('exportChooser').files;
if (!checkFolders(importFolderLocation, exportFolderLocation)) {
return;
}
// Swap Button name
document.getElementById('start').innerText = "Cancel process...";
// Read All Files
document.getElementById('textArea').value += "Reading directory files";
fs.readdir(importFolderLocation[0].path, (err, files) => {
// Stop if error when starting
if (err) {
document.getElementById('textArea').value += "\nError starting process";
document.getElementById('textArea').value += "\n" + err;
throw new Error(err);
}
files.forEach((file) => {
// Only want JPEGS or PNG or GIF
if (path.extname(file) === ".jpg" || path.extname(file) === ".JPEG" || path.extname(file) === ".png" || path.extname(file) === ".JPG" || path.extname(file) === ".jpeg" || path.extname(file) === ".PNG" || path.extname(file) === ".GIF") {
let imageLocationPath = importFolderLocation[0].path + "/" + file;
imageQueue.push(imageLocationPath);
} else {
document.getElementById('textArea').value += "\n" + file + " is not a jpeg, png or gif image.";
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
}
});
// Reading done
document.getElementById('textArea').value += "\nFinished reading directory.";
document.getElementById('textArea').value += "\nStarting compression...";
document.getElementById('textArea').scrollTop = document.getElementById("textArea").scrollHeight;
// Start Compression
outputLocationpath = exportFolderLocation[0].path + "/";
compressionValue = 100 - parseInt(document.getElementById('compressionRate').value);
processing = true;
compressImages();
});
});
// Slider
document.getElementById('compressionRate').oninput = () => {
document.getElementById('compressionValue').innerText = document.getElementById('compressionRate').value;
}
// Div for buttons
document.getElementById('importButton').onclick = () => {
document.getElementById('importChooser').click();
}
document.getElementById('exportButton').onclick = () => {
document.getElementById('exportChooser').click();
}
// Name for Buttons
// Import
document.getElementById('importChooser').addEventListener('change', () => {
if (document.getElementById('importChooser').files[0] != undefined) {
document.getElementById('importText').innerText = "Import Folder " + document.getElementById('importChooser').files[0].name;
} else {
document.getElementById('importText').innerText = "Import Folder ";
}
});
// Export
document.getElementById('exportChooser').addEventListener('change', () => {
if (document.getElementById('exportChooser').files[0] != undefined) {
document.getElementById('exportText').innerText = "Export Folder " + document.getElementById('exportChooser').files[0].name;
} else {
document.getElementById('exportText').innerText = "Export Folder ";
}
});
// Clear Button
document.getElementById('clearButton').onclick = () => {
document.getElementById('exportChooser').value = null;
document.getElementById('importChooser').value = null;
document.getElementById('exportText').innerText = "Export Folder ";
document.getElementById('importText').innerText = "Import Folder ";
}
// Cancel Process
const clearQueue = () => {
imageQueue = [];
clearInterval(compressImages);
// Cancel message
document.getElementById('textArea').value += "\nComnpression cancelled by user.";
// Allow compression again
processing = false;
document.getElementById('start').innerText = "Start Compression";
}