diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
index 68e5d5caa..6a099cb07 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs
@@ -2,6 +2,7 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
+using System.IO.Compression;
using System.Linq;
using System.Threading.Tasks;
using Flow.Launcher.Plugin.BrowserBookmark.Helper;
@@ -134,10 +135,6 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
try
{
- if (string.IsNullOrEmpty(bookmark.Url))
- return;
-
- // Extract domain from URL
if (!Uri.TryCreate(bookmark.Url, UriKind.Absolute, out Uri uri))
return;
@@ -146,43 +143,49 @@ public abstract class FirefoxBookmarkLoaderBase : IBookmarkLoader
// Query for latest Firefox version favicon structure
using var cmd = connection.CreateCommand();
cmd.CommandText = @"
- SELECT i.data
+ SELECT i.id, i.data
FROM moz_icons i
JOIN moz_icons_to_pages ip ON i.id = ip.icon_id
JOIN moz_pages_w_icons p ON ip.page_id = p.id
- WHERE p.page_url LIKE @url
- AND i.data IS NOT NULL
- ORDER BY i.width DESC -- Select largest icon available
+ WHERE p.page_url LIKE @domain
+ ORDER BY i.width DESC
LIMIT 1";
- cmd.Parameters.AddWithValue("@url", $"%{domain}%");
+ cmd.Parameters.AddWithValue("@domain", $"%{domain}%");
using var reader = cmd.ExecuteReader();
- if (!reader.Read() || reader.IsDBNull(0))
+ if (!reader.Read() || reader.IsDBNull(1))
return;
+ var iconId = reader.GetInt64(0).ToString();
var imageData = (byte[])reader["data"];
if (imageData is not { Length: > 0 })
return;
- string faviconPath;
- if (FaviconHelper.IsSvgData(imageData))
+ // Check if the image data is compressed (GZip)
+ if (imageData.Length > 2 && imageData[0] == 0x1f && imageData[1] == 0x8b)
{
- faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.svg");
- }
- else
- {
- faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}.png");
+ using var inputStream = new MemoryStream(imageData);
+ using var gZipStream = new GZipStream(inputStream, CompressionMode.Decompress);
+ using var outputStream = new MemoryStream();
+ gZipStream.CopyTo(outputStream);
+ imageData = outputStream.ToArray();
}
- // Filter out duplicate favicons
- if (savedPaths.TryAdd(faviconPath, true))
+ // Convert the image data to WebP format
+ var webpData = FaviconHelper.TryConvertToWebp(imageData);
+ if (webpData != null)
{
- FaviconHelper.SaveBitmapData(imageData, faviconPath);
- }
+ var faviconPath = Path.Combine(_faviconCacheDir, $"firefox_{domain}_{iconId}.webp");
- bookmark.FaviconPath = faviconPath;
+ if (savedPaths.TryAdd(faviconPath, true))
+ {
+ FaviconHelper.SaveBitmapData(webpData, faviconPath);
+ }
+
+ bookmark.FaviconPath = faviconPath;
+ }
}
catch (Exception ex)
{
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
index 4d1109980..7d3cf164c 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Flow.Launcher.Plugin.BrowserBookmark.csproj
@@ -45,12 +45,14 @@
$(OutputPath)runtimes\linux-musl-arm;
$(OutputPath)runtimes\linux-musl-arm64;
$(OutputPath)runtimes\linux-musl-x64;
+ $(OutputPath)runtimes\linux-musl-s390x;
$(OutputPath)runtimes\linux-ppc64le;
$(OutputPath)runtimes\linux-s390x;
$(OutputPath)runtimes\linux-x64;
$(OutputPath)runtimes\linux-x86;
$(OutputPath)runtimes\maccatalyst-arm64;
$(OutputPath)runtimes\maccatalyst-x64;
+ $(OutputPath)runtimes\osx;
$(OutputPath)runtimes\osx-arm64;
$(OutputPath)runtimes\osx-x64"/>
@@ -64,12 +66,14 @@
$(PublishDir)runtimes\linux-musl-arm;
$(PublishDir)runtimes\linux-musl-arm64;
$(PublishDir)runtimes\linux-musl-x64;
+ $(PublishDir)runtimes\linux-musl-s390x;
$(PublishDir)runtimes\linux-ppc64le;
$(PublishDir)runtimes\linux-s390x;
$(PublishDir)runtimes\linux-x64;
$(PublishDir)runtimes\linux-x86;
$(PublishDir)runtimes\maccatalyst-arm64;
$(PublishDir)runtimes\maccatalyst-x64;
+ $(PublishDir)runtimes\osx;
$(PublishDir)runtimes\osx-arm64;
$(PublishDir)runtimes\osx-x64"/>
@@ -97,6 +101,8 @@
+
+
diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
index b88bd7640..7f17dc6bf 100644
--- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
+++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Helper/FaviconHelper.cs
@@ -1,5 +1,7 @@
using System;
using System.IO;
+using SkiaSharp;
+using Svg.Skia;
namespace Flow.Launcher.Plugin.BrowserBookmark.Helper;
@@ -65,12 +67,58 @@ public static class FaviconHelper
}
}
- public static bool IsSvgData(byte[] data)
+ public static byte[] TryConvertToWebp(byte[] data)
{
- if (data.Length < 5)
- return false;
- string start = System.Text.Encoding.ASCII.GetString(data, 0, Math.Min(100, data.Length));
- return start.Contains("