Workstream E (backend): wire tauri-specta — annotate commands, derive Type, generate-ready Builder
- Add #[specta::specta] to all 201 #[tauri::command] functions. - Derive specta::Type on all IPC DTOs (repository/types, settings, player/storage/ download command DTOs, player enums, jellyfin SessionInfo/NowPlayingItem/PlayState, ThumbnailCacheStats, DownloadInfo, CacheConfig, etc.). - Replace tauri::generate_handler! with a tauri_specta::Builder + collect_commands! in lib.rs (exports bindings.ts in debug builds). Two contract changes required by specta constraints (frontend migration follows): - specta caps command arity at 10 args: download_item_and_start / download_item / download_video now take a single request struct (params bundled, body unchanged via destructuring). - specta can't parse split serde rename_all: SessionInfo/NowPlayingItem/PlayState switched to rename_all = "PascalCase" (Jellyfin deserialization preserved; these now serialize PascalCase to the frontend). cargo check --lib is clean (0 errors). Frontend migration to bindings.ts is the next step.
This commit is contained in:
+236
-226
@@ -17,6 +17,7 @@ pub mod utils;
|
||||
use std::sync::{Arc, Mutex};
|
||||
use tokio::sync::Mutex as TokioMutex;
|
||||
use tauri::{Emitter, Manager};
|
||||
use tauri_specta::Builder;
|
||||
use log::{error, info};
|
||||
#[cfg(target_os = "android")]
|
||||
use log::warn;
|
||||
@@ -353,6 +354,240 @@ pub fn run() {
|
||||
.filter_level(log::LevelFilter::Info)
|
||||
.init();
|
||||
|
||||
let builder = Builder::<tauri::Wry>::new()
|
||||
.commands(tauri_specta::collect_commands![
|
||||
// Player commands
|
||||
player_play_item,
|
||||
player_play_queue,
|
||||
player_play_album_track,
|
||||
player_play_tracks,
|
||||
player_play,
|
||||
player_pause,
|
||||
player_toggle,
|
||||
player_stop,
|
||||
player_next,
|
||||
player_previous,
|
||||
player_seek,
|
||||
player_seek_video,
|
||||
player_set_volume,
|
||||
player_toggle_mute,
|
||||
player_set_audio_track,
|
||||
player_switch_audio_track,
|
||||
player_set_subtitle_track,
|
||||
player_toggle_shuffle,
|
||||
player_cycle_repeat,
|
||||
player_get_status,
|
||||
player_get_queue,
|
||||
player_add_to_queue,
|
||||
player_add_track_by_id,
|
||||
player_add_tracks_by_ids,
|
||||
player_remove_from_queue,
|
||||
player_move_in_queue,
|
||||
player_skip_to,
|
||||
player_set_audio_settings,
|
||||
player_get_audio_settings,
|
||||
player_set_video_settings,
|
||||
player_get_video_settings,
|
||||
// Sleep timer and autoplay commands
|
||||
player_set_sleep_timer,
|
||||
player_cancel_sleep_timer,
|
||||
player_get_sleep_timer,
|
||||
player_get_autoplay_settings,
|
||||
player_set_autoplay_settings,
|
||||
player_cancel_autoplay_countdown,
|
||||
player_play_next_episode,
|
||||
player_on_playback_ended,
|
||||
// Preload commands
|
||||
player_preload_upcoming,
|
||||
player_set_cache_config,
|
||||
player_get_cache_config,
|
||||
// Jellyfin reporting commands
|
||||
player_configure_jellyfin,
|
||||
player_disable_jellyfin,
|
||||
// Session management commands
|
||||
player_get_session,
|
||||
player_dismiss_session,
|
||||
// Remote session control commands
|
||||
remote_play_on_session,
|
||||
remote_send_command,
|
||||
remote_session_seek,
|
||||
remote_session_set_volume,
|
||||
remote_session_toggle_mute,
|
||||
// Session polling commands
|
||||
sessions_set_polling_hint,
|
||||
sessions_poll_now,
|
||||
// Playback mode commands
|
||||
playback_mode_get_current,
|
||||
playback_mode_set,
|
||||
playback_mode_is_transferring,
|
||||
playback_mode_transfer_to_remote,
|
||||
playback_mode_get_remote_status,
|
||||
playback_mode_transfer_to_local,
|
||||
// Playback reporting commands
|
||||
playback_reporter_init,
|
||||
playback_reporter_destroy,
|
||||
playback_report_start,
|
||||
playback_report_progress,
|
||||
playback_report_stopped,
|
||||
playback_mark_played,
|
||||
// Auth commands
|
||||
auth_initialize,
|
||||
auth_connect_to_server,
|
||||
auth_login,
|
||||
auth_verify_session,
|
||||
auth_logout,
|
||||
auth_get_session,
|
||||
auth_set_session,
|
||||
auth_start_verification,
|
||||
auth_stop_verification,
|
||||
auth_reauthenticate,
|
||||
// Device commands
|
||||
device_get_id,
|
||||
device_set_id,
|
||||
// Connectivity commands
|
||||
connectivity_check_server,
|
||||
connectivity_set_server_url,
|
||||
connectivity_get_status,
|
||||
connectivity_start_monitoring,
|
||||
connectivity_stop_monitoring,
|
||||
connectivity_mark_reachable,
|
||||
connectivity_mark_unreachable,
|
||||
// Storage commands
|
||||
storage_init,
|
||||
storage_get_path,
|
||||
storage_get_size,
|
||||
storage_get_security_status,
|
||||
storage_save_server,
|
||||
storage_get_servers,
|
||||
storage_delete_server,
|
||||
storage_save_user,
|
||||
storage_get_users,
|
||||
storage_set_active_user,
|
||||
storage_get_active_user,
|
||||
storage_get_active_session,
|
||||
storage_get_access_token,
|
||||
storage_delete_user,
|
||||
// Playback progress commands
|
||||
storage_update_playback_progress,
|
||||
storage_update_playback_context,
|
||||
storage_mark_played,
|
||||
storage_get_playback_progress,
|
||||
storage_mark_synced,
|
||||
storage_toggle_favorite,
|
||||
// Download commands
|
||||
download_item,
|
||||
download_item_and_start,
|
||||
download_album,
|
||||
download_video,
|
||||
download_series,
|
||||
download_season,
|
||||
get_downloads,
|
||||
pause_download,
|
||||
resume_download,
|
||||
cancel_download,
|
||||
delete_download,
|
||||
delete_all_downloads,
|
||||
delete_album_downloads,
|
||||
clear_stale_downloads,
|
||||
get_download_storage_stats,
|
||||
mark_download_completed,
|
||||
mark_download_failed,
|
||||
start_download,
|
||||
get_download_manager_stats,
|
||||
set_max_concurrent_downloads,
|
||||
get_smart_cache_stats,
|
||||
update_smart_cache_config,
|
||||
get_smart_cache_config,
|
||||
get_album_recommendations,
|
||||
get_album_affinity_status,
|
||||
// Pinning commands
|
||||
pin_item,
|
||||
unpin_item,
|
||||
is_item_pinned,
|
||||
// Offline commands
|
||||
offline_is_available,
|
||||
offline_get_items,
|
||||
offline_search,
|
||||
// Offline cache commands
|
||||
storage_get_libraries,
|
||||
storage_get_items,
|
||||
storage_get_item,
|
||||
storage_search_items,
|
||||
storage_save_library,
|
||||
storage_save_item,
|
||||
storage_get_pending_sync_count,
|
||||
// Sync queue commands
|
||||
sync_queue_mutation,
|
||||
sync_get_pending,
|
||||
sync_mark_processing,
|
||||
sync_mark_completed,
|
||||
sync_mark_failed,
|
||||
sync_get_pending_count,
|
||||
sync_cleanup_completed,
|
||||
sync_clear_user,
|
||||
// Thumbnail cache and image commands
|
||||
thumbnail_get_cached,
|
||||
thumbnail_save,
|
||||
thumbnail_get_stats,
|
||||
thumbnail_set_limit,
|
||||
thumbnail_clear_cache,
|
||||
thumbnail_delete_item,
|
||||
image_get_url,
|
||||
// People cache commands
|
||||
storage_save_person,
|
||||
storage_get_person,
|
||||
storage_save_item_people,
|
||||
storage_get_item_people,
|
||||
// Series audio preferences
|
||||
storage_save_series_audio_preference,
|
||||
storage_get_series_audio_preference,
|
||||
// Repository commands
|
||||
repository_create,
|
||||
repository_destroy,
|
||||
repository_get_libraries,
|
||||
repository_get_items,
|
||||
repository_get_item,
|
||||
repository_get_latest_items,
|
||||
repository_get_resume_items,
|
||||
repository_get_next_up_episodes,
|
||||
repository_get_recently_played_audio,
|
||||
repository_get_resume_movies,
|
||||
repository_get_genres,
|
||||
repository_search,
|
||||
repository_get_playback_info,
|
||||
repository_get_video_stream_url,
|
||||
repository_get_audio_stream_url,
|
||||
repository_report_playback_start,
|
||||
repository_report_playback_progress,
|
||||
repository_report_playback_stopped,
|
||||
repository_get_image_url,
|
||||
repository_mark_favorite,
|
||||
repository_unmark_favorite,
|
||||
repository_get_person,
|
||||
repository_get_items_by_person,
|
||||
repository_get_similar_items,
|
||||
// Playlist commands
|
||||
playlist_create,
|
||||
playlist_delete,
|
||||
playlist_rename,
|
||||
playlist_get_items,
|
||||
playlist_add_items,
|
||||
playlist_remove_items,
|
||||
playlist_move_item,
|
||||
// Conversion commands
|
||||
format_time_seconds,
|
||||
format_time_seconds_long,
|
||||
convert_ticks_to_seconds,
|
||||
calc_progress,
|
||||
convert_percent_to_volume,
|
||||
]);
|
||||
|
||||
// Export TypeScript bindings (types + typed invoke wrappers) in dev builds.
|
||||
#[cfg(debug_assertions)]
|
||||
builder
|
||||
.export(specta_typescript::Typescript::default(), "../src/lib/api/bindings.ts")
|
||||
.expect("Failed to export typescript bindings");
|
||||
|
||||
tauri::Builder::default()
|
||||
.plugin(tauri_plugin_opener::init())
|
||||
.plugin(tauri_plugin_os::init())
|
||||
@@ -596,232 +831,7 @@ pub fn run() {
|
||||
info!("[INIT] Application setup completed successfully");
|
||||
Ok(())
|
||||
})
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
// Player commands
|
||||
player_play_item,
|
||||
player_play_queue,
|
||||
player_play_album_track,
|
||||
player_play_tracks,
|
||||
player_play,
|
||||
player_pause,
|
||||
player_toggle,
|
||||
player_stop,
|
||||
player_next,
|
||||
player_previous,
|
||||
player_seek,
|
||||
player_seek_video,
|
||||
player_set_volume,
|
||||
player_toggle_mute,
|
||||
player_set_audio_track,
|
||||
player_switch_audio_track,
|
||||
player_set_subtitle_track,
|
||||
player_toggle_shuffle,
|
||||
player_cycle_repeat,
|
||||
player_get_status,
|
||||
player_get_queue,
|
||||
player_add_to_queue,
|
||||
player_add_track_by_id,
|
||||
player_add_tracks_by_ids,
|
||||
player_remove_from_queue,
|
||||
player_move_in_queue,
|
||||
player_skip_to,
|
||||
player_set_audio_settings,
|
||||
player_get_audio_settings,
|
||||
player_set_video_settings,
|
||||
player_get_video_settings,
|
||||
// Sleep timer and autoplay commands
|
||||
player_set_sleep_timer,
|
||||
player_cancel_sleep_timer,
|
||||
player_get_sleep_timer,
|
||||
player_get_autoplay_settings,
|
||||
player_set_autoplay_settings,
|
||||
player_cancel_autoplay_countdown,
|
||||
player_play_next_episode,
|
||||
player_on_playback_ended,
|
||||
// Preload commands
|
||||
player_preload_upcoming,
|
||||
player_set_cache_config,
|
||||
player_get_cache_config,
|
||||
// Jellyfin reporting commands
|
||||
player_configure_jellyfin,
|
||||
player_disable_jellyfin,
|
||||
// Session management commands
|
||||
player_get_session,
|
||||
player_dismiss_session,
|
||||
// Remote session control commands
|
||||
remote_play_on_session,
|
||||
remote_send_command,
|
||||
remote_session_seek,
|
||||
remote_session_set_volume,
|
||||
remote_session_toggle_mute,
|
||||
// Session polling commands
|
||||
sessions_set_polling_hint,
|
||||
sessions_poll_now,
|
||||
// Playback mode commands
|
||||
playback_mode_get_current,
|
||||
playback_mode_set,
|
||||
playback_mode_is_transferring,
|
||||
playback_mode_transfer_to_remote,
|
||||
playback_mode_get_remote_status,
|
||||
playback_mode_transfer_to_local,
|
||||
// Playback reporting commands
|
||||
playback_reporter_init,
|
||||
playback_reporter_destroy,
|
||||
playback_report_start,
|
||||
playback_report_progress,
|
||||
playback_report_stopped,
|
||||
playback_mark_played,
|
||||
// Auth commands
|
||||
auth_initialize,
|
||||
auth_connect_to_server,
|
||||
auth_login,
|
||||
auth_verify_session,
|
||||
auth_logout,
|
||||
auth_get_session,
|
||||
auth_set_session,
|
||||
auth_start_verification,
|
||||
auth_stop_verification,
|
||||
auth_reauthenticate,
|
||||
// Device commands
|
||||
device_get_id,
|
||||
device_set_id,
|
||||
// Connectivity commands
|
||||
connectivity_check_server,
|
||||
connectivity_set_server_url,
|
||||
connectivity_get_status,
|
||||
connectivity_start_monitoring,
|
||||
connectivity_stop_monitoring,
|
||||
connectivity_mark_reachable,
|
||||
connectivity_mark_unreachable,
|
||||
// Storage commands
|
||||
storage_init,
|
||||
storage_get_path,
|
||||
storage_get_size,
|
||||
storage_get_security_status,
|
||||
storage_save_server,
|
||||
storage_get_servers,
|
||||
storage_delete_server,
|
||||
storage_save_user,
|
||||
storage_get_users,
|
||||
storage_set_active_user,
|
||||
storage_get_active_user,
|
||||
storage_get_active_session,
|
||||
storage_get_access_token,
|
||||
storage_delete_user,
|
||||
// Playback progress commands
|
||||
storage_update_playback_progress,
|
||||
storage_update_playback_context,
|
||||
storage_mark_played,
|
||||
storage_get_playback_progress,
|
||||
storage_mark_synced,
|
||||
storage_toggle_favorite,
|
||||
// Download commands
|
||||
download_item,
|
||||
download_item_and_start,
|
||||
download_album,
|
||||
download_video,
|
||||
download_series,
|
||||
download_season,
|
||||
get_downloads,
|
||||
pause_download,
|
||||
resume_download,
|
||||
cancel_download,
|
||||
delete_download,
|
||||
delete_all_downloads,
|
||||
delete_album_downloads,
|
||||
clear_stale_downloads,
|
||||
get_download_storage_stats,
|
||||
mark_download_completed,
|
||||
mark_download_failed,
|
||||
start_download,
|
||||
get_download_manager_stats,
|
||||
set_max_concurrent_downloads,
|
||||
get_smart_cache_stats,
|
||||
update_smart_cache_config,
|
||||
get_smart_cache_config,
|
||||
get_album_recommendations,
|
||||
get_album_affinity_status,
|
||||
// Pinning commands
|
||||
pin_item,
|
||||
unpin_item,
|
||||
is_item_pinned,
|
||||
// Offline commands
|
||||
offline_is_available,
|
||||
offline_get_items,
|
||||
offline_search,
|
||||
// Offline cache commands
|
||||
storage_get_libraries,
|
||||
storage_get_items,
|
||||
storage_get_item,
|
||||
storage_search_items,
|
||||
storage_save_library,
|
||||
storage_save_item,
|
||||
storage_get_pending_sync_count,
|
||||
// Sync queue commands
|
||||
sync_queue_mutation,
|
||||
sync_get_pending,
|
||||
sync_mark_processing,
|
||||
sync_mark_completed,
|
||||
sync_mark_failed,
|
||||
sync_get_pending_count,
|
||||
sync_cleanup_completed,
|
||||
sync_clear_user,
|
||||
// Thumbnail cache and image commands
|
||||
thumbnail_get_cached,
|
||||
thumbnail_save,
|
||||
thumbnail_get_stats,
|
||||
thumbnail_set_limit,
|
||||
thumbnail_clear_cache,
|
||||
thumbnail_delete_item,
|
||||
image_get_url,
|
||||
// People cache commands
|
||||
storage_save_person,
|
||||
storage_get_person,
|
||||
storage_save_item_people,
|
||||
storage_get_item_people,
|
||||
// Series audio preferences
|
||||
storage_save_series_audio_preference,
|
||||
storage_get_series_audio_preference,
|
||||
// Repository commands
|
||||
repository_create,
|
||||
repository_destroy,
|
||||
repository_get_libraries,
|
||||
repository_get_items,
|
||||
repository_get_item,
|
||||
repository_get_latest_items,
|
||||
repository_get_resume_items,
|
||||
repository_get_next_up_episodes,
|
||||
repository_get_recently_played_audio,
|
||||
repository_get_resume_movies,
|
||||
repository_get_genres,
|
||||
repository_search,
|
||||
repository_get_playback_info,
|
||||
repository_get_video_stream_url,
|
||||
repository_get_audio_stream_url,
|
||||
repository_report_playback_start,
|
||||
repository_report_playback_progress,
|
||||
repository_report_playback_stopped,
|
||||
repository_get_image_url,
|
||||
repository_mark_favorite,
|
||||
repository_unmark_favorite,
|
||||
repository_get_person,
|
||||
repository_get_items_by_person,
|
||||
repository_get_similar_items,
|
||||
// Playlist commands
|
||||
playlist_create,
|
||||
playlist_delete,
|
||||
playlist_rename,
|
||||
playlist_get_items,
|
||||
playlist_add_items,
|
||||
playlist_remove_items,
|
||||
playlist_move_item,
|
||||
// Conversion commands
|
||||
format_time_seconds,
|
||||
format_time_seconds_long,
|
||||
convert_ticks_to_seconds,
|
||||
calc_progress,
|
||||
convert_percent_to_volume,
|
||||
])
|
||||
.invoke_handler(builder.invoke_handler())
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user