Mopidy: Les espaces supplémentaires dans le paramètre media_dirs du fichier backend ne sont pas ignorés

Créé le 13 janv. 2021  ·  12Commentaires  ·  Source: mopidy/mopidy

Initialement signalé sur https://discourse.mopidy.com/t/problems-accessing-files-via-nfs/4637/7

La configuration suivante entraîne l'avertissement :

AVERTISSEMENT [MainThread] mpidy.file.library /music/Network/flac n'est pas un répertoire.

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

Cela se produit parce que nous ne supprimons pas les espaces blancs de chaque élément, nous finissons donc par essayer d'utiliser le chemin inexistant "/music/Network/flac". Ce problème n'est pas évident à partir du message d'avertissement.

Nous devrions supprimer les espaces et nous devrions probablement aussi utiliser .as_uri() lors de l'affichage du chemin, cela l'aurait rendu plus évident :

AVERTISSEMENT [MainThread] mpidy.file.library file:///music/Network/flac%20 n'est pas un répertoire.

C-bug good first issue A-file

Commentaire le plus utile

@djmattyg007 Merci beaucoup pour les éclaircissements, je vais créer un projet de relations publiques et vous y marquer.

Tous les 12 commentaires

Je ne pense pas que nous devrions faire des hypothèses sur les noms de chemin spécifiés par l'utilisateur. S'ils avaient légitimement un chemin qui se terminait par un caractère espace, ils ne pourraient jamais l'utiliser judicieusement.

Mieux représenter le chemin dans les messages d'erreur est certainement une bonne idée.

Je ne l'ai pas essayé mais notre type de configuration Path sera strip() la valeur donc j'ai pensé que cela devrait faire la même chose. Ce qui signifierait que vous ne pouvez probablement pas actuellement définir un chemin qui se termine par un espace dans un fichier de configuration Mopidy. Je ne suis pas en désaccord avec votre point de vue, mais je peux imaginer que les espaces blancs accidentels à la fin des lignes dans les fichiers de configuration sont beaucoup plus courants que les chemins qui se terminent par des espaces. Cela pourrait donc être intentionnel, incertain.

Ça a du sens.

Dans le cadre de la réflexion sur #1966, j'ai réalisé que mon idée d'amélioration de la gestion de la configuration pourrait également être utilisée dans l'extension File . En prolongeant l'exemple que j'ai fourni sur cette question :

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),
        )

Vous pouvez ensuite composer ceci comme ceci pour l'extension 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, "+")),
        ),
    ),
)

Cela élimine le besoin de gérer tout cela dans le code d'acteur de l'extension File et garantit que la configuration est entièrement validée avant même que Mopidy ne démarre.

Soit dit en passant, l'exemple de code ci-dessus remplace inconditionnellement os.sep par "+" . Cela diffère de ce que Mopidy fait actuellement - les séparateurs de chemin ne sont remplacés par + si nous réutilisons le chemin du fichier réel comme étiquette du chemin. Je n'étais pas en mesure de trouver une raison pour laquelle les étiquettes de chemin ne pouvaient pas contenir de barres obliques, donc je pense qu'il est logique d'effectuer la substitution inconditionnellement.

Référence : https://github.com/mopidy/mopidy/blob/develop/mopidy/file/library.py#L133

Ce problème est-il toujours ouvert ? Je peux y travailler si quelqu'un me donne une direction. Je suis un nouveau contributeur.

Oui. Je pense que le message d'origine a la direction mais s'il vous plaît demandez si vous avez une question spécifique.

@kingosticks Que pensez-vous de ma proposition légèrement plus large de rendre le système d'analyse de configuration plus puissant ?

Désolé, oui, puisque File est fourni avec Mopidy, cette direction convient également. C'est juste plus compliqué à la fois dans le correctif et dans le test. Si vous êtes heureux d'aider / d'examiner ce que @abid1998 propose, cela semble bien.

@kingosticks @djmattyg007
D'après ce que je comprends, je dois apporter des modifications à ces fichiers ?
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/__init__.py
https://github.com/mopidy/mopidy/blob/HEAD/mopidy/file/library.py
Dois-je donc supprimer les espaces du côté droit avant | personnage ? ou dois-je afficher un message d'erreur utile s'il y a un espace ?

@abid1998 Vous allez vouloir commencer par apporter des modifications à ce fichier :

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

Spécifiquement:

  • Mettre à jour les types String et List , comme documenté dans #1966
  • Implémentez le type Pair comme mentionné ci-dessus

Vous devriez également ajouter des tests pour cette nouvelle fonctionnalité ici :

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

Une fois cela fait, vous pouvez mettre à jour l'extension de fichier. La définition de configuration dans __init__.py doit être mise à jour en suivant les lignes de mon exemple ci-dessus. Vous devriez alors pouvoir simplifier considérablement le code d'analyse du répertoire multimédia dans library.py .

S'il vous plaît laissez-nous savoir si vous avez besoin de plus d'aide ou de conseils, ou si quelque chose que j'ai écrit n'a pas de sens.

@djmattyg007 Merci beaucoup pour les éclaircissements, je vais créer un projet de relations publiques et vous y marquer.

@abid1998 Comment allez-vous avec ces mises à jour ? Avez-vous besoin d'aide?

Cette page vous a été utile?
0 / 5 - 0 notes