diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 047f691..0a5608e 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -3114,6 +3114,7 @@ version = "0.1.0" dependencies = [ "base64 0.22.1", "cocoa 0.26.0", + "dirs", "entity", "migration", "rodio", @@ -3129,6 +3130,7 @@ dependencies = [ "tauri-plugin-os", "tauri-plugin-sql", "tauri-plugin-window-state", + "tokio", "window-vibrancy", ] @@ -6293,13 +6295,26 @@ dependencies = [ "bytes", "libc", "mio", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.5.8", + "tokio-macros", "tracing", "windows-sys 0.52.0", ] +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "tokio-stream" version = "0.1.17" diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index d6766c7..a839644 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -36,6 +36,8 @@ tauri-plugin-os = "2" base64 = "0.22.1" tauri-plugin-sql = { version = "2", features = ["sqlite"] } sea-orm = { version = "1.1.0", features = [ "sqlx-sqlite", "runtime-async-std-rustls", "macros" ] } +dirs = "5.0.1" +tokio = { version = "1.42.0", features = ["full"] } [target."cfg(target_os = \"macos\")".dependencies] cocoa = "0.26" diff --git a/src-tauri/migration/src/m20220101_000001_create_table.rs b/src-tauri/migration/src/m20220101_000001_create_table.rs index 1863d6d..2c04be3 100644 --- a/src-tauri/migration/src/m20220101_000001_create_table.rs +++ b/src-tauri/migration/src/m20220101_000001_create_table.rs @@ -6,36 +6,28 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - // Replace the sample below with your own migration scripts - todo!(); - manager .create_table( Table::create() - .table(Post::Table) + .table(Song::Table) .if_not_exists() - .col(pk_auto(Post::Id)) - .col(string(Post::Title)) - .col(string(Post::Text)) + .col(pk_auto(Song::Id)) + .col(string(Song::Path)) .to_owned(), ) .await } async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> { - // Replace the sample below with your own migration scripts - todo!(); - manager - .drop_table(Table::drop().table(Post::Table).to_owned()) + .drop_table(Table::drop().table(Song::Table).to_owned()) .await } } #[derive(DeriveIden)] -enum Post { +enum Song { Table, Id, - Title, - Text, + Path, } diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 23ccbb7..7ce4c2c 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -4,14 +4,33 @@ mod music; mod state; +use migration::{Migrator, MigratorTrait}; +use sea_orm::Database; use std::sync::Mutex; use tauri::Manager; use tauri_plugin_decorum::WebviewWindowExt; use window_vibrancy::{apply_vibrancy, NSVisualEffectMaterial}; -use migration::{Migrator, MigratorTrait}; #[cfg_attr(mobile, tauri::mobile_entry_point)] -pub fn run() { +pub async fn run() { + let app_data_dir = dirs::data_dir() + .map(|dir| dir.join("moonsound")).unwrap(); + + // If app_data_dir does not exist, create it + if !app_data_dir.exists() { + std::fs::create_dir_all(&app_data_dir).unwrap(); + } + + let db_url = format!( + "sqlite://{}?mode=rwc", + app_data_dir.join("music.db").to_string_lossy() + ); + + let conn = Database::connect(db_url) + .await + .expect("Database connection failed"); + Migrator::up(&conn, None).await.unwrap(); + tauri::Builder::default() .plugin(tauri_plugin_sql::Builder::new().build()) .plugin(tauri_plugin_os::init()) @@ -20,7 +39,8 @@ pub fn run() { .plugin(tauri_plugin_window_state::Builder::default().build()) .plugin(tauri_plugin_decorum::init()) .setup(|app| { - app.manage(Mutex::new(state::AppData::default())); + let state = Mutex::new(state::AppData::new(conn)); + app.manage(state); let main_window = app.get_webview_window("main").unwrap(); main_window.create_overlay_titlebar().unwrap(); diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 74d56d2..657372f 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,6 +1,7 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] -fn main() { - moonsound_lib::run() +#[tokio::main] +async fn main() { + moonsound_lib::run().await; } diff --git a/src-tauri/src/state.rs b/src-tauri/src/state.rs index bbd2297..6f5b1c6 100644 --- a/src-tauri/src/state.rs +++ b/src-tauri/src/state.rs @@ -1,17 +1,20 @@ use rodio::{OutputStream, OutputStreamHandle, Sink}; +use sea_orm::DatabaseConnection; pub struct AppData { pub currently_playing_file_path: Option, pub sink: Sink, pub stream_handle: OutputStreamHandle, + pub conn: DatabaseConnection, } -impl Default for AppData { - fn default() -> Self { - let (_stream, stream_handle )= OutputStream::try_default().unwrap(); +impl AppData { + pub fn new(conn: DatabaseConnection) -> Self { + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); let sink: Sink = Sink::try_new(&stream_handle).unwrap(); Self { + conn, currently_playing_file_path: None, sink, stream_handle,