aboutsummaryrefslogtreecommitdiff
path: root/internal/feed/mail.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/feed/mail.go')
-rw-r--r--internal/feed/mail.go53
1 files changed, 44 insertions, 9 deletions
diff --git a/internal/feed/mail.go b/internal/feed/mail.go
index 444f76a..ad669ae 100644
--- a/internal/feed/mail.go
+++ b/internal/feed/mail.go
@@ -11,6 +11,7 @@ import (
"strings"
"time"
+ "github.com/Necoro/go-readability"
"github.com/Necoro/gofeed"
"github.com/Necoro/html2text"
"github.com/PuerkitoBio/goquery"
@@ -18,6 +19,7 @@ import (
"github.com/emersion/go-message/mail"
"github.com/gabriel-vasile/mimetype"
"golang.org/x/net/html"
+ "golang.org/x/net/html/charset"
"github.com/Necoro/feed2imap-go/internal/feed/template"
"github.com/Necoro/feed2imap-go/internal/http"
@@ -248,25 +250,53 @@ func getImage(src string, ctx http.Context) ([]byte, string, error) {
return img, mimeStr, nil
}
+func getFullArticle(src string, ctx http.Context) (string, error) {
+ log.Debugf("Fetching article from '%s'", src)
+ resp, cancel, err := http.Get(src, ctx)
+ if err != nil {
+ return "", fmt.Errorf("fetching from '%s': %w", src, err)
+ }
+ defer cancel()
+
+ reader, err := charset.NewReader(resp.Body, resp.Header.Get("Content-Type"))
+ if err != nil {
+ return "", fmt.Errorf("detecting charset from '%s': %w", src, err)
+ }
+
+ doc, err := html.Parse(reader)
+ if err != nil {
+ return "", fmt.Errorf("parsing body from '%s': %w", src, err)
+ }
+
+ article, err := readability.FromDocument(doc, resp.Request.URL)
+ if err != nil {
+ return "", fmt.Errorf("parsing body from '%s': %w", src, err)
+ }
+
+ return article.Content, nil
+}
+
func cidNr(idx int) string {
return fmt.Sprintf("cid_%d", idx)
}
-func getBody(content, description string, bodyCfg config.Body) string {
+func (item *Item) getBody(bodyCfg config.Body) (string, error) {
switch bodyCfg {
case "default":
- if content != "" {
- return content
+ if item.Content != "" {
+ return item.Content, nil
}
- return description
+ return item.Description, nil
case "description":
- return description
+ return item.Description, nil
case "content":
- return content
+ return item.Content, nil
case "both":
- return description + content
+ return item.Description + item.Content, nil
+ case "fetch":
+ return getFullArticle(item.Link, item.feed.Context())
default:
- panic(fmt.Sprintf("Unknown value for Body: %v", bodyCfg))
+ return "", fmt.Errorf("Unknown value for Body: %v", bodyCfg)
}
}
@@ -318,9 +348,14 @@ func (item *Item) downloadImage(src string) string {
}
func (item *Item) buildBody() {
+ var err error
feed := item.feed
- item.Body = getBody(item.Content, item.Description, feed.Body)
+ if item.Body, err = item.getBody(feed.Body); err != nil {
+ log.Errorf("Feed %s: Item %s: Error while fetching body: %s", feed.Name, item.Link, err)
+ return
+ }
+
bodyNode, err := html.Parse(strings.NewReader(item.Body))
if err != nil {
log.Errorf("Feed %s: Item %s: Error while parsing html: %s", feed.Name, item.Link, err)
v0.8.3.2&id=18dfbdc099c1398016427b6fa7f1a1facb363998&follow=1'>ui-snapshot: use cgit_{open|close}_filter() to execute compressorsLars Hjemli1-28/+7 2009-07-31Add generic filter/plugin infrastructureLars Hjemli3-0/+62 2009-07-25Add support for mime type registration and lookupLars Hjemli4-5/+45 2009-07-25cgit.h: keep config flags sortedLars Hjemli1-2/+2 2009-07-25cgitrc.5.txt: document 'embedded' and 'noheader'Lars Hjemli1-0/+9 2009-07-25Add support for 'noheader' optionLars Hjemli3-7/+16 2009-07-25cgitrc.5.txt: document 'head-include'Lars Hjemli1-0/+4 2009-07-25ui-blob: return 'application/octet-stream' for binary blobsLars Hjemli1-1/+7 2009-07-25ui-plain: Return 'application/octet-stream' for binary files.Remko Tronçon1-1/+4 2009-06-11use cgit_httpscheme() for atom feedDiego Ongaro2-3/+6 2009-06-11add cgit_httpscheme() -> http:// or https://Diego Ongaro2-0/+12 2009-06-07Return http statuscode 404 on unknown branchLars Hjemli3-0/+6 2009-06-07Add head-include configuration option.Mark Lodato3-1/+6 2009-03-15CGIT 0.8.2.1v0.8.2.1Lars Hjemli1-1/+1 2009-03-15Fix doc-related glitches in Makefile and .gitignoreLars Hjemli2-1/+6 2009-03-15ui-snapshot: avoid segfault when no filename is specifiedLars Hjemli1-6/+17 2009-03-15fix segfault when displaying empty blobsEric Wong1-5/+8 2009-02-19Add support for HEAD requestsLars Hjemli2-0/+7 2009-02-19Add support for ETag in 'plain' viewLars Hjemli4-0/+5 2009-02-12ui-tree: escape ascii-text properly in hexdump viewLars Hjemli1-4/+9 2009-02-12Makefile: add doc-related targetsLars Hjemli1-2/+17