muck-raker 0.1.43 → 0.1.45

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -62,6 +62,7 @@ begin
62
62
  gemspec.add_dependency "mbleigh-acts-as-taggable-on"
63
63
  gemspec.add_dependency "mislav-will_paginate"
64
64
  gemspec.add_dependency "httparty"
65
+ gemspec.add_dependency "nokogiri"
65
66
  gemspec.add_dependency "muck-feedbag"
66
67
  gemspec.add_dependency "pauldix-feedzirra"
67
68
  gemspec.add_dependency "muck-engine"
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.43
1
+ 0.1.45
@@ -6,6 +6,8 @@ class Muck::TopicsController < ApplicationController
6
6
  before_filter :build_tag_feeds, :only => [:show, :rss_discovery]
7
7
 
8
8
  def show
9
+ @show_google_search = true
10
+ @show_combined = false
9
11
  respond_to do |format|
10
12
  format.html do
11
13
  @opml_path = topic_path(params[:id], :service_ids => params[:service_ids], :format => 'opml')
@@ -32,7 +34,7 @@ class Muck::TopicsController < ApplicationController
32
34
  format.iphone { render :template => 'topics/photos' }
33
35
  end
34
36
  end
35
-
37
+
36
38
  def videos
37
39
  @terms = CGI.unescape(params[:id])
38
40
  @page_title = @title = @terms.titleize
@@ -1,5 +1,60 @@
1
1
  module MuckRakerGoogleHelper
2
2
 
3
+ # Render a google custom search control. If feeds are provided then the search will be restricted to the
4
+ # 'display_url' for each feed. If search_for is specified then a default search will be executed.
5
+ # It is not recommended that you provide feeds and locale since the overlap between the feeds provided
6
+ # and the languages might be nothing.
7
+ # Examples:
8
+ #
9
+ # Create a custom search over a specific set of feeds:
10
+ # <%= google_search('Google Search (Search within these results)', [], '', %w{web}, 'google_restricted_search') %>
11
+ #
12
+ # Create a general google search based on the current locale:
13
+ # <%= google_search('Google Search', [], @terms, %w{web video blog news image local book patent}, 'google_search', I18n.locale) %>
14
+ #
15
+ # feeds: An array of feeds to render each with a property 'display_uri' defined
16
+ # search_for: Terms to search for by default. If none are specified then no default search will be performed.
17
+ # search_types: Types of google searches to add to the dialog. Valid values are web video blog news image local book patent
18
+ # content_id: Name of the div that will hold the widget google generates.
19
+ # If this method is called more than once on a given page then you will need to
20
+ # specify different content_ids for each call.
21
+ # locale: Locale to restrict searches. For example, to restrict the search to only German sites specify 'de'
22
+ # A complete set of valid Google languages can be found here:
23
+ # http://code.google.com/apis/ajaxlanguage/documentation/#SupportedLanguages
24
+ # For a list of valid codes you can also look at the babelphish gem. Codes can be found in languages.rb.
25
+ def google_search(title, feeds = [], search_for = '', search_types = %w{web video blog news image local book patent}, content_id = 'google_search', locale = nil)
26
+ render :partial => 'google/search', :locals => { :title => title,
27
+ :feeds => feeds,
28
+ :search_for => search_for,
29
+ :search_types => search_types,
30
+ :content_id => content_id,
31
+ :locale => locale }
32
+ end
33
+
34
+ # Utility method for generating scripts required to to build google search
35
+ # type: Type of Google search. Should be one of web video blog news image local book patent
36
+ # feeds: An array of feeds to render each with a property 'display_uri' defined
37
+ # locale: Locale to restrict searches. For example, to restrict the search to only German sites specify 'de'
38
+ # A complete set of valid Google languages can be found here:
39
+ # http://code.google.com/apis/ajaxlanguage/documentation/#SupportedLanguages
40
+ # For a list of valid codes you can also look at the babelphish gem. Codes can be found in languages.rb.
41
+ def google_typed_search(type, feeds = [], locale = nil)
42
+ content = "var #{type}Search = new google.search.#{type.capitalize}Search();\n"
43
+ if !['video', 'blog'].include?(type)
44
+ if !locale.blank?
45
+ content << "#{type}Search.setRestriction(google.search.Search.RESTRICT_EXTENDED_ARGS, {lr:'lang_#{locale}'});\n"
46
+ end
47
+ end
48
+ if !['video', 'local', 'patent', 'book'].include?(type)
49
+ feeds.each do |feed|
50
+ if !feed.display_uri.blank?
51
+ content << "#{type}Search.setSiteRestriction('#{feed.display_uri}');\n"
52
+ end
53
+ end
54
+ end
55
+ content << "searchControl.addSearcher(#{type}Search);\n"
56
+ end
57
+
3
58
  # Render feeds using Google's api
4
59
  # feeds: Feed object.
5
60
  # show_controls: Indicates whether or not to show editing controls. ie Remove
@@ -21,6 +76,18 @@ module MuckRakerGoogleHelper
21
76
  :run_load_scripts => run_load_scripts}
22
77
  end
23
78
 
79
+ # Render combined feed using Google's api
80
+ #
81
+ # feeds: Array of feeds that have attribute 'uri' defined.
82
+ # content_id: Name of the div that will hold the widget google generates.
83
+ # If this method is called more than once on a given page then you will need to
84
+ # specify different content_ids for each call.
85
+ # javascript_callback: Name of a javascript method to call after the feed has finished loading. The
86
+ # method should accept the feed uri and the content id. ie feed_callback(uri, content_id).
87
+ def google_combined_feeds(feeds, content_id = 'google_combined_feed', javascript_callback = nil)
88
+ render :partial => 'google/combined_feed', :locals => { :feeds => feeds, :content_id => content_id, :javascript_callback => javascript_callback }
89
+ end
90
+
24
91
  # Render a google dynamic feed control.
25
92
  #
26
93
  # feeds: An array of feeds to render each with a property 'title' and 'uri' defined
@@ -171,4 +238,15 @@ module MuckRakerGoogleHelper
171
238
  </script>}
172
239
  end
173
240
 
241
+ def google_hot_trends
242
+ feed = Feed.fetch_feed('http://www.google.com/trends/hottrends/atom/hourly')
243
+ result = Nokogiri::HTML(feed.entries[0].content)
244
+ google_hot_trends_terms = result.css('a').collect{ |a| change_chars(a.text) }.compact
245
+ render :partial => 'google/hot_trends', :locals => { :google_hot_trends_terms => google_hot_trends_terms }
246
+ end
247
+
248
+ def change_chars(term)
249
+ term.gsub('+', ' ').gsub('.', '-')
250
+ end
251
+
174
252
  end
data/app/models/feed.rb CHANGED
@@ -35,8 +35,6 @@
35
35
 
36
36
  class Feed < ActiveRecord::Base
37
37
 
38
- require 'httparty'
39
-
40
38
  include HTTParty
41
39
  format :xml
42
40
 
@@ -144,7 +142,7 @@ class Feed < ActiveRecord::Base
144
142
  feeds = []
145
143
  @available_feeds = discover_feeds(uri)
146
144
  @available_feeds.each do |feed|
147
- feeds << new_from_feedzirra(Feedzirra::Feed.fetch_and_parse(feed.url)) unless feed.blank?
145
+ feeds << new_from_feedzirra(fetch_feed(feed.url)) unless feed.blank?
148
146
  end
149
147
  feeds
150
148
  end
@@ -155,11 +153,17 @@ class Feed < ActiveRecord::Base
155
153
  feeds = []
156
154
  @available_feeds = discover_feeds(uri)
157
155
  @available_feeds.each do |feed|
158
- feeds << create_from_feedzirra(Feedzirra::Feed.fetch_and_parse(feed.url), user) unless feed.blank?
156
+ feeds << create_from_feedzirra(fetch_feed(feed.url), user) unless feed.blank?
159
157
  end
160
158
  feeds
161
159
  end
162
160
 
161
+ # Fetch a remote feed
162
+ def self.fetch_feed(url)
163
+ return nil if url.blank?
164
+ Feedzirra::Feed.fetch_and_parse(url)
165
+ end
166
+
163
167
  # Turns a feed from feedzirra into a muck feed
164
168
  def self.new_from_feedzirra(feed)
165
169
  return if feed.blank?
@@ -0,0 +1,73 @@
1
+ <% content_for :head do -%>
2
+ <%= google_ajax_api_scripts -%>
3
+ <%= google_load_feeds -%>
4
+ <% end -%>
5
+
6
+ <script type="text/javascript">
7
+ entries = [];
8
+ function feed_loaded(result) {
9
+ if (!result.error) {
10
+ jQuery('#<%= content_id %> .waiting').hide();
11
+ jQuery('#<%= content_id %> ul').html('');
12
+ new_entries = result.feed.entries;
13
+ for (var i=0; i<new_entries.length; i++){
14
+ new_entries[i].feed = result.feed;
15
+ }
16
+ entries = jQuery.merge(entries, new_entries);
17
+ entries = entries.sort(function(a,b){
18
+ return a.publishedDate > b.publishedDate;
19
+ });
20
+ for (var i=0; i<entries.length; i++) {
21
+ var html = '<li class="feed-item" style="background: transparent url(/images/service_icons/24/' + get_service_name(entries[i]) + ') no-repeat scroll left top;">';
22
+ html += '<div class="feed-title"><a href="' + entries[i].link + '" target="_blank">' + entries[i].title + '</a></div>';
23
+ html += '<div class="feed-content" style="display:none;">';
24
+ html += '<h3><a href="' + entries[i].link + '" target="_blank">' + entries[i].title + '</a></h3>';
25
+ html += entries[i].content;
26
+ html += '</div>';
27
+ html += '</li>';
28
+ jQuery('#<%= content_id %> ul').append(html);
29
+ }
30
+ apply_show_content();
31
+ <%= "#{javascript_callback}('#{content_id}');" if javascript_callback -%>
32
+ }
33
+ }
34
+ google.setOnLoadCallback(function(){
35
+ <% feeds.each do |feed| -%>
36
+ new google.feeds.Feed("<%=feed.uri%>").load(feed_loaded);
37
+ <% end -%>
38
+ });
39
+
40
+ function get_service_name(entry) {
41
+ var services = eval(<%= Service.all.to_json(:only => [ :uri_key, :icon ]) %>);
42
+ for(var i=0; i<services.length; i++){
43
+ if(services[i].uri_key && (entry.link.indexOf(services[i].uri_key) >= 0 || entry.feed.link.indexOf(services[i].uri_key) >= 0)){
44
+ return services[i].icon;
45
+ }
46
+ }
47
+ return 'feed.png';
48
+ }
49
+
50
+ function apply_show_content(){
51
+ jQuery('.combined-feed-list .feed-item .feed-title').hover(
52
+ function () {
53
+ jQuery(this).next('.combined-feed-list .feed-item .feed-content').show();
54
+ },
55
+ function () {
56
+ jQuery(this).next('.combined-feed-list .feed-item .feed-content').hide();
57
+ }
58
+ );
59
+ jQuery('.combined-feed-list .feed-item .feed-content').hover(
60
+ function () {
61
+ jQuery(this).show();
62
+ },
63
+ function () {
64
+ jQuery(this).hide();
65
+ }
66
+ );
67
+ }
68
+ </script>
69
+
70
+ <div id="<%= content_id %>" class="combined-feed">
71
+ <span class="waiting"><%= t('muck.raker.loading_message') %></span>
72
+ <ul class="combined-feed-list"></ul>
73
+ </div>
@@ -0,0 +1,5 @@
1
+ <ul class="google-trends">
2
+ <% google_hot_trends_terms.each do |term| -%>
3
+ <li><%= link_to h(term).titleize, topic_path(CGI.escape(term)) %></li>
4
+ <% end -%>
5
+ </ul>
@@ -0,0 +1,39 @@
1
+ <% content_for :head do -%>
2
+ <%= google_ajax_api_scripts -%>
3
+ <%= google_load_search -%>
4
+ <% end -%>
5
+ <script type="text/javascript">
6
+ function google_load_search() {
7
+ var searchControl = new google.search.SearchControl();
8
+
9
+ <% search_types.each do |type| -%>
10
+ <%= google_typed_search(type, feeds, locale) %>
11
+ <% end -%>
12
+
13
+ <% if GlobalConfig.google_ad_partner_pub -%>
14
+ searchControl.enableAds('<%= GlobalConfig.google_ad_partner_pub %>');
15
+ <% end -%>
16
+
17
+ <% if search_types.length > 1 -%>
18
+ var drawOptions = new google.search.DrawOptions();
19
+ drawOptions.setDrawMode(google.search.SearchControl.DRAW_MODE_TABBED);
20
+ searchControl.draw(document.getElementById("<%= content_id %>"), drawOptions);
21
+ <% else -%>
22
+ searchControl.draw(document.getElementById("<%= content_id %>"));
23
+ <% end -%>
24
+
25
+ searchControl.execute('<%=search_for%>');
26
+ }
27
+ google.setOnLoadCallback(google_load_search);
28
+ </script>
29
+ <div class="feed">
30
+ <div class="feed-header">
31
+ <h3 class="google-header"><%= title %></h3>
32
+ </div>
33
+ <div class="feed-content">
34
+ <div id="<%= content_id %>" class="search-container">
35
+ <span class="waiting"><%= t('muck.raker.loading_message') %></span>
36
+ </div>
37
+ </div>
38
+ </div>
39
+
@@ -1,5 +1,5 @@
1
1
  <% custom_form_for(:topic, :url => topics_path, :html => {:method => :post}) do |f| -%>
2
- <%= text_field_tag :terms, params[:terms] %>
2
+ <%= text_field_tag :terms, params[:terms] || @terms %>
3
3
  <%= f.submit t('muck.raker.build_topic'), :id => 'generate_topic' %>
4
4
  <span id="generating_topic_message" style="display:none;">
5
5
  <%= t('muck.raker.generating_topic_message') %><img src="/images/spinner.gif" alt="<%= t('muck.raker.discover_feed_message') %>" />
@@ -4,27 +4,35 @@
4
4
 
5
5
  <%= output_errors('', {:class => 'help-box'}) %>
6
6
 
7
- <div class="span-17 column">
8
- <h2><%= @title %></h2>
9
- </div>
10
-
11
- <div class="span-7 column">
7
+ <div id="search-header" class="span-24 column center">
12
8
  <%= topics_form %>
13
9
  </div>
14
10
 
15
11
  <div class="span-24 column">
16
12
  <%= link_to t('muck.raker.photos'), photos_topic_path(params[:id], :service_ids => params[:service_ids]) %>
17
13
  <%= link_to t('muck.raker.videos'), videos_topic_path(params[:id], :service_ids => params[:service_ids]) %>
14
+ <%= link_to t('muck.raker.download_opml', :terms => @title), @opml_path %>
18
15
  </div>
19
16
 
20
17
  <div class="span-14 column datafeeds">
21
- <div id="calculated-feeds">
22
- <%= google_feeds(@general_feeds, @show_controls, @number_of_items, @number_of_images, @number_of_videos) %>
23
- </div>
24
-
25
- <div id="discovered_feeds">
26
- <%= google_feeds(@discovered_feeds, @show_controls, @number_of_items, @number_of_images, @number_of_videos) %>
27
- </div>
18
+
19
+ <% if @show_google_search -%>
20
+ <div id="search-results">
21
+ <%= google_search('Google Search', [], @terms, %w{web video blog news image local book patent}, 'google_search', I18n.locale) %>
22
+ </div>
23
+ <% end -%>
24
+
25
+ <% if @show_combined -%>
26
+ <%= google_combined_feeds(@general_feeds + @discovered_feeds) %>
27
+ <% else -%>
28
+ <div id="calculated-feeds">
29
+ <%= google_feeds(@general_feeds, @show_controls, @number_of_items, @number_of_images, @number_of_videos) %>
30
+ </div>
31
+ <div id="discovered_feeds">
32
+ <%= google_feeds(@discovered_feeds, @show_controls, @number_of_items, @number_of_images, @number_of_videos) %>
33
+ </div>
34
+ <% end -%>
35
+
28
36
  </div>
29
37
 
30
38
  <div class="span-10 column datafeeds">
@@ -36,7 +44,7 @@
36
44
 
37
45
  <div class="span-24 column">
38
46
  <%= link_to t('muck.raker.generate_new_topic'), new_topic_path %>
39
- <%= link_to t('muck.raker.download_opml', :terms => @title), @opml_path %>
47
+
40
48
  <!--
41
49
  <a href="http://www.google.com/reader/view/feed/<%=CGI.escape(request.url)%>" title="<%=@title%>">
42
50
  <img src="http://buttons.googlesyndication.com/fusion/add.gif" border="0" alt="Add to Google" />
@@ -44,4 +52,5 @@
44
52
  -->
45
53
  </div>
46
54
 
47
- <%= render :partial => 'google/feeds_scripts' %>
55
+ <%= render :partial => 'google/feeds_scripts' %>
56
+
@@ -25,6 +25,7 @@ twitter:
25
25
  id: 3
26
26
  name: Twitter
27
27
  uri: "http://www.twitter.com"
28
+ uri_key: "twitter.com"
28
29
  api_uri:
29
30
  uri_data_template: "http://www.twitter.com/{username}"
30
31
  uri_template: "http://www.twitter.com/{username}"
@@ -37,6 +38,7 @@ youtube:
37
38
  id: 4
38
39
  name: You Tube
39
40
  uri: "http://www.youtube.com"
41
+ uri_key: "youtube.com"
40
42
  api_uri:
41
43
  uri_data_template: "http://gdata.youtube.com/feeds/base/users/{username}/uploads?alt=rss&v=2&orderby=published&client=ytapi-youtube-profile"
42
44
  uri_template: "http://www.youtube.com/user/{username}"
@@ -49,6 +51,7 @@ flickr:
49
51
  id: 5
50
52
  name: Flickr
51
53
  uri: "http://www.flickr.com"
54
+ uri_key: "flickr.com"
52
55
  api_uri:
53
56
  uri_data_template: "http://www.flickr.com/photos/{username}/"
54
57
  uri_template: "http://www.flickr.com/photos/{username}/"
@@ -61,6 +64,7 @@ delicious:
61
64
  id: 6
62
65
  name: delicious
63
66
  uri: "http://delicious/"
67
+ uri_key: "delicious.com"
64
68
  api_uri: "https://api.delicious/v1/"
65
69
  uri_data_template: "http://delicious.com/{username}"
66
70
  uri_template: "http://delicious.com/{username}"
@@ -73,6 +77,7 @@ digg:
73
77
  id: 7
74
78
  name: Digg
75
79
  uri: "http://www.digg.com"
80
+ uri_key: "digg.com"
76
81
  api_uri:
77
82
  uri_data_template: "http://digg.com/users/{username}/history.rss"
78
83
  uri_template: "http://digg.com/users/{username}"
@@ -85,6 +90,7 @@ yelp:
85
90
  id: 8
86
91
  name: Yelp
87
92
  uri: "http://www.yelp.com/"
93
+ uri_key: "yelp.com"
88
94
  api_uri:
89
95
  uri_data_template: "http://{username}.yelp.com/rss"
90
96
  uri_template: "http://{username}.yelp.com"
@@ -97,6 +103,7 @@ stumbleupon:
97
103
  id: 9
98
104
  name: StumbleUpon
99
105
  uri: "http://www.stumbleupon.com/"
106
+ uri_key: "stumbleupon.com"
100
107
  api_uri:
101
108
  uri_data_template: "http://rss.stumbleupon.com/user/{username}/"
102
109
  uri_template: "http://www.stumbleupon.com/stumbler/{username}"
@@ -109,6 +116,7 @@ vimeo:
109
116
  sort: 10
110
117
  name: Vimeo
111
118
  uri: "http://vimeo.com"
119
+ uri_key: "vimeo.com"
112
120
  api_uri:
113
121
  uri_data_template: "http://vimeo.com/{username}/videos/rss"
114
122
  uri_template: "http://vimeo.com/{username}"
@@ -121,6 +129,7 @@ lastfm:
121
129
  sort: 11
122
130
  name: Last.fm
123
131
  uri: "http://www.last.fm"
132
+ uri_key: "last.fm"
124
133
  api_uri:
125
134
  uri_data_template: "http://ws.audioscrobbler.com/1.0/user/{username}/recenttracks.rss"
126
135
  uri_template: "http://www.last.fm/user/{username}"
@@ -133,6 +142,7 @@ livejournal:
133
142
  sort: 12
134
143
  name: LiveJournal
135
144
  uri: "http://www.livejournal.com"
145
+ uri_key: "livejournal.com"
136
146
  api_uri:
137
147
  uri_data_template: "http://{username}.livejournal.com"
138
148
  uri_template: "http://{username}.livejournal.com"
@@ -145,6 +155,7 @@ simpy:
145
155
  sort: 13
146
156
  name: Simpy
147
157
  uri: "http://www.simpy.com"
158
+ uri_key: "simpy.com"
148
159
  api_uri:
149
160
  uri_data_template: "http://www.simpy.com/rss/user/{username}/links/"
150
161
  uri_template: "http://www.simpy.com/user/{username}"
@@ -157,6 +168,7 @@ wordpress:
157
168
  sort: 14
158
169
  name: Wordpress.com
159
170
  uri: "http://www.wordpress.com/"
171
+ uri_key: "wordpress.com/"
160
172
  api_uri:
161
173
  uri_data_template: "http://{username}.wordpress.com/"
162
174
  uri_template: "http://{username}.wordpress.com/"
@@ -169,6 +181,7 @@ xanga:
169
181
  sort: 15
170
182
  name: Xanga
171
183
  uri: "http://www.xanga.com"
184
+ uri_key: "xanga.com"
172
185
  api_uri:
173
186
  uri_data_template: "http://www.xanga.com/{username}/rss"
174
187
  uri_template: "http://{username}.xanga.com"
@@ -181,6 +194,7 @@ citeulike:
181
194
  sort: 16
182
195
  name: cite u like
183
196
  uri: "http://www.citeulike.org"
197
+ uri_key: "citeulike.org"
184
198
  api_uri:
185
199
  uri_data_template: "http://www.citeulike.org/rss/user/{username}"
186
200
  uri_template: "http://www.citeulike.org/user/{username}"
@@ -193,6 +207,7 @@ googlenews:
193
207
  sort: 17
194
208
  name: Google News
195
209
  uri: "http://news.google.com/"
210
+ uri_key: "news.google.com"
196
211
  icon: google.png
197
212
  use_for: false
198
213
  service_category_id: 4
@@ -205,6 +220,7 @@ googleblogsearch:
205
220
  sort: 18
206
221
  name: Google Blogs
207
222
  uri: "http://blogsearch.google.com/"
223
+ uri_key: "blogsearch.google.com"
208
224
  icon: google.png
209
225
  use_for: false
210
226
  service_category_id: 4
@@ -233,6 +249,7 @@ odeo:
233
249
  sort: 21
234
250
  name: Odeo Podcasts
235
251
  uri: "http://www.odeo.com"
252
+ uri_key: "odeo.com"
236
253
  icon: odeo.png
237
254
  use_for: false
238
255
  service_category_id: 1
@@ -242,6 +259,7 @@ technorati:
242
259
  sort: 22
243
260
  name: Technorati
244
261
  uri: "http://www.technorati.com/"
262
+ uri_key: "technorati.com"
245
263
  api_uri:
246
264
  uri_data_template: "http://feeds.technorati.com/faves/{username}?format=rss"
247
265
  icon: technorati.png
@@ -253,6 +271,7 @@ mixx:
253
271
  sort: 23
254
272
  name: Mixx
255
273
  uri: "http://www.mixx.com"
274
+ uri_key: "mixx.com"
256
275
  api_uri:
257
276
  uri_data_template: "http://www.mixx.com/feeds/users/{username}"
258
277
  uri_template: "http://www.mixx.com/users/{username}"
@@ -265,6 +284,7 @@ reddit:
265
284
  sort: 24
266
285
  name: Reddit
267
286
  uri: "http://www.reddit.com"
287
+ uri_key: "reddit.com"
268
288
  api_uri:
269
289
  uri_data_template: "http://www.reddit.com/user/{username}/.rss"
270
290
  uri_template: "http://www.reddit.com/user/{username}"
@@ -277,6 +297,7 @@ facebook:
277
297
  sort: 25
278
298
  name: Facebook
279
299
  uri: "http://www.facebook.com"
300
+ uri_key: "facebook.com"
280
301
  api_uri:
281
302
  uri_data_template:
282
303
  icon: facebook.png
@@ -290,6 +311,7 @@ pandora:
290
311
  sort: 26
291
312
  name: pandora
292
313
  uri: "http://www.pandora.com"
314
+ uri_key: "pandora.com"
293
315
  api_uri:
294
316
  uri_data_template: "http://feeds.pandora.com/feeds/people/{username}/favorites.xml"
295
317
  icon: pandora.png
@@ -301,6 +323,7 @@ technorati_tags:
301
323
  sort: 27
302
324
  name: Technorati
303
325
  uri: "http://www.technorati.com/"
326
+ uri_key: "technorati.com"
304
327
  api_uri:
305
328
  uri_data_template: "http://feeds.technorati.com/search/{tag}?language=n"
306
329
  uri_template: "http://www.technorati.com/search/{tag}?language=n"
@@ -313,6 +336,7 @@ flickr_tags:
313
336
  sort: 28
314
337
  name: Flickr
315
338
  uri: "http://www.flickr.com"
339
+ uri_key: "flickr.com"
316
340
  api_uri:
317
341
  uri_data_template: 'http://api.flickr.com/services/feeds/photos_public.gne?tags={tag}&lang=en-us&format=rss_200'
318
342
  uri_template: 'http://www.flickr.com/search/?q={tag}'
@@ -325,6 +349,7 @@ wordpress_tags:
325
349
  sort: 29
326
350
  name: Wordpress.com
327
351
  uri: "http://www.wordpress.com/"
352
+ uri_key: "wordpress.com"
328
353
  api_uri:
329
354
  uri_data_template: 'http://wordpress.com/tag/{tag}/feed/'
330
355
  uri_template: 'http://wordpress.com/tag/{tag}'
@@ -337,6 +362,7 @@ citeulike_tags:
337
362
  sort: 30
338
363
  name: cite u like
339
364
  uri: "http://www.citeulike.org"
365
+ uri_key: "citeulike.org"
340
366
  api_uri:
341
367
  uri_data_template: 'http://www.citeulike.org/rss/tag/{tag}'
342
368
  uri_template: 'http://www.citeulike.org/tag/{tag}'
@@ -349,6 +375,7 @@ delicious_tags:
349
375
  sort: 31
350
376
  name: delicious
351
377
  uri: "http://delicious/"
378
+ uri_key: "delicious.com"
352
379
  api_uri: "https://api.delicious/v1/"
353
380
  uri_data_template: 'http://feeds.delicious.com/rss/tag/{tag}'
354
381
  uri_template: 'http://delicious.com/search?p={tag}'
@@ -360,6 +387,7 @@ netflix:
360
387
  id: 32
361
388
  name: Netflix
362
389
  uri: "http://www.netflix.com"
390
+ uri_key: "netflix.com"
363
391
  api_uri:
364
392
  uri_data_template:
365
393
  icon: netflix.png
@@ -373,6 +401,7 @@ blogger:
373
401
  id: 33
374
402
  name: Blogger
375
403
  uri: "http://www.blogger.com"
404
+ uri_key: "blogger.com"
376
405
  api_uri:
377
406
  uri_data_template:
378
407
  icon: blogger.png
@@ -385,6 +414,7 @@ clipmarks:
385
414
  id: 34
386
415
  name: Clipmarks
387
416
  uri: "http://www.clipmarks.com"
417
+ uri_key: "clipmarks.com"
388
418
  api_uri:
389
419
  uri_data_template: "http://rss.clipmarks.com/clipper/{username}/"
390
420
  uri_template: "http://www.clipmarks.com/clipper/{username}/"
@@ -397,6 +427,7 @@ friendfeed:
397
427
  id: 35
398
428
  name: Friendfeed
399
429
  uri: "http://friendfeed.com"
430
+ uri_key: "friendfeed.com"
400
431
  api_uri:
401
432
  uri_data_template:
402
433
  icon: friendfeed.png
@@ -410,6 +441,7 @@ linkedin:
410
441
  id: 36
411
442
  name: LinkedIn
412
443
  uri: "http://www.linkedin.com"
444
+ uri_key: "linkedin.com"
413
445
  api_uri:
414
446
  uri_data_template:
415
447
  icon: linkedin.png
@@ -423,6 +455,7 @@ diigo:
423
455
  id: 37
424
456
  name: diigo
425
457
  uri: "http://www.diigo.com"
458
+ uri_key: "diigo.com"
426
459
  api_uri:
427
460
  uri_data_template: "http://www.diigo.com/rss/user/{username}"
428
461
  uri_template: "http://www.diigo.com/user/{username}"
@@ -436,6 +469,7 @@ diigo_tags:
436
469
  sort: 38
437
470
  name: diigo
438
471
  uri: "http://www.diigo.org"
472
+ uri_key: "diigo.org"
439
473
  api_uri:
440
474
  uri_data_template: 'http://www.diigo.com/community/tag?tag={tag}'
441
475
  uri_template: 'http://www.diigo.com/community/tag?tag={tag}'
@@ -448,6 +482,7 @@ netvibes:
448
482
  sort: 39
449
483
  name: NetVibes
450
484
  uri: "http://www.netvibes.com"
485
+ uri_key: "netvibes.com"
451
486
  api_uri:
452
487
  uri_data_template: "http://www.netvibes.com/{username}#General"
453
488
  uri_template: "http://www.netvibes.com/{username}#General"
@@ -460,6 +495,7 @@ dailymotion:
460
495
  sort: 40
461
496
  name: Dailymotion
462
497
  uri: "http://www.dailymotion.com"
498
+ uri_key: "dailymotion.com"
463
499
  uri_data_template: "http://www.dailymotion.com/rss/user/{username}/1"
464
500
  uri_template: "http://www.dailymotion.com/{username}"
465
501
  icon: dailymotion.png
@@ -471,6 +507,7 @@ polyvore:
471
507
  sort: 41
472
508
  name: Polyvore
473
509
  uri: "http://www.polyvore.com"
510
+ uri_key: "polyvore.com"
474
511
  icon: polyvore.png
475
512
  active: false
476
513
  prompt: polyvore_prompt
@@ -482,6 +519,7 @@ identica:
482
519
  sort: 42
483
520
  name: "identi.ca"
484
521
  uri: "http://identi.ca"
522
+ uri_key: "identi.ca"
485
523
  uri_data_template: "http://identi.ca/api/statuses/user_timeline/{username}.atom"
486
524
  uri_template: "http://identi.ca/{username}"
487
525
  icon: identica.png
@@ -493,6 +531,7 @@ tumblr:
493
531
  sort: 43
494
532
  name: "Tumblr"
495
533
  uri: "http://www.tumblr.com"
534
+ uri_key: "tumblr.com"
496
535
  uri_data_template: "http://{username}.tumblr.com/"
497
536
  uri_template: "http://{username}.tumblr.com/"
498
537
  icon: tumblr.png
@@ -504,6 +543,7 @@ joost:
504
543
  sort: 44
505
544
  name: "Joost"
506
545
  uri: "http://www.joost.com"
546
+ uri_key: "joost.com"
507
547
  uri_data_template: "http://www.joost.com/api/events/get/{username}?fmt=atom"
508
548
  uri_template: "http://www.joost.com/users/{username}/"
509
549
  icon: joost.png
@@ -515,6 +555,7 @@ fotolog:
515
555
  sort: 45
516
556
  name: "Fotolog"
517
557
  uri: "http://www.fotolog.com"
558
+ uri_key: "fotolog.com"
518
559
  uri_data_template: "http://www.fotolog.com/{username}/feed/main/rss20"
519
560
  uri_template: "http://www.fotolog.com/{username}"
520
561
  icon: fotolog.png
@@ -526,6 +567,7 @@ photobucket_photo_tags:
526
567
  sort: 46
527
568
  name: Photobucket (Photos)
528
569
  uri: "http://www.photobucket.com/"
570
+ uri_key: "photobucket.com"
529
571
  api_uri:
530
572
  uri_data_template: "http://feed.photobucket.com/images/{tag}/feed.rss"
531
573
  uri_template: "http://www.photobucket.com/images/{tag}"
@@ -538,6 +580,7 @@ photobucket_video_tags:
538
580
  sort: 47
539
581
  name: Photobucket (Videos)
540
582
  uri: "http://www.photobucket.com/"
583
+ uri_key: "photobucket.com"
541
584
  api_uri:
542
585
  uri_data_template: "http://feed.photobucket.com/videos/{tag}/feed.rss"
543
586
  uri_template: "http://www.photobucket.com/videos/{tag}"
@@ -550,6 +593,7 @@ identica_tags:
550
593
  sort: 48
551
594
  name: "identi.ca"
552
595
  uri: "http://identi.ca"
596
+ uri_key: "identi.ca"
553
597
  uri_data_template: "http://identi.ca/api/statusnet/tags/timeline/{tag}.atom"
554
598
  uri_template: "http://identi.ca/tag/{tag}"
555
599
  icon: identica.png
@@ -561,6 +605,7 @@ smugmug:
561
605
  sort: 49
562
606
  name: "Smugmug"
563
607
  uri: "http://www.smugmug.com"
608
+ uri_key: "smugmug.com"
564
609
  uri_data_template: "http://{username}.smugmug.com/"
565
610
  uri_template: "http://{username}.smugmug.com/"
566
611
  icon: smugmug.png
@@ -572,6 +617,7 @@ smugmug_tags:
572
617
  sort: 50
573
618
  name: "Smugmug"
574
619
  uri: "http://www.smugmug.com"
620
+ uri_key: "smugmug.com"
575
621
  uri_data_template: "http://www.smugmug.com/hack/feed.mg?Type=search&Data={tag}&format=atom10"
576
622
  uri_template: "http://www.smugmug.com/search/index.mg?searchWords={tag}&searchType=global&x=0&y=0"
577
623
  icon: smugmug.png
@@ -583,6 +629,7 @@ zooomr:
583
629
  sort: 51
584
630
  name: "Zooomr"
585
631
  uri: "http://www.zooomr.com"
632
+ uri_key: "zooomr.com"
586
633
  uri_data_template: "http://www.zooomr.com/photos/{username}"
587
634
  uri_template: "http://www.zooomr.com/photos/{username}"
588
635
  icon: zooomr.png
@@ -594,6 +641,7 @@ picasa:
594
641
  sort: 52
595
642
  name: "Picasa"
596
643
  uri: "http://picasaweb.google.com"
644
+ uri_key: "picasaweb.google.com"
597
645
  uri_data_template: "http://picasaweb.google.com/data/feed/base/user/{username}?alt=rss&kind=album&hl=en_US&access=public"
598
646
  uri_template: "http://picasaweb.google.com/{username}"
599
647
  icon: picasa.png
@@ -605,6 +653,7 @@ picasa_tags:
605
653
  sort: 53
606
654
  name: "Picasa"
607
655
  uri: "http://picasaweb.google.com"
656
+ uri_key: "picasaweb.google.com"
608
657
  uri_data_template: "http://picasaweb.google.com/data/feed/base/all?alt=rss&kind=photo&filter=1&q={tag}&hl=en_US"
609
658
  uri_template: "http://picasaweb.google.com/lh/view?q={tag}&psc=G&filter=1#"
610
659
  icon: picasa.png
@@ -616,6 +665,7 @@ librarything:
616
665
  sort: 54
617
666
  name: LibraryThing
618
667
  uri: "http://www.librarything.com"
668
+ uri_key: "librarything.com"
619
669
  uri_data_template: "http://www.librarything.com/rss/reviews/{username}"
620
670
  uri_template: "http://www.librarything.com/profile/{username}"
621
671
  icon: librarything.png
@@ -627,6 +677,7 @@ goodreads:
627
677
  sort: 55
628
678
  name: Goodreads
629
679
  uri: "http://www.goodreads.com"
680
+ uri_key: "goodreads.com"
630
681
  icon: goodreads.png
631
682
  use_for: "identity"
632
683
  service_category_id: 13
@@ -638,6 +689,7 @@ zotero_groups:
638
689
  sort: 56
639
690
  name: Zotero Groups
640
691
  uri: "http://www.zotero.org"
692
+ uri_key: "zotero.org"
641
693
  icon: zotero.png
642
694
  use_for: "identity"
643
695
  service_category_id: 8
@@ -649,6 +701,7 @@ zotero:
649
701
  sort: 57
650
702
  name: Zotero
651
703
  uri: "http://www.zotero.org"
704
+ uri_key: "zotero.org"
652
705
  uri_data_template: "http://www.zotero.org/{username}/items"
653
706
  uri_template: "http://www.zotero.org/{username}/items"
654
707
  icon: zotero.png
@@ -660,6 +713,7 @@ amazon:
660
713
  sort: 58
661
714
  name: Amazon
662
715
  uri: "http://www.amazon.com"
716
+ uri_key: "amazon.com"
663
717
  uri_data_template: "http://www.amazon.com"
664
718
  uri_template:
665
719
  icon: amazon.png
@@ -671,6 +725,7 @@ twitter_tags:
671
725
  id: 59
672
726
  name: Twitter
673
727
  uri: "http://www.twitter.com"
728
+ uri_key: "twitter.com"
674
729
  api_uri:
675
730
  uri_data_template: "http://search.twitter.com/search.atom?q=+{tag}"
676
731
  uri_template: "http://search.twitter.com/search?q=+{tag}"
@@ -683,6 +738,7 @@ youtube_tags:
683
738
  id: 60
684
739
  name: You Tube
685
740
  uri: "http://www.youtube.com"
741
+ uri_key: "youtube.com"
686
742
  api_uri:
687
743
  uri_data_template: "http://gdata.youtube.com/feeds/base/videos?q={tag}&amp;client=ytapi-youtube-search&amp;alt=rss&amp;v=2"
688
744
  icon: youtube.png
@@ -694,6 +750,7 @@ icerocket_blogs:
694
750
  id: 61
695
751
  name: IceRocket Blogs
696
752
  uri: "http://www.icerocket.com"
753
+ uri_key: "icerocket.com"
697
754
  api_uri:
698
755
  uri_data_template: "http://www.icerocket.com/search?tab=blog&q={tag}&rss=1"
699
756
  uri_template: "http://www.icerocket.com/search?tab=blog&fr=h&q={tag}&x=0&y=0"
@@ -706,6 +763,7 @@ yahoo_search:
706
763
  id: 62
707
764
  name: Yahoo
708
765
  uri: "http://www.yahoo.com"
766
+ uri_key: "yahoo.com"
709
767
  api_uri:
710
768
  uri_data_template: "http://api.search.yahoo.com/WebSearchService/rss/webSearch.xml?appid=yahoosearchwebrss&query={tag}"
711
769
  uri_template: "http://search.yahoo.com/search?p={tag}&fr=yfp-t-152&toggle=1&cop=mss&ei=UTF-8"
@@ -718,6 +776,7 @@ bing_search:
718
776
  id: 63
719
777
  name: Bing
720
778
  uri: "http://www.bing.com"
779
+ uri_key: "bing.com"
721
780
  api_uri:
722
781
  uri_data_template: "http://www.bing.com/search?q={tag}&go=&form=QBLH&qs=n&format=rss"
723
782
  uri_template: "http://www.bing.com/search?q={tag}&go=&form=QBLH&qs=n"
@@ -730,6 +789,7 @@ bloglines_tags:
730
789
  id: 64
731
790
  name: Bloglines
732
791
  uri: "http://www.bloglines.com"
792
+ uri_key: "bloglines.com"
733
793
  api_uri:
734
794
  uri_data_template: "feed://www.bloglines.com/search?q={tag}&ql=en&s=f&pop=l&news=m&format=rss"
735
795
  uri_template: "http://www.bloglines.com/search?q={tag}&ql=en&s=f&pop=l&news=m"
@@ -742,6 +802,7 @@ ask_blog_search:
742
802
  id: 65
743
803
  name: Ask.com Blogs
744
804
  uri: "http://www.ask.com"
805
+ uri_key: "ask.com"
745
806
  api_uri:
746
807
  uri_data_template: "http://ask.bloglines.com/search?q={tag}&ql=&format=rss"
747
808
  uri_template: "http://www.ask.com/blogsearch?q={tag}&search=search&qsrc=0&o=0&l=dir"
@@ -754,6 +815,7 @@ ask_news_search:
754
815
  id: 66
755
816
  name: Ask.com News
756
817
  uri: "http://www.ask.com"
818
+ uri_key: "ask.com"
757
819
  api_uri:
758
820
  uri_data_template: "http://news.ask.com/newsrss?q={tag}&n2c=&o=0&l=dir"
759
821
  uri_template: "http://news.ask.com/news?qsrc=167&o=0&l=dir&q={tag}"
@@ -766,6 +828,7 @@ icerocket_news:
766
828
  id: 67
767
829
  name: IceRocket News
768
830
  uri: "http://www.icerocket.com"
831
+ uri_key: "icerocket.com"
769
832
  api_uri:
770
833
  uri_data_template: "http://www.icerocket.com/search?tab=news&q={tag}&rss=1"
771
834
  uri_template: "http://www.icerocket.com/search?tab=news&fr=h&q={tag}&x=0&y=0"
@@ -778,6 +841,7 @@ icerocket_search:
778
841
  id: 68
779
842
  name: IceRocket
780
843
  uri: "http://www.icerocket.com"
844
+ uri_key: "icerocket.com"
781
845
  api_uri:
782
846
  uri_data_template: "http://www.icerocket.com/search?tab=web&q={tag}&rss=1"
783
847
  uri_template: "http://www.icerocket.com/search?tab=web&q={tag}"
@@ -790,6 +854,7 @@ digg_search:
790
854
  id: 69
791
855
  name: Digg
792
856
  uri: "http://www.digg.com"
857
+ uri_key: "digg.com"
793
858
  api_uri:
794
859
  uri_data_template: "feed://digg.com/rss_search?s={tag}"
795
860
  uri_template: "http://digg.com/search?s={tag}"
@@ -802,6 +867,7 @@ clipmarks:
802
867
  id: 70
803
868
  name: Clipmarks
804
869
  uri: "http://www.clipmarks.com"
870
+ uri_key: "clipmarks.com"
805
871
  api_uri:
806
872
  uri_data_template: "feed://rss.clipmarks.com/search/{tag}/"
807
873
  uri_template: "http://clipmarks.com/search/{tag}/"
@@ -815,6 +881,7 @@ simpy:
815
881
  sort: 71
816
882
  name: Simpy
817
883
  uri: "http://www.simpy.com"
884
+ uri_key: "simpy.com"
818
885
  api_uri:
819
886
  uri_data_template: "feed://www.simpy.com/rss/links/search/{tag}/s=d"
820
887
  uri_template: "http://www.simpy.com/links/search/{tag}"
@@ -827,6 +894,7 @@ connotea_search:
827
894
  sort: 72
828
895
  name: Connotea
829
896
  uri: "http://www.connotea.org"
897
+ uri_key: "connotea.org"
830
898
  uri_data_template: "http://www.connotea.org/rss/search?q={tag}"
831
899
  uri_template: "http://www.connotea.org/search?q={tag}"
832
900
  icon: connotea.png
@@ -838,6 +906,7 @@ connotea:
838
906
  sort: 73
839
907
  name: Connotea
840
908
  uri: "http://www.connotea.org"
909
+ uri_key: "connotea.org"
841
910
  uri_data_template: "http://www.connotea.org/rss/user/{username}"
842
911
  uri_template: "http://www.connotea.org/user/{username}"
843
912
  icon: connotea.png
@@ -848,6 +917,7 @@ twine_search:
848
917
  id: 74
849
918
  name: Twine
850
919
  uri: "http://www.twine.com"
920
+ uri_key: "twine.com"
851
921
  api_uri:
852
922
  uri_data_template: "http://www.twine.com/feed/atom/entries/search?text={tag}&type="
853
923
  uri_template: "http://www.twine.com/search?type=&text={tag}"
@@ -861,6 +931,7 @@ bibsonomy:
861
931
  sort: 75
862
932
  name: Bibsonomy
863
933
  uri: "http://www.bibsonomy.org"
934
+ uri_key: "bibsonomy.org"
864
935
  uri_data_template: "feed://www.bibsonomy.org/publrss/author/{username}"
865
936
  uri_template: "http://www.bibsonomy.org/author/{username}"
866
937
  icon: bibsonomy.png
@@ -872,6 +943,7 @@ bibsonomy_search:
872
943
  sort: 76
873
944
  name: Bibsonomy
874
945
  uri: "http://www.bibsonomy.org"
946
+ uri_key: "bibsonomy.org"
875
947
  uri_data_template: "feed://www.bibsonomy.org/burst/tag/{tag}"
876
948
  uri_template: "http://www.bibsonomy.org/tag/{tag}"
877
949
  icon: bibsonomy.png
@@ -882,6 +954,7 @@ metacafe:
882
954
  id: 77
883
955
  name: MetaCafe
884
956
  uri: "http://www.metacafe.com"
957
+ uri_key: "metacafe.com"
885
958
  api_uri:
886
959
  uri_data_template: "http://www.metacafe.com/tags/{tag}/rss.xml"
887
960
  uri_template: "http://www.metacafe.com/tags/{tag}"