diff --git a/js/app.js b/js/app.js index 0494a62..729b04f 100644 --- a/js/app.js +++ b/js/app.js @@ -106,8 +106,6 @@ let settingsModule = null; let downloadsModule = null; let metadataModule = null; -export const managers = {}; - async function loadSettingsModule() { if (!settingsModule) { settingsModule = await import('./settings.js'); @@ -654,9 +652,9 @@ document.addEventListener('DOMContentLoaded', async () => { const scrobbler = new MultiScrobbler(); window.monochromeScrobbler = scrobbler; - const lyricsManager = new LyricsManager(MusicAPI.instance); + + const lyricsManager = await LyricsManager.initialize(MusicAPI.instance); ui.lyricsManager = lyricsManager; - managers.lyricsManager = lyricsManager; // Check browser support for local files const selectLocalBtn = document.getElementById('select-local-folder-btn'); diff --git a/js/lyrics.js b/js/lyrics.js index b567f79..5e13199 100644 --- a/js/lyrics.js +++ b/js/lyrics.js @@ -151,6 +151,16 @@ class GeniusManager { } export class LyricsManager { + static #instance = null; + + static get instance() { + if (!LyricsManager.#instance) { + throw new Error('LyricsManager is not initialized. Call LyricsManager.initialize() first.'); + } + return LyricsManager.#instance; + } + + /** @private */ constructor(api) { this.api = api; this.currentLyrics = null; @@ -174,6 +184,13 @@ export class LyricsManager { this.timingOffset = 0; // Offset in milliseconds (positive = delay lyrics, negative = advance lyrics) } + static async initialize(api) { + if (LyricsManager.#instance) { + throw new Error('LyricsManager is already initialized'); + } + return (LyricsManager.#instance = new LyricsManager(api)); + } + // Get timing offset for current track getTimingOffset(trackId) { try { diff --git a/js/metadata.js b/js/metadata.js index 336030c..b8bc1bf 100644 --- a/js/metadata.js +++ b/js/metadata.js @@ -1,7 +1,7 @@ import { getCoverBlob, getTrackTitle, getFullArtistString, getMimeType, getTrackCoverId } from './utils.js'; import { addMetadataWithTagLib, getMetadataWithTagLib } from './taglib.ts'; import { doTimed, doTimedAsync } from './doTimed.ts'; -import { managers } from './app.js'; +import { LyricsManager } from './lyrics.js'; export function prefetchMetadataObjects(track, api, coverBlob = null) { const coverId = getTrackCoverId(track); @@ -10,7 +10,7 @@ export function prefetchMetadataObjects(track, api, coverBlob = null) { : coverId ? getCoverBlob(api, coverId).catch(console.error) : Promise.resolve(null); - const lyricsFetch = managers?.lyricsManager?.fetchLyrics?.(track.id, track)?.catch(console.error); + const lyricsFetch = LyricsManager.initialize.fetchLyrics?.(track.id, track)?.catch(console.error); return { coverFetch, lyricsFetch }; }