249 lines
5.4 KiB
Go
249 lines
5.4 KiB
Go
package anilist
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
type (
|
|
AnimeListEntry = AnimeCollection_MediaListCollection_Lists_Entries
|
|
AnimeList = AnimeCollection_MediaListCollection_Lists
|
|
|
|
EntryDate struct {
|
|
Year *int `json:"year,omitempty"`
|
|
Month *int `json:"month,omitempty"`
|
|
Day *int `json:"day,omitempty"`
|
|
}
|
|
)
|
|
|
|
func (ac *AnimeCollection) GetListEntryFromAnimeId(id int) (*AnimeListEntry, bool) {
|
|
if ac == nil || ac.MediaListCollection == nil {
|
|
return nil, false
|
|
}
|
|
|
|
var entry *AnimeCollection_MediaListCollection_Lists_Entries
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if e.Media.ID == id {
|
|
entry = e
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if entry == nil {
|
|
return nil, false
|
|
}
|
|
|
|
return entry, true
|
|
}
|
|
|
|
func (ac *AnimeCollection) GetAllAnime() []*BaseAnime {
|
|
if ac == nil {
|
|
return make([]*BaseAnime, 0)
|
|
}
|
|
|
|
var ret []*BaseAnime
|
|
addedId := make(map[int]bool)
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if _, ok := addedId[e.Media.ID]; !ok {
|
|
ret = append(ret, e.Media)
|
|
addedId[e.Media.ID] = true
|
|
}
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (ac *AnimeCollection) FindAnime(mediaId int) (*BaseAnime, bool) {
|
|
if ac == nil {
|
|
return nil, false
|
|
}
|
|
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if e.Media.ID == mediaId {
|
|
return e.Media, true
|
|
}
|
|
}
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
func (ac *AnimeCollectionWithRelations) GetListEntryFromMediaId(id int) (*AnimeCollectionWithRelations_MediaListCollection_Lists_Entries, bool) {
|
|
|
|
if ac == nil || ac.MediaListCollection == nil {
|
|
return nil, false
|
|
}
|
|
|
|
var entry *AnimeCollectionWithRelations_MediaListCollection_Lists_Entries
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if e.Media.ID == id {
|
|
entry = e
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if entry == nil {
|
|
return nil, false
|
|
}
|
|
|
|
return entry, true
|
|
}
|
|
|
|
func (ac *AnimeCollectionWithRelations) GetAllAnime() []*CompleteAnime {
|
|
|
|
var ret []*CompleteAnime
|
|
addedId := make(map[int]bool)
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if _, ok := addedId[e.Media.ID]; !ok {
|
|
ret = append(ret, e.Media)
|
|
addedId[e.Media.ID] = true
|
|
}
|
|
}
|
|
}
|
|
return ret
|
|
}
|
|
|
|
func (ac *AnimeCollectionWithRelations) FindAnime(mediaId int) (*CompleteAnime, bool) {
|
|
for _, l := range ac.MediaListCollection.Lists {
|
|
if l.Entries == nil || len(l.Entries) == 0 {
|
|
continue
|
|
}
|
|
for _, e := range l.Entries {
|
|
if e.Media.ID == mediaId {
|
|
return e.Media, true
|
|
}
|
|
}
|
|
}
|
|
return nil, false
|
|
}
|
|
|
|
type IFuzzyDate interface {
|
|
GetYear() *int
|
|
GetMonth() *int
|
|
GetDay() *int
|
|
}
|
|
|
|
func FuzzyDateToString(d IFuzzyDate) string {
|
|
if d == nil {
|
|
return ""
|
|
}
|
|
return fuzzyDateToString(d.GetYear(), d.GetMonth(), d.GetDay())
|
|
}
|
|
|
|
func ToEntryStartDate(d *AnimeCollection_MediaListCollection_Lists_Entries_StartedAt) string {
|
|
if d == nil {
|
|
return ""
|
|
}
|
|
return fuzzyDateToString(d.GetYear(), d.GetMonth(), d.GetDay())
|
|
}
|
|
|
|
func ToEntryCompletionDate(d *AnimeCollection_MediaListCollection_Lists_Entries_CompletedAt) string {
|
|
if d == nil {
|
|
return ""
|
|
}
|
|
return fuzzyDateToString(d.GetYear(), d.GetMonth(), d.GetDay())
|
|
}
|
|
|
|
func fuzzyDateToString(year *int, month *int, day *int) string {
|
|
_year := 0
|
|
if year != nil {
|
|
_year = *year
|
|
}
|
|
if _year == 0 {
|
|
return ""
|
|
}
|
|
_month := 0
|
|
if month != nil {
|
|
_month = *month
|
|
}
|
|
_day := 0
|
|
if day != nil {
|
|
_day = *day
|
|
}
|
|
return time.Date(_year, time.Month(_month), _day, 0, 0, 0, 0, time.UTC).Format(time.RFC3339)
|
|
}
|
|
|
|
// AddEntryToList adds an entry to the appropriate list based on the provided status.
|
|
// If no list exists with the given status, a new list is created.
|
|
func (mc *AnimeCollection_MediaListCollection) AddEntryToList(entry *AnimeCollection_MediaListCollection_Lists_Entries, status MediaListStatus) {
|
|
if mc == nil || entry == nil {
|
|
return
|
|
}
|
|
|
|
// Initialize Lists slice if nil
|
|
if mc.Lists == nil {
|
|
mc.Lists = make([]*AnimeCollection_MediaListCollection_Lists, 0)
|
|
}
|
|
|
|
// Find existing list with the target status
|
|
for _, list := range mc.Lists {
|
|
if list.Status != nil && *list.Status == status {
|
|
// Found the list, add the entry
|
|
if list.Entries == nil {
|
|
list.Entries = make([]*AnimeCollection_MediaListCollection_Lists_Entries, 0)
|
|
}
|
|
list.Entries = append(list.Entries, entry)
|
|
return
|
|
}
|
|
}
|
|
|
|
// No list found with the target status, create a new one
|
|
newList := &AnimeCollection_MediaListCollection_Lists{
|
|
Status: &status,
|
|
Entries: []*AnimeCollection_MediaListCollection_Lists_Entries{entry},
|
|
}
|
|
mc.Lists = append(mc.Lists, newList)
|
|
}
|
|
|
|
func (ac *AnimeCollection) Copy() *AnimeCollection {
|
|
if ac == nil {
|
|
return nil
|
|
}
|
|
marshaled, err := json.Marshal(ac)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
var copy AnimeCollection
|
|
err = json.Unmarshal(marshaled, ©)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return ©
|
|
}
|
|
|
|
func (ac *AnimeList) CopyT() *AnimeCollection_MediaListCollection_Lists {
|
|
if ac == nil {
|
|
return nil
|
|
}
|
|
marshaled, err := json.Marshal(ac)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
var copy AnimeCollection_MediaListCollection_Lists
|
|
err = json.Unmarshal(marshaled, ©)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return ©
|
|
}
|