✅ 正确的导入步骤

没有 BOM 头,没有多余空格。可以用这个命令重新生成一个干净的 CSV:

cd ~/navidrome
cat > radios.csv << 'EOF'
name,url
北京新闻广播,https://lhttp.qingting.fm/live/339/64k.mp3
北京交通广播,https://lhttp.qingting.fm/live/336/64k.mp3
北京文艺广播,https://lhttp.qingting.fm/live/333/64k.mp3
北京体育广播,https://lhttp.qingting.fm/live/335/64k.mp3
北京音乐广播,https://lhttp.qingting.fm/live/332/64k.mp3
北京城市广播,https://lhttp.qingting.fm/live/345/64k.mp3
京津冀之声,https://lhttp.qingting.fm/live/5022463/64k.mp3
郑州新闻广播,https://lhttp.qingting.fm/live/1220/64k.mp3
郑州交通广播,https://lhttp.qingting.fm/live/1211/64k.mp3
郑州经济广播,https://lhttp.qingting.fm/live/1221/64k.mp3
郑州音乐广播,https://lhttp.qingting.fm/live/4921/64k.mp3
郑州新乡交通广播,https://lhttp.qingting.fm/live/1229/64k.mp3
EOF

📝 用这个方法导入的

cd /data/navi

# 停止容器
docker-compose stop

# 先备份
cp data/navidrome.db data/navidrome.db.backup

# 使用交互式导入
sqlite3 data/navidrome.db

然后在 sqlite 提示符下执行:

-- 开启 CSV 模式
.mode csv

-- 导入 CSV(注意路径)
.import data/radios.csv temp_radios

-- 查看临时表有多少行(调试)
SELECT COUNT(*) FROM temp_radios;

-- 查看前几行
SELECT * FROM temp_radios LIMIT 3;

-- 插入数据(排除表头行)
INSERT INTO radio (id, name, stream_url, created_at, updated_at)
SELECT 
  lower(hex(randomblob(16))),
  name,
  url,
  datetime('now'),
  datetime('now')
FROM temp_radios
WHERE name != 'name'  -- 跳过表头
  AND NOT EXISTS (SELECT 1 FROM radio WHERE name = temp_radios.name);

-- 查看插入了多少条
SELECT changes();

-- 删除临时表
DROP TABLE temp_radios;

-- 验证结果
SELECT COUNT(*) FROM radio;
SELECT name, stream_url FROM radio WHERE name LIKE '%北京%' LIMIT 5;

-- 退出
.quit
# 重启容器
docker-compose start

📝 另一个方法

# 1. 进入正确目录
cd /data/navi

# 2. 停止容器
docker-compose stop

# 3. 现在导入(使用正确的相对路径)
sqlite3 data/navidrome.db << 'EOF'
.mode csv
.import --skip 1 data/radios.csv temp_radios

INSERT INTO radio (id, name, stream_url, created_at, updated_at)
SELECT 
  lower(hex(randomblob(16))),
  name,
  url,
  datetime('now'),
  datetime('now')
FROM temp_radios
WHERE NOT EXISTS (SELECT 1 FROM radio WHERE name = temp_radios.name);

DROP TABLE temp_radios;

SELECT '导入完成,当前电台总数: ' || COUNT(*) FROM radio;
EOF

# 4. 重启容器
docker-compose start

🎯 快速验证导入结果

# 查看所有电台
sqlite3 /data/navi/data/navidrome.db "SELECT name, stream_url FROM radio ORDER BY name;"

# 只看北京相关的
sqlite3 /data/navi/data/navidrome.db "SELECT name FROM radio WHERE name LIKE '%北京%';"

你现在在 /data/navi/data/ 目录下,记得 CSV 文件也在 data/ 子目录中(/data/navi/data/radios.csv)。按照上面的步骤操作应该可以成功导入。

标签: none

添加新评论