Skip to content

Commit

Permalink
新增播放列表功能 #51
Browse files Browse the repository at this point in the history
  • Loading branch information
hanxi committed Jun 12, 2024
1 parent 746f46e commit 349a25a
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 13 deletions.
2 changes: 2 additions & 0 deletions xiaomusic/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"关机": "stop",
"停止播放": "stop",
"分钟后关机": "stop_after_minute",
"播放列表": "play_music_list",
"set_volume#": "set_volume",
"get_volume#": "get_volume",
}
Expand All @@ -65,6 +66,7 @@
"随机播放",
"关机",
"停止播放",
"播放列表",
]

SUPPORT_MUSIC_TYPE = [
Expand Down
8 changes: 8 additions & 0 deletions xiaomusic/httpserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,14 @@ async def savesetting():
await xiaomusic.saveconfig(data)
return "save success"

@app.route("/musiclist", methods=["GET"])
async def musiclist():
return xiaomusic.get_music_list()

@app.route("/curplaylist", methods=["GET"])
async def curplaylist():
return xiaomusic.get_cur_play_list()

def static_path_handler(filename):
log.debug(filename)
log.debug(static_path)
Expand Down
39 changes: 34 additions & 5 deletions xiaomusic/static/app.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
$(function(){
$container=$("#cmds");
append_op_button_name("下一首");
append_op_button_name("全部循环");
append_op_button_name("关机");
append_op_button_name("单曲循环");
append_op_button_name("播放歌曲");
append_op_button_name("随机播放");
append_op_button_name("下一首");
append_op_button_name("关机");

$container.append($("<hr>"));

Expand All @@ -26,6 +25,36 @@ $(function(){
$("#version").text(`(${data.version})`);
});

// 拉取播放列表
$.get("/musiclist", function(data, status) {
console.log(data, status);
$.each(data, function(key, value) {
$('#music_list').append($('<option></option>').val(key).text(key));
});

$('#music_list').change(function() {
const selectedValue = $(this).val();
$('#music_name').empty();
$.each(data[selectedValue], function(index, item) {
$('#music_name').append($('<option></option>').val(item).text(item));
});
});

$('#music_list').trigger('change');

// 获取当前播放列表
$.get("curplaylist", function(data, status) {
$('#music_list').val(data);
$('#music_list').trigger('change');
})
})

$("#play_music_list").on("click", () => {
var music_list = $("#music_list").val();
var music_name = $("#music_name").val();
let cmd = "播放列表" + music_list + "|" + music_name;
sendcmd(cmd);
})

function append_op_button_name(name) {
append_op_button(name, name);
Expand All @@ -48,8 +77,8 @@ $(function(){

$("#play").on("click", () => {
var search_key = $("#music-name").val();
var filename=$("#music-filename").val();
let cmd = "播放歌曲"+search_key+"|"+filename;
var filename = $("#music-filename").val();
let cmd = "播放歌曲" + search_key + "|" + filename;
sendcmd(cmd);
});

Expand Down
9 changes: 9 additions & 0 deletions xiaomusic/static/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,15 @@ <h2>小爱音箱操控面板<span id="version">(版本未知)</span></h2>
<div id="playering-music" class="text"></div>
</div>

<hr>
<div class="rows">
<label for="music_list">播放列表:</label>
<select id="music_list"></select>
<label for="music_name">歌曲:</label>
<select id="music_name"></select>
</div>
<button id="play_music_list">播放列表歌曲</button>

<footer>
<p>Powered by <a href="https://github.com/hanxi/xiaomusic" target="_blank">xiaomusic</a></p>
</footer>
Expand Down
1 change: 0 additions & 1 deletion xiaomusic/static/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ input,select {
}

footer {
position: fixed;
bottom: 0;
width: 100%;
text-align: center;
Expand Down
64 changes: 57 additions & 7 deletions xiaomusic/xiaomusic.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ def __init__(self, config: Config):
self._volume = 0
self._all_music = {}
self._play_list = []
self._cur_play_list = ""
self._music_list = {} # 播放列表 key 为目录名, value 为 play_list
self._playing = False

# 关机定时器
Expand All @@ -94,7 +96,7 @@ def __init__(self, config: Config):
self.try_init_setting()

# 启动时重新生成一次播放列表
self.gen_all_music_list()
self._gen_all_music_list()

# 启动时初始化获取声音
self.set_last_record("get_volume#")
Expand Down Expand Up @@ -340,9 +342,16 @@ def get_file_url(self, name):
return f"http://{self.hostname}:{self.port}/{encoded_name}"

# 递归获取目录下所有歌曲,生成随机播放列表
def gen_all_music_list(self):
def _gen_all_music_list(self):
self._all_music = {}
all_music_by_dir = {}
for root, dirs, filenames in os.walk(self.music_path):
self.log.debug("root:%s dirs:%s music_path:%s", root, dirs, self.music_path)
dir_name = os.path.basename(root)
if self.music_path == root:
dir_name = "其他"
if dir_name not in all_music_by_dir:
all_music_by_dir[dir_name] = {}
for filename in filenames:
self.log.debug("gen_all_music_list. filename:%s", filename)
# 过滤隐藏文件
Expand All @@ -361,10 +370,20 @@ def gen_all_music_list(self):

# 歌曲名字相同会覆盖
self._all_music[name] = os.path.join(root, filename)
all_music_by_dir[dir_name][name] = True
pass
self._play_list = list(self._all_music.keys())
self._cur_play_list = "全部"
random.shuffle(self._play_list)
self.log.debug(self._all_music)

self._music_list = {}
self._music_list["全部"] = self._play_list
for dir_name,musics in all_music_by_dir.items():
self._music_list[dir_name] = list(musics.keys())
self.log.debug("dir_name:%s, list:%s", dir_name, self._music_list[dir_name])
pass

# 把下载的音乐加入播放列表
def add_download_music(self, name):
self._all_music[name] = os.path.join(self.music_path, f"{name}.mp3")
Expand Down Expand Up @@ -558,16 +577,38 @@ async def set_play_type_all(self, **kwargs):
# 随机播放
async def random_play(self, **kwargs):
self.play_type = PLAY_TYPE_ALL
await self.do_tts(f"已经设置为全部循环并随机播放")
# 重新生成随机播放列表
self.gen_all_music_list()
await self.play_next()
random.shuffle(self._play_list)
await self.do_tts(f"已经设置为随机播放")

# 生成播放列表
async def gen_music_list(self, **kwargs):
self._gen_all_music_list()
await self.do_tts(f"生成播放列表完毕")

# 播放一个播放列表
async def play_music_list(self, **kwargs):
parts = kwargs["arg1"].split("|")
list_name = parts[0]
if list_name not in self._music_list:
await self.do_tts(f"播放列表{list_name}不存在")
return
self._play_list = self._music_list[list_name]
self._cur_play_list = list_name
self.log.info(f"开始播放列表{list_name}")

music_name = ""
if len(parts) > 1:
music_name = parts[1]
else:
music_name = self.get_next_music()
await self.play(arg1=music_name)

async def stop(self, **kwargs):
self._playing = False
if self._next_timer:
self._next_timer.cancel()
self.log.info(f"定时器已取消")
self.cur_music = ""
await self.force_stop_xiaoai()

async def stop_after_minute(self, **kwargs):
Expand Down Expand Up @@ -601,10 +642,19 @@ def get_volume_ret(self):

# 搜索音乐
def searchmusic(self, name):
search_list = fuzzyfinder(name, self._play_list)
all_music_list = list(self._all_music.keys())
search_list = fuzzyfinder(name, all_music_list)
self.log.debug("searchmusic. name:%s search_list:%s", name, search_list)
return search_list

# 获取播放列表
def get_music_list(self):
return self._music_list

# 获取当前的播放列表
def get_cur_play_list(self):
return self._cur_play_list

# 正在播放中的音乐
def playingmusic(self):
self.log.debug("playingmusic. cur_music:%s", self.cur_music)
Expand Down

0 comments on commit 349a25a

Please sign in to comment.