Connor McCutcheon
/ SkyShot
screenshot.go
go
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)
}
No comments yet.