1
0
mirror of https://github.com/hanxi/xiaomusic.git synced 2026-04-25 22:29:53 +08:00
Files
xiaomusic/xiaomusic/static/default/index.html
2026-03-19 22:29:13 +08:00

254 lines
13 KiB
HTML
Vendored
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>小爱音箱操控面板</title>
<!-- 预加载字体文件,减少加载延迟 -->
<link rel="preload" href="./materialicons.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="./materialiconsoutlined.woff2" as="font" type="font/woff2" crossorigin>
<script src="./jquery-3.7.1.min.js?version=1773930508"></script>
<link rel="stylesheet" href="./main.css?version=1773930508">
<link rel="icon" href="./favicon.ico">
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Z09NC1K7ZW"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments) };
gtag('js', new Date());
gtag('config', 'G-Z09NC1K7ZW');
</script>
<!-- umami -->
<!-- <script async defer src="https://umami.hanxi.cc/script.js" data-website-id="7bfb0890-4115-4260-8892-b391513e7e99"></script> -->
</head>
<body class="index_page">
<div class="player" role="main" aria-label="音乐播放器">
<h1>小爱音箱播放器
<a href="https://xdocs.hanxi.cc/issues/changelog.html" target="_blank" class="version-link"><span id="version">0.4.0</span><span id="versionnew" class="new-badge"></span></a>
</h1>
<label for="did" class="label-with-toggle">选择播放设备:
<div class="toggle-switch-container">
<label class="toggle-label">语音口令</label>
<div id="pullAskToggle" class="toggle-switch" role="switch" aria-checked="false" aria-label="语音口令开关" onclick="togglePullAsk()" tabindex="0">
<div class="toggle-slider"></div>
</div>
</div>
</label>
<select id="did" class="device-selector" aria-label="选择播放设备">
<option value="default">默认设备</option>
</select>
<label for="music_list" class="label-with-action">选择播放列表:
<div class="option-inline" onclick="refreshlist()" role="button" aria-label="刷新播放列表" tabindex="0">
<span class="material-icons" aria-hidden="true">refresh</span>
<span class="tooltip">刷新列表</span>
</div>
</label>
<select id="music_list" class="playlist-selector" aria-label="选择播放列表">
</select>
<label for="music_name" class="label-with-action">选择歌曲:
<div class="action-buttons">
<div class="option-inline" onclick="triggerUpload()" role="button" aria-label="上传歌曲" tabindex="0">
<span class="material-icons" aria-hidden="true">file_upload</span>
<span class="tooltip">上传歌曲</span>
</div>
<div class="option-inline" onclick="toggleDelete()" role="button" aria-label="删除歌曲" tabindex="0">
<span class="material-icons" aria-hidden="true">delete</span>
<span class="tooltip">删除歌曲</span>
</div>
</div>
</label>
<select id="music_name" class="song-selector" aria-label="选择歌曲">
</select>
<input id="upload-file" type="file" accept=".mp3,.m4a,.wav,.flac,.aac,.ogg,.ape" class="hidden-input" />
<div id="device-audio" class="audio-section">
<progress class="progress" id="progress" value="0" max="100" role="progressbar" aria-label="播放进度" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0" aria-valuetext="未播放"></progress>
<div class="time-info">
<span class="current-time" id="current-time">0:00</span>
<div class="current-song" id="playering-music">当前播放歌曲:无</div>
<span class="duration" id="duration">00:00</span>
</div>
</div>
<audio id="audio" controls src="" autoplay class="hidden-audio"></audio>
<div class="buttons">
<div class="player-controls button-group">
<div id="modeBtn" onclick="togglePlayMode()" class="control-button device-enable" role="button" aria-label="切换播放模式" tabindex="0">
<span class="material-icons" aria-hidden="true">shuffle</span>
<span class="tooltip">切换播放模式</span>
</div>
<div onclick="prevTrack()" class="control-button device-enable" role="button" aria-label="上一首" tabindex="0">
<span class="material-icons" aria-hidden="true">skip_previous</span>
<span class="tooltip">上一首</span>
</div>
<div onclick="play()" class="control-button" role="button" aria-label="播放" tabindex="0">
<span class="material-icons-outlined play" aria-hidden="true">play_circle_outline</span>
<span class="tooltip">播放</span>
</div>
<div onclick="nextTrack()" class="control-button device-enable" role="button" aria-label="下一首" tabindex="0">
<span class="material-icons" aria-hidden="true">skip_next</span>
<span class="tooltip">下一首</span>
</div>
<div onclick="stopPlay()" class="control-button device-enable" role="button" aria-label="关机" tabindex="0">
<span class="material-icons" aria-hidden="true">stop</span>
<span class="tooltip">关机</span>
</div>
</div>
<div class="mode-controls button-group">
<div onclick="addToFavorites()" class="favorite icon-item device-enable" role="button" aria-label="收藏歌曲" tabindex="0">
<span class="material-icons" aria-hidden="true">favorite</span>
<p>收藏</p>
</div>
<div onclick="toggleVolume()" class="icon-item device-enable" role="button" aria-label="调节音量" tabindex="0">
<span class="material-icons" aria-hidden="true">volume_up</span>
<p>音量</p>
</div>
<div onclick="toggleSearch()" class="icon-item device-enable" role="button" aria-label="搜索歌曲" tabindex="0">
<span class="material-icons" aria-hidden="true">search</span>
<p>搜索</p>
</div>
<div onclick="toggleTimer()" class="icon-item device-enable" role="button" aria-label="定时关机" tabindex="0">
<span class="material-icons" aria-hidden="true">timer</span>
<p>定时</p>
</div>
<div onclick="togglePlayLink()" class="icon-item device-enable" role="button" aria-label="播放链接测试" tabindex="0">
<span class="material-icons" aria-hidden="true">emoji_nature</span>
<p>测试</p>
</div>
<div onclick="openSettings()" class="icon-item" role="button" aria-label="打开设置" tabindex="0">
<span class="material-icons" aria-hidden="true">settings</span>
<p>设置</p>
</div>
<div onclick="goOnlineSearch()" class="icon-item device-enable" role="button" aria-label="在线音乐搜索" tabindex="0">
<span class="material-icons" aria-hidden="true">music_note</span>
<p>在线搜索</p>
</div>
</div>
</div>
</div>
<!-- 弹窗遮罩层 -->
<div class="component-overlay" id="component-overlay" onclick="closeAllDialogs()"></div>
<!-- 搜索组件 -->
<div class="component" id="search-component" role="dialog" aria-modal="true" aria-labelledby="search-title">
<h2 id="search-title">搜索歌曲</h2>
<input type="text" id="search" class="search-input" placeholder="请输入搜索关键词(如:MV高清版 周杰伦 七里香)">
<label for="music-name">搜索结果:</label>
<div id="music-name" class="search-results"></div>
<input id="music-filename" type="text" placeholder="请输入保存为的文件名称(可选)" style="display: none;"></input>
<div class="component-button-group">
<button onclick="confirmSearch()">确定</button>
<button onclick="toggleSearch()" class="close-button">关闭</button>
</div>
</div>
<!-- 定时关机组件 -->
<div class="component" id="timer-component" role="dialog" aria-modal="true" aria-labelledby="timer-title">
<h2 id="timer-title">定时关机</h2>
<button onclick="timedShutDown('10分钟后关机')">10分钟后关机</button>
<button onclick="timedShutDown('30分钟后关机')">30分钟后关机</button>
<button onclick="timedShutDown('60分钟后关机')">60分钟后关机</button>
<span class="tooltip timer-tooltip hidden-element">已发送指令</span>
<div class="component-button-one">
<button onclick="toggleTimer()" class="close-button">关闭</button>
</div>
</div>
<!-- 播放链接组件 -->
<div class="component" id="playlink-component" role="dialog" aria-modal="true" aria-labelledby="playlink-title">
<h2 id="playlink-title">播放测试</h2>
<!-- 播放链接卡片 -->
<div class="card-section">
<h3 class="card-title">🔗 播放链接</h3>
<input type="text" id="music-url" class="search-input" placeholder="请输入播放链接"
value="https://lhttp.qtfm.cn/live/4915/64k.mp3">
<div class="component-button-group">
<button onclick="playUrl()">播放链接</button>
<button onclick="playProxyUrl()">代理播放</button>
</div>
</div>
<!-- 播放文字卡片 -->
<div class="card-section">
<h3 class="card-title">💬 播放文字</h3>
<input type="text" id="text-tts" class="search-input" placeholder="请输入文字" value="播放文字测试">
<div class="component-button-group">
<button onclick="playTts()">播放文字</button>
</div>
</div>
<!-- 自定义口令卡片 -->
<div class="card-section">
<h3 class="card-title">🎤 自定义口令</h3>
<input type="text" id="custom-cmd" class="search-input" placeholder="请输入自定义口令" value="">
<div class="component-button-group">
<button onclick="sendCustomCmd()">发送口令</button>
</div>
</div>
<div class="component-button-one">
<button onclick="togglePlayLink()" class="close-button">关闭</button>
</div>
</div>
<!-- 音量组件 -->
<div class="component" id="volume-component" role="dialog" aria-modal="true" aria-labelledby="volume-title">
<h2 id="volume-title">调节音量</h2>
<input type="range" id="volume" class="volume-slider" aria-label="音量" aria-valuemin="0" aria-valuemax="100" aria-valuenow="50" />
<div class="component-button-one">
<button onclick="toggleVolume()" class="close-button">关闭</button>
</div>
</div>
<!-- 删除确认组件 -->
<div class="component" id="delete-component" role="dialog" aria-modal="true" aria-labelledby="delete-title">
<h2 id="delete-title">警告</h2>
<p>你确定要删除歌曲 <span id="delete-music-name"></span> 吗?</p>
<p class="warning-text">注意:该操作会永久删除该歌曲且不可撤销</p>
<div class="component-button-group">
<button onclick="confirmDelete()">确定</button>
<button onclick="toggleDelete()" class="close-button">关闭</button>
</div>
</div>
<!-- 警告组件 -->
<div class="component" id="warning-component" role="dialog" aria-modal="true" aria-labelledby="warning-title">
<h2 id="warning-title">警告</h2>
<p>当前页面的HOST与设置中的HOST不一致请检查是否设置错误</p>
<p>当前HOST: <span id="local-host"></span></p>
<p>设置中的HOST: <span id="setting-host"></span></p>
<div class="component-button-group">
<a href="./setting.html" target="_blank"><button>立即修改</button></a>
<button onclick="nowarning()">继续并不再显示</button>
<button onclick="toggleWarning()">取消</button>
</div>
</div>
<div class="footer" role="contentinfo">
Powered by XiaoMusic
</div>
<!-- 屏幕阅读器状态通知区域 -->
<div id="sr-announcer" class="sr-only" role="status" aria-live="polite" aria-atomic="true"></div>
<script src="./md.js?version=1773930508">
</script>
<script>
function goOnlineSearch() {
window.location.href = "/static/onlineSearch/index.html";
}
</script>
</body>
</html>