twitter: fix to handle extended tweets (fix #3254, #3072).

This commit is contained in:
evazion
2017-08-05 23:08:50 -05:00
parent 40e006f7cb
commit 8b70e0099b
3 changed files with 39 additions and 27 deletions

View File

@@ -1,5 +1,7 @@
module Sources::Strategies
class Twitter < Base
attr_reader :image_urls
def self.url_match?(url)
url =~ %r!https?://(?:mobile\.)?twitter\.com/\w+/status/\d+! || url =~ %r{https?://pbs\.twimg\.com/media/}
end
@@ -18,26 +20,23 @@ module Sources::Strategies
def api_response
status_id = status_id_from_url(url)
@api_response ||= TwitterService.new.client.status(status_id)
@api_response ||= TwitterService.new.client.status(status_id, tweet_mode: "extended")
end
def get
attrs = api_response.attrs
@artist_name = attrs[:user][:name]
@profile_url = "https://twitter.com/" + attrs[:user][:screen_name]
@image_url = image_urls.first
@image_urls = TwitterService.new.image_urls(api_response)
@image_url = @image_urls.first
@artist_commentary_title = ""
@artist_commentary_desc = attrs[:text]
@artist_commentary_desc = attrs[:full_text]
@tags = attrs[:entities][:hashtags].map do |text:, indices:|
[text, "https://twitter.com/hashtag/#{text}"]
end
rescue ::Twitter::Error::Forbidden
end
def image_urls
TwitterService.new.image_urls(url)
end
def normalize_for_artist_finder!
url.downcase
end
@@ -47,11 +46,11 @@ module Sources::Strategies
end
def dtext_artist_commentary_desc
url_replacements = Array(api_response.attrs[:entities][:urls]).map do |url:, expanded_url:, **attrs|
[url, expanded_url]
url_replacements = api_response.urls.map do |obj|
[obj.url.to_s, obj.expanded_url.to_s]
end
url_replacements += Array(api_response.attrs[:entities][:media]).map do |url:, expanded_url:, **attrs|
[url, ""]
url_replacements += api_response.media.map do |obj|
[obj.url.to_s, ""]
end
url_replacements = url_replacements.to_h

View File

@@ -20,7 +20,7 @@ class TwitterService
def extract_urls_for_status(tweet)
tweet.media.map do |obj|
if obj.is_a?(Twitter::Media::Photo)
obj.media_url.to_s + ":orig"
obj.media_url_https.to_s + ":orig"
elsif obj.is_a?(Twitter::Media::Video)
video = obj.video_info.variants.select do |x|
x.content_type == "video/mp4"
@@ -29,7 +29,7 @@ class TwitterService
video.url.to_s
end
end
end.compact
end.compact.uniq
end
def extract_og_image_from_page(url)
@@ -50,20 +50,11 @@ class TwitterService
[extract_og_image_from_page(url)].compact
end
def image_urls(tweet_url)
tweet_url =~ %r{/status/(\d+)}
twitter_id = $1
tweet = client.status(twitter_id)
urls = []
def image_urls(tweet)
if tweet.media.any?
urls = extract_urls_for_status(tweet)
extract_urls_for_status(tweet)
elsif tweet.urls.any?
urls = extract_urls_for_card(tweet)
extract_urls_for_card(tweet)
end
urls.uniq
rescue => e
[]
end
end

View File

@@ -57,6 +57,28 @@ module Sources
end
end
context "An extended tweet" do
should "extract the correct image url" do
@site = Sources::Site.new("https://twitter.com/onsen_musume_jp/status/865534101918330881")
@site.get
assert_equal(["https://pbs.twimg.com/media/DAL-ntWV0AEbhes.jpg:orig"], @site.image_urls)
end
should "extract all the image urls" do
@site = Sources::Site.new("https://twitter.com/aoimanabu/status/892370963630743552")
@site.get
urls = %w[
https://pbs.twimg.com/media/DGJWp59UIAA_-en.jpg:orig
https://pbs.twimg.com/media/DGJWqGLUwAAn2RL.jpg:orig
https://pbs.twimg.com/media/DGJWqT_UMAAvmSK.jpg:orig
]
assert_equal(urls, @site.image_urls)
end
end
context "The source site for a restricted twitter" do
setup do
@site = Sources::Site.new("https://mobile.twitter.com/Strangestone/status/556440271961858051")
@@ -64,7 +86,7 @@ module Sources
end
should "get the image url" do
assert_equal("http://pbs.twimg.com/media/B7jfc1JCcAEyeJh.png:orig", @site.image_url)
assert_equal("https://pbs.twimg.com/media/B7jfc1JCcAEyeJh.png:orig", @site.image_url)
end
end
@@ -83,7 +105,7 @@ module Sources
end
should "get the image url" do
assert_equal("http://pbs.twimg.com/media/B4HSEP5CUAA4xyu.png:orig", @site.image_url)
assert_equal("https://pbs.twimg.com/media/B4HSEP5CUAA4xyu.png:orig", @site.image_url)
end
should "get the tags" do