Métadonnées de fichiers Multimédia

En récupérant une liste de fichiers multimédia, je me suit retrouvé avec une liste de fichiers à 4 caractères et qui ne signifiait rien. Grrr.... J'ai alors décidé de faire un petit utilitaire pour me permettre de renommer les fichiers selon un pattern que j'avais déjà sur ma machine selon l'artiste, l'album et du titre de la chanson.

Mais une problématique surgit rapidement: Comment récupérer ces métadonnées (principalement des fichiers MP3)?

J'ai donc fait ce que je fais souvent lorsque j'ai une question, je fais une petite recherche. Et j'ai trouvé sur ce résultat de StackOverflow un lien vers le TagLib# (Fonctionnant aussi sur Mono)! Cette librairie de Novell fait tout le boulot pour moi! Il me permet d'accèder au métadonnées et ce pour de nombreux type de fichiers différents. Voici l'exemple basique parmi plusieurs fournit sur leur site:

try
{
   TagLib.File file = TagLib.File.Create ("/path/to/music/file.mp3");
   
   // Read some information.
   string    title   = file.Tag.Title;
   uint      track   = file.Tag.Track;
   string    album   = file.Tag.Album;
   string [] artists = file.Tag.Artists; // Remember, each song can have more than one artist.
   
   ... // Do stuff to title, album, artists.
   
   // Store that information in the tag.
   file.Tag.Title   = title;
   file.Tag.Track   = track;
   file.Tag.Album   = album;
   file.Tag.Artists = artists;
   
   file.Save ();
}
catch {...}

 

Donc si jamais vous avez besoin de métadonnées, je vous suggère grandement celle-ci!

Collection observable surveillant les modifications aux items

J'ai été confronté à une situation lors d'un développement d'une application WPF qui utilisait la classe ObservableCollection, voici la description:

Problème:

Collection d'items qui comporte plusieurs items (qui eux implémente l'interface INotifyPropertyChanged). Je dois faire certains calculs: Total des items à complétés, total des items complétés, items restants, etc. Mais lorsque qu'un de ces items changeait de statut et devenait complété, impossible de pousser l'information (push) à un niveau supérieur.

Solution proposée:

Utilisation d'un thread qui à chaque intervalle X, allez valider les totaux et mettre à jour les données sur l'interface, de façon tirer (pull). N'aimant pas vraiment cette idée et essayant de diminuer au minimum les pull pour privilégier les push, j'ai fait une petite recherche sur le sujet.

Solution implémentée:

J'ai trouvé la une solution sur StackOverflow, qui dérivait de ObservableCollection et implémentait l'interface INotifyPropertyChanged, soit la classe  ObservableCollectionEx<T>. Voici la classe en tant que telle:

 

public class ObservableCollectionEx : ObservableCollection where T : INotifyPropertyChanged 
  { 
    public ObservableCollectionEx() 
      : base() 
    { 
    } 
 
    protected override void OnCollectionChanged(System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 
      Unsubscribe(e.OldItems); 
      Subscribe(e.NewItems); 
      base.OnCollectionChanged(e); 
    } 
 
    private void Subscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged += (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void Unsubscribe(System.Collections.IList iList) 
    { 
      if (iList != null) 
      { 
        foreach (T element in iList) 
          element.PropertyChanged -= (x, y) => ContainedElementChanged(y); 
      } 
    } 
 
    private void ContainedElementChanged(PropertyChangedEventArgs e) 
    { 
      OnPropertyChanged(e); 
    }
}

Très simple et surtout générique. Pour l'utilisation, soren.enemaerke (l'auteur original) propose ce petit bout de code:

ObservableCollectionEx collection = new ObservableCollectionEx(); 
((INotifyPropertyChanged)collection).PropertyChanged += (x,y) => ReactToChange();

Ce que je n'ai pas encore expérimenté, c'est d'étendre cette classe pour offrir un peu plus de fonctionnalités qui serait très utile, ce sera pour une prochaine fois.

PRISM et les contrôles Telerik RadControls for WPF

Depuis quelques temps, j'ai eu la chance d'expérimenter PRISM et j'aime bien ce que ce dernier apporte. Mais j'utilise aussi certains contrôles de Telerik pour WPF, en faisant quelques recherches, j'ai remarqué que Telerik à mis à même sa documentation des éléments sur PRISM.

Voici quelques liens intéressants:

Si vous avez d'autres articles intéressants, faites le moi savoir via les commentaires ou ma page de contact

Visual Studio Power Tools, Code Compare et PowerCommands

Voici une collection d'outils/plugins/utilitaires permettant de travailler encore plus efficacement avec VS2010, voici les 3 que j'installe avec VS2010. Puisque vous y êtes, allez donc faire un tour sur le Visual Studio Gallery, vous allez sûrement trouver quelque chose d'intéressant!

Visual Studio 2010 Pro Power Tools

Nouvellement arrivé, le Pro Power Tools permettent entre autre une meilleure gestion des onglets (par projet, code de couleur, scroll, stack, ...) ainsi que la recherche dans le menu Add Reference, ce qui est assez chouette, et j'ai même remarqué une amélioration des performances de ce dialogue.

PowerCommands for VS2010

Si vous ne l'avez pas, vous devez allez le chercher!!! Celui-ci ajoute des commandes(comme copier/coller un projet) qui sont vraiment utile.

Code Compare

Pour ceux qui ne comprenne pas l'anglais, Code Compare permet de comparer du code. Quoi dire de plus? À oui: il est intégré à VS2010

Le TextFieldParser

Éric Moreau à écrit un article sur une composante intéressante que je ne connaissais pas (disponible depuis le 2.0): le TextFieldParser. Celle-ci fournit des méthodes et des objets permettant de parcourir les fichiers texte structurés (i.e. .CSV).

Malheureusement, Microsoft ont inclus cette dans l'extension Microsoft.VisualBasic.dll. Même si on peut ajouter cette extension en C#, celle-ci n'est pas vraiment spécifique au VB.

Bonne lecture

 

Composite Application Library (PRISM) et Silverlight(WPF)

Depuis quelques temps, j'expérimente avec Silverlight et PRISM. Si vous êtes curieux comme moi voici quelques liens pour vous aider à commencer:

Bonne chance, et si vous avez d'autres liens, n'hésitez pas à laissez un commentaire!

BlogEngine.Net 1.6.1.0 maintenant disponible.

Une nouvelle version de mon engin de blogue vient de paraitre. Je vais attendre un peu, car les modifications sont mineures:

«Do I need to upgrade?
If you happy with a way comments work in your blog as they are - no. If you still looking for better anti-spam protection - yes.»

On verra pour la suite car cela fonctionne bien pour moi.