twitch.go - twitch-go - twitch.tv web application in Go
(HTM) git clone git://git.codemadness.org/twitch-go
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
twitch.go (5744B)
---
1 package twitch
2
3 import (
4 "encoding/json"
5 "errors"
6 "fmt"
7 "io/ioutil"
8 "net/http"
9 "net/url"
10 "time"
11 )
12
13 // set your Twitch Client-ID.
14 var Clientid string
15
16 type Token struct {
17 Mobile_restricted bool
18 Sig string
19 Token string
20 }
21
22 type Featured struct {
23 Featured []struct {
24 Image string
25 Priority int
26 Scheduled bool
27 Sponsored bool
28 Stream struct {
29 Id int
30 Average_fps float64
31 Created_at string
32 Channel struct {
33 Broadcaster_language string
34 Delay int
35 Followers int
36 Display_name string
37 Language string
38 Name string
39 Logo string
40 Mature bool
41 Partner bool
42 Status string
43 Updated_at string
44 Url string
45 Views int
46 }
47 Game string
48 Video_height int
49 Viewers int
50 }
51 Text string
52 Title string
53 }
54 }
55
56 type Game struct {
57 Streams []struct {
58 Id int
59 Average_fps float64
60 Channel struct {
61 Broadcaster_language string
62 Delay int
63 Followers int
64 Display_name string
65 Language string
66 Name string
67 Logo string
68 Mature bool
69 Partner bool
70 Status string
71 Updated_at string
72 Url string
73 Views int
74 }
75 Created_at string
76 Game string
77 Video_height int
78 Viewers int
79 }
80 }
81
82 type Games struct {
83 Top []struct {
84 Channels int
85 Game struct {
86 Box struct {
87 Large string
88 Medium string
89 Small string
90 Template string
91 }
92 Giantbomb_id int
93 Logo struct {
94 Large string
95 Medium string
96 Small string
97 Template string
98 }
99 Name string
100 }
101 Viewers int
102 }
103 }
104
105 type User struct {
106 Broadcaster_type string `json:"broadcaster_type"`
107 Description string `json:"description"`
108 Display_name string `json:"display_name"`
109 Email string `json:"email"`
110 Id string `json:"id"`
111 Login string `json:"login"`
112 Offline_image_url string `json:"offline_image_url"`
113 Profile_image_url string `json:"profile_image_url"`
114 Type string `json:"type"`
115 View_count int64 `json:"view_count"`
116 }
117
118 type Users struct {
119 Items []User `json:"data"`
120 }
121
122 type Video struct {
123 Created_at string `json:"created_at"`
124 Description string `json:"description"`
125 Duration string `json:"duration"`
126 Id string `json:"id"`
127 Language string `json:"language"`
128 Published_at string `json:"published_at"`
129 Thumbnail_url string `json:"thumbnail_url"`
130 Title string `json:"title"`
131 Type string `json:"type"`
132 Url string `json:"url"`
133 User_id string `json:"user_id"`
134 User_name string `json:"user_name"`
135 View_count int64 `json:"view_count"`
136 Viewable string `json:"viewable"`
137 }
138
139 type Videos struct {
140 Items []Video `json:"data"`
141 }
142
143 func ReadAllUrl(url string) ([]byte, error) {
144 client := http.Client{
145 Timeout: time.Duration(30) * time.Second,
146 }
147 req, err := http.NewRequest("GET", url, nil)
148 if err != nil {
149 return nil, err
150 }
151
152 req.Header.Set("Client-ID", Clientid)
153 req.Header.Set("User-Agent", "")
154
155 resp, err := client.Do(req)
156 if resp != nil {
157 defer resp.Body.Close()
158 }
159 if err != nil {
160 return nil, err
161 }
162 body, err := ioutil.ReadAll(resp.Body)
163 if err != nil {
164 return nil, err
165 }
166 if resp.StatusCode != 200 {
167 return nil, errors.New(resp.Status)
168 }
169 return body, nil
170 }
171
172 func GetToken(channel string) (*Token, error) {
173 url := fmt.Sprintf("https://api.twitch.tv/api/channels/%s/access_token", channel)
174 body, err := ReadAllUrl(url)
175 if err != nil {
176 return nil, err
177 }
178 var v Token
179 err = json.Unmarshal(body, &v)
180 if err != nil {
181 return nil, err
182 }
183 return &v, nil
184 }
185
186 func GetFeatured() (*Featured, error) {
187 url := "https://api.twitch.tv/kraken/streams/featured?limit=100"
188 body, err := ReadAllUrl(url)
189 if err != nil {
190 return nil, err
191 }
192 var v Featured
193 err = json.Unmarshal(body, &v)
194 if err != nil {
195 return nil, err
196 }
197 return &v, nil
198 }
199
200 func GetGames() (*Games, error) {
201 url := "https://api.twitch.tv/kraken/games/top?limit=100"
202 body, err := ReadAllUrl(url)
203 if err != nil {
204 return nil, err
205 }
206
207 var v Games
208 err = json.Unmarshal(body, &v)
209 if err != nil {
210 return nil, err
211 }
212 return &v, nil
213 }
214
215 func GetGame(game string) (*Game, error) {
216 s := fmt.Sprintf("https://api.twitch.tv/kraken/streams?game=%s", url.QueryEscape(game))
217 body, err := ReadAllUrl(s)
218 if err != nil {
219 return nil, err
220 }
221 var v Game
222 err = json.Unmarshal(body, &v)
223 if err != nil {
224 return nil, err
225 }
226 return &v, nil
227 }
228
229 func GetVideosByGame(gameid string) (*Videos, error) {
230 s := fmt.Sprintf("https://api.twitch.tv/helix/videos?first=100&game_id=%s", url.QueryEscape(gameid))
231 body, err := ReadAllUrl(s)
232 if err != nil {
233 return nil, err
234 }
235 var v Videos
236 err = json.Unmarshal(body, &v)
237 if err != nil {
238 return nil, err
239 }
240 return &v, nil
241 }
242
243 func GetVideosByUser(userid string) (*Videos, error) {
244 s := fmt.Sprintf("https://api.twitch.tv/helix/videos?first=100&user_id=%s",
245 url.QueryEscape(userid))
246 body, err := ReadAllUrl(s)
247 if err != nil {
248 return nil, err
249 }
250 var v Videos
251 err = json.Unmarshal(body, &v)
252 if err != nil {
253 return nil, err
254 }
255 return &v, nil
256 }
257
258 func GetUseridByName(name string) (*Users, error) {
259 s := fmt.Sprintf("https://api.twitch.tv/helix/users?login=%s",
260 url.QueryEscape(name))
261 body, err := ReadAllUrl(s)
262 if err != nil {
263 return nil, err
264 }
265 var u Users
266 err = json.Unmarshal(body, &u)
267 if err != nil {
268 return nil, err
269 }
270 return &u, nil
271 }