crunchy-cli/utils/url.go
2022-02-07 19:17:00 +01:00

82 lines
2.3 KiB
Go

package utils
import (
"fmt"
"github.com/ByteDream/crunchyroll-go"
)
// ExtractEpisodesFromUrl extracts all episodes from an url.
// If audio is not empty, the episodes gets filtered after the given locale
func ExtractEpisodesFromUrl(crunchy *crunchyroll.Crunchyroll, url string, audio crunchyroll.LOCALE) ([]*crunchyroll.Episode, error) {
series, episodes, err := ParseUrl(crunchy, url)
if err != nil {
return nil, err
}
var eps []*crunchyroll.Episode
if series != nil {
seasons, err := series.Seasons()
if err != nil {
return nil, err
}
for _, season := range seasons {
if audio != "" {
if audioLocale, err := season.AudioLocale(); err != nil {
return nil, err
} else if audioLocale != audio {
continue
}
}
e, err := season.Episodes()
if err != nil {
return nil, err
}
eps = append(eps, e...)
}
} else if episodes != nil {
for _, episode := range episodes {
if audio == "" {
eps = append(eps, episode)
} else if audioLocale, err := episode.AudioLocale(); err != nil {
return nil, err
} else if audioLocale == audio {
eps = append(eps, episode)
}
}
}
return eps, nil
}
// ParseUrl parses the given url into a series or episode.
// The returning episode is a slice because non-beta urls have the same episode with different languages
func ParseUrl(crunchy *crunchyroll.Crunchyroll, url string) (*crunchyroll.Series, []*crunchyroll.Episode, error) {
if seriesId, ok := crunchyroll.ParseBetaSeriesURL(url); ok {
series, err := crunchyroll.SeriesFromID(crunchy, seriesId)
if err != nil {
return nil, nil, err
}
return series, nil, nil
} else if episodeId, ok := crunchyroll.ParseBetaEpisodeURL(url); ok {
episode, err := crunchyroll.EpisodeFromID(crunchy, episodeId)
if err != nil {
return nil, nil, err
}
return nil, []*crunchyroll.Episode{episode}, nil
} else if seriesName, ok := crunchyroll.ParseVideoURL(url); ok {
video, err := crunchy.FindVideoByName(seriesName)
if err != nil {
return nil, nil, err
}
return video.(*crunchyroll.Series), nil, nil
} else if seriesName, title, _, _, ok := crunchyroll.ParseEpisodeURL(url); ok {
episodes, err := crunchy.FindEpisodeByName(seriesName, title)
if err != nil {
return nil, nil, err
}
return nil, episodes, nil
} else {
return nil, nil, fmt.Errorf("invalid url %s", url)
}
}