YouTube-DL: Neue Qualitätsauswahl mit CallbackQuerys
This commit is contained in:
parent
f62095634e
commit
e018760317
@ -1,19 +1,11 @@
|
||||
-- SWITCH YOUR EDITOR TO UTF-8 (Notepad++ sets this file to ANSI)
|
||||
local settings = {}
|
||||
|
||||
settings.triggers = {
|
||||
"^(⚙ [Ee]instellungen)$",
|
||||
"^(/settings)$",
|
||||
"^(↩️ [Zz]urück)$",
|
||||
"^(💤 [Aa][Ff][Kk]%-[Kk]eyboard einschalten)$",
|
||||
"^(💤 [Aa][Ff][Kk]%-[Kk]eyboard ausschalten)$",
|
||||
"^(❌ [Ee]instellungen verstecken)$",
|
||||
"^(▶️ [Vv]ideoauflösung für [Yy]ou[Tt]ube%-[Dd][Ll] einstellen)$",
|
||||
"^(▶️ 144p)$",
|
||||
"^(▶️ 180p)$",
|
||||
"^(▶️ 360p [Ww]eb[Mm])$",
|
||||
"^(▶️ 360p [Mm][Pp]4)$",
|
||||
"^(▶️ 720p)$"
|
||||
"^(💤 [Aa][Ff][Kk]%-[Kk]eyboard einschalten)",
|
||||
"^(💤 [Aa][Ff][Kk]%-[Kk]eyboard ausschalten)",
|
||||
"^(❌ [Ee]instellungen verstecken)"
|
||||
}
|
||||
|
||||
--[[
|
||||
@ -31,25 +23,12 @@ function settings:keyboard(user_id)
|
||||
else
|
||||
afk_button = '{"text":"💤 AFK-Keyboard einschalten"}'
|
||||
end
|
||||
local youtube_dl_res_button = '{"text":"▶️ Videoauflösung für YouTube-DL einstellen"}'
|
||||
local hide_settings_button = '{"text":"❌ Einstellungen verstecken"}'
|
||||
|
||||
local settings_keyboard = '[['..afk_button..','..youtube_dl_res_button..'],['..hide_settings_button..']]'
|
||||
local settings_keyboard = '[['..afk_button..','..hide_settings_button..']]'
|
||||
return settings_keyboard
|
||||
end
|
||||
|
||||
function settings:youtube_dl_keyboard()
|
||||
local worst = '{"text":"▶️ 144p"}'
|
||||
local still_worse = '{"text":"▶️ 180p"}'
|
||||
local better_webm = '{"text":"▶️ 360p WebM"}'
|
||||
local better_mp4 = '{"text":"▶️ 360p MP4"}'
|
||||
local best = '{"text":"▶️ 720p"}'
|
||||
local back = '{"text":"↩️ Zurück"}'
|
||||
|
||||
local youtube_dl_keyboard = '[['..best..','..better_mp4..','..better_webm..'],['..still_worse..','..worst..'],['..back..']]'
|
||||
return youtube_dl_keyboard
|
||||
end
|
||||
|
||||
function settings:action(msg, config, matches)
|
||||
if msg.chat.type ~= "private" then
|
||||
return
|
||||
@ -57,17 +36,10 @@ function settings:action(msg, config, matches)
|
||||
|
||||
local hash = 'user:'..msg.from.id
|
||||
|
||||
-- General
|
||||
if matches[1] == '⚙ Einstellungen' or matches[1] == '/settings' or matches[1] == '↩️ Zurück' then
|
||||
if matches[1] == '⚙ Einstellungen' or matches[1] == '/settings' then
|
||||
utilities.send_reply(self, msg, 'Was möchtest du einstellen?', false, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
elseif matches[1] == '❌ Einstellungen verstecken' then
|
||||
utilities.send_reply(self, msg, 'Um die Einstellungen wieder einzublenden, führe /settings aus.', true, '{"hide_keyboard":true}')
|
||||
return
|
||||
end
|
||||
|
||||
-- AFK keyboard
|
||||
if matches[1] == '💤 AFK-Keyboard einschalten' then
|
||||
elseif matches[1] == '💤 AFK-Keyboard einschalten' then
|
||||
redis:hset(hash, 'afk_keyboard', 'true')
|
||||
utilities.send_reply(self, msg, 'Das AFK-Keyboard wurde erfolgreich *eingeschaltet*.', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
@ -75,43 +47,10 @@ function settings:action(msg, config, matches)
|
||||
redis:hset(hash, 'afk_keyboard', 'false')
|
||||
utilities.send_reply(self, msg, 'Das AFK-Keyboard wurde erfolgreich *ausgeschaltet*.', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
end
|
||||
|
||||
-- YouTube-DL video resolution
|
||||
-- 144p: 17
|
||||
-- 180p: 36
|
||||
-- 360p WebM: 43
|
||||
-- 360p MP4: 18
|
||||
-- 720p: 22
|
||||
if matches[1] == '▶️ Videoauflösung für YouTube-DL einstellen' then
|
||||
utilities.send_reply(self, msg, 'Welche Videoauflösung bevorzugst du?\n<b>HINWEIS:</b> Dies gilt nur für <code>/mp4</code>. Wenn die gewählte Auflösung nicht zur Verfügung steht, wird die nächsthöhere bzw. bei 720p die nächstniedrigere genommen.', 'HTML', '{"keyboard":'..settings:youtube_dl_keyboard()..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
elseif matches[1] == '▶️ 144p' then
|
||||
local resolution_order = '17/36/43/18/22'
|
||||
redis:hset(hash, 'yt_dl_res_ordner', resolution_order)
|
||||
utilities.send_reply(self, msg, 'Die Reihenfolge ist jetzt folgende:\n1) 144p\n2) 180p\n3) 360p WebM\n4) 360p MP4\n5) 720p', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
elseif matches[1] == '▶️ 180p' then
|
||||
local resolution_order = '36/17/43/18/22'
|
||||
redis:hset(hash, 'yt_dl_res_ordner', resolution_order)
|
||||
utilities.send_reply(self, msg, 'Die Reihenfolge ist jetzt folgende:\n1) 180p\n2) 144p\n3) 360p WebM\n4) 360p MP4\n5) 720p', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
elseif matches[1] == '▶️ 360p WebM' then
|
||||
local resolution_order = '43/18/36/17/22'
|
||||
redis:hset(hash, 'yt_dl_res_ordner', resolution_order)
|
||||
utilities.send_reply(self, msg, 'Die Reihenfolge ist jetzt folgende:\n1) 360p WebM\n2) 360p MP4\n3) 180p\n4) 144p\n5) 720p', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
elseif matches[1] == '▶️ 360p MP4' then
|
||||
local resolution_order = '18/43/36/17/22'
|
||||
redis:hset(hash, 'yt_dl_res_ordner', resolution_order)
|
||||
utilities.send_reply(self, msg, 'Die Reihenfolge ist jetzt folgende:\n1) 360p MP4\n2) 360p WebM\n3) 180p\n4) 144p\n5) 720p', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
return
|
||||
elseif matches[1] == '▶️ 720p' then
|
||||
local resolution_order = '22/18/43/36/17'
|
||||
redis:hset(hash, 'yt_dl_res_ordner', resolution_order)
|
||||
utilities.send_reply(self, msg, 'Die Reihenfolge ist jetzt folgende:\n1) 720p\n2) 360p MP4\n3) 360p WebM\n4) 180p\n5) 144p', true, '{"keyboard":'..settings:keyboard(msg.from.id)..', "one_time_keyboard":true, "selective":true, "resize_keyboard":true}')
|
||||
elseif matches[1] == '❌ Einstellungen verstecken' then
|
||||
utilities.send_reply(self, msg, 'Um die Einstellungen wieder einzublenden, führe /settings aus.', true, '{"hide_keyboard":true}')
|
||||
return
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return settings
|
@ -18,11 +18,62 @@ end
|
||||
|
||||
youtube_dl.command = 'mp3 <URL>, /mp4 <URL>'
|
||||
|
||||
function youtube_dl:convert_video(id, chosen_res)
|
||||
local ytdl_json = io.popen('youtube-dl -f '..chosen_res..' --max-filesize 49m -j https://www.youtube.com/watch/?v='..id):read('*all')
|
||||
function youtube_dl:get_availabe_formats(id, hash)
|
||||
local ytdl_json = io.popen('youtube-dl -j https://www.youtube.com/watch/?v='..id):read('*all')
|
||||
if not ytdl_json then return end
|
||||
local data = json.decode(ytdl_json)
|
||||
return data
|
||||
|
||||
local available_formats = {}
|
||||
redis:hset(hash, 'duration', data.duration)
|
||||
|
||||
-- Building table with infos
|
||||
for n=1, #data.formats do
|
||||
local vid_format = data.formats[n].format
|
||||
local format_num = vid_format:match('^(%d+) ')
|
||||
local valid_nums = {['17'] = true, ['36'] = true, ['43'] = true, ['18'] = true, ['22'] = true}
|
||||
if not vid_format:match('DASH') and valid_nums[format_num] then -- We don't want DASH videos!
|
||||
local format_info = {}
|
||||
format_info.format = format_num
|
||||
local hash = hash..':'..format_num
|
||||
if format_num == '17' then
|
||||
format_info.pretty_format = '144p'
|
||||
elseif format_num == '36' then
|
||||
format_info.pretty_format = '180p'
|
||||
elseif format_num == '43' then
|
||||
format_info.pretty_format = '360p WebM'
|
||||
elseif format_num == '18' then
|
||||
format_info.pretty_format = '360p MP4'
|
||||
elseif format_num == '22' then
|
||||
format_info.pretty_format = '720p'
|
||||
end
|
||||
format_info.ext = data.formats[n].ext
|
||||
local url = data.formats[n].url
|
||||
local headers = get_http_header(url)
|
||||
local full_url = headers.location
|
||||
local headers = get_http_header(full_url) -- first was for 302, this get's use the size
|
||||
if headers.location then -- There are some videos where there is a "chain" of 302... repeat this, until we get the LAST url!
|
||||
repeat
|
||||
headers = get_http_header(headers.location)
|
||||
until not headers.location
|
||||
end
|
||||
|
||||
format_info.url = full_url
|
||||
local size = tonumber(headers["content-length"])
|
||||
format_info.size = size
|
||||
format_info.pretty_size = string.gsub(tostring(round(size / 1048576, 2)), '%.', ',')..' MB' -- 1048576 = 1024*1024
|
||||
available_formats[#available_formats+1] = format_info
|
||||
redis:hset(hash, 'ext', format_info.ext)
|
||||
redis:hset(hash, 'format', format_info.pretty_format)
|
||||
redis:hset(hash, 'url', full_url)
|
||||
redis:hset(hash, 'size', size)
|
||||
redis:hset(hash, 'height', data.formats[n].height)
|
||||
redis:hset(hash, 'width', data.formats[n].width)
|
||||
redis:hset(hash, 'pretty_size', format_info.pretty_size)
|
||||
redis:expire(hash, 7889400)
|
||||
end
|
||||
end
|
||||
|
||||
return available_formats
|
||||
end
|
||||
|
||||
function youtube_dl:convert_audio(id)
|
||||
@ -34,44 +85,88 @@ function youtube_dl:convert_audio(id)
|
||||
return '/tmp/'..audio..'.mp3'
|
||||
end
|
||||
|
||||
function youtube_dl:action(msg, config, matches)
|
||||
local id = matches[2]
|
||||
local hash = 'user:'..msg.from.id
|
||||
local chosen_res = redis:hget(hash, 'yt_dl_res_ordner')
|
||||
if not chosen_res then
|
||||
chosen_res = '22/18/43/36/17'
|
||||
function youtube_dl:callback(callback, msg, self, config, input)
|
||||
utilities.answer_callback_query(self, callback, 'Informationen werden verarbeitet...')
|
||||
local video_id = input:match('(.+)@')
|
||||
local vid_format = input:match('@(%d+)')
|
||||
local hash = 'telegram:cache:youtube_dl:mp4:'..video_id
|
||||
local format_hash = hash..':'..vid_format
|
||||
if not redis:exists(format_hash) then
|
||||
youtube_dl:get_availabe_formats(video_id, hash)
|
||||
end
|
||||
|
||||
if matches[1] == 'mp4' then
|
||||
local first_msg = utilities.send_reply(self, msg, '<b>Video wird heruntergeladen...</b>', 'HTML')
|
||||
local duration = redis:hget(hash, 'duration')
|
||||
local format_info = redis:hgetall(format_hash)
|
||||
|
||||
local full_url = format_info.url
|
||||
local width = format_info.width
|
||||
local height = format_info.height
|
||||
local ext = format_info.ext
|
||||
local pretty_size = format_info.pretty_size
|
||||
local size = tonumber(format_info.size)
|
||||
local format = format_info.format
|
||||
|
||||
if size > 52420000 then
|
||||
utilities.edit_message(self, msg.chat.id, msg.message_id, '<a href="'..full_url..'">Direktlink zum Video</a> ('..format..', '..pretty_size..')', nil, 'HTML')
|
||||
return
|
||||
end
|
||||
|
||||
utilities.edit_message(self, msg.chat.id, msg.message_id, '<b>Video wird hochgeladen</b>', nil, 'HTML')
|
||||
utilities.send_typing(self, msg.chat.id, 'upload_video')
|
||||
local data = youtube_dl:convert_video(id, chosen_res)
|
||||
if not data then
|
||||
|
||||
local file = download_to_file(full_url, video_id..'.'..ext)
|
||||
if not file then return end
|
||||
utilities.send_video(self, msg.chat.id, file, nil, msg.message_id, duration, width, height)
|
||||
utilities.edit_message(self, msg.chat.id, msg.message_id, '<a href="'..full_url..'">Direktlink zum Video</a> ('..format..', '..pretty_size..')', nil, 'HTML')
|
||||
end
|
||||
|
||||
function youtube_dl:action(msg, config, matches)
|
||||
if msg.chat.type ~= 'private' then
|
||||
utilities.send_reply(self, msg, 'Dieses Plugin kann nur im Privatchat benutzt werden')
|
||||
return
|
||||
end
|
||||
local id = matches[2]
|
||||
|
||||
if matches[1] == 'mp4' then
|
||||
local hash = 'telegram:cache:youtube_dl:mp4:'..id
|
||||
local first_msg = utilities.send_reply(self, msg, '<b>Verfügbare Videoformate werden ausgelesen...</b>', 'HTML')
|
||||
local callback_keyboard = redis:hget(hash, 'keyboard')
|
||||
if not callback_keyboard then
|
||||
utilities.send_typing(self, msg.chat.id, 'typing')
|
||||
local available_formats = youtube_dl:get_availabe_formats(id, hash)
|
||||
if not available_formats then
|
||||
utilities.edit_message(self, msg.chat.id, first_msg.result.message_id, config.errors.results)
|
||||
return
|
||||
end
|
||||
|
||||
local ext = data.ext
|
||||
local resolution = data.resolution
|
||||
local url = data.url
|
||||
local headers = get_http_header(url) -- need to get full url, because first url is actually a 302
|
||||
local full_url = headers.location
|
||||
if not full_url then
|
||||
utilities.edit_message(self, msg.chat.id, first_msg.result.message_id, config.errors.connection)
|
||||
return
|
||||
local callback_buttons = {}
|
||||
for n=1, #available_formats do
|
||||
local video = available_formats[n]
|
||||
local format = video.format
|
||||
local size = video.size
|
||||
local pretty_size = video.pretty_size
|
||||
if size > 52420000 then
|
||||
pretty_format = video.pretty_format..' ('..pretty_size..', nur Link)'
|
||||
else
|
||||
pretty_format = video.pretty_format..' ('..pretty_size..')'
|
||||
end
|
||||
local button = '{"text":"'..pretty_format..'","callback_data":"@'..self.info.username..' youtube_dl:'..id..'@'..format..'"}'
|
||||
callback_buttons[#callback_buttons+1] = button
|
||||
end
|
||||
|
||||
local headers = get_http_header(full_url) -- YES TWO FCKING HEAD REQUESTS
|
||||
if tonumber(headers["content-length"]) > 52420000 then
|
||||
utilities.edit_message(self, msg.chat.id, first_msg.result.message_id, '<b>Das Video überschreitet die Grenze von 50 MB!</b>\n<a href="'..full_url..'">Direktlink zum Video</a> ('..resolution..')', nil, 'HTML')
|
||||
return
|
||||
local keyboard = '{"inline_keyboard":['
|
||||
for button in pairs(callback_buttons) do
|
||||
keyboard = keyboard..'['..callback_buttons[button]..']'
|
||||
if button < #callback_buttons then
|
||||
keyboard = keyboard..','
|
||||
end
|
||||
local file = download_to_file(full_url, id..'.'..ext)
|
||||
local width = data.width
|
||||
local height = data.width
|
||||
local duration = data.duration
|
||||
utilities.edit_message(self, msg.chat.id, first_msg.result.message_id, '<a href="'..full_url..'">Direktlink zum Video</a> ('..resolution..')', nil, 'HTML')
|
||||
utilities.send_video(self, msg.chat.id, file, nil, msg.message_id, duration, width, height)
|
||||
end
|
||||
|
||||
callback_keyboard = keyboard..']}'
|
||||
redis:hset(hash, 'keyboard', callback_keyboard)
|
||||
redis:expire(hash, 7889400)
|
||||
end
|
||||
utilities.edit_message(self, msg.chat.id, first_msg.result.message_id, 'Wähle die gewünschte Auflösung.', nil, nil, callback_keyboard)
|
||||
return
|
||||
end
|
||||
|
||||
|
Reference in New Issue
Block a user