Драсти опять я к вам со своим 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
из каталога - в файле разделять можно запятыми или переводом строки
- ссылка на coub
-
Ключ
-l
задаёт количество повторенийinf
бесконечность- если задана последовательность coub то каждый из них проиграется столько раз сколько
задано ключом-l
если для последовательности coub’ов задан-l inf
то каждый из ниж будет проигрываться вечно, при это наглядевшись на один нужно руками закрыть окно плеера откроется следующее видео и также будет по кругу идти, это удобно так как coub’ы часто смотрят по многу раз.
- если задана последовательность 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