RailsMug 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +34 -0
- data/RailsMug.gemspec +20 -0
- data/Rakefile +5 -0
- data/lib/RailsMug.rb +12 -0
- data/lib/RailsMug/albums.rb +106 -0
- data/lib/RailsMug/api_methods.rb +18 -0
- data/lib/RailsMug/exceptions.rb +27 -0
- data/lib/RailsMug/images.rb +41 -0
- data/lib/RailsMug/model/album.rb +103 -0
- data/lib/RailsMug/model/image.rb +183 -0
- data/lib/RailsMug/record.rb +12 -0
- data/lib/RailsMug/session.rb +43 -0
- data/lib/RailsMug/version.rb +3 -0
- data/spec/RailsMug_helper.rb +7 -0
- data/spec/RailsMug_spec.rb +24 -0
- data/spec/images_spec.rb +17 -0
- data/spec/spec_helper.rb +11 -0
- metadata +103 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 David Slone
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# RailsMug
|
2
|
+
|
3
|
+
TODO: Write a gem description
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'RailsMug'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install RailsMug
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Get all albums
|
22
|
+
```
|
23
|
+
session = RailsMug::Session.new('APIKEY','APISECRET','TOKENKEY','TOKENSECRET')
|
24
|
+
rails_mug = RailsMug::Albums.new(session)
|
25
|
+
albums = rails_mug.get_albums
|
26
|
+
```
|
27
|
+
|
28
|
+
## Contributing
|
29
|
+
|
30
|
+
1. Fork it
|
31
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
32
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
33
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
34
|
+
5. Create new Pull Request
|
data/RailsMug.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/RailsMug/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["David Slone"]
|
6
|
+
gem.email = ["dbslone@gmail.com"]
|
7
|
+
gem.description = %q{Retrieve SmugMug photo list}
|
8
|
+
gem.summary = %q{This gem allows an authenticated user to retrieve the album and photo list from an album}
|
9
|
+
gem.homepage = ""
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = "RailsMug"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = RailsMug::VERSION
|
17
|
+
|
18
|
+
gem.add_development_dependency "rspec", "~> 2.6"
|
19
|
+
gem.add_development_dependency "oauth"
|
20
|
+
end
|
data/Rakefile
ADDED
data/lib/RailsMug.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "RailsMug/version"
|
2
|
+
require "RailsMug/session"
|
3
|
+
require "RailsMug/exceptions"
|
4
|
+
require "RailsMug/albums"
|
5
|
+
require "RailsMug/images"
|
6
|
+
require "RailsMug/record"
|
7
|
+
require "RailsMug/model/album"
|
8
|
+
require "RailsMug/model/image"
|
9
|
+
|
10
|
+
module RailsMug
|
11
|
+
# Your code goes here...
|
12
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
module RailsMug
|
2
|
+
class Albums
|
3
|
+
attr_accessor :albums
|
4
|
+
attr_accessor :images
|
5
|
+
|
6
|
+
# Initialize Albums
|
7
|
+
#
|
8
|
+
# @author David Slone
|
9
|
+
# @params {RailsMug::Session}
|
10
|
+
def initialize railsmug_session
|
11
|
+
raise RailsMug::SessionError, "Invalid Session (session cannot be nil)" if railsmug_session.nil?
|
12
|
+
|
13
|
+
self.albums = []
|
14
|
+
self.images = []
|
15
|
+
@access_token = railsmug_session.accesstoken
|
16
|
+
end
|
17
|
+
|
18
|
+
# Retrieve all albums for the current user
|
19
|
+
#
|
20
|
+
# @author David Slone
|
21
|
+
def get_albums
|
22
|
+
response = @access_token.get('/api/json/1.3.0/?method=smugmug.albums.get')
|
23
|
+
json_response = JSON.parse(response.body)
|
24
|
+
|
25
|
+
raise RailsMug::AlbumError, "SmugMug Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
26
|
+
|
27
|
+
json_response['Albums'].each do |a|
|
28
|
+
sub_category = {}
|
29
|
+
sub_category = { :id => a['SubCategory']['id'], :name => a['SubCategory']['Name'] } unless a['SubCategory'].nil?
|
30
|
+
|
31
|
+
album_info = get_album_info a['id'], a['Key']
|
32
|
+
|
33
|
+
album = RailsMug::Model::Album.new(
|
34
|
+
:access_token => @access_token,
|
35
|
+
:id => a['id'],
|
36
|
+
:title => a['Title'],
|
37
|
+
:key => a['Key'],
|
38
|
+
:category => { :id => a['Category']['id'], :name => a['Category']['Name']},
|
39
|
+
:sub_category => sub_category,
|
40
|
+
:backprinting => album_info['Album']['Backprinting'],
|
41
|
+
:boutique_packaging => album_info['Album']['BoutiquePackaging'],
|
42
|
+
:can_rank => album_info['Album']['CanRank'],
|
43
|
+
:clean => album_info['Album']['Clean'],
|
44
|
+
:color_correction => album_info['Album']['ColorCorrection'],
|
45
|
+
:comments => album_info['Album']['Comments'],
|
46
|
+
:description => album_info['Album']['Description'],
|
47
|
+
:exif => album_info['Album']['EXIF'],
|
48
|
+
:external => album_info['Album']['External'],
|
49
|
+
:family_edit => album_info['Album']['FamilyEdit'],
|
50
|
+
:filenames => album_info['Album']['Filenames'],
|
51
|
+
:friend_edit => album_info['Album']['FriendEdit'],
|
52
|
+
:geography => album_info['Album']['Geography'],
|
53
|
+
:guest_upload_url => album_info['Album']['GuestUploadURL'],
|
54
|
+
:header => album_info['Album']['Header'],
|
55
|
+
:hide_owner => album_info['Album']['HideOwner'],
|
56
|
+
:hightlight => album_info['Album']['Highlight'],
|
57
|
+
:image_count => album_info['Album']['ImageCount'],
|
58
|
+
:keywords => album_info['Album']['Keywords'],
|
59
|
+
:url => album_info['Album']['URL']
|
60
|
+
)
|
61
|
+
|
62
|
+
self.albums << album
|
63
|
+
end
|
64
|
+
|
65
|
+
self.albums
|
66
|
+
end
|
67
|
+
|
68
|
+
# Retrieve the information for an album.
|
69
|
+
#
|
70
|
+
# @author David Slone
|
71
|
+
# @param [Integer] album_id The ID for a specific album.
|
72
|
+
# @param [String] album_key The key for a specific album.
|
73
|
+
# @param [Hash] opts Extra parameters for retrieving album information
|
74
|
+
# @option [String] password The password for an album.
|
75
|
+
# @return [Hash] Returns a JSON parsed hash of the response
|
76
|
+
def get_album_info album_id, album_key, opts = {}
|
77
|
+
response = @access_token.get("/api/json/1.3.0/?method=smugmug.albums.getInfo&AlbumID=#{album_id}&AlbumKey=#{album_key}")
|
78
|
+
json_response = JSON.parse(response.body)
|
79
|
+
|
80
|
+
raise RailsMug::AlbumError, "SmugMug albums.getInfo Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
81
|
+
|
82
|
+
json_response
|
83
|
+
end
|
84
|
+
|
85
|
+
# Retrieve a list of images for an album
|
86
|
+
#
|
87
|
+
# @author David Slone
|
88
|
+
# @param {RailsMug::Model::Album} album The album object to find photos for.
|
89
|
+
def get_album_photos &album
|
90
|
+
response = @access_token.get("/api/json/1.3.0/?method=smugmug.images.get&AlbumID=#{album.id}&AlbumKey=#{album.key}")
|
91
|
+
json_response = JSON.parse(response.body)
|
92
|
+
|
93
|
+
raise RailsMug::AlbumError, "SmugMug images.get Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
94
|
+
|
95
|
+
json_response['Album']['Images'].each do |img|
|
96
|
+
img = RailsMug::Model::Image.new(
|
97
|
+
:id => img['id'],
|
98
|
+
:key => img['Key']
|
99
|
+
)
|
100
|
+
img.get_photo_info @access_token
|
101
|
+
album.add_image img
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module RailsMug
|
2
|
+
API_METHODS = {
|
3
|
+
"accounts" => {"browse" => true},
|
4
|
+
"albums" => {"applyWatermark" => true, "browse" => true, "changeSettings" => true, "comments" => true, "create" => true, "delete" => true, "get" => true, "getInfo" => true, "getStats" => true, "removeWatermark" => true, "reSort" => true},
|
5
|
+
"albumtemplates" => {"changeSettings" => true, "create" => true, "delete" => true, "get" => true}, "auth" => {"checkAccessToken" => true, "getAccessToken" => true, "getRequestToken" => true},
|
6
|
+
"categories" => {"create" => true, "delete" => true, "get" => true, "rename" => true}, "communities" => {"get" => true}, "coupons" => {"create" => true, "get" => true, "getInfo" => true, "modify" => true, "restrictions" => true},
|
7
|
+
"family" => {"add" => true, "get" => true, "remove" => true, "removeAll" => true}, "fans" => {"get" => true}, "featured" => {"albums" => true}, "friends" => {"add" => true, "get" => true, "remove" => true, "removeAll" => true},
|
8
|
+
"images" => {"applyWatermark" => true, "changePosition" => true, "changeSettings" => true, "collect" => true, "comments" => true, "crop" => true, "delete" => true, "get" => true, "getEXIF" => true, "getInfo" => true, "getStats" => true, "getURLs" => true, "removeWatermark" => true, "rotate" => true, "uploadFromURL" => true, "zoomThumbnail" => true},
|
9
|
+
"printmarks" => {"create" => true, "delete" => true, "get" => true, "getInfo" => true, "modify" => true},
|
10
|
+
"service" => {"ping" => true},
|
11
|
+
"sharegroups" => {"albums" => true, "browse" => true, "create" => true, "delete" => true, "get" => true, "getInfo" => true, "modify" => true},
|
12
|
+
"styles" => {"getTemplates" => true},
|
13
|
+
"subcategories" => {"create" => true, "delete" => true, "get" => true, "getAll" => true, "rename" => true},
|
14
|
+
"themes" => {"get" => true},
|
15
|
+
"users" => {"getInfo" => true, "getStats" => true, "getTree" => true},
|
16
|
+
"watermarks" => {"changeSettings" => true, "create" => true, "delete" => true, "get" => true, "getInfo" => true}
|
17
|
+
}
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RailsMug
|
2
|
+
|
3
|
+
# Generic RailsMug error class for all RailsMug errors
|
4
|
+
#
|
5
|
+
# @author David Slone
|
6
|
+
class RailsMugError < StandardError
|
7
|
+
end
|
8
|
+
|
9
|
+
# RailsMug Session Error
|
10
|
+
#
|
11
|
+
# @author David Slone
|
12
|
+
class SessionError < StandardError
|
13
|
+
end
|
14
|
+
|
15
|
+
# RailsMug Album Error
|
16
|
+
#
|
17
|
+
# @author David Slone
|
18
|
+
class AlbumError < StandardError
|
19
|
+
end
|
20
|
+
|
21
|
+
# RailsMug Images Error
|
22
|
+
#
|
23
|
+
# @author David Slone
|
24
|
+
class ImagesError < StandardError
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module RailsMug
|
2
|
+
class Images
|
3
|
+
attr_accessor :images
|
4
|
+
|
5
|
+
# Initialize Images
|
6
|
+
#
|
7
|
+
# @author David Slone
|
8
|
+
def initialize railsmug_session
|
9
|
+
raise RailsMug::SessionError, "Invalid Session (session cannot be nil)" if railsmug_session.nil?
|
10
|
+
|
11
|
+
self.images = []
|
12
|
+
@access_token = railsmug_session.accesstoken
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get all images for an Album
|
16
|
+
#
|
17
|
+
# @author David Slone
|
18
|
+
# @param [Integer] album_id The ID for the album
|
19
|
+
# @param [String] album_key The key for the album
|
20
|
+
def get_images album_id, album_key, opts = {}
|
21
|
+
raise RailsMug::ImagesError, "album_id is required." if album_id.nil?
|
22
|
+
raise RailsMug::ImagesError, "album_key is required." if album_key.nil?
|
23
|
+
|
24
|
+
response = @access_token.get("/api/json/1.3.0/?method=smugmug.images.get&AlbumID=#{album_id}&AlbumKey=#{album_key}")
|
25
|
+
json_response = JSON.parse(response.body)
|
26
|
+
|
27
|
+
raise RailsMug::ImagesError, "SmugMug images.get Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
28
|
+
|
29
|
+
json_response['Album']['Images'].each do |img|
|
30
|
+
img = RailsMug::Model::Image.new(
|
31
|
+
:id => img['id'],
|
32
|
+
:key => img['Key']
|
33
|
+
)
|
34
|
+
img.get_photo_info @access_token unless opts[:no_info]
|
35
|
+
self.images << img
|
36
|
+
end
|
37
|
+
|
38
|
+
self.images
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module RailsMug
|
2
|
+
class Model
|
3
|
+
class Album < RailsMug::Record
|
4
|
+
# The Id for this album
|
5
|
+
attr_reader :id
|
6
|
+
# The key for this album
|
7
|
+
attr_reader :key
|
8
|
+
# The category that this album belongs to
|
9
|
+
attr_reader :category
|
10
|
+
# The sub category that this album belongs to
|
11
|
+
attr_reader :sub_category
|
12
|
+
# The title for this album
|
13
|
+
attr_reader :title
|
14
|
+
# The text to be printed on the back of prints purchased from this album
|
15
|
+
attr_reader :backprinting
|
16
|
+
# Enable boutique packaging for orders from this album
|
17
|
+
attr_reader :boutique_packaging
|
18
|
+
# Allow images from this album to be ranked using PhotoRank
|
19
|
+
attr_reader :can_rank
|
20
|
+
# Hide the Description and LastUpdated for this album on the homepage and category pages
|
21
|
+
attr_reader :clean
|
22
|
+
# The color correction setting for this album (0 - No, 1 - Yes, 2 - Inherit)
|
23
|
+
attr_reader :color_correction
|
24
|
+
# Allow visitors to leave comments on this album
|
25
|
+
attr_reader :comments
|
26
|
+
# The community that this album belongs to.
|
27
|
+
attr_reader :community
|
28
|
+
# The description for this album
|
29
|
+
attr_reader :description
|
30
|
+
# Allow EXIF data to be viewed for images from this album
|
31
|
+
attr_reader :exif
|
32
|
+
# Allow images from this album to be linked externally outside SmugMug
|
33
|
+
attr_reader :external
|
34
|
+
# Allow family to edit the captions and keywords of the images in this album
|
35
|
+
attr_reader :family_edit
|
36
|
+
# Show filename for images uploaded with no caption to this album
|
37
|
+
attr_reader :filenames
|
38
|
+
# Allow friends to edit the captions and keywords of the images in this album
|
39
|
+
attr_reader :friend_edit
|
40
|
+
# Enable mapping features for this album
|
41
|
+
attr_reader :geography
|
42
|
+
# The URL to allow guests to upload to this gallery
|
43
|
+
attr_reader :guest_upload_url
|
44
|
+
# Default this album to the standard SmugMug appearance. (false - Custom, true - SmugMug)
|
45
|
+
attr_reader :header
|
46
|
+
# Hide the owner of this album.
|
47
|
+
attr_reader :hide_owner
|
48
|
+
# The highlight image for this album {id, Key, Type}
|
49
|
+
attr_reader :highlight
|
50
|
+
# The number of images in this album
|
51
|
+
attr_reader :image_count
|
52
|
+
# The meta keyword string for this album
|
53
|
+
attr_reader :keywords
|
54
|
+
# The URL for this album
|
55
|
+
attr_reader :url
|
56
|
+
|
57
|
+
attr_accessor :images
|
58
|
+
attr_accessor :access_token
|
59
|
+
|
60
|
+
# Display Album in JSON format
|
61
|
+
#
|
62
|
+
# @author David Slone
|
63
|
+
def to_json
|
64
|
+
ret = {
|
65
|
+
:id => self.id,
|
66
|
+
:key => self.key,
|
67
|
+
:category => self.category,
|
68
|
+
:sub_category => self.sub_category,
|
69
|
+
:title => self.title,
|
70
|
+
:images => self.images
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
# Retrieve a list of images for an album
|
75
|
+
#
|
76
|
+
# @author David Slone
|
77
|
+
# @param {RailsMug::Model::Album} album The album object to find photos for.
|
78
|
+
def get_photos
|
79
|
+
response = self.access_token.get("/api/json/1.3.0/?method=smugmug.images.get&AlbumID=#{self.id}&AlbumKey=#{self.key}")
|
80
|
+
json_response = JSON.parse(response.body)
|
81
|
+
|
82
|
+
raise RailsMug::AlbumError, "SmugMug images.get Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
83
|
+
|
84
|
+
json_response['Album']['Images'].each do |img|
|
85
|
+
img = RailsMug::Model::Image.new(
|
86
|
+
:id => img['id'],
|
87
|
+
:key => img['Key']
|
88
|
+
)
|
89
|
+
img.get_photo_info @access_token
|
90
|
+
self.add_image img
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Add image to album
|
95
|
+
#
|
96
|
+
# @author David Slone
|
97
|
+
def add_image image
|
98
|
+
self.images = [] if self.images.nil?
|
99
|
+
self.images << image
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,183 @@
|
|
1
|
+
module RailsMug
|
2
|
+
class Model
|
3
|
+
class Image < RailsMug::Record
|
4
|
+
# The Id for this image
|
5
|
+
attr_reader :id
|
6
|
+
# They key for this image
|
7
|
+
attr_reader :key
|
8
|
+
# The altitude at which this image (or video) was taken.
|
9
|
+
attr_accessor :altitude
|
10
|
+
# The caption for this image
|
11
|
+
attr_accessor :caption
|
12
|
+
# The date for this video
|
13
|
+
attr_accessor :date
|
14
|
+
# The filename for this image
|
15
|
+
attr_accessor :filename
|
16
|
+
# The original format of this image
|
17
|
+
attr_accessor :format
|
18
|
+
# The height of the crop
|
19
|
+
attr_accessor :height
|
20
|
+
# The visibility of this image
|
21
|
+
attr_accessor :hidden
|
22
|
+
# The keyword string for this image
|
23
|
+
attr_accessor :keywords
|
24
|
+
# The url for the Large version of this image
|
25
|
+
attr_accessor :large_url
|
26
|
+
# The date that this image was last updated
|
27
|
+
attr_accessor :last_updated
|
28
|
+
# The latitude at which this image was taken
|
29
|
+
attr_accessor :latitude
|
30
|
+
# The lightbox url for this image
|
31
|
+
attr_accessor :lightbox_url
|
32
|
+
# Longitude at which the image was taken
|
33
|
+
attr_accessor :longitude
|
34
|
+
# The MD5 sum for this image
|
35
|
+
attr_accessor :md5_sum
|
36
|
+
# The url for the Medium version of this image
|
37
|
+
attr_accessor :medium_url
|
38
|
+
# The url for the Original version of this image
|
39
|
+
attr_accessor :original_url
|
40
|
+
# The position of this image within the album
|
41
|
+
attr_accessor :position
|
42
|
+
# The current revision of this image
|
43
|
+
attr_accessor :serial
|
44
|
+
# The size of this image in bytes
|
45
|
+
attr_accessor :size
|
46
|
+
# The url for the Small version of this image
|
47
|
+
attr_accessor :small_url
|
48
|
+
# The status for this image
|
49
|
+
attr_accessor :status
|
50
|
+
# The url for the Thumb version of this image
|
51
|
+
attr_accessor :thumb_url
|
52
|
+
# The url for the Tiny version of this image
|
53
|
+
attr_accessor :tiny_url
|
54
|
+
# The width of the crop
|
55
|
+
attr_accessor :width
|
56
|
+
# The url for the X2Large version of this image
|
57
|
+
attr_accessor :x2large_url
|
58
|
+
# The url for the X3Large version of this image
|
59
|
+
attr_accessor :x3large_url
|
60
|
+
# The url for the XLarge version of this image
|
61
|
+
attr_accessor :xlarge_url
|
62
|
+
# EXIF Data for this image
|
63
|
+
attr_accessor :exif
|
64
|
+
|
65
|
+
# Retrieve information for an image
|
66
|
+
#
|
67
|
+
# @author David Slone
|
68
|
+
def get_photo_info access_token
|
69
|
+
response = access_token.get("/api/json/1.3.0/?method=smugmug.images.getInfo&ImageID=#{self.id}&ImageKey=#{self.key}")
|
70
|
+
json_response = JSON.parse(response.body)
|
71
|
+
|
72
|
+
raise RailsMug::ImagesError, "SmugMug images.getInfo Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
73
|
+
|
74
|
+
self.altitude = json_response['Image']['Altitude']
|
75
|
+
self.caption = json_response['Image']['Caption']
|
76
|
+
self.date = json_response['Image']['Date']
|
77
|
+
self.filename = json_response['Image']['FileName']
|
78
|
+
self.format = json_response['Image']['Format']
|
79
|
+
self.height = json_response['Image']['Height']
|
80
|
+
self.hidden = json_response['Image']['Hidden']
|
81
|
+
self.keywords = json_response['Image']['Keywords']
|
82
|
+
self.large_url = json_response['Image']['LargeURL']
|
83
|
+
self.last_updated = json_response['Image']['LastUpdated']
|
84
|
+
self.latitude = json_response['Image']['Latitude']
|
85
|
+
self.md5_sum = json_response['Image']['MD5Sum']
|
86
|
+
self.medium_url = json_response['Image']['MediumURL']
|
87
|
+
self.original_url = json_response['Image']['OriginalURL']
|
88
|
+
self.position = json_response['Image']['Position']
|
89
|
+
self.serial = json_response['Image']['Serial']
|
90
|
+
self.size = json_response['Image']['Size']
|
91
|
+
self.small_url = json_response['Image']['SmallURL']
|
92
|
+
self.status = json_response['Image']['Status']
|
93
|
+
self.thumb_url = json_response['Image']['ThumbURL']
|
94
|
+
self.tiny_url = json_response['Image']['TinyURL']
|
95
|
+
self.width = json_response['Image']['Width']
|
96
|
+
self.x2large_url = json_response['Image']['X2LargeURL']
|
97
|
+
self.x3large_url = json_response['Image']['X3LargeURL']
|
98
|
+
self.xlarge_url = json_response['Image']['XLargeURL']
|
99
|
+
|
100
|
+
self.get_exif_data access_token
|
101
|
+
end
|
102
|
+
|
103
|
+
# Retrieve Photo EXIF data
|
104
|
+
#
|
105
|
+
# @author David Slone
|
106
|
+
# @param [Object] access_token
|
107
|
+
def get_exif_data access_token
|
108
|
+
response = access_token.get("/api/json/1.3.0/?method=smugmug.images.getEXIF&ImageID=#{self.id}&ImageKey=#{self.key}")
|
109
|
+
json_response = JSON.parse(response.body)
|
110
|
+
|
111
|
+
raise RailsMug::ImagesError, "SmugMug images.getEXIF Error: #{json_response['code']} - #{json_response['message']}" if json_response['stat'] == "fail"
|
112
|
+
|
113
|
+
exif = {}
|
114
|
+
exif[:id] = json_response['Image']['id']
|
115
|
+
exif[:key] = json_response['Image']['Key']
|
116
|
+
exif[:aperture] = json_response['Image']['Aperture']
|
117
|
+
exif[:brightness] = json_response['Image']['Brightness']
|
118
|
+
exif[:ccd_width] = json_response['Image']['CCDWidth']
|
119
|
+
exif[:color_space] = json_response['Image']['ColorSpace']
|
120
|
+
exif[:compressed_bits_per_pixel] = json_response['Image']['CompressedBitsPerPixel']
|
121
|
+
exif[:contrast] = json_response['Image']['Contrast']
|
122
|
+
exif[:date_time] = json_response['Image']['DateTime']
|
123
|
+
exif[:date_time_digitized] = json_response['Image']['DateTimeDigitized']
|
124
|
+
exif[:date_time_original] = json_response['Image']['DateTimeOriginal']
|
125
|
+
exif[:digital_zoom_ratio] = json_response['Image']['DigitalZoomRatio']
|
126
|
+
exif[:exposure_bias_value] = json_response['Image']['ExposureBiasValue']
|
127
|
+
exif[:exposure_mode] = json_response['Image']['ExposureMode']
|
128
|
+
exif[:exposure_program] = json_response['Image']['ExposureProgram']
|
129
|
+
exif[:exposure_time] = json_response['Image']['ExposureTime']
|
130
|
+
exif[:flash] = json_response['Image']['Flash']
|
131
|
+
exif[:focal_length] = json_response['Image']['FocalLength']
|
132
|
+
exif[:iso] = json_response['Image']['ISO']
|
133
|
+
exif[:light_source] = json_response['Image']['LightSource']
|
134
|
+
exif[:make] = json_response['Image']['Make']
|
135
|
+
exif[:metering] = json_response['Image']['Metering']
|
136
|
+
exif[:model] = json_response['Image']['Model']
|
137
|
+
exif[:saturation] = json_response['Image']['Saturation']
|
138
|
+
exif[:sensing_method] = json_response['Image']['SensingMethod']
|
139
|
+
exif[:sharpness] = json_response['Image']['Sharpness']
|
140
|
+
exif[:subject_distance] = json_response['Image']['SubjectDistance']
|
141
|
+
exif[:subject_distance_range] = json_response['Image']['SubjectDistanceRange']
|
142
|
+
exif[:white_balance] = json_response['Image']['WhiteBalance']
|
143
|
+
|
144
|
+
self.exif = exif
|
145
|
+
end
|
146
|
+
|
147
|
+
# Convert class to JSON object
|
148
|
+
#
|
149
|
+
# @author David Slone
|
150
|
+
def to_json
|
151
|
+
ret = {}
|
152
|
+
ret[:altitude] = self.altitude
|
153
|
+
ret[:caption] = self.caption
|
154
|
+
ret[:date] = self.date
|
155
|
+
ret[:filename] = self.filename
|
156
|
+
ret[:format] = self.format
|
157
|
+
ret[:height] = self.height
|
158
|
+
ret[:hidden] = self.hidden
|
159
|
+
ret[:keywords] = self.keywords
|
160
|
+
ret[:large_url] = self.large_url
|
161
|
+
ret[:last_updated] = self.last_updated
|
162
|
+
ret[:latitude] = self.latitude
|
163
|
+
ret[:md5_sum] = self.md5_sum
|
164
|
+
ret[:medium_url] = self.medium_url
|
165
|
+
ret[:original_url] = self.original_url
|
166
|
+
ret[:position] = self.position
|
167
|
+
ret[:serial] = self.serial
|
168
|
+
ret[:size] = self.size
|
169
|
+
ret[:small_url] = self.small_url
|
170
|
+
ret[:status] = self.status
|
171
|
+
ret[:thumb_url] = self.thumb_url
|
172
|
+
ret[:tiny_url] = self.tiny_url
|
173
|
+
ret[:width] = self.width
|
174
|
+
ret[:x2large_url] = self.x2large_url
|
175
|
+
ret[:x3large_url] = self.x3large_url
|
176
|
+
ret[:xlarge_url] = self.xlarge_url
|
177
|
+
ret[:exif] = self.exif
|
178
|
+
|
179
|
+
ret
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'oauth'
|
2
|
+
|
3
|
+
module RailsMug
|
4
|
+
|
5
|
+
# Class to establish a RailsMug session. Use it like this:
|
6
|
+
#
|
7
|
+
# client = RailsMug::Client.new("API KEY", "API SECRET")
|
8
|
+
# @author David Slone
|
9
|
+
class Session
|
10
|
+
attr :session
|
11
|
+
attr :accesstoken
|
12
|
+
|
13
|
+
# Initialize the session
|
14
|
+
#
|
15
|
+
# @author David Slone
|
16
|
+
def initialize(api_key, api_secret, access_token, access_token_secret)
|
17
|
+
raise RailsMug::RailsMugError, "Missing parameter(api_key)" if api_key.nil? || api_key.length == 0
|
18
|
+
raise RailsMug::RailsMugError, "Missing parameter(api_secret)" if api_secret.nil? || api_secret.length == 0
|
19
|
+
raise RailsMug::RailsMugError, "Missing parameter(access_token)" if access_token.nil? || access_token.length == 0
|
20
|
+
raise RailsMug::RailsMugError, "Missing parameter(access_token_secret)" if access_token_secret.nil? || access_token_secret.length == 0
|
21
|
+
|
22
|
+
@consumer = OAuth::Consumer.new(api_key, api_secret, :site => "https://api.smugmug.com/services",
|
23
|
+
:request_token_path => "/oauth/getRequestToken.mg", :authorize_path => "/oauth/authorize.mg",
|
24
|
+
:access_token_path => "/oauth/getAccessToken.mg")
|
25
|
+
@accesstoken = OAuth::AccessToken.new(@consumer, access_token, access_token_secret)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Determine if session is valid
|
29
|
+
#
|
30
|
+
# @author David Slone
|
31
|
+
# @return [Boolean] Returns if the session is valid or not
|
32
|
+
def valid_session?
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Method Missing
|
37
|
+
#
|
38
|
+
# @author David Slone
|
39
|
+
def method_missing(method_name, *args)
|
40
|
+
puts args
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RailsMug do
|
4
|
+
session = RailsMug::Session.new('<API KEY>','<API SECRET>','<ACCESS TOKEN>','<ACCESS TOKEN SECRET>')
|
5
|
+
|
6
|
+
it "should create oauth session" do
|
7
|
+
session.should_not be_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should retrieve album list" do
|
11
|
+
rails_mug = RailsMug::Albums.new(session)
|
12
|
+
albums = rails_mug.get_albums
|
13
|
+
albums.should_not be_nil
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should get photos for an album" do
|
17
|
+
rails_mug = RailsMug::Albums.new(session)
|
18
|
+
albums = rails_mug.get_albums
|
19
|
+
|
20
|
+
albums.each do |album|
|
21
|
+
album.get_photos
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/spec/images_spec.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RailsMug do
|
4
|
+
session = RailsMug::Session.new('<API KEY>','<API SECRET>','<ACCESS TOKEN>','<ACCESS TOKEN SECRET>')
|
5
|
+
|
6
|
+
it "should get photos without detailed info" do
|
7
|
+
rails_mug = RailsMug::Images.new(session)
|
8
|
+
images = rails_mug.get_images 28536068, '4b4dGb', :no_info => true
|
9
|
+
images.should_not be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should get photos with detailed info" do
|
13
|
+
rails_mug = RailsMug::Images.new(session)
|
14
|
+
rails_mug.get_images 28536068, '4b4dGb'
|
15
|
+
rails_mug.images.should_not be_nil
|
16
|
+
end
|
17
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: RailsMug
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Slone
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.6'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '2.6'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: oauth
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: Retrieve SmugMug photo list
|
47
|
+
email:
|
48
|
+
- dbslone@gmail.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- .gitignore
|
54
|
+
- Gemfile
|
55
|
+
- LICENSE
|
56
|
+
- README.md
|
57
|
+
- RailsMug.gemspec
|
58
|
+
- Rakefile
|
59
|
+
- lib/RailsMug.rb
|
60
|
+
- lib/RailsMug/albums.rb
|
61
|
+
- lib/RailsMug/api_methods.rb
|
62
|
+
- lib/RailsMug/exceptions.rb
|
63
|
+
- lib/RailsMug/images.rb
|
64
|
+
- lib/RailsMug/model/album.rb
|
65
|
+
- lib/RailsMug/model/image.rb
|
66
|
+
- lib/RailsMug/record.rb
|
67
|
+
- lib/RailsMug/session.rb
|
68
|
+
- lib/RailsMug/version.rb
|
69
|
+
- spec/RailsMug_helper.rb
|
70
|
+
- spec/RailsMug_spec.rb
|
71
|
+
- spec/images_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
73
|
+
homepage: ''
|
74
|
+
licenses: []
|
75
|
+
post_install_message:
|
76
|
+
rdoc_options: []
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ! '>='
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ! '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
requirements: []
|
92
|
+
rubyforge_project:
|
93
|
+
rubygems_version: 1.8.24
|
94
|
+
signing_key:
|
95
|
+
specification_version: 3
|
96
|
+
summary: This gem allows an authenticated user to retrieve the album and photo list
|
97
|
+
from an album
|
98
|
+
test_files:
|
99
|
+
- spec/RailsMug_helper.rb
|
100
|
+
- spec/RailsMug_spec.rb
|
101
|
+
- spec/images_spec.rb
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
has_rdoc:
|