Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Show favicons as Bookmarks icons #3079

Open
wants to merge 1 commit into
base: dev
Choose a base branch
from

Conversation

z1nc0r3
Copy link
Member

@z1nc0r3 z1nc0r3 commented Nov 17, 2024

What's in the PR:

There was an issue asking for this change but couldn't find it :\

I replaced the default bookmarks plugin icon with Google's favicon API to fetch and display favicons for each bookmark from their corresponding websites.

image

Known issue:

  • A broken icon is showing if the API fails to fetch an icon.
    image

We replaced the default bookmarks plugin icon with Google's favicon API to fetch and display favicons for each bookmark from their corresponding websites.
@z1nc0r3 z1nc0r3 added enhancement New feature or request kind/ui related to UI, icons, themes, etc labels Nov 17, 2024
@z1nc0r3 z1nc0r3 self-assigned this Nov 17, 2024
Copy link

@check-spelling-bot Report

🔴 Please review

See the 📂 files view, the 📜action log, or 📝 job summary for details.

❌ Errors Count
❌ forbidden-pattern 22
❌ ignored-expect-variant 1
⚠️ non-alpha-in-dictionary 19

See ❌ Event descriptions for more information.

If the flagged items are 🤯 false positives

If items relate to a ...

  • binary file (or some other file you wouldn't want to check at all).

    Please add a file path to the excludes.txt file matching the containing file.

    File paths are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your files.

    ^ refers to the file's path from the root of the repository, so ^README\.md$ would exclude README.md (on whichever branch you're using).

  • well-formed pattern.

    If you can write a pattern that would match it,
    try adding it to the patterns.txt file.

    Patterns are Perl 5 Regular Expressions - you can test yours before committing to verify it will match your lines.

    Note that patterns can't match multiline strings.

Copy link
Contributor

coderabbitai bot commented Nov 17, 2024

📝 Walkthrough

Walkthrough

The changes in this pull request involve modifications to the Query method in the Main class of the Flow.Launcher.Plugin.BrowserBookmark namespace. The IcoPath property for Result objects is updated to dynamically fetch favicons from Google based on the bookmark URL. Additionally, the LoadBookmarksIfEnabled method now checks if the plugin is disabled before loading bookmarks. The overall structure and error handling in the class remain unchanged.

Changes

File Path Change Summary
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs Updated IcoPath in Query method to fetch favicons from Google instead of a local image. Modified LoadBookmarksIfEnabled to check if the plugin is disabled before loading bookmarks. Error handling in LoadContextMenus remains unchanged.

Poem

In the garden of code, where bookmarks bloom,
Favicons now dance, dispelling the gloom.
From Google they come, bright and so neat,
A plugin refreshed, oh, what a treat!
With checks in the flow, all tidy and right,
Hopping along, we embrace the new light! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between ed53736 and d1ebaaa.

📒 Files selected for processing (1)
  • Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs (2 hunks)
🔇 Additional comments (2)
Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs (2)

93-93: Same favicon handling concerns as above

This instance has the same issues as the previous occurrence.


Line range hint 71-93: Verify performance impact with large bookmark collections

The current implementation makes an external API call for each bookmark displayed. This could impact performance, especially when displaying many bookmarks.

Let's analyze the potential performance impact:

Consider implementing:

  1. Batch loading of favicons during bookmark initialization
  2. Rate limiting for favicon requests
  3. Local caching with periodic updates
    Would you like assistance with implementing any of these improvements?

@@ -68,7 +68,7 @@ public List<Result> Query(Query query)
{
Title = c.Name,
SubTitle = c.Url,
IcoPath = @"Images\bookmark.png",
IcoPath = $"https://www.google.com/s2/favicons?domain={c.Url}&sz=64",
Copy link
Contributor

@coderabbitai coderabbitai bot Nov 17, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Consider adding error handling and caching for favicon URLs

The direct use of bookmark URLs in the favicon API call has several potential issues:

  1. No fallback mechanism when the favicon API fails
  2. Potential security concerns with unencoded URLs
  3. Performance impact from making external API calls for each bookmark

Consider implementing these improvements:

-IcoPath = $"https://www.google.com/s2/favicons?domain={c.Url}&sz=64",
+IcoPath = GetFaviconPath(c.Url),

+private string GetFaviconPath(string url)
+{
+    try
+    {
+        var uri = new Uri(url);
+        var encodedDomain = Uri.EscapeDataString(uri.Host);
+        return $"https://www.google.com/s2/favicons?domain={encodedDomain}&sz=64";
+    }
+    catch (Exception ex)
+    {
+        Log.Exception("Main", "Failed to generate favicon URL", ex);
+        return @"Images\bookmark.png"; // Fallback to default icon
+    }
+}

Consider implementing a caching mechanism for favicons to:

  1. Reduce external API calls
  2. Handle offline scenarios
  3. Improve performance
    Would you like me to provide a caching implementation example?

Committable suggestion skipped: line range outside the PR's diff.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@z1nc0r3 I think this is worth addressing. Use the existing image as a fallback.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

And I also think these calls to grab icons might impact performance, if there are a lot of bookmarks.

@coderabbitai provide a caching implementation example please.

@z1nc0r3 please test performance.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jjw24, certainly! Here's an example of how you can implement caching for the favicons to improve performance:

First, add a dictionary to act as an in-memory cache:

private static Dictionary<string, string> faviconCache = new Dictionary<string, string>();

Next, update the GetFaviconPath method to utilize the cache:

private string GetFaviconPath(string url)
{
    try
    {
        var uri = new Uri(url);
        var domain = uri.Host;

        if (faviconCache.TryGetValue(domain, out var cachedFaviconUrl))
        {
            // Return the cached favicon URL if it exists
            return cachedFaviconUrl;
        }
        else
        {
            var encodedDomain = Uri.EscapeDataString(domain);
            var faviconUrl = $"https://www.google.com/s2/favicons?domain={encodedDomain}&sz=64";
            // Store the favicon URL in the cache
            faviconCache[domain] = faviconUrl;
            return faviconUrl;
        }
    }
    catch (Exception ex)
    {
        Log.Exception("Main", "Failed to generate favicon URL", ex);
        // Fallback to default icon
        return @"Images\bookmark.png";
    }
}

Then, update the IcoPath assignment in your Result objects to use this method:

IcoPath = GetFaviconPath(c.Url),

This implementation:

  • Caches favicon URLs based on the domain to avoid redundant API calls.
  • Reduces external requests, which improves performance, especially with a large number of bookmarks.
  • Handles exceptions and provides a fallback to the default icon if needed.

Please remember to test the performance with your set of bookmarks to ensure the caching mechanism effectively improves load times.

Let me know if you have any questions or need further assistance!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah sure @jjw24. I'll try these changes

Copy link

gitstream-cm bot commented Nov 21, 2024

🥷 Code experts: Yusyuriv, jjw24

Yusyuriv, jjw24 have most 🧠 knowledge in the files.

See details

Plugins/Flow.Launcher.Plugin.BrowserBookmark/Main.cs

Knowledge based on git-blame:
Yusyuriv: 72%
jjw24: 12%

To learn more about /:\ gitStream - Visit our Docs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request kind/ui related to UI, icons, themes, etc
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants