Skip to content

Commit 87d9436

Browse files
author
Matt Swanson
committed
initial opml parser working, needs styling
1 parent cb5c3bb commit 87d9436

File tree

13 files changed

+351
-9
lines changed

13 files changed

+351
-9
lines changed

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ gem "delayed_job_active_record"
1010

1111
gem "feedzirra", github: "pauldix/feedzirra"
1212
gem "loofah"
13+
gem "nokogiri"
1314

1415
group :production do
1516
gem "unicorn"

Gemfile.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ DEPENDENCIES
111111
faker
112112
feedzirra!
113113
loofah
114+
nokogiri
114115
pg
115116
pry
116117
rack-test

Rakefile

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@ task :fetch_feeds do
1111
FetchFeeds.new(Feed.all).fetch_all
1212
end
1313

14+
desc "Fetch single feed"
15+
task :fetch_feed => :id do
16+
# TODO
17+
end
18+
1419
desc "Clear the delayed_job queue."
1520
task :clear_jobs do
1621
Delayed::Job.delete_all

app.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ def render(*args)
3535
end
3636
end
3737

38-
require_relative "app/controllers/stories_controller"
38+
require_relative "app/controllers/stories_controller"
39+
require_relative "app/controllers/first_run_controller"
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require_relative "../../models/feed"
2+
require_relative "../../utils/opml_parser"
3+
4+
class ImportFromOpml
5+
ONE_HOUR = 60 * 60
6+
7+
def self.import(opml_contents, should_overwrite = false)
8+
feeds = OpmlParser.new.parse_feeds(opml_contents)
9+
10+
Feed.delete_all if should_overwrite
11+
12+
feeds.each do |feed|
13+
Feed.create(name: feed[:title],
14+
url: feed[:url],
15+
last_fetched: Time.now - ONE_HOUR)
16+
end
17+
end
18+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require_relative "../commands/feeds/import_from_opml"
2+
3+
class Stringer < Sinatra::Base
4+
get "/import" do
5+
erb :import
6+
end
7+
8+
post "/import" do
9+
ImportFromOpml.import(params["opml_file"][:tempfile].read, true)
10+
11+
redirect to("/")
12+
end
13+
end

app/tasks/fetch_feed.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ def initialize(feed, feed_parser = Feedzirra::Feed)
1010
end
1111

1212
def fetch
13-
result = @parser.fetch_and_parse(@feed.url)
13+
begin
14+
result = @parser.fetch_and_parse(@feed.url)
1415

15-
unless result.last_modified < @feed.last_fetched
16-
result.entries.each do |entry|
17-
StoryRepository.add(entry, @feed) if is_new?(entry)
18-
end
16+
unless result.last_modified < @feed.last_fetched
17+
result.entries.each do |entry|
18+
StoryRepository.add(entry, @feed) if is_new?(entry)
19+
end
1920

20-
FeedRepository.update_last_fetched(@feed, result.last_modified)
21+
FeedRepository.update_last_fetched(@feed, result.last_modified)
22+
end
23+
rescue
24+
puts "Something went wrong when parsing #{@feed.url}"
2125
end
2226

2327
result

app/utils/opml_parser.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
require "nokogiri"
2+
3+
class OpmlParser
4+
def parse_feeds(contents)
5+
doc = Nokogiri.XML(contents)
6+
7+
doc.xpath("//body//outline").inject([]) do |feeds, outline|
8+
feeds << {
9+
name: outline.attributes["title"].value,
10+
url: outline.attributes["xmlUrl"].value
11+
}
12+
end
13+
end
14+
end

app/views/import.erb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<form id="import" method="POST" action="/import" enctype="multipart/form-data">
2+
<input id="opml_file" name="opml_file" type="file" />
3+
<input type="submit" />
4+
</form>

app/views/index.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
</div>
7272
<% else %>
7373
<div id="zen">
74-
<span id="zero">&mdash; 0 &mdash;</span>
74+
<span id="zero">&ndash; 0 &ndash;</span>
7575
<p>You&#8217;ve reached RSS Zero&trade;</p>
7676
<p>
7777
<small>

0 commit comments

Comments
 (0)