в Разработки

Данная статья является копией публикации на хабре

Ранее здесь находилось описание возможных ситуаций, когда данное решение могло бы вам понадобиться, но давайте его опустим. Возможность удобного создания удаленных закачек, которые выполняются привычным wget-ом (можно спокойно увидеть их список при помощи ps), с отображением прогресса — идея не новая. И даже есть некоторые решения, но не актуальные, так как более 5 лет никем не поддерживаются.

Для торрентов всё просто и тривиально — ставим Transmission или любой аналогичный клиент с веб-мордой. Но для ссылок на простые файлы/страницы нужно что то своё. Вот короткий список задач, которые меня подтолкнули к написанию оного:

  • Смотрю фильм онлайн при помощи планшета, но появляются дела и надо бы его сохранить, чтоб досмотреть позже;
  • На удаленный сервер надо скачать файл, и приходится запускать терминал каждый раз;
  • Надо бы скачать образ свежего linuxmint, но на домашний NAS, а не ноутбук, работая за которым пришла эта идея;
  • Во время серфинга часто возникает задача сохранить файл и расшарить его.

Если вам стало интересно — добро пожаловать под кат:

Системные требования

Веб-интерфейс построен на Javascript + css3 с клиентской стороны, и php (выбран как наиболее популярный) с серверной. Для полноценной работы потребуется:

  • *nix (по крайней мере писалось именно под эту платформу, для запуска под другой потребуются рабочие порты wgetps и kill);
  • php5.x (скорее всего работать будет и на php4.x, по к моменту публикации это протестировано не было);
  • Браузер с поддержкой Javascript (и очень желательно — с поддержкой css3).

Особенности и настройки серверной части

Как уже было сказано выше — в роли серверной части выступает скрипт, написанный на php. Он выполняет следующие задачи:

  • Получение информации о запущенных задачах;
  • Отмена запущенных задач;
  • Добавление новых задач;
  • Возвращение результатов в JSON формате.

Для своей работы ему требуются ps, wget и kill соответственно. Для получения значения состояния закачки (на сколько процентов завершена) используется следующий алгоритм:

  • Задачи wget запускаются с флагами --background и --progress=bar:force;
  • Вывод лога загрузки производится в файл, установленный в параметре --output-file=FILE;
  • При запросе состояния задач с помощью ps -ax получаем путь к файлу, установленный в --output-file=FILE;
  • Читаем крайнюю строку этого файла, получая регуляркой из него искомое значение.

Путь для временных лог-файлов устанавливается в строке

define("tmp_path", "/tmp");

Путь до директории, в которую будет происходить сохранение всех загружаемых файлов устанавливается в строке

define("download_path", BASEPATH."/downloads");

Доступно удобное указание путей до ps, wget и kill. Для этого достаточно убрать комментарий вначале строки и указать свой путь, например:

define("wget", "/usr/bin/wget");

Возможна установка ограничения на скорость закачки из секции настроек. За это отвечает строка

define("wget_download_limit", "1024");

Если оставить её закомментированной — никакого ограничения не будет.

Для определения в списке задачи запущенной через GUI от любой другой используется определенный флаг, уникальный для GUI. Он установлен в строке:

define("wget_secret_flag", "--max-redirect=4321");

И его менять без необходимости не надо. Кстати, если хотите чтоб другие ваши задачи, запущенные из терминала отображались в веб-интерфейсе — достаточно как раз этот параметр к ним и добавить. Но не забывайте, что есть ещё и некоторые другие параметры, не менее обязательные (в зависимости от настроек).

Постарался написать с максимально экономичным отношением к ресурсам и минимальной зависимостью от системы, но большим опытом в php не обладаю, поэтому — буду признателен рекомендациям по оптимизации.

Скрипт отвечает как на POST, так и GET запросы. Разницы между ними нет. Так же отвечает на параметры, переданные в командной строке. Например: php ./rpc.php get_list или php ./rpc.php add_task http://goo.gl/5Qi0Xs.

Пример POST-запроса и Json ответа:
Request:
192.168.1.2/wget/rpc.php?action=add_task&url=http://mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso
Answer:
{
    status: 1,
    msg: "Task added",
    id: 10910
}

Request:
192.168.1.2/wget/rpc.php?action=get_list
Answer:
{
    status: 1,
    msg: "Active tasks list",
    tasks: [
        {
            url: "mirror.yandex.ru/linuxmint/stable/17/linuxmint-17-cinnamon-dvd-64bit.iso",
            progress: 95,
            id: 10910
        }
    ]
}

Особенности и настройки клиентской части

Не используются «новые html5 теги», но используются свойства css3 для оформления прогресс-бара загрузок и адаптива. Дизайн выполнен в минималистичном стиле. При отсутствии задач в центре страницы располагается поле для добавления адреса закачки, если задачи имеются — это поле смещается вверх страницы, и ниже располагаются задачи.

Все запросы — асинхронные (без перезагрузки страницы). Дизайн страницы — адаптивный:

Screenshot

Изменение состояния отображается также в заголовке вкладки (окна):
image

В нижней части страницы располагается javascript-закладка («Download this»), переместив которую в панель закладок браузера можно одним кликом добавлять новые задачи (при клике будет добавлена активная вкладка; если открыта вкладка с видео-файлом и будет нажата эта «закладка» на панели закладок — будет добавлена задача на скачивание этого видео-файла):
image

Весь javascript код документа расположен в файле core.js. В верхней его части располагаются основные настройки.

Описывать функциональные моменты смысла особого не вижу, но скажу — функции разделены на логические группы, скрипт не минифицирован, комментарии имеют место быть.

При нажатии на F5 происходит принудительное обновление задач, страница перезагружается только по нажатию на кнопку обновления в браузере.

Установка

СкачатьGitHub

  1. Hi, your script is perfect for my usage, but it shows some errors in red boxes. It seems to be an internal error when your script trying to «Get task lists» and «Get history list». Although any files are downloaded internally by wget, there is no control of downloads via the GUI and no files are showed, too. How to fix that ?
    There is no PHP functions disabled, the script can handle exec().

    спасибо.

      • Привет
        Благодарю вас за вашу помощь, я, наконец, выбрал для форматирования ОС поставить Debian (Ubuntu я имел раньше) с чистой установки от lamp (apt-get install apache2 php5 mysql-server libapache2-mod-php5 php5-mysql) , все работает!

        спасибо, это очень хорошая программа !

        Sorry for the little Russian, it’s tranlated with google translate…

        • Oh, sorry, i thought you are russian. If you will have any questions else — ask me here. And thank you for your feedback!

          • I published an article on my website, dealing with your software, to share Wget GUI Light, because this last one is a very good work! There’s also a link to your blog and to Github.

Комментирование наглухо закрыто