friendfeed 0.1.8 → 0.1.9

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 CHANGED
@@ -1,2 +1 @@
1
- friendfeed.gemspec
2
1
  pkg/
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Akinori MUSHA
1
+ Copyright (c) 2009, 2010 Akinori MUSHA
2
2
 
3
3
  All rights reserved. You can redistribute and/or modify it under the
4
4
  same terms as Ruby.
data/README.rdoc CHANGED
@@ -4,4 +4,4 @@ This is a Ruby library to provide access to FriendFeed API's.
4
4
 
5
5
  == Copyright
6
6
 
7
- Copyright (c) 2009 Akinori MUSHA. See LICENSE for details.
7
+ Copyright (c) 2009, 2010 Akinori MUSHA. See LICENSE for details.
data/Rakefile CHANGED
@@ -16,6 +16,8 @@ manipulating friends, groups and services for your personal purposes.
16
16
  gem.homepage = "http://github.com/knu/ruby-friendfeed"
17
17
  gem.authors = ["Akinori MUSHA"]
18
18
  gem.rubyforge_project = "friendfeed"
19
+ gem.add_dependency "json"
20
+ gem.add_dependency "mechanize", ">= 1.0.0"
19
21
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
20
22
  end
21
23
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.8
1
+ 0.1.9
data/bin/tw2ff CHANGED
@@ -216,7 +216,7 @@ EOF
216
216
  putinfo 'Skipping a protected user %s', name
217
217
  }
218
218
 
219
- agent = WWW::Mechanize.new
219
+ agent = Mechanize.new
220
220
 
221
221
  to_subscribe.each { |name|
222
222
  putinfo 'Creating an imaginary friend for %s', name
@@ -235,6 +235,73 @@ EOF
235
235
  end
236
236
  end
237
237
 
238
+ mode 'likes' do
239
+ description 'Synchronize Twitter favorites and FriendFeed likes as far as possible'
240
+
241
+ def run
242
+ require 'set'
243
+ require 'pp'
244
+
245
+ ffcli = friendfeed_client()
246
+ ff_me = ffcli.nickname
247
+
248
+ twcli = twitter_client()
249
+
250
+ favorited = Set[]
251
+
252
+ twcli.favorites.each { |favorite|
253
+ id = favorite['id']
254
+ # p [id, favorite.user.screen_name]
255
+ favorited << id
256
+ }
257
+
258
+ liked = Set[]
259
+ tw_url = {}
260
+
261
+ ffcli.get_user_liked_entries.each { |like|
262
+ url = like['link']
263
+ case TWITTER_URI.route_to(url).to_s
264
+ when %r{\A([A-Za-z0-9_]+)/statuses/([0-9]+)\z}
265
+ id = $2.to_i
266
+ liked << id
267
+ tw_url[id] = url
268
+ end
269
+ }
270
+
271
+ # Favorite FriendFeed-liked entry in Twitter
272
+ (liked - favorited).each { |id|
273
+ putinfo "Adding a favorite in Twitter: %s", tw_url[id]
274
+ twcli.favorite_create(id)
275
+ }
276
+
277
+ # Find Twitter-liked entries in FriendFeed that aren't liked yet
278
+ (
279
+ ffcli.get_user_friend_entries('num' => 1000) +
280
+ ffcli.get_user_discussed_entries
281
+ ).sort_by { |entry|
282
+ entry["published"]
283
+ }.each { |entry|
284
+ # Just in case this entry is not covered by the 'liked' list
285
+ next if entry['likes'].any? { |like| like['user']['nickname'] == ff_me }
286
+
287
+ # Is the source Twitter?
288
+ url = entry['service']['profileUrl'] or next
289
+ m = TWITTER_URI.route_to(url).to_s.match(%r{\A([A-Za-z0-9_]+)/statuses/([0-9]+)\z}) or next
290
+ id = m[2].to_i
291
+
292
+ # A different entry with the same source may be liked already
293
+ next if liked.include?(id)
294
+
295
+ if favorited.include?(id)
296
+ entryid = entry['id']
297
+ putinfo "Adding a like in FriendFeed: %s", entry['link']
298
+ ffcli.add_like(entryid)
299
+ liked << id
300
+ end
301
+ }
302
+ end
303
+ end
304
+
238
305
  mode 'replies' do
239
306
  description 'Produce an RSS feed for Twitter replies from non-friends'
240
307
 
@@ -0,0 +1,67 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{friendfeed}
8
+ s.version = "0.1.9"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Akinori MUSHA"]
12
+ s.date = %q{2010-02-09}
13
+ s.default_executable = %q{tw2ff}
14
+ s.description = %q{This is a Ruby library to provide access to FriendFeed API's.
15
+
16
+ It implements official API's as well as unofficial API's to allow
17
+ manipulating friends, groups and services for your personal purposes.
18
+ }
19
+ s.email = %q{knu@idaemons.org}
20
+ s.executables = ["tw2ff"]
21
+ s.extra_rdoc_files = [
22
+ "LICENSE",
23
+ "README.rdoc"
24
+ ]
25
+ s.files = [
26
+ ".document",
27
+ ".gitignore",
28
+ "LICENSE",
29
+ "README.rdoc",
30
+ "Rakefile",
31
+ "VERSION",
32
+ "bin/tw2ff",
33
+ "friendfeed.gemspec",
34
+ "lib/friendfeed.rb",
35
+ "lib/friendfeed/compat.rb",
36
+ "lib/friendfeed/unofficial.rb",
37
+ "test/friendfeed_test.rb",
38
+ "test/test_helper.rb"
39
+ ]
40
+ s.homepage = %q{http://github.com/knu/ruby-friendfeed}
41
+ s.rdoc_options = ["--charset=UTF-8"]
42
+ s.require_paths = ["lib"]
43
+ s.rubyforge_project = %q{friendfeed}
44
+ s.rubygems_version = %q{1.3.5}
45
+ s.summary = %q{A Ruby library to provide access to FriendFeed API's}
46
+ s.test_files = [
47
+ "test/friendfeed_test.rb",
48
+ "test/test_helper.rb"
49
+ ]
50
+
51
+ if s.respond_to? :specification_version then
52
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
53
+ s.specification_version = 3
54
+
55
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<json>, [">= 0"])
57
+ s.add_runtime_dependency(%q<mechanize>, [">= 1.0.0"])
58
+ else
59
+ s.add_dependency(%q<json>, [">= 0"])
60
+ s.add_dependency(%q<mechanize>, [">= 1.0.0"])
61
+ end
62
+ else
63
+ s.add_dependency(%q<json>, [">= 0"])
64
+ s.add_dependency(%q<mechanize>, [">= 1.0.0"])
65
+ end
66
+ end
67
+
data/lib/friendfeed.rb CHANGED
@@ -2,7 +2,7 @@
2
2
  #--
3
3
  # friendfeed.rb - provides access to FriendFeed API's
4
4
  #++
5
- # Copyright (c) 2009 Akinori MUSHA <knu@iDaemons.org>
5
+ # Copyright (c) 2009, 2010 Akinori MUSHA <knu@iDaemons.org>
6
6
  #
7
7
  # All rights reserved. You can redistribute and/or modify it under the same
8
8
  # terms as Ruby.
@@ -30,7 +30,7 @@ module FriendFeed
30
30
  private
31
31
 
32
32
  def get_api_agent
33
- @api_agent ||= WWW::Mechanize.new
33
+ @api_agent ||= Mechanize.new
34
34
  end
35
35
 
36
36
  def validate
@@ -46,7 +46,7 @@ module FriendFeed
46
46
 
47
47
  uri = API_URI + path
48
48
 
49
- agent = WWW::Mechanize.new
49
+ agent = Mechanize.new
50
50
  agent.auth('username', @nickname)
51
51
  JSON.parse(agent.post(uri, { 'apikey' => @remote_key }).body)
52
52
  end
@@ -155,77 +155,79 @@ module FriendFeed
155
155
  end
156
156
 
157
157
  # Gets an array of the most recent public entries.
158
- def get_public_entries()
159
- call_api('feed/public')['entries']
158
+ def get_public_entries(options = nil)
159
+ call_api('feed/public', options)['entries']
160
160
  end
161
161
 
162
162
  # Gets an array of the entries the authenticated user would see on
163
163
  # their home page.
164
- def get_home_entries()
164
+ def get_home_entries(options = nil)
165
165
  require_api_login
166
- call_api('feed/home')['entries']
166
+ call_api('feed/home', options)['entries']
167
167
  end
168
168
 
169
169
  # Gets an array of the entries for the authenticated user's list
170
170
  # of a given +nickname+
171
- def get_list_entries(nickname)
171
+ def get_list_entries(nickname, options = nil)
172
172
  require_api_login
173
- call_api('feed/list/%s' % URI.encode(nickname))['entries']
173
+ call_api('feed/list/%s' % URI.encode(nickname), options)['entries']
174
174
  end
175
175
 
176
176
  # Gets an array of the most recent entries from a user of a given
177
177
  # +nickname+ (defaulted to the authenticated user).
178
- def get_user_entries(nickname = @nickname)
178
+ def get_user_entries(nickname = @nickname, options = nil)
179
179
  nickname or require_api_login
180
- call_api('feed/user/%s' % URI.encode(nickname))['entries']
180
+ call_api('feed/user/%s' % URI.encode(nickname), options)['entries']
181
181
  end
182
182
 
183
183
  # Gets an array of the most recent entries from users of given
184
184
  # +nicknames+.
185
- def get_multi_user_entries(nicknames)
186
- call_api('feed/user', 'nickname' => nicknames)['entries']
185
+ def get_multi_user_entries(nicknames, options = nil)
186
+ new_options = { 'nickname' => nicknames }
187
+ new_options.merge!(options) if options
188
+ call_api('feed/user', new_options)['entries']
187
189
  end
188
190
 
189
191
  # Gets an array of the most recent entries a user of a given
190
192
  # +nickname+ (defaulted to the authenticated user) has commented
191
193
  # on.
192
- def get_user_commented_entries(nickname = @nickname)
194
+ def get_user_commented_entries(nickname = @nickname, options = nil)
193
195
  nickname or require_api_login
194
- call_api('feed/user/%s/comments' % URI.encode(nickname))['entries']
196
+ call_api('feed/user/%s/comments' % URI.encode(nickname), options)['entries']
195
197
  end
196
198
 
197
199
  # Gets an array of the most recent entries a user of a given
198
200
  # +nickname+ (defaulted to the authenticated user) has like'd.
199
- def get_user_liked_entries(nickname = @nickname)
201
+ def get_user_liked_entries(nickname = @nickname, options = nil)
200
202
  nickname or require_api_login
201
- call_api('feed/user/%s/likes' % URI.encode(nickname))['entries']
203
+ call_api('feed/user/%s/likes' % URI.encode(nickname), options)['entries']
202
204
  end
203
205
 
204
206
  # Gets an array of the most recent entries a user of a given
205
207
  # +nickname+ (defaulted to the authenticated user) has commented
206
208
  # on or like'd.
207
- def get_user_discussed_entries(nickname = @nickname)
209
+ def get_user_discussed_entries(nickname = @nickname, options = nil)
208
210
  nickname or require_api_login
209
- call_api('feed/user/%s/discussion' % URI.encode(nickname))['entries']
211
+ call_api('feed/user/%s/discussion' % URI.encode(nickname), options)['entries']
210
212
  end
211
213
 
212
214
  # Gets an array of the most recent entries from friends of a user
213
215
  # of a given +nickname+ (defaulted to the authenticated user).
214
- def get_user_friend_entries(nickname = @nickname)
216
+ def get_user_friend_entries(nickname = @nickname, options = nil)
215
217
  nickname or require_api_login
216
- call_api('feed/user/%s/friends' % URI.encode(nickname))['entries']
218
+ call_api('feed/user/%s/friends' % URI.encode(nickname), options)['entries']
217
219
  end
218
220
 
219
221
  # Gets an array of the most recent entries in a room of a given
220
222
  # +nickname+.
221
- def get_room_entries(nickname)
222
- call_api('feed/room/%s' % URI.encode(nickname))['entries']
223
+ def get_room_entries(nickname, options = nil)
224
+ call_api('feed/room/%s' % URI.encode(nickname), options)['entries']
223
225
  end
224
226
 
225
227
  # Gets an array of the entries the authenticated user would see on
226
228
  # their rooms page.
227
- def get_rooms_entries()
228
- call_api('feed/rooms')['entries']
229
+ def get_rooms_entries(options = nil)
230
+ call_api('feed/rooms', options)['entries']
229
231
  end
230
232
 
231
233
  # Gets an entry of a given +entryid+. An exception is raised when
@@ -241,8 +243,10 @@ module FriendFeed
241
243
  end
242
244
 
243
245
  # Gets an array of entries that match a given +query+.
244
- def search(query)
245
- call_api('feed/search', 'q' => query)['entries']
246
+ def search(query, options = nil)
247
+ new_options = { 'q' => query }
248
+ new_options.merge!(options) if options
249
+ call_api('feed/search', 'q' => new_options)['entries']
246
250
  end
247
251
 
248
252
  # Gets an array of entries that link to a given +url+.
@@ -36,7 +36,7 @@ module FriendFeed
36
36
  def login(nickname, password)
37
37
  @nickname = nickname
38
38
  @password = password
39
- @login_agent = WWW::Mechanize.new
39
+ @login_agent = Mechanize.new
40
40
 
41
41
  page = @login_agent.get(LOGIN_URI)
42
42
 
@@ -81,7 +81,7 @@ module FriendFeed
81
81
  raise message
82
82
  if html_frag = json['html']
83
83
  html_body = '<html><body>' << html_frag << '</body></html>'
84
- json['html_parser'] = WWW::Mechanize.html_parser.parse(html_body)
84
+ json['html_parser'] = Mechanize.html_parser.parse(html_body)
85
85
  end
86
86
  json
87
87
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: friendfeed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Akinori MUSHA
@@ -9,10 +9,29 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-01-25 00:00:00 +09:00
12
+ date: 2010-02-09 00:00:00 +09:00
13
13
  default_executable: tw2ff
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: json
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mechanize
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.0.0
34
+ version:
16
35
  description: |
17
36
  This is a Ruby library to provide access to FriendFeed API's.
18
37
 
@@ -35,6 +54,7 @@ files:
35
54
  - Rakefile
36
55
  - VERSION
37
56
  - bin/tw2ff
57
+ - friendfeed.gemspec
38
58
  - lib/friendfeed.rb
39
59
  - lib/friendfeed/compat.rb
40
60
  - lib/friendfeed/unofficial.rb