Скрипт для выключения Mac по завершению фильма в QuickTime Player и VLC

Как это работает с QuickTime Player?

Работа с QuickTime Player реализована через AppleScript, аналогично VLC, но есть некоторые особенности:

  1. Статус воспроизведения: Проверка осуществляется через свойство playing первого документа.
  2. Текущий файл: Получается имя документа, который сейчас открыт в плеере.
  3. Оставшееся время: Вычисляется как разница между общей продолжительностью документа и текущей позицией воспроизведения.

Главное отличие в работе с 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"

Как использовать скрипт

  1. Базовое использование:
./media_shutdown.sh

Скрипт автоматически определит, какой плеер запущен.

  1. Указание плеера вручную:
./media_shutdown.sh --player vlc
./media_shutdown.sh --player quicktime
  1. Изменение задержки выключения:
./media_shutdown.sh --delay 10

Технические особенности

  1. Низкая нагрузка на систему: Скрипт проверяет состояние воспроизведения каждую секунду, но обновляет информацию о времени только каждые 5 секунд, что снижает нагрузку на систему.
  2. Универсальные функции: Код организован по принципу модульности — для каждого плеера есть отдельные функции, что упрощает добавление поддержки других плееров в будущем.
  3. Обработка ошибок: Скрипт корректно обрабатывает ситуации, когда плеер закрывается или фильм останавливается, и в любом случае запускает процедуру выключения.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *