using Flow.Launcher.Plugin.BrowserBookmark.Models; using Microsoft.AspNetCore.Authentication; using System.Collections.Generic; using System.IO; using System.Text.Json; namespace Flow.Launcher.Plugin.BrowserBookmark { public abstract class ChromiumBookmarkLoader : IBookmarkLoader { public abstract List GetBookmarks(); protected List LoadBookmarks(string browserDataPath, string name) { var bookmarks = new List(); if (!Directory.Exists(browserDataPath)) return bookmarks; var paths = Directory.GetDirectories(browserDataPath); foreach (var profile in paths) { var bookmarkPath = Path.Combine(profile, "Bookmarks"); if (!File.Exists(bookmarkPath)) continue; Main.RegisterBookmarkFile(bookmarkPath); var source = name + (Path.GetFileName(profile) == "Default" ? "" : $" ({Path.GetFileName(profile)})"); bookmarks.AddRange(LoadBookmarksFromFile(bookmarkPath, source)); } return bookmarks; } protected List LoadBookmarksFromFile(string path, string source) { if (!File.Exists(path)) return new(); var bookmarks = new List(); using var jsonDocument = JsonDocument.Parse(File.ReadAllText(path)); if (!jsonDocument.RootElement.TryGetProperty("roots", out var rootElement)) return new(); foreach (var folder in rootElement.EnumerateObject()) { if (folder.Value.ValueKind == JsonValueKind.Object) EnumerateFolderBookmark(folder.Value, bookmarks, source); } return bookmarks; } private void EnumerateFolderBookmark(JsonElement folderElement, List bookmarks, string source) { if (!folderElement.TryGetProperty("children", out var childrenElement)) return; foreach (var subElement in childrenElement.EnumerateArray()) { switch (subElement.GetProperty("type").GetString()) { case "folder": EnumerateFolderBookmark(subElement, bookmarks, source); break; default: bookmarks.Add(new Bookmark( subElement.GetProperty("name").GetString(), subElement.GetProperty("url").GetString(), source)); break; } } } } }