index.html 11 KB

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