Merge pull request #225 from aboodman/width

flickr: import width and height too
This commit is contained in:
Aaron Boodman
2015-08-26 23:02:19 -07:00
3 changed files with 116 additions and 82 deletions
+26 -11
View File
@@ -11,6 +11,7 @@ import (
"net/http"
"net/url"
"reflect"
"strconv"
"strings"
"github.com/attic-labs/noms/Godeps/_workspace/src/github.com/garyburd/go-oauth/oauth"
@@ -203,7 +204,7 @@ func getAlbumPhotos(id string) SetOfPhoto {
photos := types.NewSet()
for _, p := range response.Photoset.Photo {
url := getOriginalUrl(p.Id)
url, w, h := getOriginalUrl(p.Id)
fmt.Printf(" . %v\n", url)
photoReader := getPhotoReader(url)
defer photoReader.Close()
@@ -211,10 +212,12 @@ func getAlbumPhotos(id string) SetOfPhoto {
d.Chk.NoError(err)
photo := NewPhoto().
SetId(types.NewString(p.Id)).
SetImage(b).
SetTags(getTags(p.Tags)).
SetTitle(types.NewString(p.Title)).
SetUrl(types.NewString(url)).
SetTags(getTags(p.Tags)).
SetImage(b)
SetWidth(types.UInt32(w)).
SetHeight(types.UInt32(h))
// The photo is big, so write it out now to release the memory.
r := types.WriteValue(photo.NomsValue(), ds.Store())
photos = photos.Insert(types.Ref{r})
@@ -233,16 +236,15 @@ func getTags(tagStr string) (res SetOfString) {
return res
}
func getOriginalUrl(id string) string {
func getOriginalUrl(id string) (string, uint32, uint32) {
response := struct {
flickrCall
Sizes struct {
Size []struct {
Label string `json:"label"`
Source string `json:"source"`
// TODO: For some reason json unmarshalling was getting confused about types. Not sure why.
// Width int `json:"width"`
// Height int `json:"height"`
Label string `json:"label"`
Source string `json:"source"`
Width interface{} `json:"width"`
Height interface{} `json:"height"`
} `json:"size"`
} `json:"sizes"`
}{}
@@ -254,11 +256,24 @@ func getOriginalUrl(id string) string {
for _, p := range response.Sizes.Size {
if p.Label == "Original" {
return p.Source
dim := func(v interface{}) uint32 {
switch v := v.(type) {
case float64:
return uint32(v)
case string:
i, err := strconv.Atoi(v)
d.Chk.NoError(err)
return uint32(i)
default:
d.Chk.Fail("Unexpected value for image width or height: %+v", v)
return 0
}
}
return p.Source, dim(p.Width), dim(p.Height)
}
}
d.Chk.Fail(fmt.Sprintf("No Original image size found photo: %v", id))
return "NOT REACHED"
return "NOT REACHED", 0, 0
}
func getPhotoReader(url string) io.ReadCloser {
+85 -69
View File
@@ -68,6 +68,75 @@ func (m MapOfStringToAlbum) Iter(cb MapOfStringToAlbumIterCallback) {
})
}
// User
type User struct {
m types.Map
}
func NewUser() User {
return User{
types.NewMap(types.NewString("$name"), types.NewString("User")),
}
}
func UserFromVal(v types.Value) User {
return User{v.(types.Map)}
}
// TODO: This was going to be called Value() but it collides with root.value. We need some other place to put the built-in fields like Value() and Equals().
func (s User) NomsValue() types.Map {
return s.m
}
func (s User) Equals(p User) bool {
return s.m.Equals(p.m)
}
func (s User) Ref() ref.Ref {
return s.m.Ref()
}
func (s User) OAuthToken() types.String {
return types.StringFromVal(s.m.Get(types.NewString("oAuthToken")))
}
func (s User) SetOAuthToken(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthToken"), p))
}
func (s User) Name() types.String {
return types.StringFromVal(s.m.Get(types.NewString("name")))
}
func (s User) SetName(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("name"), p))
}
func (s User) Albums() MapOfStringToAlbum {
return MapOfStringToAlbumFromVal(s.m.Get(types.NewString("albums")))
}
func (s User) SetAlbums(p MapOfStringToAlbum) User {
return UserFromVal(s.m.Set(types.NewString("albums"), p.NomsValue()))
}
func (s User) Id() types.String {
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s User) SetId(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("id"), p))
}
func (s User) OAuthSecret() types.String {
return types.StringFromVal(s.m.Get(types.NewString("oAuthSecret")))
}
func (s User) SetOAuthSecret(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthSecret"), p))
}
// Album
type Album struct {
@@ -232,6 +301,14 @@ func (s Photo) Ref() ref.Ref {
return s.m.Ref()
}
func (s Photo) Width() types.UInt32 {
return types.UInt32FromVal(s.m.Get(types.NewString("width")))
}
func (s Photo) SetWidth(p types.UInt32) Photo {
return PhotoFromVal(s.m.Set(types.NewString("width"), p))
}
func (s Photo) Title() types.String {
return types.StringFromVal(s.m.Get(types.NewString("title")))
}
@@ -256,6 +333,14 @@ func (s Photo) SetTags(p SetOfString) Photo {
return PhotoFromVal(s.m.Set(types.NewString("tags"), p.NomsValue()))
}
func (s Photo) Height() types.UInt32 {
return types.UInt32FromVal(s.m.Get(types.NewString("height")))
}
func (s Photo) SetHeight(p types.UInt32) Photo {
return PhotoFromVal(s.m.Set(types.NewString("height"), p))
}
func (s Photo) Image() types.Blob {
return types.BlobFromVal(s.m.Get(types.NewString("image")))
}
@@ -354,72 +439,3 @@ func (s SetOfString) fromElemSlice(p []types.String) []types.Value {
return r
}
// User
type User struct {
m types.Map
}
func NewUser() User {
return User{
types.NewMap(types.NewString("$name"), types.NewString("User")),
}
}
func UserFromVal(v types.Value) User {
return User{v.(types.Map)}
}
// TODO: This was going to be called Value() but it collides with root.value. We need some other place to put the built-in fields like Value() and Equals().
func (s User) NomsValue() types.Map {
return s.m
}
func (s User) Equals(p User) bool {
return s.m.Equals(p.m)
}
func (s User) Ref() ref.Ref {
return s.m.Ref()
}
func (s User) OAuthToken() types.String {
return types.StringFromVal(s.m.Get(types.NewString("oAuthToken")))
}
func (s User) SetOAuthToken(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthToken"), p))
}
func (s User) Name() types.String {
return types.StringFromVal(s.m.Get(types.NewString("name")))
}
func (s User) SetName(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("name"), p))
}
func (s User) Albums() MapOfStringToAlbum {
return MapOfStringToAlbumFromVal(s.m.Get(types.NewString("albums")))
}
func (s User) SetAlbums(p MapOfStringToAlbum) User {
return UserFromVal(s.m.Set(types.NewString("albums"), p.NomsValue()))
}
func (s User) Id() types.String {
return types.StringFromVal(s.m.Get(types.NewString("id")))
}
func (s User) SetId(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("id"), p))
}
func (s User) OAuthSecret() types.String {
return types.StringFromVal(s.m.Get(types.NewString("oAuthSecret")))
}
func (s User) SetOAuthSecret(p types.String) User {
return UserFromVal(s.m.Set(types.NewString("oAuthSecret"), p))
}
+5 -2
View File
@@ -15,11 +15,14 @@ func init() {
PhotoTypeDef = types.NewMap(
types.NewString("$type"), types.NewString("noms.StructDef"),
types.NewString("$name"), types.NewString("Photo"),
types.NewString("height"), types.NewString("uint32"),
types.NewString("id"), types.NewString("string"),
types.NewString("image"), types.NewString("blob"),
types.NewString("tags"), stringSet,
types.NewString("title"), types.NewString("string"),
types.NewString("url"), types.NewString("string"),
types.NewString("image"), types.NewString("blob"),
types.NewString("tags"), stringSet)
types.NewString("width"), types.NewString("uint32"),
)
PhotoSetTypeDef = types.NewMap(
types.NewString("$type"), types.NewString("noms.SetDef"),