Автоматизация нажатий в i3

Обычно я слушаю музыку на саундклауде. Я часто жму на вкладку Discover и просто слушаю, что саундклауд мне подбирает. Иногда задним числом я замечаю годную песню и хочу поставить лайк. Для этого мне приходится:

  1. Отвлечься от текущего дела.
  2. Переключиться на окно с браузером с саундклаудом. Он обычно в отдельном рабочем столе, и там ничего больше нет.
  3. Нажать на кнопку лайка.
  4. Вернуться обратно.
  5. Продолжить дело.

Это всё кошмарно! Я некоторое время страдал, но сегодня я решил решить эту проблему и ставить лайк просто по нажатию горячей клавиши.

Сначала подумал написать расширение для браузера. Оказывается, в моём любимом qutebrowserе нет их поддержки. Идём дальше.

Подумал написать приложение, используя Soundcloud API. Полистал, что мне предлагают разработчики саундклауда. Всё классно. Но эти жмоты закрыли регистрацию новых приложений из-за «большого количества запросов, мы не справляемся, поймите, пожалуйста». Обидно.

Цивилизованные методы кончились. Переходим к магии линукса.


Решил сделать так: по нажатию горячей клавиши запускается скрипт на баше. В конфиге i3 добавил строчку:

bindsym $mod+m exec ~/bin/soundcloud-like-current-track

Быстрый гуглинг подсказал как автоматизировать движения мыши, этим занимается программа xdotool. Скорее всего, она уже есть на компьютере анонимного читателя.

Надо узнать координаты кнопки лайка. Переходим к окну и наводим мышь. В терминале пишем:

xdotool getmouselocation

Запоминаем координаты, именно туда будет жать скрипт.


Теперь переходим к программе. Сначала надо запомнить, какой рабочий стол используется сейчас и где именно сейчас находится мышь:

active_i3_ws=$(i3-msg -t get_workspaces\
  | jq '.[] | select(.focused==true).name'\
  | cut -d"\"" -f2)

eval $(xdotool getmouselocation --shell)

Программу jq мне пришлось установить отдельно, она есть в репозиториях арча.

Теперь переключаемся на рабочий стол с браузером, двигаем мышь и жмём на кнопку, те два числа — мои координаты:

i3-msg 'workspace 10'
xdotool mousemove 1537 1036 click 1

Теперь возвращаем всё как было:

xdotool mousemove $X $Y
i3-msg "workspace $active_i3_ws"

Программа готова.


Полный текст программы с комментариями. Чтобы установить, надо скопировать текст и вставить в любой текстовый файл и сделать его исполняемым (chmod +x имя_файла).

#!/usr/bin/bash
# Press like button on currently playing Soundcloud track.
# © 2018 Timur Ismagilov

# Save current workspace to return to later.
active_i3_ws=$(i3-msg -t get_workspaces\
  | jq '.[] | select(.focused==true).name'\
  | cut -d"\"" -f2)

# Save current mouse location. This eval construct is needed, but idk why.
eval $(xdotool getmouselocation --shell)

# Press the like button.
i3-msg 'workspace 10'
xdotool mousemove 1537 1036 click 1

# Return back.
xdotool mousemove $X $Y
i3-msg "workspace $active_i3_ws"

По аналогии с этой программой можно написать программы для нажатия на кнопки следующего/предыдущего трека, перемешивания и так далее. Займусь этим как-нибудь.


Теперь мне не нужно отвлекаться, чтобы поставить лайк.

Обновление: в итоге я не пользуюсь этой программой, я вручную перехожу на вкладку саундклауда и ставлю лайк. С i3 я успел перейти на dwm, но теперь это неактуально, ведь у меня сейчас вообще мак ОС.