class ScrapePanoptoJob < ApplicationJob queue_as :default def perform(*args) courses = Course.all courses.each do |course| self.scrape_course(course) end end # @param [Course] course def scrape_course(course) panopto_folder_ids = course.panopto_folders panopto_folder_ids.each do |folder_id| recording_data = Panopto::list_folder folder_id attributes = recording_data.map do |lecture_data| { title: lecture_data['title'], start_time: Time.new(lecture_data['start_time']), recording_uuid: lecture_data['panopto_delivery_id'], course_id: course.id, } end created = Recording.insert_all(attributes, unique_by: :recording_uuid, returning: [:id, :title, :course_id, :start_time]) created.each do |new_recording_attrs| new_recording = Recording.new(new_recording_attrs) # Find existing lecture to associate with this recording if (lecture = course.lectures.find_by( start_time: new_recording.start_time.beginning_of_hour + 15.minutes, )) next if lecture.recording.present? Recording.find(new_recording.id).update!(lecture: lecture) else # Else create a new lecture lecture = Lecture.create!( title: new_recording.nice_title, start_time: new_recording.start_time, course_id: new_recording.course_id, ) Recording.find(new_recording.id).update!(lecture: lecture) end end end end end