Mad
Snusmumriken
КТО БЫ МОГ ПОДУМАТЬ )))0
Mad
Что тут у вас в луа вообще происходит?
Snusmumriken
То же самое это что? То что ты скинул или то что я скинул?
Mad
так, спасибо большое, я прям понять не мог как так, теперь буду пытаться понять ПОЧЕМУ это работает
Mad
Snusmumriken
Хорошо.
Работает по очевидным причинам, потому что mpv перезапускает функцию.
Mad
Снова не работает
Snusmumriken
Посмотри когда вызываются события. Добавь print'ов.
Mad
если бы я только знал, как работает интерпретатор луа
Mad
Все что меньше 1 - не работает
Snusmumriken
Интерпретатор луа работает как обычно. Вопрос только как работает mpv.
Snusmumriken
Только сам mpv желательно полностью перезапускать, чтобы чистились потенциальные хвосты.
Mad
Snusmumriken
А что не понятно? Почему mpv запускает функцию? Ну так мы же добавили её в таймер на запуск условно каждую секунду, вот mpv её и перезапускает.
Mad
Погодите-ка
Snusmumriken
Внутри mpv сидит цикл, который такой гоняет то на что ты его запрогал, например ты добавил таймер — он его запомнил и запускает.
Mad
Погодите-ка
я почистил printы, поменял все на табы и опять все сломалось
Snusmumriken
Чекни, поковыряй.
Mad
Теперь выходить можно только через echo quit > ars, через mpv - нельзя.
Snusmumriken
В чём разница?
Mad
Mad
mp.register_event("shutdown", function() timer:kill() end) не помогает, хотя должен
Snusmumriken
А ты добавь туда print, чтобы посмотреть, выполняется он или нет.
С другой стороны, даже если он и не выполняется, mpv должно нормально закрыться, и просто перестать запускать всю фигню, так что даже register_event не должен быть нужен.
Mad
Mad
Может плагин на джаваскрипте написать? Там как раз асинк прямо в языке
Snusmumriken
Лол, нет там асинка в языке.
Snusmumriken
Будет всё буквально то же самое. Буквально ))
Snusmumriken
И влепив while ты добьёшься того же результата.
Mad
Snusmumriken
Карочи, разницы не будет, инфа сотка.
Щяс ещё подумаю.
Snusmumriken
Попробуй подчистить все хвосты разом
function fifo()
print("ars")
fifo_file = io.open("ars", "r")
content = fifo_file:read("*all")
fifo_file:close()
return content
end
timer = mp.add_periodic_timer(1, fifo)
cleanup = function()
timer:kill()
mp.unregister_event(cleanup)
end
mp.register_event("shutdown", cleanup)
Mad
Mad
Snusmumriken
Оки, мб баги mpv )
Snusmumriken
Я таки под вендой, и линуксовые машинки у меня даже без DE, так что проверять вручную сложновато, всё на уровне телепатов в отпуске.
Mad
Snusmumriken
А он что-то говорит на попытки выхода? И сама модель запуска команд работает?
Mad
echo quit > ars вроде как работал потому-что он успевал выйти в тот самый секундный перерыв
Snusmumriken
Так, смотри.
Оно каждую секунду выполняет содержимое файла.
Snusmumriken
Что у тебя там в файле?
Igor
Если я правильно понял, ты хочешь сделать, чтбы выходило из проигрывания как только в ars появляется слово quit. Если так, то вот.
Igor
Только что проверил, работает
Igor
Но если в файле есть что-то ещё, надо будет писать echo quit >> ars
Igor
чтобы он его дополнил
Snusmumriken
Возможно в файле ars бешеное количество команд.
Igor
ну можно ещё while внутри прикрутить
Igor
и желательно очистку файла перед запуском таймера плеера
Snusmumriken
Потому что файл не удаляется при выполнении.
io.open("ars", "w"):close() — это очистка файла. Выполняй каждый раз после чтения.
Mad
Что у тебя там в файле?
файл fifo, вписываю туда значение через echo, какой-то ридер его кушает (да хоть cat), и выполняет это. Так как это fifo - они друг друга ждут, когда заполняешь с помощью echo он ждет пока его скушают, а когда его пытаются съесть - дожидаются как я его заполню echo
Mad
Snusmumriken
Оно никак не может работать, он же делает тоже самое, только единственное проверяет вывод. Сам выход через quit > ars может и работает, только вот через обычный выход mpv оно не может
Кстати, было бы неплохо добавить проверки и выполнение команд по списку, с очисткой файла после выполнения всех команд.
filename = "ars"
function fifo()
print("ars")
local file = io.open(filename, "r")
-- файла может не быть
if not file then return end
file:close()
-- читаем все команды в файле построчно и выполняем по очереди
local somethingExecuted = false
for line in io.lines(filename) do
if line and #line > 0 do
mp.command(line)
somethingExecuted = true
end
end
-- очистка файла, мы выполнили все команды
if somethingExecuted then
io.open(filename, "w"):close()
end
end
timer = mp.add_periodic_timer(1, fifo)
cleanup = function()
timer:kill()
mp.unregister_event(cleanup)
end
mp.register_event("shutdown", cleanup)
Igor
Mad
И правда, сейчас проверю, спасибо
Но мне все-таки кажется, что это только на винде, но проверю
Igor
Ну у меня есть на бубунте ноут, но за ним далеко тянуться, плюс я там mpv вроде не ставил
Igor
Но думаю и там бы работало
Snusmumriken
Пора обновлять софт )
Snusmumriken
Ну и делать по-человечески, с проверками валидности происходящего.
Mad
Snusmumriken
Что ты имеешь ввиду под fifo?
Igor
Так fifo блокирующий, логично
Snusmumriken
Типа, вписываешь в файл сразу кучу команд и хочешь выполнить их все по очереди добавления?
Igor
Igor
создаёт fifo файл
Mad
Что ты имеешь ввиду под fifo?
> файл fifo, вписываю туда значение через echo, какой-то ридер его кушает (да хоть cat), и выполняет это. Так как это fifo - они друг друга ждут, когда заполняешь с помощью echo он ждет пока его скушают, а когда его пытаются съесть - дожидаются как я его заполню echo
Snusmumriken
Igor
ни у Lua, ни у JS нет нужного api внутри mpv для неблокирующего чтения
Snusmumriken
В чём проблема считывать и чистить?
Snusmumriken
Скан файла каждую секунду это незначительно. Хуже если сканировать его 9000000 раз в секунду как это было в начале )