diff --git a/js/app.js b/js/app.js
index b518630..78e1b8e 100644
--- a/js/app.js
+++ b/js/app.js
@@ -1,4 +1,3 @@
-
//js/app.js
import { LosslessAPI } from './api.js';
import { apiSettings, themeManager, nowPlayingSettings, trackListSettings } from './storage.js';
@@ -319,142 +318,140 @@ document.addEventListener('DOMContentLoaded', async () => {
}
}
if (e.target.closest('#download-playlist-btn')) {
- const btn = e.target.closest('#download-playlist-btn');
- if (btn.disabled) return;
+ const btn = e.target.closest('#download-playlist-btn');
+ if (btn.disabled) return;
- const playlistId = window.location.hash.split('/')[1];
- if (!playlistId) return;
+ const playlistId = window.location.hash.split('/')[1];
+ if (!playlistId) return;
- btn.disabled = true;
- const originalHTML = btn.innerHTML;
- btn.innerHTML = 'Downloading...';
+ btn.disabled = true;
+ const originalHTML = btn.innerHTML;
+ btn.innerHTML = 'Downloading...';
- try {
- let playlist, tracks;
- const userPlaylist = await db.getPlaylist(playlistId);
-
- if (userPlaylist) {
- playlist = { ...userPlaylist, title: userPlaylist.name };
- tracks = userPlaylist.tracks || [];
- } else {
- const data = await api.getPlaylist(playlistId);
- playlist = data.playlist;
- tracks = data.tracks;
+ try {
+ let playlist, tracks;
+ const userPlaylist = await db.getPlaylist(playlistId);
+
+ if (userPlaylist) {
+ playlist = { ...userPlaylist, title: userPlaylist.name };
+ tracks = userPlaylist.tracks || [];
+ } else {
+ const data = await api.getPlaylist(playlistId);
+ playlist = data.playlist;
+ tracks = data.tracks;
+ }
+
+ await downloadPlaylistAsZip(playlist, tracks, api, player.quality, lyricsManager);
+ } catch (error) {
+ console.error('Playlist download failed:', error);
+ alert('Failed to download playlist: ' + error.message);
+ } finally {
+ btn.disabled = false;
+ btn.innerHTML = originalHTML;
}
-
- await downloadPlaylistAsZip(playlist, tracks, api, player.quality, lyricsManager);
- } catch (error) {
- console.error('Playlist download failed:', error);
- alert('Failed to download playlist: ' + error.message);
- } finally {
- btn.disabled = false;
- btn.innerHTML = originalHTML;
}
-}
- if (e.target.closest('#create-playlist-btn')) {
- const modal = document.getElementById('playlist-modal');
- document.getElementById('playlist-modal-title').textContent = 'Create Playlist';
- document.getElementById('playlist-name-input').value = '';
- modal.style.display = 'flex';
- document.getElementById('playlist-name-input').focus();
-}
-if (e.target.closest('#playlist-modal-save')) {
- const name = document.getElementById('playlist-name-input').value.trim();
- if (name) {
+ if (e.target.closest('#create-playlist-btn')) {
const modal = document.getElementById('playlist-modal');
- const editingId = modal.dataset.editingId;
- if (editingId) {
- // Edit
- db.getPlaylist(editingId).then(async (playlist) => {
- if (playlist) {
- playlist.name = name;
- await db.performTransaction('user_playlists', 'readwrite', (store) => store.put(playlist));
- syncManager.syncUserPlaylist(playlist, 'update');
+ document.getElementById('playlist-modal-title').textContent = 'Create Playlist';
+ document.getElementById('playlist-name-input').value = '';
+ modal.style.display = 'flex';
+ document.getElementById('playlist-name-input').focus();
+ }
+
+ if (e.target.closest('#playlist-modal-save')) {
+ const name = document.getElementById('playlist-name-input').value.trim();
+ if (name) {
+ const modal = document.getElementById('playlist-modal');
+ const editingId = modal.dataset.editingId;
+ if (editingId) {
+ // Edit
+ db.getPlaylist(editingId).then(async (playlist) => {
+ if (playlist) {
+ playlist.name = name;
+ await db.performTransaction('user_playlists', 'readwrite', (store) => store.put(playlist));
+ syncManager.syncUserPlaylist(playlist, 'update');
+ ui.renderLibraryPage();
+ modal.style.display = 'none';
+ delete modal.dataset.editingId;
+ }
+ });
+ } else {
+ // Create
+ db.createPlaylist(name, [], '').then(playlist => {
+ syncManager.syncUserPlaylist(playlist, 'create');
ui.renderLibraryPage();
modal.style.display = 'none';
- delete modal.dataset.editingId;
- }
- });
- } else {
- // Create
- db.createPlaylist(name, [], '').then(playlist => {
- syncManager.syncUserPlaylist(playlist, 'create');
+ });
+ }
+ }
+ }
+
+ if (e.target.closest('#playlist-modal-cancel')) {
+ document.getElementById('playlist-modal').style.display = 'none';
+ }
+
+ if (e.target.closest('.edit-playlist-btn')) {
+ const card = e.target.closest('.user-playlist');
+ const playlistId = card.dataset.playlistId;
+ db.getPlaylist(playlistId).then(playlist => {
+ if (playlist) {
+ const modal = document.getElementById('playlist-modal');
+ document.getElementById('playlist-modal-title').textContent = 'Edit Playlist';
+ document.getElementById('playlist-name-input').value = playlist.name;
+ modal.dataset.editingId = playlistId;
+ modal.style.display = 'flex';
+ document.getElementById('playlist-name-input').focus();
+ }
+ });
+ }
+
+ if (e.target.closest('.delete-playlist-btn')) {
+ const card = e.target.closest('.user-playlist');
+ const playlistId = card.dataset.playlistId;
+ if (confirm('Are you sure you want to delete this playlist?')) {
+ db.deletePlaylist(playlistId).then(() => {
+ syncManager.syncUserPlaylist({ id: playlistId }, 'delete');
ui.renderLibraryPage();
- modal.style.display = 'none';
});
}
}
-}
-
-if (e.target.closest('#playlist-modal-cancel')) {
- document.getElementById('playlist-modal').style.display = 'none';
-}
-
-if (e.target.closest('.edit-playlist-btn')) {
- const card = e.target.closest('.user-playlist');
- const playlistId = card.dataset.playlistId;
- db.getPlaylist(playlistId).then(playlist => {
- if (playlist) {
- const modal = document.getElementById('playlist-modal');
- document.getElementById('playlist-modal-title').textContent = 'Edit Playlist';
- document.getElementById('playlist-name-input').value = playlist.name;
- modal.dataset.editingId = playlistId;
- modal.style.display = 'flex';
- document.getElementById('playlist-name-input').focus();
- }
- });
-}
-if (e.target.closest('.delete-playlist-btn')) {
- const card = e.target.closest('.user-playlist');
- const playlistId = card.dataset.playlistId;
- if (confirm('Are you sure you want to delete this playlist?')) {
- db.deletePlaylist(playlistId).then(() => {
- syncManager.syncUserPlaylist({ id: playlistId }, 'delete');
- ui.renderLibraryPage();
+ if (e.target.closest('#edit-playlist-btn')) {
+ const playlistId = window.location.hash.split('/')[1];
+ db.getPlaylist(playlistId).then(playlist => {
+ if (playlist) {
+ const modal = document.getElementById('playlist-modal');
+ document.getElementById('playlist-modal-title').textContent = 'Edit Playlist';
+ document.getElementById('playlist-name-input').value = playlist.name;
+ modal.dataset.editingId = playlistId;
+ modal.style.display = 'flex';
+ document.getElementById('playlist-name-input').focus();
+ }
});
}
-}
-if (e.target.closest('#edit-playlist-btn')) {
- const playlistId = window.location.hash.split('/')[1];
- db.getPlaylist(playlistId).then(playlist => {
- if (playlist) {
- const modal = document.getElementById('playlist-modal');
- document.getElementById('playlist-modal-title').textContent = 'Edit Playlist';
- document.getElementById('playlist-name-input').value = playlist.name;
- modal.dataset.editingId = playlistId;
- modal.style.display = 'flex';
- document.getElementById('playlist-name-input').focus();
+ if (e.target.closest('#delete-playlist-btn')) {
+ const playlistId = window.location.hash.split('/')[1];
+ if (confirm('Are you sure you want to delete this playlist?')) {
+ db.deletePlaylist(playlistId).then(() => {
+ window.location.hash = '#library';
+ });
}
- });
-}
+ }
-if (e.target.closest('#delete-playlist-btn')) {
- const playlistId = window.location.hash.split('/')[1];
- if (confirm('Are you sure you want to delete this playlist?')) {
- db.deletePlaylist(playlistId).then(() => {
- window.location.hash = '#library';
+ if (e.target.closest('.remove-from-playlist-btn')) {
+ const btn = e.target.closest('.remove-from-playlist-btn');
+ const index = parseInt(btn.dataset.trackIndex);
+ const playlistId = window.location.hash.split('/')[1];
+ db.getPlaylist(playlistId).then(async (playlist) => {
+ if (playlist && playlist.tracks[index]) {
+ const trackId = playlist.tracks[index].id;
+ await db.removeTrackFromPlaylist(playlistId, trackId);
+ ui.renderPlaylistPage(playlistId);
+ }
});
}
-}
-
-
-
- if (e.target.closest('.remove-from-playlist-btn')) {
- const btn = e.target.closest('.remove-from-playlist-btn');
- const index = parseInt(btn.dataset.trackIndex);
- const playlistId = window.location.hash.split('/')[1];
- db.getPlaylist(playlistId).then(async (playlist) => {
- if (playlist && playlist.tracks[index]) {
- const trackId = playlist.tracks[index].id;
- await db.removeTrackFromPlaylist(playlistId, trackId);
- ui.renderPlaylistPage(playlistId);
- }
- });
-}
-
if (e.target.closest('#play-playlist-btn')) {
const btn = e.target.closest('#play-playlist-btn');
diff --git a/styles.css b/styles.css
index 52c0dd2..d020fec 100644
--- a/styles.css
+++ b/styles.css
@@ -1125,20 +1125,6 @@ body.has-page-background .track-item:hover {
flex-shrink: 0;
}
-#like-album-btn,
-#like-playlist-btn,
-#like-artist-btn {
- width: auto;
- height: auto;
- padding: 0.875rem;
- display: flex;
- align-items: center;
- justify-content: center;
- border-radius: 50%;
- flex-shrink: 0;
- aspect-ratio: 1/1;
-}
-
.btn-secondary {
padding: 0.5rem 1rem;
background-color: var(--secondary);
@@ -2804,7 +2790,7 @@ input:checked + .slider::before {
}
.track-item {
- grid-template-columns: 32px 1fr 40px 28px;
+ grid-template-columns: 32px 1fr 40px auto;
gap: 0.375rem;
padding: var(--spacing-xs);
}
@@ -2929,7 +2915,7 @@ input:checked + .slider::before {
}
.track-item {
- grid-template-columns: 32px 1fr 40px 36px;
+ grid-template-columns: 32px 1fr 32px auto;
}
.player-controls .buttons button {