hanxi / xiaomusic

使用小爱音箱播放音乐,音乐使用 yt-dlp 下载。
https://github.com/hanxi/xiaomusic
MIT License
1.71k stars 181 forks source link

随机播放打乱算法优化 #173

Open hanxi opened 2 weeks ago

hanxi commented 2 weeks ago

可以考虑采用分组打乱实现,尽量避免歌名相似度高的不连续。

import random
import difflib
from itertools import cycle

def group_songs_by_similarity(songs, threshold=0.6):
    groups = []
    for song in songs:
        placed = False
        for group in groups:
            if any(difflib.SequenceMatcher(None, song, member).ratio() > threshold for member in group):
                group.append(song)
                placed = True
                break
        if not placed:
            groups.append([song])
    return groups

def shuffle_and_merge(groups):
    shuffled_groups = [random.sample(group, len(group)) for group in groups]
    merged_list = []
    group_iters = cycle(shuffled_groups)

    while any(shuffled_groups):
        for group in group_iters:
            if group:
                merged_list.append(group.pop(0))
    return merged_list

# 示例歌曲列表
songs = ["SongA1", "SongA2", "SongB1", "SongB2", "SongC1", "SongC2", "SongD1", "SongD2"]

# 分组并打乱
groups = group_songs_by_similarity(songs)
shuffled_songs = shuffle_and_merge(groups)

print(shuffled_songs)