Exemple #1
0
    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) {; }
        }
    }
Exemple #2
0
    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);
    }
Exemple #3
0
        public async Task OpenPostAsync(Feed.Post post)
        {
            PostContent.Post = post;
            Title            = $"{post.Title} — {post.ParentFeed.Title} — Fidd";
            await App.FeedManager.MarkPostReadAsync(post);

            ListFeeds.UpdateListWhilePreservingSelection();
        }
Exemple #4
0
    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);
    }
Exemple #5
0
 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());
         }
     }
 }
Exemple #6
0
    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);
    }
Exemple #7
0
 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());
 }