async Task AddPostsToFeedAsync(Feed feed, IEnumerable <FeedItem> feed_items) { foreach (var item in feed_items) { var post_title = ExtractTextFromHtml(item.Title); var post_id = MakeSafeId(post_title); var post = new Feed.Post(feed, post_id) { GUID = item.Id, Link = item.Link, Title = post_title, DatePublished = (DateTime)item.PublishingDate, Description = ExtractTextFromHtml(item.Description), }; var post_content_filename = Path.Combine(FeedDirectory, feed.ID, post_id); try { var post_content = (await ProcessHtmlAsync(item.Content is null ? item.Description : item.Content, post)).Trim(); await WriteToFileAsync($"{post_content_filename}.post", post.Serialize()); await WriteToFileAsync($"{post_content_filename}.content", post_content.Trim()); feed.Posts.Add(post); } catch (Exception e) {; } } }
public async Task BookmarkPostAsync(Feed.Post post) { var bookmark = new Bookmark(post.ID) { GUID = post.GUID, Title = post.Title, Link = post.Link, FeedTitle = post.ParentFeed.Title, FeedLink = post.ParentFeed.Link, DatePublished = post.DatePublished, Description = post.Description, }; var bookmark_path_pre = Path.Combine(FeedDirectory, "bookmarks", bookmark.ID); File.Copy( Path.Combine(FeedDirectory, post.ParentFeed.ID, $"{post.ID}.content"), $"{bookmark_path_pre}.content" ); using (var file = new StreamWriter($"{bookmark_path_pre}.bookmark")) await file.WriteAsync(bookmark.Serialize()); Bookmarks.Add(bookmark); }
public async Task OpenPostAsync(Feed.Post post) { PostContent.Post = post; Title = $"{post.Title} — {post.ParentFeed.Title} — Fidd"; await App.FeedManager.MarkPostReadAsync(post); ListFeeds.UpdateListWhilePreservingSelection(); }
static async Task <string> ProcessHtmlAsync(string content, Feed.Post post) { var doc = new HtmlDocument(); doc.LoadHtml(content); void RemoveElementsNamed(string name) { foreach (var node in doc.DocumentNode.Descendants(name).ToList()) { node.Remove(); } } RemoveElementsNamed("col"); RemoveElementsNamed("style"); RemoveElementsNamed("script"); RemoveElementsNamed("iframe"); foreach (var node in doc.DocumentNode.Descendants()) { node.Attributes.Remove("style"); node.Attributes.Remove("class"); node.Attributes.Remove("srcset"); } var images = doc.DocumentNode.Descendants("img").ToList(); var downloader = new WebClient(); foreach (var image in images) { var src = image.GetAttributeValue("src", ""); if (!src.StartsWith("data")) { try { var image_extension = ExtractExtensionFromUrl(src).Substring(1); string image_data_base64; try { image_data_base64 = Convert.ToBase64String(await downloader.DownloadDataTaskAsync(src)); } catch { src = src.StartsWith('/') ? $"{post.ParentFeed.Link}{src}" : $"{post.Link.TrimEnd('/')}/{src}"; image_data_base64 = Convert.ToBase64String(await downloader.DownloadDataTaskAsync(src)); } image.SetAttributeValue("src", $"data:image/{image_extension};base64,{image_data_base64}"); } catch { image.Remove(); } } } return(doc.DocumentNode.InnerHtml); }
public async Task MarkPostUnreadAsync(Feed.Post post) { if (post.Read) { post.Read = false; var post_filepath = Path.Combine(FeedDirectory, post.ParentFeed.ID, $"{post.ID}.post"); if (File.Exists(post_filepath)) { using (var post_file = new StreamWriter(post_filepath)) await post_file.WriteAsync(post.Serialize()); } } }
public Feed.Post MockPostFromBookmark(Bookmark bookmark) { var subscribed_feed = Feeds.FirstOrDefault(f => f.Link == bookmark.FeedLink); var feed = new Feed("bookmarks", bookmark.FeedLink) { Title = subscribed_feed is null? bookmark.FeedLink : subscribed_feed.Title }; var post = new Feed.Post(feed, bookmark.ID) { GUID = bookmark.GUID, Title = bookmark.Title, Link = bookmark.Link, DatePublished = bookmark.DatePublished, Description = bookmark.Description, Read = true }; return(post); }
public string LoadPostContent(Feed.Post post) { using (var content_file = new StreamReader(Path.Combine(FeedDirectory, post.ParentFeed.ID, $"{post.ID}.content"))) return(content_file.ReadToEnd()); }