LINUX.ORG.RU
решено ФорумTalks

Воспроизведение ссылок через mpv на вашем ПеКа

 , , , , удобное


5

4

Суть, вешаем скрипт на горячую клавишу, например F8,
копируем или просто выделяем ссылку, нажимаем F8 и воспроизводятся видива/фота.
Мне удобно выделить ссылку с любым медиаконтентом, например

  • фильмом
  • ютубом
  • музыкой
  • картинкой
  • порнух… ой!

Нажать горячую клавишу и всё.

Зависимости: apt install mpv lua xclip

#! /bin/env lua
---------------
local function play_mpv()
    local appclip = nil;
    local youtudl = nil;
    local session = os.getenv('XDG_SESSION_TYPE');
    local have_mpv  = os.execute('mpv --version 2>/dev/null');
    local have_xclip = os.execute('xclip -version 2>/dev/null');
    local have_ytdlp  = os.execute('yt-dlp --version 2>/dev/null');
    local have_wlpaste = os.execute('wl-paste --version 2>/dev/null');
    local have_youbedl  = os.execute('youtube_dl --version 2>/dev/null');
    if(not have_mpv) then
      os.execute('notify-send "Для работы требуется mpv плеер"');
      os.exit(1)
    end
    if(not session) then
      os.execute('notify-send "Неизвестный тип сессии, задайте x11 или wayland"');
      os.exit(2);
    end
    if(have_xclip and session == 'x11') then
       appclip = 'xclip -o';
    end
    if(have_wlpaste and session == 'wayland') then
       appclip = 'wlpaste -p';
    end
    if(not appclip) then
       os.execute('notify-send "Нужно установить xclip для X11 или wl-paste для Wayland"');
       os.exit(3);
    end
    if(io.popen(appclip):read('*l'):sub(1,4)~='http') then
       os.execute('notify-send "Это не ссылка для воспроизведения"');
       os.exit(4);
    end
    youtudl = have_youbedl and 'youtube_dl' or nil;
    youtudl = have_ytdlp   and 'yt-dlp'     or youtudl;
    if(youtudl) then
       os.execute('notify-send Воспроизводится "$('..
       youtudl..' --skip-download --get-title  "$('..appclip..')")\n"$('..appclip..')"" &');
    else
       os.execute('notify-send "Неизвестное название"');
    end
    local success, meta , code = os.execute('mpv --keep-open=yes --loop "$('..appclip..')" > /dev/null 2>&1');
    if tonumber(code) ~= 0 or success == nil then
       os.execute('notify-send -u normal Ошибка-mpv:'..meta..':'..code);
       os.exit(5);
    end
end
-- run run run
-- дрынь на-на
play_mpv();

Ну и предупреждение.

- ИСПОЛЬЗОВАТЬ НА СВОЙ СТРАХ И РИСК, Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ
- ВСЁ ПРЕДОСТАВЛЯЕТСЯ КАК ЕСТЬ, ЛЮБЫЕ СОМНЕНИЯ ДОЛЖНЫ ВЕСТИ
- К ОТКАЗУ ОТ ИСПОЛЬЗОВАНИЯ
- ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!!
- В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК
- И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША ВИНА И ВАШИ ПРОБЛЕМЫ

Тест: Выделить ссылку и нажать F8 (иксы автоматически копируют выделенное есчё)

Да, примитив. Но зато очень удобно.
Досвиданья :3

★★★★★

Последнее исправление: LINUX-ORG-RU (всего исправлений: 8)

Ответ на: комментарий от eternal_sorrow

Думал это шуточный коммент:

уже закрыт

Посмотрел как у меня дела обстоят. Оказывается давно уже прописан в конфиге loop-playlist и я просто ставлю на паузу, когда дальнейшее воспроизведение не нужно.

Попробовал на чистом конфиге организовать остановку, после окончания воспроизведения. Есть два варианта:

  • keep-open=always ### остановка по достижении конца видео
  • force-window=immediate и idle=yes ### выход из окна воспроизведения и показ псевдо-гуи окна

p.s. Ссылка на man, кому интересно погрузиться в ‘пучину’ ) этого замечательного плеера.

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

Не нужна мне ссылка, я и сам могу man mpv в консоли написать (так и делаю иногда, правда последнее время редко, потому что всё что нужно уже настроил).

Думал это шуточный коммент:

Частично. В каждой шутке есть доля шутки.

остановку, после окончания воспроизведения

Не нужно.

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

Не =)
У меня не работает, дал разрешение, через контекстное меню выбираю ссылку и жму «play in MPV» и ничего не происходит. Не работает. Другие mpv расширения работают только на конкретном сайте, кнопкой на страничке или в поисковой строке. Либо не работает, либо работает выборочно.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от dataman

Я дословно скопировал цитату с оф. сайта mozilla, все претензии к ним. )

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

ytmpv

Странное расширение, похоже пытается заменить собой ютубный плеер на странице сайта.

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

Можно и так, да, но я хочу чтобы красивенькое было

  • уведомление о воспроизведении с названием и ссылкой
  • сообщения об ошибках в уведомлениях
  • минимальную проверку данных на ссылку и фиксы всяких кавычек.

Да, многословно. Но что поделаешь.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

Это к тому, что в bash строка может быть интерпретирована как часть скрипта.

Нет, не может, если явно этого не написать. Проблема, описанная ТС, возникает и при запуске python3 -c 'print(\'' .. str .. '\')'. То есть с башем, по сути, никак не связана. А заключается она в том, что ТС не умеет нормально экранировать строки для того языка программирования, который он запускает.

По сути, это все равно что встроенный механизм SQL-инъекций, который присутствует by design, неотключаемый и вездесущий.

Нет там никакого встроенного механизма SQL-инъекций. А сдуру можно и сами знаете что сломать.

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

Непонятно, зачем тут Lua, если дёргаются всё равно сторонние утилиты. Да и вообще, mpv же сам дёргает yt-dlp, зачем отдельно скриптом их дёргать? У меня тупо вот это забиндено и всё:

mpv --cache=no "$(wl-paste -p)"

В иксах было, соответственно

mpv --cache=no "$(xclip -o)"

Всё прекрасно играется. Ну можно вывод ошибки через || notify-send ... сделать, если что-то пошло не так…

CrX ★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от CrX

Непонятно, зачем тут Lua, если дёргаются всё равно сторонние утилиты.

Для логики. Так то можно сказать непонятно зачем bash если дёргаются сторонние утилиты, есть же execv, popen, execl сишные =)

Да и вообще, mpv же сам дёргает yt-dlp, зачем отдельно скриптом их дёргать?

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

mpv –cache=no «$(xclip -o)»

Можно и так, можно и эдак, почему у меня так, а не иначе я уже писал. В том и радость что каждый делает так как ему удобнее :3 Если кратко манал я на баше писать даже простые вещи, это интерактивный интерпретатор в первую и основную очередь. И нет никакой разницы в том чтобы вызывать сторонние утилиты башем,луа или даже сишкой, да любым другим языком тоже, на то они и команды чтобы отрабатывать свой вызов, а где он будет вообще фиолетово. Ну за исключеним интерактивных программ. Да.

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

Экранирование от языка не зависит. И у меня всё экранировано. Но как ты сам сказал с дуру можно всё, поэтому вот и потому.

LINUX-ORG-RU ★★★★★
() автор топика

Кстати, а чего в Talks? Это как раз вполне техническая тема. Может куда-нибудь в Multimedia её?

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

Из разряда «Я сделяль». Пришёл, выложил, ушёл. Всё :3
Толксы, самое место для подобного. Что-то чуть более адекватное уже в более профильные разделы, а это… так. Мелочь, но приятная. Да и люди тут вон свои варианты активно дают, оспаривая мой говнокод, это клёва. Толксы рулез.

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

Экранирование от языка не зависит.

Конечно зависит. Для Си и для шелла экранировать нужно по-разному.

И у меня всё экранировано

Ничего у тебя не экранируется. Во-первых, ты не экранируешь знак доллара, backtick, backslash, переводы строки, которые интерпретируются в двойных кавычках. Во-вторых, ты явно не понимаешь, как работают одинарные кавычки в shell.

function change(str)
    str = str:gsub('%"','\\"');
    str = str:gsub("%'","\\'");
    return str;
end

title = '$(touch /tmp/pwned)'
arg = {'arg1', 'arg2'}

title = change(title)
os.execute('notify-send -u normal Воспроизводится "'..title..'\n'..arg[2]..' "');

Этот код исполнит код из title и создаст файл /tmp/pwned.


Не говоря уже о том, что код абсолютно угрёбищен во всех остальных отношениях. Вот ты можешь объяснить, зачем ты используешь ; в Lua? Это даже не JavaScript, где есть automatic semicolon insertion и без них в некоторых случаях может что-то не то выйти. Почему if (something) then (зачем скобки)?

shdown
()
Последнее исправление: shdown (всего исправлений: 2)
Ответ на: комментарий от serg002

Да никто не спорит. Но ты бы добавил и вывод названия с ссылкой с учётом того какой ютубдл стоит. И вывод ошибки. И действительно красивый однострочник испортится =)

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Зачем туда что-то добавлять? Скопипастил ссылку - воспроизвелось

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

Ничего у тебя не экранируется.

Да, надо поправить. Чёт меня переклинило. Спасибо.

Не говоря уже о том, что код абсолютно угрёбищен во всех остальных отношениях.

Меня это не особо волнует.

Вот ты можешь объяснить, зачем ты используешь ; в Lua? (зачем скобки)?

Вопрос вкуса. Это не имеет никакого значения. Почему я не должен использовать точку с запятой? Хоть одна причина? Почему я не должен использовать скобки, хоть одна причина? Нет причин =)

Я не программист же, я домашние скриптики пейшу гыы :3 Так что придётся смирится, понять и простить :D Но ругать если есть за что надо, да, это всегда полезно ^.^ и приятно если в тему, спасибо

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

Исправил маленько, а то меня туть наругали :3

LINUX-ORG-RU ★★★★★
() автор топика

Спасибо, что сделал. Только я не понял зачем это. Я ссылки просто таскаю мышкой на mpv в статусбаре.

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

Нет там никакого встроенного механизма SQL-инъекций. А сдуру можно и сами знаете что сломать.

Как я люблю взаимоисключающие параграфы.

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

Ну смотри, ты написал какую-то ерунду. Ну то есть просто неправду по факту. Выражая при этом фрустрацию касательно использования инструмента, который ты использовать не умеешь.

Мои тезисы:

  • в bash не существует никакого встроенного механизма SQL-инъекций, тем более «неотключаемого и вездесущего»;
  • твои высказывания и фрустрация связаны с тем, что ты не знаешь bash и не желаешь понять принцип его работы (а если не понимаешь основных принципов, а пердолишься вслепую, немудрено наделать ошибок).

Ты хочешь с ними поспорить?

shdown
()
Последнее исправление: shdown (всего исправлений: 1)
Ответ на: комментарий от shdown

Ты настолько тупой, что не понял, что я имел в виду не SQL-инъекции, а возможность порушить bash-код непредусмотренной строкой, которую еще надо обрабатывать Особымы Методами Которые Знают Только Просветленные (точнее, думают что знают). О чем мне с тобой спорить, клоун?

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

Ты настолько тупой, что не понял, что я имел в виду не SQL-инъекции

Под «встроенный механизм SQL-инъекций» ты имел в виду некий механизм инъекции произвольного кода. Но в bash довольно сложно написать код, который будет уязвим к такой инъекции. Так чего именно я, по-твоему, «не понял»?

а возможность порушить bash-код непредусмотренной строкой, которую еще надо обрабатывать Особымы Методами Которые Знают Только Просветленные (точнее, думают что знают).

Покажи мне подобный bash-код.

Какими особыми методами нужно обрабатывать строки?

О чем мне с тобой спорить, клоун?

Вести дискуссию ты действительно не настроен, вместо этого скатываясь на оскорбления. Однако моя цель — убедить не тебя, а остальных.

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

Все же, чтобы дискуссия оставалась дискуссией, а не ‘срачем’, поясню, что изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!!
В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК
И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША ВИНА И ВАШИ ПРОБЛЕМЫ

В lua-скрипте ТС прописано выполнение команд bash, и что там с ними может быть не так, понятно только знающим (лично мне, нет), среди которых и @Xintrea, поддержавший цитату в своем комменте:

Bash - зашибись язык. Передал строку и боишься что внезапно исполнится что-то не то.
Воспроизведение ссылок через mpv на вашем ПеКа (комментарий)

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

изначально речь о цитате ТС:

ТЕКСТ ИЗ БУФЕРА ОБМЕНА ПОПАДАЕТ В ИНТЕРПРЕТАТОР !!!!!!!!! В ОБОЛОЧКУ BASH КАК СТРОКА И ЕСЛИ ТАМ ЧТО НЕ ТАК ИЛИ ЭДАК И ВНЕЗАПНО ИСПОЛНИЛОСЬ ЧТО-ТО НЕ ТО, ТО ЭТО ИСКЛЮЧИТЕЛЬНО ВАША > > ВИНА И ВАШИ ПРОБЛЕМЫ

Да. Тут есть несколько уровней, которые нужно распаковать:

1. ТС использует os.execute и io.popen из Lua, которые запускают /bin/sh -c string.

2. Следует обратить внимание, что используется именно /bin/sh, который может быть симлинком на bash, а может и не быть (у меня Debian и это симлинк на dash).

3. Эти функции не умеют передавать дополнительные аргументы, и это проблема именно стандартной библиотеки языка Lua. Если бы умели, можно было бы писать что-то вроде

os.execute2({'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1', url})
Что запустило бы
{
 '/bin/sh',
 '-c',
 'mpv --keep-open=yes --loop "$0" 2>/dev/null 2>&1',
 url
}

При этом такая функция os.execute2 довольно легко эмулируется с помощью обычной os.execute (https://gist.github.com/shdown/f4d9c832fa9751114cea6354b0a6120f).

3. За отсутствием таких возможностей, нужно экранировать самому. Самый лёгкий и очевидный способ это сделать — заменить все одинарные кавычки на '\'' и обрамить результат в одинарные кавычки:

function shell_escape(x)
    return "'" .. x:gsub("'", "'\\''") .. "'"
end

4. Проблемы с экранированием есть в любом языке, где есть строки (если бы они были только в bash, почему мы говорим про SQL-инъекции?). Если бы нам нужно было распечатать строку с помощью питона, нас ожидала бы точно такая же проблема:

os.execute2({'"$0" "$@"', 'python3', '-c', string.format('print("%s")', my_str)})

Этот код содержит инъекцию, в my_str можно подсунуть нечто, что исполнит произвольный код на питоне.

---

Т.е. претензии Xintrea на самом деле сводятся к тому, что (1) он не понимает каких-то основ, как работает shell и bash; (2) в Lua куцая стандартная библиотека.

shdown
()
Последнее исправление: shdown (всего исправлений: 7)
22 апреля 2024 г.

почему у меня при скачивании с coub с помощью yt-dlp скаченное воспроизводит только первые 10 секунд видео, дальше картинка зависает, а звук продолжается?

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

Я глянул уже, но там речь про фундаментальный подход, а не про скрипты прибытие сбоку =). Если ты про то чтобы это реализовать. Ну, сами горячие клавиши это на плечах DE или готовых утилит, можно взять и настроить.

По поводу всплывающих окошек для перетаскивания, я дабы понять суть просто сделал появление окна при попадании в буфер обмена ссылки, это по началу прикольно, но потом раздражать начинает, но это если в лоб делать, а по другому я и не умею. Но чисто поиграться, играюсь, если будет что прикольное выкладку сделаю :)

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Потому что коубы надо либо конфертировать по особому, либо воспроизводить по особому. Зацикливать видео с независимым воспроизведением музыки.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от krasnh

krasnh, LINUX-ORG-RU, это какой-то странный coub. почему эти ролики зациклены после 10 секунд? помню, несколько лет назад смотрел ролики coub на ютубе, и там не было такого, были полноценные ролики по нескольку минут...

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

почему эти ролики зациклены после 10 секунд

Ну не прям 10 сек, разные есть. Но на этом ресурсе только так, никаких минутных видео там нет.
Возможно на ютубе умельцы сами делали «из г***а и палок». )

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

Это уже полноценный клип будет, не коуб.

Коуб — короткое зацикленное видео. Это может быть смешной момент, кадр из фильма, анимация, цитата, мем или монтаж из разных источников.

upd. Вики говорит, что там именно ограничение в 10 сек. Не знал.

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 2)
Ответ на: комментарий от teod0r

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

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от teod0r

Яркие моменты в видео это часто временная линия минута или около того и всё, смысл коубов как раз эти яркие моменты вычленять.

LINUX-ORG-RU ★★★★★
() автор топика
Ответ на: комментарий от teod0r

В этом зацикливании, собственно, смысл coub. Это его фишка, ради которой он сделан. 10-секундные зацикленные видео, опционально с независимо играющей музыкой.

CrX ★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)