package urlpreview
import (
"context"
"net"
"net/http"
"net/url"
"git.sr.ht/~adnano/go-gemini"
)
var geminiDefaultClient = &gemini.Client{}
type Previewer struct {
HTTPClient *http.Client
GeminiClient *gemini.Client
UAOverrides map[string]string
}
func (p *Previewer) Preview(ctx context.Context, u *url.URL) (string, error) {
hostname := u.Hostname()
if hostname == "localhost" {
return "", nil
}
if ip := net.ParseIP(hostname); ip != nil && ip.IsLoopback() {
return "", nil
}
var (
res string
err error
handlers []func(context.Context, *url.URL) (string, error)
)
switch u.Scheme {
case "http", "https":
handlers = append(handlers, p.youtube, p.wolframalpha, p.jisho,
p.generic)
case "gemini":
handlers = append(handlers, p.gemini)
}
for _, h := range handlers {
res, err = h(ctx, u)
if res != "" || err != nil {
break
}
}
return res, err
}
func (p *Previewer) httpClient() *http.Client {
if p.HTTPClient != nil {
return p.HTTPClient
}
return http.DefaultClient
}
func (p *Previewer) geminiClient() *gemini.Client {
if p.GeminiClient != nil {
return p.GeminiClient
}
return geminiDefaultClient
}