Заполнение списка воспроизведения iTunes из файла csv

tardy pigeon спросил: 28 марта 2018 в 04:00 в: applescript

Может ли кто-нибудь предложить способ заполнить мой плейлист песнями из файла CSV / текстового файла, отформатированного так: название песни, исполнителя? Я могу сделать это только для названия, но не могу указать, что у него должен быть определенный художник.

EDIT: Вот пример того, как я получаю их по названиям:

set TheFile to read file "Macintosh HD:Applications:Automator stuff:01b iTunes Scripts:SongList.txt"
tell application "iTunes"
    set thePlaylist to playlist "SongList"
    try
        delete every track of thePlaylist
    end try
    set MySongs to paragraphs of (TheFile) -- read artist names (separated by newlines) from the file
    repeat with AnItem in MySongs -- get all tracks from each artist
        set AnItem to (contents of AnItem)
        if AnItem is not "" then try -- don't bother with empty names
            set MyTracks to (location of file tracks of playlist "Music" whose name is AnItem)
            --can also modify the above from "is" to "contains" or "_begins with_"
            add MyTracks to thePlaylist
        on error errmess -- oopsie (not found, etc)
            log errmess -- just log it
        end try
    end repeat
end tell

2 ответа

tardy pigeon ответил: 03 апреля 2018 в 03:23

ОК, разобрался! Не смог понять, как работать с заголовками с запятыми в них (которых у меня есть несколько), поэтому я использовал вместо них табуляцию. Итак, когда у меня есть файл, разделенный табуляцией, этот код сделал свое дело:

set thisTSVFile to (choose file with prompt "Select the CSV file")
readTabSeparatedValuesFile(thisTSVFile)set theList to readTabSeparatedValuesFile(thisTSVFile)tell application "iTunes"
    set myPlaylist to playlist "Test1"
    set sourcePlaylist to playlist "Music"
end tellrepeat with i from 2 to number of items in readTabSeparatedValuesFile(thisTSVFile)
     --gets first column
    set theName to item 1 of item i of theList
     --gets second
    set theArtist to item 2 of item i of theList
    tell application "iTunes"
        duplicate (some track of sourcePlaylist whose name is theName and artist is theArtist) to myPlaylist
    end tell
    delay 0.1
end repeaton readTabSeparatedValuesFile(thisTSVFile)
    try
        set dataBlob to (every paragraph of (read thisTSVFile))
        set the tableData to {}
        set AppleScript's text item delimiters to tab
        repeat with i from 1 to the count of dataBlob
            set the end of the tableData to (every text item of (item i of dataBlob))
        end repeat
        set AppleScript's text item delimiters to ""
        return tableData
    on error errorMessage number errorNumber
        set AppleScript's text item delimiters to ""
        error errorMessage number errorNumber
    end try
end readTabSeparatedValuesFile
Charlie ответил: 09 апреля 2018 в 05:55

Вы можете использовать ObjectiveC (или, возможно, Swift) с XCode, чтобы выполнить тяжелую работу (синтаксический анализ файлов), а затем нажать "iTunes" оттуда, хотя это, вероятно, будет намного медленнее, чем запуск процесса iTunes через его меню сценариев.

Вот некоторый код ObjectiveC, который получает название текущего трека; вы можете адаптировать метод к более сложному сценарию, такому как заполнение списка воспроизведения.

+(NSString *)getTitle {
    return [self runAppleScriptAndReturnResult:@"Tell application \"iTunes\" \nreturn the name of the current track\nend tell"];
}+(NSString *)runAppleScriptAndReturnResult:(NSString*)script {
    NSAppleScript *appleScript=[[NSAppleScript alloc] initWithSource:[NSString stringWithFormat:@"with timeout of 3 seconds\n%@\nend timeout\n", script]];
    return [[appleScript executeAndReturnError:nil] stringValue];
}
tardy pigeon ответил: 08 апреля 2018 в 06:21
Спасибо, Чарли. Я ничего не знаю об Objective-C, поэтому, вероятно, просто придерживаюсь идеи, основанной на AppleScript.
Charlie ответил: 09 апреля 2018 в 05:55
Я добавил пример кода для тех, кто заинтересован.