Comment puis-je réparer mon AppleScript pour supprimer une sélection de titres dans iTunes?
-
12-09-2019 - |
Question
Je l'ai créé le AppleScript suivant pour la suppression de toutes les pistes sélectionnées:
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
tell application "iTunes"
if selection is not {} then
repeat with this_track in selection
try
try
set cla to class of this_track
set floc to (get location of this_track)
delete this_track
on error error_message number error_number
display alert error_message message ("Error number: ") & error_number & "."
end try
if cla is file track then
my delete_the_file(floc)
end if
end try
end repeat
end if
end tell
end if
to delete_the_file(floc)
try
-- tell application "Finder" to delete floc
do shell script "mv " & quoted form of POSIX path of (floc as string) & " " & quoted form of POSIX path of (path to trash as string)
on error
display dialog "Track deleted, but could not be moved to trash" buttons {"Hmm"} default button 1 with icon 1
end try
end delete_the_file
Il fonctionne très bien lorsque je sélectionne un seul élément, mais quand je sélectionne plus d'un je reçois: « ne peut pas obtenir l'emplacement du point 2 de la sélection » (numéro d'erreur -1728). Je crois que c'est parce que par la suppression d'une piste, l'index du script dans la sélection est corrompu.
Je pensais que je vais essayer de faire ma propre liste de pistes à supprimer d'abord:
tell application "iTunes"
if selection is not {} then
set to_delete to {}
repeat with this_track in selection
try
set cla to class of this_track
set floc to (get location of this_track)
if cla is file track then
set pair to {this_track, floc}
set to_delete to to_delete & pair
end if
end try
end repeat
repeat with pair in to_delete
set the_track to item 1 of pair
set floc to item 2 of pair
delete the_track
my delete_the_file(floc)
end repeat
end if
end tell
Mais alors je reçois « Impossible d'obtenir le point 1 de l'article 1 de la sélection d'application « iTunes ». » Je pense que le problème est « this_track » est pas un objet de la piste de classe, mais un élément d'une sélection. Comment puis-je obtenir l'objet de la piste réelle de l'élément de sélection?
Si vous ne voyez pas la solution, je souhaite la bienvenue à des conseils sur la mise au point ou toute autre suggestion.
La solution
Le this_track
variable est une référence à un spécificateur d'objet. Vous devez utiliser la propriété contents
pour obtenir le spécificateur objet ci-joint. La même chose est vraie pour accéder à la pair
variable dans la seconde boucle. Voir la section de référence de classe sur la reference
de classe dans le guide de langue AppleScript .
dans la façon dont la liste to_delete
est en cours de construction. La déclaration set to_delete to to_delete & pair
ne produira pas une liste de paires, mais une liste plate. Voir la section de référence de classe sur la list
de classe dans le guide de langue AppleScript .
Voici une version de votre second script, où ces bugs ont été supprimés:
tell application "iTunes"
if selection is not {} then
set to_delete to {}
repeat with this_track in selection
try
set cla to class of this_track
set floc to (get location of this_track)
if cla is file track then
set pair to {contents of this_track, floc}
copy pair to end of to_delete
end if
end try
end repeat
repeat with pair in to_delete
set the_track to item 1 of contents of pair
set floc to item 2 of contents of pair
delete the_track
my delete_the_file(floc)
end repeat
end if
end tell