252 lines
5.8 KiB
Go
252 lines
5.8 KiB
Go
package anime
|
|
|
|
import "github.com/samber/lo"
|
|
|
|
// HasWatchedAll returns true if all episodes have been watched.
|
|
// Returns false if there are no downloaded episodes.
|
|
func (e *Entry) HasWatchedAll() bool {
|
|
// If there are no episodes, return nil
|
|
latestEp, ok := e.FindLatestEpisode()
|
|
if !ok {
|
|
return false
|
|
}
|
|
|
|
return e.GetCurrentProgress() >= latestEp.GetProgressNumber()
|
|
|
|
}
|
|
|
|
// FindNextEpisode returns the episode whose episode number is the same as the progress number + 1.
|
|
// Returns false if there are no episodes or if there is no next episode.
|
|
func (e *Entry) FindNextEpisode() (*Episode, bool) {
|
|
eps, ok := e.FindMainEpisodes()
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
ep, ok := lo.Find(eps, func(ep *Episode) bool {
|
|
return ep.GetProgressNumber() == e.GetCurrentProgress()+1
|
|
})
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
return ep, true
|
|
}
|
|
|
|
// FindLatestEpisode returns the *main* episode with the highest episode number.
|
|
// Returns false if there are no episodes.
|
|
func (e *Entry) FindLatestEpisode() (*Episode, bool) {
|
|
// If there are no episodes, return nil
|
|
eps, ok := e.FindMainEpisodes()
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
// Get the episode with the highest progress number
|
|
latest := eps[0]
|
|
for _, ep := range eps {
|
|
if ep.GetProgressNumber() > latest.GetProgressNumber() {
|
|
latest = ep
|
|
}
|
|
}
|
|
return latest, true
|
|
}
|
|
|
|
// FindLatestLocalFile returns the *main* local file with the highest episode number.
|
|
// Returns false if there are no local files.
|
|
func (e *Entry) FindLatestLocalFile() (*LocalFile, bool) {
|
|
lfs, ok := e.FindMainLocalFiles()
|
|
// If there are no local files, return nil
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
// Get the local file with the highest episode number
|
|
latest := lfs[0]
|
|
for _, lf := range lfs {
|
|
if lf.GetEpisodeNumber() > latest.GetEpisodeNumber() {
|
|
latest = lf
|
|
}
|
|
}
|
|
return latest, true
|
|
}
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------
|
|
|
|
// GetCurrentProgress returns the progress number.
|
|
// If the media entry is not in any AniList list, returns 0.
|
|
func (e *Entry) GetCurrentProgress() int {
|
|
listData, ok := e.FindListData()
|
|
if !ok {
|
|
return 0
|
|
}
|
|
return listData.Progress
|
|
}
|
|
|
|
// FindEpisodes returns the episodes.
|
|
// Returns false if there are no episodes.
|
|
func (e *Entry) FindEpisodes() ([]*Episode, bool) {
|
|
if e.Episodes == nil {
|
|
return nil, false
|
|
}
|
|
return e.Episodes, true
|
|
}
|
|
|
|
// FindMainEpisodes returns the main episodes.
|
|
// Returns false if there are no main episodes.
|
|
func (e *Entry) FindMainEpisodes() ([]*Episode, bool) {
|
|
if e.Episodes == nil {
|
|
return nil, false
|
|
}
|
|
eps := make([]*Episode, 0)
|
|
for _, ep := range e.Episodes {
|
|
if ep.IsMain() {
|
|
eps = append(eps, ep)
|
|
}
|
|
}
|
|
return e.Episodes, true
|
|
}
|
|
|
|
// FindLocalFiles returns the local files.
|
|
// Returns false if there are no local files.
|
|
func (e *Entry) FindLocalFiles() ([]*LocalFile, bool) {
|
|
if !e.IsDownloaded() {
|
|
return nil, false
|
|
}
|
|
return e.LocalFiles, true
|
|
}
|
|
|
|
// FindMainLocalFiles returns *main* local files.
|
|
// Returns false if there are no local files.
|
|
func (e *Entry) FindMainLocalFiles() ([]*LocalFile, bool) {
|
|
if !e.IsDownloaded() {
|
|
return nil, false
|
|
}
|
|
lfs := make([]*LocalFile, 0)
|
|
for _, lf := range e.LocalFiles {
|
|
if lf.IsMain() {
|
|
lfs = append(lfs, lf)
|
|
}
|
|
}
|
|
if len(lfs) == 0 {
|
|
return nil, false
|
|
}
|
|
return lfs, true
|
|
}
|
|
|
|
// IsDownloaded returns true if there are local files.
|
|
func (e *Entry) IsDownloaded() bool {
|
|
if e.LocalFiles == nil {
|
|
return false
|
|
}
|
|
return len(e.LocalFiles) > 0
|
|
}
|
|
|
|
func (e *Entry) FindListData() (*EntryListData, bool) {
|
|
if e.EntryListData == nil {
|
|
return nil, false
|
|
}
|
|
return e.EntryListData, true
|
|
}
|
|
|
|
func (e *Entry) IsInAnimeCollection() bool {
|
|
_, ok := e.FindListData()
|
|
return ok
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
func (e *SimpleEntry) GetCurrentProgress() int {
|
|
listData, ok := e.FindListData()
|
|
if !ok {
|
|
return 0
|
|
}
|
|
return listData.Progress
|
|
}
|
|
|
|
func (e *SimpleEntry) FindMainEpisodes() ([]*Episode, bool) {
|
|
if e.Episodes == nil {
|
|
return nil, false
|
|
}
|
|
eps := make([]*Episode, 0)
|
|
for _, ep := range e.Episodes {
|
|
if ep.IsMain() {
|
|
eps = append(eps, ep)
|
|
}
|
|
}
|
|
return e.Episodes, true
|
|
}
|
|
|
|
func (e *SimpleEntry) FindNextEpisode() (*Episode, bool) {
|
|
eps, ok := e.FindMainEpisodes()
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
ep, ok := lo.Find(eps, func(ep *Episode) bool {
|
|
return ep.GetProgressNumber() == e.GetCurrentProgress()+1
|
|
})
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
return ep, true
|
|
}
|
|
|
|
func (e *SimpleEntry) FindLatestEpisode() (*Episode, bool) {
|
|
// If there are no episodes, return nil
|
|
eps, ok := e.FindMainEpisodes()
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
// Get the episode with the highest progress number
|
|
latest := eps[0]
|
|
for _, ep := range eps {
|
|
if ep.GetProgressNumber() > latest.GetProgressNumber() {
|
|
latest = ep
|
|
}
|
|
}
|
|
return latest, true
|
|
}
|
|
|
|
func (e *SimpleEntry) FindLatestLocalFile() (*LocalFile, bool) {
|
|
lfs, ok := e.FindMainLocalFiles()
|
|
// If there are no local files, return nil
|
|
if !ok {
|
|
return nil, false
|
|
}
|
|
// Get the local file with the highest episode number
|
|
latest := lfs[0]
|
|
for _, lf := range lfs {
|
|
if lf.GetEpisodeNumber() > latest.GetEpisodeNumber() {
|
|
latest = lf
|
|
}
|
|
}
|
|
return latest, true
|
|
}
|
|
|
|
func (e *SimpleEntry) FindMainLocalFiles() ([]*LocalFile, bool) {
|
|
if e.LocalFiles == nil {
|
|
return nil, false
|
|
}
|
|
if len(e.LocalFiles) == 0 {
|
|
return nil, false
|
|
}
|
|
lfs := make([]*LocalFile, 0)
|
|
for _, lf := range e.LocalFiles {
|
|
if lf.IsMain() {
|
|
lfs = append(lfs, lf)
|
|
}
|
|
}
|
|
if len(lfs) == 0 {
|
|
return nil, false
|
|
}
|
|
return lfs, true
|
|
}
|
|
|
|
func (e *SimpleEntry) FindListData() (*EntryListData, bool) {
|
|
if e.EntryListData == nil {
|
|
return nil, false
|
|
}
|
|
return e.EntryListData, true
|
|
}
|
|
|
|
func (e *SimpleEntry) IsInAnimeCollection() bool {
|
|
_, ok := e.FindListData()
|
|
return ok
|
|
}
|