|
|
@@ -9,6 +9,7 @@ const state = {
|
|
|
activeAlbumPath: "",
|
|
|
featuredAlbums: [],
|
|
|
featuredIndex: 0,
|
|
|
+ detailTrackPage: 1,
|
|
|
};
|
|
|
|
|
|
const audio = document.getElementById("audioPlayer");
|
|
|
@@ -304,6 +305,9 @@ function renderAlbumDetail(path) {
|
|
|
const album = state.albums.find((item) => item.path === path);
|
|
|
if (!album) return;
|
|
|
|
|
|
+ if (state.activeAlbumPath !== path) {
|
|
|
+ state.detailTrackPage = 1;
|
|
|
+ }
|
|
|
state.activeAlbumPath = path;
|
|
|
setCurrentFolder(path);
|
|
|
showView("detail");
|
|
|
@@ -336,7 +340,38 @@ function renderAlbumDetail(path) {
|
|
|
|
|
|
const container = document.getElementById("detailTrackList");
|
|
|
container.innerHTML = "";
|
|
|
- album.tracks.forEach((track, index) => container.appendChild(renderTrack(track, album.tracks, index)));
|
|
|
+ renderAlbumTracks(container, album.tracks);
|
|
|
+}
|
|
|
+
|
|
|
+function renderAlbumTracks(container, tracks) {
|
|
|
+ const pageSize = 30;
|
|
|
+ const totalPages = Math.max(1, Math.ceil(tracks.length / pageSize));
|
|
|
+ state.detailTrackPage = Math.min(Math.max(state.detailTrackPage || 1, 1), totalPages);
|
|
|
+ const start = (state.detailTrackPage - 1) * pageSize;
|
|
|
+ const visibleTracks = tracks.slice(start, start + pageSize);
|
|
|
+
|
|
|
+ visibleTracks.forEach((track, index) => container.appendChild(renderTrack(track, tracks, start + index, { compact: true })));
|
|
|
+
|
|
|
+ if (tracks.length <= pageSize) return;
|
|
|
+
|
|
|
+ const pager = document.createElement("div");
|
|
|
+ pager.className = "pager";
|
|
|
+ pager.innerHTML = `
|
|
|
+ <button class="text-btn" data-action="prev" ${state.detailTrackPage === 1 ? "disabled" : ""}>上一页</button>
|
|
|
+ <span class="pager-meta">${state.detailTrackPage} / ${totalPages}</span>
|
|
|
+ <button class="text-btn" data-action="next" ${state.detailTrackPage === totalPages ? "disabled" : ""}>下一页</button>
|
|
|
+ `;
|
|
|
+ pager.querySelector("[data-action='prev']").onclick = () => {
|
|
|
+ if (state.detailTrackPage <= 1) return;
|
|
|
+ state.detailTrackPage -= 1;
|
|
|
+ renderAlbumDetail(state.activeAlbumPath);
|
|
|
+ };
|
|
|
+ pager.querySelector("[data-action='next']").onclick = () => {
|
|
|
+ if (state.detailTrackPage >= totalPages) return;
|
|
|
+ state.detailTrackPage += 1;
|
|
|
+ renderAlbumDetail(state.activeAlbumPath);
|
|
|
+ };
|
|
|
+ container.appendChild(pager);
|
|
|
}
|
|
|
|
|
|
function renderLatestList(tracks) {
|
|
|
@@ -381,11 +416,16 @@ function renderRankingList(items) {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-function renderTrack(track, sourceTracks = [track], sourceIndex = 0) {
|
|
|
+function renderTrack(track, sourceTracks = [track], sourceIndex = 0, options = {}) {
|
|
|
const template = document.getElementById("trackItemTemplate");
|
|
|
const fragment = template.content.cloneNode(true);
|
|
|
+ const row = fragment.querySelector(".song-row");
|
|
|
+ const trackPath = fragment.querySelector(".track-path");
|
|
|
fragment.querySelector(".track-name").textContent = track.name;
|
|
|
- fragment.querySelector(".track-path").textContent = track.path;
|
|
|
+ trackPath.textContent = track.path;
|
|
|
+ if (options.compact) {
|
|
|
+ row.classList.add("detail-track-row");
|
|
|
+ }
|
|
|
fragment.querySelector(".play-btn").onclick = () => {
|
|
|
showIconToast("播放");
|
|
|
startQueue(sourceTracks, sourceIndex);
|
|
|
@@ -597,6 +637,7 @@ function clearCurrentTrack() {
|
|
|
audio.load();
|
|
|
state.currentTrackIndex = -1;
|
|
|
state.activeAlbumPath = "";
|
|
|
+ state.detailTrackPage = 1;
|
|
|
document.getElementById("nowTitle").textContent = "选择一个专辑目录开始播放";
|
|
|
document.getElementById("nowMeta").textContent = "点击专辑进入详情页,或直接在卡片上快速播放。";
|
|
|
document.getElementById("dockTitle").textContent = "未开始播放";
|