mirror of
				https://github.com/Vomitblood/stort.git
				synced 2025-11-04 04:37:21 +08:00 
			
		
		
		
	added rust backend webp animation checker
This commit is contained in:
		
							parent
							
								
									6e006d55f9
								
							
						
					
					
						commit
						de471c3f73
					
				
							
								
								
									
										22
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										22
									
								
								src-tauri/Cargo.lock
									
									
									
										generated
									
									
									
								
							| 
						 | 
					@ -72,11 +72,13 @@ checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
 | 
				
			||||||
name = "app"
 | 
					name = "app"
 | 
				
			||||||
version = "0.1.0"
 | 
					version = "0.1.0"
 | 
				
			||||||
dependencies = [
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "gif",
 | 
				
			||||||
 "image 0.25.2",
 | 
					 "image 0.25.2",
 | 
				
			||||||
 "serde",
 | 
					 "serde",
 | 
				
			||||||
 "serde_json",
 | 
					 "serde_json",
 | 
				
			||||||
 "tauri",
 | 
					 "tauri",
 | 
				
			||||||
 "tauri-build",
 | 
					 "tauri-build",
 | 
				
			||||||
 | 
					 "webp",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
| 
						 | 
					@ -1998,6 +2000,16 @@ dependencies = [
 | 
				
			||||||
 "libc",
 | 
					 "libc",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "libwebp-sys"
 | 
				
			||||||
 | 
					version = "0.9.5"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "829b6b604f31ed6d2bccbac841fe0788de93dbd87e4eb1ba2c4adfe8c012a838"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "cc",
 | 
				
			||||||
 | 
					 "glob",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "linux-raw-sys"
 | 
					name = "linux-raw-sys"
 | 
				
			||||||
version = "0.3.8"
 | 
					version = "0.3.8"
 | 
				
			||||||
| 
						 | 
					@ -4323,6 +4335,16 @@ dependencies = [
 | 
				
			||||||
 "system-deps 6.2.2",
 | 
					 "system-deps 6.2.2",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[package]]
 | 
				
			||||||
 | 
					name = "webp"
 | 
				
			||||||
 | 
					version = "0.3.0"
 | 
				
			||||||
 | 
					source = "registry+https://github.com/rust-lang/crates.io-index"
 | 
				
			||||||
 | 
					checksum = "8f53152f51fb5af0c08484c33d16cca96175881d1f3dec068c23b31a158c2d99"
 | 
				
			||||||
 | 
					dependencies = [
 | 
				
			||||||
 | 
					 "image 0.25.2",
 | 
				
			||||||
 | 
					 "libwebp-sys",
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[package]]
 | 
					[[package]]
 | 
				
			||||||
name = "webview2-com"
 | 
					name = "webview2-com"
 | 
				
			||||||
version = "0.19.1"
 | 
					version = "0.19.1"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,8 @@ serde_json = "1.0"
 | 
				
			||||||
serde = { version = "1.0", features = ["derive"] }
 | 
					serde = { version = "1.0", features = ["derive"] }
 | 
				
			||||||
tauri = { version = "1.7.0", features = [ "protocol-all", "fs-all", "path-all", "window-all", "process-all", "notification-all", "dialog-all"] }
 | 
					tauri = { version = "1.7.0", features = [ "protocol-all", "fs-all", "path-all", "window-all", "process-all", "notification-all", "dialog-all"] }
 | 
				
			||||||
image = "0.25.2"
 | 
					image = "0.25.2"
 | 
				
			||||||
 | 
					webp = "0.3.0"
 | 
				
			||||||
 | 
					gif = "0.13.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[features]
 | 
					[features]
 | 
				
			||||||
# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
 | 
					# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										82
									
								
								src-tauri/src/bin/testing.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								src-tauri/src/bin/testing.rs
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,82 @@
 | 
				
			||||||
 | 
					#[derive(Debug, PartialEq)]
 | 
				
			||||||
 | 
					enum ImageType {
 | 
				
			||||||
 | 
					    Jpeg,
 | 
				
			||||||
 | 
					    Png,
 | 
				
			||||||
 | 
					    Gif,
 | 
				
			||||||
 | 
					    WebP,
 | 
				
			||||||
 | 
					    AnimatedWebP,
 | 
				
			||||||
 | 
					    Unsupported,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fn process_image(file_path_string: String) -> Result<String, String> {
 | 
				
			||||||
 | 
					//     // convert string to path to use in rust
 | 
				
			||||||
 | 
					//     let file_path = std::path::Path::new(&file_path_string);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // get the data directory path
 | 
				
			||||||
 | 
					//     let data_dir = tauri::api::path::data_dir().ok_or("Failed to get data directory")?;
 | 
				
			||||||
 | 
					//     let mut destination = data_dir.clone();
 | 
				
			||||||
 | 
					//     // we can hardcode the file name since
 | 
				
			||||||
 | 
					//     // 1. we are only dealing with one wallpaper image at a time
 | 
				
			||||||
 | 
					//     // 2. we will be converting all images to the webp format
 | 
				
			||||||
 | 
					//     destination.push("wallpaper.webp");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // determine the file format
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// fn determine_image_type(file_path: &std::path::Path) -> Result<ImageType, String> {
 | 
				
			||||||
 | 
					//     // open the file
 | 
				
			||||||
 | 
					//     let mut file =
 | 
				
			||||||
 | 
					//         std::fs::File::open(file_path).map_err(|e| format!("Failed to open file: {e}"))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // read the first few bytes to determine the format
 | 
				
			||||||
 | 
					//     let mut buffer = [0; 12];
 | 
				
			||||||
 | 
					//     file.read_exact(&mut buffer)
 | 
				
			||||||
 | 
					//         .map_err(|e| format!("Failed to read file: {e}"))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//     // check statis formats
 | 
				
			||||||
 | 
					//     if let Some(format) = image::guess_format(&buffer).ok() {
 | 
				
			||||||
 | 
					//         match format {
 | 
				
			||||||
 | 
					//             image::ImageFormat::Jpeg => return Ok(ImageType::Jpeg),
 | 
				
			||||||
 | 
					//             image::ImageFormat::Png => return Ok(ImageType::Png),
 | 
				
			||||||
 | 
					//             image::ImageFormat::Gif => return Ok(ImageType::Gif),
 | 
				
			||||||
 | 
					//             image::ImageFormat::WebP => {
 | 
				
			||||||
 | 
					//                 // additional check if is animated
 | 
				
			||||||
 | 
					//                 if is_animated_webp(file_path) {
 | 
				
			||||||
 | 
					//                     return Ok(ImageType::AnimatedWebP);
 | 
				
			||||||
 | 
					//                 } else {
 | 
				
			||||||
 | 
					//                     return Ok(ImageType::WebP);
 | 
				
			||||||
 | 
					//                 }
 | 
				
			||||||
 | 
					//             }
 | 
				
			||||||
 | 
					//             _ => return Ok(ImageType::Unsupported),
 | 
				
			||||||
 | 
					//         }
 | 
				
			||||||
 | 
					//     } else {
 | 
				
			||||||
 | 
					//         return Ok(ImageType::Unsupported);
 | 
				
			||||||
 | 
					//     }
 | 
				
			||||||
 | 
					// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/// check if the file is a valid webp image and if it is animated
 | 
				
			||||||
 | 
					/// returns `Ok(true)` if it is animated, `Ok(false)` if it is not
 | 
				
			||||||
 | 
					/// and errors out if the file cannot be read or is not a webp
 | 
				
			||||||
 | 
					fn is_animated_webp(file_path: &std::path::Path) -> Result<bool, String> {
 | 
				
			||||||
 | 
					    // open the file and read its contents into a buffer
 | 
				
			||||||
 | 
					    let mut buffer = Vec::new();
 | 
				
			||||||
 | 
					    std::fs::File::open(file_path)
 | 
				
			||||||
 | 
					        .and_then(|mut file| std::io::Read::read_to_end(&mut file, &mut buffer))
 | 
				
			||||||
 | 
					        .map_err(|e| format!("Failed to read file: {}", e))?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // use the webp crate to decode the image and check for animation
 | 
				
			||||||
 | 
					    webp::AnimDecoder::new(&buffer)
 | 
				
			||||||
 | 
					        .decode()
 | 
				
			||||||
 | 
					        .map(|anim| anim.has_animation())
 | 
				
			||||||
 | 
					        .map_err(|_| "File is not a valid WebP image".to_string())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					    // Example usage
 | 
				
			||||||
 | 
					    let path = std::path::Path::new("/home/vomitblood/Downloads/Win10_22H2_English_x64v1.iso");
 | 
				
			||||||
 | 
					    match is_animated_webp(path) {
 | 
				
			||||||
 | 
					        Ok(true) => println!("The WebP is animated."),
 | 
				
			||||||
 | 
					        Ok(false) => println!("The WebP is not animated."),
 | 
				
			||||||
 | 
					        Err(e) => println!("Error: {}", e),
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,8 @@
 | 
				
			||||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
 | 
					// Prevents additional console window on Windows in release, DO NOT REMOVE!!
 | 
				
			||||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
 | 
					#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[tauri::command]
 | 
					 | 
				
			||||||
fn hello(content: &str) -> String {
 | 
					 | 
				
			||||||
    format!("Hello {}, what is your name?!", content)
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
fn main() {
 | 
					fn main() {
 | 
				
			||||||
    tauri::Builder::default()
 | 
					    tauri::Builder::default()
 | 
				
			||||||
        .invoke_handler(tauri::generate_handler![hello])
 | 
					 | 
				
			||||||
        .run(tauri::generate_context!())
 | 
					        .run(tauri::generate_context!())
 | 
				
			||||||
        .expect("error while running tauri application");
 | 
					        .expect("error while running tauri application");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue