vimeo 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGELOG.rdoc +24 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +322 -0
  5. data/Rakefile +68 -0
  6. data/VERSION.yml +4 -0
  7. data/lib/vimeo/advanced/album.rb +57 -0
  8. data/lib/vimeo/advanced/auth.rb +22 -0
  9. data/lib/vimeo/advanced/base.rb +105 -0
  10. data/lib/vimeo/advanced/channel.rb +58 -0
  11. data/lib/vimeo/advanced/contact.rb +31 -0
  12. data/lib/vimeo/advanced/group.rb +68 -0
  13. data/lib/vimeo/advanced/group_events.rb +25 -0
  14. data/lib/vimeo/advanced/group_forums.rb +19 -0
  15. data/lib/vimeo/advanced/person.rb +48 -0
  16. data/lib/vimeo/advanced/test.rb +36 -0
  17. data/lib/vimeo/advanced/upload.rb +62 -0
  18. data/lib/vimeo/advanced/video.rb +131 -0
  19. data/lib/vimeo/advanced/video_embed.rb +19 -0
  20. data/lib/vimeo/advanced.rb +20 -0
  21. data/lib/vimeo/simple/activity.rb +42 -0
  22. data/lib/vimeo/simple/album.rb +21 -0
  23. data/lib/vimeo/simple/base.rb +10 -0
  24. data/lib/vimeo/simple/channel.rb +21 -0
  25. data/lib/vimeo/simple/group.rb +28 -0
  26. data/lib/vimeo/simple/user.rb +84 -0
  27. data/lib/vimeo/simple/video.rb +14 -0
  28. data/lib/vimeo/simple.rb +14 -0
  29. data/lib/vimeo.rb +10 -0
  30. data/test/fixtures/advanced/album/add_video.json +4 -0
  31. data/test/fixtures/advanced/album/create.json +7 -0
  32. data/test/fixtures/advanced/album/delete.json +4 -0
  33. data/test/fixtures/advanced/album/get_all.json +111 -0
  34. data/test/fixtures/advanced/album/get_videos.json +30 -0
  35. data/test/fixtures/advanced/album/remove_video.json +4 -0
  36. data/test/fixtures/advanced/album/set_description.json +4 -0
  37. data/test/fixtures/advanced/album/set_password.json +4 -0
  38. data/test/fixtures/advanced/album/set_title.json +4 -0
  39. data/test/fixtures/advanced/auth/check_token.json +13 -0
  40. data/test/fixtures/advanced/auth/get_frob.json +5 -0
  41. data/test/fixtures/advanced/auth/get_token.json +13 -0
  42. data/test/fixtures/advanced/channel/add_video.json +4 -0
  43. data/test/fixtures/advanced/channel/get_all.json +1395 -0
  44. data/test/fixtures/advanced/channel/get_info.json +55 -0
  45. data/test/fixtures/advanced/channel/get_moderators.json +45 -0
  46. data/test/fixtures/advanced/channel/get_subscribers.json +44 -0
  47. data/test/fixtures/advanced/channel/get_videos.json +19 -0
  48. data/test/fixtures/advanced/channel/remove_video.json +4 -0
  49. data/test/fixtures/advanced/channel/subscribe.json +4 -0
  50. data/test/fixtures/advanced/channel/unsubscribe.json +4 -0
  51. data/test/fixtures/advanced/contact/get_all.json +117 -0
  52. data/test/fixtures/advanced/contact/get_mutual.json +80 -0
  53. data/test/fixtures/advanced/contact/get_online.json +47 -0
  54. data/test/fixtures/advanced/contact/get_who_added.json +117 -0
  55. data/test/fixtures/advanced/group/add_video.json +4 -0
  56. data/test/fixtures/advanced/group/get_all.json +1556 -0
  57. data/test/fixtures/advanced/group/get_files.json +255 -0
  58. data/test/fixtures/advanced/group/get_info.json +73 -0
  59. data/test/fixtures/advanced/group/get_members.json +862 -0
  60. data/test/fixtures/advanced/group/get_moderators.json +44 -0
  61. data/test/fixtures/advanced/group/get_video_comments.json +96 -0
  62. data/test/fixtures/advanced/group/get_videos.json +102 -0
  63. data/test/fixtures/advanced/group/join.json +4 -0
  64. data/test/fixtures/advanced/group/leave.json +4 -0
  65. data/test/fixtures/advanced/group_events/get_month.json +146 -0
  66. data/test/fixtures/advanced/group_events/get_past.json +146 -0
  67. data/test/fixtures/advanced/group_events/get_upcoming.json +146 -0
  68. data/test/fixtures/advanced/group_forums/get_topic_comments.json +224 -0
  69. data/test/fixtures/advanced/group_forums/get_topics.json +504 -0
  70. data/test/fixtures/advanced/person/add_contact.json +4 -0
  71. data/test/fixtures/advanced/person/add_subscription.json +4 -0
  72. data/test/fixtures/advanced/person/find_by_email.json +9 -0
  73. data/test/fixtures/advanced/person/get_hd_embeds.json +8 -0
  74. data/test/fixtures/advanced/person/get_info.json +21 -0
  75. data/test/fixtures/advanced/person/get_portrait_urls.json +28 -0
  76. data/test/fixtures/advanced/person/remove_contact.json +4 -0
  77. data/test/fixtures/advanced/person/remove_subscription.json +4 -0
  78. data/test/fixtures/advanced/test/echo.json +8 -0
  79. data/test/fixtures/advanced/test/login.json +8 -0
  80. data/test/fixtures/advanced/test/null.json +4 -0
  81. data/test/fixtures/advanced/upload/confirm.json +9 -0
  82. data/test/fixtures/advanced/upload/get_quota.json +16 -0
  83. data/test/fixtures/advanced/upload/get_ticket.json +8 -0
  84. data/test/fixtures/advanced/upload/manifest_to_upload.json +6 -0
  85. data/test/fixtures/advanced/upload/sample_iTunes.mov +0 -0
  86. data/test/fixtures/advanced/upload/verify_manifest.json +11 -0
  87. data/test/fixtures/advanced/video/add_cast.json +4 -0
  88. data/test/fixtures/advanced/video/add_comment.json +7 -0
  89. data/test/fixtures/advanced/video/add_photos.json +4 -0
  90. data/test/fixtures/advanced/video/add_tags.json +4 -0
  91. data/test/fixtures/advanced/video/clear_tags.json +4 -0
  92. data/test/fixtures/advanced/video/delete.json +4 -0
  93. data/test/fixtures/advanced/video/delete_comment.json +4 -0
  94. data/test/fixtures/advanced/video/edit_comment.json +4 -0
  95. data/test/fixtures/advanced/video/get_all.json +30 -0
  96. data/test/fixtures/advanced/video/get_appears_in.json +10 -0
  97. data/test/fixtures/advanced/video/get_by_tag.json +239 -0
  98. data/test/fixtures/advanced/video/get_cast.json +42 -0
  99. data/test/fixtures/advanced/video/get_comments_list.json +52 -0
  100. data/test/fixtures/advanced/video/get_contacts_liked.json +48 -0
  101. data/test/fixtures/advanced/video/get_contacts_uploaded.json +237 -0
  102. data/test/fixtures/advanced/video/get_info.json +246 -0
  103. data/test/fixtures/advanced/video/get_likes.json +32 -0
  104. data/test/fixtures/advanced/video/get_subscriptions.json +241 -0
  105. data/test/fixtures/advanced/video/get_thumbnail_urls.json +28 -0
  106. data/test/fixtures/advanced/video/get_uploaded.json +30 -0
  107. data/test/fixtures/advanced/video/remove_cast.json +4 -0
  108. data/test/fixtures/advanced/video/remove_tag.json +4 -0
  109. data/test/fixtures/advanced/video/search.json +238 -0
  110. data/test/fixtures/advanced/video/set_description.json +4 -0
  111. data/test/fixtures/advanced/video/set_like.json +4 -0
  112. data/test/fixtures/advanced/video/set_privacy.json +4 -0
  113. data/test/fixtures/advanced/video/set_title.json +4 -0
  114. data/test/fixtures/advanced/video_embed/get_presets.json +8 -0
  115. data/test/fixtures/advanced/video_embed/set_preset.json +4 -0
  116. data/test/fixtures/simple/activity/contacts_did.json +1 -0
  117. data/test/fixtures/simple/activity/everyone_did.json +1 -0
  118. data/test/fixtures/simple/activity/happened_to_contacts.json +1 -0
  119. data/test/fixtures/simple/activity/happened_to_user.json +1 -0
  120. data/test/fixtures/simple/activity/user_did.json +1 -0
  121. data/test/fixtures/simple/album/info.json +1 -0
  122. data/test/fixtures/simple/album/videos.json +1 -0
  123. data/test/fixtures/simple/channel/info.json +1 -0
  124. data/test/fixtures/simple/channel/videos.json +1 -0
  125. data/test/fixtures/simple/group/info.json +1 -0
  126. data/test/fixtures/simple/group/users.json +1 -0
  127. data/test/fixtures/simple/group/videos.json +1 -0
  128. data/test/fixtures/simple/user/albums.json +1 -0
  129. data/test/fixtures/simple/user/all_videos.json +1 -0
  130. data/test/fixtures/simple/user/appears_in.json +1 -0
  131. data/test/fixtures/simple/user/channels.json +1 -0
  132. data/test/fixtures/simple/user/contacts_like.json +1 -0
  133. data/test/fixtures/simple/user/contacts_videos.json +1 -0
  134. data/test/fixtures/simple/user/groups.json +1 -0
  135. data/test/fixtures/simple/user/info.json +1 -0
  136. data/test/fixtures/simple/user/likes.json +1 -0
  137. data/test/fixtures/simple/user/subscriptions.json +1 -0
  138. data/test/fixtures/simple/user/videos.json +1 -0
  139. data/test/fixtures/simple/video/info.json +1 -0
  140. data/test/test_helper.rb +50 -0
  141. data/test/vimeo/advanced/album_test.rb +88 -0
  142. data/test/vimeo/advanced/auth_test.rb +37 -0
  143. data/test/vimeo/advanced/base_test.rb +24 -0
  144. data/test/vimeo/advanced/channels_test.rb +79 -0
  145. data/test/vimeo/advanced/contacts_test.rb +40 -0
  146. data/test/vimeo/advanced/group_events_test.rb +33 -0
  147. data/test/vimeo/advanced/group_forums_test.rb +26 -0
  148. data/test/vimeo/advanced/groups_test.rb +82 -0
  149. data/test/vimeo/advanced/person_test.rb +68 -0
  150. data/test/vimeo/advanced/test_test.rb +33 -0
  151. data/test/vimeo/advanced/upload_test.rb +50 -0
  152. data/test/vimeo/advanced/videos_embed_test.rb +26 -0
  153. data/test/vimeo/advanced/videos_test.rb +203 -0
  154. data/test/vimeo/advanced_test.rb +0 -0
  155. data/test/vimeo/simple/activity_test.rb +60 -0
  156. data/test/vimeo/simple/album_test.rb +31 -0
  157. data/test/vimeo/simple/channel_test.rb +31 -0
  158. data/test/vimeo/simple/group_test.rb +41 -0
  159. data/test/vimeo/simple/user_test.rb +112 -0
  160. data/test/vimeo/simple/video_test.rb +22 -0
  161. data/test/vimeo/simple_test.rb +0 -0
  162. data/test/vimeo_test.rb +0 -0
  163. data/vimeo.gemspec +244 -0
  164. metadata +303 -0
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ *.sw?
2
+ .DS_Store
3
+ coverage
data/CHANGELOG.rdoc ADDED
@@ -0,0 +1,24 @@
1
+ == 1.0.0, released 2009-09-28
2
+
3
+ * Upgraded to v2 of the API.
4
+ * Added some upload helpers.
5
+ * Huge refactor for the Advanced API making it easier to add/modify method calls.
6
+
7
+ == 0.2.2, released 2009-04-21
8
+
9
+ * Removed CGI escapes. Vimeo should be handling them on their end.
10
+
11
+ == 0.2.1, released 2009-01-06
12
+
13
+ * Last version was missing files.
14
+
15
+ == 0.2.0, released 2009-01-06
16
+
17
+ * Major re-factor of each request method.
18
+ * Separated the simple and advanced APIs into their own modules.
19
+ * Added some documentation.
20
+ * Updated the README.
21
+
22
+ == 0.1.2, released 2008-10-26
23
+
24
+ * Initial release
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Matt Hooks
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.rdoc ADDED
@@ -0,0 +1,322 @@
1
+ = Vimeo API Gem
2
+
3
+ This gem implements a full-featured Ruby interface for the Vimeo API v2.
4
+
5
+ For a more in depth look at the API check out {Vimeo's Simple API Documentation}[http://www.vimeo.com/api/docs/simple-api] or {Vimeo's Advanced API Documentation}[http://www.vimeo.com/api/docs/advanced-api]. I would also recommend checking out the {API Forums}[http://www.vimeo.com/forum:api] if
6
+ things aren't working as they should -- in my experience the Vimeo API has a number of bugs and oddities.
7
+
8
+ == Install
9
+
10
+ If you haven't already, add github's gem server to your sources:
11
+
12
+ gem sources -a http://gems.github.com
13
+
14
+ Then, it's as easy as:
15
+
16
+ sudo gem install matthooks-vimeo
17
+
18
+ Add the gem plugin to your Rails project by adding the following to your @environment.rb@ file:
19
+
20
+ config.gem "matthooks-vimeo", :lib => "vimeo"
21
+
22
+ == Use
23
+
24
+ There are two modules:
25
+
26
+ Vimeo::Simple
27
+ Vimeo::Advanced
28
+
29
+ == Simple API
30
+
31
+ The wrapper for the {Simple API}[http://www.vimeo.com/api/docs/simple-api] consists of several classes. To use the Simple API, just call one of the class methods. For example:
32
+
33
+ user_info = Vimeo::Simple::User.info("matthooks")
34
+ # =>
35
+ # {
36
+ # "id":"888046",
37
+ # "display_name":"Matt Hooks",
38
+ # "created_on":"2008-10-30 14:17:32",
39
+ # "is_staff":"0",
40
+ # "is_plus":"0",
41
+ # "location":"Chicago, IL",
42
+ # "url":"http:\/\/blackholeinthemidwest.com\/",
43
+ # "bio":"",
44
+ # "profile_url":"http:\/\/vimeo.com\/matthooks",
45
+ # "videos_url":"http:\/\/vimeo.com\/matthooks\/videos",
46
+ # "total_videos_uploaded":2,
47
+ # "total_videos_appears_in":0,
48
+ # "total_videos_liked":2,
49
+ # "total_contacts":3,
50
+ # "total_albums":0,
51
+ # "total_channels":1,
52
+ # "portrait_small":"http:\/\/images.vimeo.com\/11\/42\/16\/114216178\/114216178_30.jpg",
53
+ # "portrait_medium":"http:\/\/images.vimeo.com\/11\/42\/16\/114216178\/114216178_75.jpg",
54
+ # "portrait_large":"http:\/\/images.vimeo.com\/11\/42\/16\/114216178\/114216178_100.jpg",
55
+ # "portrait_huge":"http:\/\/images.vimeo.com\/11\/42\/16\/114216178\/114216178_300.jpg"
56
+ # }
57
+
58
+ # That's right! The data returned will be parsed and ready to use.
59
+
60
+ user_info["location"]
61
+ # => "Chicago, IL"
62
+
63
+ === Vimeo::Simple::Activity
64
+
65
+ Vimeo::Simple::Activity.user_did("username")
66
+ Vimeo::Simple::Activity.happened_to_user("username")
67
+ Vimeo::Simple::Activity.contacts_did("username")
68
+ Vimeo::Simple::Activity.happened_to_contacts("username")
69
+ Vimeo::Simple::Activity.everyone_did("username")
70
+
71
+ === Vimeo::Simple::Album
72
+
73
+ Vimeo::Simple::Album.videos("album_id")
74
+ Vimeo::Simple::Album.info("album_id")
75
+
76
+ === Vimeo::Simple::Channel
77
+
78
+ Vimeo::Simple::Channel.videos(channelname)
79
+ Vimeo::Simple::Channel.info(channelname)
80
+
81
+ === Vimeo::Simple::Group
82
+
83
+ Vimeo::Simple::Group.videos(groupname)
84
+ Vimeo::Simple::Group.users(groupname)
85
+ Vimeo::Simple::Group.info(groupname)
86
+
87
+ === Vimeo::Simple::User
88
+
89
+ Vimeo::Simple::User.info(username)
90
+ Vimeo::Simple::User.videos(username)
91
+ Vimeo::Simple::User.likes(username)
92
+ Vimeo::Simple::User.appears_in(username)
93
+ Vimeo::Simple::User.all_videos(username)
94
+ Vimeo::Simple::User.subscriptions(username)
95
+ Vimeo::Simple::User.albums(username)
96
+ Vimeo::Simple::User.channels(username)
97
+ Vimeo::Simple::User.groups(username)
98
+ Vimeo::Simple::User.contacts_videos(username)
99
+ Vimeo::Simple::User.contacts_like(username)
100
+
101
+ === Vimeo::Simple::Video
102
+
103
+ Vimeo::Simple::Video.info(video_id)
104
+
105
+ == Advanced API
106
+
107
+ The classes in Vimeo::Advanced must be instantiated with an your application's api key and secret. For example:
108
+
109
+ vimeo_video = Vimeo::Advanced::Video.new("api_key", "secret")
110
+
111
+ Then you can make method calls on the instance. For example:
112
+
113
+ vimeo_video.get_list("matthooks", :page => 2, :per_page => 50)
114
+
115
+ Some methods have optional variables. You should pass as a hash at the end of a call.
116
+
117
+ Some methods require authentication. Check out the guides for {Web Based authentication}[http://www.vimeo.com/api/docs/web-auth] and {Desktop Based authentication}[http://www.vimeo.com/api/docs/desktop-auth].
118
+
119
+ The wrapper for the Advanced API consists of the following classes and methods:
120
+
121
+ === Vimeo::Advanced::Album
122
+
123
+ album = Vimeo::Advanced::Album.new("api_key", "secret")
124
+
125
+ album.add_video("auth_token", "album_id", "video_id")
126
+ album.create("auth_token", "title", "video_id", { :description => "description", "videos" => "123,124,125" })
127
+ album.delete("auth_token", "album_id")
128
+ album.get_all("user_id", { :page => "1", :per_page => "25" })
129
+ album.get_videos("auth_token", "user_id", { :page => "1", :per_page => "25", :full_response => "0", :password => nil })
130
+ album.get_videos("auth_token", "album_id", "video_id")
131
+ album.set_description("auth_token", "album_id", "description")
132
+ album.get_password("auth_token", "album_id", "password")
133
+ album.get_title("auth_token", "album_id", "title")
134
+
135
+ === Vimeo::Advanced::Auth
136
+
137
+ auth = Vimeo::Advanced::Auth.new("api_key", "secret")
138
+
139
+ auth.get_token("frob")
140
+ auth.get_frob
141
+ auth.check_token("auth_token")
142
+
143
+ === Vimeo::Advanced::Base
144
+
145
+ base = Vimeo::Advanced::Base.new("api_key", "secret")
146
+
147
+ base.web_login_link("permissions")
148
+ base.desktop_login_link("permissions")
149
+
150
+ === Vimeo::Advanced::Channel
151
+
152
+ channel = Vimeo::Advanced::Channel.new("api_key", "secret")
153
+
154
+ channel.add_video("auth_token", "channel_id", "video_id")
155
+ channel.get_all({ :page => "1", :per_page => "25", :sort => "newest"})
156
+ channel.get_info(channel_id, { :page => "1", :per_page => "25" })
157
+ channel.get_moderators(channel_id, { :page => "1", :per_page => "25" })
158
+ channel.get_subscribers(channel_id, { :page => "1", :per_page => "25" })
159
+ channel.get_videos(channel_id, { :page => "1", :per_page => "25", :full_response => "0" })
160
+ channel.remove_video("auth_token", "channel_id", "video_id")
161
+ channel.subscribe("auth_token", "channel_id")
162
+ channel.unsubscribe("auth_token", "channel_id")
163
+
164
+ === Vimeo::Advanced::Contact
165
+
166
+ contact = Vimeo::Advanced::Contact.new("api_key", "secret")
167
+
168
+ contact.get_all(user_id, { :page => "1", :per_page => "25", :sort => "newest" })
169
+ contact.get_mutual(user_id, { :page => "1", :per_page => "25", :sort => "newest" })
170
+ contact.get_online({ :page => "1", :per_page => "25", :sort => "newest" })
171
+ contact.get_who_added(user_id, { :page => "1", :per_page => "25", :sort => "newest" })
172
+
173
+ === Vimeo::Advanced::Group
174
+
175
+ group = Vimeo::Advanced::Group.new("api_key", "secret")
176
+
177
+ group.add_video("auth_token", "group_id", "video_id")
178
+ group.get_all({ :page => "1", :per_page => "25", :sort => "newest" })
179
+ group.get_files("group_id", { :page => "1", :per_page => "25" })
180
+ group.get_info("group_id", { :page => "1", :per_page => "25" })
181
+ group.get_members("group_id", { :page => "1", :per_page => "25", :sort => "newest" })
182
+ group.get_moderators("group_id", { :page => "1", :per_page => "25" })
183
+ group.get_video_comments("group_id", "video_id", { :page => "1", :per_page => "25" })
184
+ group.get_videos("group_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
185
+ group.join("auth_token", "group_id")
186
+ group.leave("auth_token", "group_id")
187
+
188
+ === Vimeo::Advanced::GroupEvents
189
+
190
+ group_events = Vimeo::Advanced::GroupEvents.new("api_key", "secret")
191
+
192
+ group_events.get_month("group_id", { :page => "1", :per_page => "25", :month => nil, :year => nil })
193
+ group_events.get_past("group_id", { :page => "1", :per_page => "25" })
194
+ group_events.get_year("group_id", { :page => "1", :per_page => "25" })
195
+
196
+ === Vimeo::Advanced::GroupForums
197
+
198
+ group_forums = Vimeo::Advanced::GroupForums.new("api_key", "secret")
199
+
200
+ group_forums.get_topic_comments("group_id", "topic_id", { :page => "1", :per_page => "25" })
201
+ group_forums.get_topics("group_id", { :page => "1", :per_page => "25" })
202
+
203
+ === Vimeo::Advanced::Person
204
+
205
+ person = Vimeo::Advanced::Person.new("api_key", "secret")
206
+
207
+ person.add_contact("auth_token", "user_id")
208
+ # Types is a comma-delimited string. Valid options: "likes", "appears", "uploads"
209
+ person.add_subscription("auth_token", "user_id", "types")
210
+ person.find_by_email("user_id")
211
+ person.get_hd_embeds("auth_token")
212
+ person.get_info("user_id")
213
+ person.get_portrait_urls("user_id")
214
+ person.remove_contact("auth_token", "user_id")
215
+ # Types is a comma-delimited string. Valid options: "likes", "appears", "uploads"
216
+ person.remove_subscription("auth_token", "user_id", "types")
217
+
218
+ === Vimeo::Advanced::Test
219
+
220
+ test = Vimeo::Advanced::Test.new("api_key", "secret")
221
+
222
+ test.echo(options={})
223
+ test.null(auth_token)
224
+ test.login(auth_token)
225
+
226
+ === Vimeo::Advanced::Upload
227
+
228
+ upload = Vimeo::Advanced::Upload.new("api_key", "secret")
229
+
230
+ upload.confirm("auth_token", "ticket_id", "json_manifest")
231
+ upload.get_quota("auth_token")
232
+ upload.get_ticket("auth_token")
233
+ upload.upload("auth_token", "path_to_file", "ticket_id", "end_point")
234
+ upload.verify_manifest("auth_token", "ticket_id", "json_manifest")
235
+
236
+ === Vimeo::Advanced::Video
237
+
238
+ video = Vimeo::Advanced::Video.new("api_key", "secret")
239
+
240
+ video.add_cast("auth_token", "video_id", "user_id", { :role => nil })
241
+ video.add_photos("auth_token", "video_id", "photo_urls")
242
+ video.add_tags("auth_token", "video_id", "tags")
243
+ video.clear_tags("auth_token", "video_id")
244
+ video.delete("auth_token", "video_id")
245
+ video.get_all("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
246
+ video.get_appears_in("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
247
+ video.get_by_tag("tag", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
248
+ video.get_cast("video_id", { :page => "1", :per_page => "25" })
249
+ video.get_contacts_liked("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
250
+ video.get_contacts_uploaded("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
251
+ video.get_info("video_id")
252
+ video.get_likes("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
253
+ video.get_subscriptions("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
254
+ video.get_thumbnail_urls("video_id")
255
+ video.get_uploaded("user_id", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest" })
256
+ video.remove_cast("auth_token", "video_id", "user_id")
257
+ video.remove_tag("auth_token", "video_id", "tag_id")
258
+ video.search("query", { :page => "1", :per_page => "25", :full_response => "0", :sort => "newest", :user_id => nil })
259
+ video.set_description("auth_token", "video_id", "description")
260
+ video.set_like("auth_token", "video_id", "like")
261
+ video.set_privacy("auth_token", "video_id", "privacy", { :users => nil, :password => nil })
262
+ video.set_title("auth_token", "video_id", "title")
263
+
264
+ # comments
265
+ video.add_comment("auth_token", "video_id", "comment_text", { :reply_to_comment_id => nil })
266
+ video.delete_comment("auth_token", "video_id", "comment_id")
267
+ video.edit_comment("auth_token", "video_id", "comment_id", "comment_text")
268
+ video.get_comments_list("video_id", { :page => "1", :per_page => "25" })
269
+
270
+ === Vimeo::Advanced::VideoEmbed
271
+
272
+ video_embed = Vimeo::Advanced::VideoEmbed.new("api_key", "secret")
273
+
274
+ video_embed.get_presets("auth_token", { :page => "1", :per_page => "25" })
275
+ video_embed.set_preset("auth_token", "video_id", "preset_id")
276
+
277
+
278
+ == Uploads
279
+
280
+ Uploads are a little bit tricky, so I figured I'd help you guys with a short tutorial.
281
+
282
+ # Start by creating an instance of the Upload class.
283
+ upload = Vimeo::Advanced::Upload.new("api_key", "secret")
284
+ # I'm going to assume you've got that user's auth token stored somewhere and that they have upload access.
285
+ auth_token = "..."
286
+
287
+ # Let's check the user's quota.
288
+ # You should let the user know if they don't have enough quota free and/or if their video can be uploaded in HD
289
+ quota = upload.get_quota(auth_token)
290
+ free_space = quota["user"]["upload_space"]["free"]
291
+ hd = quota["user"]["hq_quota"]
292
+
293
+ # Now let's get an upload ticket.
294
+ ticket = upload.get_ticket(auth_token)
295
+ ticket_id = get_ticket["ticket"]["id"]
296
+ endpoint = get_ticket["ticket"]["endpoint"]
297
+
298
+ # Cool! Let's post the video.
299
+ # The file path should be absolute.
300
+ file_path = "..."
301
+ json_manifest = upload.upload(auth_token, file_path, ticket_id, endpoint)
302
+
303
+ # After the upload completes...
304
+ upload.confirm(auth_token, ticket_id, json_manifest)
305
+
306
+ There are a few steps along the way where things can go wrong.
307
+
308
+ == Todo
309
+
310
+ * Better structure. There's too many classes. Is there a way to simplify the Advanced API?
311
+ * Advanced classes should be able to take the authentication token as a parameter so you don't have to pass it to the methods that require authentication.
312
+ * Error handling.
313
+ * Some methods are not implemented by Vimeo or don't seem to work.
314
+ * More re-factoring.
315
+ * Make tests more robust and faster. If anyone has any ideas let me know.
316
+
317
+ == Thanks to
318
+
319
+ * {HTTParty}[http://github.com/jnunemaker/httparty/tree/master]: Easily one of the best tools I have used since I started using Ruby.
320
+ * {Jeweler}[http://github.com/technicalpickles/jeweler/tree/master]: Great tool for creating gems for Github.
321
+
322
+ === Copyright (c) 2008 Matt Hooks. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "vimeo"
8
+ gem.summary = %Q{A full featured Ruby implementation of the Vimeo API.}
9
+ gem.description = %Q{A full featured Ruby implementation of the Vimeo API.}
10
+ gem.email = "matthooks@gmail.com"
11
+ gem.homepage = "http://github.com/matthooks/vimeo"
12
+ gem.authors = ["Matt Hooks"]
13
+ gem.rubyforge_project = "vimeo"
14
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 2.10.2"
15
+ gem.add_development_dependency "fakeweb", ">= 1.2.6"
16
+ gem.add_development_dependency "crack", ">= 0.1.4"
17
+
18
+ gem.has_rdoc = true
19
+
20
+ gem.rdoc_options = ['--main', 'README.rdoc', '--inline-source', '--charset=UTF-8']
21
+ gem.extra_rdoc_files = ['README.rdoc', 'LICENSE', 'CHANGELOG.rdoc']
22
+
23
+ gem.add_dependency "httparty", ">= 0.4.5"
24
+ gem.add_dependency "curb", ">= 0.5.4.0"
25
+ gem.add_dependency "json", ">= 1.1.9"
26
+ end
27
+ Jeweler::GemcutterTasks.new
28
+ rescue LoadError
29
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
30
+ end
31
+
32
+ require 'rake/testtask'
33
+ Rake::TestTask.new(:test) do |test|
34
+ test.libs << 'lib' << 'test'
35
+ test.pattern = 'test/**/*_test.rb'
36
+ test.verbose = true
37
+ end
38
+
39
+ begin
40
+ require 'rcov/rcovtask'
41
+ Rcov::RcovTask.new do |test|
42
+ test.libs << 'test'
43
+ test.pattern = 'test/**/*_test.rb'
44
+ test.verbose = true
45
+ end
46
+ rescue LoadError
47
+ task :rcov do
48
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
49
+ end
50
+ end
51
+
52
+ task :test => :check_dependencies
53
+
54
+ task :default => :test
55
+
56
+ require 'rake/rdoctask'
57
+ Rake::RDocTask.new do |rdoc|
58
+ if File.exist?('VERSION')
59
+ version = File.read('VERSION')
60
+ else
61
+ version = ""
62
+ end
63
+
64
+ rdoc.rdoc_dir = 'rdoc'
65
+ rdoc.title = "vimeo #{version}"
66
+ rdoc.rdoc_files.include('README*')
67
+ rdoc.rdoc_files.include('lib/**/*.rb')
68
+ end
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :minor: 0
3
+ :patch: 0
4
+ :major: 1
@@ -0,0 +1,57 @@
1
+ module Vimeo
2
+ module Advanced
3
+ class Album < Vimeo::Advanced::Base
4
+
5
+ # Adds a video to an album.
6
+ create_api_method :add_video,
7
+ "vimeo.albums.addVideo",
8
+ :required => [:auth_token, :album_id, :video_id]
9
+
10
+ # Creates an album.
11
+ # FIXME: Nothing is returned if you add multiple videos to an album.
12
+ # The optional parameter videos is a comma-separated list of video ids.
13
+ create_api_method :create,
14
+ "vimeo.albums.create",
15
+ :required => [:auth_token, :title, :video_id],
16
+ :optional => [:description, :videos]
17
+
18
+ # Deletes an album.
19
+ create_api_method :delete,
20
+ "vimeo.albums.delete",
21
+ :required => [:auth_token, :album_id]
22
+
23
+ # Returns a list of a user's albums.
24
+ create_api_method :get_all,
25
+ "vimeo.albums.getAll",
26
+ :required => [:user_id],
27
+ :optional => [:page, :per_page, :sort]
28
+
29
+ # Returns a list of the videos in an album.
30
+ create_api_method :get_videos,
31
+ "vimeo.albums.getVideos",
32
+ :required => [:auth_token, :album_id],
33
+ :optional => [:page, :per_page, :full_response, :password]
34
+
35
+ # Removes a video from an album.
36
+ create_api_method :remove_video,
37
+ "vimeo.albums.removeVideo",
38
+ :required => [:auth_token, :album_id, :video_id]
39
+
40
+ # Sets the description of an album.
41
+ create_api_method :set_description,
42
+ "vimeo.albums.setDescription",
43
+ :required => [:auth_token, :album_id, :description]
44
+
45
+ # Sets the password of an album.
46
+ create_api_method :set_password,
47
+ "vimeo.albums.setPassword",
48
+ :required => [:auth_token, :album_id, :password]
49
+
50
+ # Sets the title of an album.
51
+ create_api_method :set_title,
52
+ "vimeo.albums.setTitle",
53
+ :required => [:auth_token, :album_id, :title]
54
+
55
+ end # Album
56
+ end # Advanced
57
+ end # Vimeo
@@ -0,0 +1,22 @@
1
+ module Vimeo
2
+ module Advanced
3
+ class Auth < Vimeo::Advanced::Base
4
+
5
+ # Tests the validity of an authorization token.
6
+ create_api_method :check_token,
7
+ "vimeo.auth.checkToken",
8
+ :required => [:auth_token]
9
+
10
+ # Obtains a frob.
11
+ # Used for desktop based authentication.
12
+ create_api_method :get_frob,
13
+ "vimeo.auth.getFrob"
14
+
15
+ # Obtains an authorization token.
16
+ create_api_method :get_token,
17
+ "vimeo.auth.getToken",
18
+ :required => [:frob]
19
+
20
+ end
21
+ end # Advanced
22
+ end # Vimeo
@@ -0,0 +1,105 @@
1
+ module CreateApiMethod
2
+
3
+ # Small DSL that creates a method that calls a Vimeo method through the advanced API.
4
+ #
5
+ # @param [String] method The name of the method being created.
6
+ # @param [String] vimeo_method The name of the advanced API Method the function should call.
7
+ # @param [Hash] options Some optional parameters.
8
+ # @option options [Array] :required An array of required parameters.
9
+ # @option options [Array] :optional An array of optional parameters.
10
+ # @option options [Array] :unsigned An array of required parameters that should not be included in the api_sig.
11
+ def create_api_method(method, vimeo_method, options={})
12
+ options = { :required => [], :optional => [], :unsigned => [] }.merge(options)
13
+
14
+ raise ArgumentError, 'Required parameters must be an array.' unless options[:required].is_a? Array
15
+ raise ArgumentError, 'Optional parameters must be an array.' unless options[:optional].is_a? Array
16
+ raise ArgumentError, 'Unsigned parameters must be an array.' unless options[:optional].is_a? Array
17
+
18
+ required = (options[:required] + options[:unsigned]).map { |r| r.to_s }.join(",")
19
+ required_hash = options[:required].map { |r| ":#{r} => #{r}" }.join(",")
20
+ optional_hash = options[:optional].map { |o| ":#{o} => nil" }.join(",")
21
+ unsigned_hash = options[:unsigned].map { |u| ":#{u} => #{u}" }.join(",")
22
+
23
+ parameters = "(#{required unless required.blank?}#{',' unless required.blank?}options={#{optional_hash}})"
24
+
25
+ method_string = <<-method
26
+
27
+ def #{method}#{parameters}
28
+ raise ArgumentError, 'Options must be a hash.' unless options.is_a? Hash
29
+
30
+ sig_options = {
31
+ :method => "#{vimeo_method}",
32
+ :format => "json"
33
+ }
34
+
35
+ #{ options[:required].map { |r| "sig_options.merge! :#{r} => #{r}"}.join("\n") }
36
+ #{ options[:optional].map { |o| "sig_options.merge! :#{o} => options[:#{o}] unless options[:#{o}].nil?" }.join("\n") }
37
+
38
+ make_request sig_options#{ ", :unsigned => {" + unsigned_hash + "}" unless options[:unsigned].empty? }
39
+ end
40
+
41
+ method
42
+
43
+ class_eval method_string
44
+ end
45
+
46
+ end
47
+
48
+ module Vimeo
49
+ module Advanced
50
+
51
+ class Base
52
+ include HTTParty
53
+ base_uri 'vimeo.com'
54
+ extend CreateApiMethod
55
+
56
+ # TODO: Pass an auth token, if you've already got one
57
+ # TODO: implement format_options
58
+ # Requires your API key and secret phrase.
59
+ # The API key and secret are prepended to every request.
60
+ def initialize(api_key, secret, format_options={})
61
+ @auth = { :api_key => api_key }
62
+ @secret = secret
63
+ end
64
+
65
+ # Generates a link that allows a user to authorize
66
+ # your web application to use the advanced API
67
+ def web_login_link(perms)
68
+ api_sig = generate_api_sig :perms => perms
69
+ "http://vimeo.com/services/auth/?api_key=#{@auth[:api_key]}&perms=#{perms}&api_sig=#{api_sig}"
70
+ end
71
+
72
+ # Generates a link that allows a user to authorize
73
+ # your desktop application to use the advanced API
74
+ def desktop_login_link(perms, frob)
75
+ api_sig = generate_api_sig :frob => frob, :perms => perms
76
+ "http://vimeo.com/services/auth/?api_key=#{@auth[:api_key]}&perms=#{perms}&frob=#{frob}&api_sig=#{api_sig}"
77
+ end
78
+
79
+ private
80
+
81
+ def make_request(sig_options, options={})
82
+ options = { :unsigned => [] }.merge(options)
83
+ unsigned = options[:unsigned]
84
+
85
+ api_sig = generate_api_sig sig_options
86
+ self.class.post "/api/rest/v2", :query => query(sig_options, api_sig), :body => unsigned
87
+ end
88
+
89
+ # Generates a MD5 hashed API signature for Advanced API requests
90
+ def generate_api_sig(options={})
91
+ # Every request requires the api_key parameter
92
+ options.merge! @auth
93
+ # Keys must be sorted alphabetically
94
+ api_sig = options.sort { |a, b| a.to_s <=> b.to_s }.join
95
+ Digest::MD5.hexdigest("#{@secret}#{api_sig}")
96
+ end
97
+
98
+ def query(sig_options, api_sig)
99
+ sig_options.merge :api_key => @auth[:api_key], :api_sig => api_sig
100
+ end
101
+
102
+ end # Base
103
+
104
+ end # Advanced
105
+ end # Vimeo