Compare commits

...

6 commits

Author SHA1 Message Date
a4285b8939 Merge pull request 'bug fixes' (#10) from work into main
Reviewed-on: #10
2024-08-21 11:08:31 +00:00
partisan
25fb33a725 retrive more images from bing 2024-08-21 12:30:03 +02:00
partisan
32e94d1c2f change cookies from any site to strict 2024-08-21 12:01:19 +02:00
partisan
a7e1ef812e fix user setting expiring immediately 2024-08-21 11:08:37 +02:00
partisan
3b4b9ee83a revert img proxy for video 2024-08-20 18:41:56 +02:00
779aa87636 fix typos 2024-08-20 04:57:31 +00:00
4 changed files with 45 additions and 31 deletions

View file

@ -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 | ❌ | ❌ | ❌ | ✅ |

View file

@ -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 {
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
}
// 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: imgSrc,
Media: mediaURL,
Width: width,
Height: height,
Source: mediaURL, // Original image URL
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")
}

View file

@ -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: "/",
Expires: expiration, // Expiration time needs to be set otherwise it will expire immediately
Secure: true, // Ensure cookie is sent over HTTPS only
SameSite: http.SameSiteNoneMode, // Set SameSite to None
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)

2
video.go Executable file → Normal file
View file

@ -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),
})
}