feat: allow getPreviewLinkData for all whitelisted links (#2094)
* feat: allow getPreviewLinkData for all links Only YouTube links were supported in `getPreviewLinkData` previously. Now, any whitelisted links can have their data retreived using this function, returning the true content type (by examining the header bytes of the content). feat: add tenor.com and giphy.com to whitelisted urls list * Fix json format * bump VERSION * Lint urls.go Co-authored-by: Andrea Maria Piana <andrea.maria.piana@gmail.com>
This commit is contained in:
parent
cdca42b90f
commit
149877a939
|
@ -6,6 +6,7 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type OembedData struct {
|
type OembedData struct {
|
||||||
|
@ -18,11 +19,13 @@ type LinkPreviewData struct {
|
||||||
Site string `json:"site"`
|
Site string `json:"site"`
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
ThumbnailURL string `json:"thumbnailUrl"`
|
ThumbnailURL string `json:"thumbnailUrl"`
|
||||||
|
ContentType string `json:"contentType"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Site struct {
|
type Site struct {
|
||||||
Title string `json:"title"`
|
Title string `json:"title"`
|
||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
|
ImageSite bool `json:"imageSite"`
|
||||||
}
|
}
|
||||||
|
|
||||||
const YouTubeOembedLink = "https://www.youtube.com/oembed?format=json&url=%s"
|
const YouTubeOembedLink = "https://www.youtube.com/oembed?format=json&url=%s"
|
||||||
|
@ -30,12 +33,24 @@ const YouTubeOembedLink = "https://www.youtube.com/oembed?format=json&url=%s"
|
||||||
func LinkPreviewWhitelist() []Site {
|
func LinkPreviewWhitelist() []Site {
|
||||||
return []Site{
|
return []Site{
|
||||||
Site{
|
Site{
|
||||||
Title: "YouTube",
|
Title: "YouTube",
|
||||||
Address: "youtube.com",
|
Address: "youtube.com",
|
||||||
|
ImageSite: false,
|
||||||
},
|
},
|
||||||
Site{
|
Site{
|
||||||
Title: "YouTube shortener",
|
Title: "YouTube shortener",
|
||||||
Address: "youtu.be",
|
Address: "youtu.be",
|
||||||
|
ImageSite: false,
|
||||||
|
},
|
||||||
|
Site{
|
||||||
|
Title: "Tenor GIFs",
|
||||||
|
Address: "tenor.com",
|
||||||
|
ImageSite: true,
|
||||||
|
},
|
||||||
|
Site{
|
||||||
|
Title: "GIPHY GIFs",
|
||||||
|
Address: "giphy.com",
|
||||||
|
ImageSite: true,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,9 +102,23 @@ func GetLinkPreviewData(link string) (previewData LinkPreviewData, err error) {
|
||||||
return previewData, fmt.Errorf("Cant't parse link %s", link)
|
return previewData, fmt.Errorf("Cant't parse link %s", link)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch url.Hostname() {
|
hostname := strings.ToLower(url.Hostname())
|
||||||
case "youtube.com", "www.youtube.com", "youtu.be":
|
youtubeHostnames := []string{"youtube.com", "www.youtube.com", "youtu.be"}
|
||||||
return GetYoutubePreviewData(link)
|
for _, youtubeHostname := range youtubeHostnames {
|
||||||
|
if youtubeHostname == hostname {
|
||||||
|
return GetYoutubePreviewData(link)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for _, site := range LinkPreviewWhitelist() {
|
||||||
|
if strings.HasSuffix(hostname, site.Address) && site.ImageSite {
|
||||||
|
content, contentErr := GetURLContent(link)
|
||||||
|
if contentErr != nil {
|
||||||
|
return previewData, contentErr
|
||||||
|
}
|
||||||
|
previewData.ThumbnailURL = link
|
||||||
|
previewData.ContentType = http.DetectContentType(content)
|
||||||
|
return previewData, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return previewData, fmt.Errorf("Link %s isn't whitelisted. Hostname - %s", link, url.Hostname())
|
return previewData, fmt.Errorf("Link %s isn't whitelisted. Hostname - %s", link, url.Hostname())
|
||||||
|
|
Loading…
Reference in New Issue