Skip to content

Commit

Permalink
Let manifest callback be set via method
Browse files Browse the repository at this point in the history
It's purely optional, so it shouldn't be a parameter for NewAddon()
  • Loading branch information
doingodswork committed Jul 11, 2020
1 parent 11ea8b6 commit 46bfb36
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 40 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ func main() {
// Let the movieHandler handle the "movie" type
streamHandlers := map[string]stremio.StreamHandler{"movie": movieHandler}

addon, err := stremio.NewAddon(manifest, nil, nil, streamHandlers, stremio.DefaultOptions)
addon, err := stremio.NewAddon(manifest, nil, streamHandlers, stremio.DefaultOptions)
if err != nil {
panic(err)
}
Expand Down
18 changes: 11 additions & 7 deletions addon.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ func init() {

// NewAddon creates a new Addon object that can be started with Run().
// A proper manifest must be supplied, but manifestCallback and all but one handler can be nil in case you only want to handle specific requests and opts can be the zero value of Options.
func NewAddon(manifest Manifest, manifestCallback ManifestCallback, catalogHandlers map[string]CatalogHandler, streamHandlers map[string]StreamHandler, opts Options) (*Addon, error) {
func NewAddon(manifest Manifest, catalogHandlers map[string]CatalogHandler, streamHandlers map[string]StreamHandler, opts Options) (*Addon, error) {
// Precondition checks
if manifest.ID == "" || manifest.Name == "" || manifest.Description == "" || manifest.Version == "" {
return nil, errors.New("An empty manifest was passed")
Expand Down Expand Up @@ -102,12 +102,11 @@ func NewAddon(manifest Manifest, manifestCallback ManifestCallback, catalogHandl

// Create and return addon
return &Addon{
manifest: manifest,
catalogHandlers: catalogHandlers,
streamHandlers: streamHandlers,
opts: opts,
logger: opts.Logger,
manifestCallback: manifestCallback,
manifest: manifest,
catalogHandlers: catalogHandlers,
streamHandlers: streamHandlers,
opts: opts,
logger: opts.Logger,
}, nil
}

Expand Down Expand Up @@ -142,6 +141,11 @@ func (a *Addon) AddEndpoint(method, path string, handler func(*fiber.Ctx)) {
a.customEndpoints = append(a.customEndpoints, customEndpoint)
}

// SetManifestCallback sets the manifest callback
func (a *Addon) SetManifestCallback(callback ManifestCallback) {
a.manifestCallback = callback
}

// Run starts the remote addon. It sets up an HTTP server that handles requests to "/manifest.json" etc. and gracefully handles shutdowns.
func (a *Addon) Run() {
logger := a.logger
Expand Down
2 changes: 1 addition & 1 deletion examples/catalog/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func main() {
HandleEtagCatalogs: true,
}

addon, err := stremio.NewAddon(manifest, nil, catalogHandlers, nil, options)
addon, err := stremio.NewAddon(manifest, catalogHandlers, nil, options)
if err != nil {
panic(err)
}
Expand Down
61 changes: 31 additions & 30 deletions examples/custom/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ func main() {
panic(err)
}

// Create manifest calback that uses the logger we previously created
manifestCallback := createManifestCallback(logger)

// Create movie handler that uses the logger we previously created
movieHandler := createMovieHandler(logger)
// Let the movieHandler handle the "movie" type
Expand All @@ -86,7 +83,7 @@ func main() {
}

// Create addon
addon, err := stremio.NewAddon(manifest, manifestCallback, nil, streamHandlers, options)
addon, err := stremio.NewAddon(manifest, nil, streamHandlers, options)
if err != nil {
logger.Fatal("Couldn't create new addon", zap.Error(err))
}
Expand All @@ -98,38 +95,16 @@ func main() {
customMiddleware := createCustomMiddleware(logger)
addon.AddMiddleware("/", customMiddleware)

// Add manifest callback that uses the logger we previously created
manifestCallback := createManifestCallback(logger)
addon.SetManifestCallback(manifestCallback)

// Add a custom endpoint that responds to requests to /ping with "pong".
addon.AddEndpoint("GET", "/ping", customEndpoint)

addon.Run()
}

// Manifest callback which prevents installations by unknown users and logs successful installations
func createManifestCallback(logger *zap.Logger) stremio.ManifestCallback {
return func(userData interface{}) int {
// User provided no data
if userData == nil {
return fiber.StatusUnauthorized
}

u, ok := userData.(*customer)
if !ok {
t := fmt.Sprintf("%T", userData)
logger.Error("Couldn't convert user data to customer object", zap.String("type", t))
return fiber.StatusInternalServerError
}

for _, allowedUser := range allowedUsers {
if u.UserID == allowedUser.UserID && u.Token == allowedUser.Token {
logger.Info("A user installed our addon", zap.String("user", u.UserID))
return fiber.StatusOK
}
}
// User provided data, but didn't match any of the allowed users
return fiber.StatusForbidden
}
}

func createMovieHandler(logger *zap.Logger) stremio.StreamHandler {
return func(id string, userData interface{}) ([]stremio.StreamItem, error) {
// We only serve Big Buck Bunny
Expand Down Expand Up @@ -189,6 +164,32 @@ func createCustomMiddleware(logger *zap.Logger) func(c *fiber.Ctx) {
}
}

// Manifest callback which prevents installations by unknown users and logs successful installations
func createManifestCallback(logger *zap.Logger) stremio.ManifestCallback {
return func(userData interface{}) int {
// User provided no data
if userData == nil {
return fiber.StatusUnauthorized
}

u, ok := userData.(*customer)
if !ok {
t := fmt.Sprintf("%T", userData)
logger.Error("Couldn't convert user data to customer object", zap.String("type", t))
return fiber.StatusInternalServerError
}

for _, allowedUser := range allowedUsers {
if u.UserID == allowedUser.UserID && u.Token == allowedUser.Token {
logger.Info("A user installed our addon", zap.String("user", u.UserID))
return fiber.StatusOK
}
}
// User provided data, but didn't match any of the allowed users
return fiber.StatusForbidden
}
}

func customEndpoint(c *fiber.Ctx) {
c.SendString("pong")
}
2 changes: 1 addition & 1 deletion examples/stream/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func main() {
HandleEtagStreams: true,
}

addon, err := stremio.NewAddon(manifest, nil, nil, streamHandlers, options)
addon, err := stremio.NewAddon(manifest, nil, streamHandlers, options)
if err != nil {
panic(err)
}
Expand Down

0 comments on commit 46bfb36

Please sign in to comment.