Skip to content

Commit 471c473

Browse files
committed
allow forward tag declarations, added audio tag parsing
1 parent 5e37bb1 commit 471c473

File tree

2 files changed

+136
-38
lines changed

2 files changed

+136
-38
lines changed

opengraph/opengraph.go

Lines changed: 75 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ type Image struct {
1717
Type string `json:"type"`
1818
Width uint64 `json:"width"`
1919
Height uint64 `json:"height"`
20+
draft bool `json:"-"`
2021
}
2122

2223
// Video defines Open Graph Video type
@@ -26,13 +27,15 @@ type Video struct {
2627
Type string `json:"type"`
2728
Width uint64 `json:"width"`
2829
Height uint64 `json:"height"`
30+
draft bool `json:"-"`
2931
}
3032

3133
// Audio defines Open Graph Audio Type
3234
type Audio struct {
3335
URL string `json:"url"`
3436
SecureURL string `json:"secure_url"`
3537
Type string `json:"type"`
38+
draft bool `json:"-"`
3639
}
3740

3841
// Article contain Open Graph Article structure
@@ -133,6 +136,27 @@ func (og *OpenGraph) ProcessHTML(buffer io.Reader) error {
133136
}
134137
}
135138

139+
func (og *OpenGraph) ensureHasVideo() {
140+
if len(og.Videos) > 0 {
141+
return
142+
}
143+
og.Videos = append(og.Videos, &Video{draft: true})
144+
}
145+
146+
func (og *OpenGraph) ensureHasImage() {
147+
if len(og.Images) > 0 {
148+
return
149+
}
150+
og.Images = append(og.Images, &Image{draft: true})
151+
}
152+
153+
func (og *OpenGraph) ensureHasAudio() {
154+
if len(og.Audios) > 0 {
155+
return
156+
}
157+
og.Audios = append(og.Audios, &Audio{draft: true})
158+
}
159+
136160
// ProcessMeta processes meta attributes and adds them to Open Graph structure if they are suitable for that
137161
func (og *OpenGraph) ProcessMeta(metaAttrs map[string]string) {
138162
switch metaAttrs["property"] {
@@ -160,61 +184,74 @@ func (og *OpenGraph) ProcessMeta(metaAttrs map[string]string) {
160184
og.Locale = metaAttrs["content"]
161185
case "og:locale:alternate":
162186
og.LocalesAlternate = append(og.LocalesAlternate, metaAttrs["content"])
187+
case "og:audio":
188+
if len(og.Audios)>0 && og.Audios[len(og.Audios)-1].draft {
189+
og.Audios[len(og.Audios)-1].URL = metaAttrs["content"]
190+
og.Audios[len(og.Audios)-1].draft = false
191+
} else {
192+
og.Audios = append(og.Audios, &Audio{URL: metaAttrs["content"]})
193+
}
194+
case "og:audio:secure_url":
195+
og.ensureHasAudio()
196+
og.Audios[len(og.Audios)-1].SecureURL = metaAttrs["content"]
197+
case "og:audio:type":
198+
og.ensureHasAudio()
199+
og.Audios[len(og.Audios)-1].Type = metaAttrs["content"]
163200
case "og:image":
164-
og.Images = append(og.Images, &Image{URL: metaAttrs["content"]})
165-
case "og:image:url":
166-
if len(og.Images) > 0 {
201+
if len(og.Images)>0 && og.Images[len(og.Images)-1].draft {
167202
og.Images[len(og.Images)-1].URL = metaAttrs["content"]
203+
og.Images[len(og.Images)-1].draft = false
204+
} else {
205+
og.Images = append(og.Images, &Image{URL: metaAttrs["content"]})
168206
}
207+
case "og:image:url":
208+
og.ensureHasImage()
209+
og.Images[len(og.Images)-1].URL = metaAttrs["content"]
169210
case "og:image:secure_url":
170-
if len(og.Images) > 0 {
171-
og.Images[len(og.Images)-1].SecureURL = metaAttrs["content"]
172-
}
211+
og.ensureHasImage()
212+
og.Images[len(og.Images)-1].SecureURL = metaAttrs["content"]
173213
case "og:image:type":
174-
if len(og.Images) > 0 {
175-
og.Images[len(og.Images)-1].Type = metaAttrs["content"]
176-
}
214+
og.ensureHasImage()
215+
og.Images[len(og.Images)-1].Type = metaAttrs["content"]
177216
case "og:image:width":
178-
if len(og.Images) > 0 {
179-
w, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
180-
if err == nil {
181-
og.Images[len(og.Images)-1].Width = w
182-
}
217+
w, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
218+
if err == nil {
219+
og.ensureHasImage()
220+
og.Images[len(og.Images)-1].Width = w
183221
}
184222
case "og:image:height":
185-
if len(og.Images) > 0 {
186-
h, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
187-
if err == nil {
188-
og.Images[len(og.Images)-1].Height = h
189-
}
223+
h, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
224+
if err == nil {
225+
og.ensureHasImage()
226+
og.Images[len(og.Images)-1].Height = h
190227
}
191228
case "og:video":
192-
og.Videos = append(og.Videos, &Video{URL: metaAttrs["content"]})
193-
case "og:video:url":
194-
if len(og.Videos) > 0 {
229+
if len(og.Videos)>0 && og.Videos[len(og.Videos)-1].draft {
195230
og.Videos[len(og.Videos)-1].URL = metaAttrs["content"]
231+
og.Videos[len(og.Videos)-1].draft = false
232+
} else {
233+
og.Videos = append(og.Videos, &Video{URL: metaAttrs["content"]})
196234
}
235+
case "og:video:url":
236+
og.ensureHasVideo()
237+
og.Videos[len(og.Videos)-1].URL = metaAttrs["content"]
197238
case "og:video:secure_url":
198-
if len(og.Videos) > 0 {
199-
og.Videos[len(og.Videos)-1].SecureURL = metaAttrs["content"]
200-
}
239+
og.ensureHasVideo()
240+
og.Videos[len(og.Videos)-1].SecureURL = metaAttrs["content"]
201241
case "og:video:type":
202-
if len(og.Videos) > 0 {
203-
og.Videos[len(og.Videos)-1].Type = metaAttrs["content"]
204-
}
242+
og.ensureHasVideo()
243+
og.Videos[len(og.Videos)-1].Type = metaAttrs["content"]
205244
case "og:video:width":
206-
if len(og.Videos) > 0 {
207-
w, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
208-
if err == nil {
209-
og.Videos[len(og.Videos)-1].Width = w
210-
}
245+
w, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
246+
if err == nil {
247+
og.ensureHasVideo()
248+
og.Videos[len(og.Videos)-1].Width = w
211249
}
212250
case "og:video:height":
213-
if len(og.Videos) > 0 {
214-
h, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
215-
if err == nil {
216-
og.Videos[len(og.Videos)-1].Height = h
217-
}
251+
h, err := strconv.ParseUint(metaAttrs["content"], 10, 64)
252+
if err == nil {
253+
og.ensureHasVideo()
254+
og.Videos[len(og.Videos)-1].Height = h
218255
}
219256
default:
220257
if og.isArticle {

opengraph/opengraph_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,67 @@ func BenchmarkOpenGraph_ProcessHTML(b *testing.B) {
4242
}
4343
}
4444

45+
func TestOpenGraphForwardDetails(t *testing.T) {
46+
const sample = `<!DOCTYPE html>
47+
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
48+
<meta property="og:title" content="Humpback"/>
49+
<meta property="og:type" content="video.other" />
50+
<meta property="og:image" content="https://i.imgur.com/h5FZ72Yh.jpg" />
51+
<meta property="og:video:width" content="720" />
52+
<meta property="og:video:height" content="720" />
53+
<meta property="og:video" content="https://i.imgur.com/h5FZ72Y.mp4" />
54+
<meta property="og:video:secure_url" content="https://i.imgur.com/h5FZ72Y.mp4" />
55+
<meta property="og:video:type" content="video/mp4" />
56+
<meta property="og:description" content="Imgur: The magic of the Internet"/>
57+
58+
<meta property="og:video" content="https://i.imgur.com/h5FZ72Y.ogg" />
59+
<meta property="og:video:type" content="video/ogg" />
60+
<meta property="og:video:width" content="360" />
61+
62+
<meta property="og:audio:type" content="audio/mp3" />
63+
<meta property="og:audio" content="https://i.imgur.com/h5FZ72Y.mp3" />
64+
`
65+
66+
og := opengraph.NewOpenGraph()
67+
err := og.ProcessHTML(strings.NewReader(sample))
68+
69+
if err != nil {
70+
t.Fatal(err)
71+
}
72+
73+
if og.Type != "video.other" {
74+
t.Error("type parsed incorrectly")
75+
}
76+
77+
if len(og.Videos) != 2 {
78+
t.Error("videos parsed incorrectly")
79+
} else {
80+
if og.Videos[0].URL != "https://i.imgur.com/h5FZ72Y.mp4" {
81+
t.Error("video url parsed incorrectly")
82+
}
83+
if og.Videos[0].Width != 720 {
84+
t.Error("video width parsed incorrectly")
85+
}
86+
if og.Videos[1].URL != "https://i.imgur.com/h5FZ72Y.ogg" {
87+
t.Error("video url parsed incorrectly")
88+
}
89+
if og.Videos[1].Width != 360 {
90+
t.Error("video width parsed incorrectly")
91+
}
92+
}
93+
94+
if len(og.Audios) != 1 {
95+
t.Error("audio parsed incorrectly")
96+
} else {
97+
if og.Audios[0].URL != "https://i.imgur.com/h5FZ72Y.mp3" {
98+
t.Error("audio url parsed incorrectly")
99+
}
100+
if og.Audios[0].Type != "audio/mp3" {
101+
t.Error("audio type parsed incorrectly")
102+
}
103+
}
104+
}
105+
45106
func TestOpenGraphProcessHTML(t *testing.T) {
46107
og := opengraph.NewOpenGraph()
47108
err := og.ProcessHTML(strings.NewReader(html))

0 commit comments

Comments
 (0)