diff --git a/app/models/artist.rb b/app/models/artist.rb index fd6658bc8..01845410d 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -61,6 +61,17 @@ class Artist < ApplicationRecord def clear_url_string_changed self.url_string_changed = false end + + class_methods do + # Find all artist URLs matching `regex`, and replace the `from` regex with the `to` string. + def rewrite_urls(regex, from, to) + Artist.transaction do + Artist.joins(:urls).where_regex("artist_urls.url", regex).find_each do |artist| + artist.update!(url_string: artist.url_string.gsub(from, to)) + end + end + end + end end concerning :NameMethods do diff --git a/script/fixes/104_normalize_weibo_artist_urls.rb b/script/fixes/104_normalize_weibo_artist_urls.rb new file mode 100755 index 000000000..0d76dc0bf --- /dev/null +++ b/script/fixes/104_normalize_weibo_artist_urls.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby + +require_relative "base" + +with_confirmation do + # https://m.weibo.cn/u/7119279079 -> https://m.weibo.com/u/7119279079 + Artist.rewrite_urls('weibo\.cn', /weibo\.cn/, "weibo.com") + + # https://m.weibo.com/u/7119279079 -> https://www.weibo.com/u/7119279079 + Artist.rewrite_urls('m\.weibo\.com', /m\.weibo\.com/, "www.weibo.com") + + # https://weibo.com/u/5466604405 -> https://www.weibo.com/u/5466604405 + Artist.rewrite_urls('https?://weibo\.com', %r{https?://weibo\.com}, "https://www.weibo.com") + + # https://www.weibo.com/5493194708/profile?rightmod=1&wvr=6&mod=personnumber&is_all=1 -> https://www.weibo.com/5493194708/profile + Artist.rewrite_urls('weibo\.com.*\?.*', /(.*weibo\.com.*)(\?.*$)/, '\1') + + # https://www.weibo.com/5493194708/profile -> https://www.weibo.com/5493194708 + Artist.rewrite_urls('weibo.com/[0-9]+/profile', %r{/profile$}, "") + + # https://www.weibo.com/5493194708/home -> https://www.weibo.com/5493194708 + Artist.rewrite_urls('weibo.com/[0-9]+/home', %r{/home$}, "") +end diff --git a/script/fixes/base.rb b/script/fixes/base.rb index 4269eabb4..57b44ec63 100755 --- a/script/fixes/base.rb +++ b/script/fixes/base.rb @@ -3,9 +3,11 @@ require_relative "../../config/environment" # Run a block of code in a transaction, and only commit it after confirmation. def with_confirmation(&block) ApplicationRecord.transaction do - yield + CurrentUser.scoped(User.system, "127.0.0.1") do + yield - print "Commit? (yes/no): " - raise "abort" unless STDIN.readline.chomp == "yes" + print "Commit? (yes/no): " + raise "abort" unless STDIN.readline.chomp == "yes" + end end end