-
Notifications
You must be signed in to change notification settings - Fork 0
/
webstream.go
114 lines (107 loc) · 2.89 KB
/
webstream.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package client
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"strconv"
"time"
)
//WebStream will get the full webstream for the supplied album
func (c *Client) WebStream(done <-chan struct{}, errs chan error) <-chan PhotoDownload {
out := make(chan PhotoDownload)
streamURL := fmt.Sprintf("%s/webstream", c.BaseURL)
j, err := json.Marshal(map[string]interface{}{"streamCtag": nil})
if err != nil {
errs <- err
close(out)
return out
}
req, err := http.NewRequest("POST", streamURL, bytes.NewReader(j))
if err != nil {
errs <- err
close(out)
return out
}
req.Header.Set("Content-Type", "application/json")
resp, err := c.HTTPClient.Do(req)
if err != nil {
errs <- err
close(out)
return out
}
defer resp.Body.Close()
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
close(out)
return out
}
s := &Stream{}
err = json.Unmarshal(b, s)
if err != nil {
errs <- fmt.Errorf("%s; Invalid album ID supplied?", err.Error())
close(out)
return out
}
go func() {
for _, photo := range s.Photos {
pd := PhotoDownload{
PhotoGUID: photo.PhotoGUID,
}
var fileSize int
for _, derivative := range photo.Derivatives {
i, err := strconv.Atoi(derivative.FileSize)
if err != nil {
return
}
if i > fileSize {
fileSize = i
pd.Checksum = derivative.Checksum
}
}
select {
case out <- pd:
case <-done:
return
}
}
close(out)
}()
return out
}
//PhotoDownload is the struct we we will use for downloading
type PhotoDownload struct {
PhotoGUID string
Checksum string
}
//Stream contains the entire stream output
type Stream struct {
StreamCTag string `json:"streamCtag"`
ItemsReturned string `json:"itemsReturned"`
UserLastName string `json:"userLastName"`
UserFirstName string `json:"userFirstName"`
StreamName string `json:"streamName"`
Photos []Photo `json:"photos"`
}
//Photo describes a single photo
type Photo struct {
BatchGUID string `json:"batchGuid"`
Derivatives map[string]Derivative `json:"derivatives"`
ContributorLastName string `json:"contributorLastName"`
BatchDateCreated time.Time `json:"batchDateCreated"`
DateCreated time.Time `json:"dateCreated"`
ContributorFirstName string `json:"contributorFirstName"`
PhotoGUID string `json:"photoGuid"`
ContributorFullName string `json:"contributorFullName"`
Width string `json:"width"`
Caption string `json:"caption"`
Height string `json:"height"`
}
//Derivative is the struct we will use to determine which size of the picture to download
type Derivative struct {
FileSize string `json:"fileSize"`
Checksum string `json:"checksum"`
Width string `json:"width"`
Height string `json:"height"`
}