52 lines
1.5 KiB
Ruby
52 lines
1.5 KiB
Ruby
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
|