[READ-ONLY] Mirror of https://github.com/probablykasper/ferrum. Music library app for Mac, Linux and Windows ferrum.kasper.space
electron linux macos music music-library music-player napi windows
0

Configure Feed

Select the types of activity you want to include in your feed.

Add `LIBRARY` environment variable

Kasper (Sep 12, 2024, 2:08 AM +0200) e16c1a83 8b41cf5e

+28 -12
+1 -1
ferrum-addon/addon.d.ts
··· 3 3 4 4 /* auto-generated by NAPI-RS */ 5 5 6 - export declare function load_data(isDev: boolean): void 6 + export declare function load_data(isDev: boolean, libraryPath?: string | undefined | null): void 7 7 export interface PathsJs { 8 8 libraryDir: string 9 9 tracksDir: string
+17 -8
src-native/data.rs
··· 10 10 use serde::Serialize; 11 11 use std::env; 12 12 use std::io::Write; 13 + use std::path::PathBuf; 13 14 use std::time::Instant; 14 15 15 16 pub struct Data { ··· 57 58 None => &self.open_playlist_track_ids, 58 59 } 59 60 } 60 - pub fn load(is_dev: bool) -> UniResult<Data> { 61 + pub fn load(is_dev: bool, library_path: Option<String>) -> UniResult<Data> { 61 62 let paths = if is_dev { 62 - let appdata_dir = env::current_dir() 63 - .unwrap() 64 - .join("src-native") 65 - .join("appdata"); 66 - let library_dir = appdata_dir.join("Library"); 63 + let library_dir = match library_path { 64 + Some(path) => PathBuf::from(path), 65 + None => env::current_dir() 66 + .unwrap() 67 + .join("src-native") 68 + .join("appdata") 69 + .join("Library"), 70 + }; 67 71 Paths { 68 72 library_dir: library_dir.clone(), 69 73 tracks_dir: library_dir.join("Tracks"), ··· 73 77 .join("space.kasper.ferrum.dev"), 74 78 } 75 79 } else { 76 - let music_dir = dirs::audio_dir().ok_or("Music folder not found")?; 77 - let library_dir = music_dir.join("Ferrum"); 80 + let library_dir = match library_path { 81 + Some(path) => PathBuf::from(path), 82 + None => { 83 + let music_dir = dirs::audio_dir().ok_or("Music folder not found")?; 84 + music_dir.join("Ferrum") 85 + } 86 + }; 78 87 Paths { 79 88 library_dir: library_dir.clone(), 80 89 tracks_dir: library_dir.join("Tracks"),
+2 -2
src-native/data_js.rs
··· 8 8 9 9 #[napi(js_name = "load_data")] 10 10 #[allow(dead_code)] 11 - pub fn load_data(is_dev: bool, env: Env) -> Result<()> { 12 - let data = Data::load(is_dev)?; 11 + pub fn load_data(is_dev: bool, library_path: Option<String>, env: Env) -> Result<()> { 12 + let data = Data::load(is_dev, library_path)?; 13 13 env.set_instance_data(data, 0, |_ctx| {})?; 14 14 return Ok(()); 15 15 }
+4
src-native/library.rs
··· 29 29 Ok(_) => {} 30 30 Err(err) => throw!("Error ensuring folder exists: {}", err), 31 31 }; 32 + println!( 33 + "Loading library at path: {}", 34 + paths.library_dir.to_string_lossy() 35 + ); 32 36 33 37 let versioned_library = match File::open(&paths.library_json) { 34 38 Ok(mut file) => {
+1
src/electron/preload.ts
··· 4 4 5 5 window.addon = addon 6 6 window.isDev = is.dev 7 + window.libraryPath = process.env.LIBRARY 7 8 window.isMac = is.mac 8 9 window.isWindows = is.windows 9 10
+2 -1
src/lib/data.ts
··· 5 5 import { queue } from './queue' 6 6 7 7 export const isDev = window.isDev 8 + export const libraryPath = window.libraryPath 8 9 export const isMac = window.isMac 9 10 export const isWindows = window.isWindows 10 11 const innerAddon = window.addon 11 12 export const ItunesImport = innerAddon.ItunesImport 12 13 13 - call((addon) => addon.load_data(isDev)) 14 + call((addon) => addon.load_data(isDev, libraryPath)) 14 15 15 16 function getErrorMessage(err: unknown): string { 16 17 if (typeof err === 'object' && err !== null) {
+1
src/lib/window.ts
··· 15 15 interface Window { 16 16 addon: typeof Addon 17 17 isDev: boolean 18 + libraryPath?: string 18 19 isMac: boolean 19 20 isWindows: boolean 20 21 joinPaths: (...args: string[]) => string