feat: タグ名を別管理に変更(#215) (#219)

Merge branch 'main' into feature/215

#215 ニコニコ同期テスト

#215 テスト・ケース追加

#215 テスト・ケース追加

#215 テスト・ケース追加

#215 テスト・ケース追加

Merge remote-tracking branch 'origin/main' into feature/215

Merge branch 'main' into feature/215

#215

#215

Merge remote-tracking branch 'origin/main' into feature/215

#215

Co-authored-by: miteruzo <miteruzo@naver.com>
Reviewed-on: #219
This commit was merged in pull request #219.
This commit is contained in:
2026-01-15 12:40:41 +09:00
parent 74141f2a84
commit fa2030f9a5
34 changed files with 1268 additions and 119 deletions
+15 -16
View File
@@ -4,6 +4,7 @@ namespace :nico do
require 'open3'
require 'open-uri'
require 'nokogiri'
require 'set'
fetch_thumbnail = -> url do
html = URI.open(url, read_timeout: 60, 'User-Agent' => 'Mozilla/5.0').read
@@ -12,9 +13,9 @@ namespace :nico do
doc.at('meta[name="thumbnail"]')&.[]('content').presence
end
def sync_post_tags! post, desired_tag_ids
def sync_post_tags! post, desired_tag_ids, current_ids: nil
current_ids ||= PostTag.kept.where(post_id: post.id).pluck(:tag_id).to_set
desired_ids = desired_tag_ids.compact.to_set
current_ids = post.tags.pluck(:id).to_set
to_add = desired_ids - current_ids
to_remove = current_ids - desired_ids
@@ -43,12 +44,12 @@ namespace :nico do
data = JSON.parse(stdout)
data.each do |datum|
post = Post.where('url LIKE ?', '%nicovideo.jp%').find { |post|
post.url =~ %r{#{ Regexp.escape(datum['code']) }(?!\d)}
}
code = datum['code']
post = Post.where('url REGEXP ?', "nicovideo\\.jp/watch/#{ Regexp.escape(code) }([^0-9]|$)")
.first
unless post
title = datum['title']
url = "https://www.nicovideo.jp/watch/#{ datum['code'] }"
url = "https://www.nicovideo.jp/watch/#{ code }"
thumbnail_base = fetch_thumbnail.(url) rescue nil
post = Post.new(title:, url:, thumbnail_base:, uploaded_user: nil)
if thumbnail_base.present?
@@ -62,21 +63,19 @@ namespace :nico do
sync_post_tags!(post, [Tag.tagme.id])
end
kept_tags = post.tags.reload
kept_non_nico_ids = kept_tags.where.not(category: 'nico').pluck(:id).to_set
kept_ids = PostTag.kept.where(post_id: post.id).pluck(:tag_id).to_set
kept_non_nico_ids = post.tags.where.not(category: 'nico').pluck(:id).to_set
desired_nico_ids = []
desired_non_nico_ids = []
datum['tags'].each do |raw|
name = "nico:#{ raw }"
tag = Tag.find_or_initialize_by(name:) do |t|
t.category = 'nico'
end
tag.save! if tag.new_record?
tag = Tag.find_or_create_by_tag_name!(name, category: 'nico')
desired_nico_ids << tag.id
unless tag.in?(kept_tags)
desired_non_nico_ids.concat(tag.linked_tags.pluck(:id))
desired_nico_ids.concat(tag.linked_tags.pluck(:id))
unless tag.id.in?(kept_ids)
linked_ids = tag.linked_tags.pluck(:id)
desired_non_nico_ids.concat(linked_ids)
desired_nico_ids.concat(linked_ids)
end
end
desired_nico_ids.uniq!
@@ -89,7 +88,7 @@ namespace :nico do
end
desired_all_ids.uniq!
sync_post_tags!(post, desired_all_ids)
sync_post_tags!(post, desired_all_ids, current_ids: kept_ids)
end
end
end