1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00

Integrate key providers

This commit is contained in:
Maksym Pavlenko
2020-04-20 20:54:49 -07:00
parent 7a65e3d1c5
commit d1bd2c2d24
5 changed files with 40 additions and 28 deletions

View File

@@ -31,14 +31,26 @@ type Updater struct {
downloader Downloader downloader Downloader
db db.Storage db db.Storage
fs fs.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) { 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{ return &Updater{
config: config, config: config,
downloader: downloader, downloader: downloader,
db: db, db: db,
fs: fs, fs: fs,
keys: keys,
}, nil }, nil
} }
@@ -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 // updateFeed pulls API for new episodes and saves them to database
func (u *Updater) updateFeed(ctx context.Context, feedConfig *config.Feed) error { func (u *Updater) updateFeed(ctx context.Context, feedConfig *config.Feed) error {
// Create an updater for this feed type // 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 { if err != nil {
return err return err
} }

View File

@@ -56,15 +56,6 @@ type Custom struct {
Language string `toml:"lang"` 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 { type Server struct {
// Hostname to use for download links // Hostname to use for download links
Hostname string `toml:"hostname"` Hostname string `toml:"hostname"`
@@ -123,7 +114,7 @@ type Config struct {
// ID will be used as feed ID in http://podsync.net/{FEED_ID}.xml // ID will be used as feed ID in http://podsync.net/{FEED_ID}.xml
Feeds map[string]*Feed Feeds map[string]*Feed
// Tokens is API keys to use to access YouTube/Vimeo APIs. // 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 (youtube-dl) configuration
Downloader Downloader `toml:"downloader"` Downloader Downloader `toml:"downloader"`
} }

View File

@@ -54,11 +54,11 @@ self_update = true
assert.Equal(t, "/home/user/db/", config.Database.Dir) assert.Equal(t, "/home/user/db/", config.Database.Dir)
require.Len(t, config.Tokens.YouTube, 1) require.Len(t, config.Tokens["youtube"], 1)
assert.Equal(t, "123", config.Tokens.YouTube[0]) assert.Equal(t, "123", config.Tokens["youtube"][0])
require.Len(t, config.Tokens.Vimeo, 2) require.Len(t, config.Tokens["vimeo"], 2)
assert.Equal(t, "321", config.Tokens.Vimeo[0]) assert.Equal(t, "321", config.Tokens["vimeo"][0])
assert.Equal(t, "456", config.Tokens.Vimeo[1]) assert.Equal(t, "456", config.Tokens["vimeo"][1])
assert.Len(t, config.Feeds, 1) assert.Len(t, config.Feeds, 1)
feed, ok := config.Feeds["XYZ"] feed, ok := config.Feeds["XYZ"]
@@ -99,8 +99,8 @@ data_dir = "/data"
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, config) require.NotNil(t, config)
require.Len(t, config.Tokens.YouTube, 0) require.Len(t, config.Tokens, 1)
require.Len(t, config.Tokens.Vimeo, 0) require.Len(t, config.Tokens["vimeo"], 0)
} }
func TestApplyDefaults(t *testing.T) { func TestApplyDefaults(t *testing.T) {

View File

@@ -13,27 +13,25 @@ type Builder interface {
Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error) Build(ctx context.Context, cfg *config.Feed) (*model.Feed, error)
} }
func New(ctx context.Context, cfg *config.Feed, tokens config.Tokens) (Builder, error) { func New(ctx context.Context, cfg *config.Feed, keys map[model.Provider]KeyProvider) (Builder, error) {
var (
provider Builder
err error
)
info, err := ParseURL(cfg.URL) info, err := ParseURL(cfg.URL)
if err != nil { if err != nil {
return nil, err return nil, err
} }
keyProvider, ok := keys[info.Provider]
if !ok {
return nil, errors.Errorf("unknown key provider: %s", info.Provider)
}
switch info.Provider { switch info.Provider {
case model.ProviderYoutube: case model.ProviderYoutube:
provider, err = NewYouTubeBuilder(tokens.YouTube[0]) return NewYouTubeBuilder(keyProvider.Get())
case model.ProviderVimeo: case model.ProviderVimeo:
provider, err = NewVimeoBuilder(ctx, tokens.Vimeo[0]) return NewVimeoBuilder(ctx, keyProvider.Get())
default: default:
return nil, errors.Errorf("unsupported provider %q", info.Provider) return nil, errors.Errorf("unsupported provider %q", info.Provider)
} }
return provider, err
} }
type feedProvider interface { type feedProvider interface {

View File

@@ -10,6 +10,17 @@ type KeyProvider interface {
Get() string 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 { type FixedKeyProvider struct {
key string key string
} }