diff --git a/backend/lib/tasks/sync_nico.rake b/backend/lib/tasks/sync_nico.rake index 97af101..d6e4f92 100644 --- a/backend/lib/tasks/sync_nico.rake +++ b/backend/lib/tasks/sync_nico.rake @@ -2,6 +2,16 @@ namespace :nico do desc 'ニコニコ DB 同期' task sync: :environment do require 'open3' + require 'open-uri' + require 'nokogiri' + + fetch_thumbnail = -> url { + html = URI.open(url, read_timeout: 60, 'User-Agent' => 'Mozilla/5.0').read + doc = Nokogiri::HTML(html) + + doc.at('meta[name="thumbnail"]')&.[]('content').presence + } + mysql_user = ENV['MYSQL_USER'] mysql_pass = ENV['MYSQL_PASS'] nizika_nico_path = ENV['NIZIKA_NICO_PATH'] @@ -18,18 +28,39 @@ namespace :nico do unless post title = datum['title'] url = "https://www.nicovideo.jp/watch/#{ datum['code'] }" - post = Post.new(title:, url:, thumbnail_base: '', uploaded_user: nil) + thumbnail_base = fetch_thumbnail.(url) || '' rescue '' + post = Post.new(title:, url:, thumbnail_base:, uploaded_user: nil) + if thumbnail_base.present? + post.thumbnail.attach( + io: URI.open(thumbnail_base), + filename: File.basename(URI.parse(thumbnail_base).path), + content_type: 'image/jpeg') + end post.save! + post.resized_thumbnail! end - post.tags.destroy(post.tags.where(category: 'nico')) - datum['tags'].each do |name| - name = "nico:#{ name }" - tag = Tag.find_or_initialize_by(name:, category: 'nico') - post.tags << tag + current_tags = post.tags.where(category: 'nico').pluck(:name).sort + new_tags = datum['tags'].map { |tag| "nico:#{ tag }" }.sort + if current_tags != new_tags + post.tags.destroy(post.tags.where(name: current_tags)) + new_tags.each do |name| + post.tags << Tag.find_or_initialize_by(name:, category: 'nico') + end + if post.tags.size < 20 + name = 'タグ希望' + post.tags.destroy(post.tags.find_by(name:)) + post.tags << Tag.find_or_initialize_by(name:) { |tag| + tag.category = 'meta' + } + end + name = 'bot操作' + post.tags.destroy(post.tags.find_by(name:)) + post.tags << Tag.find_or_initialize_by(name:) { |tag| + tag.category = 'meta' + } end end end end end -