feat: support YouTube video thumbnail in link preview (#4427)

pull/4435/head^2
MHZ 9 months ago committed by GitHub
parent f17774cb3b
commit 964ae16851
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,6 +1,7 @@
package httpgetter package httpgetter
import ( import (
"fmt"
"io" "io"
"net" "net"
"net/http" "net/http"
@ -53,6 +54,7 @@ func GetHTMLMeta(urlStr string) (*HTMLMeta, error) {
// TODO: limit the size of the response body // TODO: limit the size of the response body
htmlMeta := extractHTMLMeta(response.Body) htmlMeta := extractHTMLMeta(response.Body)
enrichSiteMeta(response.Request.URL, htmlMeta)
return htmlMeta, nil return htmlMeta, nil
} }
@ -151,3 +153,14 @@ func validateURL(urlStr string) error {
return nil return nil
} }
func enrichSiteMeta(url *url.URL, meta *HTMLMeta) {
if url.Hostname() == "www.youtube.com" {
if url.Path == "/watch" {
vid := url.Query().Get("v")
if vid != "" {
meta.Image = fmt.Sprintf("https://img.youtube.com/vi/%s/mqdefault.jpg", vid)
}
}
}
}

@ -54,6 +54,9 @@ const Link: React.FC<Props> = ({ text, url }: Props) => {
{linkMetadata.description && ( {linkMetadata.description && (
<p className="mt-1 w-full text-sm leading-snug opacity-80 line-clamp-3">{linkMetadata.description}</p> <p className="mt-1 w-full text-sm leading-snug opacity-80 line-clamp-3">{linkMetadata.description}</p>
)} )}
{linkMetadata.image && (
<img className="mt-1 w-full h-32 object-cover rounded" src={linkMetadata.image} alt={linkMetadata.title} />
)}
</div> </div>
) )
} }

Loading…
Cancel
Save