package models
import (
"context"
"errors"
"fmt"
"log"
"github.com/chromedp/chromedp"
"theskyscape.com/repo/skykit"
)
type Screenshot struct {
skykit.Model
ImageData []byte // The screenshot image as PNG bytes
}
// CreateScreenshot creates a new screenshot record
func CreateScreenshot(appName string, imageData []byte) (*Screenshot, error) {
screenshot := &Screenshot{
Model: skykit.Model{ID: appName},
ImageData: imageData,
}
if _, err := Screenshots.Insert(screenshot); err != nil {
return screenshot, Screenshots.Update(screenshot)
}
return screenshot, nil
}
func CaptureScreenshot(appName string) (*Screenshot, error) {
// Create allocator with ignore certificate errors flag
opts := append(chromedp.DefaultExecAllocatorOptions[:],
chromedp.Flag("ignore-certificate-errors", true),
)
allocCtx, allocCancel := chromedp.NewExecAllocator(context.Background(), opts...)
defer allocCancel()
ctx, cancel := chromedp.NewContext(allocCtx)
defer cancel()
var buf []byte
targetURL := fmt.Sprintf("https://%s.skysca.pe", appName)
// Capture screenshot
log.Printf("captureScreenshot: Running chromedp actions for URL: %s", targetURL)
if err := chromedp.Run(ctx,
chromedp.EmulateViewport(768, 432),
chromedp.Navigate(targetURL),
chromedp.WaitReady("body"),
chromedp.CaptureScreenshot(&buf),
); err != nil {
if errors.Is(err, context.DeadlineExceeded) {
log.Printf("captureScreenshot: Timeout exceeded for URL: %s", targetURL)
return nil, errors.New("screenshot capture timed out")
}
log.Printf("captureScreenshot: Error for URL %s: %v", targetURL, err)
return nil, err
}
return CreateScreenshot(appName, buf)
}