From 3607ed289373506ca09da49789531b6d678f8289 Mon Sep 17 00:00:00 2001 From: pandadev <70103896+0PandaDEV@users.noreply.github.com> Date: Wed, 17 Jul 2024 19:27:26 +0200 Subject: [PATCH] force convert favicon to png --- src-tauri/src/clipboard.rs | 74 +++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/src-tauri/src/clipboard.rs b/src-tauri/src/clipboard.rs index c765fcc..755eb74 100644 --- a/src-tauri/src/clipboard.rs +++ b/src-tauri/src/clipboard.rs @@ -1,19 +1,20 @@ use arboard::Clipboard; use base64::engine::general_purpose::STANDARD; use base64::Engine; +use image::io::Reader as ImageReader; +use image::ImageFormat; use rand::distributions::Alphanumeric; use rand::{thread_rng, Rng}; use rdev::{simulate, EventType, Key}; +use regex::Regex; +use reqwest::Client; use sqlx::SqlitePool; +use std::io::Cursor; use std::thread; use std::time::Duration; use tauri::Manager; use tokio::runtime::Runtime; use url::Url; -use reqwest::Client; -use regex::Regex; -use image::ImageFormat; -use std::io::Cursor; #[tauri::command] pub fn simulate_paste() { @@ -110,58 +111,55 @@ async fn insert_content_if_not_exists(pool: &SqlitePool, content_type: &str, con .map(char::from) .collect(); - let url_regex = Regex::new(r"https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)").unwrap(); - let favicon_base64 = if content_type == "text" { - if let Some(url_match) = url_regex.find(&content) { - let url_str = url_match.as_str(); - match Url::parse(url_str) { - Ok(url) => { - match fetch_favicon_as_base64(url).await { - Ok(Some(favicon)) => { - println!("Favicon fetched successfully."); - Some(favicon) - }, - Ok(None) => { - println!("No favicon found."); - None - }, - Err(e) => { - println!("Failed to fetch favicon: {}", e); - None - } - } - }, + let url_regex = Regex::new(r"^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)$").unwrap(); + let favicon_base64 = if content_type == "text" && url_regex.is_match(&content) { + match Url::parse(&content) { + Ok(url) => match fetch_favicon_as_base64(url).await { + Ok(Some(favicon)) => Some(favicon), + Ok(None) => None, Err(e) => { - println!("Failed to parse URL: {}", e); + println!("Failed to fetch favicon: {}", e); None } + }, + Err(e) => { + println!("Failed to parse URL: {}", e); + None } - } else { - None } } else { None }; - let _ = sqlx::query("INSERT INTO history (id, content_type, content, favicon) VALUES (?, ?, ?, ?, ?)") - .bind(id) - .bind(content_type) - .bind(content) - .bind(favicon_base64) - .execute(pool) - .await; + let _ = sqlx::query( + "INSERT INTO history (id, content_type, content, favicon) VALUES (?, ?, ?, ?)", + ) + .bind(id) + .bind(content_type) + .bind(content) + .bind(favicon_base64) + .execute(pool) + .await; } } -async fn fetch_favicon_as_base64(url: Url) -> Result, reqwest::Error> { - println!("Checking for favicon at URL: {}", url.origin().ascii_serialization()); +async fn fetch_favicon_as_base64(url: Url) -> Result, Box> { + println!( + "Checking for favicon at URL: {}", + url.origin().ascii_serialization() + ); let client = Client::new(); let favicon_url = format!("https://icon.horse/icon/{}", url.host_str().unwrap()); let response = client.get(&favicon_url).send().await?; if response.status().is_success() { let bytes = response.bytes().await?; - Ok(Some(STANDARD.encode(&bytes))) + let img = ImageReader::new(Cursor::new(bytes)) + .with_guessed_format()? + .decode()?; + let mut png_bytes: Vec = Vec::new(); + img.write_to(&mut Cursor::new(&mut png_bytes), ImageFormat::Png)?; + Ok(Some(STANDARD.encode(&png_bytes))) } else { Ok(None) }