From 7e465aedaef287b9b9243d87cddc0b7155304cfd Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 4 Aug 2019 20:23:10 -0500 Subject: [PATCH] Fix #4110: New Twitter image urls are broken in bookmarklet. --- app/logical/sources/strategies/twitter.rb | 13 ++++++++++--- test/unit/sources/twitter_test.rb | 14 +++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/logical/sources/strategies/twitter.rb b/app/logical/sources/strategies/twitter.rb index 63dfd489a..279eaba70 100644 --- a/app/logical/sources/strategies/twitter.rb +++ b/app/logical/sources/strategies/twitter.rb @@ -4,6 +4,13 @@ module Sources::Strategies ASSET = %r!\A(https?://(?:video|pbs)\.twimg\.com/media/)!i PROFILE = %r!\Ahttps?://(?:mobile\.)?twitter.com/(?[a-z0-9_]+)!i + # https://pbs.twimg.com/media/EBGbJe_U8AA4Ekb.jpg + # https://pbs.twimg.com/media/EBGbJe_U8AA4Ekb?format=jpg&name=900x900 + BASE_IMAGE_URL = %r!\Ahttps?://pbs\.twimg\.com/media!i + FILENAME1 = %r!(?\w+)\.(?\w+)!i + FILENAME2 = %r!(?\w+)\?.*format=(?\w+)!i + IMAGE_URL = %r!#{BASE_IMAGE_URL}/#{Regexp.union(FILENAME1, FILENAME2)}!i + # Twitter provides a list but it's inaccurate; some names ('intent') aren't # included and other names in the list aren't actually reserved. # https://developer.twitter.com/en/docs/developer-utilities/configuration/api-reference/get-help-configuration @@ -40,8 +47,8 @@ module Sources::Strategies end def image_urls - if url =~ /(#{ASSET}[^:]+)/ - [$1 + ":orig" ] + if url =~ IMAGE_URL + ["https://pbs.twimg.com/media/#{$~[:file_name]}.#{$~[:file_ext]}:orig"] elsif api_response.present? service.image_urls(api_response) else @@ -57,7 +64,7 @@ module Sources::Strategies end def page_url - return "" if status_id.blank? || artist_name.blank? + return nil if status_id.blank? || artist_name.blank? "https://twitter.com/#{artist_name}/status/#{status_id}" end diff --git a/test/unit/sources/twitter_test.rb b/test/unit/sources/twitter_test.rb index 633d1dfc1..86e789e0e 100644 --- a/test/unit/sources/twitter_test.rb +++ b/test/unit/sources/twitter_test.rb @@ -24,7 +24,7 @@ module Sources assert_equal(urls, @site.image_urls) end end - + context "A video" do setup do @site = Sources::Strategies.find("https://twitter.com/CincinnatiZoo/status/859073537713328129") @@ -179,6 +179,18 @@ module Sources end end + context "The source site for a direct image url (pbs.twimg.com/media/*?format=jpg&name=*) without a referer url" do + setup do + @site = Sources::Strategies.find("https://pbs.twimg.com/media/EBGp2YdUYAA19Uj?format=jpg&name=small") + end + + should "work" do + assert_equal("https://pbs.twimg.com/media/EBGp2YdUYAA19Uj.jpg:orig", @site.image_url) + assert_equal(["https://pbs.twimg.com/media/EBGp2YdUYAA19Uj.jpg:orig"], @site.image_urls) + assert_equal("https://pbs.twimg.com/media/EBGp2YdUYAA19Uj.jpg:orig", @site.canonical_url) + end + end + context "The source site for a https://twitter.com/i/web/status/:id url" do setup do @site = Sources::Strategies.find("https://twitter.com/i/web/status/943446161586733056")