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

Fix build files loading

Kasper (Sep 17, 2024, 6:10 PM +0200) 9be30d61 74de1851

+45 -10
+1
package.json
··· 14 14 "build": "npm run napi && npm run build:web && electron-builder", 15 15 "build:web": "vite build", 16 16 "electron-builder": "electron-builder", 17 + "preview": "LOCAL_DATA=./src-native/appdata/local_data LIBRARY=./src-native/appdata/Library ./build/app/mac/Ferrum.app/Contents/MacOS/Ferrum", 17 18 "lint": "svelte-check --tsconfig ./tsconfig.json && eslint src && prettier --check src", 18 19 "format": "eslint --fix src && prettier --write src", 19 20 "check": "npm run lint && cargo check"
+1
src/App.svelte
··· 28 28 import { tracklist_actions } from './lib/page' 29 29 import './lib/router' 30 30 import Route from './lib/Route.svelte' 31 + import { navigate } from './lib/router' 31 32 32 33 ipc_renderer.emit('appLoaded') 33 34
+2 -2
src/components/QuickNav.svelte
··· 3 3 import { check_shortcut } from '../lib/helpers' 4 4 import { ipc_listen } from '@/lib/window' 5 5 import fuzzysort from 'fuzzysort' 6 - import { page, track_lists_details_map, view_as_artists, view_as_songs } from '@/lib/data' 7 - import type { TrackListDetails, ViewAs } from '../../ferrum-addon/addon' 6 + import { track_lists_details_map } from '@/lib/data' 7 + import type { TrackListDetails } from '../../ferrum-addon/addon' 8 8 import Modal from './Modal.svelte' 9 9 import { special_playlists_nav } from './Sidebar.svelte' 10 10 import { navigate } from '@/lib/router'
-1
src/components/SidebarItems.svelte
··· 306 306 </div> 307 307 </a> 308 308 {:else} 309 - <!-- svelte-ignore a11y-interactive-supports-focus --> 310 309 <a 311 310 href="/playlist/{child_list.id}" 312 311 tabindex="-1"
+32 -3
src/electron/main.ts
··· 1 - import { app, ipcMain, session, BrowserWindow, dialog, protocol } from 'electron' 1 + import { app, ipcMain, session, BrowserWindow, dialog, protocol, net } from 'electron' 2 2 import is from './is' 3 3 import addon from '../../ferrum-addon' 4 4 ··· 8 8 import { init_media_keys } from './shortcuts' 9 9 import('./ipc') 10 10 import path from 'path' 11 + import url from 'url' 11 12 12 13 async function err_handler(msg: string, error: Error) { 13 14 app.whenReady().then(() => { ··· 95 96 }) 96 97 }) 97 98 98 - if (is.dev) main_window.loadURL(process.env.VITE_DEV_SERVER_URL || 'missing') 99 - else main_window.loadFile(path.resolve(__dirname, '../web/index.html')) 99 + const vite_dev_server_url = process.env.VITE_DEV_SERVER_URL ?? '' 100 + if (is.dev && !vite_dev_server_url) { 101 + throw new Error('VITE_DEV_SERVER_URL missing') 102 + } 103 + 104 + const web_folder = path.join(path.dirname(__dirname), 'web') 105 + 106 + protocol.handle('app', (request) => { 107 + const accepts_html = 108 + request.headers 109 + .get('accept') 110 + ?.split(',') 111 + .map((mime_type) => mime_type.trim()) 112 + .includes('text/html') ?? false 113 + 114 + if (request.method === 'GET' && accepts_html) { 115 + const html_path = url.pathToFileURL(path.join(web_folder, 'index.html')).toString() 116 + return net.fetch(html_path) 117 + } 118 + 119 + const file_path = request.url.slice('app:'.length) 120 + const file_url = url.pathToFileURL(path.join(web_folder, file_path)).toString() 121 + return net.fetch(file_url) 122 + }) 123 + 124 + if (is.dev) { 125 + main_window.loadURL(new URL(vite_dev_server_url).origin + '/playlist/root') 126 + } else { 127 + main_window.loadURL('app:/playlist/root') 128 + } 100 129 101 130 if (is.dev) main_window.webContents.openDevTools() 102 131
+2 -2
src/electron/preload.ts
··· 4 4 5 5 window.addon = addon 6 6 window.is_dev = is.dev 7 - window.local_data_path = process.env.LOCAL_DATA 8 - window.library_path = process.env.LIBRARY 7 + window.local_data_path = process.env.LOCAL_DATA ? path.resolve(process.env.LOCAL_DATA) : undefined 8 + window.library_path = process.env.LIBRARY ? path.resolve(process.env.LIBRARY) : undefined 9 9 window.is_mac = is.mac 10 10 window.is_windows = is.windows 11 11
+6 -2
src/lib/router.ts
··· 2 2 3 3 export const url = writable(new URL(window.location.href)) 4 4 5 - export function navigate(to_url: string) { 5 + export function navigate(to_url: string, options: { replace?: boolean } = {}) { 6 6 const new_url = new URL(to_url, window.location.href) 7 7 if (new_url.href !== window.location.href) { 8 - window.history.pushState({}, '', new_url) 8 + if (options.replace) { 9 + window.history.replaceState({}, '', new_url) 10 + } else { 11 + window.history.pushState({}, '', new_url) 12 + } 9 13 url.set(new_url) 10 14 } 11 15 }
+1
vite.config.mjs
··· 5 5 import tailwindcss from '@tailwindcss/vite' 6 6 7 7 export default defineConfig({ 8 + base: '/', 8 9 clearScreen: false, 9 10 resolve: { 10 11 alias: {