muck-raker 0.1.43 → 0.1.45

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/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}"