applescript - как улучшить этот скрипт

Во-первых, это моя первая попытка использовать applescript, так что наберитесь терпения :)

Чего я пытаюсь достичь: я использую Dropbox для хранения изображений в Интернете. Я почти использовал все доступное пространство, но сегодня я понял, что с помощью простой оптимизации без потерь на jpg я могу сэкономить до 35-40% места (я оптимизировал все с помощью приложения). Итак, моя идея здесь такова: поскольку Dropbox на моем Mac работает в фоновом режиме каждый раз, и если я добавлю что-то (или загружу камеру с телефона), изображение в конечном итоге попадет в папку на моем Mac, так что, возможно, я могу отслеживать эту папку, оптимизировать изображение автоматически, и оно загружается снова, потому что, что касается DP, изображение отличается, и я получу автоматически оптимизированные изображения.

Пройденные шаги:

  • Найдите CLI для оптимизации изображений ✔️

  • Создайте сервис на основе папки, который запускается каждый раз, когда в папке что-то меняется ✔️

  • Оптимизируйте изображения ✔️

  • Показать уведомление после завершения ✔️

Скрипт автомата выглядит так (пока прикреплен к тестовой папке):

on run {input, parameters}
    tell application "Terminal"
        activate
        do script with command "imageoptim --directory /Users/Nick/Desktop/untitled"
    end tell
end run

и это на самом деле работает, ну, более или менее.

Я хотел бы улучшить это, поскольку я не на 100% доволен тем, как это работает.

На данный момент, если я добавляю/переименовываю картинку, открывается окно терминала (иногда 2 окна терминала), выполняется команда и все. Он никогда не закрывается, а также уведомление срабатывает, как только открывается окно терминала, а не после завершения оптимизации.

Что бы я хотел улучшить:

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

  • В уведомлении должно отображаться какое-то полезное сообщение, и оно должно открываться только после сжатия (в основном, как обратный вызов из скрипта), но я не знаю, как дождаться обратного вызова.

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

Можете ли вы помочь мне или даже указать мне некоторые полезные ресурсы? Из (даже лучше) что-то подобное уже существует, и я просто пытаюсь изобрести велосипед, пожалуйста, дайте мне знать :)

заранее спасибо

ИЗМЕНИТЬ

Я нашел это: https://www.alfredforum.com/topic/3703-imageoptim-workflow/ и делает почти все, что я хочу. Можно ли перейти от Alfred wordkflow к чистому автоматическому рабочему процессу?


person Nick    schedule 28.06.2017    source источник
comment
Имейте в виду, что оптимизация JPEG практически никогда не бывает без потерь. Кроме того, если вы не хотите, чтобы Терминал отображался, просто используйте do shell script вместо того, чтобы активировать Терминал.   -  person Mark Setchell    schedule 29.06.2017


Ответы (1)


Я сохранил этот скрипт в редакторе сценариев как приложение. Таким образом, как это установлено сейчас, все, что мне нужно сделать, это перетащить файлы изображений на значок приложения, которое запускает сценарий. Вы можете изменить это и использовать сценарий как действие с папкой или как угодно еще.

on open files_list
    (*
scale v : Scale an image
scale specifier : the object for the command
[by factor real] : scale using a scalefactor
[to size integer] : scale using a max width/length
*)
    set max_size to "600" as integer -- use the above commented code to play around with scaling.  My example scaled everything to a width of 600 pixels proportionately
    set output_folder to alias "Macintosh HD:Users:Smokestack:Desktop:untitled folder:" -- create an alias to whatever folder you want
    tell application "System Events" to get the size of output_folder
    set originalSize to the result
    set n2 to "1,000,000" as integer
    set originalSize to originalSize / n2
    repeat with file_ref in files_list
        try
            tell application "Image Events"
                set the_image to open file_ref
                scale the_image to size max_size
                save the_image in file ((output_folder as text) & name of the_image)
                close the_image
            end tell
        on error error_string
            display dialog "Skipping file " & (file_ref as text) & ¬
                " due to error:" & error_string buttons {"OK"} default button 1
        end try
    end repeat
    tell application "System Events" to get the size of output_folder
    set newSize to the result
    set newSize to newSize / n2
    display dialog "The Original Folder Size Is " & originalSize & " Megabytes" & linefeed & "The New Folder Size Is " & newSize & " Megabytes" with title "FOLDER INFORMATION" buttons {"OK"} default button 1 giving up after 10
end open
person wch1zpink    schedule 29.06.2017