29 lines
758 B
Crystal
29 lines
758 B
Crystal
class GistScanner
|
|
GIST_HOST_AND_SCHEME = "https://#{GIST_HOST}"
|
|
|
|
getter paragraphs : Array(PostResponse::Paragraph)
|
|
|
|
def initialize(@paragraphs : Array(PostResponse::Paragraph))
|
|
end
|
|
|
|
def scan
|
|
maybe_urls = paragraphs.compact_map do |paragraph|
|
|
Monads::Try(PostResponse::IFrame).new(->{ paragraph.iframe })
|
|
.to_maybe
|
|
.fmap(->(iframe : PostResponse::IFrame) { iframe.mediaResource })
|
|
.fmap(->(media : PostResponse::MediaResource) { media.href })
|
|
.value_or(nil)
|
|
end
|
|
maybe_urls
|
|
.select { |url| url.starts_with?(GIST_HOST_AND_SCHEME) }
|
|
.map { |url| url_without_params(url) }
|
|
.uniq
|
|
end
|
|
|
|
def url_without_params(url)
|
|
uri = URI.parse(url)
|
|
uri.query = nil
|
|
uri.to_s
|
|
end
|
|
end
|