From fd15fd6856460258d0855993e811f703f4f33828 Mon Sep 17 00:00:00 2001 From: Kyle Drake Date: Sat, 20 Jan 2024 18:32:18 -0600 Subject: [PATCH] use nokogiri for rss, return better results, index for speed --- Gemfile | 1 - Gemfile.lock | 3 --- app/site.rb | 4 ++-- migrations/123_events_rss_index.rb | 9 ++++++++ models/site.rb | 37 +++++++++++++++++------------- 5 files changed, 32 insertions(+), 22 deletions(-) create mode 100644 migrations/123_events_rss_index.rb diff --git a/Gemfile b/Gemfile index a7a24939..d9b88036 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,6 @@ gem 'facter', require: nil gem 'maxmind-db' gem 'json', '>= 2.3.0' gem 'nokogiri' -gem 'rss' gem 'webp-ffi' gem 'rszr' gem 'zip_tricks' diff --git a/Gemfile.lock b/Gemfile.lock index d261cb0f..2828c3ac 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -254,8 +254,6 @@ GEM netrc (~> 0.8) rexml (3.2.6) rinku (2.0.6) - rss (0.3.0) - rexml rszr (1.3.0) ruby-progressbar (1.13.0) ruby2_keywords (0.0.5) @@ -403,7 +401,6 @@ DEPENDENCIES redis-namespace rest-client rinku - rss rszr rubyzip sanitize diff --git a/app/site.rb b/app/site.rb index 2a25c047..4caf9be5 100644 --- a/app/site.rb +++ b/app/site.rb @@ -2,7 +2,7 @@ get '/site/:username.rss' do |username| site = Site[username: username] halt 404 if site.nil? content_type :xml - site.to_rss.to_xml + site.to_rss end get '/site/:username/?' do |username| @@ -374,4 +374,4 @@ post '/site/:username/confirm_phone' do # Will redirect to / automagically if phone was verified redirect "/site/#{current_site.username}/confirm_phone" -end \ No newline at end of file +end diff --git a/migrations/123_events_rss_index.rb b/migrations/123_events_rss_index.rb new file mode 100644 index 00000000..13b98022 --- /dev/null +++ b/migrations/123_events_rss_index.rb @@ -0,0 +1,9 @@ +Sequel.migration do + up { + DB.add_index :events, [:created_at, :site_id, :site_change_id, :is_deleted], name: :events_rss_index, order: {created_at: :desc} + } + + down { + DB.drop_index :events, :rss + } +end \ No newline at end of file diff --git a/models/site.rb b/models/site.rb index 1408f536..b769880b 100644 --- a/models/site.rb +++ b/models/site.rb @@ -1,6 +1,5 @@ # frozen_string_literal: true require 'tilt' -require 'rss' require 'nokogiri' require 'pathname' require 'zlib' @@ -1526,24 +1525,30 @@ class Site < Sequel::Model end def to_rss - RSS::Maker.make("2.0") do |m| - m.channel.title = title - m.channel.link = uri - m.channel.description = "Site feed for #{title}" - m.image.url = sharing_screenshot_url - m.image.title = title + site_change_events = events_dataset.exclude(is_deleted: true).exclude(site_change_id: nil).order(:created_at.desc).limit(10).all + Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml| + xml.rss('version' => '2.0') { + xml.channel { + xml.title title + xml.link uri + xml.description "Site feed for #{title}" + xml.image { + xml.url sharing_screenshot_url + xml.title title + } - latest_events.each do |event| - if event.site_change_id - m.items.new_item do |i| - i.title = "#{title} has been updated." - i.link = "https://neocities.org/site/#{username}?event_id=#{event.id.to_s}" - i.pubDate = event.created_at + site_change_events.each do |event| + xml.item { + xml.title "#{title} has been updated." + xml.link "https://neocities.org/site/#{username}?event_id=#{event.id.to_s}" + xml.pubDate event.created_at.rfc822 + xml.guid event.id.to_s + } end - end - end - end + } + } + end.to_xml end def empty_index?