Applescript 从文件名文本列表生成iTunes播放列表

Applescript 从文件名文本列表生成iTunes播放列表,applescript,itunes,Applescript,Itunes,我有一个文件名的文本列表,所有文件都在不同的文件夹中,包含在一个文件夹“Tardy’s Music”中 我没有完整的POSIX路径,只有文件名,例如'01 Song Title.mp3' 有没有办法创建一个AppleScript,可以在Tardy的音乐中搜索每个文件名并将其添加到播放列表“最佳”中 我可以从iTunes中看到的歌曲标题生成播放列表,但不能从文件名生成 我有一个文本文件的标题,但可以把他们在csv如果这有帮助 此外,这些文件都已经在我的iTunes库中。您没有提到您正在运行的Mac

我有一个文件名的文本列表,所有文件都在不同的文件夹中,包含在一个文件夹“Tardy’s Music”中

我没有完整的POSIX路径,只有文件名,例如'01 Song Title.mp3'

有没有办法创建一个AppleScript,可以在Tardy的音乐中搜索每个文件名并将其添加到播放列表“最佳”中

我可以从iTunes中看到的歌曲标题生成播放列表,但不能从文件名生成

我有一个文本文件的标题,但可以把他们在csv如果这有帮助


此外,这些文件都已经在我的iTunes库中。

您没有提到您正在运行的MacOS和iTunes的版本,因此我提供下面的脚本作为实现您目标的一个示例,前提是它已经在MacOS 10.13上使用iTunes 12.7进行了松散的测试

松散地说,我的意思是,我已经在理想的条件下运行了几次脚本,其中我提供了一个我知道存在的mp3文件名列表;是独一无二的;并且已经添加到我的主要iTunes库中。也就是说,不存在、不唯一以及尚未添加到iTunes库中的文件不应该构成问题

以下是脚本,然后我将引导您完成它:

    set SongTitlesFile to "/Users/CK/Desktop/songs.txt"
    set MusicFolder to "/Users/CK/Music"

    set my text item delimiters to space


    set command to {¬
        "while read f;", ¬
        "do", ¬
        "find", quoted form of the MusicFolder, ¬
        "-iname \"$(printf '%q' \"$f\")\" -type f;", ¬
        "done", "<", quoted form of the SongTitlesFile}

    do shell script (command as text)

    set SongFiles to the paragraphs of the result
    if SongFiles is {} then return "No matching files found."


    repeat with SongFile in the SongFiles
        set end of SongFiles to POSIX file SongFile as alias
        set SongFiles to the rest of SongFiles
    end repeat


    tell application "iTunes" to ¬
        add the SongFiles to make new playlist ¬
            with properties {name:"Best Of"}
如图所示,在结尾处留下一个空行,否则列表中的最后一首歌曲可能会从搜索中忽略。搜索不区分大小写,但在其他方面是精确的,因为需要完整的文件名,包括要进行匹配的扩展名

这些是我在创建脚本时确定的标准。如果需要,可以使用不同的标准和匹配严格性,但鉴于您在简要说明中的描述,这似乎没有必要

如果您需要文件采用不同的格式,请告诉我,我可以尝试重新编写脚本以适应它

② 包含音乐的顶级文件夹,在其中可以找到这些文件,即Tardy音乐的完整路径

我的脚本使用shell命令find来定位文件。它读取文本文件的每一行并搜索具有该名称的文件,返回其完整路径。它只返回文件,不返回文件夹,并使用不区分大小写的名称匹配

如果存在多个具有相同文件名但位于不同位置的文件,则两首歌曲都将返回并添加到最终列表中

如果未找到匹配项,脚本将终止,并显示一条消息,该消息将显示在脚本编辑器的“结果”窗口中

下面的重复循环获取文件路径列表,并将它们从Posix路径(即类似于/This.mp3的路径)转换为iTunes可以使用的别名类型

最后,脚本指示iTunes创建一个名为Best Of的播放列表,并将歌曲添加到其中

如果文件已经导入到你的库中,谢天谢地,它们不会再次导入,只会添加到播放列表中;如果文件尚未导入到库中,在松散测试中,将导入文件并添加到库中,然后添加到播放列表中


让我知道你的情况。如果您有任何疑问,请留下评论,我会回复您。

这是一个非常好的答案-事实上,它解释了我如何在其他脚本中使用这些元素!我有一个问题:有一个文件没有导入,我在想象,因为它包含需要转义的字符,但我不确定。你能建议如何避免这种情况吗?它被称为“19-Rainbird[2006混搭]壮举”。Paul&Tom,与Allow.mp3合著的“是的,你说得很对:使用模式而不是文字字符串查找匹配项,因此某些特殊字符可以扩展为各自的含义。这些字符是[,],*,和?。通过在每个字符前面加一个反斜杠\,可以很容易地将它们转义为文字字符。在您引用的文件名中,这看起来像19-Rainbird \[20016 mix down\]壮举。。。。我已经在我的答案中更新了代码块,以便在传递变量进行查找之前包含一种字符转义的方法。我使用printf将每个文件名重新格式化为转义版本。printf可以转义所有内容,包括空格,但是,它可能比使用sed或tr来搜索和替换个别出现的特定字符要快。顺便说一句,这对我在iTunes 12.5.3.17上非常有效。谢谢,CJK!
01 A Song I Like.mp3
04 Second Song.m4a
Song 3.mp3
I Love This Song.mp3