Applescript: передача метаданных дорожки из текстового файла в приложение потоковой передачи

Я практически ничего не знаю об AppleScript и могу помочь.

Во время работы моя система воспроизведения вещания (MegaSeg) записывает сведения о воспроизводимой в данный момент дорожке в текстовый файл с именем «NowPlaying», который содержит только следующее содержимое, каждое в отдельной строке и без квадратных скобок:

Title: [title]
Artist: [artist]
Album: [album]
Time: [time in some format or other]

Я хочу передать это своему стримеру LadioCast, к которому можно обратиться через AppleScript, чтобы он отправлял информацию о том, что воспроизводится, на сервер потоковой передачи. MegaSeg не поддерживает вызовы Applescript, такие как «сообщить приложению «MegaSeg»… установить trackName на имя текущей дорожки», поэтому я не могу сделать это таким образом. Я понятия не имею, как это сделать.

Если представить, что я смог получить эту информацию, то вот что я сделал бы с ней:

set lastName to ""
set lastArtist to ""
set lastAlbum to ""
repeat

    ** insert missing file reading section here
    ** in the following, "title", "artist" and "album" are from the text file **
    set trackName to title
    set trackArtist to artist
    set trackAlbum to album
    ** end of missing section

    if trackName is not lastName and trackArtist is not lastArtist and trackAlbum is not lastAlbum then
        set lastName to trackName
        set lastArtist to trackArtist
        set lastAlbum to trackAlbum
        tell application "LadioCast"
            set metadata song to trackName & " – " & trackArtist & " – " & trackAlbum
        end tell
    end if
    delay 15
end repeat

Заранее спасибо. -- Ричард Э.

===

Я пробовал предложения от @DigiMonk, и они были очень полезными, но не все из них работали. Во-первых, файл находится в определенном месте, а не на рабочем столе; во-вторых, я вообще не мог заставить работать 'trim_line' - я получил "скрипт не понимает сообщение trim_line". Однако текст в файле кажется уже обрезанным.

Сценарий ниже почти работает; при запуске из редактора Applescript он, кажется, получает название, исполнителя и альбом в переменные. Однако, когда я пытаюсь запустить его из LadioCast, я получаю ошибку EOF -39. Что еще более важно, как только я запускаю это, MegaSeg навсегда перестает обновлять файл. Предположительно, я блокирую файл для чтения из него и останавливаю запись в него MegaSeg. Как этого избежать?

set lastName to ""
set lastArtist to ""
set lastAlbum to ""
set lastTime to ""
set trackName to ""
set trackArtist to ""
set trackAlbum to ""
set sourcePath to ""

repeat

    set sourcePath to open for access file "Library:MegaSeg User Data:Logs:Logs for MegaSeg System (4):NowPlaying"
    set thisText to read sourcePath as text
    close access file "Library:MegaSeg User Data:Logs:Logs for MegaSeg System (4):NowPlaying"

    set the paragraphList to every paragraph of thisText

    repeat with i from 1 to number of items in paragraphList
        set thisItem to item i of paragraphList

        if thisItem starts with "Title:" then

            set x to the offset of "Title:" in thisItem
            set trackName to (text (x + 6) thru -1 of thisItem)

        else if thisItem starts with "Artist:" then
            set x to the offset of "Artist:" in thisItem
            set trackArtist to (text (x + 7) thru -1 of thisItem)

        else if thisItem starts with "Album:" then
            set x to the offset of "Album:" in thisItem
            set trackAlbum to (text (x + 6) thru -1 of thisItem)

        end if

    end repeat

    if trackName is not lastName and trackArtist is not lastArtist and trackAlbum is not lastAlbum then
        set lastName to trackName
        set lastArtist to trackArtist
        set lastAlbum to trackAlbum
        tell application "LadioCast"
            set metadata song to trackName & " – " & trackArtist & " – " & trackAlbum
        end tell
    end if
    delay 15

end repeat

person user2967064    schedule 08.11.2013    source источник
comment
Итак, ваш вопрос: у вас есть этот существующий текстовый файл, и вы хотите выжать заголовок/исполнитель/альбом/время. Это проблема, которую вы просите о помощи. Я прав?   -  person    schedule 08.11.2013
comment
@DigiMonk, да, система воспроизведения постоянно обновляет файл NowPlaying с указанием воспроизводимого в данный момент названия, исполнителя и альбома (это также включает время, которое мне не нужно). Каждый находится на отдельной строке и не ограничен ничем, кроме метки (например, Title:) в начале и ‹CR› в конце. Я хочу получить Title, Artist и Album в переменные Applescript trackName, trackArtist и trackAlbum и отправить их в потоковое приложение, используя форму tell application "LadioCast" set metadata song to trackName & " – " & trackArtist & " – " & trackAlbum end tell   -  person user2967064    schedule 13.11.2013
comment
@DigiMonk ... Я добавил частичное решение в конец моего исходного вопроса - я не вижу другого способа сделать это! Ваши предложения предоставили очень полезные указатели, но я еще не совсем там. Любые идеи? Заранее спасибо за помощь.   -  person user2967064    schedule 16.11.2013
comment
Кстати: в настройках редактора AppleScript можно включить Script-Assistant (выполняет завершение кода с помощью клавиши Escape). И: CTRL-щелчок по сценарию показывает меню с фрагментами кода. Это часто бывает полезно.   -  person    schedule 16.11.2013
comment
Я бы реализовал чтение файлов, как показано в подпрограмме. Есть причина, по которой он находится в блоке try: чтобы он мог ловить ошибки и, если они есть, закрывать файл! Это очень срочно.   -  person    schedule 16.11.2013
comment
Это сложно. Это приложение владеет файлом и записывает в него данные, а скрипт читает из него каждые 15 секунд.   -  person    schedule 16.11.2013
comment
Что вы имеете в виду под ...запуском из LadioCast. Из меню System-Script-Menu?   -  person    schedule 16.11.2013
comment
@DigiMonk: Спасибо за полезные комментарии. а) Исходно используемый путь к рабочему столу, но файл находится в определенном месте, для которого этот путь не работает. б) Тот факт, что после того, как скрипт просмотрел файл, он больше не обновляется, очевидно, терминальный! Данные также записываются в HTML-файл в том же каталоге — будет ли это лучше? c) LadioCast имеет панель событий в конфигурации стримера. В нем есть поле под названием «Обработчик событий Applescript» (с кнопкой «Выбрать сценарий...»: я выбираю там сценарий); и поля для имен обработчиков событий: Подключено, Отключено и Отключено с ошибкой.?? Попробую другие точки.   -  person user2967064    schedule 18.11.2013
comment
@DigiMonk Кроме того, вообще не мог заставить работать trim_line ... всегда жаловался, что скрипт не понимает сообщение trim_line. Извините, я пропустил раздел readFile вашего ответа, слишком занят, пытаясь заставить его найти файл в его местоположении :( Попробую еще раз, используя эти идеи. Обратите также внимание на два набора переменных - предыдущий и текущий - это проверить, отслеживается ли изменилось: если это не так, мы не хотим повторно отправлять на сервер (серверы ненавидят слишком много обновлений, должно быть по одному на трек).   -  person user2967064    schedule 18.11.2013


Ответы (1)


Может быть, это поможет: (подайте sourcePath путь к вашему файлу NowPlaying.txt)

set sourcePath to (path to desktop) & "NowPlaying.txt" as text

set thisText to my readFile(sourcePath)

set the paragraphList to every paragraph of thisText

set lastName to ""
set lastArtist to ""
set lastAlbum to ""
set lastTime to ""

repeat with i from 1 to number of items in paragraphList
    set thisItem to item i of paragraphList
    --log thisItem

    if thisItem starts with "Title:" then

        set x to the offset of "Title:" in thisItem
        set y to (text (x + 6) thru -1 of thisItem)
        set lastName to my trim_line(y, " ", 2)

    else if thisItem starts with "Artist:" then
        set x to the offset of "Artist:" in thisItem
        set y to (text (x + 7) thru -1 of thisItem)
        set lastArtist to my trim_line(y, " ", 2)

    else if thisItem starts with "Album:" then
        set x to the offset of "Album:" in thisItem
        set y to (text (x + 6) thru -1 of thisItem)
        set lastAlbum to my trim_line(y, " ", 2)

    else if thisItem starts with "Time:" then
        set x to the offset of "Time:" in thisItem
        set y to (text (x + 5) thru -1 of thisItem)
        set lastTime to my trim_line(y, " ", 2)

    end if


end repeat

log "lastName = '" & lastName & "'"
log "lastArtist = '" & lastArtist & "'"
log "lastAlbum = '" & lastAlbum & "'"



on readFile(thisFile)
    set thisFile to thisFile as text
    if thisFile is "" then return ""
    try
        set fi to open for access file the thisFile
        set myData to read fi as text
        close access file the thisFile
        return myData
    on error
        try
            close access file the thisFile
            return ""
        end try
    end try
end readFile

on trim_line(this_text, trim_chars, trim_indicator)
    -- 0 = beginning, 1 = end, 2 = both
    set x to the length of the trim_chars
    -- TRIM BEGINNING
    if the trim_indicator is in {0, 2} then
        repeat while this_text begins with the trim_chars
            try
                set this_text to characters (x + 1) thru -1 of this_text as string
            on error
                -- the text contains nothing but the trim characters
                return ""
            end try
        end repeat
    end if
    -- TRIM ENDING
    if the trim_indicator is in {1, 2} then
        repeat while this_text ends with the trim_chars
            try
                set this_text to characters 1 thru -(x + 1) of this_text as string
            on error
                -- the text contains nothing but the trim characters
                return ""
            end try
        end repeat
    end if
    return this_text
end trim_line
person Community    schedule 08.11.2013
comment
Спасибо за это! Я изучаю это, и это похоже на хорошую отправную точку. Я хотел поддерживать два набора переменных. lastName, lastArtist, lastAlbum — это предыдущие значения, а trackName, trackArtist, trackAlbum — текущие значения. Скрипт должен обновлять стример ТОЛЬКО при изменении метаданных в NowPlaying (из-за этого возникают проблемы с обновлением слишком часто). Я не вижу в вашем скрипте, как он пишет на стример. Я собирался использовать приложение tell и песню с метаданными выражения, которая может принимать нужный мне формат. Однако я думаю, что могу добавить это. - person user2967064; 13.11.2013
comment
спасибо, в частности, за информацию о чтении и извлечении определенного текста из файла. Это был главный момент, которого мне не хватало. - person user2967064; 13.11.2013
comment
Мой файл находится в определенном месте, а не на рабочем столе, поэтому мне пришлось это изменить. Кроме того, мне вообще не удалось заставить работать 'trim_line' - к счастью, содержимое, похоже, уже обрезано. Вот что у меня есть до сих пор: - person user2967064; 16.11.2013