Hexo Aplayer歌词获取、生成、提取等

场景

这个博客的搭建主要是从洪卫の博客这个大哥那里直接克隆来的,最开始接触也是朋友推荐了解了这个大佬,也从而了解到Hexo这个博客搭建程序,铺垫结束了。

此前对这个主题上的这个音乐播放器很感兴趣,包括复写这个博客的时候也是运用了Aplayer这个插件,并且实现了完整功能。这次重新搭建这个博客的时候,发现音乐播放没有歌词了,确实是因为json文件里没有歌词,固然也是不显示,好,现在就加上歌词。


分析及实现

存放音乐信息最基本的文件结构如下:

/source_data/musics.json

[
    {
        "name": "三十二段留言",
        "artist": "Vicky宣宣",
        "url": "http://music.163.com/song/media/outer/url?id=1817160410.mp3",
        "cover": "https://p2.music.126.net/VJvURwhahDjZNI5ppEll6Q==/109951165687836464.jpg?param=130y130"
    },
    {
        "name": "请你吃个冰激凌",
        "artist": "花粥",
        "url": "http://music.163.com/song/media/outer/url?id=1357999885.mp3",
        "cover": "https://p1.music.126.net/H6dt7IgvXNWhRM_w7XbcqQ==/109951163990575387.jpg?param=130y130"
    },
    {
        "name": "世间美好与你环环相扣",
        "artist": "柏松",
        "url": "http://music.163.com/song/media/outer/url?id=1363948882.mp3",
        "cover": "https://p1.music.126.net/DK1_4sP_339o5rowMdPXdw==/109951164071024476.jpg?param=130y130"
    },
    {
        "name": "海盗船长2.0",
        "artist": "花粥 / 风子",
        "url": "http://music.163.com/song/media/outer/url?id=571601379.mp3",
        "cover": "https://p1.music.126.net/OqfOJEOTevVEafeMRfpq5g==/109951163336170259.jpg?param=130y130"
    }
]

Aplayer官网文档指出了三种将 LRC 传递给 APlayer的方式,总结一下大概就是要[00:00.00]APlayer\n[00:04.01]is\n[00:08.02]amazing这个格式内容,因此我们搞出这种格式,写入json文件中,那就直接收工了。

从网易云的请求中,我们可以直接拿到相对应的歌词文件,创建相对应的.txt文件,丢到我们的文件夹中就可以了。

从请求中拿到的歌词,如下:

[00:00.00] 作词 : 风子
[00:01.00] 作曲 : 风子
[00:17.05]青岛又吹起了风
[00:20.25]我一个人在海边的夜里发抖
[00:24.92]忽然又想起我那荒唐又无聊的人生
[00:31.92]我努力偏离了航道
[00:35.51]终于捕捉到你的信号
[00:39.06]我曾经伤害也曾经被伤害
[00:42.51]现在只想停泊靠岸
[00:49.45]于是我丢掉了船
[00:51.80]烧掉了帆
[00:54.15]砍断了我的桅杆
[00:57.97]回到那片熟悉的海滩
[01:01.17]却找不到属于我的港湾
[01:04.73]我穿过峡谷
[01:06.77]又翻过雪山
[01:09.15]路过无人的戈壁滩
[01:12.84]看遍人间的欢乐和悲惨
[01:16.12]却找不到我的答案
......

以下是通过Python实现.txt生成.lrc文件的具体操作:

import os
import re

def modify_files(folder_path):
    oldFiles = []
    newFiles = []
    # 遍历文件夹下的所有文件
    for file_name in os.listdir(folder_path):
        if file_name.endswith('.txt'):
            # 构建原始文件和新文件的路径
            original_file_path = os.path.join(folder_path, file_name)
            new_file = f"{os.path.splitext(file_name)[0]}.lrc"
            new_file_path = os.path.join(folder_path, new_file)
            # 检查是否存在相同命名的.lrc文件
            if os.path.exists(new_file_path):
                oldFiles.append(new_file)
                continue
            # 打开原始文件和新文件,指定编码方式为UTF-8,忽略无法解码的字符
            with open(original_file_path, 'r', encoding='utf-8', errors='ignore') as f1, open(new_file_path, 'w', encoding='utf-8') as f2:
                # 读取原始文件内容
                content = f1.read()
                # 使用正则表达式替换换行符为"\n"
                new_content = re.sub(r'\n', r'\\n', content)
                # 将修改后的内容写入新文件
                f2.write(new_content)
                newFiles.append(new_file)

    print("已有的.lrc文件:", oldFiles)
    print("新生成的.lrc文件:", newFiles)

# 调用方法,传入文件夹路径
folder_path = r'C:\Users\30735\Desktop\music'
modify_files(folder_path)

首先,定义了两个列表 oldFiles 和 newFiles,用于存储已有的 lrc 文件和新生成的 lrc 文件。

然后,使用 os.listdir() 函数遍历文件夹下的所有文件,并使用 os.path.join() 函数构建原始文件和新文件的路径。

如果原始文件的后缀名为 .txt,则检查是否存在相同命名的 .lrc 文件。如果存在,则将该文件添加到 oldFiles 列表中,并跳过该文件。

如果不存在相同命名的 .lrc 文件,则使用 open() 函数打开原始文件和新文件,并使用 re.sub() 函数替换换行符为 “\n”。

最后,使用 write() 函数将修改后的内容写入新文件,并将新文件添加到 newFiles 列表中。


此时,我们就在目标文件夹得到了对应的.lrc文件。


 上一篇
数据库相关知识点(整理中) 数据库相关知识点(整理中)
常用的聚合函数有哪五种?count()、sum()、avg()、min()、max() count():求表的行数或者指定表中某个列的列值行数,null值被忽略 select count(字段) from 表名 --得到该列值的非null值
2023-07-11
下一篇 
iView Select组件相关问题总结(回显、默认值等) iView Select组件相关问题总结(回显、默认值等)
项目场景:使用iView Select组件时,需要实现编辑修改原始数据的功能。实现步骤: 通过选中权限ID查询其相应的数据,如权限等级、父权限、名称等; 通过v-model将数据进行双向绑定,实现数据回显; 修改后,提交。 问题描述一级
2023-03-01
  目录