diff options
Diffstat (limited to 'reader/json/json.go')
-rw-r--r-- | reader/json/json.go | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/reader/json/json.go b/reader/json/json.go new file mode 100644 index 0000000..cd6a1c8 --- /dev/null +++ b/reader/json/json.go @@ -0,0 +1,171 @@ +// 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. + +package json + +import ( + "log" + "strings" + "time" + + "github.com/miniflux/miniflux2/helper" + "github.com/miniflux/miniflux2/model" + "github.com/miniflux/miniflux2/reader/date" + "github.com/miniflux/miniflux2/reader/processor" + "github.com/miniflux/miniflux2/reader/sanitizer" +) + +type jsonFeed struct { + Version string `json:"version"` + Title string `json:"title"` + SiteURL string `json:"home_page_url"` + FeedURL string `json:"feed_url"` + Author jsonAuthor `json:"author"` + Items []jsonItem `json:"items"` +} + +type jsonAuthor struct { + Name string `json:"name"` + URL string `json:"url"` +} + +type jsonItem struct { + ID string `json:"id"` + URL string `json:"url"` + Title string `json:"title"` + Summary string `json:"summary"` + Text string `json:"content_text"` + HTML string `json:"content_html"` + DatePublished string `json:"date_published"` + DateModified string `json:"date_modified"` + Author jsonAuthor `json:"author"` + Attachments []jsonAttachment `json:"attachments"` +} + +type jsonAttachment struct { + URL string `json:"url"` + MimeType string `json:"mime_type"` + Title string `json:"title"` + Size int `json:"size_in_bytes"` + Duration int `json:"duration_in_seconds"` +} + +func (j *jsonFeed) GetAuthor() string { + return getAuthor(j.Author) +} + +func (j *jsonFeed) Transform() *model.Feed { + feed := new(model.Feed) + feed.FeedURL = j.FeedURL + feed.SiteURL = j.SiteURL + feed.Title = sanitizer.StripTags(j.Title) + + if feed.Title == "" { + feed.Title = feed.SiteURL + } + + for _, item := range j.Items { + entry := item.Transform() + if entry.Author == "" { + entry.Author = j.GetAuthor() + } + + feed.Entries = append(feed.Entries, entry) + } + + return feed +} + +func (j *jsonItem) GetDate() time.Time { + for _, value := range []string{j.DatePublished, j.DateModified} { + if value != "" { + d, err := date.Parse(value) + if err != nil { + log.Println(err) + return time.Now() + } + + return d + } + } + + return time.Now() +} + +func (j *jsonItem) GetAuthor() string { + return getAuthor(j.Author) +} + +func (j *jsonItem) GetHash() string { + for _, value := range []string{j.ID, j.URL, j.Text + j.HTML + j.Summary} { + if value != "" { + return helper.Hash(value) + } + } + + return "" +} + +func (j *jsonItem) GetTitle() string { + for _, value := range []string{j.Title, j.Summary, j.Text, j.HTML} { + if value != "" { + return truncate(value) + } + } + + return j.URL +} + +func (j *jsonItem) GetContent() string { + for _, value := range []string{j.HTML, j.Text, j.Summary} { + if value != "" { + return value + } + } + + return "" +} + +func (j *jsonItem) GetEnclosures() model.EnclosureList { + enclosures := make(model.EnclosureList, 0) + + for _, attachment := range j.Attachments { + enclosures = append(enclosures, &model.Enclosure{ + URL: attachment.URL, + MimeType: attachment.MimeType, + Size: attachment.Size, + }) + } + + return enclosures +} + +func (j *jsonItem) Transform() *model.Entry { + entry := new(model.Entry) + entry.URL = j.URL + entry.Date = j.GetDate() + entry.Author = sanitizer.StripTags(j.GetAuthor()) + entry.Hash = j.GetHash() + entry.Content = processor.ItemContentProcessor(entry.URL, j.GetContent()) + entry.Title = sanitizer.StripTags(strings.Trim(j.GetTitle(), " \n\t")) + entry.Enclosures = j.GetEnclosures() + return entry +} + +func getAuthor(author jsonAuthor) string { + if author.Name != "" { + return author.Name + } + + return "" +} + +func truncate(str string) string { + max := 100 + if len(str) > max { + return str[:max] + "..." + } + + return str +} |