赞美诗365首唱谱视频,我用Golang写了个小工具,终于不用再翻纸质谱了
- 能源
- 2026-06-30 09:34:33
- 246
摘要:
说实话,我一开始对“赞美诗365首唱谱视频”这个需求是有点懵的,我老婆是教会唱诗班的,每周都要排练,她老跟我抱怨说纸质谱子翻来翻...
说实话,我一开始对“赞美诗365首唱谱视频”这个需求是有点懵的,我老婆是教会唱诗班的,每周都要排练,她老跟我抱怨说纸质谱子翻来翻去太麻烦,尤其是第365首《恩光歌》,每次要找半天,我说,那干脆我写个程序,把唱谱视频按序号整理好,还能自动播放,她白了我一眼:“你行吗?”——这话我可不爱听。
为什么是Golang?
我本身是搞后端开发的,Python、Node.js都用过,但这次选Golang,主要是因为:
- 编译快,生成单个二进制文件:我老婆的电脑就一普通笔记本,我不想让她装一堆依赖,Golang编译出来就是一个exe,双击就跑。
- 并发处理视频流不卡:唱谱视频有的分辨率高,Golang的goroutine处理起来比回调地狱舒服多了。
- 标准库齐全:不需要第三方库就能搞定HTTP、JSON解析、文件操作——对,我还真就只用标准库。
赞美诗365首唱谱视频到底是什么?
简单说,就是基督教赞美诗第365首《恩光歌》的唱谱视频,唱谱视频不是卡拉OK那种字幕,而是把谱子显示在画面上,同时有伴奏或者人声跟着谱子走,对于练习者来说,不用自己识谱,跟着视频唱就行,市面上这类资源其实挺杂乱的,有的在YouTube,有的在B站,画质音质参差不齐。
我拿Golang做了三件事
第一件事:批量下载并重命名
我从一个公开的赞美诗资源站上拿到了JSON列表,里面是每首歌的标题、序号、视频链接,但问题是,文件名都是乱码哈希值,“f3a2c9b8.mp4”,根本不知道是哪首,我写了个小脚本:
package main
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"path/filepath"
)
type Hymn struct {
ID int `json:"id"`string `json:"title"`
URL string `json:"url"`
}
func main() {
// 读取JSON
data, _ := os.ReadFile("hymns.json")
var hymns []Hymn
json.Unmarshal(data, &hymns)
for _, h := range hymns {
if h.ID == 365 {
resp, _ := http.Get(h.URL)
defer resp.Body.Close()
// 注意:这里得先创建目录
outPath := filepath.Join("videos", fmt.Sprintf("赞美诗%d_%s.mp4", h.ID, h.Title))
outFile, _ := os.Create(outPath)
io.Copy(outFile, resp.Body)
outFile.Close()
fmt.Printf("已下载:%s\n", outPath)
}
}
}
代码写得粗糙,但够用,我老婆看到文件夹里整整齐齐的 “赞美诗365_恩光歌.mp4”,眼睛都亮了。
第二件事:自动生成播放列表HTML
她想要一个像Netflix一样的界面,能点选序号播放,我直接Golang生成HTML,把视频文件列表写成
- 标签,每个
- 里放一个