Files
seanime-docker/seanime-2.9.10/internal/plugin/anime.go
2025-09-20 14:08:38 +01:00

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)
}