| 6887 | }; |
| 6888 | |
| 6889 | // Process files in batches with concurrency limit |
| 6890 | for (let i = 0; i < filesToProcess.length; i += concurrency) { |
| 6891 | const batch = filesToProcess.slice(i, i + concurrency); |
| 6892 | await Promise.all(batch.map((filePath, batchIndex) => |
| 6893 | processFile(filePath, i + batchIndex) |
| 6894 | )); |
| 6895 | } |
| 6896 | |
| 6897 | // Signal batch completion for multiple files |
| 6898 | if (totalFiles > 1) { |
| 6899 | if (isServerMode && global.broadcastEvent) { |
| 6900 | global.broadcastEvent('batch-tag-generation-complete'); |
| 6901 | } else if (eventSender && eventSender.send) { |
| 6902 | eventSender.send('batch-tag-generation-complete'); |
| 6903 | } |
| 6904 | } |
| 6905 | } catch (error) { |
| 6906 | console.error('Error generating tags:', error); |
| 6907 | |
| 6908 | // Close progress dialog if open |
| 6909 | if (filePaths.length > 1 && eventSender && eventSender.send) { |
| 6910 | eventSender.send('close-progress-dialog'); |
| 6911 | } |
| 6912 | |
| 6913 | // Provide more user-friendly error messages |
| 6914 | let errorMessage = 'Could not generate tags'; |
| 6915 | let errorDetail = error.message || 'An unknown error occurred'; |
| 6916 | |
| 6917 | if (error.message && error.message.includes('Authentication failed')) { |
| 6918 | errorMessage = 'Authentication Error'; |
| 6919 | errorDetail = 'Your API key is invalid or has insufficient permissions. Please check your AI configuration settings.'; |
| 6920 | } else if (error.message && error.message.includes('Network error')) { |
| 6921 | errorMessage = 'Connection Error'; |
| 6922 | errorDetail = 'Unable to connect to the AI service. Please check your internet connection and API endpoint settings.'; |
| 6923 | } else if (error.message && error.message.includes('Rate limit')) { |
| 6924 | errorMessage = 'Rate Limit Exceeded'; |
| 6925 | // Extract the detailed message if available (after "Rate limit exceeded: ") |
| 6926 | const detailedMessage = error.message.includes('Rate limit exceeded: ') |
| 6927 | ? error.message.split('Rate limit exceeded: ')[1] |
| 6928 | : 'API rate limit has been exceeded. Please try again later.'; |
| 6929 | errorDetail = detailedMessage; |
| 6930 | } else if (error.message && error.message.includes('Invalid request')) { |