在文本项列表中查找特定文本的Applescript

在文本项列表中查找特定文本的Applescript,applescript,itunes,Applescript,Itunes,我有许多深奥的CD,它们的曲目名称并不总是在CDDB中。所以我正试图写一个Applescript,它将从AllMusic复制一个歌曲标题列表,并将它们作为曲目名称粘贴到iTunes中。从AllMusic复制曲目名称列表时,格式几乎总是: 跟踪# 标题 作曲家 轨道长度 指向Spotify或Amazon的链接 这会重复专辑中包含的任意多首曲目。我编写了以下Applescript,在上述格式不变的情况下工作: set tid to AppleScript's text item delimiters

我有许多深奥的CD,它们的曲目名称并不总是在CDDB中。所以我正试图写一个Applescript,它将从AllMusic复制一个歌曲标题列表,并将它们作为曲目名称粘贴到iTunes中。从AllMusic复制曲目名称列表时,格式几乎总是:

跟踪# 标题 作曲家 轨道长度 指向Spotify或Amazon的链接

这会重复专辑中包含的任意多首曲目。我编写了以下Applescript,在上述格式不变的情况下工作:

set tid to AppleScript's text item delimiters
set txt to the clipboard
set p to count paragraphs of (the clipboard)
set i to 2
tell application "iTunes"
    activate
if selection is not {} then -- there ARE tracks selected...
    set mySelection to selection
    repeat with aTrack in mySelection
        if i is less than p then
            set AppleScript's text item delimiters to ASCII character 13 -- (a carriage return)
            set newTxt to text items of txt -- not text of, text items of
            set AppleScript's text item delimiters to tid -- restore text delimiters
            set name of aTrack to item i of newTxt
            set i to i + 5
        end if
    end repeat
end if
end tell
问题是,有时会有一个或两个以上或较少的类别(例如缺少作曲家)使我的脚本中断。理想情况下,会有一种方法让脚本遍历文本项列表,找到曲目#1,粘贴到下一个文本项,找到曲目2,粘贴到下一个文本项,等等。关于如何实现这一点,有什么想法吗

谢谢你的帮助

以下是根据我的评论修改的代码:

…我尝试在顶部添加“将k设置为1”,将“将I设置为I+5”更改为“将I设置为I+4”,并添加: 如果i等于k,那么 将i设置为i+1 将k设置为k+1 如果结束 在重复循环的末尾。然后脚本将跳转4段。如果计数器“k”与它正在查看的段落不匹配(例如,如果k是“2”,而段落i不是“2”,这一定意味着它是由5个段落组成的一组,因此“i”将前进一个段落。脚本编写不好,但在大多数情况下可能会起作用。问题是,我永远无法得到“如果i等于k”返回为true,即使它是。以下是完整的代码:

set tid to AppleScript's text item delimiters
set txt to the clipboard
set p to count paragraphs of (the clipboard)
set k to 1
set i to 2
tell application "iTunes"
    activate
    if selection is not {} then -- there ARE tracks selected...
     set mySelection to selection
    repeat with aTrack in mySelection
        if i is less than p then
            set AppleScript's text item delimiters to ASCII character 13 -- (a carriage return)
            set newTxt to text items of txt -- not text of, text items of
            set AppleScript's text item delimiters to tid -- restore text delimiters
            set name of aTrack to item i of newTxt
            set i to i + 4
            if i is equal to k then
            set i to i + 1
            set k to k + 1
            end if
        end if
    end repeat
end if
end tell

感谢您对格式的确认。主要问题是它不是一个简单的格式!因此,脚本必须查看下一个选项卡或返回序列以确定是什么

我制作了下面的脚本,它可以满足您的需要。我包括了许多注释,以清楚地说明(我希望!)。第一行解释了脚本必须为composer和link处理的4种可能的文本格式(每个文本格式都是/否)

我已经在同一文本中按顺序测试了4种格式的脚本。您必须添加iTunes例程,该例程可以使用定义的变量:TTrack、TComposer(可以为空)、TArtist、TLength和TLink(可以为空)

我在必须添加iTunes例程的地方插入一条注释

脚本循环,直到剪贴板中的所有txt都已使用

(* format of input text is made of :
track# <tab> title <return> composer <return> artist <return> track_length <tab> link <tab>
 - title, artist and track_length are mandatory
 - composer and link are optional

Therefore, there are 4 possible formats :
track# <tab> title <return> composer <return> artist <return> track_length <tab> link <tab> (= complete)
track# <tab> title <return> artist <return> track_length <tab> link <tab> ( = no composer)
track# <tab> title <return> composer <return> artist <return> track_length <tab> ( = no link)
track# <tab> title <return> artist <return> track_length <tab> ( = no link, no composer)
*)

set Ctab to ASCII character 9
set Creturn to ASCII character 13
set txt to the clipboard
repeat while length of txt > 1
set AppleScript's text item delimiters to Creturn
set Track_Title to text item 1 of txt -- the first item always contains Track# tab Title
set L to (length of Track_Title) + 1 -- L will be the ofset for next track
set T2 to text item 2 of txt -- the second item could be composer or artist
set T3 to text item 3 of txt -- the third item could be artist or (track_length tab link tab track# tab title)
if (offset of Ctab in T3) = 0 then -- the third item is artist
    set TComposer to T2
    set TArtist to T3
    set L to L + (length of TComposer) + 1 + (length of TArtist) + 1
    set NextT to text item 4 of txt -- NextT = (track_length tab link tab track# tab title) or (track_length tab track# tab title)
else -- the third item is (track_length tab link tab track# tab title) or (track_length tab track# tab title)
    set TComposer to ""
    set TArtist to T2
    set L to L + (length of TArtist) + 1
    set NextT to text item 3 of txt
end if
set AppleScript's text item delimiters to Ctab
set TTrack to text item 1 of Track_Title
set TTitle to text item 2 of Track_Title
set TLength to text item 1 of NextT
set L to L + (length of TLength) + 1
if (count of text items of NextT) is 4 then -- format is (track_length tab link tab track# tab title)
    set TLink to text item 2 of NextT
    set L to L + (length of TLink) + 1
else -- format is (track_length tab track# tab title)
    set TLink to ""
end if

-- replace this dialog by your iTunes procedure !!!!!!
display dialog "track=" & TTrack & return & "title=" & TTitle & return & "composer=" & TComposer & return & "Artist=" & TArtist & return & "length=" & TLength & return & "Link=" & TLink & return & "L=" & L

if length of txt > (L + 1) then
    set txt to text (L + 1) thru -1 of txt -- remove all current track from text
else
    set txt to ""
end if
end repeat
(*输入文本的格式包括:
曲目#标题作曲家艺术家曲目#长度链接
-标题、艺术家和曲目长度为必填项
-编写器和链接是可选的
因此,有4种可能的格式:
曲目#标题作曲家艺术家曲目长度链接(=完整)
曲目#标题艺术家曲目长度链接(=无作曲家)
曲目#标题作曲家艺术家曲目长度(=无链接)
曲目#标题艺术家曲目长度(=无链接,无作曲家)
*)
将Ctab设置为ASCII字符9
将Creturn设置为ASCII字符13
将txt设置为剪贴板
当txt的长度>1时重复此操作
将AppleScript的文本项分隔符设置为Creturn
将Track#Title设置为txt的文本项1——第一项始终包含Track#tab Title
将L设置为(曲目标题的长度)+1--L将是下一首曲目的ofset
将T2设置为txt的文本项2——第二项可以是作曲家或艺术家
将T3设置为txt的文本项3——第三项可以是艺术家或(曲目长度选项卡链接选项卡曲目#选项卡标题)
如果(T3中Ctab的偏移量)=0,则——第三项为艺术家
将TComposer设置为T2
将TArtist设置为T3
将L设置为L+(合成物长度)+1+(酒石长度)+1
将NextT设置为txt的文本项4--NextT=(曲目长度选项卡链接选项卡曲目#选项卡标题)或(曲目长度选项卡曲目#选项卡标题)
否则--第三项是(曲目长度选项卡链接选项卡曲目#选项卡标题)或(曲目长度选项卡曲目#选项卡标题)
将TComposer设置为“”
将鞑靼人设置为T2
将L设置为L+(酒石的长度)+1
将NextT设置为txt的文本项3
如果结束
将AppleScript的文本项分隔符设置为Ctab
将TTrack设置为曲目标题的文本项1
将TTitle设置为曲目标题的文本项2
将T长度设置为NextT的文本项1
将L设置为L+(T长度的长度)+1
如果(NextT的文本项计数)为4,则--格式为(曲目长度选项卡链接选项卡曲目#选项卡标题)
将TLink设置为NextT的文本项2
将L设置为L+(TLink的长度)+1
else--格式为(曲目长度选项卡曲目#选项卡标题)
将TLink设置为“”
如果结束
--用iTunes程序替换此对话框!!!!!!
显示对话框“track=“&TTrack&return&”title=“&TTitle&return&”composer=“&TComposer&return&”Artist=“&TArtist&return&”length=“&ttlength&return&”Link=“&TLink&return&”L=“&t
如果txt的长度大于(L+1),则
将txt设置为文本(L+1)到txt的-1——从文本中删除所有当前曲目
其他的
将txt设置为“”
如果结束
结束重复

因此,似乎每个数据值都有一个段落?一个段落是标题,另一个是艺术家,另一个是作曲家,等等。这是否正确?根据您当前的代码很难确定。嗨,Craig。是的,这是正确的。这里的问题是段落列表中可靠的内容的位置,以脚本为基础,因为你不能合理地依赖当前状态下的段落数。在某个地方有空白段落吗?没有,所有段落都在一起,没有间隙。唯一一致的是音轨号后面总是跟有制表符。不确定这是否是某种测试。正如我提到的,每个音轨都是空的st总是由5段组成。如果没有,它几乎总是4段。也就是说,我可以假设99.9%的时间一首曲目会有4段或5段,尽管一张CD可能同时包含两种类型的曲目。如果我能让脚本在这些场景下工作,那就足够了。为此目的(见原始版本后的注释)