Skip to content

Commit

Permalink
Integrate key providers
Browse files Browse the repository at this point in the history
  • Loading branch information
mxpv committed Apr 21, 2020
1 parent 7a65e3d commit d1bd2c2
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 28 deletions.
14 changes: 13 additions & 1 deletion cmd/podsync/updater.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,26 @@ type Updater struct {
downloader Downloader
db db.Storage
fs fs.Storage
keys map[model.Provider]feed.KeyProvider
}

func NewUpdater(config *config.Config, downloader Downloader, db db.Storage, fs fs.Storage) (*Updater, error) {
keys := map[model.Provider]feed.KeyProvider{}

for name, list := range config.Tokens {
provider, err := feed.NewKeyProvider(list)
if err != nil {
return nil, errors.Wrapf(err, "failed to create key provider for %q", name)
}
keys[name] = provider
}

return &Updater{
config: config,
downloader: downloader,
db: db,
fs: fs,
keys: keys,
}, nil
}

Expand Down Expand Up @@ -79,7 +91,7 @@ func (u *Updater) Update(ctx context.Context, feedConfig *config.Feed) error {
// updateFeed pulls API for new episodes and saves them to database
func (u *Updater) updateFeed(ctx context.Context, feedConfig *config.Feed) error {
// Create an updater for this feed type
provider, err := feed.New(ctx, feedConfig, u.config.Tokens)
provider, err := feed.New(ctx, feedConfig, u.keys)
if err != nil {
return err
}
Expand Down
11 changes: 1 addition & 10 deletions pkg/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,15 +56,6 @@ type Custom struct {
Language string `toml:"lang"`
}

type Tokens struct {
// YouTube API key.
// See https://developers.google.com/youtube/registering_an_application
YouTube StringSlice `toml:"youtube"`
// Vimeo developer key.
// See https://developer.vimeo.com/api/guides/start#generate-access-token
Vimeo StringSlice `toml:"vimeo"`
}

type Server struct {
// Hostname to use for download links
Hostname string `toml:"hostname"`
Expand Down Expand Up @@ -123,7 +114,7 @@ type Config struct {
// ID will be used as feed ID in http://podsync.net/{FEED_ID}.xml
Feeds map[string]*Feed
// Tokens is API keys to use to access YouTube/Vimeo APIs.
Tokens Tokens `toml:"tokens"`
Tokens map[model.Provider]StringSlice `toml:"tokens"`
// Downloader (youtube-dl) configuration
Downloader Downloader `toml:"downloader"`
}
Expand Down
14 changes: 7 additions & 7 deletions pkg/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@ self_update = true

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

require.Len(t, config.Tokens.YouTube, 1)
assert.Equal(t, "123", config.Tokens.YouTube[0])
require.Len(t, config.Tokens.Vimeo, 2)
assert.Equal(t, "321", config.Tokens.Vimeo[0])
assert.Equal(t, "456", config.Tokens.Vimeo[1])
require.Len(t, config.Tokens["youtube"], 1)
assert.Equal(t, "123", config.Tokens["youtube"][0])
require.Len(t, config.Tokens["vimeo"], 2)
assert.Equal(t, "321", config.Tokens["vimeo"][0])
assert.Equal(t, "456", config.Tokens["vimeo"][1])

assert.Len(t, config.Feeds, 1)
feed, ok := config.Feeds["XYZ"]
Expand Down Expand Up @@ -99,8 +99,8 @@ data_dir = "/data"
assert.NoError(t, err)
require.NotNil(t, config)

require.Len(t, config.Tokens.YouTube, 0)
require.Len(t, config.Tokens.Vimeo, 0)
require.Len(t, config.Tokens, 1)
require.Len(t, config.Tokens["vimeo"], 0)
}

func TestApplyDefaults(t *testing.T) {
Expand Down
18 changes: 8 additions & 10 deletions pkg/feed/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,25 @@ type Builder interface {
Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error)
}

func New(ctx context.Context, cfg *config.Feed, tokens config.Tokens) (Builder, error) {
var (
provider Builder
err error
)

func New(ctx context.Context, cfg *config.Feed, keys map[model.Provider]KeyProvider) (Builder, error) {
info, err := ParseURL(cfg.URL)
if err != nil {
return nil, err
}

keyProvider, ok := keys[info.Provider]
if !ok {
return nil, errors.Errorf("unknown key provider: %s", info.Provider)
}

switch info.Provider {
case model.ProviderYoutube:
provider, err = NewYouTubeBuilder(tokens.YouTube[0])
return NewYouTubeBuilder(keyProvider.Get())
case model.ProviderVimeo:
provider, err = NewVimeoBuilder(ctx, tokens.Vimeo[0])
return NewVimeoBuilder(ctx, keyProvider.Get())
default:
return nil, errors.Errorf("unsupported provider %q", info.Provider)
}

return provider, err
}

type feedProvider interface {
Expand Down
11 changes: 11 additions & 0 deletions pkg/feed/key.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,17 @@ type KeyProvider interface {
Get() string
}

func NewKeyProvider(keys []string) (KeyProvider, error) {
switch len(keys) {
case 0:
return nil, errors.New("no keys")
case 1:
return NewFixedKey(keys[0])
default:
return NewRotatedKeys(keys)
}
}

type FixedKeyProvider struct {
key string
}
Expand Down

0 comments on commit d1bd2c2

Please sign in to comment.