node build fixed

This commit is contained in:
ra_ma
2025-09-20 14:08:38 +01:00
parent c6ebbe069d
commit 3d298fa434
1516 changed files with 535727 additions and 2 deletions

View File

@@ -0,0 +1,137 @@
package animap
import (
"errors"
"io"
"net/http"
"seanime/internal/constants"
"seanime/internal/hook"
"seanime/internal/util/result"
"strconv"
"github.com/goccy/go-json"
)
type (
Anime struct {
Title string `json:"title"`
Titles map[string]string `json:"titles,omitempty"`
StartDate string `json:"startDate,omitempty"` // YYYY-MM-DD
EndDate string `json:"endDate,omitempty"` // YYYY-MM-DD
Status string `json:"status"` // Finished, Airing, Upcoming, etc.
Type string `json:"type"` // TV, OVA, Movie, etc.
Episodes map[string]*Episode `json:"episodes,omitzero"` // Indexed by AniDB episode number, "1", "S1", etc.
Mappings *AnimeMapping `json:"mappings,omitzero"`
}
AnimeMapping struct {
AnidbID int `json:"anidb_id,omitempty"`
AnilistID int `json:"anilist_id,omitempty"`
KitsuID int `json:"kitsu_id,omitempty"`
TheTvdbID int `json:"thetvdb_id,omitempty"`
TheMovieDbID string `json:"themoviedb_id,omitempty"` // Can be int or string, forced to string
MalID int `json:"mal_id,omitempty"`
LivechartID int `json:"livechart_id,omitempty"`
AnimePlanetID string `json:"animeplanet_id,omitempty"` // Can be int or string, forced to string
AnisearchID int `json:"anisearch_id,omitempty"`
SimklID int `json:"simkl_id,omitempty"`
NotifyMoeID string `json:"notifymoe_id,omitempty"`
AnimecountdownID int `json:"animecountdown_id,omitempty"`
Type string `json:"type,omitempty"`
}
Episode struct {
AnidbEpisode string `json:"anidbEpisode"`
AnidbId int `json:"anidbEid"`
TvdbId int `json:"tvdbEid,omitempty"`
TvdbShowId int `json:"tvdbShowId,omitempty"`
AirDate string `json:"airDate,omitempty"` // YYYY-MM-DD
AnidbTitle string `json:"anidbTitle,omitempty"` // Title of the episode from AniDB
TvdbTitle string `json:"tvdbTitle,omitempty"` // Title of the episode from TVDB
Overview string `json:"overview,omitempty"`
Image string `json:"image,omitempty"`
Runtime int `json:"runtime,omitempty"` // minutes
Length string `json:"length,omitempty"` // Xm
SeasonNumber int `json:"seasonNumber,omitempty"`
SeasonName string `json:"seasonName,omitempty"`
Number int `json:"number"`
AbsoluteNumber int `json:"absoluteNumber,omitempty"`
}
)
//----------------------------------------------------------------------------------------------------------------------
type Cache struct {
*result.Cache[string, *Anime]
}
// FetchAnimapMedia fetches animap.Anime from the Animap API.
func FetchAnimapMedia(from string, id int) (*Anime, error) {
// Event
reqEvent := &AnimapMediaRequestedEvent{
From: from,
Id: id,
Media: &Anime{},
}
err := hook.GlobalHookManager.OnAnimapMediaRequested().Trigger(reqEvent)
if err != nil {
return nil, err
}
// If the hook prevented the default behavior, return the data
if reqEvent.DefaultPrevented {
return reqEvent.Media, nil
}
from = reqEvent.From
id = reqEvent.Id
apiUrl := constants.InternalMetadataURL + "/entry?" + from + "_id=" + strconv.Itoa(id)
request, err := http.NewRequest("GET", apiUrl, nil)
if err != nil {
return nil, err
}
request.Header.Set("X-Seanime-Version", "Seanime/"+constants.Version)
// Send an HTTP GET request
response, err := http.DefaultClient.Do(request)
if err != nil {
return nil, err
}
defer response.Body.Close()
if response.StatusCode != 200 {
return nil, errors.New("not found on Animap")
}
// Read the response body
responseBody, err := io.ReadAll(response.Body)
if err != nil {
return nil, err
}
// Unmarshal the JSON data into AnimapData
var media Anime
if err := json.Unmarshal(responseBody, &media); err != nil {
return nil, err
}
// Event
event := &AnimapMediaEvent{
Media: &media,
}
err = hook.GlobalHookManager.OnAnimapMedia().Trigger(event)
if err != nil {
return nil, err
}
// If the hook prevented the default behavior, return the data
if event.DefaultPrevented {
return event.Media, nil
}
return event.Media, nil
}

View File

@@ -0,0 +1,19 @@
package animap
import "seanime/internal/hook_resolver"
// AnimapMediaRequestedEvent is triggered when the Animap media is requested.
// Prevent default to skip the default behavior and return your own data.
type AnimapMediaRequestedEvent struct {
hook_resolver.Event
From string `json:"from"`
Id int `json:"id"`
// Empty data object, will be used if the hook prevents the default behavior
Media *Anime `json:"media"`
}
// AnimapMediaEvent is triggered after processing AnimapMedia.
type AnimapMediaEvent struct {
hook_resolver.Event
Media *Anime `json:"media"`
}