[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.

Show artist list

Kasper (Sep 12, 2024, 9:33 AM +0200) e819df2f b724dbc5

+41 -11
+1
ferrum-addon/addon.d.ts
··· 3 3 4 4 /* auto-generated by NAPI-RS */ 5 5 6 + export declare function get_artists(): Array<string> 6 7 export declare function load_data(isDev: boolean, libraryPath?: string | undefined | null): void 7 8 export interface PathsJs { 8 9 libraryDir: string
+11 -1
src-native/artists.rs
··· 1 + use crate::data::Data; 2 + use crate::data_js::get_data; 1 3 use crate::library_types::Library; 4 + use napi::{Env, Result}; 2 5 use std::collections::HashSet; 3 6 use std::time::Instant; 4 7 5 - pub fn get_artists(library: &Library) -> HashSet<String> { 8 + pub fn load_artists(library: &Library) -> HashSet<String> { 6 9 let now = Instant::now(); 7 10 let mut artists = HashSet::new(); 8 11 for (_, track) in &library.tracks { ··· 13 16 println!("Get artists: {}ms", now.elapsed().as_millis()); 14 17 return artists; 15 18 } 19 + 20 + #[napi(js_name = "get_artists")] 21 + #[allow(dead_code)] 22 + pub fn get_artists(env: Env) -> Result<Vec<String>> { 23 + let data: &mut Data = get_data(&env)?; 24 + Ok(data.artists.clone().into_iter().collect()) 25 + }
+2 -2
src-native/data.rs
··· 1 - use crate::artists::get_artists; 1 + use crate::artists::load_artists; 2 2 use crate::library::{load_library, Paths}; 3 3 use crate::library_types::{Library, TrackID, TrackList, TrackListID}; 4 4 use crate::page::{get_track_ids, ViewAs}; ··· 103 103 104 104 let loaded_library = load_library(&paths)?; 105 105 let loaded_cache = SidebarView::load(&paths); 106 - let artists = get_artists(&loaded_library); 106 + let artists = load_artists(&loaded_library); 107 107 108 108 let mut data = Data { 109 109 is_dev,
+7 -2
src/App.svelte
··· 9 9 import PlaylistInfoModal from './components/PlaylistInfo.svelte' 10 10 import { queueVisible } from './lib/queue' 11 11 import { ipcListen, ipcRenderer } from '@/lib/window' 12 - import { importTracks, type PlaylistInfo, methods } from './lib/data' 12 + import { importTracks, type PlaylistInfo, methods, page } from './lib/data' 13 13 import { playPause } from './lib/player' 14 14 import DragGhost from './components/DragGhost.svelte' 15 15 import ItunesImport from './components/ItunesImport.svelte' ··· 17 17 import { modalCount } from './components/Modal.svelte' 18 18 import QuickNav from './components/QuickNav.svelte' 19 19 import { checkShortcut } from './lib/helpers' 20 + import ArtistList from './components/ArtistList.svelte' 20 21 21 22 ipcRenderer.emit('appLoaded') 22 23 ··· 184 185 > 185 186 <div class="meat"> 186 187 <Sidebar /> 187 - <TrackList {onTrackInfo} /> 188 + {#if $page.viewAs === 0} 189 + <TrackList {onTrackInfo} /> 190 + {:else} 191 + <ArtistList /> 192 + {/if} 188 193 {#if $queueVisible} 189 194 <Queue {onTrackInfo} /> 190 195 {/if}
+11
src/components/ArtistList.svelte
··· 1 + <script lang="ts"> 2 + import { page } from '@/lib/data' 3 + 4 + $: artists = page.get_artists() 5 + </script> 6 + 7 + <div class="size-full overflow-y-auto"> 8 + {#each artists as artist} 9 + <p class="block">{artist}</p> 10 + {/each} 11 + </div>
+9 -6
src/lib/data.ts
··· 296 296 set, 297 297 update, 298 298 refreshIdsAndKeepSelection, 299 - openPlaylist: (id: string, view_as: ViewAs) => { 299 + openPlaylist(id: string, view_as: ViewAs) { 300 300 call((data) => data.open_playlist(id, view_as)) 301 301 refreshIdsAndKeepSelection() 302 302 pageSelection.clear() 303 303 filter.set('') 304 304 }, 305 - sortBy: (key: string) => { 305 + sortBy(key: string) { 306 306 call((addon) => addon.sort(key, true)) 307 307 refreshIdsAndKeepSelection() 308 308 pageSelection.clear() 309 309 }, 310 - set_group_album_tracks: (value: boolean) => { 310 + set_group_album_tracks(value: boolean) { 311 311 call((addon) => addon.set_group_album_tracks(value)) 312 312 refreshIdsAndKeepSelection() 313 313 pageSelection.clear() 314 314 }, 315 - getTrack: (index: number) => { 315 + get_artists() { 316 + return call((addon) => addon.get_artists()) 317 + }, 318 + getTrack(index: number) { 316 319 return call((addon) => addon.get_page_track(index)) 317 320 }, 318 - getTrackId: (index: number) => { 321 + getTrackId(index: number) { 319 322 return call((data) => data.get_page_track_id(index)) 320 323 }, 321 - getTrackIds: () => { 324 + getTrackIds() { 322 325 return call((data) => data.get_page_track_ids()) 323 326 }, 324 327 moveTracks: (indexes: number[], toIndex: number) => {