Скрипты на коленке — приручаем klipper Часть 2

в 13:43, , рубрики: bash, kde, linux, метки: , ,

Klipper
В предыдущей статье мы обсуждали klipper — замечательную программу для управления буфером обмена в KDE. Мы узнали как расширить её функциональность с помощью скриптов и показали пару простых примеров, которые могут облегчить жизнь пользователям.

Сегодня мы продолжим писать скрипты и сделаем klipper ещё удобнее.

Набор полезных скриптов для klipper

Добавляем ppa репозиторий

Пользователям основанных на Debian дистрибутивов время от времени приходится добавлять ppa репозитории, например, чтобы обновить версию вашего любимого TeX-редактора kile, в которой исправили несколько неприятных ошибок.

Конечно, времена, когда нужно было редактировать /etc/apt/sources.list вручную, а затем обращаться к серверу ключей, чтоб подписать репозиторий, давно прошли, и теперь всё это можно сделать одной командой

sudo apt-add-repository ppa:kile/stable

но нет придела человеческой лени! Ведь после добавления репозитория нужно ещё обновить списки пакетов и аж после этого обновить kile. При этом ещё и терминал открывать придётся, а это, как у китайцев — путь длиною в тысячу ли, движение пальца до клавиши F12!

Ну уж нет, на такие подвиги я точно не способен. К тому же, раз нам всё равно придётся копировать адрес репозитория в буфер обмена, то пусть он сам с ним и справляется. Думаю это справедливо.

Добавим новое действие в klipper и назовём его «Manage apt reository». Потребуем, чтоб это действие выполнялось автоматически если содержимое буфера соответствует регулярному выражению

ppa:[A-Za-z0-9_-]*/[A-Za-z0-9_-]*

то есть содержит в себе имя репозитория.

Далее добавим команду вывод которой будем игнорировать. Дадим ей название «Add apt repository and update your system»

kdesudo --comment "Do you want to add repository?
$(echo -n %s | grep -o "ppa:[A-Za-z0-9_-]*/[A-Za-z0-9_-]*")" -c "apt-add-repository -y "$(echo -n %s | grep -o "ppa:[A-Za-z0-9_-]*/[A-Za-z0-9_-]*")"; apt-get update; muon-updater"

Мы используем kdesudo для графического запроса пароля на выполнение набора команд с правами суперпользователя. Параметр -c принимает список команд разделённых ; или &&. Мы добавляем репозиторий с помощью apt-add-repository, обновляем систему и вызываем muon-updater для подтверждения обновления пакетов (в своей системе вы возможно захотите использовать kpackagekit или даже обновляться без подтверждения apt-get upgrade -y).

Теперь достаточно просто выделить текст содержащий имя репозитория, чтоб увидеть выпадающее меню
Скрипты на коленке — приручаем klipper Часть 2

ввести пароль
Скрипты на коленке — приручаем klipper Часть 2

и подтвердить обновление пакетов
Скрипты на коленке — приручаем klipper Часть 2

Удалить репозиторий можно аналогично, воспользовавшись командой ppa-purge

«Сейчас играет» — делимся ссылкой на музыку, которую мы слушаем

Плагинами которые добавляют в статус IM название песни которую вы слушаете сейчас уже никого не удивишь, но мы пойдём чуть дальше, и по нажатию на нужную комбинацию клавиш будем делится ссылкой на страницу youtube с результатами поиска прослушиваемой песни. Действовать будем так:

  • Забираем через dbus с помощью интерфейса mpris метаданные прослушиваемой песни
  • Формируем из них ссылку на страницу youtube
  • Записываем полученную ссылку с помощью dbus в буфер обмена

при этом информируем пользователя о том, что происходит с помощью kdialog.

Для работы с dbus мы используем удобную программу qdbus с интуитивно понятным интерфейсом и удобными подсказками. Общий синтаксис qdbus выглядит следующим образом

qdbus [servicename] [path] [method] [args]

так, например, получение метаданных для проигрываемой в плеере cantata песне

qdbus org.mpris.MediaPlayer2.cantata /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata

а благодаря интерфейсу mpris для любого другого плеера (который этот интерфейс поддерживает) нужно всего лишь заменить cantata на название плеера.

Вставка содержимого в klipper произвотдится так же легко с помощью одной строчки

qdbus org.kde.klipper /klipper org.kde.klipper.klipper.setClipboardContents "New bufer entry"

Теперь осталось повесить выполнение скрипта на какую-нибудь комбинацию клавиш (Alt+Y кажется мне вполне удобной). Для этого зайдём в «Параметры системы-Комбинации клавиш и росчерки-Специальные действия» и добавим глобальную комбинацию клавиш для запуска нашего скрипта
Скрипты на коленке — приручаем klipper Часть 2

Готовый текст скрипта можно найти в конце статьи.

«А что ты там смотришь? И я тоже хочу!» — делимся видео

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

Мы будем использовать netcat-openbsd который установлен по умолчанию во всех дистрибутивах Kubuntu. Важно, что такой способ сработает только в случае если ваш внешний IP совпадает с внутренним или у вас есть возможность пробросить порт, если вы сидите за раутером (мы будем использовать порт 3333, я настроил раутер так, что все запросы на этот порт он перенаправляет на мой ноутбук, на котором я и смотрю футураму).

Я привык к видеоплееру VLC, а потому нужно сначала настроить его для работы через dbus. Для этого я поправил /usr/share/applications/vlc.desktop в котором строчку начинающуюся на Exec модифицировал таким образом

Exec=/usr/bin/vlc --control dbus %U

После этих манипуляций VLC начинает использовать dbus.

Так как я использую скрипт на ноутбуке и по этому внешний IP адрес у меня меняется (хотя почти везде я имею возможность пробросить порт 3333 на свою машину) в переменной HOST я не буду явно указывать внешний IP адрес, а буду определять его автоматически с помощью запроса

HOST=`wget -qO - icanhazip.com`

Общая стратегия скрипта такова

  • Забираем через dbus с помощью интерфейса mpris метаданные в которых содержится имя проигрываемого файла
  • Преобразуем полученное имя из URI формата в текст
  • Открываем netcat на порту 3333 для передачи нашего видео с помощью команды
      nc -l 3333 < /full/name/of/the/video/file.avi
  • Записываем команду для получения файла на принимающей стороне в буфер обмена с помощью dbus

Осталось только повесить выполнение скрипта на какую-нибудь глобальную комбинацию клавиш (я использую Alt+N). Теперь когда вас просят поделится видео достаточно просто нажать выбранную комбинацию клавиш и вставить полученную команду с помощью Ctrl+V в клиент обмена сообщениями. На принимающей стороне нужно будет всего лишь скопировать эту команду и выполнить её в терминале…

«Терминал? Нет, не слышал!» — на принимающей стороне

Но зачем нам открывать терминал, если нужная нам команда неизбежно попадает в буфер обмена? Создадим новое действие в klipper и назовём его NetCat. Потребуем, чтоб действие выполнялось автоматически если содержимое буфера содержит подстроку соответствующую регулярному выражению

nc -q 0 .* > ~/".*"

Затем добавим новую команду, назовём её «Receive a file with netcat». Вывод команды будем игнорировать. Сама команда будет ничем иным как выполнением строки соответствующей регулярному выражению и последующим уведомлением пользователя

eval $(echo %s | grep -o "nc -q 0 .*~/".*""); kdialog --title "NetCat" --passivepopup "File transfer complete:
"$(echo %s | grep -o "~/".*"")"" 2

Мы используем bash функцию eval для выполнения строки с перенаправлением ввода-вывода.

Теперь достаточно просто выделить строку содержащую команду приёма файла и выбрать соответствующий пункт в выпадающем меню
Скрипты на коленке — приручаем klipper Часть 2
принимаемый файл сохранится в домашнюю директорию.

Ну вот на сегодня и всё. В следующий раз мы продолжим развивать тему скриптов в KDE.

Ссылки на скрипты
now_playing.sh
now_watching.sh

Ищите красивые коленки, пишите скрипты и оставайтесь с нами!

Автор: Large

* - обязательные к заполнению поля