Skip to content

Commit 67478ac

Browse files
committed
Fix key not found error #120
1 parent 40dd2f5 commit 67478ac

File tree

9 files changed

+50
-38
lines changed

9 files changed

+50
-38
lines changed

cmd/podsync/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ func main() {
123123
if err := updater.Update(ctx, feed); err != nil {
124124
log.WithError(err).Errorf("failed to update feed: %s", feed.URL)
125125
} else {
126-
log.Infof("Next update of %s: %s", feed.ID, c.Entry(m[feed.ID]).Next)
126+
log.Infof("next update of %s: %s", feed.ID, c.Entry(m[feed.ID]).Next)
127127
}
128128
case <-ctx.Done():
129129
return ctx.Err()

cmd/podsync/updater.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,19 +52,19 @@ func (u *Updater) Update(ctx context.Context, feedConfig *config.Feed) error {
5252
started := time.Now()
5353

5454
if err := u.updateFeed(ctx, feedConfig); err != nil {
55-
return err
55+
return errors.Wrap(err, "update failed")
5656
}
5757

5858
if err := u.downloadEpisodes(ctx, feedConfig); err != nil {
59-
return err
59+
return errors.Wrap(err, "download failed")
6060
}
6161

6262
if err := u.buildXML(ctx, feedConfig); err != nil {
63-
return err
63+
return errors.Wrap(err, "xml build failed")
6464
}
6565

6666
if err := u.buildOPML(ctx); err != nil {
67-
return err
67+
return errors.Wrap(err, "opml build failed")
6868
}
6969

7070
if err := u.cleanup(ctx, feedConfig); err != nil {
@@ -263,7 +263,6 @@ func (u *Updater) buildXML(ctx context.Context, feedConfig *config.Feed) error {
263263
}
264264

265265
func (u *Updater) buildOPML(ctx context.Context) error {
266-
267266
// Build OPML with data received from builder
268267
log.Debug("building podcast OPML")
269268
opml, err := feed.BuildOPML(ctx, u.config, u.db, u.fs)

pkg/db/badger.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func NewBadger(config *config.Database) (*Badger, error) {
6060
storage := &Badger{db: db}
6161

6262
if err := db.Update(func(txn *badger.Txn) error {
63-
if err := storage.setObj(txn, []byte(versionPath), CurrentVersion, false); err != nil && err != ErrAlreadyExists {
63+
if err := storage.setObj(txn, []byte(versionPath), CurrentVersion, false); err != nil && err != model.ErrAlreadyExists {
6464
return err
6565
}
6666
return nil
@@ -100,7 +100,7 @@ func (b *Badger) AddFeed(_ context.Context, feedID string, feed *model.Feed) err
100100
for _, episode := range feed.Episodes {
101101
episodeKey := b.getKey(episodePath, feedID, episode.ID)
102102
err := b.setObj(txn, episodeKey, episode, false)
103-
if err == nil || err == ErrAlreadyExists {
103+
if err == nil || err == model.ErrAlreadyExists {
104104
// Do nothing
105105
} else {
106106
return errors.Wrapf(err, "failed to save episode %q", feedID)
@@ -261,7 +261,7 @@ func (b *Badger) setObj(txn *badger.Txn, key []byte, obj interface{}, overwrite
261261
// Overwrites are not allowed, make sure there is no object with the given key
262262
_, err := txn.Get(key)
263263
if err == nil {
264-
return ErrAlreadyExists
264+
return model.ErrAlreadyExists
265265
} else if err == badger.ErrKeyNotFound {
266266
// Key not found, do nothing
267267
} else {
@@ -280,6 +280,10 @@ func (b *Badger) setObj(txn *badger.Txn, key []byte, obj interface{}, overwrite
280280
func (b *Badger) getObj(txn *badger.Txn, key []byte, out interface{}) error {
281281
item, err := txn.Get(key)
282282
if err != nil {
283+
if err == badger.ErrKeyNotFound {
284+
return model.ErrNotFound
285+
}
286+
283287
return err
284288
}
285289

pkg/db/storage.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package db
22

33
import (
44
"context"
5-
"errors"
65

76
"github.com/mxpv/podsync/pkg/model"
87
)
@@ -13,10 +12,6 @@ const (
1312
CurrentVersion = 1
1413
)
1514

16-
var (
17-
ErrAlreadyExists = errors.New("object already exists")
18-
)
19-
2015
type Storage interface {
2116
Close() error
2217
Version() (int, error)

pkg/feed/common.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,6 @@ import (
1010
"github.com/mxpv/podsync/pkg/model"
1111
)
1212

13-
var (
14-
ErrNotFound = errors.New("resource not found")
15-
ErrQuotaExceeded = errors.New("query limit is exceeded")
16-
)
17-
1813
type Builder interface {
1914
Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error)
2015
}

pkg/feed/opml.go

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ import (
66

77
"github.com/gilliek/go-opml/opml"
88
"github.com/pkg/errors"
9+
log "github.com/sirupsen/logrus"
910

1011
"github.com/mxpv/podsync/pkg/config"
12+
"github.com/mxpv/podsync/pkg/model"
1113
)
1214

1315
func BuildOPML(ctx context.Context, config *config.Config, db feedProvider, provider urlProvider) (string, error) {
@@ -17,25 +19,31 @@ func BuildOPML(ctx context.Context, config *config.Config, db feedProvider, prov
1719

1820
for _, feed := range config.Feeds {
1921
f, err := db.GetFeed(ctx, feed.ID)
20-
if err != nil {
21-
return "", err
22+
if err == model.ErrNotFound {
23+
// As we update OPML on per-feed basis, some feeds may not yet be populated in database.
24+
log.Debugf("can't find configuration for feed %q, ignoring opml", feed.ID)
25+
continue
26+
} else if err != nil {
27+
return "", errors.Wrapf(err, "failed to query feed %q", feed.ID)
2228
}
2329

24-
if feed.OPML {
25-
downloadURL, err := provider.URL(ctx, "", fmt.Sprintf("%s.xml", feed.ID))
26-
if err != nil {
27-
return "", errors.Wrapf(err, "failed to get feed URL for %q", feed.ID)
28-
}
30+
if !feed.OPML {
31+
continue
32+
}
2933

30-
outline := opml.Outline{
31-
Title: f.Title,
32-
Text: f.Description,
33-
Type: "rss",
34-
XMLURL: downloadURL,
35-
}
34+
downloadURL, err := provider.URL(ctx, "", fmt.Sprintf("%s.xml", feed.ID))
35+
if err != nil {
36+
return "", errors.Wrapf(err, "failed to get feed URL for %q", feed.ID)
37+
}
3638

37-
doc.Body.Outlines = append(doc.Body.Outlines, outline)
39+
outline := opml.Outline{
40+
Title: f.Title,
41+
Text: f.Description,
42+
Type: "rss",
43+
XMLURL: downloadURL,
3844
}
45+
46+
doc.Body.Outlines = append(doc.Body.Outlines, outline)
3947
}
4048

4149
out, err := doc.XML()

pkg/feed/vimeo.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func (v *VimeoBuilder) queryChannel(feed *model.Feed) error {
4141
ch, resp, err := v.client.Channels.Get(channelID)
4242
if err != nil {
4343
if resp != nil && resp.StatusCode == http.StatusNotFound {
44-
return ErrNotFound
44+
return model.ErrNotFound
4545
}
4646

4747
return errors.Wrapf(err, "failed to query channel with id %q", channelID)
@@ -64,7 +64,7 @@ func (v *VimeoBuilder) queryGroup(feed *model.Feed) error {
6464
gr, resp, err := v.client.Groups.Get(groupID)
6565
if err != nil {
6666
if resp != nil && resp.StatusCode == http.StatusNotFound {
67-
return ErrNotFound
67+
return model.ErrNotFound
6868
}
6969

7070
return errors.Wrapf(err, "failed to query group with id %q", groupID)
@@ -87,7 +87,7 @@ func (v *VimeoBuilder) queryUser(feed *model.Feed) error {
8787
user, resp, err := v.client.Users.Get(userID)
8888
if err != nil {
8989
if resp != nil && resp.StatusCode == http.StatusNotFound {
90-
return ErrNotFound
90+
return model.ErrNotFound
9191
}
9292

9393
return errors.Wrapf(err, "failed to query user with id %q", userID)

pkg/feed/youtube.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func (yt *YouTubeBuilder) listChannels(ctx context.Context, linkType link.Type,
5757
}
5858

5959
if len(resp.Items) == 0 {
60-
return nil, ErrNotFound
60+
return nil, model.ErrNotFound
6161
}
6262

6363
item := resp.Items[0]
@@ -81,7 +81,7 @@ func (yt *YouTubeBuilder) listPlaylists(ctx context.Context, id, channelID strin
8181
}
8282

8383
if len(resp.Items) == 0 {
84-
return nil, ErrNotFound
84+
return nil, model.ErrNotFound
8585
}
8686

8787
item := resp.Items[0]

pkg/model/errors.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package model
2+
3+
import (
4+
"errors"
5+
)
6+
7+
var (
8+
ErrAlreadyExists = errors.New("object already exists")
9+
ErrNotFound = errors.New("not found")
10+
ErrQuotaExceeded = errors.New("query limit is exceeded")
11+
)

0 commit comments

Comments
 (0)