summaryrefslogtreecommitdiff
path: root/fetch/gopher.go
diff options
context:
space:
mode:
authornytpu <alex@nytpu.com>2021-03-18 15:08:24 -0600
committernytpu <alex@nytpu.com>2021-03-18 15:08:24 -0600
commitee43bf108447f1264fb1ebaac7a0e1f6e0b06a81 (patch)
tree3158153aa9cd61b7ca51caf3fa5e510deeb432b2 /fetch/gopher.go
parent8dfb63e640603d444c81e657bc0045178144e2a0 (diff)
implement atom/rss/json feeds over gopher.
TODO: write gophermap->gemtext mapper so the same gemini feed parser can be used on both.
Diffstat (limited to 'fetch/gopher.go')
-rw-r--r--fetch/gopher.go25
1 files changed, 23 insertions, 2 deletions
diff --git a/fetch/gopher.go b/fetch/gopher.go
index 5fe24ad..9fbcfe0 100644
--- a/fetch/gopher.go
+++ b/fetch/gopher.go
@@ -11,6 +11,7 @@ import (
"io"
"time"
+ "github.com/mmcdole/gofeed"
"github.com/prologic/go-gopher"
"golang.nytpu.com/comitium/core"
@@ -28,8 +29,28 @@ func fetchGopher(remote string) (*gopher.Response, error) {
// gopherFeed will fetch and insert a new core.Feed into a core.FullData given a
// gopher url (or update if it's preexisting)
func gopherFeed(data *core.FullData, remote string, title string) error {
- // TODO
- return fmt.Errorf("Feeds served over gopher are currently unsupported.")
+ resp, err := fetchGopher(remote)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+
+ if len(resp.Dir.Items) != 0 {
+ // TODO
+ return fmt.Errorf("Gemini-style feeds served over gopher are currently unsupported.")
+ }
+
+ reader := io.LimitReader(resp.Body, 1073741824) // 1 GiB
+ gofeed, err := gofeed.NewParser().Parse(reader)
+ if err != nil {
+ return err
+ }
+ feed, err := core.GofeedConvert(gofeed, title)
+ if err != nil {
+ return err
+ }
+ data.InsertFeed(feed, remote)
+ return nil
}
// gopherPage will fetch and insert a new core.Page into a core.FullData given a