2016-09-11 1 views
0

j'ai une liste de lecture iTunes I précédemment sauvegardé dans un fichier texte qui est dans le format suivant:AppleScript pour ajouter plusieurs pistes à partir d'iTunes dans une liste de lecture en utilisant un fichier texte comme source

« title », "artiste », "numéro de piste", "album"

J'ai créé un exemple de fichier en utilisant quatre de ces pistes:

"rituel", "Chick Corea Elektric Band II", "9", "Paint The World"
"Risque", "Deftones", "9", "Diamond Eyes"
"Risveglio", "Gobelin", "10", "Zombi"
"Rituel", "Ashes Divide", "8", "Continuez à me dire que tout va bien"

Toutes les pistes de cette liste de lecture sont actuellement dans iTunes. Je veux ajouter chacune de ces pistes dans une liste de lecture en utilisant AppleScript. Je suis en mesure de le faire avec un seul élément (exemple: titre) avec le AppleScript suivant:

-- set variables 
set srcFile to "/Users/kjesso/Documents/=Scripting=/AppleScript/ipod_gym_playlist_track_names_sample.txt" 
set allRecords to paragraphs of (read srcFile as «class utf8») 
set myPlaylist to "Test" 
property okflag : false 

-- check if iTunes is running 
tell application "Finder" 
    if (get name of every process) contains "iTunes" then ¬ 
     set okflag to true 
end tell 
if okflag then 
    -- if iTunes is running then do this 
    tell application "iTunes" 
     repeat with aRecord in allRecords 
      set results to (every file track of playlist "Library" whose name is aRecord) 
      repeat with aTrack in results 
       duplicate aTrack to playlist myPlaylist 
      end repeat 
     end repeat 
    end tell 
else 
    -- if iTunes is not running do this 
    return "Unable to execute because iTunes is not running" 
end if 

Cependant, si un titre de piste en double se trouve d'un artiste différent, il suffit de prendre la première piste depuis le script ne peut pas distinguer entre différents artistes avec seulement le "titre" comme contenu. Les tableaux existent-ils nativement dans AppleScript?

Je suppose que cela devrait être fait avec un fichier de liste de propriétés? Après une autre lecture en ligne, en essayant de créer un tableau pour faire ce que je voulais (capture du titre de la piste, artiste, album, etc.), je suis tombé sur plusieurs threads indiquant qu'il est préférable d'utiliser une liste de propriétés. J'essaye d'accomplir semblable à ce qui a été fait here, mais au lieu d'envoyer la sortie à un dossier de CSV je veux l'envoyer à une liste de lecture dans iTunes.

J'ai créé le fichier de liste de propriétés exemple suivant si je dois utiliser une liste de propriétés pour atteindre mon objectif:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>title</key> 
    <string>"Ritual"</string> 
    <key>artist</key> 
    <string>"Chick Corea Elektric Band II"</string> 
    <key>album</key> 
    <string>"Paint The World"</string> 
</dict> 
<dict> 
    <key>title</key> 
    <string>"Risk"</string> 
    <key>artist</key> 
    <string>"Deftones"</string> 
    <key>album</key> 
    <string>"Diamond Eyes"</string> 
</dict> 
<dict> 
    <key>title</key> 
    <string>"Risveglio"</string> 
    <key>artist</key> 
    <string>"Goblin"</string> 
    <key>album</key> 
    <string>"Zombi"</string> 
</dict> 
<dict> 
    <key>title</key> 
    <string>"Ritual"</string> 
    <key>artist</key> 
    <string>"Ashes Divide"</string> 
    <key>album</key> 
    <string>"Keep Telling Myself It's Alright"</string> 
</dict> 
</plist> 

Quelqu'un a des idées sur la façon d'obtenir ce travail?

Répondre

1

Si vous voulez que la sélection ne soit pas seulement basée sur le nom, mais aussi sur Artist, Album ... il suffit d'ajouter des filtres comme dans l'exemple ci-dessous.

De même, vous n'avez pas besoin de vérifier si iTunes est ouvert ou non. Lorsque le script sera exécuté, si iTunes n'est pas lancé, le script le lancera directement. Donc, sauf si vous ne voulez vraiment pas qu'il ouvre automatiquement iTunes, ne faites rien.

Habituellement, vous n'avez pas besoin de faire référence à une liste de lecture spécifique "Bibliothèque". Ceci est la valeur par défault.

set myPlaylist to "Test" 
set {theTitle, theAlbum, theArtist} to {"Ritual", "Paint The World", "Chick Corea Elektric Band II"} 

tell application "iTunes" 
set myTracks to (tracks whose (name is theTitle) and (album is theAlbum) and (artist is theArtist)) 
duplicate (item 1 of myTracks) to playlist myPlaylist 
end tell 

J'ai fait l'hypothèse qu'il n'y a que 1 piste titre correspondant, l'album et l'artiste (je pris ce premier article et seulement trouvé). Si vous n'êtes pas sûr que cela suffit, vous pouvez ajouter quelque chose d'autre dans le filtre (année, durée, ...). A propos du fichier plist ou texte ou de la liste des enregistrements, gardez à l'esprit que la clé est que vous utilisez la même méthode pour écrire et lire votre fichier. Donc, la bonne question est: comment écrivez-vous ce fichier? (Je suppose que non manuellement!)

Si vous construisez votre fichier à partir d'un autre script, il est beaucoup plus facile d'enregistrer et de lire des enregistrements (un enregistrement = {titre, album, artiste}). Vous n'aurez rien à faire à part lire et écrire dans vos scripts. Le seul point négatif est que vous ne serez pas capable de lire le fichier avec un éditeur de texte ...mais est-ce nécessaire?

Dans l'exemple ci-dessous le script de lecture de fichier txt (comme votre exemple) avec 1 piste par ligne et chacune des valeurs séparées par « »:

set textFile to choose file "Select your text file" 
set myText to (paragraphs of (read textFile)) 
set AppleScript's text item delimiters to {","} 
set myRecords to {} 
repeat with aParagraph in myText 
set MS to aParagraph as string 
if (count of (text items of MS)) is 4 then 
    set the end of myRecords to {text item 1 of MS, text item 2 of MS, text item 3 of MS, text item 4 of MS} 
else 
    -- skipt the record : invalid number of text item ! 
end if 
end repeat 

Le résultat est une liste de myRecords, chaque record est une liste de 4 valeurs {title, artist, trackNo, album}

+0

Merci pour la réponse, mais, si je comprends bien votre réponse, le problème avec cette solution est que je devrais mettre tout le contenu de toutes les pistes dans l'AppleScript, où actuellement toutes les pistes sont dans un fichier texte ou un fichier csv. Cette solution serait bien si c'était seulement quelques pistes comme dans mon exemple, mais j'en ai quelques centaines, d'où ma raison d'essayer de le faire via un script. Quant au fichier plist, je l'ai créé en utilisant un éditeur de texte avec des expressions régulières, donc ce n'était pas si difficile à mettre en place, mais je pouvais aussi le faire avec un script. – KeithJ

+0

Cette solution fonctionnerait très bien s'il existait un moyen de capturer les valeurs de "theTitle", "theAlbum" et "theArtist" à partir du texte source ou du fichier csv, ce qui ramène à mon problème d'origine. – KeithJ

+0

Je viens d'ajouter l'échantillon lu du fichier texte dans ma première réponse. – pbell

0

J'ai fini par trouver moi-même la solution en utilisant un tableau unidimensionnel (liste) avec l'aide de this post. Voici le résultat final:

set srcFile to "/Users/kjesso/Documents/=Scripting=/AppleScript/ipod_mp3s_sample.csv" 
set allRecords to paragraphs of (read srcFile as «class utf8») 
set myPlaylist to "Test" 

tell application "iTunes" 
    repeat with aRecord in allRecords 
     set AppleScript's text item delimiters to "," 
     set arrayVar to text items of aRecord 
     set results to (every file track of playlist "Library" whose name is (item 1 of arrayVar) and artist is (item 2 of arrayVar) and track number is (item 3 of arrayVar) and album is (item 4 of arrayVar)) 
     repeat with aTrack in results 
      duplicate aTrack to playlist myPlaylist 
     end repeat 
    end repeat 
end tell 

et voici le fichier source contenu « ipod_mp3s_sample.csv »:

Ritual,Ashes Divide,8,Keep Telling Myself It's Alright 
Ritual,Chick Corea Elektric Band II,9,Paint The World 
Risk,Deftones,9,Diamond Eyes 
Risveglio,Goblin,10,Zombi