Better metadata
This commit is contained in:
@@ -16,18 +16,7 @@
|
|||||||
|
|
||||||
{{template "bgpattern"}}
|
{{template "bgpattern"}}
|
||||||
|
|
||||||
<meta name="theme-color" content="#202020"/>
|
{{.OGData}}
|
||||||
<meta name="twitter:image" content="{{.OGData.Image}}" />
|
|
||||||
<meta property="og:title" content="{{.OGData.Title}}" />
|
|
||||||
<meta property="og:type" content="{{.OGData.Type}}" />
|
|
||||||
<meta property="og:site_name" content="{{.OGData.SiteName}}" />
|
|
||||||
<meta property="og:description" content="{{.OGData.Description}}" />
|
|
||||||
<meta property="description" content="{{.OGData.Description}}" />
|
|
||||||
<meta property="og:url" content="{{.OGData.URL}}" />
|
|
||||||
<meta property="og:image" content="{{.OGData.Image}}" />
|
|
||||||
<meta property="og:image:url" content="{{.OGData.Image}}" />
|
|
||||||
<meta property="article:author" content="Fornax96" />
|
|
||||||
<link rel="image_src" href="{{.OGData.Image}}" />
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var apiEndpoint = '{{.APIEndpoint}}';
|
var apiEndpoint = '{{.APIEndpoint}}';
|
||||||
|
@@ -48,7 +48,7 @@ func (wc *WebController) serveFileViewer(w http.ResponseWriter, r *http.Request,
|
|||||||
}
|
}
|
||||||
|
|
||||||
templateData := wc.newTemplateData(w, r)
|
templateData := wc.newTemplateData(w, r)
|
||||||
templateData.OGData = OpenGraphFromFile(*finfo[0])
|
templateData.OGData = metadataFromFile(*finfo[0])
|
||||||
var err error
|
var err error
|
||||||
if list {
|
if list {
|
||||||
templateData.Title = fmt.Sprintf("%d files in Pixeldrain", len(finfo))
|
templateData.Title = fmt.Sprintf("%d files in Pixeldrain", len(finfo))
|
||||||
|
@@ -24,7 +24,7 @@ func (wc *WebController) serveListViewer(w http.ResponseWriter, r *http.Request,
|
|||||||
|
|
||||||
var templateData = wc.newTemplateData(w, r)
|
var templateData = wc.newTemplateData(w, r)
|
||||||
templateData.Title = fmt.Sprintf("%s ~ Pixeldrain list", list.Title)
|
templateData.Title = fmt.Sprintf("%s ~ Pixeldrain list", list.Title)
|
||||||
templateData.OGData = OpenGraphFromList(*list)
|
templateData.OGData = metadataFromList(*list)
|
||||||
templateData.Other = viewerData{
|
templateData.Other = viewerData{
|
||||||
Type: "list",
|
Type: "list",
|
||||||
CaptchaKey: wc.captchaSiteKey,
|
CaptchaKey: wc.captchaSiteKey,
|
||||||
|
@@ -1,38 +1,87 @@
|
|||||||
package webcontroller
|
package webcontroller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"html/template"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"fornaxian.com/pixeldrain-web/pixelapi"
|
"fornaxian.com/pixeldrain-web/pixelapi"
|
||||||
)
|
)
|
||||||
|
|
||||||
// OGData holds all information needed to populate the various meta tags on the
|
type ogRule struct {
|
||||||
// file and list viewer
|
Prop string
|
||||||
type OGData struct {
|
Content string
|
||||||
Title string
|
|
||||||
Type string
|
|
||||||
SiteName string
|
|
||||||
Description string
|
|
||||||
URL string
|
|
||||||
Image string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGraphFromFile populates the OGData object from FileInfo
|
func (o ogRule) HTML() template.HTML {
|
||||||
func OpenGraphFromFile(f pixelapi.FileInfo) (og OGData) {
|
return template.HTML(`<meta property="` + o.Prop + `" content="` + o.Content + `"/>` + "\n")
|
||||||
og.Title = f.Name
|
|
||||||
og.Type = "website"
|
|
||||||
og.SiteName = "Pixeldrain"
|
|
||||||
og.Description = "View " + f.Name + " on Pixeldrain"
|
|
||||||
og.URL = "/u/" + f.ID
|
|
||||||
og.Image = "/api/file/" + f.ID + "/thumbnail"
|
|
||||||
return og
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGraphFromList populates the OGData object from a List
|
type twitterRule struct {
|
||||||
func OpenGraphFromList(l pixelapi.List) (og OGData) {
|
Name string
|
||||||
og.Title = l.Title
|
Content string
|
||||||
og.Type = "website"
|
}
|
||||||
og.SiteName = "Pixeldrain"
|
|
||||||
og.Description = "View " + l.Title + " on Pixeldrain"
|
func (o twitterRule) HTML() template.HTML {
|
||||||
og.URL = "/l/" + l.ID
|
return template.HTML(`<meta name="` + o.Name + `" content="` + o.Content + `"/>` + "\n")
|
||||||
og.Image = "/api/file/" + l.Files[0].ID + "/thumbnail"
|
}
|
||||||
return og
|
|
||||||
|
type linkRule struct {
|
||||||
|
Rel string
|
||||||
|
HREF string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o linkRule) HTML() template.HTML {
|
||||||
|
return template.HTML(`<link name="` + o.Rel + `" href="` + o.HREF + `"/>` + "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func metadataFromFile(f pixelapi.FileInfo) (meta template.HTML) {
|
||||||
|
meta += ogRule{"og:title", f.Name}.HTML()
|
||||||
|
meta += ogRule{"og:site_name", "pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"og:description", "View '" + f.Name + "' on Pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"description", "View '" + f.Name + "' on Pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"og:url", "/u/" + f.ID}.HTML()
|
||||||
|
|
||||||
|
if strings.HasPrefix(f.MimeType, "image") {
|
||||||
|
meta += ogRule{"og:type", "article"}.HTML()
|
||||||
|
meta += ogRule{"og:image", "/api/file/" + f.ID}.HTML()
|
||||||
|
|
||||||
|
meta += twitterRule{"twitter:image", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += linkRule{"image_src", "/api/file/" + f.ID}.HTML()
|
||||||
|
} else if strings.HasPrefix(f.MimeType, "video") {
|
||||||
|
meta += ogRule{"og:type", "video.other"}.HTML()
|
||||||
|
meta += ogRule{"og:image", "/api/file/" + f.ID + "/thumbnail"}.HTML()
|
||||||
|
meta += ogRule{"og:video", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += ogRule{"og:video:secure_url", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += ogRule{"og:video:type", f.MimeType}.HTML()
|
||||||
|
|
||||||
|
meta += twitterRule{"twitter:card", "player"}.HTML()
|
||||||
|
meta += twitterRule{"twitter:image", "/api/file/" + f.ID + "/thumbnail"}.HTML()
|
||||||
|
meta += twitterRule{"twitter:player", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += twitterRule{"twitter:player:stream", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += twitterRule{"twitter:player:stream:content_type", f.MimeType}.HTML()
|
||||||
|
meta += linkRule{"image_src", "/api/file/" + f.ID + "/thumbnail"}.HTML()
|
||||||
|
} else if strings.HasPrefix(f.MimeType, "audio") {
|
||||||
|
meta += ogRule{"og:type", "music.song"}.HTML()
|
||||||
|
meta += ogRule{"og:audio", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += ogRule{"og:audio:secure_url", "/api/file/" + f.ID}.HTML()
|
||||||
|
meta += ogRule{"og:audio:type", f.MimeType}.HTML()
|
||||||
|
meta += linkRule{"image_src", "/api/file/" + f.ID + "/thumbnail"}.HTML()
|
||||||
|
} else {
|
||||||
|
meta += ogRule{"og:type", "website"}.HTML()
|
||||||
|
meta += linkRule{"image_src", "/api/file/" + f.ID + "/thumbnail"}.HTML()
|
||||||
|
}
|
||||||
|
return meta
|
||||||
|
}
|
||||||
|
func metadataFromList(l pixelapi.List) (meta template.HTML) {
|
||||||
|
meta += ogRule{"og:type", "website"}.HTML()
|
||||||
|
meta += ogRule{"og:title", l.Title}.HTML()
|
||||||
|
meta += ogRule{"og:site_name", "pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"og:description", "View '" + l.Title + "' on Pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"description", "View '" + l.Title + "' on Pixeldrain"}.HTML()
|
||||||
|
meta += ogRule{"og:url", "/l/" + l.ID}.HTML()
|
||||||
|
meta += ogRule{"og:image", "/api/file/" + l.Files[0].ID + "/thumbnail"}.HTML()
|
||||||
|
meta += ogRule{"og:image:url", "/api/file/" + l.Files[0].ID + "/thumbnail"}.HTML()
|
||||||
|
meta += twitterRule{"twitter:image", "/api/file/" + l.Files[0].ID + "/thumbnail"}.HTML()
|
||||||
|
meta += linkRule{"image_src", "/api/file/" + l.Files[0].ID + "/thumbnail"}.HTML()
|
||||||
|
return meta
|
||||||
}
|
}
|
||||||
|
@@ -23,7 +23,7 @@ type TemplateData struct {
|
|||||||
|
|
||||||
// Only used on file viewer page
|
// Only used on file viewer page
|
||||||
Title string
|
Title string
|
||||||
OGData OGData
|
OGData template.HTML
|
||||||
|
|
||||||
Other interface{}
|
Other interface{}
|
||||||
URLQuery url.Values
|
URLQuery url.Values
|
||||||
|
Reference in New Issue
Block a user