3 votes

Existe-t-il un champ équivalent à Label/Publisher dans taglib-sharp ?

J'essaie de mettre à jour le champ étiquette/éditeur en utilisant Taglib-sharp, mais je ne le vois nulle part dans sa hiérarchie d'objets en utilisant le navigateur d'objets.

J'ai cherché sur Google et dans la documentation et il semble que ce soit un champ qui n'est pas pris en compte.

Avant de chercher des alternatives (quelqu'un peut-il m'en suggérer ?) qui peuvent éditer ces champs, j'ai pensé faire un dernier essai et demander au sein de la communauté StackOverflow qui est familier avec TagLib-sharp et qui a une opinion plus informée ?

Merci d'avance,

Francis

Mise à jour : J'ai étudié d'autres bibliothèques telles que mpg123 & UltraID3Lib mais elles semblent avoir les mêmes limitations.

5voto

Eh bien, la réponse de Daniel Fuchs n'a pas fonctionné pour moi. Mais, c'était un début.

L'étape par étape pour ajouter un champ dans le code TagLib-sharp est la suivante :

  1. Télécharger Source :

  2. Ouvrir le fichier TagLib/Tag.cs et insérez le code suivant (Je l'ai inséré sous PerformersSort, ligne 250) :

    public virtual string Publisher
    {
        get { return ""; }
        set { }
    }
  3. Ouvrir le fichier TagLib/Id3v2/Tag.cs et insérez le code suivant (Je l'ai inséré sous PerformersSort, ligne 1292) :

    public override string Publisher
    {
        get { return GetTextAsString(FrameType.TPUB); }
        set { SetTextFrame(FrameType.TPUB, value); }
    }
  4. Ouvrir le fichier TagLib/Id3v2/FrameTypes.cs et insérez le code suivant (Je l'ai inséré sous TPOS, ligne 71) :

    public static readonly ReadOnlyByteVector TPUB = "TPUB";
  5. Maintenant vient le truc "Aha". Ouvrez le fichier TagLib/CombinedTag.cs et insérez le code suivant (Je l'ai inséré sous PerformersSort, ligne 318) :

    public override string Publisher
    {
        get
        {
            foreach (Tag tag in tags)
            {
                if (tag == null)
                    continue;
    
                string value = tag.Publisher;
    
                if (value != null)
                    return value;
            }
    
            return null;
        }
    
        set
        {
            foreach (Tag tag in tags)
                if (tag != null)
                    tag.Publisher = value;
        }
    }
  6. Enfin, compilez le code.

IMPORTANT : J'ai également eu des problèmes pour compiler le code. Vous devez télécharger le SharpZipLib dll (.NET 2.0) et inclure cette dll dans le projet taglib. Aussi, j'avais besoin d'installer NUnit, que j'ai fait avec Nuget. Enfin, j'ai commenté la librairie GDK et toutes ses erreurs dans le code de test, puisqu'elle ne sera pas utilisée en production.

1voto

Daniel Fuchs Points 306

Eh bien TagLib# n'est pas capable de lire l'étiquette de l'éditeur. Même la version la plus récente (2.1.0.0) n'est pas en mesure de le faire. Comme alternative, vous pouvez ajouter cette fonctionnalité vous-même en utilisant le code source de TagLib#, qui est librement disponible.

Pour ce faire, ouvrez le fichier TagLib/Id3v2/FrameTypes.cs et ajoutez la ligne suivante quelque part :

public static readonly ReadOnlyByteVector TPUB = "TPUB";  // Publisher field

Et dans le fichier TagLib/Id3v2/Tag.cs :

public string Publisher {
    get {return GetTextAsString (FrameType.TPUB);}
    set {SetTextFrame (FrameType.TPUB, value);}
}

Vous pouvez alors accéder au champ Publisher en utilisant quelque chose comme ceci

TagLib.File tf = TagLib.File.Create(...);   // open file
tf.Tag.Publisher = "Label XY";              // write new Publisher
tf.Save();                                  // save tags

Veuillez noter qu'il s'agit d'un hack très laid mais qui fonctionne pour les fichiers MP3.

0voto

Je ne suis pas habitué à TagLib#, mais j'utilise TagLib dans un projet Qt, où je récupère cette information en inspectant TagLib::File::properties . Jetez un coup d'œil à la documentation, c'est juste une carte de chaînes de caractères avec chaque propriété et valeurs.

J'espère que TagLib# possède cette méthode.

0voto

Francis Points 717

Mise à jour du 30 décembre 2019 :

Il semble que le principal taglib a inclus le champ de l'éditeur, donc vous devriez simplement utiliser la dernière version à la place. J'ai mis à jour la dernière version de TagLib à partir de mon fork et je peux attester qu'elle fonctionne comme prévu.

Astuce : Si vous souhaitez modifier la version du framework avec lequel TagLib est compilé (au moment de la rédaction de ce document, la version par défaut est 462 et .NET STD 2.0), vous devez modifier le fichier Directory.Build.Props situé dans le dossier Solutions.

<Project>
<PropertyGroup>
    <ReleaseVersion>2.2.0.0-beta</ReleaseVersion>
    <RepositoryUrl>https://github.com/mono/taglib-sharp</RepositoryUrl>
    <RepositoryType>git</RepositoryType>
    <TaglibSharpTargetFramework>net472;netstandard2.0</TaglibSharpTargetFramework>
    <LangVersion>latest</LangVersion>
</PropertyGroup>
</Project>

J'ai collé ma version ci-dessus qui montre que je l'ai modifiée pour compiler avec .NET 4.7.2 à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X