Skip to content

Commit d1bd2c2

Browse files
committed
Integrate key providers
1 parent 7a65e3d commit d1bd2c2

File tree

5 files changed

+40
-28
lines changed

5 files changed

+40
-28
lines changed

cmd/podsync/updater.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,14 +31,26 @@ type Updater struct {
3131
downloader Downloader
3232
db db.Storage
3333
fs fs.Storage
34+
keys map[model.Provider]feed.KeyProvider
3435
}
3536

3637
func NewUpdater(config *config.Config, downloader Downloader, db db.Storage, fs fs.Storage) (*Updater, error) {
38+
keys := map[model.Provider]feed.KeyProvider{}
39+
40+
for name, list := range config.Tokens {
41+
provider, err := feed.NewKeyProvider(list)
42+
if err != nil {
43+
return nil, errors.Wrapf(err, "failed to create key provider for %q", name)
44+
}
45+
keys[name] = provider
46+
}
47+
3748
return &Updater{
3849
config: config,
3950
downloader: downloader,
4051
db: db,
4152
fs: fs,
53+
keys: keys,
4254
}, nil
4355
}
4456

@@ -79,7 +91,7 @@ func (u *Updater) Update(ctx context.Context, feedConfig *config.Feed) error {
7991
// updateFeed pulls API for new episodes and saves them to database
8092
func (u *Updater) updateFeed(ctx context.Context, feedConfig *config.Feed) error {
8193
// Create an updater for this feed type
82-
provider, err := feed.New(ctx, feedConfig, u.config.Tokens)
94+
provider, err := feed.New(ctx, feedConfig, u.keys)
8395
if err != nil {
8496
return err
8597
}

pkg/config/config.go

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,6 @@ type Custom struct {
5656
Language string `toml:"lang"`
5757
}
5858

59-
type Tokens struct {
60-
// YouTube API key.
61-
// See https://developers.google.com/youtube/registering_an_application
62-
YouTube StringSlice `toml:"youtube"`
63-
// Vimeo developer key.
64-
// See https://developer.vimeo.com/api/guides/start#generate-access-token
65-
Vimeo StringSlice `toml:"vimeo"`
66-
}
67-
6859
type Server struct {
6960
// Hostname to use for download links
7061
Hostname string `toml:"hostname"`
@@ -123,7 +114,7 @@ type Config struct {
123114
// ID will be used as feed ID in http://podsync.net/{FEED_ID}.xml
124115
Feeds map[string]*Feed
125116
// Tokens is API keys to use to access YouTube/Vimeo APIs.
126-
Tokens Tokens `toml:"tokens"`
117+
Tokens map[model.Provider]StringSlice `toml:"tokens"`
127118
// Downloader (youtube-dl) configuration
128119
Downloader Downloader `toml:"downloader"`
129120
}

pkg/config/config_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,11 @@ self_update = true
5454

5555
assert.Equal(t, "/home/user/db/", config.Database.Dir)
5656

57-
require.Len(t, config.Tokens.YouTube, 1)
58-
assert.Equal(t, "123", config.Tokens.YouTube[0])
59-
require.Len(t, config.Tokens.Vimeo, 2)
60-
assert.Equal(t, "321", config.Tokens.Vimeo[0])
61-
assert.Equal(t, "456", config.Tokens.Vimeo[1])
57+
require.Len(t, config.Tokens["youtube"], 1)
58+
assert.Equal(t, "123", config.Tokens["youtube"][0])
59+
require.Len(t, config.Tokens["vimeo"], 2)
60+
assert.Equal(t, "321", config.Tokens["vimeo"][0])
61+
assert.Equal(t, "456", config.Tokens["vimeo"][1])
6262

6363
assert.Len(t, config.Feeds, 1)
6464
feed, ok := config.Feeds["XYZ"]
@@ -99,8 +99,8 @@ data_dir = "/data"
9999
assert.NoError(t, err)
100100
require.NotNil(t, config)
101101

102-
require.Len(t, config.Tokens.YouTube, 0)
103-
require.Len(t, config.Tokens.Vimeo, 0)
102+
require.Len(t, config.Tokens, 1)
103+
require.Len(t, config.Tokens["vimeo"], 0)
104104
}
105105

106106
func TestApplyDefaults(t *testing.T) {

pkg/feed/common.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,25 @@ type Builder interface {
1313
Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error)
1414
}
1515

16-
func New(ctx context.Context, cfg *config.Feed, tokens config.Tokens) (Builder, error) {
17-
var (
18-
provider Builder
19-
err error
20-
)
21-
16+
func New(ctx context.Context, cfg *config.Feed, keys map[model.Provider]KeyProvider) (Builder, error) {
2217
info, err := ParseURL(cfg.URL)
2318
if err != nil {
2419
return nil, err
2520
}
2621

22+
keyProvider, ok := keys[info.Provider]
23+
if !ok {
24+
return nil, errors.Errorf("unknown key provider: %s", info.Provider)
25+
}
26+
2727
switch info.Provider {
2828
case model.ProviderYoutube:
29-
provider, err = NewYouTubeBuilder(tokens.YouTube[0])
29+
return NewYouTubeBuilder(keyProvider.Get())
3030
case model.ProviderVimeo:
31-
provider, err = NewVimeoBuilder(ctx, tokens.Vimeo[0])
31+
return NewVimeoBuilder(ctx, keyProvider.Get())
3232
default:
3333
return nil, errors.Errorf("unsupported provider %q", info.Provider)
3434
}
35-
36-
return provider, err
3735
}
3836

3937
type feedProvider interface {

pkg/feed/key.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@ type KeyProvider interface {
1010
Get() string
1111
}
1212

13+
func NewKeyProvider(keys []string) (KeyProvider, error) {
14+
switch len(keys) {
15+
case 0:
16+
return nil, errors.New("no keys")
17+
case 1:
18+
return NewFixedKey(keys[0])
19+
default:
20+
return NewRotatedKeys(keys)
21+
}
22+
}
23+
1324
type FixedKeyProvider struct {
1425
key string
1526
}

0 commit comments

Comments
 (0)