Как это работает с QuickTime Player?
Работа с QuickTime Player реализована через AppleScript, аналогично VLC, но есть некоторые особенности:
- Статус воспроизведения: Проверка осуществляется через свойство
playing
первого документа. - Текущий файл: Получается имя документа, который сейчас открыт в плеере.
- Оставшееся время: Вычисляется как разница между общей продолжительностью документа и текущей позицией воспроизведения.
Главное отличие в работе с QuickTime — необходимость проверять наличие открытого документа, поскольку QuickTime может быть запущен без открытых файлов.
#!/bin/bash
# Скрипт для выключения Mac по завершению воспроизведения в VLC или QuickTime Player
# Принцип работы: скрипт периодически проверяет, активно ли воспроизведение в выбранном плеере
# Когда воспроизведение останавливается, компьютер выключается после настраиваемой задержки
# Настраиваемые параметры
SHUTDOWN_DELAY=5 # Задержка выключения в минутах после завершения воспроизведения
CHECK_INTERVAL=5 # Интервал проверки состояния плеера в секундах
PLAYER="" # Будет определено автоматически или выбрано пользователем
# Функция для проверки, запущен ли плеер
is_player_running() {
local player=$1
pgrep -x "$player" >/dev/null
return $?
}
# Функция для определения, какой медиаплеер используется
detect_player() {
if is_player_running "VLC"; then
echo "VLC"
return 0
elif is_player_running "QuickTime Player"; then
echo "QuickTime Player"
return 0
else
return 1
fi
}
# Функция для проверки, воспроизводится ли что-то в VLC
is_vlc_playing() {
local playing=$(osascript -e 'tell application "VLC" to get playing')
if [ "$playing" = "true" ]; then
return 0 # Воспроизведение активно
else
return 1 # Воспроизведение не активно
fi
}
# Функция для получения оставшегося времени фильма в VLC
get_vlc_remaining_time() {
# Получаем оставшееся время в секундах
local remaining=$(osascript -e 'tell application "VLC" to get ((duration - time) as integer)')
echo $remaining
}
# Функция для получения текущего файла в VLC
get_vlc_current_file() {
local current_file=$(osascript -e 'tell application "VLC" to get name of current item')
echo "$current_file"
}
# Функция для проверки, воспроизводится ли что-то в QuickTime
is_quicktime_playing() {
local playing=$(osascript -e '
tell application "QuickTime Player"
if not (exists document 1) then
return "false"
end if
return (playing of document 1)
end tell
')
if [ "$playing" = "true" ]; then
return 0 # Воспроизведение активно
else
return 1 # Воспроизведение не активно
fi
}
# Функция для получения текущего файла в QuickTime
get_quicktime_current_file() {
local current_file=$(osascript -e '
tell application "QuickTime Player"
if not (exists document 1) then
return "Неизвестный файл"
end if
return name of document 1
end tell
')
echo "$current_file"
}
# Функция для получения оставшегося времени в QuickTime (приблизительно)
get_quicktime_remaining_time() {
local duration=$(osascript -e '
tell application "QuickTime Player"
if not (exists document 1) then
return 0
end if
return duration of document 1
end tell
')
local current_time=$(osascript -e '
tell application "QuickTime Player"
if not (exists document 1) then
return 0
end if
return current time of document 1
end tell
')
local remaining=$((duration - current_time))
echo $remaining
}
# Функция для форматирования времени
format_time() {
local seconds=$1
local minutes=$((seconds / 60))
local remaining_seconds=$((seconds % 60))
echo "$minutes минут и $remaining_seconds секунд"
}
# Функция для отображения справки
show_help() {
echo "Использование: $0 [опции]"
echo "Опции:"
echo " -p, --player PLAYER Указать плеер (vlc или quicktime)"
echo " -d, --delay MINUTES Задать задержку выключения в минутах (по умолчанию: 5)"
echo " -h, --help Показать эту справку"
echo ""
echo "Пример: $0 --player vlc --delay 10"
exit 0
}
# Обработка аргументов командной строки
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-p|--player)
case "$2" in
vlc|VLC)
PLAYER="VLC"
;;
quicktime|QuickTime|"QuickTime Player")
PLAYER="QuickTime Player"
;;
*)
echo "Ошибка: неизвестный плеер: $2"
echo "Поддерживаемые плееры: vlc, quicktime"
exit 1
;;
esac
shift 2
;;
-d|--delay)
SHUTDOWN_DELAY="$2"
shift 2
;;
-h|--help)
show_help
;;
*)
echo "Неизвестный параметр: $1"
show_help
;;
esac
done
# Если плеер не указан, пытаемся определить его автоматически
if [ -z "$PLAYER" ]; then
PLAYER=$(detect_player)
if [ $? -ne 0 ]; then
echo "Ошибка: не найден запущенный медиаплеер (VLC или QuickTime Player)."
echo "Запустите медиаплеер и начните воспроизведение, затем выполните скрипт снова."
echo "Или укажите плеер вручную с помощью параметра --player."
exit 1
fi
fi
echo "Выбран плеер: $PLAYER"
# Проверяем, запущен ли выбранный плеер
if ! is_player_running "$PLAYER"; then
echo "$PLAYER не запущен. Запустите $PLAYER и начните воспроизведение, затем выполните скрипт снова."
exit 1
fi
# Проверяем, воспроизводится ли что-то в выбранном плеере
if [ "$PLAYER" = "VLC" ]; then
if ! is_vlc_playing; then
echo "В VLC ничего не воспроизводится. Начните воспроизведение фильма, затем выполните скрипт снова."
exit 1
fi
# Получаем информацию о воспроизведении
current_file=$(get_vlc_current_file)
remaining_seconds=$(get_vlc_remaining_time)
elif [ "$PLAYER" = "QuickTime Player" ]; then
if ! is_quicktime_playing; then
echo "В QuickTime Player ничего не воспроизводится. Начните воспроизведение фильма, затем выполните скрипт снова."
exit 1
fi
# Получаем информацию о воспроизведении
current_file=$(get_quicktime_current_file)
remaining_seconds=$(get_quicktime_remaining_time)
fi
# Выводим информацию
echo "Обнаружен воспроизводимый файл: $current_file"
echo "Оставшееся время: $(format_time $remaining_seconds)"
echo "Компьютер будет выключен после завершения воспроизведения."
echo "После завершения воспроизведения компьютер выключится через $SHUTDOWN_DELAY минут."
echo "Для отмены этого скрипта нажмите Ctrl+C."
# Цикл ожидания завершения воспроизведения
last_update_time=0
while true; do
# Проверяем, запущен ли плеер
if ! is_player_running "$PLAYER"; then
echo "$PLAYER был закрыт. Начинаем процедуру выключения..."
break
fi
# Проверяем состояние воспроизведения в зависимости от плеера
if [ "$PLAYER" = "VLC" ]; then
if ! is_vlc_playing; then
echo "Воспроизведение в VLC завершено. Начинаем процедуру выключения..."
break
fi
# Обновляем информацию каждые CHECK_INTERVAL секунд
current_time=$(date +%s)
if [ $((current_time - last_update_time)) -ge $CHECK_INTERVAL ]; then
remaining_seconds=$(get_vlc_remaining_time)
echo "Оставшееся время: $(format_time $remaining_seconds)"
last_update_time=$current_time
fi
elif [ "$PLAYER" = "QuickTime Player" ]; then
if ! is_quicktime_playing; then
echo "Воспроизведение в QuickTime Player завершено. Начинаем процедуру выключения..."
break
fi
# Обновляем информацию каждые CHECK_INTERVAL секунд
current_time=$(date +%s)
if [ $((current_time - last_update_time)) -ge $CHECK_INTERVAL ]; then
remaining_seconds=$(get_quicktime_remaining_time)
echo "Оставшееся время: $(format_time $remaining_seconds)"
last_update_time=$current_time
fi
fi
# Пауза между проверками для снижения нагрузки
sleep 1
done
# Показываем уведомление о предстоящем выключении
osascript -e "display notification \"Компьютер будет выключен через $SHUTDOWN_DELAY минут\" with title \"Автоматическое выключение\""
# Запускаем таймер выключения
sudo shutdown -h +$SHUTDOWN_DELAY
echo "Компьютер будет выключен через $SHUTDOWN_DELAY минут."
echo "Чтобы отменить выключение, выполните команду: sudo shutdown -c"
Как использовать скрипт
- Базовое использование:
./media_shutdown.sh
Скрипт автоматически определит, какой плеер запущен.
- Указание плеера вручную:
./media_shutdown.sh --player vlc
./media_shutdown.sh --player quicktime
- Изменение задержки выключения:
./media_shutdown.sh --delay 10
Технические особенности
- Низкая нагрузка на систему: Скрипт проверяет состояние воспроизведения каждую секунду, но обновляет информацию о времени только каждые 5 секунд, что снижает нагрузку на систему.
- Универсальные функции: Код организован по принципу модульности — для каждого плеера есть отдельные функции, что упрощает добавление поддержки других плееров в будущем.
- Обработка ошибок: Скрипт корректно обрабатывает ситуации, когда плеер закрывается или фильм останавливается, и в любом случае запускает процедуру выключения.
Добавить комментарий