Skip to content

Commit fbfee87

Browse files
committed
feat: Implement bulk history management, file comparison, and media optimization features.
1 parent 3742e74 commit fbfee87

17 files changed

Lines changed: 1584 additions & 212 deletions

RELEASE_NOTES.md

Lines changed: 25 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,143 +1,37 @@
1-
# OpenConvert v1.3.3 Release Notes
1+
# OpenConvert v1.4.0 Release Notes
22

3-
After extensive development, we're excited to release OpenConvert v1.3.3 with major improvements, restored features, and a completely revamped user experience.
4-
5-
## What's Changed
6-
7-
This release represents a significant evolution of OpenConvert with a focus on feature completeness, user experience, and reliability.
3+
We are excited to announce OpenConvert v1.4.0! This release brings powerful new features, including advanced optimization options, smart format suggestions, and a more polished user interface.
84

95
## Major Features
106

11-
### 🎨 Complete UI Overhaul
12-
* **Modern React + TypeScript stack** - Migrated from Vue.js to React for better performance and type safety
13-
* **New technology stack**: React 19, Electron, Vite, Tailwind CSS 4.2, shadcn/ui components
14-
* **Custom titlebar** - Frameless window with native-like controls
15-
* **Collapsible sidebar** - Toggle between expanded and compact views
16-
* **Dark theme** - Beautiful dark UI with violet/indigo gradient accents
17-
* **Responsive layout** - Adaptive interface that responds to window resizing
18-
19-
### 🔄 Restored & Enhanced Conversion Support
20-
* **✅ Image conversion** - Fully working with Sharp library (PNG, JPEG, WebP, GIF, BMP, AVIF, TIFF, SVG, ICO, JPEG XL)
21-
* **✅ Video conversion** - Restored with FFmpeg support (MP4, MKV, AVI, MOV, WebM, 3GP, FLV, WMV)
22-
* **✅ Audio conversion** - Restored with FFmpeg support (MP3, WAV, AAC, OGG, FLAC, WMA, M4A)
23-
* **✅ Document conversion** - Added Pandoc support (PDF, EPUB, DOCX, TXT, RTF, ODT, XPS, CBZ, MOBI, FB2)
24-
* **Real-time progress tracking** - Visual progress bars for video and audio conversions
25-
* **Video to GIF** - Convert video files to animated GIFs
7+
### ✨ Format Auto-Detection & Smart Suggestions
8+
* **Intelligent recommendations** based on use cases (Web Optimized, Maximum Quality, Smallest File Size, Universal Compatibility).
9+
* **Estimated output file size** calculation before starting the conversion.
10+
* **Contextual suggestions** based on file characteristics, displayed with sparkle (✨) icons.
2611

27-
### 📊 New: History System
28-
* **SQLite3 database integration** - Now actively in use (previously tested but unused)
29-
* **Complete conversion history** - Track all conversions with detailed metadata
30-
* **Search & filter** - Find conversions by filename and filter by status
31-
* **Grouped timeline** - Organized by Today, Yesterday, Last 7 days, Older
32-
* **Quick actions**:
33-
- Show file in folder
34-
- Delete individual entries
35-
- Clear all history
36-
* **Pagination support** - Efficiently handle large conversion histories
12+
### ⚙️ Image, Video, and Audio Optimizations
13+
* **Image Optimizations**: Set custom width and height with various fit modes, rotate images (0-270°), and strip EXIF metadata for privacy.
14+
* **Video & Audio Options**: Fine-tune bitrates, resolutions (from 360p up to 4K), and frame rates (24, 30, 60 fps).
15+
* **Batch or Per-file Settings**: Apply settings across a batch or individually, with real-time previews.
3716

38-
### 📈 New: Analytics Dashboard
39-
* **Conversion statistics** - Total conversions, success/failure rates, file sizes processed
40-
* **Format analytics** - Most used source and target formats
41-
* **Performance metrics** - Fastest, slowest, and average conversion times
42-
* **Category breakdown** - Conversions by type (image/video/audio/document)
43-
* **Visual stats cards** - Beautiful dashboard with color-coded metrics
17+
### 📊 History & Comparison Enhancements
18+
* **Comparison View**: Side-by-side comparison of original and converted files, including visual thumbnails, file size percentage changes, and metadata differences.
19+
* **Bulk Operations**: Multi-select items in the History view for bulk deletion or export to CSV.
20+
* **Re-convert Completed Files**: Simply click the rotate (🔄) icon to reset a completed file to pending status and re-convert it with new settings.
4421

45-
### ⚙️ New: Complete Settings System
46-
* **General settings**:
47-
- Default output directory configuration
48-
- Auto-open folder after conversion
49-
- Show advanced settings toggle
50-
- Maximum file size and count limits
51-
* **Conversion settings**:
52-
- Quality presets (Low/Medium/High/Maximum)
53-
- Overwrite behavior (Auto-rename/Skip/Overwrite)
54-
- Concurrency control (1-10 simultaneous conversions)
55-
* **Persistent storage** - All settings saved to SQLite database
56-
* **Appearance options** - Theme preferences
57-
* **About section** - Version info and documentation links
22+
### 🔄 Enhanced Progress Feedback
23+
* **Real-time ETA calculations** based on conversion progress.
24+
* **Current operation display** keeps you informed on the exact step (e.g., "Encoding video...", "Processing image...").
25+
* **Accurate start time tracking** for precise duration estimates.
5826

59-
### 🎯 Enhanced Conversion Experience
60-
* **Per-file format selection** - Choose different target formats for each file
61-
* **Per-file quality control** - Configure quality settings individually
62-
* **Batch processing** - Convert multiple files with configurable concurrency
63-
* **Smart thumbnail generation** - Automatic previews for images and videos
64-
* **Category-based organization** - Color-coded files by type (green=image, blue=document, yellow=video, pink=audio)
65-
* **Better error handling** - Clear error messages and status indicators
66-
* **Overwrite protection** - Auto-rename with numbered copies (file (1).jpg)
27+
## UI & UX Improvements
6728

68-
## UI Improvements
69-
70-
* **Enhanced drag & drop** - Improved file upload area with visual feedback
71-
* **File queue management** - Add, remove, and organize files before conversion
72-
* **Image preview** - Click thumbnails to preview uploaded images
73-
* **Status indicators** - Visual feedback for pending, converting, done, and error states
74-
* **Empty state onboarding** - Helpful UI when no files are loaded
75-
* **Keyboard shortcuts**:
76-
- `F12` / `Ctrl+Shift+I` - Toggle DevTools
77-
- `Ctrl+,` - Open Settings
78-
- `Ctrl+Shift+H` - Open History
29+
* **Custom Alert Dialog System**: Replaced native browser alerts with custom, themed `AlertDialog` components matching the app's dark aesthetics (complete with backdrop blur and smooth focus management).
30+
* **Professional Checkboxes**: Integrated shadcn-ui styled accessible checkboxes featuring smooth animations, keyboard support, and proper ARIA labels.
31+
* **Progress Bar Fixes**: Progress percentage overlays are now permanently visible, centered, and cleanly stylized over the progress bar.
32+
* **Usability Enhancements**: Introduced collapsible optimization panels, visual ring effects for selected history items, and an overall cleaner settings layout.
7933

8034
## Technical Improvements
8135

82-
* **Technology stack changes**:
83-
- React 19.2.0 (from Vue.js)
84-
- TypeScript 5.9.3 for type safety
85-
- Vite 7.3.1 (maintained from electron-vite)
86-
- Tailwind CSS 4.2.1 (upgraded)
87-
- shadcn/ui component library (from daisyUI)
88-
- Better-SQLite3 12.6.2 for database operations
89-
* **Improved architecture**:
90-
- IPC communication between main and renderer processes
91-
- Centralized format configuration in `/src/config/formats.ts`
92-
- Better separation of concerns
93-
* **Build improvements**:
94-
- Linux AppImage and Snap support
95-
- Windows and macOS build configurations
96-
- Optimized electron-builder settings
97-
98-
## Plugins (Coming Soon)
99-
100-
* Placeholder view added for future plugin system
101-
* Planned: Custom converters via plugin architecture
102-
103-
## Bug Fixes
104-
105-
* Fixed file size handling and validation
106-
* Improved error messages for missing dependencies (FFmpeg, Pandoc)
107-
* Better handling of file overwrite scenarios
108-
* Fixed conversion queue management issues
109-
110-
## Breaking Changes
111-
112-
* Configuration from previous versions will not migrate automatically
113-
* New database schema for history and settings
114-
115-
## Requirements
116-
117-
* **Built-in support**: Image conversions work out of the box
118-
* **Optional dependencies**:
119-
- FFmpeg required for video and audio conversions
120-
- Pandoc required for document conversions
121-
122-
## Download
123-
124-
Available for Linux:
125-
- AppImage (portable)
126-
- Snap package
127-
128-
See the [Installation Guide](README.md#installation) for detailed instructions.
129-
130-
## What's Next
131-
132-
We're actively working on:
133-
- Enhanced plugin system for custom converters
134-
- More format support
135-
- Cloud storage integration
136-
- Batch conversion presets
137-
- Command-line interface
138-
139-
---
140-
141-
**Full Changelog**: [View all changes](../../compare/v1.0.0...v1.3.3)
142-
143-
Thank you to all contributors and users who provided feedback!
36+
* **Type Safety & Architecture**: Introduced comprehensive TypeScript interfaces for all optimization options, improved component modularity, and clean separation of concerns.
37+
* **Performance Enhancements**: Lazy-loaded thumbnails, efficient progress updates, and optimized memory management to ensure a smoother experience during batch operations.

electron/converters/image-converter.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,23 @@ import sharp from 'sharp'
22
import path from 'path'
33
import fs from 'fs/promises'
44

5+
export interface ImageOptimizationOptions {
6+
resize?: {
7+
width?: number
8+
height?: number
9+
fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
10+
}
11+
rotate?: number // Degrees: 0, 90, 180, 270
12+
stripMetadata?: boolean
13+
}
14+
515
export interface ImageConvertOptions {
616
sourcePath: string
717
outputDir: string
818
targetFormat: string
919
quality: number // 1-100
1020
overwriteBehavior: 'skip' | 'rename' | 'overwrite'
21+
optimizations?: ImageOptimizationOptions
1122
}
1223

1324
export interface ConvertResult {
@@ -120,6 +131,33 @@ export async function convertImage(options: ImageConvertOptions): Promise<Conver
120131
failOn: 'none', // Don't fail on minor image issues
121132
})
122133

134+
// Apply optimization options if provided
135+
const opts = options.optimizations
136+
137+
// Apply rotation
138+
if (opts?.rotate && opts.rotate !== 0) {
139+
pipeline = pipeline.rotate(opts.rotate)
140+
}
141+
142+
// Apply resize
143+
if (opts?.resize) {
144+
const { width, height, fit = 'inside' } = opts.resize
145+
if (width || height) {
146+
pipeline = pipeline.resize(width, height, {
147+
fit,
148+
withoutEnlargement: true,
149+
})
150+
}
151+
}
152+
153+
// Strip metadata if requested
154+
if (opts?.stripMetadata) {
155+
pipeline = pipeline.withMetadata({
156+
// Keep orientation but remove other EXIF data
157+
orientation: undefined,
158+
})
159+
}
160+
123161
// Apply format-specific conversion
124162
const format = targetFormat.toLowerCase()
125163
switch (format) {

electron/main.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,24 @@ ipcMain.handle('get-file-info', async (_event, filePath: string) => {
207207
// File Conversion
208208
// ========================================
209209

210+
interface ImageOptimizationOptions {
211+
resize?: {
212+
width?: number
213+
height?: number
214+
fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'
215+
}
216+
rotate?: number
217+
stripMetadata?: boolean
218+
}
219+
210220
interface ConvertFilePayload {
211221
sourcePath: string
212222
sourceExt: string
213223
sourceName: string
214224
sourceSize: number
215225
targetFormat: string
216226
fileId: string
227+
imageOptions?: ImageOptimizationOptions
217228
}
218229

219230
interface ConvertPayload {
@@ -273,12 +284,15 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
273284

274285
await processWithConcurrency(filesToConvert, concurrency, async (file) => {
275286
const category = getConverterCategory(file.sourceExt)
287+
const startTime = Date.now()
276288

277289
// Send progress: starting
278290
mainWindow?.webContents.send('conversion-progress', {
279291
fileId: file.fileId,
280292
progress: 10,
281293
status: 'converting',
294+
currentOperation: 'Initializing...',
295+
startTime,
282296
})
283297

284298
let result: { success: boolean; outputPath: string; error?: string; durationMs: number }
@@ -289,6 +303,8 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
289303
fileId: file.fileId,
290304
progress: 30,
291305
status: 'converting',
306+
currentOperation: 'Processing image...',
307+
startTime,
292308
})
293309

294310
result = await convertImage({
@@ -297,13 +313,16 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
297313
targetFormat: file.targetFormat,
298314
quality,
299315
overwriteBehavior,
316+
optimizations: file.imageOptions,
300317
})
301318

302319
// Send progress: almost done
303320
mainWindow?.webContents.send('conversion-progress', {
304321
fileId: file.fileId,
305322
progress: 90,
306323
status: 'converting',
324+
currentOperation: 'Finalizing...',
325+
startTime,
307326
})
308327
} else if (category === 'video' && isVideoFormat(file.sourceExt)) {
309328
// Video conversion with progress tracking
@@ -314,10 +333,16 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
314333
quality,
315334
overwriteBehavior,
316335
onProgress: (percent) => {
336+
const elapsed = (Date.now() - startTime) / 1000 // seconds
337+
const eta = percent > 0 ? Math.round((elapsed / percent) * (100 - percent)) : 0
338+
317339
mainWindow?.webContents.send('conversion-progress', {
318340
fileId: file.fileId,
319341
progress: percent,
320342
status: 'converting',
343+
currentOperation: 'Encoding video...',
344+
eta,
345+
startTime,
321346
})
322347
},
323348
})
@@ -330,10 +355,16 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
330355
quality,
331356
overwriteBehavior,
332357
onProgress: (percent) => {
358+
const elapsed = (Date.now() - startTime) / 1000 // seconds
359+
const eta = percent > 0 ? Math.round((elapsed / percent) * (100 - percent)) : 0
360+
333361
mainWindow?.webContents.send('conversion-progress', {
334362
fileId: file.fileId,
335363
progress: percent,
336364
status: 'converting',
365+
currentOperation: 'Encoding audio...',
366+
eta,
367+
startTime,
337368
})
338369
},
339370
})
@@ -343,6 +374,8 @@ ipcMain.handle('convert-files', async (_event, payload: ConvertPayload) => {
343374
fileId: file.fileId,
344375
progress: 50,
345376
status: 'converting',
377+
currentOperation: 'Converting document...',
378+
startTime,
346379
})
347380

348381
result = await convertDocument({

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "openconvert",
33
"private": true,
4-
"version": "1.3.3",
4+
"version": "1.4.0",
55
"type": "module",
66
"main": "dist-electron/main.js",
77
"scripts": {
@@ -28,7 +28,12 @@
2828
"linux": {
2929
"target": [
3030
"AppImage",
31-
"snap"
31+
"snap",
32+
"deb",
33+
"rpm",
34+
"tar.gz",
35+
"zip",
36+
"7z"
3237
],
3338
"category": "Utility"
3439
}

0 commit comments

Comments
 (0)