Files
danbooru/app/logical/source/url/pixiv.rb
evazion 600bdc9ae6 pixiv: drop support for https://tc-pximg01.techorus-cdn.com urls.
This was an obsolete URL format briefly used by Pixiv around 2019-2020.
There were only ~80 posts with sources using this format. They have been
manually fixed.
2022-08-24 15:54:10 -05:00

151 lines
5.7 KiB
Ruby

# frozen_string_literal: true
module Source
class URL::Pixiv < Source::URL
attr_reader :work_id, :image_type, :page, :username, :user_id
def self.match?(url)
return false if Source::URL::Fanbox.match?(url) || Source::URL::PixivSketch.match?(url) || Source::URL::Booth.match?(url)
url.domain.in?(%w[pximg.net pixiv.net pixiv.me pixiv.cc])
end
def parse
case [subdomain, domain, *path_segments]
# https://i.pximg.net/img-original/img/2014/10/03/18/10/20/46324488_p0.png
# https://i.pximg.net/img-master/img/2014/10/03/18/10/20/46324488_p0_master1200.jpg
# https://i.pximg.net/c/250x250_80_a2/img-master/img/2014/10/29/09/27/19/46785915_p0_square1200.jpg
# https://i.pximg.net/img-zip-ugoira/img/2016/04/09/14/25/29/56268141_ugoira1920x1080.zip
# https://i.pximg.net/img-original/img/2019/05/27/17/59/33/74932152_ugoira0.jpg
# https://i.pximg.net/c/360x360_70/custom-thumb/img/2022/03/08/00/00/56/96755248_p0_custom1200.jpg
# https://i-f.pximg.net/img-original/img/2020/02/19/00/40/18/79584713_p0.png
# http://i1.pixiv.net/img-inf/img/2011/05/01/23/28/04/18557054_64x64.jpg
# http://i1.pixiv.net/img-inf/img/2011/05/01/23/28/04/18557054_s.png
#
# but not:
#
# https://i.pximg.net/novel-cover-original/img/2019/01/14/01/15/05/10617324_d84daae89092d96bbe66efafec136e42.jpg
in *, ("img-original" | "img-master" | "img-zip-ugoira" | "img-inf" | "custom-thumb") => type, "img", year, month, day, hour, min, sec, file if image_url?
@image_type = type
parse_filename
# http://img18.pixiv.net/img/evazion/14901720.png
# http://i2.pixiv.net/img18/img/evazion/14901720.png
# http://i1.pixiv.net/img07/img/pasirism/18557054_p1.png
in *, "img", username, file if image_url?
parse_filename
@username = username
# https://www.pixiv.net/en/artworks/46324488
# https://www.pixiv.net/artworks/46324488
in _, "pixiv.net", *, "artworks", work_id
@work_id = work_id
# http://www.pixiv.net/i/18557054
in _, "pixiv.net", "i", work_id
@work_id = work_id
# http://www.pixiv.net/member_illust.php?mode=medium&illust_id=18557054
# http://www.pixiv.net/member_illust.php?mode=big&illust_id=18557054
# http://www.pixiv.net/member_illust.php?mode=manga&illust_id=18557054
# http://www.pixiv.net/member_illust.php?mode=manga_big&illust_id=18557054&page=1
in _, "pixiv.net", "member_illust.php" if params[:illust_id].present?
@work_id = params[:illust_id]
# https://www.pixiv.net/member.php?id=339253
# http://www.pixiv.net/novel/member.php?id=76567
in _, "pixiv.net", *, "member.php" if params[:id].present?
@user_id = params[:id]
# https://www.pixiv.net/u/9202877
# https://www.pixiv.net/users/9202877
# https://www.pixiv.net/users/76567/novels
# https://www.pixiv.net/users/39598149/illustrations?p=1
# https://www.pixiv.net/user/13569921/series/81967
in _, "pixiv.net", ("u" | "user" | "users"), user_id, *rest
@user_id = user_id
# https://www.pixiv.net/en/users/9202877
# https://www.pixiv.net/en/users/76567/novels
in _, "pixiv.net", _, ("u" | "users"), user_id, *rest
@user_id = user_id
# https://www.pixiv.net/stacc/noizave
in _, "pixiv.net", "stacc", username
@username = username
# http://www.pixiv.me/noizave
in _, "pixiv.me", username
@username = username
# https://pixiv.cc/zerousagi/
in _, "pixiv.cc", username
@username = username
else
nil
end
end
def parse_filename
case filename.split("_")
# https://i.pximg.net/img-original/img/2014/10/03/18/10/20/46324488_p0.png
# https://i.pximg.net/img-master/img/2014/10/03/18/10/20/46324488_p0_master1200.jpg
# http://i1.pixiv.net/img07/img/pasirism/18557054_p1.png
in /^\d+$/ => work_id, /^p\d+$/ => page, *rest
@work_id = work_id
@page = page.delete_prefix("p").to_i
# https://i.pximg.net/img-original/img/2019/05/27/17/59/33/74932152_ugoira0.jpg
# https://i.pximg.net/img-zip-ugoira/img/2016/04/09/14/25/29/56268141_ugoira1920x1080.zip
in /^\d+$/ => work_id, /^ugoira/
@work_id = work_id
@ugoira = true
# https://i.pximg.net/c/240x240/img-master/img/2017/04/04/08/57/38/62247364_master1200.jpg
# http://i1.pixiv.net/img53/img/themare/39735353_big_p1.jpg
# http://i2.pixiv.net/img18/img/evazion/14901720.png
# http://i2.pixiv.net/img18/img/evazion/14901720_m.png
# http://i2.pixiv.net/img18/img/evazion/14901720_s.png
# http://i1.pixiv.net/img-inf/img/2011/05/01/23/28/04/18557054_64x64.jpg
# http://i1.pixiv.net/img-inf/img/2011/05/01/23/28/04/18557054_s.png
in /^\d+$/ => work_id, *rest
@work_id = work_id
else
nil
end
end
def image_url?
# https://i.pximg.net/img-original/img/2014/10/03/18/10/20/46324488_p0.png
# https://i-f.pximg.net/img-original/img/2020/02/19/00/40/18/79584713_p0.png
# https://i2.pixiv.net/img04/img/syounen_no_uta/46170939_p0.jpg
# http://img18.pixiv.net/img/evazion/14901720.png
host.in?(%w[i.pximg.net i-f.pximg.net]) || host.match?(/\A(i\d+|img\d+)\.pixiv\.net\z/)
end
def full_image_url?
image_type.in?(%w[img-original img-zip-ugoira])
end
def is_ugoira?
@ugoira.present?
end
def page_url
"https://www.pixiv.net/artworks/#{work_id}" if work_id.present?
end
def profile_url
if user_id.present?
"https://www.pixiv.net/users/#{user_id}"
elsif username.present?
"https://www.pixiv.net/stacc/#{username}"
end
end
end
end