Refactor API selection
[yt-mango.git] / apijson / grab.go
blob9e90befd43d0699d4356e82f7526202f5b55f770
1 package apijson
3 import (
4 "github.com/terorie/yt-mango/data"
5 "net/http"
6 "github.com/terorie/yt-mango/common"
7 "github.com/valyala/fastjson"
8 "io/ioutil"
9 "errors"
12 const videoURL = "https://www.youtube.com/watch?pbj=1&v="
13 const channelURL = "https://www.youtube.com/browse_ajax?ctoken="
15 func GrabVideo(v *data.Video) (root *fastjson.Value, err error) {
16 // Prepare request
17 req, err := http.NewRequest("GET", videoURL+ v.ID, nil)
18 if err != nil { return nil, err }
19 setHeaders(&req.Header)
21 // Send request
22 res, err := common.Client.Do(req)
23 if err != nil { return }
25 // Download response
26 body, err := ioutil.ReadAll(res.Body)
27 if err != nil { return }
29 // Parse JSON
30 var p fastjson.Parser
31 root, err = p.ParseBytes(body)
32 if err != nil { return }
34 return
37 func GrabChannelPage(channelID string, page uint) (root *fastjson.Value, err error) {
38 // Generate page URL
39 token := GenChannelPageToken(channelID, uint64(page))
40 url := channelURL + token
42 // Prepare request
43 req, err := http.NewRequest("GET", url, nil)
44 if err != nil { return nil, err }
45 setHeaders(&req.Header)
47 // Send request
48 res, err := common.Client.Do(req)
49 if err != nil { return nil, err }
50 if res.StatusCode == 500 {
51 defer res.Body.Close()
52 buf, _ := ioutil.ReadAll(res.Body)
53 println(string(buf))
55 if res.StatusCode != 200 { return nil, errors.New("HTTP failure") }
57 // Download response
58 defer res.Body.Close()
59 buf, err := ioutil.ReadAll(res.Body)
60 if err != nil { return nil, err }
62 // Parse JSON
63 var p fastjson.Parser
64 root, err = p.ParseBytes(buf)
65 return
68 func setHeaders(h *http.Header) {
69 h.Add("Host", "www.youtube.com")
70 h.Add("X-YouTube-Client-Name", "1")
71 h.Add("X-YouTube-Client-Version", "2.20170707")