Lecture/écriture des plist iTunes
Lonesome Boy
Membre
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]
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]
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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?
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)
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?
Tu souhaites mettre une sorte de notification center sur le fichier ??
Oui, c'est ça, mais je pense que AppleScript est une meilleur piste...
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.
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.
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:
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