mocp + notify2 = оповещение при смене трека

Разработка приложений на python. Советы, примеры и обсуждение найденных ошибок
Ответить
Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

mocp + notify2 = оповещение при смене трека

Сообщение ZEN » 23 апр 2016, 01:38

Когда-то я уже делал скрипт на bash -е выводящий popup через notify-send с названием текущего трека. Пришло время переписать это дело на python исправив главный фатальный недостаток. А именно, версия на bash -e при быстрой смене трека создавала новые popup спустя 3 секунды. Пауза была сделана по очень простой причине - возможности обновлять существующий popup с помощью notify-send нельзя, поэтому приходилось делать паузу что бы popup -ы не плодились. Следующая версия на python позволяет обновлять уже существующий popup без лишней траты времени. Выглядит это так:

Изображение
Приступим к настройке скрипта.
Сначала нужно установить необходимые зависимости:

Код: Выделить всё

sudo apt-get install python3-notify2
Далее сохранить следующий код в файл ~/.moc/notifier.py и сделать его исполняемым (chmod +x ~/.moc/notifier.py)

Код: Выделить всё

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import sys
import html
import pickle
import notify2
import argparse

notify2.init("mocp-notify")


def show_message(subj, body, icon='audio-speakers', timeout=3000,
                 dump_id_file='/tmp/pymocp.id'):
    wn = None
    try:
        wn = pickle.load(open(dump_id_file, "rb"))
    except:
        wn = notify2.Notification('')

    wn.set_timeout(timeout)
    wn.update(subj, body, icon)
    wn.show()
    pickle.dump(wn, open(dump_id_file, "wb"))


if __name__ == '__main__':
    def parse_args():
        def escape_str(s):
            return html.escape(s)
        parser = argparse.ArgumentParser()
        parser.add_argument('-a', '--artist', type=escape_str)
        parser.add_argument('-s', '--song', type=escape_str)
        parser.add_argument('-r', '--album', type=escape_str)
        parser.add_argument('-f', '--file', type=escape_str, required=True)
        parser.add_argument('-i', '--icon', type=escape_str, default='audio-x-generic')
        parser.add_argument('-t', '--timeout', type=int, default=5000)
        return parser, parser.parse_args()

    parser, args = parse_args()

    title = "Сейчас играет:"
    wn_obj = os.path.abspath(os.path.join(__file__, os.pardir, 'notify.id'))

    if not (args.artist and args.song):
        filename = os.path.splitext(args.file)[0]
        filename = os.path.basename(filename)
        show_message(title, filename, args.icon, args.timeout, wn_obj)
    else:
        album = ''
        if args.album:
            album = '(%s)' % args.album
        song = "<b>Артист:</b> <i>%s</i>\n<b>Трек:</b> <i>%s</i> %s" % (
            args.artist, args.song, album)
        show_message(title, song, args.icon, args.timeout, wn_obj)
    sys.exit(0)
 
Рекомендую так же перед дальнейшими действиями проверить работоспособность скрипта путем запуска его из термина следующим образом:

Код: Выделить всё

~/.moc/notifier.py -f test
Если ошибок нет, то переходим к настройке mocp. Открываем файл настроек ~/.moc/config и ищем строчку с текстом OnSongChange

Код: Выделить всё

# OnSongChange = "/home/jack/.moc/myscript %a %r"
и заменяем её на свою:

Код: Выделить всё

OnSongChange = "/home/zen/.moc/notifier.py -a %a -s %t -r %r -f %f"
только не забываем поправить путь к скрипту на свой :).

На этом всё. Если mocp был запущен - перезапускаем его и наслаждаемся результатом.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: mocp + notify2 = оповещение при смене трека

Сообщение ZEN » 22 сен 2016, 00:17

Обновил скрипт. Была найдена проблема с "пустыми" popup -ами в случае присутствия знака '&' в имени трека.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Аватара пользователя
ZEN
Администратор
Сообщения: 1350
Зарегистрирован: 27 сен 2012, 18:23
Темы: 206
Откуда: Украина, Одесса
Статус: Не в сети

Re: mocp + notify2 = оповещение при смене трека

Сообщение ZEN » 23 сен 2016, 12:15

Залил скрипт на GitHub.
бог создал труд и обезьяну
чтоб получился человек
а вот пингвина он не трогал
тот сразу вышел хорошо

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей