1
0
mirror of https://github.com/mxpv/podsync.git synced 2024-05-11 05:55:04 +00:00
Files
mxpv-podsync/pkg/builders/remote.go
2019-05-19 14:52:57 -07:00

80 lines
1.4 KiB
Go

package builders
import (
"encoding/json"
"io/ioutil"
"net/http"
"net/url"
"strconv"
"time"
"github.com/pkg/errors"
"github.com/mxpv/podsync/pkg/model"
)
type Remote struct {
url string
}
func NewRemote(url string) Remote {
return Remote{url: url}
}
func (r Remote) Build(feed *model.Feed) error {
addr, err := r.makeURL(feed)
if err != nil {
return err
}
client := http.Client{
Timeout: 5 * time.Minute,
}
resp, err := client.Get(addr)
if err != nil {
return err
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return errors.Wrapf(err, "failed to read error body (status: %d)", resp.StatusCode)
}
return errors.Errorf("unexpected response (%d) from updater: %q", resp.StatusCode, body)
}
var out responsePayload
if err := json.NewDecoder(resp.Body).Decode(&out); err != nil {
return err
}
feed.LastID = out.LastID
feed.Episodes = append(out.Episodes, feed.Episodes...)
feed.UpdatedAt = time.Now().UTC()
return nil
}
func (r Remote) makeURL(feed *model.Feed) (string, error) {
qs := url.Values{}
qs.Add("url", feed.ItemURL)
qs.Add("start", "1")
qs.Add("count", strconv.Itoa(feed.PageSize))
qs.Add("last_id", feed.LastID)
qs.Add("format", string(feed.Format))
qs.Add("quality", string(feed.Quality))
parsed, err := url.Parse(r.url)
if err != nil {
return "", err
}
parsed.RawQuery = qs.Encode()
return parsed.String(), nil
}