Mopidy: 文件后端的 media_dirs 设置中的额外空格不会被忽略

创建于 2021-01-13  ·  12评论  ·  资料来源: mopidy/mopidy

最初报道于https://discourse.mopidy.com/t/problems-accessing-files-via-nfs/4637/7

以下配置导致警告:

警告 [MainThread] mopidy.file.library /music/Network/flac 不是目录。

[file]
media_dirs = /music/Network/flac | NAS

发生这种情况是因为我们没有从每个项目中去除空格,因此我们最终尝试使用不存在的路径“/music/Network/flac”。 从警告消息来看,这个问题并不明显。

我们应该去除空格,并且在显示路径时我们可能还应该使用.as_uri() ,这会使它更明显:

警告 [MainThread] mopidy.file.library file:///music/Network/flac%20 不是目录。

C-bug good first issue A-file

最有用的评论

@djmattyg007非常感谢您的澄清,我将创建一个 PR 草案并在那里标记您。

所有12条评论

我认为我们不应该对用户指定的路径名​​做出任何假设。 如果他们合法地拥有以空格字符结尾的路径,他们将永远无法明智地使用它。

不过,在错误消息中更好地表示路径绝对是一个好主意。

我没有尝试,但我们的Path配置类型将strip()的值,所以我认为这应该做同样的事情。 这意味着您目前可能无法在 Mopidy 配置文件中设置以空格结尾的路径。 我不同意你的观点,但我可以想象配置文件中行尾的意外空格比以空格结尾的路径更常见。 所以这实际上可能是故意的,不确定。

那讲得通。

作为考虑 #1966 的一部分,我意识到我的配置处理改进想法也可以在File扩展中使用。 从我在该问题上提供的示例扩展而来:

class Pair(ConfigValue):
    def __init__(self, optional=False, optional_pair=False, separator="|", subtypes=None):
        self._required = not optional
        self._optional_pair = optional_pair
        self._separator = separator
        if subtype:
            self._subtypes = subtype
        else:
            self._subtypes = (String(), String())

    def deserialize(self, value):
        raw_value = decode(value).strip()
        validators.validate_required(raw_value, self._required)

        if self._separator in raw_value:
            value = value.split(self._separator, 1)
        elif self._optional_pair:
            value = (raw_value, raw_value)
        else:
            raise ValueError("must have separator")

        return (self._subtypes[0].deserialize(value[0]), self._subtypes[1].deserialize(value[1]))

    def serialize(self, value, display=False):
        return "{0}{1}{2}".format(
            self._subtypes[0].serialize(value, display),
            self._separator,
            self._subtypes[1].serialize(value, display),
        )

然后,您可以像这样为File扩展名编写此文件:

from mopidy import config
import os

schema["media_dirs"] = config.List(
    optional=True,
    subtype=config.Pair(
        optional=False,
        optional_pair=True,
        subtypes=(
            config.Path(),
            config.String(transformer=lambda x: x.replace(os.sep, "+")),
        ),
    ),
)

这消除了在File扩展的 actor 代码中处理任何这些的需要,并确保在 Mopidy 启动之前完全验证配置。

顺便说一句,上面的代码示例无条件地将os.sep替换"+" 。 这与 Mopidy 当前所做的不同 - 如果我们重新使用真实文件路径作为路径标签,路径分隔符只会被+替换。 我想不出路径标签中不能有斜线的原因,所以我认为无条件执行替换是有意义的。

参考: https :

这个问题仍然开放吗? 如果有人为我提供指导,我可以继续工作。 我是一个新的贡献者。

是的。 我认为原始帖子有方向,但请询问您是否有具体问题。

@kingosticks你怎么看我稍微大一点的让配置解析系统更强大的提议?

抱歉,是的,因为 File 与 Mopidy 捆绑在一起,所以这个方向也很好。 只是在修复和测试中都更加复杂。 如果您乐于帮助/查看@abid1998提出的问题,那听起来不错。

@kingosticks @djmattyg007
据我了解,我必须对这些文件进行更改?
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/__init__.py
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/library.py
所以我应该在之前从右侧去除空格吗? 特点 ? 或者,如果有空格,我应该显示有用的错误消息吗?

@abid1998您首先要更改此文件:

https://github.com/mopidy/mopidy/blob/develop/mopidy/config/types.py

具体来说:

  • 更新StringList类型,如 #1966 中所述
  • 实现上面提到的Pair类型

您还应该在此处添加针对此新功能的测试:

https://github.com/mopidy/mopidy/blob/develop/tests/config/test_types.py

完成后,您可以更新文件扩展名。 __init__.py的配置定义应该按照我上面的例子进行更新。 然后,您应该能够大幅简化library.py的媒体目录解析代码。

如果您需要更多帮助或建议,或者我写的任何内容没有意义,请告诉我们。

@djmattyg007非常感谢您的澄清,我将创建一个 PR 草案并在那里标记您。

@abid1998这些更新

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

djselbeck picture djselbeck  ·  8评论

godzillamesel picture godzillamesel  ·  6评论

weilbith picture weilbith  ·  7评论

ecoCuyo picture ecoCuyo  ·  3评论

zopyx picture zopyx  ·  4评论