耳机网-耳机大家坛

标题: 避免Roon等数播系统文件名错误的小技巧 [打印本页]

作者: 中关村东路    时间: 2023-2-12 21:28
标题: 避免Roon等数播系统文件名错误的小技巧
本帖最后由 中关村东路 于 2023-2-12 21:41 编辑

在Roon官方论坛和PNA用户群里都见到有用户提到有音乐文件名不规范,导致软件不能解析,重则系统假死轻则不能播放等各种问题。这里提供一个我使用的一段跑在Linux NAS上的Python脚本,供理工科的烧友和公司使用。不是程序员水平有限,只保证这段代码直接运行有效,在我和朋友的机器上稳定运行了两年了吧;毕竟是数据相关,自己有特殊需求想修改的请谨慎。


  1. import os
  2. from pathlib import Path
  3. from pathvalidate import sanitize_filename


  4. PATH = ["/tank/stage/various/dsd",
  5.         "/tank/stage/various/flac",
  6.         "/tank/stage/classic/dsd",
  7.         "/tank/stage/classic/flac",
  8.         "/tank/stage/jazz/dsd",
  9.         "/tank/stage/jazz/flac",
  10.        ]
复制代码

上面这段代码里,PATH是你的音乐目录,需要修改一下。我分开是因为其他脚本也用了这个PATH,写一个总目录也可以。



作者: 中关村东路    时间: 2023-2-12 21:34
本帖最后由 中关村东路 于 2023-2-12 21:40 编辑
  1. 错误删掉..
复制代码

作者: 中关村东路    时间: 2023-2-12 21:36
本帖最后由 中关村东路 于 2023-2-12 21:40 编辑
  1. def rename(name):
  2.     new_name = "" + sanitize_filename(name)
  3.     if new_name.startswith(" "):
  4.         new_name = new_name[1:]
  5.     if new_name.endswith(".fla"):
  6.         new_name = new_name.replace(".fla", ".flac")
  7.     if new_name.endswith(".FLA"):
  8.         new_name = new_name.replace(".FLA", ".flac")
  9.     new_name = new_name.replace("A$AP", "ASAP")
  10.     new_name = new_name.replace("$ale", "Sale")
  11.     new_name = new_name.replace("$ign", "Sign")
  12.     new_name = new_name.replace("$Ale", "Sale")
  13.     new_name = new_name.replace('《', '[')
  14.     new_name = new_name.replace('》', ']')
  15.     new_name = new_name.replace('【', '[')
  16.     new_name = new_name.replace('】', ']')
  17.     new_name = new_name.replace('(', '(')
  18.     new_name = new_name.replace(')', ')')
  19.     new_name = new_name.replace('/', '_')
  20.     new_name = new_name.replace('<', '_')
  21.     new_name = new_name.replace('>', '_')
  22.     new_name = new_name.replace(':', '_')
  23.     new_name = new_name.replace('"', "'")
  24.     new_name = new_name.replace('/', '_')
  25.     new_name = new_name.replace('\\', '_')
  26.     new_name = new_name.replace('|', '_')
  27.     new_name = new_name.replace('?', '_')
  28.     new_name = new_name.replace('*', '_')
  29.     new_name = new_name.replace('这里是美刀符号需要自己修改', '_')
  30.     new_name = new_name.replace('`', "'")
  31.     new_name = new_name.replace('~', '_')
  32.     return new_name
复制代码

上面这段代码写的很繁琐很难看,但也是分享的小技巧的核心。没别的办法,一部分是按照Roon的官方FAQ(见【1】)写的,一部分是自己遇到的诡异文件名。截止目前,在utf8 encoding下,这段规则是好的,以后遇到什么新的问题我会在这增加。因为本网站也遇到符号问题。。。。上面有一句“这里是美刀符号需要自己修改”,请自行修改成美元符号。。囧


【1】https://help.roonlabs.com/portal/en/kb/articles/faq-some-of-my-files-aren-t-showing-up-in-roon#Special_Characters





作者: 中关村东路    时间: 2023-2-12 21:39


  1. def process(dirs):
  2.     if len(dirs) == 0:
  3.         return
  4.     subs = []
  5.     for dir in dirs:
  6.         for child in dir.glob('*'):
  7.             new_name = rename(child.name)
  8.             new_path = Path(dir, new_name)
  9.             if new_name != child.name:
  10.                 print('======', dir)
  11.                 print('old', child.name)
  12.                 print('new', new_name)
  13.                 child.rename(new_path)

  14.             if new_path.is_dir():
  15.                 subs.append(new_path)
  16.     process(subs)

  17. for p in PATH:
  18.     print('=====rename', p)
  19.     process([Path(p)])
复制代码


上面这段就是一个简单的递归。遍历一下所有文件,把需要重命名的用Path.rename函数改一下。


如果上面的技巧对你有所帮助,或者遇到疑问,可以直接回复。


作者: wahher    时间: 2023-2-12 23:08
高端,看不懂,帮顶
作者: qazpl963    时间: 2023-2-13 05:31
看了下,这不就是个改名小程序吗。。。
作者: 耳机俱乐部小黑    时间: 2023-2-13 08:39
类似于批处理文件,便利后缀改命吧
作者: Frank75    时间: 2023-2-13 09:55
软件大拿,不明觉厉!
作者: 中关村东路    时间: 2023-2-13 15:20
耳机俱乐部小黑 发表于 2023-2-13 08:39
类似于批处理文件,便利后缀改命吧

你如果说原理,那确实就是批处理,递归遍历实现的。


这代码的关键是到底 roon 系统有什么文件名需要被批处理掉,批处理成什么才能保证 roon 正常运行。上面代码跑了两年多一直稳定,最近有朋友提到,我就拿出来分享给可能用得到的烧友
作者: 中关村东路    时间: 2023-2-13 15:24
qazpl963 发表于 2023-2-13 05:31
看了下,这不就是个改名小程序吗。。。

您抬举了,开篇第一句就说了只是段脚本,您居然还要看一下才知道。
作者: xreyer    时间: 2023-2-13 18:28
先收藏
作者: 万远    时间: 2023-2-21 09:56
虽然不知如何使用,但还是感谢你分享!




欢迎光临 耳机网-耳机大家坛 (http://www2.erji.net/) Powered by Discuz! X3.2