ai-sub-translator 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,135 +1,134 @@
1
- # AI Subtitle Translator
1
+ # ai-sub-translator
2
2
 
3
- <img src="./images/screenshot.png" alt="App screenshot" width="512" height="712">
3
+ AI-powered subtitle translator using Google Gemini. Translates SRT subtitle files to any language.
4
4
 
5
- An Electron-based desktop application for translating subtitles using AI technology. This application allows users to translate subtitle files efficiently using Google's Generative AI.
5
+ ## Installation
6
6
 
7
- ## Features
7
+ ```bash
8
+ npm install ai-sub-translator
9
+ ```
8
10
 
9
- - Well, it translates subtitles
10
- - Progress bar
11
- - Modern React-based user interface (he-he)
12
- - Grab subtitles directly from video source
13
- - Support for both x64 and ARM64 Windows architectures
14
- - **Headless server mode** for servers (JSON-RPC API)
11
+ ## Quick Start
15
12
 
16
- ## ToDo
13
+ ```typescript
14
+ import { translate } from 'ai-sub-translator';
15
+ import { readFileSync } from 'fs';
17
16
 
18
- - Support .mks, .ass formats
19
- - Different AI models support
20
- - Download / Upload subtitles to subtitle websites
21
- - Proper UX/UI
17
+ const srtContent = readFileSync('movie.srt', 'utf-8');
22
18
 
23
- ## Known bugs
24
- - No proper progress for downloading ffmpeg
25
- - State is not cleared when load new subtitles
19
+ const result = await translate({
20
+ text: srtContent,
21
+ targetLanguage: 'French',
22
+ apiKey: 'your-gemini-api-key',
23
+ context: 'Breaking Bad S01E01',
24
+ onProgress: (p) => console.log(`${Math.round(p * 100)}%`),
25
+ });
26
26
 
27
- ## Usage
27
+ console.log(result.translatedText);
28
+ ```
28
29
 
29
- 1. Grab latest release or build the app
30
- 2. Obtain API key for Gemini AI [here](https://aistudio.google.com/app/apikey). **Free tier is enough**
31
- 3. Launch the app
32
- 4. Load source .srt file
33
- 5. Enter your API key, language to translate, name the piece of content that you want to translate (eg. Last of us season 2 episode 1)
34
- 6. Press Translate button. It should take couple of minutes (progress will be displayed)
30
+ ## API
35
31
 
36
- ## Prerequisites
32
+ ### `translate(options): Promise<TranslateResult>`
37
33
 
38
- - Node.js (v14 or higher)
39
- - npm (v6 or higher)
34
+ Translates SRT subtitle content to a target language using Google Gemini.
40
35
 
36
+ #### Options
41
37
 
42
- ## Installation
38
+ | Parameter | Type | Required | Default | Description |
39
+ |-----------|------|----------|---------|-------------|
40
+ | `text` | `string` | Yes | - | SRT subtitle content |
41
+ | `targetLanguage` | `string` | Yes | - | Target language (e.g., "French", "Spanish") |
42
+ | `apiKey` | `string` | Yes | - | Google Gemini API key |
43
+ | `model` | `string` | No | `gemini-2.0-flash` | Gemini model to use |
44
+ | `batchSize` | `number` | No | `50` | Subtitles per translation batch |
45
+ | `context` | `string` | No | `''` | Movie/show name for better translation |
46
+ | `onProgress` | `(progress: number) => void` | No | - | Progress callback (0-1 range) |
47
+ | `signal` | `AbortSignal` | No | - | Cancellation signal |
43
48
 
44
- 1. Clone the repository:
45
- ```bash
46
- git clone https://github.com/seeingred/ai-sub-translator.git
47
- cd ai-sub-translator
48
- ```
49
+ #### Returns `TranslateResult`
49
50
 
50
- 2. Install dependencies:
51
- ```bash
52
- npm install
51
+ ```typescript
52
+ {
53
+ translatedText: string; // Full translated SRT content
54
+ totalBatches: number; // Total batches processed
55
+ completedBatches: number; // Completed batches
56
+ }
53
57
  ```
54
58
 
59
+ ### `parseSrt(text): SrtEntry[]`
55
60
 
56
- ## Headless Server Mode
57
-
58
- The app can run as a headless server on Linux servers without GUI, exposing a JSON-RPC API for subtitle translation.
61
+ Parses SRT content into structured entries.
59
62
 
60
- ### Quick Start
61
- ```bash
62
- # On Linux server (auto-detects no display)
63
- ./ai-sub-translator
64
-
65
- # Force headless mode on any platform
66
- ./ai-sub-translator --headless
63
+ ```typescript
64
+ import { parseSrt } from 'ai-sub-translator';
67
65
 
68
- # Custom port
69
- API_PORT=8080 ./ai-sub-translator --headless
66
+ const entries = parseSrt(srtContent);
67
+ // [{ index: 1, timestamp: '00:00:01,000 --> 00:00:05,000', text: 'Hello' }, ...]
70
68
  ```
71
69
 
72
- **For full server documentation, see [README-SERVER.md](./README-SERVER.md)**
73
-
74
- ## Development
70
+ ### `formatSrt(entries): string`
75
71
 
76
- To start the application in development mode:
72
+ Formats structured entries back into SRT content.
77
73
 
78
- ```bash
79
- npm start
74
+ ```typescript
75
+ import { formatSrt } from 'ai-sub-translator';
80
76
 
81
- # Test headless mode locally
82
- npm start -- --headless
77
+ const srt = formatSrt(entries);
83
78
  ```
84
79
 
85
- ## Building
86
-
87
- To create a production build:
88
-
89
- ```bash
90
- npm run make
80
+ ## Types
81
+
82
+ ```typescript
83
+ interface SrtEntry {
84
+ index: number;
85
+ timestamp: string;
86
+ text: string;
87
+ }
88
+
89
+ interface TranslateOptions {
90
+ text: string;
91
+ targetLanguage: string;
92
+ apiKey: string;
93
+ model?: string;
94
+ batchSize?: number;
95
+ context?: string;
96
+ onProgress?: (progress: number) => void;
97
+ signal?: AbortSignal;
98
+ }
99
+
100
+ interface TranslateResult {
101
+ translatedText: string;
102
+ totalBatches: number;
103
+ completedBatches: number;
104
+ }
91
105
  ```
92
106
 
93
- This will create distributable packages for your platform.
94
-
95
- ### Building for specific architectures
96
-
97
- For Windows, you can build for specific architectures:
107
+ ## Supported Models
98
108
 
99
- ```bash
100
- # Build for Windows x64
101
- npm run make:win:x64
102
-
103
- # Build for Windows ARM64
104
- npm run make:win:arm64
109
+ All models have a free tier available from [Google AI Studio](https://aistudio.google.com/app/apikey):
105
110
 
106
- # Build for both Windows architectures
107
- npm run make:win:all
108
- ```
111
+ - `gemini-2.0-flash` (default, recommended)
112
+ - `gemini-2.5-flash`
113
+ - `gemini-1.5-flash`
114
+ - `gemini-1.5-flash-8b`
109
115
 
110
- ## Available Scripts
116
+ ## Cancellation
111
117
 
112
- - `npm start` - Start the application in development mode
113
- - `npm run make` - Create distributable packages for your current platform
114
- - `npm run make:win:x64` - Build Windows x64 package
115
- - `npm run make:win:arm64` - Build Windows ARM64 package
116
- - `npm run make:win:all` - Build Windows packages for both architectures
117
- - `npm run make:mac` - Build macOS package
118
- - `npm run make:linux` - Build Linux package
119
- - `npm run make:all` - Build packages for all platforms and architectures
118
+ ```typescript
119
+ const controller = new AbortController();
120
120
 
121
- ## Technologies Used
121
+ const result = translate({
122
+ text: srtContent,
123
+ targetLanguage: 'French',
124
+ apiKey: 'key',
125
+ signal: controller.signal,
126
+ });
122
127
 
123
- - Electron
124
- - React
125
- - TypeScript
126
- - Webpack
127
- - Google Generative AI API
128
+ // Cancel after 30 seconds
129
+ setTimeout(() => controller.abort(), 30000);
130
+ ```
128
131
 
129
132
  ## License
130
133
 
131
- This project is licensed under the MIT License - see the LICENSE file for details.
132
-
133
- ## Author
134
-
135
- Alex
134
+ MIT
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-client.d.ts","sourceRoot":"","sources":["../lib/gemini-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB5E"}
1
+ {"version":3,"file":"gemini-client.d.ts","sourceRoot":"","sources":["../src/gemini-client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwB5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-client.js","sourceRoot":"","sources":["../lib/gemini-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,6FAA6F,QAAQ;;;;;;;;;;WAU3G,OAAO;;EAEhB,IAAI,EAAE,CAAC;IAEP,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC;QAC/C,KAAK;QACL,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"gemini-client.js","sourceRoot":"","sources":["../src/gemini-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAU5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA0B;IACzD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,EAAE,GAAG,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEvC,MAAM,MAAM,GAAG,6FAA6F,QAAQ;;;;;;;;;;WAU3G,OAAO;;EAEhB,IAAI,EAAE,CAAC;IAEP,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC;QAC/C,KAAK;QACL,QAAQ,EAAE,MAAM;KACjB,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;AAC7B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { translate } from './translator';
2
- export { parseSrt, formatSrt } from './srt-parser';
3
- export type { TranslateOptions, TranslateResult, SrtEntry } from './types';
1
+ export { translate } from './translator.js';
2
+ export { parseSrt, formatSrt } from './srt-parser.js';
3
+ export type { TranslateOptions, TranslateResult, SrtEntry } from './types.js';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { translate } from './translator';
2
- export { parseSrt, formatSrt } from './srt-parser';
1
+ export { translate } from './translator.js';
2
+ export { parseSrt, formatSrt } from './srt-parser.js';
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { SrtEntry } from './types';
1
+ import { SrtEntry } from './types.js';
2
2
  export declare function parseSrt(text: string): SrtEntry[];
3
3
  export declare function formatSrt(entries: SrtEntry[]): string;
4
4
  //# sourceMappingURL=srt-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"srt-parser.d.ts","sourceRoot":"","sources":["../lib/srt-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0BjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAIrD"}
1
+ {"version":3,"file":"srt-parser.d.ts","sourceRoot":"","sources":["../src/srt-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CA0BjD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAIrD"}
@@ -1 +1 @@
1
- {"version":3,"file":"srt-parser.js","sourceRoot":"","sources":["../lib/srt-parser.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,KAAK,CAAC;YAAE,SAAS;QAE3B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAE7C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;SACnE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"srt-parser.js","sourceRoot":"","sources":["../src/srt-parser.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEzC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE/B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,KAAK,CAAC,KAAK,CAAC;YAAE,SAAS;QAE3B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAE7C,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAElC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAmB;IAC3C,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;SACnE,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AACzB,CAAC"}
@@ -1,3 +1,3 @@
1
- import { TranslateOptions, TranslateResult } from './types';
1
+ import { TranslateOptions, TranslateResult } from './types.js';
2
2
  export declare function translate(options: TranslateOptions): Promise<TranslateResult>;
3
3
  //# sourceMappingURL=translator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../lib/translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAY,MAAM,SAAS,CAAC;AA0BtE,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+CnF"}
1
+ {"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AA0BzE,wBAAsB,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CA+CnF"}
@@ -1,5 +1,5 @@
1
- import { parseSrt, formatSrt } from './srt-parser';
2
- import { callGemini } from './gemini-client';
1
+ import { parseSrt, formatSrt } from './srt-parser.js';
2
+ import { callGemini } from './gemini-client.js';
3
3
  const DEFAULT_MODEL = 'gemini-2.0-flash';
4
4
  const DEFAULT_BATCH_SIZE = 50;
5
5
  const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
@@ -1 +1 @@
1
- {"version":3,"file":"translator.js","sourceRoot":"","sources":["../lib/translator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,aAAa,GAAG,kBAAkB,CAAC;AACzC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAE/E,KAAK,UAAU,cAAc,CAC3B,OAAmB,EACnB,QAAgB,EAChB,OAAe,EACf,KAAa,EACb,MAAc;IAEd,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,OAAO,MAAM,UAAU,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAyB;IACvD,MAAM,EACJ,IAAI,EACJ,cAAc,EACd,MAAM,EACN,KAAK,GAAG,aAAa,EACrB,SAAS,GAAG,kBAAkB,EAC9B,OAAO,GAAG,EAAE,EACZ,UAAU,EACV,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC3D,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,cAAc,GAAG,EAAE,CAAC;IAExB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACnD,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAExF,cAAc,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC;QAC7D,gBAAgB,EAAE,CAAC;QAEnB,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC5D,CAAC"}
1
+ {"version":3,"file":"translator.js","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,37 +1,24 @@
1
1
  {
2
2
  "name": "ai-sub-translator",
3
- "productName": "ai-sub-translator",
4
- "version": "1.0.0",
3
+ "version": "1.0.2",
5
4
  "description": "AI-powered subtitle translator using Google Gemini. Translates SRT subtitles to any language.",
6
- "main": ".webpack/main",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
7
8
  "exports": {
8
9
  ".": {
9
10
  "import": "./dist/index.js",
10
11
  "types": "./dist/index.d.ts"
11
12
  }
12
13
  },
13
- "types": "./dist/index.d.ts",
14
- "type": "module",
15
14
  "files": [
16
15
  "dist"
17
16
  ],
18
17
  "scripts": {
19
- "start": "electron-forge start",
20
- "package": "electron-forge package",
21
- "make": "electron-forge make",
22
- "make:mac": "electron-forge make --platform darwin",
23
- "make:win:x64": "electron-forge make --platform win32 --arch x64",
24
- "make:win:arm64": "electron-forge make --platform win32 --arch arm64",
25
- "make:win": "npm run make:win:x64 && npm run make:win:arm64",
26
- "make:linux": "npm run make:linux:x64 && npm run make:linux:arm64",
27
- "make:linux:x64": "electron-forge make --platform linux --arch x64",
28
- "make:linux:arm64": "electron-forge make --platform linux --arch arm64",
29
- "make:all": "npm run make:mac && npm run make:win && npm run make:linux",
30
- "publish": "electron-forge publish",
31
- "lint": "eslint --ext .ts,.tsx .",
32
- "build:lib": "tsc -p tsconfig.lib.json",
33
- "test:lib": "node --experimental-vm-modules node_modules/.bin/jest --config jest.config.js",
34
- "prepublishOnly": "npm run build:lib"
18
+ "build": "tsc",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "prepublishOnly": "npm run build"
35
22
  },
36
23
  "keywords": [
37
24
  "subtitles",
@@ -46,46 +33,11 @@
46
33
  "email": "aka@aka.aka"
47
34
  },
48
35
  "license": "MIT",
49
- "devDependencies": {
50
- "@aws-sdk/client-s3": "^3.787.0",
51
- "@electron-forge/cli": "^7.8.0",
52
- "@electron-forge/maker-deb": "^7.8.0",
53
- "@electron-forge/maker-rpm": "^7.8.0",
54
- "@electron-forge/maker-squirrel": "^7.8.0",
55
- "@electron-forge/maker-zip": "^7.8.0",
56
- "@electron-forge/plugin-auto-unpack-natives": "^7.8.0",
57
- "@electron-forge/plugin-fuses": "^7.8.0",
58
- "@electron-forge/plugin-webpack": "^7.8.0",
59
- "@electron-forge/publisher-github": "^7.8.0",
60
- "@electron/fuses": "^1.8.0",
61
- "@types/jest": "^29.5.14",
62
- "@types/react": "^19.1.2",
63
- "@types/react-dom": "^19.1.2",
64
- "@types/unzipper": "^0.10.11",
65
- "@typescript-eslint/eslint-plugin": "^5.62.0",
66
- "@typescript-eslint/parser": "^5.62.0",
67
- "@vercel/webpack-asset-relocator-loader": "^1.7.3",
68
- "css-loader": "^6.11.0",
69
- "electron": "35.1.5",
70
- "electron-squirrel-startup": "^1.0.1",
71
- "eslint": "^8.57.1",
72
- "eslint-plugin-import": "^2.31.0",
73
- "fork-ts-checker-webpack-plugin": "^7.3.0",
74
- "jayson": "^4.2.0",
75
- "jest": "^29.7.0",
76
- "node-loader": "^2.1.0",
77
- "react": "^19.1.0",
78
- "react-dom": "^19.1.0",
79
- "style-loader": "^3.3.4",
80
- "tar": "^7.4.3",
81
- "ts-jest": "^29.4.6",
82
- "ts-loader": "^9.5.2",
83
- "ts-node": "^10.9.2",
84
- "typescript": "^5.9.3",
85
- "unzipper": "^0.12.3",
86
- "xz-decompress": "^0.2.2"
87
- },
88
36
  "dependencies": {
89
37
  "@google/genai": "^0.8.0"
38
+ },
39
+ "devDependencies": {
40
+ "typescript": "^5.7.2",
41
+ "vitest": "^2.1.8"
90
42
  }
91
43
  }