/
picasa.go
113 lines (97 loc) · 2.07 KB
/
picasa.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
package main
import (
"io"
"io/ioutil"
"net/http"
"strings"
"fmt"
)
type Album struct {
Title string
FileName string
NumPhotos int
Url string
}
type Item struct {
FileName string
Url string
}
type Picasa struct {
client *http.Client
auth string
}
func (p *Picasa) get(url string) (io.ReadCloser, error) {
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return nil, err
}
req.Header.Add("GData-Version", "2")
if p.auth != "" {
req.Header.Add("Authorization", "GoogleLogin auth="+p.auth)
}
resp, err := p.client.Do(req)
if err != nil {
return nil, err
}
if resp.StatusCode != 200 {
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
return nil, fmt.Errorf("request failed (%d) - %q", resp.StatusCode, data)
}
return resp.Body, nil
}
func (p *Picasa) getAlbums(userid string) []*Album {
if userid == "" {
userid = "default"
}
body, err := p.get("https://picasaweb.google.com/data/feed/api/user/" + userid)
check(err)
defer body.Close()
return p.parseAlbums(body)
}
func (p *Picasa) parseAlbums(r io.Reader) []*Album {
feed, err := AtomParse(r)
check(err)
var albums []*Album
for _, e := range feed.Entry {
album := &Album{}
album.NumPhotos = e.NumPhotos
album.Title = e.Title
album.FileName = e.Name
for _, l := range e.Link {
if l.Rel == "http://schemas.google.com/g/2005#feed" {
album.Url = l.Href
}
}
albums = append(albums, album)
}
return albums
}
func (p *Picasa) getAlbum(url string) []*Item {
body, err := p.get(url)
check(err)
defer body.Close()
return p.parseAlbum(body)
}
func (p *Picasa) parseAlbum(r io.Reader) []*Item {
feed, err := AtomParse(r)
check(err)
var items []*Item
for _, e := range feed.Entry {
item := &Item{}
item.FileName = e.Title
for _, c := range e.Media.Content {
if strings.HasPrefix(c.Type, "video/") {
item.Url = c.Url
break
} else if strings.HasPrefix(c.Type, "image/") {
item.Url = c.Url
// Don't break here; keep looking in case there's video.
}
}
items = append(items, item)
}
return items
}