music_player_settings/
lib.rs1#[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}