miniflux-v2/reader/rdf/rdf.go

121 lines
2.5 KiB
Go
Raw Normal View History

2017-11-21 03:34:11 +01:00
// Copyright 2017 Frédéric Guillot. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.
2018-08-25 06:51:50 +02:00
package rdf // import "miniflux.app/reader/rdf"
2017-11-21 03:34:11 +01:00
import (
"encoding/xml"
"html"
2017-11-22 23:52:31 +01:00
"strings"
2017-11-21 04:25:30 +01:00
"time"
2017-11-21 03:34:11 +01:00
2018-08-25 06:51:50 +02:00
"miniflux.app/crypto"
"miniflux.app/logger"
"miniflux.app/model"
"miniflux.app/reader/date"
"miniflux.app/reader/sanitizer"
"miniflux.app/url"
2017-11-21 03:34:11 +01:00
)
type rdfFeed struct {
XMLName xml.Name `xml:"RDF"`
Title string `xml:"channel>title"`
Link string `xml:"channel>link"`
Items []rdfItem `xml:"item"`
DublinCoreFeedElement
2017-11-21 03:34:11 +01:00
}
func (r *rdfFeed) Transform(baseURL string) *model.Feed {
var err error
2017-11-21 03:34:11 +01:00
feed := new(model.Feed)
feed.Title = sanitizer.StripTags(r.Title)
feed.FeedURL = baseURL
feed.SiteURL, err = url.AbsoluteURL(baseURL, r.Link)
if err != nil {
feed.SiteURL = r.Link
}
2017-11-21 03:34:11 +01:00
for _, item := range r.Items {
entry := item.Transform()
if entry.Author == "" && r.DublinCoreCreator != "" {
entry.Author = strings.TrimSpace(r.DublinCoreCreator)
2017-11-21 03:34:11 +01:00
}
if entry.URL == "" {
entry.URL = feed.SiteURL
2017-12-14 05:16:15 +01:00
} else {
entryURL, err := url.AbsoluteURL(feed.SiteURL, entry.URL)
if err == nil {
entry.URL = entryURL
}
2017-11-21 03:34:11 +01:00
}
feed.Entries = append(feed.Entries, entry)
}
return feed
}
type rdfItem struct {
Title string `xml:"title"`
Link string `xml:"link"`
Description string `xml:"description"`
DublinCoreEntryElement
2017-11-21 03:34:11 +01:00
}
func (r *rdfItem) Transform() *model.Entry {
entry := new(model.Entry)
entry.Title = r.entryTitle()
entry.Author = r.entryAuthor()
entry.URL = r.entryURL()
entry.Content = r.entryContent()
entry.Hash = r.entryHash()
entry.Date = r.entryDate()
2017-11-21 03:34:11 +01:00
return entry
}
func (r *rdfItem) entryTitle() string {
return html.UnescapeString(strings.TrimSpace(r.Title))
}
func (r *rdfItem) entryContent() string {
switch {
case r.DublinCoreContent != "":
return r.DublinCoreContent
default:
return r.Description
}
}
func (r *rdfItem) entryAuthor() string {
return strings.TrimSpace(r.DublinCoreCreator)
}
func (r *rdfItem) entryURL() string {
return strings.TrimSpace(r.Link)
}
func (r *rdfItem) entryDate() time.Time {
if r.DublinCoreDate != "" {
result, err := date.Parse(r.DublinCoreDate)
if err != nil {
2020-11-18 02:01:59 +01:00
logger.Error("rdf: %v (entry link = %s)", err, r.Link)
return time.Now()
}
return result
}
return time.Now()
}
func (r *rdfItem) entryHash() string {
2017-11-21 03:34:11 +01:00
value := r.Link
if value == "" {
value = r.Title + r.Description
}
2018-01-03 04:15:08 +01:00
return crypto.Hash(value)
2017-11-21 03:34:11 +01:00
}