aboutsummaryrefslogtreecommitdiffhomepage
path: root/reader/json/json.go
diff options
context:
space:
mode:
Diffstat (limited to 'reader/json/json.go')
-rw-r--r--reader/json/json.go171
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
+}