music_player_settings/
lib.rs

1#[cfg(test)]
2mod tests;
3
4use std::{
5    env,
6    fs::{self, File},
7    io::Write,
8    path::{Path, PathBuf},
9};
10
11use config::{Config, ConfigError};
12use serde::{Deserialize, Serialize};
13use uuid::Uuid;
14
15#[derive(Serialize, Deserialize, Debug)]
16pub struct Settings {
17    pub database_url: String,
18    pub port: u16,
19    pub ws_port: u16,
20    pub addons: Option<Vec<String>>,
21    pub music_directory: String,
22    pub host: String,
23    pub device_name: String,
24    pub device_id: String,
25    pub http_port: u16,
26    pub tauri_enable_graphql_server: bool,
27}
28
29pub fn read_settings() -> Result<Config, ConfigError> {
30    let path = match env::consts::OS {
31        "android" => "/storage/emulated/0/Android/data/com.songbird/files".to_owned(),
32        _ => {
33            let config_dir = dirs::config_dir().unwrap();
34            format!("{}/music-player", config_dir.to_str().unwrap())
35        }
36    };
37
38    let music_directory = match env::consts::OS {
39        "android" => "/storage/emulated/0/Music".to_owned(),
40        _ => {
41            let mut tmp = PathBuf::new();
42            tmp.push("/tmp");
43            let music_dir = dirs::audio_dir().unwrap_or(tmp);
44            music_dir.to_str().unwrap().to_owned()
45        }
46    };
47
48    let covers_path = format!("{}/covers", path);
49
50    fs::create_dir_all(&covers_path).unwrap();
51
52    let device_id = format!("{:x}", md5::compute(Uuid::new_v4().to_string()));
53
54    let mut tmp = PathBuf::new();
55    tmp.push("/tmp");
56
57    let default_settings = Settings {
58        database_url: format!("sqlite:{}/music-player.sqlite3", path),
59        port: 5051,
60        ws_port: 5052,
61        addons: Some(vec![
62            "deezer".to_string(),
63            "datpiff".to_string(),
64            "genius".to_string(),
65            "local".to_string(),
66            "myvazo".to_string(),
67            "tononkira".to_string(),
68            "musicbrainz".to_string(),
69            "lastfm".to_string(),
70        ]),
71        music_directory,
72        host: "0.0.0.0".to_string(),
73        device_name: "Music Player".to_string(),
74        device_id,
75        http_port: 5053,
76        tauri_enable_graphql_server: false,
77    };
78
79    let settings_path = format!("{}/settings.toml", path);
80
81    if !Path::new(&settings_path).exists() {
82        let mut file = File::create(format!("{}/settings.toml", path)).unwrap();
83        file.write_all(
84            toml::to_string_pretty(&default_settings)
85                .unwrap()
86                .as_bytes(),
87        )
88        .unwrap();
89    }
90
91    Config::builder()
92        .add_source(config::File::with_name(&settings_path))
93        .add_source(config::Environment::with_prefix("MUSIC_PLAYER"))
94        .set_default("database_url", default_settings.database_url)?
95        .set_default("port", default_settings.port)?
96        .set_default("addons", default_settings.addons)?
97        .set_default("ws_port", default_settings.ws_port)?
98        .set_default("music_directory", default_settings.music_directory)?
99        .set_default("host", default_settings.host)?
100        .set_default("device_name", default_settings.device_name)?
101        .set_default("device_id", default_settings.device_id)?
102        .set_default("http_port", default_settings.http_port)?
103        .set_default(
104            "tauri_enable_graphql_server",
105            default_settings.tauri_enable_graphql_server,
106        )?
107        .build()
108}
109
110pub fn get_application_directory() -> String {
111    let config_dir = match env::consts::OS {
112        "android" => "/storage/emulated/0/Android/data/com.songbird/files".to_owned(),
113        _ => {
114            let config_dir = dirs::config_dir().unwrap();
115            format!("{}/music-player", config_dir.to_str().unwrap())
116        }
117    };
118    let path = env::var("MUSIC_PLAYER_APPLICATION_DIRECTORY").unwrap_or_else(|_| config_dir);
119    let albums = format!("{}/albums", path);
120    let artists = format!("{}/artists", path);
121    let playlists = format!("{}/playlists", path);
122    let tracks = format!("{}/tracks", path);
123    let covers = format!("{}/covers", path);
124    let cache = format!("{}/cache", path);
125    fs::create_dir_all(&albums).unwrap();
126    fs::create_dir_all(&artists).unwrap();
127    fs::create_dir_all(&playlists).unwrap();
128    fs::create_dir_all(&tracks).unwrap();
129    fs::create_dir_all(&covers).unwrap();
130    fs::create_dir_all(&cache).unwrap();
131
132    path
133}