53 lines
1.7 KiB
Ruby
53 lines
1.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Source
|
|
class URL::PixivSketch < Source::URL
|
|
attr_reader :work_id, :username, :full_image_url
|
|
|
|
def self.match?(url)
|
|
url.host.in?(%w[sketch.pixiv.net img-sketch.pixiv.net img-sketch.pximg.net])
|
|
end
|
|
|
|
def parse
|
|
case [host, *path_segments]
|
|
|
|
# https://sketch.pixiv.net/items/5835314698645024323
|
|
in "sketch.pixiv.net", "items", work_id
|
|
@work_id = work_id
|
|
|
|
# https://img-sketch.pixiv.net/uploads/medium/file/4463372/8906921629213362989.jpg (page: https://sketch.pixiv.net/items/5835314698645024323)
|
|
# https://img-sketch.pximg.net/c!/w=540,f=webp:jpeg/uploads/medium/file/4463372/8906921629213362989.jpg
|
|
# https://img-sketch.pixiv.net/c/f_540/uploads/medium/file/9986983/8431631593768139653.jpg
|
|
in *, "uploads", "medium", "file", dir, file if image_url?
|
|
@full_image_url = "https://img-sketch.pixiv.net/uploads/medium/file/#{dir}/#{file}"
|
|
|
|
# https://sketch.pixiv.net/@user_ejkv8372
|
|
# https://sketch.pixiv.net/@user_ejkv8372/followings
|
|
in "sketch.pixiv.net", /^@/ => username, *rest
|
|
@username = username.delete_prefix("@")
|
|
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def image_url?
|
|
url.host.in?(%w[img-sketch.pixiv.net img-sketch.pximg.net])
|
|
end
|
|
|
|
def page_url
|
|
# https://sketch.pixiv.net/items/5835314698645024323
|
|
"https://sketch.pixiv.net/items/#{work_id}" if work_id.present?
|
|
end
|
|
|
|
def profile_url
|
|
"https://sketch.pixiv.net/@#{username}" if username.present?
|
|
end
|
|
|
|
def api_url
|
|
# https://sketch.pixiv.net/api/items/5835314698645024323.json (won't work in the browser; use curl)
|
|
"https://sketch.pixiv.net/api/items/#{work_id}.json" if work_id.present?
|
|
end
|
|
end
|
|
end
|