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

Reorganise out of page.rs

Kasper (Sep 26, 2024, 3:20 AM +0200) f0255b62 e62dbcb1

+59 -60
+1 -59
src-native/page.rs
··· 1 1 use crate::data::Data; 2 2 use crate::data_js::get_data; 3 3 use crate::filter::filter; 4 - use crate::library_types::{ItemId, Library, SpecialTrackListName, TrackList}; 4 + use crate::library_types::{ItemId, TrackList}; 5 5 use crate::sort::sort; 6 - use crate::UniResult; 7 6 use napi::{Env, JsUnknown, Result}; 8 - use std::collections::HashSet; 9 7 10 8 #[napi(object)] 11 9 #[derive(Clone)] ··· 60 58 Ok(track_page) 61 59 } 62 60 63 - pub fn get_tracklist_item_ids(library: &Library, playlist_id: &str) -> UniResult<Vec<ItemId>> { 64 - match library.get_tracklist(playlist_id)? { 65 - TrackList::Playlist(playlist) => Ok(playlist.tracks.clone()), 66 - TrackList::Folder(folder) => { 67 - let mut ids: HashSet<ItemId> = HashSet::new(); 68 - for child in &folder.children { 69 - let child_ids = get_tracklist_item_ids(library, &child)?; 70 - ids.extend(child_ids); 71 - } 72 - Ok(ids.into_iter().collect()) 73 - } 74 - TrackList::Special(special) => match special.name { 75 - SpecialTrackListName::Root => { 76 - let item_ids = library.get_track_item_ids().values().cloned().collect(); 77 - Ok(item_ids) 78 - } 79 - }, 80 - } 81 - } 82 - 83 61 #[napi] 84 62 pub enum ViewAs { 85 63 Songs, ··· 101 79 pub sort_desc: bool, 102 80 pub length: i64, 103 81 } 104 - 105 - #[napi(js_name = "move_tracks")] 106 - #[allow(dead_code)] 107 - pub fn move_tracks( 108 - playlist_id: String, 109 - mut item_ids: Vec<ItemId>, 110 - to_index: u32, 111 - env: Env, 112 - ) -> Result<()> { 113 - let data: &mut Data = get_data(&env)?; 114 - let playlist = match data.library.get_tracklist_mut(&playlist_id)? { 115 - TrackList::Playlist(playlist) => playlist, 116 - _ => return Err(nerr!("Cannot rearrange tracks in non-playlist")), 117 - }; 118 - 119 - let item_ids_set: HashSet<ItemId> = item_ids.iter().cloned().collect(); 120 - assert_eq!(item_ids_set.len(), item_ids.len()); 121 - 122 - let playlist_item_ids_set: HashSet<ItemId> = playlist.tracks.iter().cloned().collect(); 123 - for item_id in &item_ids { 124 - assert!(playlist_item_ids_set.contains(item_id)); 125 - } 126 - 127 - let mut start_items = playlist.tracks.clone(); 128 - let mut end_items = start_items.split_off(to_index as usize); 129 - 130 - start_items.retain(|item_id| !item_ids_set.contains(item_id)); 131 - end_items.retain(|item_id| !item_ids_set.contains(item_id)); 132 - 133 - start_items.append(&mut item_ids); 134 - 135 - start_items.append(&mut end_items); 136 - 137 - playlist.tracks = start_items; 138 - Ok(()) 139 - }
+56
src-native/playlists.rs
··· 379 379 380 380 Ok(()) 381 381 } 382 + 383 + #[napi(js_name = "move_tracks")] 384 + #[allow(dead_code)] 385 + pub fn move_tracks( 386 + playlist_id: String, 387 + mut item_ids: Vec<ItemId>, 388 + to_index: u32, 389 + env: Env, 390 + ) -> Result<()> { 391 + let data: &mut Data = get_data(&env)?; 392 + let playlist = match data.library.get_tracklist_mut(&playlist_id)? { 393 + TrackList::Playlist(playlist) => playlist, 394 + _ => return Err(nerr!("Cannot rearrange tracks in non-playlist")), 395 + }; 396 + 397 + let item_ids_set: HashSet<ItemId> = item_ids.iter().cloned().collect(); 398 + assert_eq!(item_ids_set.len(), item_ids.len()); 399 + 400 + let playlist_item_ids_set: HashSet<ItemId> = playlist.tracks.iter().cloned().collect(); 401 + for item_id in &item_ids { 402 + assert!(playlist_item_ids_set.contains(item_id)); 403 + } 404 + 405 + let mut start_items = playlist.tracks.clone(); 406 + let mut end_items = start_items.split_off(to_index as usize); 407 + 408 + start_items.retain(|item_id| !item_ids_set.contains(item_id)); 409 + end_items.retain(|item_id| !item_ids_set.contains(item_id)); 410 + 411 + start_items.append(&mut item_ids); 412 + 413 + start_items.append(&mut end_items); 414 + 415 + playlist.tracks = start_items; 416 + Ok(()) 417 + } 418 + 419 + pub fn get_tracklist_item_ids(library: &Library, playlist_id: &str) -> UniResult<Vec<ItemId>> { 420 + match library.get_tracklist(playlist_id)? { 421 + TrackList::Playlist(playlist) => Ok(playlist.tracks.clone()), 422 + TrackList::Folder(folder) => { 423 + let mut ids: HashSet<ItemId> = HashSet::new(); 424 + for child in &folder.children { 425 + let child_ids = get_tracklist_item_ids(library, &child)?; 426 + ids.extend(child_ids); 427 + } 428 + Ok(ids.into_iter().collect()) 429 + } 430 + TrackList::Special(special) => match special.name { 431 + SpecialTrackListName::Root => { 432 + let item_ids = library.get_track_item_ids().values().cloned().collect(); 433 + Ok(item_ids) 434 + } 435 + }, 436 + } 437 + }
+2 -1
src-native/sort.rs
··· 1 1 use crate::library::{get_track_field_type, TrackField}; 2 2 use crate::library_types::{ItemId, Library, Track, TRACK_ID_MAP}; 3 - use crate::page::{get_tracklist_item_ids, TracksPageOptions}; 3 + use crate::page::TracksPageOptions; 4 + use crate::playlists::get_tracklist_item_ids; 4 5 use crate::UniResult; 5 6 use alphanumeric_sort::compare_str; 6 7 use std::cmp::Ordering;