retrive more images from bing

This commit is contained in:
partisan 2024-08-21 12:30:03 +02:00
parent 32e94d1c2f
commit 25fb33a725

View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"encoding/json"
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
@ -36,45 +37,52 @@ func PerformBingImageSearch(query, safe, lang string, page int) ([]ImageSearchRe
// Extract data using goquery // Extract data using goquery
var results []ImageSearchResult var results []ImageSearchResult
doc.Find(".imgpt").Each(func(i int, s *goquery.Selection) { doc.Find(".iusc").Each(func(i int, s *goquery.Selection) {
// Extract image source
imgTag := s.Find("img") imgTag := s.Find("img")
imgSrc, exists := imgTag.Attr("src") imgSrc, exists := imgTag.Attr("src")
if !exists {
imgSrc, exists = imgTag.Attr("data-src")
if !exists { if !exists {
return return
} }
}
title, _ := imgTag.Attr("alt") // Extract the image title from `alt` attribute
title := imgTag.AttrOr("alt", "")
// Extract width and height if available // Extract width and height if available
width, _ := strconv.Atoi(imgTag.AttrOr("width", "0")) width, _ := strconv.Atoi(imgTag.AttrOr("width", "0"))
height, _ := strconv.Atoi(imgTag.AttrOr("height", "0")) height, _ := strconv.Atoi(imgTag.AttrOr("height", "0"))
// Extract the original image URL from the `mediaurl` parameter in the link // Extract the m parameter (JSON-encoded image metadata)
pageLink, exists := s.Find("a.iusc").Attr("href") metadata, exists := s.Attr("m")
mediaURL := "" if !exists {
if exists { return
if u, err := url.Parse(pageLink); err == nil {
if mediaURLParam := u.Query().Get("mediaurl"); mediaURLParam != "" {
mediaURL, _ = url.QueryUnescape(mediaURLParam)
}
}
} }
// Parse the metadata to get the media URL (the original image source)
var data map[string]interface{}
if err := json.Unmarshal([]byte(metadata), &data); err == nil {
mediaURL, ok := data["murl"].(string)
if ok {
results = append(results, ImageSearchResult{ results = append(results, ImageSearchResult{
Thumbnail: imgSrc, Thumbnail: imgSrc,
Title: strings.TrimSpace(title), Title: strings.TrimSpace(title),
Media: imgSrc, Media: mediaURL,
Width: width, Width: width,
Height: height, Height: height,
Source: mediaURL, // Original image URL Source: mediaURL,
ThumbProxy: imgSrc, ThumbProxy: imgSrc,
}) })
}
}
}) })
duration := time.Since(startTime) duration := time.Since(startTime)
// Check if the number of results is one or less // Check if the number of results is one or less
if len(results) <= 1 { if len(results) == 0 {
return nil, duration, fmt.Errorf("no images found") return nil, duration, fmt.Errorf("no images found")
} }