use nokogiri for rss, return better results, index for speed

This commit is contained in:
Kyle Drake 2024-01-20 18:32:18 -06:00
parent 7788437c33
commit fd15fd6856
5 changed files with 32 additions and 22 deletions

View file

@ -52,7 +52,6 @@ gem 'facter', require: nil
gem 'maxmind-db' gem 'maxmind-db'
gem 'json', '>= 2.3.0' gem 'json', '>= 2.3.0'
gem 'nokogiri' gem 'nokogiri'
gem 'rss'
gem 'webp-ffi' gem 'webp-ffi'
gem 'rszr' gem 'rszr'
gem 'zip_tricks' gem 'zip_tricks'

View file

@ -254,8 +254,6 @@ GEM
netrc (~> 0.8) netrc (~> 0.8)
rexml (3.2.6) rexml (3.2.6)
rinku (2.0.6) rinku (2.0.6)
rss (0.3.0)
rexml
rszr (1.3.0) rszr (1.3.0)
ruby-progressbar (1.13.0) ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5) ruby2_keywords (0.0.5)
@ -403,7 +401,6 @@ DEPENDENCIES
redis-namespace redis-namespace
rest-client rest-client
rinku rinku
rss
rszr rszr
rubyzip rubyzip
sanitize sanitize

View file

@ -2,7 +2,7 @@ get '/site/:username.rss' do |username|
site = Site[username: username] site = Site[username: username]
halt 404 if site.nil? halt 404 if site.nil?
content_type :xml content_type :xml
site.to_rss.to_xml site.to_rss
end end
get '/site/:username/?' do |username| get '/site/:username/?' do |username|
@ -374,4 +374,4 @@ post '/site/:username/confirm_phone' do
# Will redirect to / automagically if phone was verified # Will redirect to / automagically if phone was verified
redirect "/site/#{current_site.username}/confirm_phone" redirect "/site/#{current_site.username}/confirm_phone"
end end

View file

@ -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

View file

@ -1,6 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
require 'tilt' require 'tilt'
require 'rss'
require 'nokogiri' require 'nokogiri'
require 'pathname' require 'pathname'
require 'zlib' require 'zlib'
@ -1526,24 +1525,30 @@ class Site < Sequel::Model
end end
def to_rss def to_rss
RSS::Maker.make("2.0") do |m| site_change_events = events_dataset.exclude(is_deleted: true).exclude(site_change_id: nil).order(:created_at.desc).limit(10).all
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
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| site_change_events.each do |event|
if event.site_change_id xml.item {
m.items.new_item do |i| xml.title "#{title} has been updated."
i.title = "#{title} has been updated." xml.link "https://neocities.org/site/#{username}?event_id=#{event.id.to_s}"
i.link = "https://neocities.org/site/#{username}?event_id=#{event.id.to_s}" xml.pubDate event.created_at.rfc822
i.pubDate = event.created_at xml.guid event.id.to_s
}
end end
end }
end }
end end.to_xml
end end
def empty_index? def empty_index?