【问题标题】:Generate iTunes playlist from text list of filenames从文件名的文本列表生成 iTunes 播放列表
【发布时间】:2018-08-19 22:39:19
【问题描述】:

我有一个文件名的文本列表,所有文件都在一个文件夹中的不同文件夹中,Tardy's Music。

我没有完整的 POSIX 路径,只有文件名(例如“01 Song Title.mp3”)。

有没有一种方法可以创建一个 AppleScript,它可以在 Tardy 的音乐中搜索每个文件名并将其添加到播放列表“Best Of”中?

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

我在文本文件中有标题,但如果有帮助,可以将它们放入 csv 中。

(另外,这些文件都已经在我的 iTunes 资料库中了。)

【问题讨论】:

    标签: applescript itunes


    【解决方案1】:

    您没有提及您正在运行的 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"}
    

    在使用此脚本之前,您需要更改前两个变量SongTitlesFileMusicFolder 的值。输入 完整 路径(即 /Users/%you%/... 而不是 ~/...):

    ① 包含歌曲名称列表的文件。我假设该文件是一个纯文本文档,其中每个文件名占一行。文件名前后的空格应该不会影响结果,但理想的格式应该是这样的:

    01 A Song I Like.mp3
    04 Second Song.m4a
    Song 3.mp3
    I Love This Song.mp3
     
    

    在末尾留一个空行,如此处所示,否则列表中的最后一首歌曲可能会从搜索中被忽略。搜索区分大小写,但在其他方面是准确的,因为需要完整的文件名(包括扩展名)才能进行匹配。

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

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

    ② 包含您的音乐的顶级文件夹,可以在其中找到这些文件(某处),即Tardy's Music 的完整路径

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

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

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

    随后的 repeat 循环获取文件路径列表并将它们从 Posix 路径(即 /Paths/That Look Like/This.mp3)转换为 iTunesalias 类型可以用。

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

    如果文件已经导入到您的库中,它们不会再次导入(谢天谢地),只会添加到播放列表中;如果文件尚未导入您的音乐库,则在松散测试中,该文件将被导入并添加到您的音乐库中,并添加到播放列表中。

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

    【讨论】:

    • 这是一个绝妙的答案——更好的是它解释了我如何在其他脚本中使用这些元素!我有一个问题:有一个文件没有被导入(我在想象,因为它包含需要转义的字符,但我不确定)。你能建议如何避免这种情况吗?它被称为 '19 - Rainbird [2006 mixdown](壮举 Paul & Tom,与also 合写).mp3'
    • 是的,你说的很对:find 使用模式而不是文字字符串进行匹配,因此某些特殊字符会扩展为它们各自的含义。这些字符是[]*?。通过在每个字符前面加上反斜杠 \ ,可以轻松地“转义”它们(视为文字字符)。在您引用的文件名中,这看起来像19 - Rainbird \[20016 mix down\] (feat. ...
    • 我已经更新了答案中的代码块,以在将变量传递给find 之前合并一种字符转义变量的方法。我使用printf 将每个文件名重新格式化为其转义版本。 printf 会转义所有内容,包括空格,但是,它可能比使用 sedtr 来搜索和替换个别出现的特定字符更快。
    • 这对我来说非常有效(顺便说一下,在 iTunes 12.5.3.17 上)。谢谢,中日韩!
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2011-09-25
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多