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