diff --git a/js/accounts/pocketbase.js b/js/accounts/pocketbase.js
index e43a7d8..67a2f08 100644
--- a/js/accounts/pocketbase.js
+++ b/js/accounts/pocketbase.js
@@ -585,7 +585,9 @@ const syncManager = {
id: playlist.id,
name: playlist.name,
cover: playlist.cover || null,
- tracks: playlist.tracks ? playlist.tracks.map((t) => this._minifyItem(t.type || 'track', t)) : [],
+ tracks: playlist.tracks
+ ? playlist.tracks.map((t) => this._minifyItem(t.type || 'track', t))
+ : [],
createdAt: playlist.createdAt || Date.now(),
updatedAt: playlist.updatedAt || Date.now(),
numberOfTracks: playlist.tracks ? playlist.tracks.length : 0,
diff --git a/js/api.js b/js/api.js
index 9bacdd7..a2e52df 100644
--- a/js/api.js
+++ b/js/api.js
@@ -892,10 +892,10 @@ export class LosslessAPI {
const numericArtistId = Number(artistId);
for (const item of videoSearch.items) {
const itemArtistId = item.artist?.id;
- const matchesArtist =
- itemArtistId === numericArtistId ||
- (Array.isArray(item.artists) && item.artists.some(a => a.id === numericArtistId));
-
+ const matchesArtist =
+ itemArtistId === numericArtistId ||
+ (Array.isArray(item.artists) && item.artists.some((a) => a.id === numericArtistId));
+
if (matchesArtist && !videoMap.has(item.id)) {
videoMap.set(item.id, item);
}
@@ -918,8 +918,9 @@ export class LosslessAPI {
.sort((a, b) => (b.popularity || 0) - (a.popularity || 0))
.slice(0, 15);
- const videos = Array.from(videoMap.values())
- .sort((a, b) => new Date(b.releaseDate || 0) - new Date(a.releaseDate || 0));
+ const videos = Array.from(videoMap.values()).sort(
+ (a, b) => new Date(b.releaseDate || 0) - new Date(a.releaseDate || 0)
+ );
// Enrich tracks with album release dates
const tracks = options.lightweight ? topTracks : await this.enrichTracksWithAlbumDates(topTracks);
@@ -1281,8 +1282,8 @@ export class LosslessAPI {
return null;
};
- const manifest = isVideo
- ? (findValue(lookup, 'manifest') || findValue(lookup, 'Manifest'))
+ const manifest = isVideo
+ ? findValue(lookup, 'manifest') || findValue(lookup, 'Manifest')
: lookup.info?.manifest;
if (!manifest) {
@@ -1325,7 +1326,8 @@ export class LosslessAPI {
console.error('HLS download failed:', hlsError);
throw hlsError;
}
- } else { const response = await fetch(streamUrl, {
+ } else {
+ const response = await fetch(streamUrl, {
cache: 'no-store',
signal: options.signal,
});
@@ -1389,38 +1391,38 @@ export class LosslessAPI {
}
}
- if (quality.endsWith('LOSSLESS')) {
- try {
- switch (losslessContainerSettings.getContainer()) {
- case 'flac':
- if ((await getExtensionFromBlob(blob)) != 'flac') {
+ if (quality.endsWith('LOSSLESS')) {
+ try {
+ switch (losslessContainerSettings.getContainer()) {
+ case 'flac':
+ if ((await getExtensionFromBlob(blob)) != 'flac') {
+ blob = await ffmpeg(
+ blob,
+ { args: ['-vn', '-map_metadata', '-1', '-map', '0:a', '-c:a', 'flac'] },
+ 'output.flac',
+ 'audio/flac',
+ onProgress,
+ options.signal
+ );
+ }
+ break;
+ case 'alac':
blob = await ffmpeg(
blob,
- { args: ['-vn', '-map_metadata', '-1', '-map', '0:a', '-c:a', 'flac'] },
- 'output.flac',
- 'audio/flac',
+ { args: ['-c:a', 'alac'] },
+ 'output.m4a',
+ 'audio/mp4',
onProgress,
options.signal
);
- }
- break;
- case 'alac':
- blob = await ffmpeg(
- blob,
- { args: ['-c:a', 'alac'] },
- 'output.m4a',
- 'audio/mp4',
- onProgress,
- options.signal
- );
- break;
- default:
- break;
- }
- } catch (error) {
- if (error?.name === 'AbortError') {
- throw error;
- }
+ break;
+ default:
+ break;
+ }
+ } catch (error) {
+ if (error?.name === 'AbortError') {
+ throw error;
+ }
console.error('Lossless container conversion failed:', error);
}
diff --git a/js/events.js b/js/events.js
index e471147..c2f9b2d 100644
--- a/js/events.js
+++ b/js/events.js
@@ -1074,7 +1074,10 @@ export async function handleTrackAction(
trackDataStore.set(newEl, item);
ui.updateLikeState(newEl, 'video', item.id);
newEl.addEventListener('click', (e) => {
- if (e.target.closest('.card-play-btn') || e.target.closest('.card-image-container')) {
+ if (
+ e.target.closest('.card-play-btn') ||
+ e.target.closest('.card-image-container')
+ ) {
e.stopPropagation();
player.playVideo(item);
}
diff --git a/js/hls-downloader.js b/js/hls-downloader.js
index 2384484..a05aa1e 100644
--- a/js/hls-downloader.js
+++ b/js/hls-downloader.js
@@ -8,7 +8,7 @@ export class HlsDownloader {
const masterText = await response.text();
const variantUrl = this.getBestVariantUrl(masterUrl, masterText);
-
+
const mediaResponse = await fetch(variantUrl, { signal });
const mediaText = await mediaResponse.text();
diff --git a/js/music-api.js b/js/music-api.js
index 81a7cd4..9c76748 100644
--- a/js/music-api.js
+++ b/js/music-api.js
@@ -166,7 +166,7 @@ export class MusicAPI {
const data = await response.json();
const result = {
videoUrl: data.videoUrl || null,
- hlsUrl: data.animated || null
+ hlsUrl: data.animated || null,
};
this.videoArtworkCache.set(cacheKey, result);
return result;
diff --git a/js/player.js b/js/player.js
index 7669423..2ab6574 100644
--- a/js/player.js
+++ b/js/player.js
@@ -203,7 +203,8 @@ export class Player {
if (coverEl) {
const videoCoverUrl = track.videoUrl || track.videoCoverUrl || track.album?.videoCoverUrl || null;
- const coverUrl = videoCoverUrl || this.api.getCoverUrl(track.image || track.cover || track.album?.cover);
+ const coverUrl =
+ videoCoverUrl || this.api.getCoverUrl(track.image || track.cover || track.album?.cover);
if (videoCoverUrl) {
if (coverEl.tagName === 'IMG') {
@@ -453,7 +454,7 @@ export class Player {
...video,
type: 'video',
artist: video.artist || (video.artists && video.artists[0]) || 'Unknown Artist',
- album: video.album || { title: 'Video', cover: video.image || video.cover }
+ album: video.album || { title: 'Video', cover: video.image || video.cover },
};
this.setQueue([videoTrack], 0);
await this.playTrackFromQueue();
@@ -490,12 +491,12 @@ export class Player {
const trackInfo = document.querySelector('.now-playing-bar .track-info');
const coverEl = trackInfo?.querySelector('.cover:not(#audio-player)');
-
+
if (track.type === 'video') {
if (coverEl) coverEl.style.display = 'none';
if (this.audio) {
const isInFullscreen = document.getElementById('fullscreen-cover-overlay')?.style.display === 'flex';
-
+
if (!isInFullscreen) {
this.audio.style.display = 'block';
this.audio.className = 'cover video-cover-mirror';
diff --git a/js/settings.js b/js/settings.js
index 7b3057e..c52cb0c 100644
--- a/js/settings.js
+++ b/js/settings.js
@@ -2143,9 +2143,7 @@ export function initializeSettings(scrobbler, player, api, ui) {
const newDimming = parseFloat(e.target.value);
visualizerSettings.setDimAmount(newDimming);
visualizerDimmingValue.textContent = `${(newDimming * 100).toFixed(0)}%`;
- window.dispatchEvent(
- new CustomEvent('visualizer-dim-change', { detail: { dimAmount: newDimming } })
- );
+ window.dispatchEvent(new CustomEvent('visualizer-dim-change', { detail: { dimAmount: newDimming } }));
});
}
diff --git a/js/ui.js b/js/ui.js
index 3c82f5b..80cdfee 100644
--- a/js/ui.js
+++ b/js/ui.js
@@ -343,7 +343,7 @@ export class UIRenderer {
const isUnavailable = track.isUnavailable;
const isBlocked = contentBlockingSettings?.shouldHideTrack(track);
const isVideo = track.type === 'video';
-
+
let trackImageHTML = '';
if (showCover) {
if (isVideo && this.currentPage === 'playlist') {
@@ -351,7 +351,12 @@ export class UIRenderer {
} else if (isVideo && (this.currentPage === 'search' || this.currentPage === 'library')) {
trackImageHTML = `
`;
} else {
- trackImageHTML = this.getCoverHTML(track.image || track.cover || track.album?.cover, 'Track Cover', 'track-item-cover', 'lazy');
+ trackImageHTML = this.getCoverHTML(
+ track.image || track.cover || track.album?.cover,
+ 'Track Cover',
+ 'track-item-cover',
+ 'lazy'
+ );
}
}
@@ -365,7 +370,9 @@ export class UIRenderer {
displayIndex = index + 1;
}
- const videoIcon = isVideo ? '
' : '';
+ const videoIcon = isVideo
+ ? '
'
+ : '';
const trackNumberHTML = `
${showCover ? trackImageHTML : displayIndex}
`;
const explicitBadge = hasExplicitContent(track) ? this.createExplicitBadge() : '';
const qualityBadge = createQualityBadgeHTML(track);
@@ -638,7 +645,13 @@ export class UIRenderer {
href: `/album/${album.id}`,
title: `${escapeHtml(album.title)} ${explicitBadge} ${qualityBadge}`,
subtitle: `${escapeHtml(artistName)} • ${yearDisplay}${typeLabel}`,
- imageHTML: this.getCoverHTML(album.cover, escapeHtml(album.title), 'card-image', 'lazy', album.videoCoverUrl),
+ imageHTML: this.getCoverHTML(
+ album.cover,
+ escapeHtml(album.title),
+ 'card-image',
+ 'lazy',
+ album.videoCoverUrl
+ ),
actionButtonsHTML: `