using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using Hammock; using MahTweets.Core.Interfaces; using Newtonsoft.Json; namespace MahTweets.Extensions.MediaProviders { public class EmbedlyProvider : IImageProvider { private static readonly List _embedly = new List{ /* Primarily photo providers */ @"http://tweetphoto\.com/.+", @"http://yfrog\.com/.+", @"http://www\.flickr\.com/photos/.+", @"http://flic\.kr/.+", @"http://twitpic\.com/.+", @"http://www\.twitpic\.com/.+", @"http://twitpic\.com/photos/.+", @"http://www\.twitpic\.com/photos/.+", @"http://imgur\.com/.+", @"http://.+\.posterous\.com/.+", @"http://post\.ly/.+", @"http://twitgoo\.com/.+", @"http://s\.+\.photobucket\.com/albums/.+", @"http://i\.+\.photobucket\.com/albums/.+", @"http://moby\.to/.+", @"http://www\.mobypicture\.com/user/.+/view/.+", @"http://23hq\.com/.+/photo/.+", @"http://www\.23hq\.com/.+/photo/.+", @"http://drbl\.in/.+", @"http://.+dribbble\.com/shots/.+", @"http://.+.smugmug\.com/.+", @"http://.+.smugmug\.com/.+#.+", @"http://picasaweb.google\.com/.+/.+#.+", @"http://picasaweb.google\.com/lh/photo/.+", @"http://picasaweb.google\.com/.+/.+", @"http://dailybooth\.com/.+/.+", @"http://brizzly\.com/pic/.+", @"http://pics.brizzly\.com/.+\.jpg", @"http://img\.ly/.+", @"http://www\.tinypic\.com/view.php*", @"http://tinypic\.com/view.php*", @"http://www\.tinypic\.com/player.php*", @"http://tinypic\.com/player.php*", @"http://www\.tinypic\.com/r/.+/.+", @"http://tinypic\.com/r/.+/.+", @"http://.+\.tinypic\.com/.+\.jpg", @"http://.+\.tinypic\.com/.+\.png", @"http://.+\.deviantart\.com/art/.+", @"http://.+\.deviantart\.com/gallery/.+", @"http://.+\.deviantart\.com/#/.+", @"http://fav\.me/.+", @"http://.+\.deviantart\.com", @"http://.+\.deviantart\.com/gallery", @"http://.+\.deviantart\.com/.+/.+\.jpg", @"http://.+\.deviantart\.com/.+/.+\.gif", @"http://.+\.deviantart.net/.+/.+\.jpg", @"http://.+\.deviantart.net/.+/.+\.gif", @"http://plixi\.com/p/.+", @"http://plixi\.com/profile/home/.+", @"http://plixi\.com/.+", @"http://m.plixi\.com/.+", @"http://www\.fotopedia\.com/.+/.+", @"http://fotopedia\.com/.+/.+", @"http://photozou\.jp/photo/show/.+/.+", @"http://photozou\.jp/photo/photo_only/.+/.+", @"http://instagr\.am/p/.+", @"http://instagram\.com/p/.+", @"http://skitch\.com/.+/.+/.+", @"http://img.skitch\.com/.+", @"https://skitch\.com/.+/.+/.+", @"https://img.skitch\.com/.+", @"http://share.ovi\.com/media/.+/.+", @"http://picplz\.com/user/.+/pic/.+/", @"http://twitrpix\.com/.+", @"http://.+\.twitrpix\.com/.+", @"http://pikchur\.com/.+", @"http://color\.com/s/.+", /* Video providers */ /*@"http://youtube\.com/watch.+", @"http://.+\.youtube\.com/v/.+", @"http://youtu\.be/.+", @"http://.+\.youtube\.com/user/.+", @"http://.+\.youtube\.com/.+#.+/.+", @"http://m.youtube\.com/watch.+", @"http://m.youtube\.com/index.+", @"http://.+\.youtube\.com/profile.+", @"http://.+\.youtube\.com/view_play_list.+", @"http://.+\.youtube\.com/playlist.+", @"http://www\.ustream.tv/recorded/.+", @"http://www\.ustream.tv/channel/.+", @"http://www\.ustream.tv/.+", @"http://.+\.dailymotion\.com/video/.+", @"http://.+\.dailymotion\.com/.+/video/.+", @"http://collegehumor\.com/video:.+", @"http://collegehumor\.com/video/.+", @"http://www\.collegehumor\.com/video:.+", @"http://www\.collegehumor\.com/video/.+", @"http://.+twitvid\.com/.+", @"http://www\.break\.com/.+/.+", @"http://www\.metacafe\.com/watch/.+", @"http://www\.metacafe\.com/w/.+", @"http://blip\.tv/file/.+", @"http://.+\.blip.tv/file/.+", @"http://viddler\.com/explore/.+/videos/.+", @"http://www\.funnyordie\.com/videos/.+", @"http://www\.funnyordie\.com/m/.+", @"http://funnyordie\.com/videos/.+", @"http://funnyordie\.com/m/.+", @"http://www\.vimeo\.com/groups/.+/videos/.+", @"http://www\.vimeo\.com/.+", @"http://vimeo\.com/groups/.+/videos/.+", @"http://vimeo\.com/.+", @"http://vimeo\.com/m/#/.+", @"http://www\.theonion\.com/video/.+", @"http://theonion\.com/video/.+",*/ }; public bool IsMatch(string url) { return _embedly.Select(e => new Regex(e)).Any(r => r.IsMatch(url)); } public void GetImage(string url, Action callback) { var r = new RestClient { Authority = "http://api.embed.ly/1/" }; var request = new RestRequest { Path = "oembed" }; request.AddParameter("url", Uri.EscapeUriString(url)); request.AddParameter("format", "json"); request.AddParameter("maxwidth", "450"); r.BeginRequest(request, (req, res, obj) => { try { var result = JsonConvert.DeserializeObject(res.Content); if (result == null) callback(null); callback(result.Width > 450 ? result.ThumbnailUrl : result.Url); } catch { callback(null); } }); } } }