Lecture/écriture des plist iTunes

Lonesome BoyLonesome Boy Membre
22:42 modifié dans API AppKit #1
Bonjour tout le monde!

C'est mon premier message sur ces forums, alors soyez indulgents ;)

Je ne suis pas encore très expérimenté en Cocoa, alors pardonnez-moi si ma question est bête ou bien si "j'ai pas assez cherché".

Je suis en train d'écrire ma première (vraie) application: un plug-in pour iTunes permettant de choisir sa propre méthode de rangement des mp3s sur le disque dur, en fonction des critères de l'utilisateur (utile si par exemple vous partagez vos fichiers musicaux sur un réseau local hétérogène où presque personne n'utilise iTunes ou si vous avez un serveur ftp ou bien encore si vous êtes maniaque).

Je m'explique: iTunes range les MP3s d'abord par artiste puis par album. Ceci ne me convient pas personnellement, et je pense que je ne dois pas être le seul. Mon plugin permet donc de choisir ses propres critères, par exemple par genre puis par artiste, puis par album etc.

J'ai donc utilisé NSPropertyList pour lire et mettre à  jour la bibliothèque iTunes (fichier ~/Music/iTunes/iTunes Music Library.xml). Mais je butte sur un problème:

Si je déplace simplement les fichiers après avoir créer les dossiers "qui vont bien", aucun problème.
Par contre, il est parfois nécessaire de renommer certains fichiers (s'il en existe déjà  un de même nom dans le répertoire de destination). Et là , c'est le drame: iTunes ne retrouve plus ses petits dans ce cas-là .

D'où mes questions:
1) Comment informer iTunes que le fichier a été renommé? Pourtant, je met à  jour (réécrit en fait, voir question 3) ) la plist lorsque la réorganisation des fichiers est terminée, mais apparemment iTunes n'en tient pas compte, même si je le relance. Il n'en tient pas non plus compte si j'utilise mon plugin de façon autonome, sans lancer iTunes.

2) J'ai fait la même chose chose avec le fichier iTunes 4 Music Library (binaire) sans plus de succès. En imaginant que ça marche, faut-il obligatoirement mettre à  jour les 2 fichiers biblio? Si non, lequel faut-il utiliser (rapidité). S'il y a des différences entre les 2 fichiers, quel est celui choisi par iTunes? (beurk, de la redondance!)

3) Comment mettre à  jour sur le disque seulement les parties du fichier qui le nécessitent (si un seul objet a changé par exemple) au lieu de le réécrire entièrement?

4) Lorsque j'ai cherché à  résoudre mon problème, j'ai trouvé la classe "NSFileWrapper". Je n'ai pas bien compris dans quels cas il faut l'utiliser. Dans la doc, ça a plutôt l'air d'être destiné aux applications basées sur les documents. Ce pourrait-il que ce soit tout de même la solution à  mon problème? Si oui, comment cela se passe-t-il au niveau des mécanismes de verrouillage?

5) J'ai téléchargé Notification Watcher, me disant qu'au lieu d'utiliser le sdk de plugin d'iTunes, normalement destiné aux plugins visuels, ce serait beaucoup plus simple d'utiliser des notifications. Mais je me suis rappelé de ce qu'il y a écrit dans mon bouquin (Cocoa par la pratique): "un centre de notification permet aux objets d'une application d'envoyer des notifications uniquement aux objets de cette même application". Alors, marchera? Marchera pas? Si oui, un p'tit exemple ne serait pas de refus ;)

Désolé pour la longueur de mon post.

Merci d'avance

[HS]Existe-t-il des librairies pour utiliser samba dans une application Cocoa? Si non, me faudra-t-il parser les résultats de smbclient ou smbtree par exemple?[/HS]

Réponses

  • 22:42 modifié #2
    Bienvenue!

    Le premier problème est que iTunes est en carbon donc ce n'est déjà  pas Cocoa que tu dois utiliser pour le modifier.

    Bon sinon, il me semble que la plist de iTunes est juste là  pour permettre à  des applications de l'utiliser (pour connaà®tre par exemple les playlists), mais iTunes utilise de manière interne une autre base de donnée, donc ce que tu veux faire me paraà®t très difficile.
  • Lonesome BoyLonesome Boy Membre
    22:42 modifié #3
    dans 1110560492:

    Bienvenue!

    Le premier problème est que iTunes est en carbon donc ce n'est déjà  pas Cocoa que tu dois utiliser pour le modifier.

    Bon sinon, il me semble que la plist de iTunes est juste là  pour permettre à  des applications de l'utiliser (pour connaà®tre par exemple les playlists), mais iTunes utilise de manière interne une autre base de donnée, donc ce que tu veux faire me paraà®t très difficile.


    Aà¯e. Mais où est stockée cette base de données alors? Peut-on la parser?
  • 22:42 modifié #4
    Elle est stockée en binaire, donc même si tu la trouves tu pourras rien en faire (ça s'appelle iTunes 4 Music Library).
  • Lonesome BoyLonesome Boy Membre
    22:42 modifié #5
    dans 1110567099:

    Elle est stockée en binaire, donc même si tu la trouves tu pourras rien en faire (ça s'appelle iTunes 4 Music Library).


    Bah si, ça marche:

    - (id)init
    {
        return [self initWithPath:@~/Music/iTunes/iTunes 4 Music Library];
    }
       
    - (id)initWithPath:(NSString *)path
    {
        [super init];
        NSData *plistData;
        NSString *error;
        NSPropertyListFormat format;
        libraryPath = [[path stringByExpandingTildeInPath] retain];
        plistData = [NSData dataWithContentsOfFile:libraryPath];

        musicLibrary = [[NSPropertyListSerialization propertyListFromData:plistData mutabilityOption:NSPropertyListMutableContainers format:&format errorDescription:&error]retain];
        [...]

    }

    C'est ce que j'expliquais dans mon 2)
  • mpergandmpergand Membre
    22:42 modifié #6
    Le fait que iTunes soit une appli carbon est à  mon avis sans importance.
    Regarde cette Page elle répertorie tous les moyens de communiquer entre applications
  • Lonesome BoyLonesome Boy Membre
    22:42 modifié #7
    dans 1110569872:

    Le fait que iTunes soit une appli carbon est à  mon avis sans importance.
    Regarde cette Page elle répertorie tous les moyens de communiquer entre applications


    J'ai jeté un coup d'oeil aux différentes pages, mais à  priori, je n'ai pas trouvé de réponse à  mon problème, sauf peut-être pour ma question 5: peut-être faut-il utiliser un NSDistributedNotificationCenter pour récupérer les notifications postées par iTunes. Quelqu'un sait-il si c'est bien ça?

    En ce qui concerne le problème d'iTunes qui ne retrouve pas les fichiers dont le nom a changé, j'ai l'impression que NSFileWrapper pourrait le résoudre, mais je n'ai pas compris si on peut l'utiliser dans mon cas, vu que dans la doc, il parle plutôt d'images, d'icônes, de drag & drop... D'où ma question 4.
    Alors, NSFileWrapper, c'est fait pour quoi? :)
  • fouffouf Membre
    22:42 modifié #8
    Je ne connait pas trop NSFileWrapper. Mais, si j'ai de bon souvenir, ca peut servir pour les alias et les Bundle. Apres, je sais plus.

    Tu souhaites mettre une sorte de notification center sur le fichier ??
  • mpergandmpergand Membre
    22:42 modifié #9
    dans 1110594768:

    J'ai jeté un coup d'oeil aux différentes pages, mais à  priori, je n'ai pas trouvé de réponse à  mon problème, sauf peut-être pour ma question 5: peut-être faut-il utiliser un NSDistributedNotificationCenter pour récupérer les notifications postées par iTunes. Quelqu'un sait-il si c'est bien ça?


    Oui, c'est ça, mais je pense que AppleScript est une meilleur piste...

    j'ai l'impression que NSFileWrapper pourrait le résoudre

    Fouf a raison, NSFileWrapper permet de créer des alias, mais je ne vois pas à  quoi ça pourrait te servir ...

    Car le problème, c'est que iTunes utilise les alias. Essaye de déplacer un fichier (sur le même disque) et encore plus fort: renomme le, tu peux constater que iTunes est toujours capable de le retrouver ! En fait, c'est le principe même d'un alias.
  • Lonesome BoyLonesome Boy Membre
    22:42 modifié #10
    dans 1110620350:

    dans 1110594768:

    J'ai jeté un coup d'oeil aux différentes pages, mais à  priori, je n'ai pas trouvé de réponse à  mon problème, sauf peut-être pour ma question 5: peut-être faut-il utiliser un NSDistributedNotificationCenter pour récupérer les notifications postées par iTunes. Quelqu'un sait-il si c'est bien ça?


    Oui, c'est ça, mais je pense que AppleScript est une meilleur piste...


    OK. Merci. En plus, ça vient de me donner une idée: pour les fichiers qui posent problème, j'essaierai d'utiliser AppleScript pour rajouter les chansons disparues en récupérant les tags "non-mp3" (comme le classement) puis virer ces tracks qu'il ne trouve pas.


    j'ai l'impression que NSFileWrapper pourrait le résoudre

    Fouf a raison, NSFileWrapper permet de créer des alias, mais je ne vois pas à  quoi ça pourrait te servir ...

    Car le problème, c'est que iTunes utilise les alias. Essaye de déplacer un fichier (sur le même disque) et encore plus fort: renomme le, tu peux constater que iTunes est toujours capable de le retrouver ! En fait, c'est le principe même d'un alias.


    Oui, mais tout fout le camp si on renomme de façon "programmationnelle" ;) les fichiers: iTunes est perdu! ça, je comprends pas pourquoi: il arrive à  retrouver les fichiers déplacés, mais pas les fichiers renommés.
    Je parlais de NSFileWrapper à  cause de ces phrases: "An NSFileWrapper holds a file?s contents in dynamic memory. In this role it enables a document object to embed a file, treating it as a unit of data", et de certaines méthodes qui auraient pu me servir, comme needsToBeUpdatedFromPath:
  • mpergandmpergand Membre
    22:42 modifié #11

    Tunes range les MP3s d'abord par artiste puis par album. Ceci ne me convient pas personnellement, et je pense que je ne dois pas être le seul. Mon plugin permet donc de choisir ses propres critères, par exemple par genre puis par artiste, puis par album etc.


    Dis-moi, si dans les prefs iTunes, tu décoches 'Maintenir organisé le dossier Itunes Music' dans Avancées, tu réorganises tes fichiers et enfin tu glisses tout le dossier sur l'icone d'iTunes, ça devrait le faire non ?
  • Lonesome BoyLonesome Boy Membre
    22:42 modifié #12
    dans 1110636712:


    Tunes range les MP3s d'abord par artiste puis par album. Ceci ne me convient pas personnellement, et je pense que je ne dois pas être le seul. Mon plugin permet donc de choisir ses propres critères, par exemple par genre puis par artiste, puis par album etc.


    Dis-moi, si dans les prefs iTunes, tu décoches 'Maintenir organisé le dossier Itunes Music' dans Avancées, tu réorganises tes fichiers et enfin tu glisses tout le dossier sur l'icone d'iTunes, ça devrait le faire non ?


    Ben c'est ce que mon appli fait (pour l'instant je le décoche à  la main), mais dès qu'elle renomme un fichier, c'est foutu :)
Connectez-vous ou Inscrivez-vous pour répondre.