From 9790ba735bcfe5a9851ac6184d9543c154d1b71a Mon Sep 17 00:00:00 2001 From: Athou Date: Fri, 7 Nov 2014 15:02:11 +0100 Subject: [PATCH] facebook favicon fetcher --- .../java/com/commafeed/CommaFeedModule.java | 2 + .../favicon/FacebookFaviconFetcher.java | 79 +++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 src/main/java/com/commafeed/backend/favicon/FacebookFaviconFetcher.java diff --git a/src/main/java/com/commafeed/CommaFeedModule.java b/src/main/java/com/commafeed/CommaFeedModule.java index 62d3911d..d290f68f 100644 --- a/src/main/java/com/commafeed/CommaFeedModule.java +++ b/src/main/java/com/commafeed/CommaFeedModule.java @@ -13,6 +13,7 @@ import com.commafeed.backend.cache.NoopCacheService; import com.commafeed.backend.cache.RedisCacheService; import com.commafeed.backend.favicon.AbstractFaviconFetcher; import com.commafeed.backend.favicon.DefaultFaviconFetcher; +import com.commafeed.backend.favicon.FacebookFaviconFetcher; import com.commafeed.backend.favicon.YoutubeFaviconFetcher; import com.google.inject.AbstractModule; import com.google.inject.Provides; @@ -40,6 +41,7 @@ public class CommaFeedModule extends AbstractModule { Multibinder multibinder = Multibinder.newSetBinder(binder(), AbstractFaviconFetcher.class); multibinder.addBinding().to(YoutubeFaviconFetcher.class); + multibinder.addBinding().to(FacebookFaviconFetcher.class); multibinder.addBinding().to(DefaultFaviconFetcher.class); } } diff --git a/src/main/java/com/commafeed/backend/favicon/FacebookFaviconFetcher.java b/src/main/java/com/commafeed/backend/favicon/FacebookFaviconFetcher.java new file mode 100644 index 00000000..e42e11da --- /dev/null +++ b/src/main/java/com/commafeed/backend/favicon/FacebookFaviconFetcher.java @@ -0,0 +1,79 @@ +package com.commafeed.backend.favicon; + +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import javax.inject.Inject; +import javax.inject.Singleton; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import org.apache.http.NameValuePair; +import org.apache.http.client.utils.URLEncodedUtils; + +import com.commafeed.backend.HttpGetter; +import com.commafeed.backend.HttpGetter.HttpResult; +import com.commafeed.backend.model.Feed; + +@Slf4j +@RequiredArgsConstructor(onConstructor = @__({ @Inject })) +@Singleton +public class FacebookFaviconFetcher extends AbstractFaviconFetcher { + + private final HttpGetter getter; + + @Override + public byte[] fetch(Feed feed) { + String url = feed.getUrl(); + + if (!url.toLowerCase().contains("www.facebook.com")) { + return null; + } + + String userName = extractUserName(url); + if (userName == null) { + return null; + } + + String iconUrl = String.format("https://graph.facebook.com/%s/picture?type=square&height=16", userName); + + byte[] bytes = null; + String contentType = null; + + try { + log.debug("Getting Facebook user's icon, {}", url); + + HttpResult iconResult = getter.getBinary(iconUrl, TIMEOUT); + bytes = iconResult.getContent(); + contentType = iconResult.getContentType(); + } catch (Exception e) { + log.debug("Failed to retrieve YouTube icon", e); + } + + if (!isValidIconResponse(bytes, contentType)) { + bytes = null; + } + return bytes; + } + + private String extractUserName(String url) { + URI uri = null; + try { + uri = new URI(url); + } catch (URISyntaxException e) { + log.debug("could not parse url", e); + return null; + } + List params = URLEncodedUtils.parse(uri, StandardCharsets.UTF_8.name()); + for (NameValuePair param : params) { + if ("id".equals(param.getName())) { + return param.getValue(); + } + } + return null; + } + +}