Change request url for some request & regex

This commit is contained in:
bytedream 2022-05-16 19:28:05 +02:00
parent f046b68371
commit 62735cf07c
6 changed files with 36 additions and 59 deletions

View file

@ -11,6 +11,7 @@ import (
"net/url" "net/url"
"regexp" "regexp"
"strconv" "strconv"
"strings"
) )
// LOCALE represents a locale / language. // LOCALE represents a locale / language.
@ -33,7 +34,7 @@ const (
type Crunchyroll struct { type Crunchyroll struct {
// Client is the http.Client to perform all requests over. // Client is the http.Client to perform all requests over.
Client *http.Client Client *http.Client
// Context can be used to stop requests with Client and is context.Background by default. // Context can be used to stop requests with Client.
Context context.Context Context context.Context
// Locale specifies in which language all results should be returned / requested. // Locale specifies in which language all results should be returned / requested.
Locale LOCALE Locale LOCALE
@ -45,9 +46,10 @@ type Crunchyroll struct {
TokenType string TokenType string
AccessToken string AccessToken string
Bucket string
CountryCode string CountryCode string
Premium bool Premium bool
Channel string
Policy string Policy string
Signature string Signature string
KeyPairID string KeyPairID string
@ -141,13 +143,7 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (*
if user == nil { if user == nil {
return nil, errors.New("invalid session id, user is not logged in") return nil, errors.New("invalid session id, user is not logged in")
} }
if user.(map[string]interface{})["premium"] == "" { crunchy.Config.Premium = user.(map[string]interface{})["premium"] != ""
crunchy.Config.Premium = false
crunchy.Config.Channel = "-"
} else {
crunchy.Config.Premium = true
crunchy.Config.Channel = "crunchyroll"
}
var etpRt string var etpRt string
for _, cookie := range resp.Cookies() { for _, cookie := range resp.Cookies() {
@ -200,6 +196,9 @@ func LoginWithSessionID(sessionID string, locale LOCALE, client *http.Client) (*
} }
cms := jsonBody["cms"].(map[string]interface{}) cms := jsonBody["cms"].(map[string]interface{})
// / is trimmed so that urls which require it must be in .../{bucket}/... like format.
// this just looks cleaner
crunchy.Config.Bucket = strings.TrimPrefix(cms["bucket"].(string), "/")
crunchy.Config.Policy = cms["policy"].(string) crunchy.Config.Policy = cms["policy"].(string)
crunchy.Config.Signature = cms["signature"].(string) crunchy.Config.Signature = cms["signature"].(string)
crunchy.Config.KeyPairID = cms["key_pair_id"].(string) crunchy.Config.KeyPairID = cms["key_pair_id"].(string)

View file

@ -77,10 +77,8 @@ type Episode struct {
// EpisodeFromID returns an episode by its api id. // EpisodeFromID returns an episode by its api id.
func EpisodeFromID(crunchy *Crunchyroll, id string) (*Episode, error) { func EpisodeFromID(crunchy *Crunchyroll, id string) (*Episode, error) {
resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/episodes/%s?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/episodes/%s?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -194,10 +192,8 @@ func (e *Episode) Streams() ([]*Stream, error) {
return e.children, nil return e.children, nil
} }
streams, err := fromVideoStreams(e.crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", streams, err := fromVideoStreams(e.crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
e.crunchy.Config.CountryCode, e.crunchy.Config.Bucket,
e.crunchy.Config.MaturityRating,
e.crunchy.Config.Channel,
e.StreamID, e.StreamID,
e.crunchy.Locale, e.crunchy.Locale,
e.crunchy.Config.Signature, e.crunchy.Config.Signature,

View file

@ -40,10 +40,8 @@ type MovieListing struct {
// MovieListingFromID returns a movie listing by its api id. // MovieListingFromID returns a movie listing by its api id.
func MovieListingFromID(crunchy *Crunchyroll, id string) (*MovieListing, error) { func MovieListingFromID(crunchy *Crunchyroll, id string) (*MovieListing, error) {
resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/movie_listing/%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/movie_listing/%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -69,10 +67,8 @@ func MovieListingFromID(crunchy *Crunchyroll, id string) (*MovieListing, error)
// AudioLocale is same as Episode.AudioLocale. // AudioLocale is same as Episode.AudioLocale.
func (ml *MovieListing) AudioLocale() (LOCALE, error) { func (ml *MovieListing) AudioLocale() (LOCALE, error) {
resp, err := ml.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := ml.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
ml.crunchy.Config.CountryCode, ml.crunchy.Config.Bucket,
ml.crunchy.Config.MaturityRating,
ml.crunchy.Config.Channel,
ml.ID, ml.ID,
ml.crunchy.Locale, ml.crunchy.Locale,
ml.crunchy.Config.Signature, ml.crunchy.Config.Signature,
@ -90,10 +86,8 @@ func (ml *MovieListing) AudioLocale() (LOCALE, error) {
// Streams returns all streams which are available for the movie listing. // Streams returns all streams which are available for the movie listing.
func (ml *MovieListing) Streams() ([]*Stream, error) { func (ml *MovieListing) Streams() ([]*Stream, error) {
return fromVideoStreams(ml.crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", return fromVideoStreams(ml.crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
ml.crunchy.Config.CountryCode, ml.crunchy.Config.Bucket,
ml.crunchy.Config.MaturityRating,
ml.crunchy.Config.Channel,
ml.ID, ml.ID,
ml.crunchy.Locale, ml.crunchy.Locale,
ml.crunchy.Config.Signature, ml.crunchy.Config.Signature,

View file

@ -44,10 +44,8 @@ type Season struct {
// SeasonFromID returns a season by its api id. // SeasonFromID returns a season by its api id.
func SeasonFromID(crunchy *Crunchyroll, id string) (*Season, error) { func SeasonFromID(crunchy *Crunchyroll, id string) (*Season, error) {
resp, err := crunchy.Client.Get(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/seasons/%s?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := crunchy.Client.Get(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/seasons?series_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -86,10 +84,8 @@ func (s *Season) Episodes() (episodes []*Episode, err error) {
return s.children, nil return s.children, nil
} }
resp, err := s.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/episodes?season_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := s.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/episodes?season_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
s.crunchy.Config.CountryCode, s.crunchy.Config.Bucket,
s.crunchy.Config.MaturityRating,
s.crunchy.Config.Channel,
s.ID, s.ID,
s.crunchy.Locale, s.crunchy.Locale,
s.crunchy.Config.Signature, s.crunchy.Config.Signature,
@ -111,8 +107,10 @@ func (s *Season) Episodes() (episodes []*Episode, err error) {
} }
if episode.Playback != "" { if episode.Playback != "" {
streamHref := item.(map[string]interface{})["__links__"].(map[string]interface{})["streams"].(map[string]interface{})["href"].(string) streamHref := item.(map[string]interface{})["__links__"].(map[string]interface{})["streams"].(map[string]interface{})["href"].(string)
if match := regexp.MustCompile(`(?m)^/cms/v2/\S+videos/(\w+)/streams$`).FindAllStringSubmatch(streamHref, -1); len(match) > 0 { if match := regexp.MustCompile(`(?m)(\w+)/streams$`).FindAllStringSubmatch(streamHref, -1); len(match) > 0 {
episode.StreamID = match[0][1] episode.StreamID = match[0][1]
} else {
fmt.Println()
} }
} }
episodes = append(episodes, episode) episodes = append(episodes, episode)

View file

@ -25,10 +25,8 @@ type Stream struct {
// StreamsFromID returns a stream by its api id. // StreamsFromID returns a stream by its api id.
func StreamsFromID(crunchy *Crunchyroll, id string) ([]*Stream, error) { func StreamsFromID(crunchy *Crunchyroll, id string) ([]*Stream, error) {
return fromVideoStreams(crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", return fromVideoStreams(crunchy, fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/videos/%s/streams?locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -105,7 +103,7 @@ func fromVideoStreams(crunchy *Crunchyroll, endpoint string) (streams []*Stream,
var id string var id string
var formatType FormatType var formatType FormatType
href := jsonBody["__links__"].(map[string]interface{})["resource"].(map[string]interface{})["href"].(string) href := jsonBody["__links__"].(map[string]interface{})["resource"].(map[string]interface{})["href"].(string)
if match := regexp.MustCompile(`(?sm)^/cms/v2/\S+/crunchyroll/(\w+)/(\w+)$`).FindAllStringSubmatch(href, -1); len(match) > 0 { if match := regexp.MustCompile(`(?sm)/(\w+)/(\w+)$`).FindAllStringSubmatch(href, -1); len(match) > 0 {
formatType = FormatType(match[0][1]) formatType = FormatType(match[0][1])
id = match[0][2] id = match[0][2]
} }

View file

@ -69,10 +69,8 @@ type Movie struct {
// MovieFromID returns a movie by its api id. // MovieFromID returns a movie by its api id.
func MovieFromID(crunchy *Crunchyroll, id string) (*Movie, error) { func MovieFromID(crunchy *Crunchyroll, id string) (*Movie, error) {
resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/movies/%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/movies/%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -102,10 +100,8 @@ func (m *Movie) MovieListing() (movieListings []*MovieListing, err error) {
return m.children, nil return m.children, nil
} }
resp, err := m.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/movies?movie_listing_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := m.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/movies?movie_listing_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
m.crunchy.Config.CountryCode, m.crunchy.Config.Bucket,
m.crunchy.Config.MaturityRating,
m.crunchy.Config.Channel,
m.ID, m.ID,
m.crunchy.Locale, m.crunchy.Locale,
m.crunchy.Config.Signature, m.crunchy.Config.Signature,
@ -165,10 +161,8 @@ type Series struct {
// SeriesFromID returns a series by its api id. // SeriesFromID returns a series by its api id.
func SeriesFromID(crunchy *Crunchyroll, id string) (*Series, error) { func SeriesFromID(crunchy *Crunchyroll, id string) (*Series, error) {
resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/movies?movie_listing_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/movies?movie_listing_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
crunchy.Config.CountryCode, crunchy.Config.Bucket,
crunchy.Config.MaturityRating,
crunchy.Config.Channel,
id, id,
crunchy.Locale, crunchy.Locale,
crunchy.Config.Signature, crunchy.Config.Signature,
@ -198,10 +192,8 @@ func (s *Series) Seasons() (seasons []*Season, err error) {
return s.children, nil return s.children, nil
} }
resp, err := s.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/%s/%s/seasons?series_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s", resp, err := s.crunchy.request(fmt.Sprintf("https://beta-api.crunchyroll.com/cms/v2/%s/seasons?series_id=%s&locale=%s&Signature=%s&Policy=%s&Key-Pair-Id=%s",
s.crunchy.Config.CountryCode, s.crunchy.Config.Bucket,
s.crunchy.Config.MaturityRating,
s.crunchy.Config.Channel,
s.ID, s.ID,
s.crunchy.Locale, s.crunchy.Locale,
s.crunchy.Config.Signature, s.crunchy.Config.Signature,