URL 正規化 (#409) #410

マージ済み
みてるぞ が 4 個のコミットを feature/409 から main へマージ 2026-07-14 12:38:03 +09:00
コミット f50134e458 の変更だけを表示してゐます - すべてのコミットを表示
+45 -31
ファイルの表示
@@ -1,44 +1,58 @@
class CreatePostUrlSanitisationRules < ActiveRecord::Migration[8.0] class CreatePostUrlSanitisationRules < ActiveRecord::Migration[8.0]
class PostUrlSanitisationRule < ActiveRecord::Base
self.table_name = 'post_url_sanitisation_rules'
end
def up def up
create_table :post_url_sanitisation_rules, create_table :post_url_sanitisation_rules, id: :integer, primary_key: :priority do |t|
id: :integer,
primary_key: :priority do |t|
t.string :source_pattern, null: false t.string :source_pattern, null: false
t.string :replacement, null: false t.string :replacement, null: false
t.timestamps t.timestamps
t.datetime :discarded_at t.datetime :discarded_at
t.index :source_pattern, unique: true t.index :source_pattern, unique: true
t.index :discarded_at t.index :discarded_at
end end
now = ActiveRecord::Base.connection.quote(Time.current) now = Time.current
execute <<~SQL
INSERT INTO PostUrlSanitisationRule.insert_all!([
post_url_sanitisation_rules(priority, source_pattern, replacement, created_at, updated_at) { priority: 10,
VALUES source_pattern: '\Ahttps?://youtu\.be/([^/?#]+)(?:[?#].*)?\z',
(10, '\\Ahttps?://youtu\\\\.be/([^/?#]+)(?:[?#].*)?\\z', replacement: 'https://www.youtube.com/watch?v=\1',
'https://www.youtube.com/watch?v=\\\\1', created_at: now,
#{ now }, #{ now }) updated_at: now },
, (20, '\\Ahttps?://(?:www\\\\.|m\\\\.)?youtube\\\\.com/live/([^/?#]+)(?:[?#].*)?\\z', { priority: 20,
'https://www.youtube.com/watch?v=\\\\1', source_pattern: '\Ahttps?://(?:www\.|m\.)?youtube\.com/live/([^/?#]+)(?:[?#].*)?\z',
#{ now }, #{ now }) replacement: 'https://www.youtube.com/watch?v=\1',
, (30, '\\Ahttps?://(?:www\\\\.|m\\\\.)?youtube\\\\.com/shorts/([^/?#]+)(?:[?#].*)?\\z', created_at: now,
'https://www.youtube.com/watch?v=\\\\1', updated_at: now },
#{ now }, #{ now }) { priority: 30,
, (40, '\\Ahttps?://(?:www\\\\.|m\\\\.)?youtube\\\\.com/embed/([^/?#]+)(?:[?#].*)?\\z', source_pattern: '\Ahttps?://(?:www\.|m\.)?youtube\.com/shorts/([^/?#]+)(?:[?#].*)?\z',
'https://www.youtube.com/watch?v=\\\\1', replacement: 'https://www.youtube.com/watch?v=\1',
#{ now }, #{ now }) created_at: now,
, (50, '\\Ahttps?://(?:www\\\\.|m\\\\.)?youtube\\\\.com/watch\\\\?(?:[^#&]+&)*v=([^&#]+)(?:[&#].*)?\\z', updated_at: now },
'https://www.youtube.com/watch?v=\\\\1', { priority: 40,
#{ now }, #{ now }) source_pattern: '\Ahttps?://(?:www\.|m\.)?youtube\.com/embed/([^/?#]+)(?:[?#].*)?\z',
, (60, '\\Ahttps?://nico\\\\.ms/([^/?#]+)(?:[?#].*)?\\z', replacement: 'https://www.youtube.com/watch?v=\1',
'https://www.nicovideo.jp/watch/\\\\1', created_at: now,
#{ now }, #{ now }) updated_at: now },
, (70, '\\Ahttps?://(?:www\\\\.)?nicovideo\\\\.jp/watch/([^?#/]+)(?:[?#].*)?\\z', { priority: 50,
'https://www.nicovideo.jp/watch/\\\\1', source_pattern:
#{ now }, #{ now }) '\Ahttps?://(?:www\.|m\.)?youtube\.com/watch\?(?:[^#&]+&)*v=([^&#]+)(?:[&#].*)?\z',
; replacement: 'https://www.youtube.com/watch?v=\1',
SQL created_at: now,
updated_at: now },
{ priority: 60,
source_pattern: '\Ahttps?://nico\.ms/([^/?#]+)(?:[?#].*)?\z',
replacement: 'https://www.nicovideo.jp/watch/\1',
created_at: now,
updated_at: now },
{ priority: 70,
source_pattern: '\Ahttps?://(?:www\.)?nicovideo\.jp/watch/([^?#/]+)(?:[?#].*)?\z',
replacement: 'https://www.nicovideo.jp/watch/\1',
created_at: now,
updated_at: now }])
end end
def down def down