LINUX.ORG.RU

mpv, awesome, lua - возможно ли красиво связать?

 , ,


1

3

Здравствуйте.

Долго и счастливо езжу на awesome WM, и абсолютно всем доволен. Недавно раздухарился, и прикрутил себе на панельку виджет, выводящий заголовок того, что сейчас играет mpv - вон он внизу в серединке. Делаю это строчкой mpv --script=radio.lua, где radio.lua представляет собой

mp.observe_property("metadata", nil, function()
	os.execute("awinfo.sh") 
end)

В rc.lua у меня прописан textline = wibox.widget.textbox()). В awinfo.sh я формирую вывод желаемой строчки

echo "textline.markup = '""$(моя_командная_строка,_формирующая_текст_на_панельке)""'" | awesome-client

То есть mpv-событие отслеживается в lua, передаётся в bash, в баше генерится строчка, которая через awesome-client-костыль передаётся обратно в lua, которое генерит непосредственно awesome-реакцию.

Вопрос знатокам: А можно как-нибудь из этой цепочки исключить bash-стадию? Передать информацию из одного lua в другой напрямую, то есть подружить awesomовый rc.lua и вышеприведённый radio.lua, чтоб я мог прямо в нём исполнить textline.markup = "то, что мне надо"? Require нужное, или include правильное вписать в правильные места, или ещё что...

Спасибо за внимание.

★★★★★

Последнее исправление: piyavking (всего исправлений: 8)

угораю ща по sqlite

в FAR(от Рошаля) что lua что sqlite нашло место

в унихе же есть отдельная сущность pipe которая может существовать независимо от читателей писателей - следовательно

пусть у тя читатель пишет писатель читает пайп пайпит - тады баша как этапа вроде не будет

тока потребуется третий пастух который будет за этими двумя умниками присматривать что бы телега ехала

зы - а не настоящий сварщик - даже маску на стройке не смог найти

qulinxao3 ★☆
()
Ответ на: комментарий от qulinxao3

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

piyavking ★★★★★
() автор топика

Если что - у mpv есть возможность прикрутить mpris через плагин. Немножко не то, что ты просил, но баш-портянка точно пропадает.

Bfgeshka ★★★★★
()

Учтите, что эти Lua (в mpv и в awesome) живут в разных процессах, так что какой-то механизм межпроцессного взаимодействия им всё равно нужен. Без bash можно попытаться обойтись, а вот без awesome-client - очень сложно. Поскольку последний работает через DBus, можете попробовать импортировать модуль для работы с DBus прямо в mpv…

anonymous
()

я для такого именной fifo использую или сокет, дурные dbus используют.

s-warus ★★★★★
()

Я не уверен, но может как-то так

mp.observe_property("metadata", nil, function()
   local name = mp.get_property('media-title')
   local pipe = io.popen("awesome-client","w")   
   pipe:write(("textline.markup = %q"):format(name))
   pipe:close();
end)

Шелл тут тоже есть, но так получше. А если совсем без, тут сказали про mkfifo, ну или просто файл в /tmp. Но в случае последних, надо узнавать не появились ли новые данные, а значит должен висеть цикл или что-то по таймеру и опрашивать канал или файл.

Можно через utils.subprocess

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 4)
Ответ на: комментарий от anonymous

без awesome-client - очень сложно

Тогда стоп-машина, да останется костыль. Он и так отрабатывает мгновенно.

piyavking ★★★★★
() автор топика
Ответ на: комментарий от yars068

Там выше говорят, что там процессы разные, и всё равно надо их долго и трудно дружить. Так что тупая и циничная башовая рельса по зрелом размышлении и по итогам дискусии предварительно признаётся среди меня приемлемым вариантом)

piyavking ★★★★★
() автор топика

Как будто готовое решение должно быть давно?
Почти все плееры умеют подключаться к dbus и отдавать данные/управляться удаленно.

vazgen05 ★★★
()

Удивительный набор костылей. Плеер дергает скрипт на lua, скрипт на lua дергает shell скрипт, shell скрипт вызывает клиент, который через dbus отправлят данные самому ВМ. Зачем это всё? Почему из lua не дернуть dbus-ом сам ВМ?

cobold ★★★★★
()
Ответ на: комментарий от cobold

Это кажется самым чистым. Эх, опять новые знания усвоять. То есть мне в radio.lua d-bus сокет формировать, а в rc.lua его ловить. Awesome-client ИМХО ровно этим и занимается...

piyavking ★★★★★
() автор топика

А правда, почему не использовать обычный сокет?

Создаешь /tmp/my-awesome-program.sock и через него общаешься. Все одно проще, чем через dbus общение организовывать.

bbc69
()

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

Я тут недавно сам разбирался с этим, писал себе дибасный виджет, поэтому, пока знания ещё свежи набросал тут пруф оф концепт. Но, как и сказали, тебе потребуется mpris-плагин для mpv (хотя, он вроде из коробки есть и включен). Либо поставить playerctld. Я в примере подключился к playerctld как раз, но у них всех должен быть один и тот же интерфейс org.mpris.MediaPlayer2.Player, так что всё справедливо и для других плееров.


local lgi = require("lgi")
local Gio = lgi.Gio
local GLib = lgi.GLib
local DBusProxy = Gio.DBusProxy
local VariantType = GLib.VariantType
local Variant = GLib.Variant

local main_loop = GLib.MainLoop()
local bus_system = Gio.bus_get_sync(Gio.BusType.SYSTEM)
local bus_session = Gio.bus_get_sync(Gio.BusType.SESSION)

local notification_proxy = DBusProxy.new_sync(
    bus_session,
    Gio.DBusProxyFlags.NONE,
    nil,
    "org.freedesktop.Notifications",
    "/org/freedesktop/Notifications",
    "org.freedesktop.Notifications"
)

local function send_msg(title, msg)
    local arguments = Variant(
        "(susssasa{sv}i)",
        {"Test App",
         1234,
         "gtk-dialog-info",
         title,
         msg,
         {},
         {},
         10000}
    )
    notification_proxy:call(
        "org.freedesktop.Notifications.Notify",
        arguments,
        Gio.DBusCallFlags.NONE,
        -1,
        nil,
        nil,
        nil
    )
end


local title_monitor_proxy = DBusProxy.new_sync(
    bus_session,
    Gio.DBusProxyFlags.NONE,
    nil,
    "org.mpris.MediaPlayer2.playerctld",
    "/org/mpris/MediaPlayer2",
    "org.freedesktop.DBus.Properties"
)

-- Вот тут мы обработчик подключаем
title_monitor_proxy.on_g_signal = function(_, sender, signal, params)
    if signal ~= "PropertiesChanged" then
        return
    end

    if params.value[1] ~= "org.mpris.MediaPlayer2.Player" then
        return
    end

    local metadata = params.value[2].Metadata
    if metadata == nil then
        return
    end

    send_msg(
        "Now Play",
        tostring(metadata["xesam:title"])
    )
end


main_loop:run()

lgi есть у awesome из коробки. На main_loop не обращай внимание, это для того, чтобы скрипт работал отдельно от. Если я правильно понял, у осома внутри всё на GLib-овском цикле сделано (lgi это как раз биндинги к GLib и другим вещам около него), так что можно отдельного лупа не городить в своем коде.

Ну и это если на «чистом» lgi всё делать. Так то есть обёртка над ним, которая всё попроще делает: ТЫЦ (github.com). И у этого же чела в других репах есть примеры виджетов, которые с dbus работают через его либу.

gejzenbug
()
Ответ на: комментарий от gejzenbug

Я кофе, конечно, поставлю, но ты переоцениваешь мою мощь. Обойдусь тем что есть, но за ликбез спасибо!

piyavking ★★★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария