feed_parser 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .rvmrc
2
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source :rubygems
2
+
3
+ gem 'nokogiri'
4
+
5
+ group :test do
6
+ gem 'rspec'
7
+ end
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2011 Arttu Tervo
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # FeedParser
2
+
3
+ Rss and Atom feed parser built on top of Nokogiri. Supports custom sanitizers.
4
+
5
+ ## Install
6
+
7
+ Add to Gemfile
8
+
9
+ gem "feed_parser"
10
+
11
+ ## Usage
12
+
13
+ # the most basic use case
14
+ fp = FeedParser.new(:url => "http://example.com/feed/")
15
+ # with sanitizer
16
+ fp = FeedParser.new(:url => "http://example.com/feed/", :sanitizer => MyBestestSanitizer.new)
17
+ # sanitizing custom field set
18
+ fp = FeedParser.new(:url => "http://example.com/feed/", :sanitizer => MyBestestSanitizer.new, :fields_to_sanitize => [:title, :content])
19
+
20
+ # parse the feed
21
+ feed = fp.parse
22
+
23
+ # using parsed feed in your code
24
+ feed.as_json
25
+ # => {:title => "Feed title", :url => "http://example.com/feed/", :items => [{:guid => , :title => , :author => ...}]}
26
+
27
+ feed.items.each do |feed_item|
28
+ pp feed_item
29
+ end
30
+
31
+ ## Running tests
32
+
33
+ Install dependencies by running `bundle install`.
34
+
35
+ Run rspec tests:
36
+
37
+ $ bundle exec rspec
38
+
39
+ ## Contributing
40
+
41
+ Fork, hack, push, create a pull request.
@@ -0,0 +1,26 @@
1
+ # feed_parser.gemspec
2
+ # -*- encoding: utf-8 -*-
3
+
4
+ $:.push File.expand_path("../lib", __FILE__)
5
+ require 'feed_parser'
6
+
7
+ Gem::Specification.new do |s|
8
+ s.name = 'feed_parser'
9
+ s.version = FeedParser::VERSION
10
+ s.platform = Gem::Platform::RUBY
11
+ s.authors = ['Arttu Tervo']
12
+ s.email = ['arttu.tervo@gmail.com']
13
+ s.homepage = 'http://github.com/arttu/feed_parser'
14
+ s.summary = %q{Rss and Atom feed parser}
15
+ s.description = %q{Rss and Atom feed parser with sanitizer support built on top of Nokogiri.}
16
+
17
+ s.add_dependency 'nokogiri'
18
+
19
+ s.add_development_dependency 'rspec-rails', '~> 2.6'
20
+
21
+ s.extra_rdoc_files = %w[README.md]
22
+ s.require_paths = %w[lib]
23
+
24
+ s.files = `git ls-files`.split("\n")
25
+ s.test_files = `git ls-files -- spec/*`.split("\n")
26
+ end
@@ -0,0 +1,33 @@
1
+ class FeedParser
2
+ class Dsl
3
+ def self.[](type)
4
+ send(type)
5
+ end
6
+ def self.rss
7
+ {
8
+ :title => "/rss/channel/title",
9
+ :url => "/rss/channel/link",
10
+ :item => "/rss/channel/item",
11
+ :item_guid => "guid",
12
+ :item_link => "link",
13
+ :item_title => "title",
14
+ :item_categories => "category",
15
+ :item_author => "creator",
16
+ :item_content => "encoded",
17
+ }
18
+ end
19
+ def self.atom
20
+ {
21
+ :title => "/feed/title",
22
+ :url => "/feed/link[@rel='self']",
23
+ :item => "/feed/entry",
24
+ :item_guid => "id",
25
+ :item_link => "link",
26
+ :item_title => "title",
27
+ :item_categories => "category",
28
+ :item_author => "author/name",
29
+ :item_content => "content",
30
+ }
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,37 @@
1
+ class FeedParser
2
+ class Feed
3
+ attr_reader :type
4
+
5
+ def initialize(feed_url)
6
+ @feed = Nokogiri::XML(open(feed_url))
7
+ @feed.remove_namespaces!
8
+ @type = (@feed.search('rss')[0] && :rss || :atom)
9
+ self
10
+ end
11
+
12
+ def title
13
+ @title = @feed.xpath(Dsl[@type][:title]).text
14
+ end
15
+
16
+ def url
17
+ _url = @feed.xpath(Dsl[@type][:url]).text
18
+ @url = (!_url.nil? && _url.length > 0 && _url || @feed.xpath(Dsl[@type][:url]).attribute("href").text)
19
+ end
20
+
21
+ def items
22
+ klass = (@type == :rss && RssItem || AtomItem)
23
+
24
+ @items ||= @feed.xpath(Dsl[@type][:item]).map do |item|
25
+ klass.new(item)
26
+ end
27
+ end
28
+
29
+ def as_json
30
+ {
31
+ :title => title,
32
+ :url => url,
33
+ :items => items.map(&:as_json)
34
+ }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ class FeedParser
2
+ class FeedItem
3
+ attr_reader :type
4
+
5
+ def initialize(item)
6
+ @guid = item.xpath(Dsl[@type][:item_guid]).text
7
+ @title = item.xpath(Dsl[@type][:item_title]).text
8
+ @author = item.xpath(Dsl[@type][:item_author]).text
9
+ @content = item.xpath(Dsl[@type][:item_content]).text
10
+ self
11
+ end
12
+
13
+ def method_missing(method_id)
14
+ if self.instance_variables.map(&:to_sym).include?("@#{method_id}".to_sym)
15
+ if FeedParser.fields_to_sanitize.include?(method_id)
16
+ FeedParser.sanitizer.sanitize(self.instance_variable_get("@#{method_id}".to_sym))
17
+ else
18
+ self.instance_variable_get("@#{method_id}".to_sym)
19
+ end
20
+ else
21
+ super
22
+ end
23
+ end
24
+
25
+ def as_json
26
+ {
27
+ :guid => guid,
28
+ :link => link,
29
+ :title => title,
30
+ :categories => categories,
31
+ :author => author,
32
+ :content => content
33
+ }
34
+ end
35
+ end
36
+
37
+ class RssItem < FeedItem
38
+ def initialize(item)
39
+ @type = :rss
40
+ super
41
+ @link = item.xpath(Dsl[@type][:item_link]).text
42
+ @categories = item.xpath(Dsl[@type][:item_categories]).map{|cat| cat.text}
43
+ end
44
+ end
45
+
46
+ class AtomItem < FeedItem
47
+ def initialize(item)
48
+ @type = :atom
49
+ super
50
+ @link = item.xpath(Dsl[@type][:item_link]).attribute("href").text
51
+ @categories = item.xpath(Dsl[@type][:item_categories]).map{|cat| cat.attribute("term").text}
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,7 @@
1
+ class FeedParser
2
+ class SelfSanitizer
3
+ def sanitize(str)
4
+ str
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ require 'open-uri'
2
+ require 'nokogiri'
3
+
4
+ class FeedParser
5
+
6
+ VERSION = "0.1.0"
7
+
8
+ def initialize(opts)
9
+ @url = opts[:url]
10
+ @@sanitizer = (opts[:sanitizer] || SelfSanitizer.new)
11
+ @@fields_to_sanitize = (opts[:fields_to_sanitize] || [:content])
12
+ self
13
+ end
14
+
15
+ def self.sanitizer
16
+ @@sanitizer
17
+ end
18
+
19
+ def self.fields_to_sanitize
20
+ @@fields_to_sanitize
21
+ end
22
+
23
+ def parse
24
+ @feed ||= Feed.new(@url)
25
+ end
26
+ end
27
+
28
+ require 'feed_parser/dsl'
29
+ require 'feed_parser/feed'
30
+ require 'feed_parser/feed_item'
31
+ require 'feed_parser/self_sanitizer'
@@ -0,0 +1,132 @@
1
+ require 'feed_parser'
2
+
3
+ class NotSaneSanitizer
4
+ def sanitize(str)
5
+ str.gsub(/flowdock/i, '').gsub('Karri Saarinen', 'Sanitized')
6
+ end
7
+ end
8
+
9
+ describe FeedParser do
10
+ describe "#parse" do
11
+ shared_examples_for "feed parser" do
12
+ it "should not fail" do
13
+ lambda {
14
+ @feed = @feed_parser.parse
15
+ }.should_not raise_error
16
+ end
17
+
18
+ it "should populate every item" do
19
+ @feed = @feed_parser.parse
20
+ @feed.items.each do |item|
21
+ [:guid, :link, :title, :categories, :author, :content].each do |attribute|
22
+ item.send(attribute).should_not be_nil
23
+ item.send(attribute).should_not be_empty
24
+ end
25
+ end
26
+ end
27
+ end
28
+
29
+ def case_tester(test_cases)
30
+ test_cases.each do |test_case|
31
+ if test_case.last.is_a?(Array)
32
+ test_case.last.each do |_case|
33
+ @feed.as_json[test_case.first].should include(_case)
34
+ end
35
+ else
36
+ @feed.send(test_case.first).should include(test_case.last)
37
+ end
38
+ end
39
+ end
40
+
41
+ describe "rss feeds" do
42
+ before :each do
43
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', 'nodeta.rss.xml'))
44
+ end
45
+
46
+ after :each do
47
+ @feed.type.should == :rss
48
+ end
49
+
50
+ {
51
+ 'nodeta.rss.xml' => {
52
+ :title => "Nodeta",
53
+ :url => "http://blog.nodeta.fi",
54
+ :items => [
55
+ {
56
+ :guid => "http://blog.nodeta.fi/?p=73",
57
+ :link => "http://blog.nodeta.fi/2009/01/16/ruby-187-imported/",
58
+ :title => "Ruby 1.8.7 imported",
59
+ :categories => ["APIdock", "Ruby"],
60
+ :author => "Otto Hilska",
61
+ :content => "<p>I just finished importing Ruby 1.8.7 to APIdock. It&#8217;s also the new default version, because usually it is better documented. However, there&#8217;re some incompatibilities between 1.8.6 and 1.8.7, so be sure to check the older documentation when something seems to be wrong.</p>\n"
62
+ }
63
+ ]
64
+ },
65
+ 'TechCrunch.xml' => {
66
+ :title => "TechCrunch",
67
+ :url => "http://techcrunch.com",
68
+ # items: [] # <- fill in if you want to
69
+ },
70
+ }.each do |rss_fixture, test_cases|
71
+ it "should parse #{rss_fixture}" do
72
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', rss_fixture))
73
+
74
+ @feed = @feed_parser.parse
75
+
76
+ case_tester(test_cases)
77
+ end
78
+ end
79
+
80
+ it "should sanitize with custom sanitizer" do
81
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', 'sanitize.me.rss.xml'), :sanitizer => NotSaneSanitizer.new)
82
+
83
+ @feed = @feed_parser.parse
84
+
85
+ @feed.items.first.content.should_not =~ (/flowdock/i)
86
+ end
87
+
88
+ it "should sanitize custom fields" do
89
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', 'sanitize.me.rss.xml'), :sanitizer => NotSaneSanitizer.new, :fields_to_sanitize => [:author, :content])
90
+
91
+ @feed = @feed_parser.parse
92
+
93
+ @feed.items.first.author.should == 'Sanitized'
94
+ end
95
+
96
+ it_should_behave_like "feed parser"
97
+ end
98
+
99
+ describe "atom feeds" do
100
+ before :each do
101
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', 'smashingmagazine.atom.xml'))
102
+ end
103
+
104
+ after :each do
105
+ @feed.type.should == :atom
106
+ end
107
+
108
+ {
109
+ 'gcal.atom.xml' => {
110
+ :title => "dokaus.net",
111
+ :url => "http://www.google.com/calendar/feeds/gqqcve4dv1skp0ppb3tmbcqtko%40group.calendar.google.com/public/basic?max-results=25",
112
+ # items: [] # <- fill in if you want to
113
+ },
114
+ 'smashingmagazine.atom.xml' => {
115
+ :title => "Smashing Magazine",
116
+ :url => "http://www.smashingmagazine.com/feed/atom/",
117
+ # items: [] # <- fill in if you want to
118
+ }
119
+ }.each do |atom_fixture, test_cases|
120
+ it "should parse #{atom_fixture}" do
121
+ @feed_parser = FeedParser.new(:url => File.join(File.dirname(__FILE__), 'fixtures', atom_fixture))
122
+
123
+ @feed = @feed_parser.parse
124
+
125
+ case_tester(test_cases)
126
+ end
127
+ end
128
+
129
+ it_should_behave_like "feed parser"
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,130 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
3
+
4
+ <channel>
5
+ <title>TechCrunch</title>
6
+
7
+ <link>http://techcrunch.com</link>
8
+ <description>TechCrunch is a group-edited blog that profiles the companies, products and events defining and transforming the new web.</description>
9
+ <lastBuildDate>Fri, 12 Nov 2010 12:16:33 +0000</lastBuildDate>
10
+ <language>en</language>
11
+ <sy:updatePeriod>hourly</sy:updatePeriod>
12
+ <sy:updateFrequency>1</sy:updateFrequency>
13
+ <generator>http://wordpress.com/</generator>
14
+ <cloud domain="techcrunch.com" port="80" path="/?rsscloud=notify" registerProcedure="" protocol="http-post" />
15
+ <image><link>http://www.techcrunch.com</link><url>http://www.techcrunch.com/wp-content/themes/techcrunchmu/images/techcrunch_logo.png</url><title>TechCrunch</title></image>
16
+ <atom:link rel="search" type="application/opensearchdescription+xml" href="http://techcrunch.com/osd.xml" title="TechCrunch" />
17
+
18
+ <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Techcrunch" /><feedburner:info uri="techcrunch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://techcrunch.com/?pushpress=hub" /><feedburner:emailServiceId>Techcrunch</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Techcrunch" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FTechcrunch" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item>
19
+ <title>A World Of Tweets</title>
20
+ <link>http://feedproxy.google.com/~r/Techcrunch/~3/AkxOBCtgmWc/</link>
21
+ <comments>http://techcrunch.com/2010/11/12/a-world-of-tweets/#comments</comments>
22
+ <pubDate>Fri, 12 Nov 2010 12:10:59 +0000</pubDate>
23
+ <dc:creator>Robin Wauters</dc:creator>
24
+ <category><![CDATA[TC]]></category>
25
+ <category><![CDATA[a world of tweets]]></category>
26
+ <category><![CDATA[frog design]]></category>
27
+ <category><![CDATA[Twitter]]></category>
28
+
29
+ <guid isPermaLink="false">http://techcrunch.com/?p=243380</guid>
30
+ <description><![CDATA[<img src="http://tctechcrunch.files.wordpress.com/2010/11/a-world-of-tweets.jpg" />
31
+
32
+ Chances are I'm late to the party, given how many Facebook 'likes' and retweets this project seems to have garnered already, but I hadn't yet seen it yet so here goes:
33
+
34
+ Some folks over at <a href="http://www.crunchbase.com/company/frog-design">frog design</a> have hacked together <a href="http://aworldoftweets.frogdesign.com/">A World Of Tweets</a>, a Web-based app that <a href="http://designmind.frogdesign.com/blog/a-world-of-tweets.html">visualizes geo-located tweets</a> from around the globe.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243380&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
35
+ <content:encoded><![CDATA[<p><img class="aligncenter" src="http://tctechcrunch.files.wordpress.com/2010/11/a-world-of-tweets.jpg" alt="" /></p>
36
+ <p>Chances are I&#8217;m late to the party, given how many Facebook &#8216;likes&#8217; and retweets this project seems to have garnered already, but I hadn&#8217;t yet seen it yet so here goes:</p>
37
+ <p>Some folks over at <a href="http://www.crunchbase.com/company/frog-design">frog design</a> have hacked together <a>A World Of Tweets</a>, a Web-based app that <a href="http://designmind.frogdesign.com/blog/a-world-of-tweets.html">visualizes geo-located tweets</a> from around the globe.</p>
38
+ <p>The project, which was started by two frog design employees as a personal experiment with <a href="http://dev.twitter.com/pages/streaming_api">Twitter&#8217;s Streaming API</a> and the HTML5 canvas tag, is all about &#8220;playing with geography and bits of information&#8221;. It&#8217;s also pretty cool to look at.</p>
39
+ <p>The app shows visitors where people are tweeting /from, in realtime, in the past hour. The more tweets come from a specific region, the &#8220;hotter&#8221; it becomes.</p>
40
+ <p>From frog design&#8217;s blog post:</p>
41
+ <blockquote><p>Integrating technology and design, the application was developed in HTML5 deploying the Twitter Streaming API and the Yahoo! Placemaker service to merge geotagged tweets on one single map, processing more than 1.4 million tweets in just 8 days. </p>
42
+ <p>Due to the growth of automated geo-tagging via mobile devices, the exceptional tweet locations range from the Sahara Desert to Polar Circle diving to the middle of the Atlantic Ocean.</p></blockquote>
43
+ <p>You can visualize tweets in the form of a heatmap, with &#8216;smoky clouds&#8217; and either in map or satellite view. If you have 3D red cyan glasses, you can even dive into the &#8220;3D stereo view&#8221;.</p>
44
+ <p>At the time of this writing, they&#8217;re close to processing more than 2 million tweets from 200 countries (they started processing on November 1).</p>
45
+ <p>Nifty indeeed.</p>
46
+ <div class="cbw snap_nopreview"><div class="cbw_header"><script src="http://www.crunchbase.com/javascripts/widget.js" type="text/javascript"></script><div class="cbw_header_text"><a href="http://www.crunchbase.com/">CrunchBase Information</a></div></div><div class="cbw_content"><div class="cbw_subheader"><a href="http://www.crunchbase.com/company/twitter">Twitter</a></div><div class="cbw_subcontent"><script src="http://www.crunchbase.com/cbw/company/twitter.js" type="text/javascript"></script></div><div class="cbw_footer">Information provided by <a href="http://www.crunchbase.com/">CrunchBase</a></div></div></div>
47
+ <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tctechcrunch.wordpress.com/243380/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tctechcrunch.wordpress.com/243380/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tctechcrunch.wordpress.com/243380/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243380&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />
48
+ <p><a href="http://feedads.g.doubleclick.net/~at/fY8_vz4qPXPVfAowTC_eqfCMDg8/0/da"><img src="http://feedads.g.doubleclick.net/~at/fY8_vz4qPXPVfAowTC_eqfCMDg8/0/di" border="0" ismap="true"></img></a><br/>
49
+ <a href="http://feedads.g.doubleclick.net/~at/fY8_vz4qPXPVfAowTC_eqfCMDg8/1/da"><img src="http://feedads.g.doubleclick.net/~at/fY8_vz4qPXPVfAowTC_eqfCMDg8/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
50
+ <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=2mJPEYqXBVI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=AkxOBCtgmWc:cJIT965ig-M:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=AkxOBCtgmWc:cJIT965ig-M:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=AkxOBCtgmWc:cJIT965ig-M:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=qj6IDK7rITs" border="0"></img></a>
51
+ </div><img src="http://feeds.feedburner.com/~r/Techcrunch/~4/AkxOBCtgmWc" height="1" width="1"/>]]></content:encoded>
52
+ <wfw:commentRss>http://techcrunch.com/2010/11/12/a-world-of-tweets/feed/</wfw:commentRss>
53
+ <slash:comments>0</slash:comments>
54
+
55
+ <media:content url="http://1.gravatar.com/avatar/9ab06106c89a573cd4ef50d04ce3203c?s=96&amp;d=identicon&amp;r=G" medium="image">
56
+ <media:title type="html">robinw</media:title>
57
+ </media:content>
58
+
59
+ <media:content url="http://tctechcrunch.files.wordpress.com/2010/11/a-world-of-tweets.jpg" medium="image" />
60
+ <feedburner:origLink>http://techcrunch.com/2010/11/12/a-world-of-tweets/</feedburner:origLink></item>
61
+ <item>
62
+ <title>MiniTycoon Casino Becomes Number One Social Games On The iPhone</title>
63
+ <link>http://feedproxy.google.com/~r/Techcrunch/~3/_6Ri38GttvY/</link>
64
+ <comments>http://techcrunch.com/2010/11/12/minitycoon-casino-becomes-number-one-social-games-on-the-iphone/#comments</comments>
65
+ <pubDate>Fri, 12 Nov 2010 09:57:19 +0000</pubDate>
66
+ <dc:creator>Mike Butcher</dc:creator>
67
+ <category><![CDATA[TC]]></category>
68
+
69
+ <guid isPermaLink="false">http://techcrunch.com/?p=243373</guid>
70
+ <description><![CDATA[<img src="http://eu.techcrunch.com/wp-content/uploads/photo-11.png" class="shot2" />Less than a week after its global launch, <a href="http://www.sgn.com/games.php?name=mini_tycoon">MiniTycoon Casino,</a> is now the number one mobile social game on the iPhone ahead of the real social games including Empire City, TapZoo, Restaurant Story and Farmville. This is <a href="http://www.sgn.com/">SGN's</a> first pure social game on the iPhone and iPod Touch. No doubt as a result of its social features, it's also now the number one casino game, although you don't bet real money but instead purchase virtual goods to pimp out your place, Soprano like.
71
+
72
+ I caught up with CEO and founder Shervin Pishevar at the Monaco Media Forum to discuss the news, video below.
73
+
74
+ <a href="http://techcrunch.com/2010/09/29/sgn-mini-tycoon/">Launched at TechCrunch Disrupt</a> in September, it's available free in the App Store <a href="http://itunes.apple.com/us/app/minitycoon-casino/id395928305?mt=8#">here.</a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243373&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
75
+ <content:encoded><![CDATA[<p><img src="http://eu.techcrunch.com/wp-content/uploads/photo-11.png" class="shot2" />Less than a week after its global launch, <a href="http://www.sgn.com/games.php?name=mini_tycoon">MiniTycoon Casino,</a> is now the number one mobile social game on the iPhone ahead of the real social games including Empire City, TapZoo, Restaurant Story and Farmville. This is <a href="http://www.sgn.com/">SGN&#8217;s</a> first pure social game on the iPhone and iPod Touch. No doubt as a result of its social features, it&#8217;s also now the number one casino game, although you don&#8217;t bet real money but instead purchase virtual goods to pimp out your place, Soprano like.</p>
76
+ <p>I caught up with CEO and founder Shervin Pishevar at the Monaco Media Forum to discuss the news, video below.</p>
77
+ <p><a href="http://techcrunch.com/2010/09/29/sgn-mini-tycoon/">Launched at TechCrunch Disrupt</a> in September, it&#8217;s available free in the App Store <a href="http://itunes.apple.com/us/app/minitycoon-casino/id395928305?mt=8#">here.</a></p>
78
+ <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tctechcrunch.wordpress.com/243373/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tctechcrunch.wordpress.com/243373/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tctechcrunch.wordpress.com/243373/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243373&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />
79
+ <p><a href="http://feedads.g.doubleclick.net/~at/jiRLQ49ug9QNeJhUvMxMQMsD0nY/0/da"><img src="http://feedads.g.doubleclick.net/~at/jiRLQ49ug9QNeJhUvMxMQMsD0nY/0/di" border="0" ismap="true"></img></a><br/>
80
+ <a href="http://feedads.g.doubleclick.net/~at/jiRLQ49ug9QNeJhUvMxMQMsD0nY/1/da"><img src="http://feedads.g.doubleclick.net/~at/jiRLQ49ug9QNeJhUvMxMQMsD0nY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
81
+ <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=2mJPEYqXBVI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=_6Ri38GttvY:oVaVP8m75ww:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=_6Ri38GttvY:oVaVP8m75ww:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=_6Ri38GttvY:oVaVP8m75ww:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=qj6IDK7rITs" border="0"></img></a>
82
+ </div><img src="http://feeds.feedburner.com/~r/Techcrunch/~4/_6Ri38GttvY" height="1" width="1"/>]]></content:encoded>
83
+ <wfw:commentRss>http://techcrunch.com/2010/11/12/minitycoon-casino-becomes-number-one-social-games-on-the-iphone/feed/</wfw:commentRss>
84
+ <slash:comments>0</slash:comments>
85
+
86
+ <media:content url="http://1.gravatar.com/avatar/b135cea22fcda40ebd49010703f1d4b8?s=96&amp;d=identicon&amp;r=G" medium="image">
87
+ <media:title type="html">mike-butcher</media:title>
88
+ </media:content>
89
+
90
+ <media:content url="http://eu.techcrunch.com/wp-content/uploads/photo-11.png" medium="image" />
91
+ <feedburner:origLink>http://techcrunch.com/2010/11/12/minitycoon-casino-becomes-number-one-social-games-on-the-iphone/</feedburner:origLink></item>
92
+ <item>
93
+ <title>Facebook’s Gmail Killer, Project Titan, Is Coming On Monday</title>
94
+ <link>http://feedproxy.google.com/~r/Techcrunch/~3/wv3Bpz2Nf3k/</link>
95
+ <comments>http://techcrunch.com/2010/11/11/facebook-gmail-titan/#comments</comments>
96
+ <pubDate>Fri, 12 Nov 2010 07:47:50 +0000</pubDate>
97
+ <dc:creator>Jason Kincaid</dc:creator>
98
+ <category><![CDATA[TC]]></category>
99
+ <category><![CDATA[Facebook]]></category>
100
+
101
+ <guid isPermaLink="false">http://techcrunch.com/?p=243323</guid>
102
+ <description><![CDATA[<img class="shot2" src="http://tctechcrunch.files.wordpress.com/2010/11/fblogo.png" alt="" />Back in February we wrote about Facebook's secret <a href="http://techcrunch.com/2010/02/05/facebooks-project-titan-a-full-featured-webmail-product/">Project Titan</a> — a web-based email client that we hear is unofficially referred to internally as its "Gmail killer". Now we've heard from sources that this is indeed what's coming on Monday during Facebook's <a href="http://techcrunch.com/2010/11/10/facebook-november-event/">special event</a>, alongside personal @facebook.com email addresses for users.
103
+
104
+ This isn't a big surprise — the event invites Facebook sent out hinted strongly that the news would have something to do with its Inbox, sparking plenty of speculation that the event could be related to Titan. Our understanding is that this is more than just a UI refresh for Facebook's existing messaging service with POP access tacked on. Rather, Facebook is building a full-fledged webmail client, and while it may only be in early stages come its launch Monday, there's a huge amount of potential here.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243323&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
105
+ <content:encoded><![CDATA[<p><img class="shot2" src="http://tctechcrunch.files.wordpress.com/2010/11/fblogo.png" alt="" />Back in February we wrote about Facebook&#8217;s secret <a href="http://techcrunch.com/2010/02/05/facebooks-project-titan-a-full-featured-webmail-product/">Project Titan</a> — a web-based email client that we hear is unofficially referred to internally as its &#8220;Gmail killer&#8221;. Now we&#8217;ve heard from sources that this is indeed what&#8217;s coming on Monday during Facebook&#8217;s <a href="http://techcrunch.com/2010/11/10/facebook-november-event/">special event</a>, alongside personal @facebook.com email addresses for users.</p>
106
+ <p>This isn&#8217;t a big surprise — the event invites Facebook sent out hinted strongly that the news would have something to do with its Inbox, sparking plenty of speculation that the event could be related to Titan. Our understanding is that this is more than just a UI refresh for Facebook&#8217;s existing messaging service with POP access tacked on. Rather, Facebook is building a full-fledged webmail client, and while it may only be in early stages come its launch Monday, there&#8217;s a huge amount of potential here.</p>
107
+ <p>Facebook has the world&#8217;s most popular photos product, the most popular events product, and soon will have a very popular local deals product as well.  It can tweak the design of its webmail client to display content from each of these in a seamless fashion (and don&#8217;t forget messages from games, or payments via Facebook Credits). And there&#8217;s also the social element: Facebook knows who your friends are and how closely you&#8217;re connected to them; it can probably do a pretty good job figuring out which personal emails you want to read most and prioritize them accordingly.</p>
108
+ <p>Oh, and assuming our sources prove accurate, this explains the timing of the <a href="http://techcrunch.com/2010/11/09/facebook-slaps-google-openness-doesnt-mean-being-open-when-its-convenient/">Google/Facebook slap fight </a>over contact information.</p>
109
+ <p>We&#8217;ll keep digging for more details and will have full coverage on Monday.<br />
110
+ <img src="http://tctechcrunch.files.wordpress.com/2010/11/fb.jpg?w=630&amp;h=459" alt="" /></p>
111
+ <p><em>Image by <a href="http://www.flickr.com/photos/spencereholtaway/3376955055/">Spencereholtaway</a></em><br />
112
+ <div class="cbw snap_nopreview"><div class="cbw_header"><script src="http://www.crunchbase.com/javascripts/widget.js" type="text/javascript"></script><div class="cbw_header_text"><a href="http://www.crunchbase.com/">CrunchBase Information</a></div></div><div class="cbw_content"><div class="cbw_subheader"><a href="http://www.crunchbase.com/company/facebook">Facebook</a></div><div class="cbw_subcontent"><script src="http://www.crunchbase.com/cbw/company/facebook.js" type="text/javascript"></script></div><div class="cbw_footer">Information provided by <a href="http://www.crunchbase.com/">CrunchBase</a></div></div></div></p>
113
+ <br /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/tctechcrunch.wordpress.com/243323/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/tctechcrunch.wordpress.com/243323/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/tctechcrunch.wordpress.com/243323/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=techcrunch.com&amp;blog=11718616&amp;post=243323&amp;subd=tctechcrunch&amp;ref=&amp;feed=1" width="1" height="1" />
114
+ <p><a href="http://feedads.g.doubleclick.net/~at/hq77QLZgQy_A9E63a6trlWrkRTw/0/da"><img src="http://feedads.g.doubleclick.net/~at/hq77QLZgQy_A9E63a6trlWrkRTw/0/di" border="0" ismap="true"></img></a><br/>
115
+ <a href="http://feedads.g.doubleclick.net/~at/hq77QLZgQy_A9E63a6trlWrkRTw/1/da"><img src="http://feedads.g.doubleclick.net/~at/hq77QLZgQy_A9E63a6trlWrkRTw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
116
+ <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:2mJPEYqXBVI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=2mJPEYqXBVI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:-BTjWOF_DHI"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=wv3Bpz2Nf3k:1Th1_ZA_eyQ:-BTjWOF_DHI" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/Techcrunch?i=wv3Bpz2Nf3k:1Th1_ZA_eyQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/Techcrunch?a=wv3Bpz2Nf3k:1Th1_ZA_eyQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/Techcrunch?d=qj6IDK7rITs" border="0"></img></a>
117
+ </div><img src="http://feeds.feedburner.com/~r/Techcrunch/~4/wv3Bpz2Nf3k" height="1" width="1"/>]]></content:encoded>
118
+ <wfw:commentRss>http://techcrunch.com/2010/11/11/facebook-gmail-titan/feed/</wfw:commentRss>
119
+ <slash:comments>0</slash:comments>
120
+
121
+ <media:content url="http://0.gravatar.com/avatar/c274c36be9d27b1b38e145a5ce51c7ac?s=96&amp;d=identicon&amp;r=G" medium="image">
122
+ <media:title type="html">jason</media:title>
123
+ </media:content>
124
+
125
+ <media:content url="http://tctechcrunch.files.wordpress.com/2010/11/fblogo.png" medium="image" />
126
+
127
+ <media:content url="http://tctechcrunch.files.wordpress.com/2010/11/fb.jpg?w=630&amp;h=459" medium="image" />
128
+ <feedburner:origLink>http://techcrunch.com/2010/11/11/facebook-gmail-titan/</feedburner:origLink></item>
129
+ </channel>
130
+ </rss>