4 "github.com/terorie/yt-mango/data"
6 "github.com/terorie/yt-mango/common"
7 "github.com/valyala/fastjson"
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
) {
17 req
, err
:= http
.NewRequest("GET", videoURL
+ v
.ID
, nil)
18 if err
!= nil { return nil, err
}
19 setHeaders(&req
.Header
)
22 res
, err
:= common
.Client
.Do(req
)
23 if err
!= nil { return }
26 body
, err
:= ioutil
.ReadAll(res
.Body
)
27 if err
!= nil { return }
31 root
, err
= p
.ParseBytes(body
)
32 if err
!= nil { return }
37 func GrabChannelPage(channelID
string, page
uint) (root
*fastjson
.Value
, err error
) {
39 token
:= GenChannelPageToken(channelID
, uint64(page
))
40 url
:= channelURL
+ token
43 req
, err
:= http
.NewRequest("GET", url
, nil)
44 if err
!= nil { return nil, err
}
45 setHeaders(&req
.Header
)
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
)
55 if res
.StatusCode
!= 200 { return nil, errors
.New("HTTP failure") }
58 defer res
.Body
.Close()
59 buf
, err
:= ioutil
.ReadAll(res
.Body
)
60 if err
!= nil { return nil, err
}
64 root
, err
= p
.ParseBytes(buf
)
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")