func iterItems(itemch chan<- imageFile, errch chan<- error, filter filterFunc, client *http.Client, username string) { defer close(itemch) albums, err := picago.GetAlbums(client, username) if err != nil { errch <- err return } gate := syncutil.NewGate(parallelAlbumRoutines) for _, album := range albums { photos, err := picago.GetPhotos(client, username, album.ID) if err != nil { select { case errch <- err: default: return } continue } gate.Start() go func(albumName, albumTitle string) { defer gate.Done() for _, photo := range photos { img := imageFile{ albumTitle: albumTitle, albumName: albumName, fileName: photo.Filename(), ID: photo.ID, } ok, err := filter(img) if err != nil { errch <- err return } if !ok { continue } img.r, err = picago.DownloadPhoto(client, photo.URL) if err != nil { select { case errch <- fmt.Errorf("Get(%s): %v", photo.URL, err): default: return } continue } itemch <- img } }(album.Name, album.Title) } }
func (r *run) importAlbums() error { albums, err := picago.GetAlbums(r.HTTPClient(), "default") if err != nil { return fmt.Errorf("importAlbums: error listing albums: %v", err) } albumsNode, err := r.getTopLevelNode("albums", "Albums") for _, album := range albums { if r.Context.IsCanceled() { return context.ErrCanceled } if err := r.importAlbum(albumsNode, album); err != nil { return fmt.Errorf("picasa importer: error importing album %s: %v", album, err) } } return nil }
func (r *run) importAlbums() error { albums, err := picago.GetAlbums(ctxutil.Client(r), "default") if err != nil { return fmt.Errorf("importAlbums: error listing albums: %v", err) } albumsNode, err := r.getTopLevelNode("albums", "Albums") for _, album := range albums { select { case <-r.Done(): return r.Err() default: } if err := r.importAlbum(albumsNode, album); err != nil { return fmt.Errorf("picasa importer: error importing album %s: %v", album, err) } } return nil }