Skip to content

Commit

Permalink
Adding goodreads plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
drewstinnett committed Nov 14, 2021
1 parent e26da10 commit 86f0492
Show file tree
Hide file tree
Showing 7 changed files with 913 additions and 3 deletions.
3 changes: 0 additions & 3 deletions .goreleaser.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,6 @@ checksum:
algorithm: sha256
snapshot:
name_template: "{{ .Tag }}-snapshot"
changelog:
skip: true

brews:
- name: 'labdoc'
tap:
Expand Down
1 change: 1 addition & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
FROM alpine:3.14
# hadolint ignore=DL3018
RUN apk add --no-cache git
COPY labdoc /
ENTRYPOINT ["/labdoc"]
4 changes: 4 additions & 0 deletions example_templates/goodreads.tpl
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## Recently Read Books
{{ range goodreadsRecentlyRead 10 }}
- [{{ .Title }}]({{ .Link }}) by {{ .Author }} {{ .PubDate | builtinAgo }}
{{- end }}
1 change: 1 addition & 0 deletions internal/plugins/all/all.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
// Plugins need to register themselves
_ "github.com/drewstinnett/labdoc/internal/plugins/builtin"
_ "github.com/drewstinnett/labdoc/internal/plugins/gitlab"
_ "github.com/drewstinnett/labdoc/internal/plugins/goodreads"
_ "github.com/drewstinnett/labdoc/internal/plugins/letterboxd"
_ "github.com/drewstinnett/labdoc/internal/plugins/rss"
)
96 changes: 96 additions & 0 deletions internal/plugins/goodreads/goodreads.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package goodreads

import (
"errors"
"fmt"
"html/template"
"os"
"strconv"
"time"

"github.com/drewstinnett/labdoc/pkg/labdoc"
"github.com/mmcdole/gofeed"
)

type plug struct{}

func (p *plug) TemplateFunctions() (template.FuncMap, error) {
templ := template.FuncMap{
"recentlyRead": recentlyRead,
}
return templ, nil
}

func (p *plug) Examples() string {
return `## Recently Read Books
{{ range goodreadsRecentlyRead 10 }}
- {{ .Title }} by {{ .Author }} {{ .PubDate | builtinAgo }}
{{- end }`
}

func recentlyRead(limit int) ([]ReadEntry, error) {
user := os.Getenv("GOODREADS_RSSUSERID")
if user == "" {
return nil, errors.New("Must Set GOODREADS_RSSUSERID")
}
key := os.Getenv("GOODREADS_RSSKEY")
if key == "" {
return nil, errors.New("Must Set GOODREADS_RSSKEY")
}
fp := gofeed.NewParser()
url := fmt.Sprintf("https://www.goodreads.com/review/list_rss/%v?key=%v&shelf=read", user, key)
feed, err := fp.ParseURL(url)
if err != nil {
return nil, err
}
items := parseRSSRead(feed, limit)

return items, nil
}

type ReadEntry struct {
Title string
Link string
PubDate *time.Time
Description string
Author string
UserRating *float64
// DateAdded *time.Time
}

func parseRSSRead(feed *gofeed.Feed, limit int) []ReadEntry {
entries := make([]ReadEntry, 0, limit)

for _, fi := range feed.Items {
// Get the user rating if we can
userRatingGot, err := strconv.ParseFloat(fi.Custom["user_rating"], 64)
var userRating *float64
if err != nil {
userRating = nil
} else {
userRating = &userRatingGot
}
e := ReadEntry{
Title: fi.Title,
Link: fi.Link,
PubDate: fi.PublishedParsed,
Description: fi.Description,
Author: fi.Custom["author_name"],
UserRating: userRating,
// DateAdded: fi.Custom["date_added"],
}
entries = append(entries, e)
if len(entries) == limit {
break
}
}

return entries
}

func init() {
labdoc.Add("goodreads", func() labdoc.Plugin {
return &plug{}
})
}
27 changes: 27 additions & 0 deletions internal/plugins/goodreads/goodreads_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package goodreads

import (
"os"
"testing"

"github.com/apex/log"
"github.com/mmcdole/gofeed"
"github.com/stretchr/testify/require"
)

func TestParseRecentlyRead(t *testing.T) {
file, err := os.Open("./testdata/read.xml")
require.NoError(t, err)
defer file.Close()
fp := gofeed.NewParser()
feed, _ := fp.Parse(file)
entries := parseRSSRead(feed, 10)
require.Greater(t, len(entries), 0)
first := entries[0]
log.Warnf("%+v", first)

require.Equal(t, "Blankets", first.Title)
require.Equal(t, "Craig Thompson", first.Author)
require.Equal(t, float64(5), *first.UserRating)
require.Equal(t, "https://www.goodreads.com/review/show/3262380767?utm_medium=api&utm_source=rss", first.Link)
}
Loading

0 comments on commit 86f0492

Please sign in to comment.