diff --git a/README.md b/README.md index a50212c..c3a4663 100644 --- a/README.md +++ b/README.md @@ -32,12 +32,12 @@ A self-hosted private and anonymous [metasearch engine](https://en.wikipedia.org ## Comparison to other search engines -| Feature | Whoogle | Araa-Search | LibreY | 4get | *Warp* | +| Feature | Whoogle [1] | Araa-Search | LibreY | 4get | *Warp* | | :----------------------------------- | ------------------ | ------------------------- | ------------------------ | ------------------------ | ---------------------------------------------------- | | Works without JavaScript | ✅ | ✅ | ✅ | ✅ | ✅ | | Music search | ❓ | ❌ | ❌ | ✅ | ✅ | | Torrent search | ❌ | ✅ | ✅ | ❌ | ✅ | -| API | ❌ | ✅ | ✅ | ✅ | ✅ | +| API | ❌ | ✅ | ❓ [2] | ✅ | ✅ | | Scalable | ❌ | ❌ | ❌ | ❌ | ✅ | | Not Resource Hungry | ❓ Moderate | ❌ Very resource hungry | ❌ Moderate 200-400mb~ | ❌ Moderate 200-400mb~ | ✅ about 15-20MiB at idle, 17-22MiB when searching | | Dynamic Page Loading | ❓ Not specified | ❌ | ❌ | ❌ | ✅ | diff --git a/images-bing.go b/images-bing.go index a9f8717..d6e37c5 100644 --- a/images-bing.go +++ b/images-bing.go @@ -1,6 +1,7 @@ package main import ( + "encoding/json" "fmt" "net/http" "net/url" @@ -36,45 +37,52 @@ func PerformBingImageSearch(query, safe, lang string, page int) ([]ImageSearchRe // Extract data using goquery 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") imgSrc, exists := imgTag.Attr("src") if !exists { - return + imgSrc, exists = imgTag.Attr("data-src") + if !exists { + return + } } - title, _ := imgTag.Attr("alt") + // Extract the image title from `alt` attribute + title := imgTag.AttrOr("alt", "") // Extract width and height if available width, _ := strconv.Atoi(imgTag.AttrOr("width", "0")) height, _ := strconv.Atoi(imgTag.AttrOr("height", "0")) - // Extract the original image URL from the `mediaurl` parameter in the link - pageLink, exists := s.Find("a.iusc").Attr("href") - mediaURL := "" - if exists { - if u, err := url.Parse(pageLink); err == nil { - if mediaURLParam := u.Query().Get("mediaurl"); mediaURLParam != "" { - mediaURL, _ = url.QueryUnescape(mediaURLParam) - } - } + // Extract the m parameter (JSON-encoded image metadata) + metadata, exists := s.Attr("m") + if !exists { + return } - results = append(results, ImageSearchResult{ - Thumbnail: imgSrc, - Title: strings.TrimSpace(title), - Media: imgSrc, - Width: width, - Height: height, - Source: mediaURL, // Original image URL - ThumbProxy: imgSrc, - }) + // 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{ + Thumbnail: imgSrc, + Title: strings.TrimSpace(title), + Media: mediaURL, + Width: width, + Height: height, + Source: mediaURL, + ThumbProxy: imgSrc, + }) + } + } }) duration := time.Since(startTime) // 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") } diff --git a/user-settings.go b/user-settings.go index 9b7b5ee..83fee6c 100755 --- a/user-settings.go +++ b/user-settings.go @@ -3,6 +3,7 @@ package main import ( "html/template" "net/http" + "time" ) type UserSettings struct { @@ -39,26 +40,31 @@ func loadUserSettings(r *http.Request) UserSettings { } func saveUserSettings(w http.ResponseWriter, settings UserSettings) { + expiration := time.Now().Add(90 * 24 * time.Hour) // 90 days from now + http.SetCookie(w, &http.Cookie{ Name: "theme", Value: settings.Theme, Path: "/", - Secure: true, // Ensure cookie is sent over HTTPS only - SameSite: http.SameSiteNoneMode, // Set SameSite to None + Expires: expiration, // Expiration time needs to be set otherwise it will expire immediately + Secure: true, // Ensure cookie is sent over HTTPS only + SameSite: http.SameSiteStrictMode, }) http.SetCookie(w, &http.Cookie{ Name: "language", Value: settings.Language, Path: "/", - Secure: true, // Ensure cookie is sent over HTTPS only - SameSite: http.SameSiteNoneMode, // Set SameSite to None + Expires: expiration, + Secure: true, + SameSite: http.SameSiteStrictMode, }) http.SetCookie(w, &http.Cookie{ Name: "safe", Value: settings.SafeSearch, Path: "/", - Secure: true, // Ensure cookie is sent over HTTPS only - SameSite: http.SameSiteNoneMode, // Set SameSite to None + Expires: expiration, + Secure: true, + SameSite: http.SameSiteStrictMode, }) printDebug("settings saved: %v", settings) diff --git a/video.go b/video.go old mode 100755 new mode 100644 index 1633853..ccda543 --- a/video.go +++ b/video.go @@ -206,7 +206,7 @@ func fetchVideoResults(query, safe, lang string, page int) []VideoResult { Views: formatViews(item.Views), Creator: item.UploaderName, Publisher: "Piped", - Image: fmt.Sprintf("/img_proxy?url=%s", url.QueryEscape(item.Thumbnail)), + Image: item.Thumbnail, //fmt.Sprintf("/img_proxy?url=%s", url.QueryEscape(item.Thumbnail)), // Using image proxy is not working, but its not needed here as piped is proxy anyway Duration: formatDuration(item.Duration), }) }