番組 URL から番組を登録する機能を追加(ステップ11)
This commit is contained in:
@@ -11,6 +11,9 @@ import (
|
||||
|
||||
var tverSeriesIDPattern = regexp.MustCompile(`^[A-Za-z0-9]+$`)
|
||||
|
||||
// ErrSeriesNotFound は callSeries が HTTP 404 を返したことを表す。
|
||||
var ErrSeriesNotFound = errors.New("series not found")
|
||||
|
||||
type seriesContents struct {
|
||||
Code int `json:"code"`
|
||||
Result struct {
|
||||
@@ -21,6 +24,47 @@ type seriesContents struct {
|
||||
} `json:"result"`
|
||||
}
|
||||
|
||||
func (c *Client) FetchSeries(ctx context.Context, seriesID string) (string, error) {
|
||||
if !tverSeriesIDPattern.MatchString(seriesID) {
|
||||
return "", errors.New("invalid series id")
|
||||
}
|
||||
session, err := c.CreateSession(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
endpoint := c.baseURL.ResolveReference(&url.URL{Path: "/service/api/v2/callSeries/" + seriesID})
|
||||
query := endpoint.Query()
|
||||
query.Set("platform_uid", session.PlatformUID)
|
||||
query.Set("platform_token", session.PlatformToken)
|
||||
endpoint.RawQuery = query.Encode()
|
||||
request, err := http.NewRequestWithContext(ctx, http.MethodGet, endpoint.String(), nil)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("series request: %w", err)
|
||||
}
|
||||
setTVerHeaders(request)
|
||||
var response struct {
|
||||
Code int `json:"code"`
|
||||
Result struct {
|
||||
Content struct {
|
||||
Content struct {
|
||||
Title string `json:"title"`
|
||||
} `json:"content"`
|
||||
} `json:"content"`
|
||||
} `json:"result"`
|
||||
}
|
||||
if err := c.getJSON(request, &response); err != nil {
|
||||
var statusErr *httpStatusError
|
||||
if errors.As(err, &statusErr) && statusErr.statusCode == http.StatusNotFound {
|
||||
return "", ErrSeriesNotFound
|
||||
}
|
||||
return "", fmt.Errorf("series: %w", err)
|
||||
}
|
||||
if response.Code != 0 || response.Result.Content.Content.Title == "" {
|
||||
return "", fmt.Errorf("series: invalid API result (code %d)", response.Code)
|
||||
}
|
||||
return response.Result.Content.Content.Title, nil
|
||||
}
|
||||
|
||||
func (c *Client) FetchSeriesEpisodes(ctx context.Context, seriesID string) ([]Episode, error) {
|
||||
if !tverSeriesIDPattern.MatchString(seriesID) {
|
||||
return nil, errors.New("invalid series id")
|
||||
|
||||
Reference in New Issue
Block a user