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

Re-enable "Add to Playlist"

Kasper (Sep 26, 2024, 3:20 AM +0200) 6a110230 649da60e

+53 -49
+2 -2
src/components/SidebarItems.svelte
··· 2 2 import { 3 3 track_lists_details_map, 4 4 methods, 5 - add_track_to_playlist, 5 + add_tracks_to_playlist, 6 6 move_playlist, 7 7 } from '../lib/data' 8 8 import Self from './SidebarItems.svelte' ··· 256 256 class:droppable-below={drag_playlist_onto_index === i && !drop_above} 257 257 on:drop={(e) => { 258 258 if (e.currentTarget && e.dataTransfer?.types[0] === 'ferrum.tracks' && dragged.tracks) { 259 - add_track_to_playlist(child_list.id, dragged.tracks.ids) 259 + add_tracks_to_playlist(child_list.id, dragged.tracks.ids) 260 260 drag_track_onto_index = null 261 261 } else if ( 262 262 e.currentTarget &&
+20 -14
src/components/TrackList.svelte
··· 22 22 track_lists_details_map, 23 23 move_tracks, 24 24 remove_from_playlist, 25 + playlist_items_updated, 25 26 } from '../lib/data' 26 27 import { new_playback_instance, playing_id } from '../lib/player' 27 28 import { ··· 55 56 $current_playlist_id = params.playlist_id 56 57 } 57 58 58 - let tracks_page = methods.get_tracks_page({ 59 - playlistId: params.playlist_id, 60 - filterQuery: $filter, 61 - sortKey: $sort_key, 62 - sortDesc: $sort_desc, 63 - groupAlbumTracks: $group_album_tracks, 64 - }) 65 - $: tracks_page = methods.get_tracks_page({ 66 - playlistId: params.playlist_id, 67 - filterQuery: $filter, 68 - sortKey: $sort_key, 69 - sortDesc: $sort_desc, 70 - groupAlbumTracks: $group_album_tracks, 71 - }) 59 + let tracks_page = get_tracks_page() 60 + function get_tracks_page() { 61 + return methods.get_tracks_page({ 62 + playlistId: params.playlist_id, 63 + filterQuery: $filter, 64 + sortKey: $sort_key, 65 + sortDesc: $sort_desc, 66 + groupAlbumTracks: $group_album_tracks, 67 + }) 68 + } 69 + $: if (playlist_items_updated || true) { 70 + tracks_page = methods.get_tracks_page({ 71 + playlistId: params.playlist_id, 72 + filterQuery: $filter, 73 + sortKey: $sort_key, 74 + sortDesc: $sort_desc, 75 + groupAlbumTracks: $group_album_tracks, 76 + }) 77 + } 72 78 73 79 function handle_action(action: SelectedTracksAction) { 74 80 if (action === 'Remove from Playlist') {
+29 -30
src/lib/data.ts
··· 83 83 }, 84 84 } 85 85 })() 86 - export async function add_track_to_playlist( 86 + export async function add_tracks_to_playlist( 87 87 playlist_id: TrackListID, 88 88 track_ids: TrackID[], 89 89 check_duplicates = true, 90 90 ) { 91 - // if (check_duplicates) { 92 - // const filtered_ids = call((addon) => addon.playlist_filter_duplicates(playlist_id, track_ids)) 93 - // const duplicates = track_ids.length - filtered_ids.length 94 - // if (duplicates > 0) { 95 - // const result = await ipc_renderer.invoke('showMessageBox', false, { 96 - // type: 'question', 97 - // message: 'Already added', 98 - // detail: 99 - // duplicates > 1 100 - // ? `${duplicates} songs are already in this playlist` 101 - // : `${duplicates} song is already in this playlist`, 102 - // buttons: ['Add anyway', 'Cancel', 'Skip'], 103 - // defaultId: 0, 104 - // }) 105 - // if (result.response === 1) { 106 - // return 107 - // } else if (result.response === 2) { 108 - // track_ids = filtered_ids 109 - // } 110 - // } 111 - // } 112 - // if (track_ids.length >= 1) { 113 - // call((addon) => addon.add_tracks_to_playlist(playlist_id, track_ids)) 114 - // if (page.get().tracklist.id === playlist_id) { 115 - // page.refresh_ids_and_keep_selection() 116 - // } 117 - // methods.save() 118 - // } 91 + if (check_duplicates) { 92 + const filtered_ids = call((addon) => addon.playlist_filter_duplicates(playlist_id, track_ids)) 93 + const duplicates = track_ids.length - filtered_ids.length 94 + if (duplicates > 0) { 95 + const result = await ipc_renderer.invoke('showMessageBox', false, { 96 + type: 'question', 97 + message: 'Already added', 98 + detail: 99 + duplicates > 1 100 + ? `${duplicates} songs are already in this playlist` 101 + : `${duplicates} song is already in this playlist`, 102 + buttons: ['Add anyway', 'Cancel', 'Skip'], 103 + defaultId: 0, 104 + }) 105 + if (result.response === 1) { 106 + return 107 + } else if (result.response === 2) { 108 + track_ids = filtered_ids 109 + } 110 + } 111 + } 112 + if (track_ids.length >= 1) { 113 + call((addon) => addon.add_tracks_to_playlist(playlist_id, track_ids)) 114 + playlist_items_updated.emit() 115 + methods.save() 116 + } 119 117 } 120 118 export function remove_from_playlist(playlist_id: TrackListID, item_ids: ItemId[]) { 121 119 // call((addon) => addon.remove_from_playlist(playlist_id, item_ids)) ··· 291 289 } 292 290 } 293 291 export const tracks_updated = create_refresh_store() 292 + export const playlist_items_updated = create_refresh_store() 294 293 295 294 export function get_artists() { 296 295 return call((addon) => addon.get_artists()) 297 296 } 298 297 export function move_tracks(playlist_id: TrackListID, indexes: ItemId[], to_index: number) { 299 298 call((data) => data.move_tracks(playlist_id, indexes, to_index)) 300 - tracks_updated.emit() 299 + playlist_items_updated.emit() 301 300 methods.save() 302 301 }
+2 -3
src/lib/menus.ts
··· 1 1 import { 2 - add_track_to_playlist, 2 + add_tracks_to_playlist, 3 3 methods, 4 4 paths, 5 5 remove_from_playlist, ··· 30 30 all_ids: TrackID[] 31 31 first_index: number | null 32 32 }) { 33 - console.log('hsta', track_ids.length, first_index) 34 33 if (track_ids.length === 0 || first_index === null) { 35 34 return 36 35 } ··· 46 45 const track = methods.getTrack(first_track_id) 47 46 ipc_renderer.invoke('revealTrackFile', paths.tracksDir, track.file) 48 47 } else if (typeof action === 'object' && action.action === 'Add to Playlist') { 49 - add_track_to_playlist(action.playlist_id, track_ids) 48 + add_tracks_to_playlist(action.playlist_id, track_ids) 50 49 } 51 50 }