feat(themes): implement community themes workshop and chunked uploader

This commit is contained in:
HorizonCode committed 2026-11-01 15:43:24 +01:00
1 parent d38250a5e4
commit 8816852fd9
6 files changed
+1255 -44

No files matched your search

+47
View File
@@ -86,6 +86,53 @@ pub fn file_size(path: String) -> Option<u64> {
metadata.is_file().then_some(metadata.len())
}
/// Calculate the SHA-256 checksum of a file on disk.
#[tauri::command]
pub async fn hash_file_sha256(path: String) -> Result<String, String> {
use sha2::{Digest, Sha256};
use std::io::Read;
tokio::task::spawn_blocking(move || {
let mut file = std::fs::File::open(&path)
.map_err(|e| format!("Failed to open file for hashing: {e}"))?;
let mut hasher = Sha256::new();
let mut buffer = [0u8; 65536];
loop {
let bytes_read = file
.read(&mut buffer)
.map_err(|e| format!("Failed to read file for hashing: {e}"))?;
if bytes_read == 0 {
break;
}
hasher.update(&buffer[..bytes_read]);
}
Ok::<_, String>(hex::encode(hasher.finalize()))
})
.await
.map_err(|e| format!("Thread error: {e}"))?
}
/// Read a chunk of a file on disk starting at `offset` for `length` bytes.
#[tauri::command]
pub async fn read_file_chunk(path: String, offset: u64, length: u64) -> Result<Vec<u8>, String> {
use std::io::{Read, Seek, SeekFrom};
tokio::task::spawn_blocking(move || {
let mut file = std::fs::File::open(&path)
.map_err(|e| format!("Failed to open file for chunk read: {e}"))?;
file.seek(SeekFrom::Start(offset))
.map_err(|e| format!("Failed to seek to offset {offset}: {e}"))?;
let mut buffer = vec![0u8; length as usize];
let bytes_read = file
.read(&mut buffer)
.map_err(|e| format!("Failed to read chunk bytes: {e}"))?;
buffer.truncate(bytes_read);
Ok::<_, String>(buffer)
})
.await
.map_err(|e| format!("Thread error: {e}"))?
}
#[tauri::command]
pub fn get_hwid() -> String {
get_id()
+4 -2
View File
@@ -24,12 +24,12 @@ use crate::{
export_theme, extract_theme, file_size, find_osu_installation, focus_presence_editor, focus_theme_editor, get_beatmapsets_count,
get_ezpp_launcher_update_files, get_hwid, get_launcher_version, get_osu_release_stream,
get_osu_skin, get_osu_version, get_platform, get_skins_count, has_net8, has_osuwinello,
has_wmctrl, install_ezpp_launcher_update, installation_diagnostics,
has_wmctrl, hash_file_sha256, install_ezpp_launcher_update, installation_diagnostics,
is_open_tablet_driver_path_valid, is_open_tablet_driver_running, is_osu_running,
list_theme_backups, log_frontend, open_logs_folder, open_presence_editor, open_theme_editor, open_theme_folder,
open_url_in_browser, opened_urls, optimize_theme_media, pick_osu_installation,
presence_connect, presence_disconnect, presence_is_connected, presence_update_activity,
presence_update_button, presence_update_status, presence_update_user, read_theme_info, replace_ui_files,
presence_update_button, presence_update_status, presence_update_user, read_file_chunk, read_theme_info, replace_ui_files,
resolve_osu_folder, restore_theme_backup, reveal_window, run_open_tablet_driver, run_osu, run_osu_updater,
save_theme_project, set_logging_enabled, set_osu_config_values, set_osu_user_config_values,
stop_open_tablet_driver, theme_asset_base, theme_editor_context, theme_preview_url,
@@ -194,6 +194,8 @@ pub fn run() {
download_and_extract_theme,
save_theme_project,
export_theme,
hash_file_sha256,
read_file_chunk,
open_theme_folder,
open_theme_editor,
focus_theme_editor,