From 4cd210df1190ee9513a312c67d1853c9bbe2daf6 Mon Sep 17 00:00:00 2001 From: IBBoard Date: Wed, 23 Dec 2015 20:55:39 +0000 Subject: [PATCH 1/4] Try to fix #457 by only removing Twitter image URLs This is basically what Twitter does with its "cards" (Flic.kr links remain but the card shows the image). The only issue so far is if someone uses IFTTT or similar to auto- post Flickr photos. IFTTT puts the Flickr URL in *and* uploads the photo to Twitter, which results in us seeing it twice. --- src/InlineMediaDownloader.vala | 10 ++++++++++ src/util/TextTransform.vala | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/InlineMediaDownloader.vala b/src/InlineMediaDownloader.vala index 473837a3f..a21628d27 100644 --- a/src/InlineMediaDownloader.vala +++ b/src/InlineMediaDownloader.vala @@ -55,7 +55,17 @@ bool is_media_candidate (string _url) { ; } +bool is_media_link_removal_candidate (string url) { + if (Settings.max_media_size () < 0.001) + return false; + return +#if VIDEO + url.has_suffix ("/photo/1") || + url.has_prefix ("https://video.twimg.com/ext_tw_video/") || +#endif + url.has_prefix ("http://pbs.twimg.com/media/"); +} public class InlineMediaDownloader : GLib.Object { private static InlineMediaDownloader instance; diff --git a/src/util/TextTransform.vala b/src/util/TextTransform.vala index a61aff87a..abde709af 100644 --- a/src/util/TextTransform.vala +++ b/src/util/TextTransform.vala @@ -42,7 +42,7 @@ namespace TextTransform { string display_text, uint media_count) { - return (is_media_candidate (url ?? display_text) && + return (is_media_link_removal_candidate (url ?? display_text) && media_count == 1) || display_text.has_prefix ("pic.twitter.com/"); } From 3e9be4be266acf64a3a0ad032644992547774332 Mon Sep 17 00:00:00 2001 From: IBBoard Date: Fri, 29 Jan 2016 20:19:30 +0000 Subject: [PATCH 2/4] Tweak media loading to load Twitter media or 3rd party, not both This compromise means we don't see different images when a user links to one image and uploads a different one (we only see the upload) BUT it means that we don't get duplicate images (which are common when a user has used something like IFTT to auto-post photos from Flickr - it uploads the image AND links to it on Flickr, so we could end up loading it twice because of our 3rd part image support) --- src/Tweet.vala | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Tweet.vala b/src/Tweet.vala index ba60a3690..df54474c5 100644 --- a/src/Tweet.vala +++ b/src/Tweet.vala @@ -113,14 +113,6 @@ void parse_entities (MiniTweet mt, Json.Object status) var url = node.get_object(); string expanded_url = url.get_string_member("expanded_url"); - if (is_media_candidate (expanded_url)) { - var m = new Media (); - m.url = expanded_url; - m.type = Media.type_from_url (expanded_url); - mt.medias[real_media_count] = m; - real_media_count ++; - } - Json.Array indices = url.get_array_member ("indices"); expanded_url = expanded_url.replace("&", "&"); mt.entities[url_index] = TextEntity () { @@ -273,6 +265,24 @@ void parse_entities (MiniTweet mt, Json.Object status) }); } + if (real_media_count == 0) { + // Only load other media if there is no Twitter media + // This prevents sites like IFTT linking to media we'll load + // AND uploading it to Twitter, causing us to load identical pics + urls.foreach_element((arr, index, node) => { + var url = node.get_object(); + string expanded_url = url.get_string_member("expanded_url"); + + if (is_media_candidate (expanded_url)) { + var m = new Media (); + m.url = expanded_url; + m.type = Media.type_from_url (expanded_url); + mt.medias[real_media_count] = m; + real_media_count ++; + } + }); + } + mt.medias.resize (real_media_count); InlineMediaDownloader.get ().load_all_media (mt, mt.medias); From 5189d38c92d3d0919aeed448aba9da558d018c21 Mon Sep 17 00:00:00 2001 From: IBBoard Date: Fri, 29 Jan 2016 20:26:03 +0000 Subject: [PATCH 3/4] Tidy up "media link" function naming for new purposes --- src/InlineMediaDownloader.vala | 2 +- src/util/TextTransform.vala | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/InlineMediaDownloader.vala b/src/InlineMediaDownloader.vala index a21628d27..46b8acb97 100644 --- a/src/InlineMediaDownloader.vala +++ b/src/InlineMediaDownloader.vala @@ -55,7 +55,7 @@ bool is_media_candidate (string _url) { ; } -bool is_media_link_removal_candidate (string url) { +bool is_twitter_media_candidate (string url) { if (Settings.max_media_size () < 0.001) return false; diff --git a/src/util/TextTransform.vala b/src/util/TextTransform.vala index abde709af..9547f69f8 100644 --- a/src/util/TextTransform.vala +++ b/src/util/TextTransform.vala @@ -38,11 +38,11 @@ public enum TransformFlags { namespace TextTransform { private static const uint TRAILING = 1 << 0; - private bool is_media_url (string? url, + private bool is_removable_media_url (string? url, string display_text, uint media_count) { - return (is_media_link_removal_candidate (url ?? display_text) && + return (is_twitter_media_candidate (url ?? display_text) && media_count == 1) || display_text.has_prefix ("pic.twitter.com/"); } @@ -136,10 +136,10 @@ namespace TextTransform { last_entity_was_trailing = false; /* Skip the entire entity if we should remove media links AND - it is a media link. */ + it is a Twitter uploaded media link. */ if ((TransformFlags.REMOVE_MEDIA_LINKS in flags && - is_media_url (entity.target, entity.display_text, media_count)) || + is_removable_media_url (entity.target, entity.display_text, media_count)) || (quote_id != 0 && is_quote_link (ref entity, quote_id))) { last_end = entity.to; continue; From f68e37e0b9a48605d0d92383302cdeb7abca1e59 Mon Sep 17 00:00:00 2001 From: IBBoard Date: Wed, 18 May 2016 21:04:12 +0100 Subject: [PATCH 4/4] Messed up the merge with Master and missed a removed "ref" --- src/util/TextTransform.vala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/util/TextTransform.vala b/src/util/TextTransform.vala index 91ca3d6d0..a17886abb 100644 --- a/src/util/TextTransform.vala +++ b/src/util/TextTransform.vala @@ -140,7 +140,7 @@ namespace TextTransform { if ((TransformFlags.REMOVE_MEDIA_LINKS in flags && is_removable_media_url (entity.target, entity.display_text, media_count)) || - (quote_id != 0 && is_quote_link (ref entity, quote_id))) { + (quote_id != 0 && is_quote_link (entity, quote_id))) { last_end = entity.to; continue; }