中关村东路 发表于 2023-2-12 21:28

避免Roon等数播系统文件名错误的小技巧

本帖最后由 中关村东路 于 2023-2-12 21:41 编辑

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


import os
from pathlib import Path
from pathvalidate import sanitize_filename


PATH = ["/tank/stage/various/dsd",
      "/tank/stage/various/flac",
      "/tank/stage/classic/dsd",
      "/tank/stage/classic/flac",
      "/tank/stage/jazz/dsd",
      "/tank/stage/jazz/flac",
       ]
上面这段代码里,PATH是你的音乐目录,需要修改一下。我分开是因为其他脚本也用了这个PATH,写一个总目录也可以。


中关村东路 发表于 2023-2-12 21:34

本帖最后由 中关村东路 于 2023-2-12 21:40 编辑

错误删掉..

中关村东路 发表于 2023-2-12 21:36

本帖最后由 中关村东路 于 2023-2-12 21:40 编辑

def rename(name):
    new_name = "" + sanitize_filename(name)
    if new_name.startswith(" "):
      new_name = new_name
    if new_name.endswith(".fla"):
      new_name = new_name.replace(".fla", ".flac")
    if new_name.endswith(".FLA"):
      new_name = new_name.replace(".FLA", ".flac")
    new_name = new_name.replace("A$AP", "ASAP")
    new_name = new_name.replace("$ale", "Sale")
    new_name = new_name.replace("$ign", "Sign")
    new_name = new_name.replace("$Ale", "Sale")
    new_name = new_name.replace('《', '[')
    new_name = new_name.replace('》', ']')
    new_name = new_name.replace('【', '[')
    new_name = new_name.replace('】', ']')
    new_name = new_name.replace('(', '(')
    new_name = new_name.replace(')', ')')
    new_name = new_name.replace('/', '_')
    new_name = new_name.replace('<', '_')
    new_name = new_name.replace('>', '_')
    new_name = new_name.replace(':', '_')
    new_name = new_name.replace('"', "'")
    new_name = new_name.replace('/', '_')
    new_name = new_name.replace('\\', '_')
    new_name = new_name.replace('|', '_')
    new_name = new_name.replace('?', '_')
    new_name = new_name.replace('*', '_')
    new_name = new_name.replace('这里是美刀符号需要自己修改', '_')
    new_name = new_name.replace('`', "'")
    new_name = new_name.replace('~', '_')
    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



def process(dirs):
    if len(dirs) == 0:
      return
    subs = []
    for dir in dirs:
      for child in dir.glob('*'):
            new_name = rename(child.name)
            new_path = Path(dir, new_name)
            if new_name != child.name:
                print('======', dir)
                print('old', child.name)
                print('new', new_name)
                child.rename(new_path)

            if new_path.is_dir():
                subs.append(new_path)
    process(subs)

for p in PATH:
    print('=====rename', p)
    process()


上面这段就是一个简单的递归。遍历一下所有文件,把需要重命名的用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

先收藏:victory:

万远 发表于 2023-2-21 09:56

虽然不知如何使用,但还是感谢你分享!
页: [1]
查看完整版本: 避免Roon等数播系统文件名错误的小技巧