LINUX.ORG.RU
ФорумTalks

Качалка COUB для вашего ПеКа

 coub, , , ,


2

1

Драсти опять я к вам со своим lua говнокодом. Товарищ @superuser скоромно сбросил в толксы свою качалку на баше. Не будем скромничать код по ссылке Coub закрывается (комментарий) Более того он ещё патчи исправления скидывает, похвала. Я взял смелость и переписал на lua немножко расширив список возможностей и теперь у нас конкурирующий бизънес! :D Вот вы хихи да хаха, а люди за скачивание даже платят, пруфов не дам :o) Скрипт качалка ниже совместим с версией от @superuser по части хранения coub`ов.

Как пользоваться.

  • В качестве входных параметров может выступать

    • ссылка на coub https://coub.com/view/2ppitj
    • идентификатор на coub 2dnd59
    • название уже скачанного coub Дело_говорит_Симпсоны
    • путь ~/COUB/Дело_говорит_Симпсоны
    • комбинация идентификатора, ссылки, пути и имени
    • 14ns7i,https://coub.com/view/2djrec,Дело_говорит_Симпсоны,2cljbw
    • список файлов должен идти в конце параметров и разделятся запятыми (впритык!)
    • список можно прочитать из файла cat mycoubs.txt | coub - или через ls из каталога
    • в файле разделять можно запятыми или переводом строки
  • Ключ -l задаёт количество повторений inf бесконечность

    • если задана последовательность coub то каждый из них проиграется столько раз сколько
      задано ключом -l если для последовательности coub’ов задан -l inf то каждый из ниж будет проигрываться вечно, при это наглядевшись на один нужно руками закрыть окно плеера откроется следующее видео и также будет по кругу идти, это удобно так как coub’ы часто смотрят по многу раз.
  • Ключ -d говорит о том что нужно просто скачать один или несколько coub’ов, проигрываться ничего не будет

Скрипт не ищет на coub по названиям типа Дело_говорит_Симпсоны этот запрос к программе для поиска локального файла.

Коубы указанные идентификатором или ссылкой всегда скачиваются, нет проверки был ли уже скачан коуб. Для уже скачанных используйте названия из ~/home/$USER/COUB .

Обработка параметров идёт через жъёпу! В начале ключи потом ссылки/id/имена или -. Значения разделены от ключей пробелом -l 3, урлы,id,имена запятыми без пробелов

Зависимости apt install lua wget лол


#! /bin/env lua
local coub = {} -- initial table for export like module
---------------------------------------------------------
coub.config =
{   -- coub save location, you can play from this dir
    storages = '/home/'..os.getenv('USER')..'/COUB';
    -- mp3, mp4 donwnload location, maybe userfull
    download = '/home/'..os.getenv('USER')..'/COUB/DATA';
}
---------------------------------------------------------
function coub.msg(text)
    print("\x1b[32m"..text.."\x1b[39m")
end

function coub.err(text)
    print("\x1b[31m"..text.."\x1b[39m")
end
---------------------------------------------------------
function coub.usage()
help = [[
Use: coub [-h] [-l Num] source

Options:
    -h  - Help and exit;
    -l  - Repeat audio Num times or inf for infinity;
    -d  - Download only
    -   - Read coub or coub list from stdin
    you can use full url or coub id
    source - url | id | file.mp4

Examples:
    # play single coub
    coub https://coub.com/view/38yafx
    # play single coub from storage
    coub ~/COUB/Don_t_be_egoistic
    # play single looped coub
    coub -l inf 38yafx
    # download single coub, no play this
    coub -d https://coub.com/view/38yafx
    # download multiply coubs with separated
    coub -d 38yafx,https://coub.com/view/38yafx
    coub -d 38yafx[newline]https://coub.com/view/38yafx
    cat mycoubs.txt | coub -d -
    # download and play multiply coubs (no looped)
    coub -d 38yafx,38yafx
    # play multiply coubs from file id list
    cat mycoubs | coub -
    ]]
    print(help)
end
-----------------------------------------------------------
local function filter_get_between(body,a,b)
    local s , e = 1 , 1;
    local out = ""
        s,e = body:find(a,1,true);
        if s == nil or e == nil then return end
        local ss,ee = body:find(b,s,true);
        if ss == nil or ee == nil then return end
        out = out .. body:sub(e+1,ss-1);
        body = body:sub(ee,#body)

    return out;
end
-----------------------------------------------------------
function coub:run()
    -- stupid handle va_args
    for k,v in ipairs(arg) do
        if self.xoop then self.loop = v; self.xoop = nil; end
        if v == '-h' then self.usage();     end
        if v == '-l' then self.xoop = 1;    end
        if v == '-d' then self.dl_only = 1; end
        self.resource = v
    end
    if not self.loop then
        self.loop = 0;
    elseif self.loop == 'inf' then
        -- do nothing
    else
        self.loop = tonumber(self.loop);
        if self.loop > 0 then
           self.loop = self.loop - 1;
        end
    end

    -- decrement loop value becouse loop value =  N+1
    -- mpv --loop=0 is once play and --loop=1 twoo play


    if not self.resource then
        coub.err("Bad coub: no have input");
        coub.usage()
    end

    -- read input from stdin
    local cnt = 1;
    if self.resource == '-' then
       self.resource = io.read("*all");
    end
    -- check is resource contains data
    -- min 2 symbol coub id (yea?)
    if #self.resource < 2 then
        coub.err('Bad data: Input source is empty');
        return; 
    end
    -- tokenization play lists, and concat to URL
    -- тут ещё нужно проверить может нужные коубы уже скачаны
    self.playlist = {}
    for resource in string.gmatch(self.resource, '([^,\n]+)') do
        if resource:find('https',1,true) then
            self.playlist[cnt] = resource;
        elseif resource:find('/',1,true) or resource:find('.',1,true) then
            self.playlist[cnt] = resource;
        else
            self.playlist[cnt] = 'https://coub.com/view/'..resource;
        end
        cnt = cnt + 1;
    end
    -- always make needed directory
    assert(os.execute('mkdir -p '..self.config.storages),"Storage no writable");
    assert(os.execute('mkdir -p '..self.config.download),"Storage no writable");
    -- download coubs & play coubs --------------------------------------------
    for i,v in ipairs(self.playlist) do

        local exec = io.popen('wget -q -O- '..v);
        local html = exec:read('*all'); exec:close();
        -- wget 
        if  html:match('%a+') then
            local json = filter_get_between(html,"<script id='coubPageCoubJson' type='text/json'>",'</script>');
            local url_video = filter_get_between(json,'"video":{"higher":{"url":',',');
            -- some video no have higher resulution
            -- try get lowless
            if not url_video then
                 url_video = filter_get_between(json,'"video":{"high":{"url":',',');
            end
            local url_audio = filter_get_between(json,'"audio":{"high":{"url":',',');
            local coubtitle = filter_get_between(json,'"title":"','",');
            coubtitle = coubtitle:gsub('[%p+%s+]','_');
            local coubid    = v:gsub('https://coub.com/view/','');
            coub.msg('Download:['..i..'] '..v..' | '..coubtitle)
            -- check file format befor try handle data
            if url_video and url_video:find('.mp4',1,true) and url_audio and url_audio:find('.mp3',1,true) then
               local file_to_save = self.config.download..'/'..coubid;
               os.execute('wget -q -Y off -c -O '..file_to_save..'.mp4 '..url_video);
               os.execute('wget -q -Y off -c -O '..file_to_save..'.mp3 '..url_audio);
               os.execute('ln -s '..file_to_save..'.mp4 '..self.config.storages..'/'..coubtitle..' 2>/dev/null');

               -- do not play if need just download video
               if not self.dl_only then
                   -- play audio in background with infinity loop
                   os.execute('( mpv --loop=inf '..file_to_save..'.mp3 ) 1> /dev/null  & '..
                              -- play video, after video ends we kill previos mpv 
                              -- stdout to /dev/null becouse kill broke terminal stdin
                              -- maybe becouse mpv use '\r' for output info about playing
                              ' mpv --loop='..self.loop..' '..file_to_save..'.mp4 1> /dev/null ; kill -INT $! ');
               end
            else
                coub.err('Bad coub:['..i..'] file formats no mp3 and mp4 '..v);
            end
        else
            if v:find('~',1,true) then
                v = v:gsub('~',os.getenv('HOME'))
            else 
                v = self.config.storages..'/'..v:gsub('https://coub.com/view/','');
            end
            local justplay = io.open(v,'r');
            if justplay then
               justplay:close();
                  if not self.dl_only then 
                    coub.msg('PlayFile:['..i..'] '..v)
                    local link = io.popen(' readlink -e '..v);
                    local file = link:read('*all'); link:close();
                    os.execute('( mpv --loop=inf '..file:gsub('mp4','mp3')..' ) 1>/dev/null  & '..
                          ' mpv --loop='..self.loop..' '..file..' 1>/dev/null ; kill -INT $! ');
                  else
                    coub.msg('Ignore..:['..i..'] coub '..v..' is downloaded')
                  end
            else 
                coub.err('Bad coub:['..i..'] coub not found '..v);
                coub.err('Bad coub:['..i..'] coub not found https://coub.com/view/'..
                        v:gsub(os.getenv('HOME')..self.config.storages,''));
            end
        end
    end
end

coub:run()

- Баги косяки, тупак, есть?
- Да. 
- Исправлять будешь? 
- Нет. 
- А почему? 
- Ну модет потом... 
- А нахера всё это? 
- А тебе не пофиг?
- Пофиг
- Ну и всё
- Ну и ладно
- Ненужно!
- Согласен
- А зачем тогда?
- Потому что.
- Потому что что?
- Потому что понедельник!
- Ой всё.
- Вот и я о том.

Подборочка

coub yaik,s08ov,8ek0p,7aenz,bslpw,5g1j9,wm3bk,14zilh,7l1rdrfc,2b5izx,2aatx2,29jdfr,29k4yq
coub 29n55n,29j3j1,10a9jk,297dvo,280v0q,29adcz,29aon6,29gzt6,1qrxao,334db,15egdcy8,lvd3c

Фъъсьооо!

★★★★★

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

Баг 1: не проигрывает музыку до конца, обрывается при окончании видеоролика

$ /tmp/coub 38yafx
Download:[1] https://coub.com/view/38yafx | Don_t_be_egoistic
V: 00:00:09 / 00:00:10 (99%)
A: 00:00:10 / 00:02:37 (6%)
$
У меня такого нет!
Сравни как работает версия на bash и как на новомодном lua
Upd: понял, ты -l не туда применил

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

Это не баг, а фича, хочешь цикла добавляй -l inf это сделано потому что если по умолчанию сделать inf то придётся всегда ручками прерывать, а у меня список может быть, а не 1 коуб.

Я ещё пердолился по поводу того как после завершения ролика сделать так что-бы прервать музыку. Мне показалось по умолчанию крутить без остановки не удобно.

Upd: понял, ты -l не туда применил

Туда! У меня просто наоборот всё. :D

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

Ура! Спасибо! Осталось только понять что такое coub и нафиг оно мне надо.

cocucka ★★★★☆
()

Чел, я где-то твой камент видел, что ты любитель. Надеюсь, ты рофлиш и в действительности работаешь программистом за 300кк в наносекунду.

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

Правильно! Я думал ключи сломал. У меня логика такая

  • В фоне запускается аудио, затем играется видео один раз или с ключём -l после завершения видео грохается аудио. Мы смотрим coub, а не слушаем музыку. -l 10 Покажет ролик 10 раз после чего грохнет звук и перейдёт к следующему ролику или если нет то всё.

Ты крутишь видео в бесконечном цикле и задаёшь количество циклов для музыки, я кручу музыку бесконечно и задаю ключи для циклов видео. Хочется просто бесконечно глядеть -l inf хочется повторить несколько раз -l число я вот хочу посмотреть список coub, а не всю музыку из каждого прослушать целиком. Поэтому для списка коубов мы переходи дальше по окончании видео, а не аудио. Хочется как у тебя -l inf

У нас разные стратегии развития продуктов! Главное совместимость по хранению данных осталась! хехе

Кому надо сделают алиас на coub -l inf или захардкодят self.loop='inf' и всё. Но, я так сделал, потому что на вход может идти список coub’ов. У тебя можно только 1 скачать/проиграть и у тебя логично его же просто крутить до закрытия.

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

Нет я никогда не работал программистом и не являюсь программистом, разовые шабаши (штук 5 за всю жизнь) не в счёт. Код мне не приносит ничего кроме фана. Я любитель, не более того.

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

Не прибедняйся, тебе он приносит бабло. И порой фан тоже (я гарантирую это). Так что у тебя два плюса из двух. Я бы рад бабло рубить, но быть программистом это не скрипты по скачиванию coub клепать :D Это значит быть инженером. все остальные это кодеры максимум или макаки как я

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

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

Нафиг сайт когда можно с локалхоста. В том то и дело что всё закрывается, а локалхост всегда при тебе. =) Хотя скрипт сломаться конечно может. Ну… шило-мыло чвож поделать.

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

Не, меня уже тошнит от всратого айти и кодинга. В свободное время предпочитаю и близко к IDE не подходить.

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

Пичальна, ну как печально, нормально!, зато ты не грузчик =) Ну всё может задолбать, это понять можно. По 8+ часов в день с понедельника до понедельника кодить яб тоже офигел и проклял это дело. А заниматься иной деятельностью в свободное время это не то что хорошо, это правильно иначе кукушка поедет. В любом случае всё познаётся в сравнении и мы часто не ценим то что есть, а порой нужное то что есть в сто крат лучше того чего нет. Эхъ филофофия

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

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

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

Для этого есть ключ со значением -l inf. И будет всё хорошо. Хотя у меня не предусмотрено стопание видео по окончании музыки. Лень уже… Принял волевое решение циклить не музыку, а видео.

Оба режима и есть без ключа -l мы смотрим до конца видео и всё, с ключём -l inf мы смотрим видео в цикле, а музыка просто до конца идёт в фоне. Но повторюсь косяк есть, по окончании аудио, видео будет продолжать беззвучно идти. Но если хочется послушать музыку, сохрани себе песенку и всё. Нууууууууу…. блин. Я бы сделал по умолчанию как у тебя, но у меня список коубов, и менять дефолт когда их по порядку проглядеть нужно, а не закрывать каждый руками менять не хочу. Все дело в списке коубов. Я не говорю что у тебя плохо, я говорю что у меня просто по другому и то и то логично.

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

Ужас какой, я только к ютубу привык, а тут ещё напасть появилась.

Появилась? Да она уже умереть успела: Coub закрывается

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

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

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

Хз, играет просто в mpv если дрыгается то это mpv сам скрипт тут не причём. Наверное, это же просто через popen

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

@superuser скажи пожалуйста под какой лицухой я сделал производную от твоей работу? Я сам решать не могу такой вопрос. Вроде и глупости, но всё же. WTFPL? CC0? MIT? AGPLv3!?

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

Ля вот паровозик, если ты основал на коде @vel то ты тоже не можешь сам выбрать лицензию, вернее всё зависит от того что скажет @vel то и будет =)

А его долго не было… Ну да и ладно. ГПЛ так ГПЛ.

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

Одуреть хехе, поровозик всё длиннее @vaka иди сюда, под какой лицензией весь наш код от 4х человек? Или ты тоже стащил ? :D

Ёпрст кто в Питере зайдите домой к ваке, пусть лицуху назовёт :D Вака вака мазафака

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

@vaka открывай, мы только спросить, мы не такие суперюзер наговаривает!

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

Если не ошибаюсь оно именно что сдохло, но подхватила группа любителей им разрешили самим поддерживать сервера. Как сейчас не в курсе.

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

Почитай выше про паровозик, я как минимум четвёртый в списке, непонятна лицензия на код. Я списал у superuser, он списал у vel, тот списал у vaka. :D Под чем выкладывать непонятно, а выкладывать не под чем == проприетарь. Это всё глупости конечно, не плевать ли кому на какие то скрипты. Но уж я заикнулся… и всё. Вот такая бюрократия. А так да, попозжа надо сбросить.

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

Сдается мне, что у vaka можно не спрашивать за лицензию: vel скопировал алгоритм, а не реализацию. На алгоритмы лицензия не распространяется, во всяком случае в РФ

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

видео + аудио mp3/mp4 в DATA лежат с именами идентификаторами как на коубе, в каталоге выше симлинк на видео с именем уже удобочитаемым, по симлинку берётся видео, в имени видео меняется расширение получаем аудио запускаем оба в mpv. Надо было наверное дать симлинкам расширение .coub и ассоциировать скрипт с этим расширением

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

Примечательно, что на такой величине валюта почти что теряет значение. 300 тысяч тысяч денег в наносекунду это 3е17 денег в секунду, то есть 1e26 денег в год.

Мировой ВВП — примерно 1е14 долларов в год, где-то один пикодоход ТСа. Сумммарная денежная масса — где-то 1e15 долларов. Так что если ТС не получает все деньги мира в секунду, то ему недоплачивают.

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

ТС, кмк, должен столько получать. Мне его код нравится.

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

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

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

Мне кажется, средствами mpv это невозможно сделать без патча. Но может быть, тебе помогут в списке рассылки. Воркэраунд – запускать два mpv (один для видео, другой для аудио).

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

Неее, какой список рассылки. Слишком частный случай. Хочется зацикленного видео по длине аудио ffmpeg в руки скажут, мол шей одно видео и всё. Или используй API для воспроизведения мультимедии. А так у mpv есть lua api и наверное можно написать плагин. Но это всё уже очень излишне как мне кажется. В скриптах надо использовать что есть из коробки по возможности иначе лучше делать полноценное приложение со своей мультимедиа обработкой и вот всё это вот.

Я интросекции сейчас тыкаю для lua, (ой параша та ещё, но зато изкоропки в любом дистрибутиве вроде) можно по сути наверное GStreamer использовать вместо mpv. А там можно вообще на Си переписать ибо, а чё. Надо ГТК окошко показать, запустить внутри поток GStreamer и до этого curl`ыкнуть json обработать его через jansson. И всё! Можно даже свой формат бинарный забабахать по аналогии с tar =) Всё можно. А вот нужно ли, это вопрос.

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

Чёт я не видел ни одного дистрибутива, где искаропки есть lua и не нужно подтягивать из реп. А уж про версии lua я вообще молчу. Сам на этом языке писал прилично (последний раз на прошлых выходных), но твой код не читал из принципа.

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

Чтоб не думать о версиях луа надо писать на нём не используя фичи, чисто логика и базовые вещи, или завязаться на определённую версию или последнюю, любая луа будет там где есть хоть одна луа (ну как, с 5.1…), такая же херня с любым языком, а так он эе встраиваемый проблемы версий побоку. Использовать lua как чисто самостоятельный язык где хост программа это просто запускалка в неком роде извращение и поэтому проявляются все те вещи которые неприятны. Можно также промолчать про версии питона. Ладно, это всё лирика, нет языка без проблем с версиями. То что надо тянуть, ну да 128 килобайт придётся притянуть =) mpv тоже далеко не у всех стоит.

писал прилично

В джемах участвуешь. Похвально. Даже игоря делаешь (прошёл по ссылке) Круть! Я думал ты вообще никаким боком к играм =)

Сща заценю, вашего поросёнка 🐖 с крыльями

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

Хрю-хрюхрю-хрюхрюхрюхрю-хрюхрю =) Намана. Намана =)

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

Mpv тянет lua в зависимостях. Т.е. если вы юзаете скрипт, где в одной из ролей прописан этот плеер, то у вас всяко установлены пакеты lua. )


Отдельно хочу сказать:

  • Действительно, данным скриптам, с двумя копиями mpv, не хватает возможности ставить на паузу. Мелочь, а неприятно. )
  • Для скачивания используется wget, но это же самое умеет yt-dlp, более того, тогда не нужен будет и jq (в первоисточнике). Надо только разбираться, какие ключики для скачивания видео и аудио без склеивания. Пока знаю -k, чтобы не удалял потоки после склеивания, но это не совсем то.
    Более того, yt-dlp может сам переименовать файлы как будет угодно.
  • Тоже была мысль, что mpv может уметь «зацикливать видео и аудио независимо друг от друга» в одном окне.
krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

Надо только разбираться, какие ключики для скачивания видео и аудио без склеивания.

Совсем уже ‘зарапортовался’: )

$ yt-dlp -f "bv,ba" -o "%(title)s.%(ext)s" https://coub.com/view/5155 

[Coub] Extracting URL: https://coub.com/view/5155
[Coub] 5155: Downloading JSON metadata
[info] 5155: Downloading 2 format(s): html5-video-higher, html5-audio-high
[download] Destination: Таврия.mp4
[download] 100% of    7.30MiB in 00:00:04 at 1.80MiB/s
[download] Destination: Таврия.mp3
[download] 100% of    5.15MiB in 00:00:03 at 1.71MiB/s


$ ls *.mp4 *.mp3
Таврия.mp3
Таврия.mp4
krasnh ★★★★
()
Ответ на: комментарий от krasnh

Mpv тянет lua в зависимостях

О как. Он прямо интерпретатор тянет? Достаточно было бы просто библиотеки, так что, скорее всего дистрибутивы, которые разделяют lua на несколько разных пакетов, интерпретатор в качестве зависимости не подтянут. Могу ошибаться тут, конечно.

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