mirror of
https://github.com/crunchy-labs/crunchy-cli.git
synced 2026-01-21 12:12:00 -06:00
Added utility to work with urls
This commit is contained in:
parent
af2824f216
commit
0cbcad2c40
1 changed files with 82 additions and 0 deletions
82
utils/url.go
Normal file
82
utils/url.go
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue