diff --git a/Gemfile.lock b/Gemfile.lock index e49c678..b3b69d0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -418,6 +418,7 @@ GEM PLATFORMS arm64-darwin-23 + arm64-darwin-24 x86_64-linux DEPENDENCIES diff --git a/app/controllers/api/conferences_controller.rb b/app/controllers/api/conferences_controller.rb index a427563..06509d5 100644 --- a/app/controllers/api/conferences_controller.rb +++ b/app/controllers/api/conferences_controller.rb @@ -1,10 +1,23 @@ require 'rss' +require_relative '../../services/conference/scraper_service' class Api::ConferencesController < ApiController skip_before_action :authenticate_request before_action :validate_topics, only: :create before_action :validate_params, only: :create + def scrape + url = params[:url] + unless url.present? + render json: { error: 'URL missing' }, status: :bad_request and return + end + result = ConferenceScraper::ScraperService.scrape(url) + if result[:error] + render json: { error: result[:error] }, status: :unprocessable_entity + else + render json: result + end + end def index @conferences = Conference.first(limit) rss = RSS::Maker.make('2.0') do |maker| diff --git a/app/services/conference/scraper_service.rb b/app/services/conference/scraper_service.rb new file mode 100644 index 0000000..4053766 --- /dev/null +++ b/app/services/conference/scraper_service.rb @@ -0,0 +1,24 @@ +require 'nokogiri' +require 'open-uri' + +module ConferenceScraper + class ScraperService + def self.scrape(url) + begin + html = URI.open(url) + doc = Nokogiri::HTML(html) + # Simple extraction logic (customize selectors as needed) + title = doc.at('title')&.text || doc.at('h1')&.text + date = doc.at('[itemprop*="startDate"], .date, .event-date')&.text + location = doc.at('[itemprop*="location"], .location, .event-location')&.text + { + title: title&.strip, + date: date&.strip, + location: location&.strip + } + rescue => e + { error: e.message } + end + end + end +end diff --git a/config/routes.rb b/config/routes.rb index 6d35f7b..198a5e2 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -19,6 +19,7 @@ resources :conferences, only: [:create, :index] do collection do get :cfp + post :scrape end end get '/webhooks/sync', to: 'webhooks#sync'