smugmugr 0.3.0
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/.document +5 -0
- data/.gitignore +5 -0
- data/LICENSE +20 -0
- data/README.textile +60 -0
- data/Rakefile +43 -0
- data/VERSION +1 -0
- data/lib/smugmugr/album.rb +134 -0
- data/lib/smugmugr/base.rb +25 -0
- data/lib/smugmugr/category.rb +5 -0
- data/lib/smugmugr/community.rb +5 -0
- data/lib/smugmugr/family.rb +5 -0
- data/lib/smugmugr/friend.rb +5 -0
- data/lib/smugmugr/image.rb +89 -0
- data/lib/smugmugr/session.rb +126 -0
- data/lib/smugmugr/share_group.rb +5 -0
- data/lib/smugmugr/sub_category.rb +5 -0
- data/lib/smugmugr/theme.rb +5 -0
- data/lib/smugmugr/user.rb +34 -0
- data/lib/smugmugr/watermark.rb +5 -0
- data/lib/smugmugr.rb +32 -0
- data/smugmugr.gemspec +88 -0
- data/spec/album_spec.rb +51 -0
- data/spec/category_spec.rb +2 -0
- data/spec/community_spec.rb +2 -0
- data/spec/family_spec.rb +2 -0
- data/spec/friend_spec.rb +0 -0
- data/spec/image_spec.rb +26 -0
- data/spec/response_stubs.rb +567 -0
- data/spec/session_spec.rb +17 -0
- data/spec/sub_category_spec.rb +2 -0
- data/spec/test_helper.rb +10 -0
- data/spec/theme_spec.rb +2 -0
- data/spec/user_spec.rb +5 -0
- data/spec/watermark_spec.rb +2 -0
- metadata +118 -0
data/.document
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Rob Sterner
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
h1. smugmugr
|
2
|
+
|
3
|
+
A (he's the DJ, I'm the) wrapper for v1.2.2 of the SmugMug "JSON API":http://wiki.smugmug.net/display/API/API+1.2.2.
|
4
|
+
|
5
|
+
Originally inspired by Scott White's simple_smugmug Rails plugin:
|
6
|
+
http://github.com/scottwhite/simple_smugmug/tree/master
|
7
|
+
|
8
|
+
Current version: 0.2.0
|
9
|
+
|
10
|
+
h2. Roadmap
|
11
|
+
|
12
|
+
h3. v1.0
|
13
|
+
|
14
|
+
* read-only (with and without login (password-based and OAuth)) bits
|
15
|
+
|
16
|
+
h3. v2.0
|
17
|
+
|
18
|
+
* read-write
|
19
|
+
|
20
|
+
h2. Usage
|
21
|
+
|
22
|
+
The current highly opinionated way to use this gem is:
|
23
|
+
|
24
|
+
user = Smugmugr::User.new(api_key, :email => 'foo@example.com', :password => 'secret')
|
25
|
+
albums = user.albums
|
26
|
+
images = albums.first.images
|
27
|
+
|
28
|
+
As of v1.2.2 of the API, Smugmug allows the passing of an Extras parameter to allow customization of a call to your liking:
|
29
|
+
|
30
|
+
"http://www.dgrin.com/showthread.php?t=90636":http://www.dgrin.com/showthread.php?t=90636
|
31
|
+
|
32
|
+
Taking advantage of this is a cinch with smugmugr:
|
33
|
+
|
34
|
+
albums = user.albums(:SmugSearchable,:LastUpdated,:ImageCount)
|
35
|
+
|
36
|
+
will yield:
|
37
|
+
|
38
|
+
albums.first.extras => {:ImageCount=>29, :LastUpdated=>"2009-05-16 15:23:11", :SmugSearchable=>true}
|
39
|
+
|
40
|
+
Also:
|
41
|
+
|
42
|
+
albums.first.last_updated => "2009-05-16 15:23:11"
|
43
|
+
albums.first.LastUpdated => "2009-05-16 15:23:11"
|
44
|
+
|
45
|
+
albums.first.image_count => 29
|
46
|
+
albums.first.ImageCount => 29
|
47
|
+
|
48
|
+
h3. TODO
|
49
|
+
* TESTS: added rspec requires and shell spec classes.
|
50
|
+
* TBD
|
51
|
+
|
52
|
+
h3. Author(s)
|
53
|
+
|
54
|
+
Written by "Rob Sterner":http://github.com/fermion = "robsterner.com":http://robsterner.com
|
55
|
+
|
56
|
+
h3. Copyright
|
57
|
+
|
58
|
+
Released under the MIT license.
|
59
|
+
|
60
|
+
Copyright (c) 2009 Rob Sterner. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'spec/rake/spectask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
|
6
|
+
begin
|
7
|
+
require 'jeweler'
|
8
|
+
Jeweler::Tasks.new do |gem|
|
9
|
+
gem.name = "smugmugr"
|
10
|
+
gem.summary = %Q{smugmugr, the smugmug API wrapper}
|
11
|
+
gem.email = "rob.sterner@gmail.com"
|
12
|
+
gem.homepage = "http://github.com/fermion/smugmugr"
|
13
|
+
gem.authors = ["Rob Sterner"]
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
desc 'Default: run unit specs.'
|
22
|
+
task :default => :spec
|
23
|
+
|
24
|
+
desc 'Test the smugmugr gem.'
|
25
|
+
Spec::Rake::SpecTask.new('spec') do |t|
|
26
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
27
|
+
t.spec_opts = ["-c"]
|
28
|
+
end
|
29
|
+
|
30
|
+
Rake::RDocTask.new do |rdoc|
|
31
|
+
if File.exist?('VERSION.yml')
|
32
|
+
config = YAML.load(File.read('VERSION.yml'))
|
33
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
34
|
+
else
|
35
|
+
version = ""
|
36
|
+
end
|
37
|
+
|
38
|
+
rdoc.rdoc_dir = 'rdoc'
|
39
|
+
rdoc.title = "smugmugr #{version}"
|
40
|
+
rdoc.rdoc_files.include('README*')
|
41
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
42
|
+
end
|
43
|
+
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.2.0
|
@@ -0,0 +1,134 @@
|
|
1
|
+
module Smugmugr
|
2
|
+
class Album < Smugmugr::Base
|
3
|
+
attr_accessor :user, :id, :title, :key, :pub_key, :session_id
|
4
|
+
|
5
|
+
#############################################
|
6
|
+
# all attributes available on an Album
|
7
|
+
#############################################
|
8
|
+
class_inheritable_reader :attributes
|
9
|
+
write_inheritable_attribute :attributes, [:id,:Key,:Backprinting,:CanRank,:Category,:Clean,:ColorCorrection,:Comments,:Community,
|
10
|
+
:Description,:EXIF,:External,:FamilyEdit,:Filenames,:FriendEdit,:Geography,:Header,:HideOwner,:Highlight,:ImageCount,:Larges,:LastUpdated,
|
11
|
+
:Originals,:Password,:PasswordHint,:Position,:Printable,:ProofDays,:Protected,:Public,:Share,:SmugSearchable,:SortDirection,
|
12
|
+
:SortMethod,:SquareThumbs,:SubCategory,:Template,:Theme,:Title,:UnsharpAmount,:UnsharpRadius,:UnsharpSigma,:UnsharpThreshold,
|
13
|
+
:Watermark,:Watermarking,:WorldSearchable,:X2Larges,:X3Larges,:XLarges]
|
14
|
+
|
15
|
+
class_inheritable_reader :complex_attributes
|
16
|
+
write_inheritable_attribute :complex_attributes, [:Album, :Category, :Community, :Highlight, :SubCategory, :Template, :Theme, :Watermark]
|
17
|
+
|
18
|
+
def initialize(user)
|
19
|
+
@extras = {}
|
20
|
+
@user = user
|
21
|
+
end
|
22
|
+
|
23
|
+
#############################################
|
24
|
+
# class
|
25
|
+
#############################################
|
26
|
+
class << self
|
27
|
+
def get(user, args={})
|
28
|
+
args[:heavy] ||= false
|
29
|
+
args[:extras] ||= []
|
30
|
+
params = {
|
31
|
+
:method => smug_method + '.get'
|
32
|
+
}
|
33
|
+
params.merge!(:Heavy => args[:heavy].to_s) if args[:heavy]
|
34
|
+
params.merge!(:Extras => args[:extras].collect(&:to_s).join(','))
|
35
|
+
|
36
|
+
json = user.call(params)
|
37
|
+
return albums_from_json(json, user, args[:extras])
|
38
|
+
end
|
39
|
+
|
40
|
+
def albums_from_json(json, user, extra_params=[])
|
41
|
+
json["Albums"].map do |album|
|
42
|
+
album_from_json(Smugmugr::Album.new(user), album, user, extra_params)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def album_from_json(album, json, user, extras=[])
|
47
|
+
album.id = json['id']
|
48
|
+
album.title = json['Title']
|
49
|
+
album.key = json['Key']
|
50
|
+
album.extras = {}
|
51
|
+
self.attributes.each{ |key|
|
52
|
+
next unless json.has_key?(key.to_s)
|
53
|
+
|
54
|
+
album.extras[key] = if self.complex_attributes.include?(key)
|
55
|
+
Object.class_eval("Smugmugr::Album::#{key}").new(json[key.to_s])
|
56
|
+
else
|
57
|
+
json[key.to_s]
|
58
|
+
end
|
59
|
+
}
|
60
|
+
album
|
61
|
+
end
|
62
|
+
|
63
|
+
def smug_method
|
64
|
+
"smugmug.albums"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#############################################
|
69
|
+
# instance
|
70
|
+
#############################################
|
71
|
+
def images(*extras)
|
72
|
+
extras = [extras] unless extras.is_a?(Array)
|
73
|
+
Smugmugr::Image.get(self, :extras => extras)
|
74
|
+
end
|
75
|
+
|
76
|
+
def get_info
|
77
|
+
params = {
|
78
|
+
:method => Smugmugr::Album.smug_method + '.getInfo',
|
79
|
+
:AlbumID => self.id,
|
80
|
+
:AlbumKey => self.key
|
81
|
+
}
|
82
|
+
json = call(params)
|
83
|
+
return Smugmugr::Album.album_from_json(self, json["Album"], user, Smugmugr::Album.attributes)
|
84
|
+
end
|
85
|
+
|
86
|
+
def call(params)
|
87
|
+
@user.call(params)
|
88
|
+
end
|
89
|
+
|
90
|
+
class Simple
|
91
|
+
attr_accessor :id, :name
|
92
|
+
def initialize(json)
|
93
|
+
self.id = json["id"]
|
94
|
+
self.name = json["Name"]
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Category < Simple
|
99
|
+
end
|
100
|
+
|
101
|
+
class Community < Simple
|
102
|
+
end
|
103
|
+
|
104
|
+
class Highlight
|
105
|
+
attr_accessor :id, :key
|
106
|
+
def initialize(json)
|
107
|
+
self.id = json["id"]
|
108
|
+
self.key = json["Key"]
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
class SubCategory < Simple
|
113
|
+
end
|
114
|
+
|
115
|
+
class Template
|
116
|
+
attr_accessor :id
|
117
|
+
def initialize(json)
|
118
|
+
self.id = json["id"]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
class Theme
|
123
|
+
attr_accessor :id, :name, :type
|
124
|
+
def initialize(json)
|
125
|
+
self.id = json["id"]
|
126
|
+
self.name = json["Name"]
|
127
|
+
self.type = json["Type"]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
class Watermark < Simple
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Smugmugr
|
2
|
+
class Base
|
3
|
+
class_inheritable_reader :attributes
|
4
|
+
write_inheritable_attribute :attributes, []
|
5
|
+
|
6
|
+
class_inheritable_reader :complex_attributes
|
7
|
+
write_inheritable_attribute :complex_attributes, []
|
8
|
+
|
9
|
+
attr_accessor :extras
|
10
|
+
|
11
|
+
def method_missing(method)
|
12
|
+
# check extras for method_name, MethodName
|
13
|
+
methods = [method.to_s.classify, method.to_s, method.to_s.downcase, method.to_s.upcase]
|
14
|
+
methods.each do |extras_attribute|
|
15
|
+
return self.extras[extras_attribute.to_sym] if self.extras.has_key?(extras_attribute.to_sym)
|
16
|
+
end
|
17
|
+
|
18
|
+
# if it in @@attributes but not populated, return nil
|
19
|
+
return nil unless (methods.collect(&:to_sym) & self.class.attributes).empty?
|
20
|
+
|
21
|
+
# otherwise, move along
|
22
|
+
super(method)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module Smugmugr
|
2
|
+
class Image < Smugmugr::Base
|
3
|
+
attr_accessor :album, :id, :key
|
4
|
+
|
5
|
+
class_inheritable_reader :attributes
|
6
|
+
write_inheritable_attribute :attributes, [:id,:Key,:Album,:Altitude,:Caption,:Date,:Duration,:FileName,:Format,:Height,:Hidden,
|
7
|
+
:Keywords,:LargeURL,:LastUpdated,:Latitude,:Longitude,:MD5Sum,:MediumURL,:OriginalURL,:Position,:Serial,
|
8
|
+
:Size,:SmallURL,:ThumbURL,:TinyURL,:Video320URL,:Video640URL,:Video960URL,:Video1280URL,:Video1920URL,:Width,
|
9
|
+
:X2LargeURL,:X3LargeURL,:XLargeURL]
|
10
|
+
|
11
|
+
class_inheritable_reader :complex_attributes
|
12
|
+
write_inheritable_attribute :complex_attributes, [:Album]
|
13
|
+
|
14
|
+
def initialize(album)
|
15
|
+
@extras = {}
|
16
|
+
@album = album
|
17
|
+
end
|
18
|
+
|
19
|
+
def get(*extras)
|
20
|
+
extras = [extras] unless extras.is_a?(Array)
|
21
|
+
Smugmugr::Image.get(self.album, :extras => extras)
|
22
|
+
end
|
23
|
+
|
24
|
+
class << self
|
25
|
+
def get(album, args={})
|
26
|
+
args[:heavy] ||= false
|
27
|
+
args[:extras] ||= []
|
28
|
+
params = {
|
29
|
+
:method => smug_method + 'get',
|
30
|
+
:AlbumID => album.id,
|
31
|
+
:AlbumKey => album.key
|
32
|
+
}
|
33
|
+
params.merge!(:Heavy => args[:heavy]) if args[:heavy]
|
34
|
+
params.merge!(:Extras => args[:extras].collect(&:to_s).join(',')) if args[:extras].any?
|
35
|
+
|
36
|
+
json = album.call(params)
|
37
|
+
images_from_json(json, album, params[:Extras])
|
38
|
+
end
|
39
|
+
|
40
|
+
def smug_method
|
41
|
+
return "smugmug.images."
|
42
|
+
end
|
43
|
+
|
44
|
+
def images_from_json(json, album, extra_params=[])
|
45
|
+
json['Album']['Images'].map{ |image_json|
|
46
|
+
image_from_json(Smugmugr::Image.new(album), image_json, extra_params)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def image_from_json(image, json, extras=[])
|
51
|
+
image.id = json['id']
|
52
|
+
image.key = json['Key']
|
53
|
+
image.extras = {}
|
54
|
+
self.attributes.each{ |key|
|
55
|
+
next unless json.has_key?(key.to_s)
|
56
|
+
|
57
|
+
image.extras[key] = if self.complex_attributes.include?(key)
|
58
|
+
Object.class_eval("Smugmugr::Image::#{key}").new(json[key.to_s])
|
59
|
+
else
|
60
|
+
json[key.to_s]
|
61
|
+
end
|
62
|
+
}
|
63
|
+
image
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
#############################################
|
68
|
+
# instance
|
69
|
+
#############################################
|
70
|
+
def get_info
|
71
|
+
params = {
|
72
|
+
:method => Smugmugr::Image.smug_method + '.getInfo',
|
73
|
+
:ImageID => self.id,
|
74
|
+
:ImageKey => self.key
|
75
|
+
}
|
76
|
+
json = @album.call(params)
|
77
|
+
return Smugmugr::Image.image_from_json(self, json["Image"], Smugmugr::Image.attributes)
|
78
|
+
end
|
79
|
+
|
80
|
+
class Album
|
81
|
+
attr_accessor :id, :key, :url
|
82
|
+
def initialize(json)
|
83
|
+
self.id = json["id"]
|
84
|
+
self.key = json["Key"]
|
85
|
+
self.url = json["URL"]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require 'curl'
|
2
|
+
require 'json'
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module Smugmugr
|
6
|
+
class Session
|
7
|
+
attr_accessor :params, :host, :port, :timeout, :retry, :use_ssl, :session_id
|
8
|
+
attr_accessor :api_path, :session, :api_key, :user, :attributes, :headers
|
9
|
+
|
10
|
+
def initialize(user, args={})
|
11
|
+
@user = user
|
12
|
+
@api_key = user.api_key
|
13
|
+
# TODO: externalize, make overrideable from ~/smugmugr.yml or RAILS_ROOT/config/smugmugr.yml
|
14
|
+
attributes = {
|
15
|
+
:host => 'api.smugmug.com',
|
16
|
+
:port => 443,
|
17
|
+
:timeout => 10,
|
18
|
+
:retry => 1, # no retry for now
|
19
|
+
:use_ssl => true,
|
20
|
+
:api_path => '/services/api/json/1.2.2/',
|
21
|
+
:headers => {
|
22
|
+
"User-Agent" => 'smugmugr v0.0.1'
|
23
|
+
}
|
24
|
+
}
|
25
|
+
attributes.merge!(args)
|
26
|
+
attributes.each{|k,v|
|
27
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def establish_session
|
32
|
+
if user.email && user.password
|
33
|
+
establish_session_with_login
|
34
|
+
else
|
35
|
+
establish_anonymous_session
|
36
|
+
end
|
37
|
+
return self
|
38
|
+
end
|
39
|
+
|
40
|
+
def establish_anonymous_session
|
41
|
+
establish_new_session({:method => 'smugmug.login.anonymously'})
|
42
|
+
end
|
43
|
+
|
44
|
+
def establish_session_with_login
|
45
|
+
establish_new_session({:method => 'smugmug.login.withPassword',
|
46
|
+
:EmailAddress => "#{user.email}",
|
47
|
+
:Password => "#{user.password}"})
|
48
|
+
end
|
49
|
+
|
50
|
+
def establish_session_with_open_auth
|
51
|
+
raise "unimplemented"
|
52
|
+
end
|
53
|
+
|
54
|
+
def get_session_id
|
55
|
+
@session ||= establish_session
|
56
|
+
return @session.session_id
|
57
|
+
end
|
58
|
+
|
59
|
+
def call(params={}, with_session_id=true)
|
60
|
+
params.merge!(:SessionID => "#{get_session_id}") if with_session_id
|
61
|
+
data = nil
|
62
|
+
begin
|
63
|
+
url = protocol + @host + build_url_request(params)
|
64
|
+
# puts "\nsending: #{url}\n"
|
65
|
+
response = Curl::Easy.perform(url) do |easy|
|
66
|
+
easy.headers.merge!(headers)
|
67
|
+
easy.timeout = @timeout
|
68
|
+
end
|
69
|
+
|
70
|
+
data = response.body_str unless response.nil?
|
71
|
+
rescue Timeout::Error => e
|
72
|
+
# TODO: custom exception
|
73
|
+
raise e
|
74
|
+
end
|
75
|
+
# check status of response
|
76
|
+
json = JSON.parse(data)
|
77
|
+
|
78
|
+
unless json['stat'] == 'ok'
|
79
|
+
# TODO: custom exception
|
80
|
+
raise "error from smugmug: #{json.inspect}"
|
81
|
+
end
|
82
|
+
|
83
|
+
return json
|
84
|
+
end
|
85
|
+
|
86
|
+
def establish_new_session(params)
|
87
|
+
begin
|
88
|
+
json = call(params, false)
|
89
|
+
|
90
|
+
set_user_data(json["Login"])
|
91
|
+
self.session_id = json["Login"]["Session"]["id"]
|
92
|
+
rescue => e
|
93
|
+
# TODO: custom exception
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def set_user_data(json)
|
100
|
+
@user.user_id = json["User"]["id"]
|
101
|
+
@user.nickname = json["User"]["NickName"]
|
102
|
+
@user.password_hash = json['PasswordHash']
|
103
|
+
@user.filesize_limit = json['FileSizeLimit']
|
104
|
+
end
|
105
|
+
|
106
|
+
def protocol
|
107
|
+
return "http#{'s' if @use_ssl}://"
|
108
|
+
end
|
109
|
+
|
110
|
+
# {:foo => 'bar', :baz => "blingy things"} => ['foo=bar','baz=blingy+things']
|
111
|
+
def encode_params(raw_params)
|
112
|
+
return raw_params.map{ |k,v|
|
113
|
+
[k.to_s,CGI::escape(v.to_s)].join('=')
|
114
|
+
}
|
115
|
+
end
|
116
|
+
|
117
|
+
# returns everything except protocol/host
|
118
|
+
def build_url_request(params)
|
119
|
+
params.merge!(:APIKey => @api_key)
|
120
|
+
param_string = encode_params(params)
|
121
|
+
return @api_path + '?' + param_string.join('&')
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Smugmugr
|
2
|
+
class User < Smugmugr::Base
|
3
|
+
attr_accessor :credentials, :session_id, :session, :email, :password, :api_key
|
4
|
+
# set by smugmug response data
|
5
|
+
attr_accessor :user_id, :nickname, :password_hash, :filesize_limit
|
6
|
+
|
7
|
+
def initialize(api_key, args={})
|
8
|
+
@credentials = {}
|
9
|
+
self.api_key = api_key
|
10
|
+
args.each{ |k,v|
|
11
|
+
self.send("#{k}=", v) if self.respond_to?(k)
|
12
|
+
}
|
13
|
+
@session = Smugmugr::Session.new(self, args[:session_args] || {})
|
14
|
+
return
|
15
|
+
end
|
16
|
+
|
17
|
+
def send_request_with_session(params)
|
18
|
+
@session.send_request_with_session(params)
|
19
|
+
end
|
20
|
+
|
21
|
+
def albums(*extras)
|
22
|
+
extras = [extras] unless extras.is_a?(Array)
|
23
|
+
Album.get(self, :extras => extras)
|
24
|
+
end
|
25
|
+
|
26
|
+
def session_id
|
27
|
+
@session.session_id
|
28
|
+
end
|
29
|
+
|
30
|
+
def call(params={})
|
31
|
+
@session.call(params)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/smugmugr.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'curb'
|
3
|
+
# TODO: look for json_pure, then json
|
4
|
+
require 'json'
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
require 'smugmugr/base'
|
8
|
+
require 'smugmugr/album'
|
9
|
+
require 'smugmugr/category'
|
10
|
+
require 'smugmugr/community'
|
11
|
+
require 'smugmugr/family'
|
12
|
+
require 'smugmugr/friend'
|
13
|
+
require 'smugmugr/image'
|
14
|
+
require 'smugmugr/session'
|
15
|
+
require 'smugmugr/share_group'
|
16
|
+
require 'smugmugr/sub_category'
|
17
|
+
require 'smugmugr/theme'
|
18
|
+
require 'smugmugr/user'
|
19
|
+
require 'smugmugr/watermark'
|
20
|
+
|
21
|
+
|
22
|
+
module Smugmugr
|
23
|
+
# TODO: attempt to load from a configuration file
|
24
|
+
end
|
25
|
+
|
26
|
+
def logger
|
27
|
+
@logger ||= if Module.constants.include?('RAILS_DEFAULT_LOGGER')
|
28
|
+
RAILS_DEFAULT_LOGGER
|
29
|
+
else
|
30
|
+
Logger.new('smugmugr.log')
|
31
|
+
end
|
32
|
+
end
|