@@ -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
3234type 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
137161func (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 {
0 commit comments