index.html 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>MusicWeb Player</title>
  7. <link rel="stylesheet" href="/static/css/style.css" />
  8. </head>
  9. <body>
  10. <div class="app-shell">
  11. <header class="app-header">
  12. <div class="header-copy">
  13. <p class="eyebrow">MusicWeb Player</p>
  14. <h1>在线音乐播放器</h1>
  15. <p class="subtext">移动端专辑浏览与播放</p>
  16. </div>
  17. <div class="header-pill">当前目录:<span id="folderIndicator">根目录</span></div>
  18. </header>
  19. <main class="page-content">
  20. <section id="homeView" class="view-stack">
  21. <section class="content-section">
  22. <div class="library-tabs" id="libraryTabs">
  23. <button class="library-tab is-active" data-source="local">本地</button>
  24. <button class="library-tab" data-source="cloud">百度网盘</button>
  25. </div>
  26. </section>
  27. <section class="content-section slim-hero">
  28. <div>
  29. <h2 id="nowTitle">选择一个专辑目录开始播放</h2>
  30. <p id="nowMeta" class="subtext">点击专辑进入详情页,或直接在卡片上快速播放。</p>
  31. </div>
  32. <div class="hero-metrics">
  33. <div class="metric-card">
  34. <strong id="albumCount">0</strong>
  35. <span>专辑目录</span>
  36. </div>
  37. <div class="metric-card">
  38. <strong id="trackCount">0</strong>
  39. <span>歌曲总数</span>
  40. </div>
  41. </div>
  42. </section>
  43. <section class="content-section">
  44. <div class="section-head">
  45. <h2>精选专辑</h2>
  46. <span>通栏展示</span>
  47. </div>
  48. <div id="featuredAlbums" class="featured-list"></div>
  49. </section>
  50. <section class="content-section">
  51. <div class="section-head">
  52. <h2>全部专辑目录</h2>
  53. <span>两栏浏览</span>
  54. </div>
  55. <div id="albumGrid" class="album-grid"></div>
  56. </section>
  57. <section class="stack-section">
  58. <section class="content-section">
  59. <div class="section-head">
  60. <h2>最新更新</h2>
  61. <span>紧凑列表</span>
  62. </div>
  63. <div id="latestList" class="song-list compact-list"></div>
  64. </section>
  65. <section class="content-section">
  66. <div class="section-head">
  67. <h2>每日排名</h2>
  68. <span>目录热度</span>
  69. </div>
  70. <div id="rankingList" class="ranking-list"></div>
  71. </section>
  72. </section>
  73. </section>
  74. <section id="detailView" class="view-stack is-hidden">
  75. <section class="content-section detail-header">
  76. <div class="detail-copy">
  77. <p class="eyebrow">Album Detail</p>
  78. <h2 id="detailTitle">专辑详情</h2>
  79. <p id="detailMeta" class="subtext"></p>
  80. <div class="card-actions">
  81. <button id="detailPlayBtn" class="primary-btn">替换队列并播放</button>
  82. <button id="detailPlayAllBtn" class="secondary-btn">加入播放列表</button>
  83. <button id="backHomeBtn" class="back-btn detail-back-home">返回首页</button>
  84. </div>
  85. </div>
  86. <div class="detail-cover-wrap">
  87. <img id="detailCoverImage" class="detail-cover-image is-hidden" alt="cover" />
  88. <div id="detailCoverFallback" class="detail-cover-fallback">专辑</div>
  89. </div>
  90. </section>
  91. <section class="content-section">
  92. <div class="section-head">
  93. <h2>歌曲列表</h2>
  94. <span id="detailTrackCount">0 首</span>
  95. </div>
  96. <div id="detailTrackList" class="song-list"></div>
  97. </section>
  98. </section>
  99. <section class="content-section">
  100. <div class="section-head">
  101. <h2>当前播放队列</h2>
  102. <div class="card-actions">
  103. <button id="saveQueueBtn" class="text-btn">刷新</button>
  104. <button id="clearQueueBtn" class="text-btn">清空</button>
  105. </div>
  106. </div>
  107. <div id="queueList" class="queue-list"></div>
  108. </section>
  109. <section class="stack-section">
  110. <section class="content-section is-hidden">
  111. <div class="section-head">
  112. <h2>目录与上传</h2>
  113. </div>
  114. <label class="field">
  115. <span>目标目录</span>
  116. <input id="targetDir" type="text" placeholder="如:流行/周杰伦" />
  117. </label>
  118. <label class="field">
  119. <span>上传音乐</span>
  120. <input id="uploadInput" type="file" accept=".mp3,.wav,.flac,.m3u,.m3u8,.ogg,.aac,.wma,.opus,.oga,.mp4,.m4a,.webm" multiple />
  121. </label>
  122. <button id="uploadBtn" class="primary-btn">上传文件</button>
  123. <label class="field">
  124. <span>新建文件夹</span>
  125. <input id="newFolderInput" type="text" placeholder="如:轻音乐/夜晚" />
  126. </label>
  127. <button id="createFolderBtn" class="secondary-btn">创建文件夹</button>
  128. </section>
  129. <section class="content-section">
  130. <div class="section-head">
  131. <h2>播放列表</h2>
  132. </div>
  133. <label class="field">
  134. <span>新列表名称</span>
  135. <input id="playlistNameInput" type="text" placeholder="我的收藏" />
  136. </label>
  137. <button id="createPlaylistBtn" class="secondary-btn">用当前队列创建</button>
  138. <div id="playlistList" class="playlist-list"></div>
  139. </section>
  140. </section>
  141. </main>
  142. <div class="player-dock">
  143. <div class="player-top">
  144. <div class="dock-cover-wrap">
  145. <img id="dockCoverImage" class="dock-cover-image is-hidden" alt="cover" />
  146. <div class="dock-cover-fallback" id="dockCoverFallback">乐</div>
  147. </div>
  148. <div class="dock-copy">
  149. <strong id="dockTitle">未开始播放</strong>
  150. <p id="dockPath">点击专辑或歌曲开始播放</p>
  151. </div>
  152. </div>
  153. <div class="player-progress">
  154. <span id="currentTimeLabel">00:00</span>
  155. <input id="progressBar" type="range" min="0" max="100" value="0" />
  156. <span id="durationLabel">00:00</span>
  157. </div>
  158. <div class="player-actions icon-actions">
  159. <button id="playModeBtn" class="icon-btn" aria-label="播放模式" data-tip="列表播放">
  160. <svg id="playModeIcon" viewBox="0 0 24 24" aria-hidden="true"></svg>
  161. </button>
  162. <button id="prevBtn" class="icon-btn" aria-label="上一曲" data-tip="上一曲">
  163. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 5v14M18 6l-8 6 8 6V6z"/></svg>
  164. </button>
  165. <button id="playToggleBtn" class="icon-btn play-toggle" aria-label="播放或暂停" data-tip="播放">
  166. <svg class="icon-play" viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7-11-7z"/></svg>
  167. <svg class="icon-pause is-hidden" viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5h3v14H8zM13 5h3v14h-3z"/></svg>
  168. </button>
  169. <button id="nextBtn" class="icon-btn" aria-label="下一曲" data-tip="下一曲">
  170. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M18 5v14M6 6l8 6-8 6V6z"/></svg>
  171. </button>
  172. <button id="albumMenuBtn" class="icon-btn" aria-label="专辑列表" data-tip="专辑列表">
  173. <svg viewBox="0 0 24 24" aria-hidden="true">
  174. <path d="M4 7h16M4 12h16M4 17h16"/>
  175. <path d="M16 14l3 3-3 3"/>
  176. </svg>
  177. </button>
  178. </div>
  179. <audio id="audioPlayer" preload="metadata"></audio>
  180. </div>
  181. <div id="albumMenuOverlay" class="album-menu-overlay is-hidden">
  182. <div class="album-menu">
  183. <div class="album-menu-head">
  184. <strong>选择专辑</strong>
  185. <div class="album-menu-actions">
  186. <button id="closeAlbumMenuBtn" class="text-btn">关闭</button>
  187. <button id="albumMenuHomeBtn" class="back-btn">返回首页</button>
  188. </div>
  189. </div>
  190. <div id="albumMenuList" class="album-menu-list"></div>
  191. </div>
  192. </div>
  193. <div id="iconToast" class="icon-toast is-hidden"></div>
  194. </div>
  195. <template id="trackItemTemplate">
  196. <div class="song-row">
  197. <div class="song-copy">
  198. <strong class="track-name"></strong>
  199. <p class="track-path"></p>
  200. </div>
  201. <div class="track-actions compact-actions">
  202. <button class="play-btn icon-btn small-icon-btn" aria-label="播放" data-tip="播放">
  203. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M8 5v14l11-7-11-7z"/></svg>
  204. </button>
  205. <button class="queue-btn icon-btn small-icon-btn" aria-label="加入队列" data-tip="加入队列">
  206. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 7h10M4 12h10M4 17h7M18 9v8M14 13h8"/></svg>
  207. </button>
  208. <button class="move-btn icon-btn small-icon-btn" aria-label="移动" data-tip="移动歌曲">
  209. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12h10M11 5l7 7-7 7"/></svg>
  210. </button>
  211. </div>
  212. </div>
  213. </template>
  214. <script src="/static/js/app.js?v=20260511-1"></script>
  215. </body>
  216. </html>