Informado originalmente en https://discourse.mopidy.com/t/problems-accessing-files-via-nfs/4637/7
La siguiente configuración da como resultado la advertencia:
ADVERTENCIA [MainThread] mopidy.file.library / music / Network / flac no es un directorio.
[file]
media_dirs = /music/Network/flac | NAS
Esto sucede porque no eliminamos los espacios en blanco de cada elemento, por lo que terminamos intentando usar la ruta inexistente "/ music / Network / flac". Este problema no es obvio en el mensaje de advertencia.
Deberíamos eliminar los espacios en blanco y probablemente también deberíamos usar .as_uri()
al mostrar la ruta, esto lo habría hecho más obvio:
ADVERTENCIA [MainThread] mopidy.file.library file: /// music / Network / flac% 20 no es un directorio.
No creo que debamos hacer suposiciones sobre los nombres de ruta especificados por el usuario. Si tuvieran legítimamente un camino que terminara en un personaje espacial, nunca podrían usarlo con sensatez.
Sin embargo, representar mejor la ruta en los mensajes de error es definitivamente una buena idea.
No lo intenté, pero nuestro tipo de configuración Path
será strip()
el valor, así que pensé que esto debería hacer lo mismo. Lo que significaría que probablemente no pueda establecer actualmente una ruta que termine en un espacio en un archivo de configuración de Mopidy. No estoy en desacuerdo con su punto, pero puedo imaginar que los espacios en blanco accidentales al final de las líneas en los archivos de configuración son mucho más comunes que las rutas que terminan con espacios. Entonces, esto podría ser intencional, inseguro.
Eso tiene sentido.
Como parte de pensar en # 1966, me di cuenta de que mi idea de mejoras en el manejo de la configuración también podría utilizarse en la extensión File
. Ampliando el ejemplo que proporcioné sobre ese tema:
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),
)
A continuación, podría componer esto así para la extensión 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, "+")),
),
),
)
Esto elimina la necesidad de manejar todo esto dentro del código de actor de la extensión File
y asegura que la configuración esté completamente validada antes de que Mopidy comience.
Aparte, el ejemplo de código anterior reemplaza incondicionalmente os.sep
con "+"
. Esto difiere de lo que hace actualmente Mopidy: los separadores de ruta solo se sustituyen por +
si estamos reutilizando la ruta del archivo real como etiqueta de la ruta. No pude pensar en una razón por la que las etiquetas de ruta no pudieran tener barras, así que creo que tiene sentido realizar la sustitución incondicionalmente.
Referencia: https://github.com/mopidy/mopidy/blob/develop/mopidy/file/library.py#L133
¿Sigue abierto este problema? Puedo trabajar en ello si alguien me da una dirección. Soy un colaborador nuevo.
Si. Creo que la publicación original tiene la dirección, pero pregunte si tiene una pregunta específica.
@kingosticks ¿Qué opinas de mi propuesta un poco más amplia de hacer que el sistema de análisis de la configuración sea más potente?
Lo siento, sí, dado que File está incluido con Mopidy, esa dirección también está bien. Es más complicado tanto en la solución como en la prueba. Si está feliz de ayudar / revisar lo que se le ocurre a @ abid1998 , entonces eso suena bien.
@kingosticks @ djmattyg007
¿Por lo que tengo entendido, tengo que hacer cambios en estos archivos?
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/__init__.py
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/library.py
Entonces, ¿debo quitar los espacios del lado derecho antes de | personaje ? ¿O debería mostrar un mensaje de error útil si hay un espacio?
@ abid1998 Querrá comenzar haciendo cambios en este archivo:
https://github.com/mopidy/mopidy/blob/develop/mopidy/config/types.py
Específicamente:
String
y List
, como se documenta en # 1966Pair
como se mencionó anteriormenteTambién debe agregar pruebas para esta nueva funcionalidad aquí:
https://github.com/mopidy/mopidy/blob/develop/tests/config/test_types.py
Una vez hecho esto, puede actualizar la extensión del archivo. La definición de configuración en __init__.py
debería actualizarse siguiendo las líneas de mi ejemplo anterior. Entonces debería poder simplificar drásticamente el código de análisis del directorio de medios en library.py
.
Háganos saber si necesita más ayuda o consejo, o si algo que he escrito no tiene sentido.
@ djmattyg007 Muchas gracias por las aclaraciones.
@ abid1998 ¿Cómo te va con estas actualizaciones? ¿Necesitas ayuda?
Comentario más útil
@ djmattyg007 Muchas gracias por las aclaraciones.