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:
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user