Fixed several pre-existing and introduced linting issues
This commit is contained in:
parent
35080751f9
commit
68d1f726c4
4 changed files with 1897 additions and 2400 deletions
4166
index.html
4166
index.html
File diff suppressed because one or more lines are too long
|
|
@ -1,5 +1,5 @@
|
||||||
export class DashDownloader {
|
export class DashDownloader {
|
||||||
constructor() {}
|
constructor() { }
|
||||||
|
|
||||||
async downloadDashStream(manifestBlobUrl, options = {}) {
|
async downloadDashStream(manifestBlobUrl, options = {}) {
|
||||||
const { onProgress, signal } = options;
|
const { onProgress, signal } = options;
|
||||||
|
|
@ -15,8 +15,7 @@ export class DashDownloader {
|
||||||
|
|
||||||
// 2. Generate URLs
|
// 2. Generate URLs
|
||||||
const urls = this.generateSegmentUrls(manifest);
|
const urls = this.generateSegmentUrls(manifest);
|
||||||
|
const mimeType = manifest.mimeType || 'audio/mp4';
|
||||||
const mimeType = audioSet.getAttribute('mimeType') || 'audio/mp4';
|
|
||||||
|
|
||||||
// 3. Download Segments
|
// 3. Download Segments
|
||||||
const chunks = [];
|
const chunks = [];
|
||||||
|
|
@ -160,6 +159,7 @@ export class DashDownloader {
|
||||||
media,
|
media,
|
||||||
segments,
|
segments,
|
||||||
repId,
|
repId,
|
||||||
|
mimeType: audioSet.getAttribute('mimeType'),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
121
js/ui.js
121
js/ui.js
|
|
@ -942,107 +942,7 @@ export class UIRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async renderTrackPage(trackId) {
|
|
||||||
this.showPage('track');
|
|
||||||
|
|
||||||
const imageEl = document.getElementById('track-detail-image');
|
|
||||||
const titleEl = document.getElementById('track-detail-title');
|
|
||||||
const artistEl = document.getElementById('track-detail-artist');
|
|
||||||
const albumEl = document.getElementById('track-detail-album');
|
|
||||||
const yearEl = document.getElementById('track-detail-year');
|
|
||||||
const albumSection = document.getElementById('track-album-section');
|
|
||||||
const albumTracksContainer = document.getElementById('track-detail-album-tracks');
|
|
||||||
|
|
||||||
const playBtn = document.getElementById('play-track-btn');
|
|
||||||
const lyricsBtn = document.getElementById('track-lyrics-btn');
|
|
||||||
const shareBtn = document.getElementById('share-track-btn');
|
|
||||||
const likeBtn = document.getElementById('like-track-btn');
|
|
||||||
const downloadBtn = document.getElementById('download-track-btn');
|
|
||||||
|
|
||||||
imageEl.src = '';
|
|
||||||
imageEl.style.backgroundColor = 'var(--muted)';
|
|
||||||
titleEl.innerHTML = '<div class="skeleton" style="height: 48px; width: 300px; max-width: 90%;"></div>';
|
|
||||||
artistEl.innerHTML = '<div class="skeleton" style="height: 16px; width: 100px;"></div>';
|
|
||||||
albumEl.innerHTML = '';
|
|
||||||
yearEl.innerHTML = '';
|
|
||||||
albumTracksContainer.innerHTML = this.createSkeletonTracks(5, false);
|
|
||||||
|
|
||||||
try {
|
|
||||||
const trackData = await this.api.getTrack(trackId);
|
|
||||||
const track = trackData.track;
|
|
||||||
|
|
||||||
const coverUrl = this.api.getCoverUrl(track.album?.cover);
|
|
||||||
imageEl.src = coverUrl;
|
|
||||||
imageEl.style.backgroundColor = '';
|
|
||||||
|
|
||||||
this.setPageBackground(coverUrl);
|
|
||||||
if (backgroundSettings.isEnabled() && track.album?.cover) {
|
|
||||||
this.extractAndApplyColor(this.api.getCoverUrl(track.album.cover, '80'));
|
|
||||||
}
|
|
||||||
|
|
||||||
const explicitBadge = hasExplicitContent(track) ? this.createExplicitBadge() : '';
|
|
||||||
const qualityBadge = createQualityBadgeHTML(track);
|
|
||||||
titleEl.innerHTML = `${escapeHtml(track.title)} ${explicitBadge} ${qualityBadge}`;
|
|
||||||
this.adjustTitleFontSize(titleEl, track.title);
|
|
||||||
|
|
||||||
artistEl.innerHTML = `<a href="/artist/${track.artist.id}">${escapeHtml(track.artist.name)}</a>`;
|
|
||||||
albumEl.innerHTML = `<a href="/album/${track.album.id}">${escapeHtml(track.album.title)}</a>`;
|
|
||||||
|
|
||||||
if (track.album.releaseDate) {
|
|
||||||
const date = new Date(track.album.releaseDate);
|
|
||||||
yearEl.textContent = date.getFullYear();
|
|
||||||
}
|
|
||||||
|
|
||||||
playBtn.onclick = () => {
|
|
||||||
this.player.setQueue([track]);
|
|
||||||
this.player.playTrackFromQueue();
|
|
||||||
};
|
|
||||||
|
|
||||||
lyricsBtn.onclick = () => {
|
|
||||||
if (this.player.currentTrack && this.player.currentTrack.id === track.id) {
|
|
||||||
document.getElementById('toggle-lyrics-btn').click();
|
|
||||||
} else {
|
|
||||||
this.player.setQueue([track]);
|
|
||||||
this.player.playTrackFromQueue();
|
|
||||||
setTimeout(() => document.getElementById('toggle-lyrics-btn').click(), 500);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
shareBtn.onclick = () => {
|
|
||||||
const url = `${window.location.origin}/track/${track.id}`;
|
|
||||||
navigator.clipboard.writeText(url).then(() => {
|
|
||||||
showNotification('Link copied to clipboard!');
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
this.updateLikeState(likeBtn, 'track', track.id);
|
|
||||||
trackDataStore.set(likeBtn, track);
|
|
||||||
|
|
||||||
downloadBtn.dataset.action = 'download';
|
|
||||||
downloadBtn.classList.add('track-action-btn');
|
|
||||||
trackDataStore.set(downloadBtn, track);
|
|
||||||
|
|
||||||
if (track.album.id) {
|
|
||||||
const albumData = await this.api.getAlbum(track.album.id);
|
|
||||||
const tracks = albumData.tracks;
|
|
||||||
|
|
||||||
if (tracks.length > 1) {
|
|
||||||
albumSection.style.display = 'block';
|
|
||||||
const otherTracks = tracks.filter((t) => t.id !== track.id);
|
|
||||||
this.renderListWithTracks(albumTracksContainer, otherTracks, false);
|
|
||||||
} else {
|
|
||||||
albumSection.style.display = 'none';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
albumSection.style.display = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
document.title = `${displayTitle} - ${artistName}`;
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
titleEl.textContent = 'Error loading track';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async renderLibraryPage() {
|
async renderLibraryPage() {
|
||||||
this.showPage('library');
|
this.showPage('library');
|
||||||
|
|
@ -1634,10 +1534,10 @@ export class UIRenderer {
|
||||||
dateDisplay =
|
dateDisplay =
|
||||||
window.innerWidth > 768
|
window.innerWidth > 768
|
||||||
? releaseDate.toLocaleDateString('en-US', {
|
? releaseDate.toLocaleDateString('en-US', {
|
||||||
year: 'numeric',
|
year: 'numeric',
|
||||||
month: 'long',
|
month: 'long',
|
||||||
day: 'numeric',
|
day: 'numeric',
|
||||||
})
|
})
|
||||||
: year;
|
: year;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2361,9 +2261,9 @@ export class UIRenderer {
|
||||||
<span>${artist.popularity}% popularity</span>
|
<span>${artist.popularity}% popularity</span>
|
||||||
<div class="artist-tags">
|
<div class="artist-tags">
|
||||||
${(artist.artistRoles || [])
|
${(artist.artistRoles || [])
|
||||||
.filter((role) => role.category)
|
.filter((role) => role.category)
|
||||||
.map((role) => `<span class="artist-tag">${role.category}</span>`)
|
.map((role) => `<span class="artist-tag">${role.category}</span>`)
|
||||||
.join('')}
|
.join('')}
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
@ -2843,6 +2743,8 @@ export class UIRenderer {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const track = await this.api.getTrackMetadata(trackId);
|
const track = await this.api.getTrackMetadata(trackId);
|
||||||
|
const displayTitle = getTrackTitle(track);
|
||||||
|
const artistName = getTrackArtists(track);
|
||||||
|
|
||||||
const coverUrl = this.api.getCoverUrl(track.album?.cover);
|
const coverUrl = this.api.getCoverUrl(track.album?.cover);
|
||||||
imageEl.src = coverUrl;
|
imageEl.src = coverUrl;
|
||||||
|
|
@ -2855,18 +2757,13 @@ export class UIRenderer {
|
||||||
|
|
||||||
const explicitBadge = hasExplicitContent(track) ? this.createExplicitBadge() : '';
|
const explicitBadge = hasExplicitContent(track) ? this.createExplicitBadge() : '';
|
||||||
const qualityBadge = createQualityBadgeHTML(track);
|
const qualityBadge = createQualityBadgeHTML(track);
|
||||||
const displayTitle = getTrackTitle(track);
|
|
||||||
titleEl.innerHTML = `${escapeHtml(displayTitle)} ${explicitBadge} ${qualityBadge}`;
|
titleEl.innerHTML = `${escapeHtml(displayTitle)} ${explicitBadge} ${qualityBadge}`;
|
||||||
this.adjustTitleFontSize(titleEl, displayTitle);
|
this.adjustTitleFontSize(titleEl, displayTitle);
|
||||||
|
|
||||||
let artistName = 'Unknown Artist';
|
|
||||||
let artistId = null;
|
let artistId = null;
|
||||||
|
|
||||||
if (track.artist) {
|
if (track.artist) {
|
||||||
artistName = track.artist.name;
|
|
||||||
artistId = track.artist.id;
|
artistId = track.artist.id;
|
||||||
} else if (track.artists && track.artists.length > 0) {
|
} else if (track.artists && track.artists.length > 0) {
|
||||||
artistName = track.artists[0].name;
|
|
||||||
artistId = track.artists[0].id;
|
artistId = track.artists[0].id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2819,10 +2819,6 @@ input:checked + .slider::before {
|
||||||
justify-self: flex-end;
|
justify-self: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.is-editable .track-list-header .duration-header {
|
|
||||||
padding-right: 1.5rem;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Responsive Design */
|
/* Responsive Design */
|
||||||
|
|
||||||
@supports (padding-top: env(safe-area-inset-top)) {
|
@supports (padding-top: env(safe-area-inset-top)) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue