128 lines
3.2 KiB
Go
128 lines
3.2 KiB
Go
package plugin
|
|
|
|
import (
|
|
"context"
|
|
"seanime/internal/database/db_bridge"
|
|
"seanime/internal/extension"
|
|
"seanime/internal/goja/goja_bindings"
|
|
"seanime/internal/hook"
|
|
"seanime/internal/library/anime"
|
|
goja_util "seanime/internal/util/goja"
|
|
|
|
"github.com/dop251/goja"
|
|
"github.com/rs/zerolog"
|
|
)
|
|
|
|
type Anime struct {
|
|
ctx *AppContextImpl
|
|
vm *goja.Runtime
|
|
logger *zerolog.Logger
|
|
ext *extension.Extension
|
|
scheduler *goja_util.Scheduler
|
|
}
|
|
|
|
func (a *AppContextImpl) BindAnimeToContextObj(vm *goja.Runtime, obj *goja.Object, logger *zerolog.Logger, ext *extension.Extension, scheduler *goja_util.Scheduler) {
|
|
m := &Anime{
|
|
ctx: a,
|
|
vm: vm,
|
|
logger: logger,
|
|
ext: ext,
|
|
scheduler: scheduler,
|
|
}
|
|
|
|
animeObj := vm.NewObject()
|
|
|
|
// Get downloaded chapter containers
|
|
_ = animeObj.Set("getAnimeEntry", m.getAnimeEntry)
|
|
_ = obj.Set("anime", animeObj)
|
|
}
|
|
|
|
func (m *Anime) getAnimeEntry(call goja.FunctionCall) goja.Value {
|
|
promise, resolve, reject := m.vm.NewPromise()
|
|
|
|
mediaId := call.Argument(0).ToInteger()
|
|
|
|
if mediaId == 0 {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "anilist platform not found"))
|
|
return m.vm.ToValue(promise)
|
|
}
|
|
|
|
database, ok := m.ctx.database.Get()
|
|
if !ok {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "database not found"))
|
|
return m.vm.ToValue(promise)
|
|
}
|
|
|
|
anilistPlatform, ok := m.ctx.anilistPlatform.Get()
|
|
if !ok {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "anilist platform not found"))
|
|
return m.vm.ToValue(promise)
|
|
}
|
|
|
|
metadataProvider, ok := m.ctx.metadataProvider.Get()
|
|
if !ok {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "metadata provider not found"))
|
|
return m.vm.ToValue(promise)
|
|
}
|
|
|
|
fillerManager, ok := m.ctx.fillerManager.Get()
|
|
if !ok {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "filler manager not found"))
|
|
return m.vm.ToValue(promise)
|
|
}
|
|
|
|
go func() {
|
|
// Get all the local files
|
|
lfs, _, err := db_bridge.GetLocalFiles(database)
|
|
if err != nil {
|
|
_ = reject(m.vm.ToValue(err.Error()))
|
|
return
|
|
}
|
|
|
|
// Get the user's anilist collection
|
|
animeCollection, err := anilistPlatform.GetAnimeCollection(context.Background(), false)
|
|
if err != nil {
|
|
_ = reject(m.vm.ToValue(err.Error()))
|
|
return
|
|
}
|
|
|
|
if animeCollection == nil {
|
|
_ = reject(goja_bindings.NewErrorString(m.vm, "anilist collection not found"))
|
|
return
|
|
}
|
|
|
|
// Create a new media entry
|
|
entry, err := anime.NewEntry(context.Background(), &anime.NewEntryOptions{
|
|
MediaId: int(mediaId),
|
|
LocalFiles: lfs,
|
|
AnimeCollection: animeCollection,
|
|
Platform: anilistPlatform,
|
|
MetadataProvider: metadataProvider,
|
|
})
|
|
if err != nil {
|
|
_ = reject(goja_bindings.NewError(m.vm, err))
|
|
return
|
|
}
|
|
|
|
fillerEvent := new(anime.AnimeEntryFillerHydrationEvent)
|
|
fillerEvent.Entry = entry
|
|
err = hook.GlobalHookManager.OnAnimeEntryFillerHydration().Trigger(fillerEvent)
|
|
if err != nil {
|
|
_ = reject(goja_bindings.NewError(m.vm, err))
|
|
return
|
|
}
|
|
entry = fillerEvent.Entry
|
|
|
|
if !fillerEvent.DefaultPrevented {
|
|
fillerManager.HydrateFillerData(fillerEvent.Entry)
|
|
}
|
|
|
|
m.scheduler.ScheduleAsync(func() error {
|
|
_ = resolve(m.vm.ToValue(entry))
|
|
return nil
|
|
})
|
|
}()
|
|
|
|
return m.vm.ToValue(promise)
|
|
}
|