9
votes

Créez une playlist iTunes avec le pont de script

J'essaie de créer une nouvelle liste de lecture d'utilisateurs à l'aide du pont de script de cacao, mais je ne peux pas sembler le faire fonctionner. J'ai jusqu'à présent: xxx

Lorsque j'essaie d'ajouter un nom pour la liste de lecture, je reçois le message d'erreur:

iTunesbridge [630: 80F] *** - [SBProxyByClass SetName:]: L'objet n'a pas encore été ajouté à un conteneur; Sélecteur non reconnu

Quelqu'un peut-il me dire dans la bonne direction?


2 commentaires

[Nom de la source] ISEQUALTOSTRING: @ "Bibliothèque"] Avez-vous testé cela dans des systèmes non anglais? Semble fragile ...


Dans les systèmes non anglais, vous devez utiliser ([Source Kind] == iTunesSrcLibrary)


5 Réponses :


5
votes

Faire de nouveaux objets d'application est terriblement obscurciée dans SB. La procédure pseudo-cocoa-iSh Alloc-init-ine-ine-injection n'indique aucune ressemblance avec ce qui se passe en dessous. Bien que l'ALLOC-INIT semble créer un objet régulier que vous puissiez manipuler avec des appels de méthode ultérieurs, le résultat est en réalité une cale dont la seule fonction est d'être "insérée" dans un "tableau", à quel point SB envoie un faire code> événement au processus cible. (Voir aussi ici et ICI pour les critiques SB.)

IIRC, le seul point que vous pouvez réellement spécifier les propriétés initiales est dans -IlitwithProperties: code>. Vous pouvez les définir une fois que l'objet a été «inséré», mais c'est une opération complètement différente (manipulation d'un objet qui existe déjà plutôt que de spécifier l'état initial pour un objet créé) afin de pouvoir facilement avoir des conséquences inattendues si vous n'êtes pas prudent. . P>

En tout cas, voici comment vous créeriez normalement une nouvelle liste de lecture si on n'existe pas déjà: p> xxx pré>

et, fwiw, voici comment je le ferais dans l'Objc, en utilisant Objc-Appscript (que j'ai écrit pour que je n'aurais pas à Utilisez SB, Natch): P>

#import "ITGlue/ITGlue.h"

NSString *playlistName = @"new playlist";

ITApplication *itunes = [ITApplication applicationWithName: @"iTunes"];
ITReference *playlist = [[itunes playlists] byName: playlistName];

if ([[[playlist exists] send] boolValue])
    playlist = [playlist getItem];
else
    playlist = [[[[itunes make] new_: [ITConstant playlist]] 
                      withProperties: [NSDictionary dictionaryWithObject: playlistName
                                                                  forKey: [ITConstant name]]] send];


1 commentaires

Hé, merci, vous avez raison, travaillant avec Scripting Bridge, c'est un peu de cauchemar. Objc-Appscript a l'air bien, mais un peu surkill dans mon cas, comme l'ajout de fichiers à une liste de lecture est tout ce que je suis après. Je l'ai acheté avec: Playlist = [[[[[[[[[iTunes ClassForCripCripClass: @ "Playlist"] ALLOC] Initidproperties: [Nsdictionary bla]]]; Donc merci pour le pointeur



1
votes

Vous devez regarder dans des eyetunes. C'est un cadre open-source pour interagir avec iTunes utilisant l'objectif-c. Votre code aurait l'air beaucoup plus simple si vous l'avez fait à travers EyeTunes.

http://www.liquidx.net/eyetune/


2 commentaires

EyeTunes fait exactement la même chose que Scriptingbridge fait. Toujours choisi la superficie à la 3ème partie, pour des corrections de bugs et une taille d'application plus petite.


Cela ne répond pas vraiment à la question de l'OP.



2
votes

juste une note rapide que [[Nom de la source] isequaltostring: @ "Bibliothèque"] ne fonctionne certainement pas sur des systèmes non anglais. Il serait peut-être préférable d'utiliser simplement iTunessource * Bibliothèque = [[[Sources _Tunes] ObjectAindex: 0]; car le premier élément source est celui situé en haut, par exemple. la bibliothèque principale.


0 commentaires

10
votes

Le message d'erreur vous indique que les objets de pont de script tels que votre liste de lecture ne peuvent pas recevoir de messages tant qu'ils n'ont pas été ajoutés au SbelementalArray correspondant, de sorte que votre tentative de définition d'une propriété sur la liste de lecture avant de l'ajouter au tableau échoue.

La solution la plus simple consiste simplement à réorganiser les deux dernières lignes de code, comme ceci: xxx

L'autre option est d'utiliser initwithproperties: qui, selon votre commentaire sur une autre réponse, c'est ce que vous avez fini par faire.


0 commentaires

2
votes

C'est ce que j'ai fait pour identifier de manière fiable la bibliothèque. Je pourrais le faire mal. XXX


0 commentaires