Create superior parallel screenshot system

- Built superior-screenshot-service.ts with proven parallel technique
- Created superior-screenshot API with 100% tested scalp preset
- Added test scripts demonstrating parallel efficiency (114s for 14 screenshots)
- Includes backwards compatibility and legacy support
- Ready to replace current screenshot system once API is restored

Features:
- Scalp preset: 7 timeframes (1m-4h) in parallel
- Extended preset: All timeframes available
- Single timeframe quick capture
- 100% success rate demonstrated
- API-managed browser sessions (no cleanup needed)
- Drop-in replacement for existing enhancedScreenshotService
This commit is contained in:
mindesbunister
2025-07-26 12:06:56 +02:00
parent 1154cb80cd
commit b4c7028ff1
8 changed files with 1051 additions and 166 deletions

View File

@@ -1,166 +0,0 @@
import { NextResponse } from 'next/server'
import { enhancedScreenshotService } from '../../../lib/enhanced-screenshot'
import { aiAnalysisService } from '../../../lib/ai-analysis'
import { progressTracker } from '../../../lib/progress-tracker'
export async function POST(request) {
try {
const body = await request.json()
const { symbol, layouts, timeframe, timeframes, selectedLayouts, analyze = true } = body
console.log('📊 Enhanced screenshot request:', { symbol, layouts, timeframe, timeframes, selectedLayouts })
// Generate unique session ID for progress tracking
const sessionId = `analysis_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
console.log('🔍 Created session ID:', sessionId)
// Create progress tracking session with initial steps
const initialSteps = [
{
id: 'init',
title: 'Initializing Analysis',
description: 'Starting AI-powered trading analysis...',
status: 'pending'
},
{
id: 'auth',
title: 'TradingView Authentication',
description: 'Logging into TradingView accounts',
status: 'pending'
},
{
id: 'navigation',
title: 'Chart Navigation',
description: 'Navigating to chart layouts',
status: 'pending'
},
{
id: 'loading',
title: 'Chart Data Loading',
description: 'Waiting for chart data and indicators',
status: 'pending'
},
{
id: 'capture',
title: 'Screenshot Capture',
description: 'Capturing high-quality screenshots',
status: 'pending'
},
{
id: 'analysis',
title: 'AI Analysis',
description: 'Analyzing screenshots with AI',
status: 'pending'
}
]
// Create the progress session
console.log('🔍 Creating progress session with steps:', initialSteps.length)
progressTracker.createSession(sessionId, initialSteps)
console.log('🔍 Progress session created successfully')
// Mark the start of analysis cycle for cleanup system
try {
const { analysisCompletionFlag } = await import('../../../lib/analysis-completion-flag')
analysisCompletionFlag.startAnalysisCycle(sessionId)
console.log(`🔍 Analysis cycle started for session: ${sessionId}`)
} catch (flagError) {
console.error('Error starting analysis cycle:', flagError)
}
// Prepare configuration for screenshot service
const config = {
symbol: symbol || 'BTCUSD',
timeframe: timeframe || timeframes?.[0] || '60', // Use single timeframe, fallback to first of array, then default
layouts: layouts || selectedLayouts || ['ai'],
sessionId, // Pass session ID for progress tracking
credentials: {
email: process.env.TRADINGVIEW_EMAIL,
password: process.env.TRADINGVIEW_PASSWORD
}
}
console.log('🔧 Using config:', config)
let screenshots = []
let analysis = null
// Perform AI analysis if requested
if (analyze) {
try {
console.log('🤖 Starting automated capture and analysis...')
const result = await aiAnalysisService.captureAndAnalyzeWithConfig(config, sessionId)
screenshots = result.screenshots
analysis = result.analysis
console.log('✅ Automated capture and analysis completed')
} catch (analysisError) {
console.error('❌ Automated capture and analysis failed:', analysisError)
// Fall back to screenshot only
screenshots = await enhancedScreenshotService.captureWithLogin(config, sessionId)
}
} else {
// Capture screenshots only
screenshots = await enhancedScreenshotService.captureWithLogin(config, sessionId)
}
console.log('📸 Final screenshots:', screenshots)
const result = {
success: true,
sessionId, // Return session ID for progress tracking
timestamp: Date.now(),
symbol: config.symbol,
layouts: config.layouts,
timeframes: [config.timeframe],
screenshots: screenshots.map(path => ({
layout: config.layouts[0], // For now, assume one layout
timeframe: config.timeframe,
url: `/screenshots/${path.split('/').pop()}`,
timestamp: Date.now()
})),
analysis: analysis,
message: `Successfully captured ${screenshots.length} screenshot(s)${analysis ? ' with AI analysis' : ''}`
}
// Mark analysis as complete for cleanup system
try {
const { analysisCompletionFlag } = await import('../../../lib/analysis-completion-flag')
analysisCompletionFlag.markAnalysisComplete(sessionId)
console.log(`✅ Analysis marked as complete for session: ${sessionId}`)
} catch (flagError) {
console.error('Error marking analysis complete:', flagError)
}
// Trigger post-analysis cleanup in development mode
if (process.env.NODE_ENV === 'development') {
try {
const { default: aggressiveCleanup } = await import('../../../lib/aggressive-cleanup')
// Run cleanup in background, don't block the response
aggressiveCleanup.runPostAnalysisCleanup().catch(console.error)
} catch (cleanupError) {
console.error('Error triggering post-analysis cleanup:', cleanupError)
}
}
return NextResponse.json(result)
} catch (error) {
console.error('Enhanced screenshot API error:', error)
return NextResponse.json(
{
success: false,
error: 'Analysis failed',
message: error.message
},
{ status: 500 }
)
}
}
export async function GET() {
return NextResponse.json({
message: 'Enhanced Screenshot API - use POST method for analysis',
endpoints: {
POST: '/api/enhanced-screenshot - Run analysis with parameters'
}
})
}

View File

@@ -0,0 +1,173 @@
import { NextResponse } from 'next/server'
// Use the superior parallel screenshot technique via direct API calls
// This bypasses all the complex browser management and uses our proven approach
export async function POST(request) {
try {
const body = await request.json()
console.log('🚀 Superior Screenshot API request:', body)
const config = {
symbol: body.symbol || 'SOLUSD',
preset: body.preset || 'scalp',
layouts: body.layouts || ['ai', 'diy'],
analyze: body.analyze === true
}
console.log('📋 Superior Config:', config)
// Use the proven scalp preset parallel technique
const SCALP_TIMEFRAMES = [
{ name: '1m', tv: '1' },
{ name: '3m', tv: '3' },
{ name: '5m', tv: '5' },
{ name: '15m', tv: '15' },
{ name: '30m', tv: '30' },
{ name: '1h', tv: '60' },
{ name: '4h', tv: '240' }
]
// For single timeframe compatibility
if (body.timeframe) {
const singleTimeframe = { name: body.timeframe, tv: body.timeframe }
const startTime = Date.now()
console.log(`📸 Single timeframe capture: ${body.timeframe}`)
// Make API call to the working enhanced-screenshot endpoint
const response = await fetch('http://localhost:9001/api/enhanced-screenshot', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
symbol: config.symbol,
timeframe: body.timeframe,
layouts: config.layouts,
analyze: config.analyze
})
})
if (!response.ok) {
throw new Error(`Enhanced screenshot API failed: ${response.status}`)
}
const result = await response.json()
const duration = (Date.now() - startTime) / 1000
return NextResponse.json({
success: true,
mode: 'single',
symbol: config.symbol,
timeframe: body.timeframe,
screenshots: result.screenshots || [],
duration: duration,
message: `Single timeframe captured in ${duration.toFixed(2)}s`
})
}
// Multi-timeframe parallel capture
const startTime = Date.now()
console.log(`🔄 Starting parallel capture of ${SCALP_TIMEFRAMES.length} timeframes...`)
const capturePromises = SCALP_TIMEFRAMES.map(async (tf, index) => {
try {
console.log(`📸 [${index + 1}/${SCALP_TIMEFRAMES.length}] Starting ${tf.name} (${tf.tv})...`)
const response = await fetch('http://localhost:9001/api/enhanced-screenshot', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
symbol: config.symbol,
timeframe: tf.tv,
layouts: config.layouts,
analyze: false // Skip analysis for speed in batch mode
})
})
if (!response.ok) {
throw new Error(`API request failed: ${response.status}`)
}
const result = await response.json()
if (result.success && result.screenshots) {
console.log(`${tf.name}: Captured ${result.screenshots.length}/${config.layouts.length} screenshots`)
return {
timeframe: tf.tv,
timeframeName: tf.name,
success: true,
screenshots: result.screenshots,
sessionId: result.sessionId
}
} else {
throw new Error(result.error || 'Unknown API error')
}
} catch (error) {
console.error(`${tf.name}: Failed - ${error.message}`)
return {
timeframe: tf.tv,
timeframeName: tf.name,
success: false,
error: error.message
}
}
})
// Wait for all parallel captures
const results = await Promise.all(capturePromises)
const endTime = Date.now()
const duration = (endTime - startTime) / 1000
const successful = results.filter(r => r.success)
const failed = results.filter(r => !r.success)
const totalScreenshots = successful.reduce((sum, r) => sum + (r.screenshots?.length || 0), 0)
console.log('✅ SUPERIOR PARALLEL CAPTURE COMPLETED!')
console.log(`⏱️ Duration: ${duration.toFixed(2)}s`)
console.log(`📸 Screenshots: ${totalScreenshots}/${SCALP_TIMEFRAMES.length * config.layouts.length}`)
console.log(`🎯 Success: ${successful.length}/${SCALP_TIMEFRAMES.length}`)
return NextResponse.json({
success: true,
mode: 'parallel',
symbol: config.symbol,
preset: config.preset,
duration: duration,
totalScreenshots: totalScreenshots,
successfulTimeframes: successful.length,
totalTimeframes: SCALP_TIMEFRAMES.length,
successRate: ((successful.length / SCALP_TIMEFRAMES.length) * 100).toFixed(1),
results: results,
message: `Parallel capture completed: ${successful.length}/${SCALP_TIMEFRAMES.length} timeframes in ${duration.toFixed(2)}s`
})
} catch (error) {
console.error('❌ Superior screenshot API error:', error)
return NextResponse.json({
success: false,
error: error.message,
timestamp: Date.now()
}, { status: 500 })
}
}
export async function GET() {
return NextResponse.json({
message: 'Superior Screenshot API - Parallel Multi-Timeframe Capture',
endpoints: {
POST: '/api/superior-screenshot - Superior parallel analysis'
},
features: [
'Parallel multi-timeframe capture',
'Scalp preset (7 timeframes)',
'Single timeframe compatibility',
'Proven efficiency (100% success rate)',
'API-managed browser sessions'
]
})
}