Тема: Lua-скрипты для VLC
Тема lua. Тут можно просить помощи. Или делиться скриптами для VLC.
Вы тут как гость.
Неофициальный форум DLNA Home Media Server → Coding → Lua-скрипты для VLC
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Тема lua. Тут можно просить помощи. Или делиться скриптами для VLC.
Пример написания LUA-скрипта для VLC.
Общие положения об использовании lua в VLC для обработки ссылок на поток или плейлистов
1. Все скрипты для обработки плейлистов или ссылок находятся здесь: "<ПутьДоУстановленногоVLC>\VideoLAN\VLC\lua\playlist".
2. Там уже есть скрипты для разных сайтов (например для youtube), но они скомпилированы и их не прочитать. А их исходники можно и полезно посмотреть здесь. Кидать в папку VLC скрипты не обязательно скомпилированные. Можно как есть, с расширением .lua
3. Общее описание структуры скрипта для плейлистов тут. Оно простое, поэтому опишу в пару слов на русском:
В скрипте должны быть две функции - probe() и parse(). Сначала вызывается probe(), если она возвращает true - то будет вызвана parse(). Поэтому в probe() вставляем код для проверки, относится ли обрабатываемая ссылка к нашему случаю, а в parse() пишем код преобразования ссылки или вообще делаем что хотим.
Если кто-то умеет программировать, но не знаком с LUA - то не пугайтесь, язык простой, но умеет многое. Ссылка на краткое описание его синтаксиса: на англ. и тут кто-то перевёл.
Пример простейшей обработки ссылки на примере сайта mediabay.tv
Вот простой пример lua скрипта:
-- Example: http://mediabay.tv/livetv/138-Sport__UZ
-- Probe function.
function probe()
if vlc.access ~= "http" and vlc.access ~= "https" then
return false
end
return vlc.path:match("mediabay.tv")
end
-- Parse function.
function parse()
local html = vlc.read(100000) -- get all contents of html page
item = {}
item.path = html:match("http[^'\"]+\.m3u8" )
item.title = html:match("<title>([^<]+)" )
item.arturl = html:match("poster%s*=%s*'([^']+)")
item.options = { ":http-user-agent=Mozilla/5.0"; ":http-referrer="..vlc.access.."://"..vlc.path }
return { item }
end
Если этот код сохранить в файл mediabay_tv.lua и скопировать его в <ПутьДоУстановленногоVLC>\VideoLAN\VLC\lua\playlist, то в VLC при нажатии Ctrl+N можно ввести ссылку канала типа http://mediabay.tv/livetv/138-Sport__UZ и плеер начнёт проигрывать поток.
В этом примере две функции. В probe() мы проверяем, является ли ссылка ссылкой на интернет ресурс (http или https) и также проверяем, содержит ли ссылка доменное имя mediabay.tv. Если всё так, то функция возвратит true и плеер будет знать, что данный скрипт сработает для данной ссылки и вызовет функцию parse().
Во второй функции parse() мы загружаем страницу, создаём элемент, присваиваем элементу значения, выдернутые по регулярным выражениям из загруженной html страницы. Там же есть ссылка прям на m3u8 плейлист. Поэтому всё просто.
Функция parse() должна возвращать массив объектов, в свойствах которых должны быть значения элемента плейлиста (path - обязательно, остальные нет). Если элемент один, то плеер считает что это и есть ссылка, а не плейлист (или плейлист содержит единственный элемент).
Полезные ссылки по работе регулярок в Lua:
Работа с классом строка, Работа с шаблонами.
А вот пример посложнее.
На сайтах onelike.tv и only-tv.org есть iframe, который подгружается после загрузки страницы. Iframe указывает на PHP скрипт, который отдаёт содержимое с плеером и ссылкой на поток. Так вот вызвать (загрузить) этот PHP скрипт невозможно, без указания дополнительных HTTP заголовков, типа Referer. Поэтому приходится извращаться. С ужасом обнаружил, что в VLC почти нет никакой хорошей поддержки для работы HTTP запросами. По крайней мере в скриптах для плейлистов. В скриптах для аддонов (плагинов) доступно больше.
Поэтому я выкрутился так. Отдаю на выходе parse() ссылку на PHP скрипт, где в options указываю ключи для VLC со значениями Referer и User-agent. Т.к. ссылка такого PHP скрипта расположена на другом домене, то в функции probe() я проверяю на соответствие ссылке уже двум доменам. Один для страницы сайта, второй для обработки этого PHP скрипта.
А в parse() тоже сначала проверяю, какую ссылку мы обрабатываем. Если это PHP скрипт, то достаём оттуда ссылку на поток. Если это ссылка на страницу сайта, достаём оттуда ссылку на PHP скрипт, который потом будет обработан снова нашим же скриптом (по второму кругу).
-- Example: http://only-tv.org/bollywood.html
-- Add parameter to url
function string.addParam(url, param)
if url:match("%?") then return url.."&"..param
else return url.."?"..param end
end
-- Trimming spaces
function string.trim(text)
return text:gsub("^%s*(.-)%s*$", "%1")
end
-- Probe function.
function probe()
if vlc.access ~= "http" and vlc.access ~= "https" then
return false
end
return vlc.path:match("only%-tv.org")
or vlc.path:match("youtvonlinefree.com")
end
-- Parse function.
function parse()
local html = vlc.read(200000)
if vlc.path:match("youtvonlinefree.com") then
url = html:match("file:%s*'([^']+)" )
title = vlc.path:match("title=([^&]+)" )
img = vlc.path:match("poster=([^&]+)")
if not url then
vlc.msg.err("Couldn't find url to stream in the "..vlc.access.."://"..vlc.path)
end
if title then title = vlc.strings.decode_uri(title) end
if img then img = vlc.strings.decode_uri(img ) end
else
baseUrl = "http://only-tv.org"
title = html:match('<title>(.+)</title>');
url = html:match('<iframe[^>]+src="(http[^"]+%.php)"')
img = html:match('class="post".-<img[^>]+src="(/images.-)"')
if not url then
vlc.msg.err("Couldn't find iframe url in the "..vlc.access.."://"..vlc.path)
return {}
end
if img then
img = baseUrl..img
url = url:addParam("poster="..vlc.strings.encode_uri_component(img))
end
if title then
title = title:gsub("смотреть онлайн", ""):trim()
title = title:gsub("бесплатно" , ""):trim()
title = title:gsub("прямой эфир" , ""):trim()
url = url:addParam("title="..vlc.strings.encode_uri_component(title))
end
end
item = {}
item.path = url
item.title = title
item.arturl = img
item.options = { ":http-user-agent=Mozilla/5.0"; ":http-referrer="..vlc.access.."://"..vlc.path }
return { item }
end
Прикрепил файлы скриптов, который можно кинуть в \lua\playlist папки, где установлен VLC.
Да, здорово! Вы просто Гений.
К сожаление не все из прочитанного я понял, ибо далек от языка программирования.
Lua пишется только текстом, или для него имеется GUI?
Проверил 3 ваших скрипта, only-tv.org почему-то не работает, можете пожалуйста проверить?
А как быть с lua на Андроид приставке, есть решение для его воспроизведения?
И как обстоят дела с сайтами pokazz.net и viks.tv, можно пару примеров?
Благодарю за ваше участие в теме.
Да, с only_tv.lua накосячил. Прилагаю исправленный.
С viks.tv пришлось повозиться. Там в html коде код и ссылка запакован в javascript код, который исполняется через Eval.
Пришлось писать функцию распаковки, вот из этой темы.
Код этого lua-скрипта:
-- Example: http://viks.tv/430-belarus-5.html
-- Decode function packed javascript
function DecodePackedJS(w, i, s, e)
local n = 0
local str1 = ""
local str2 = ""
while true do
if n < 5 then
str2 = str2..string.char(w:byte(n+1))
str2 = str2..string.char(i:byte(n+1))
str2 = str2..string.char(s:byte(n+1))
else
if n < w:len() then str1 = str1..string.char(w:byte(n+1)) end
if n < i:len() then str1 = str1..string.char(i:byte(n+1)) end
if n < s:len() then str1 = str1..string.char(s:byte(n+1)) end
end
if str1:len() + str2:len() + e:len() >= w:len() + i:len() + s:len() + e:len() then
break
end
n = n + 1
end
local count = 1
local result = ""
for n = 1, str1:len(), 2 do
local nShift = -1
if (str2:byte(count) % 2) > 0 then nShift = 1 end
result = result..string.char(tonumber(str1:sub(n, n+1), 36)-nShift)
count = count + 1
if count > str2:len() then count = 1 end
end
return result
end
-- Probe function.
function probe()
if vlc.access ~= "http" and vlc.access ~= "https" then
return false
end
return vlc.path:match("viks.tv")
end
-- Parse function.
function parse()
local html = vlc.read(200000) -- get all contents of html page
-- search packed javascript and decode
data = html
while data:find("function%(w,i,s,e%)") do
w,i,s,e = data:match(".+function%(w,i,s,e%).-%('(%w+)','(%w+)','(%w+)','(%w+)'")
data = DecodePackedJS(w,i,s,e)
end
local url = data:match("http[^'\"]+%.m3u8[^'\"]+")
if not url then
vlc.msg.err("Couldn't find url to stream on the "..vlc.access.."://"..vlc.path)
return {}
end
img = html:match("<h1>.-<img[^>]+src=\"(.-)\"")
title = html:match("<h1>(.-)</h1>")
item = {}
item.path = url
item.title = title
item.arturl = img
item.options = { ":http-user-agent=Mozilla/5.0"; ":http-referrer="..vlc.access.."://"..vlc.path }
return { item }
end
Там мы загружаем страницу и ищем запакованную функцию function(w,i,s,e), берём параметры её вызова и вызываем свою функцию декодирования.
Т.к. в распакованных данных там опять хранится запакованные данные - то сделал цикл, который вызывает распаковку, пока будет находить в распакованных данных это дело.
В общем, выкладываю для истории.
P.S.
Lua пишется только текстом, или для него имеется GUI?
Только текстом. Если вы далеки от программирования, то просто пользуйтесь готовыми скриптами.
Но если на сайте у них там сильно что-то изменится, что эти скрипты могут перестать работать.
Если хотите всё сами автоматизировать - изучайте языки программирования.
P.S. Также добавил lua скрипт nasha_tema.lua от aleks123 для канала https://nasha-tema.tv/online/ (потерялось при переносе в эту тему).
aleks123, как я понял, уже разобрались?
Насчёт sub() - всё правильно.
url = url:sub(5)
вернёт строку, без первых четырёх символов.
Чтобы смотреть промежуточные результаты для отладки, я делаю так: запускаю VLC, нажимаю Ctrl+M, детализацию выставляю в "1 (предупреждения)" и открываю по Ctrl-N ссылку, на которой сработает скрипт.
А в самом скрипте вставляю отладочный вывод информации, типа:
vlc.msg.err("url: "..url)
url = url:sub(4)
vlc.msg.err("url: "..url)
И в окне сообщений смотрю вывод.
А насчёт base64, не, в модуле string объекта vlc нет функций декодирования base64.
Весь ограниченный список функций модулей описан здесь. Там такой функции нет. Там вообще мало чего есть.
Да ещё и прикол в том, что в readme для playlist описано в конце, какие модули доступны. Т.е. доступны далеко не все. Только: msg, strings, stream, variables и xml.
Причём модуль variables мне так и не удалось использовать для хранения значений между вызовами скриптов. Так и не разобрался, какой должен быть первый параметр в функциях vlc.var.create( object, name, value ) и vlc.var.get( object, name ).
Кто бы тоже подсказал.
А декодировать Base64 придётся только с дополнительной самописной функцией, типа:
-- decoding Base64 string
function decodeBase64(data)
data = string.gsub(data, '[^'..b..'=]', '')
return (data:gsub('.', function(x)
if (x == '=') then return '' end
local r,f='',(b:find(x)-1)
for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
return r;
end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
if (#x ~= 8) then return '' end
local c=0
for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
return string.char(c)
end))
end
Спасибо, я уже сам нашёл тут https://forum.videolan.org/viewtopic.php?t=90796
И ещё в книжке Roberto Ierusalimschy - Programming in Lua
За ссылку на полезные функции - благодарность.
Подсмотрел там и проверил, оказывается в Lua можно расширять классы своими функциями, как в Phyton.
Т.е. расширить класс string и использовать у всех объектов этого типа.
function string.base64_decode(data)
... bla bla
end
local aaa = "SGVsbG8h"
aaa = aaa:base64_decode()
vlc.msg.err("aaa: "..aaa)
Для меня новость.
Интересно как в vlc реализовать такие вещи, как можно например в nginx?
proxy_set_header X-Requested-With XMLHttpRequest;
proxy_set_header Cookie PHPSESSID=178fb374a22e9714532616c4a9cd9d03:
proxy_set_header X-Forwarded-For 5.11.98.212;
Насчёт HTTP headers в VLC.
Я до этого этот вопрос изучал и вообще разочаровался. Оказалось, что в lua-скриптах для playlist недоступен модуль vlc.net и с запросами не побалуешь. Даже, похоже, POST запрос какой сделать невозможно, если понадобится. Или, по крайней мере, я не знаю как.
Но вот сейчас я проверил и получилось обмануть VLC и заставить его установить любой HTTP заголовок, который нам нужен.
В возвращаемом объекте item мы можем указать options, где указать опции для потока. В этих опциях мы можем указывать всякие ключи, которые доступны для http input.
https://wiki.videolan.org/VLC_command-line_help/
Типа: --http-proxy=, --http-referrer=, --http-user-agent=, --http-reconnect, --no-http-reconnect, --http-continuous, --no-http-continuous,--http-forward-cookies, --no-http-forward-cookies. Вот в общем то и всё.
Двоеточие вместо -- в параметрах может быть использовано для указания, что они применяются только для конкретного потока перед воспроизведением и заменяют установленные глобально.
Но если в значении параметра --http-referrer указывать переносы строк, то можно также указать и другие заголовки. Ибо они разделяются между собой именно так.
Пример:
-- Parse function.
function parse()
local html = vlc.read(100000) -- get all contents of html page
item = {}
item.path = html:match("http[^'\"]+\.m3u8" )
item.title = html:match("<title>([^<]+)" )
item.arturl = html:match("poster%s*=%s*'([^']+)")
local headers = "X-Requested-With: XMLHttpRequest\r\n"..
"Cookie: PHPSESSID=178fb374a22e9714532616c4a9cd9d03\r\n"..
"X-Forwarded-For: 5.11.98.212;"
item.options = { ":http-user-agent=Mozilla/5.0"; ':http-referrer='..vlc.access.."://"..vlc.path.."\r\n"..headers }
return { item }
end
WendyH
если не сложно, для http://www.ustream.tv/ можете сделать на lua?
Да с этим способом замечательно на выходе куки прикручиваются даже в одной строчке options:
item.options = { ":http-user-agent=Mozilla/5.0"; ':http-referrer='..vlc.access.."://"..vlc.path.."\r\n"..'X-Requested-With: XMLHttpRequest'.."\r\n"..'Cookie: PHPSESSID=178fb374a22e9714532616c4a9cd9d03' }
А вот как прикрутить нужные хедеры вначале до парсинга страницы, так как для некоторых сайтов без нужных хедеров даже не зайдешь на страницу? Пока приходится через nginx добавлять.
А вот как прикрутить нужные хедеры вначале до парсинга страницы, так как для некоторых сайтов без нужных хедеров даже не зайдешь на страницу? Пока приходится через nginx добавлять.
До парсинга никак, если только не вызывать сам vlc с указанием в командной строке параметров... Хотя не проверял, как они эти параметры к переносам строк отнесутся.
Я выходил из этого положения следующим образом.
1) Отдавал в item.path ссылку не на поток, а на страницу, которую нужно загрузить с дополнительными хеадерами. Это может быть всё та же страница изначальная. Только добавить как параметр к этой ссылке какой-нибудь флаг, чтобы потом можно было его проверить. Ну и соответственно сами хеадеры в options.
2) После получения ссылки на воспроизведение, VLC заново по кругу проверяет все lua скрипты на совпадение и обработку данной ссылки. И вот тут то твой скрипт это должен опять перехватить. И дополнительно проверить, нет ли установленного параметра в ссылке из предыдущего пункта.
3.а) Если нет - это первая попытка, добавить к ссылке "?passed=true", установить options с http заголовками и присвоить эту ссылку в item.path.
3.b) Если да - это обработка ссылки, которую мы передали в прошлый раз и страница должна быть загружена уже с учётом тех заголовков, которые мы передавали.
Не знаю, смог ли понятно объяснить, но сделать можно примерно так (образный код):
local headers = "X-Requested-With: XMLHttpRequest\r\n"..
"Cookie: PHPSESSID=178fb374a22e9714532616c4a9cd9d03\r\n"..
"X-Forwarded-For: 5.11.98.212;"
function addParameter(url, param)
if url:match("%?") then return url.."&"..param
else return url.."?"..param end
end
-- Probe function.
function probe()
if vlc.access ~= "http" and vlc.access ~= "https" then
return false
end
return vlc.path:match("domen.com")
end
-- Parse function.
function parse()
local html = vlc.read(300000) -- get all contents of html page
if vlc.path:match("passed=true") then
-- page loaded with our headers
url = html:match("<pattern for searching stream url>")
else
-- try with same url but with sets headers
url = addParameter(url, "passed=true")
end
item = {}
item.path = url
item.options = { ":http-user-agent=Mozilla/5.0"; ":http-referrer="..vlc.access.."://"..vlc.path.."\r\n"..headers }
return { item }
end
Я так прикалывался в onelike_tv.lua, там тоже нужно было загружать страницу с заголовками.
Я ещё пытался использовать vlc.var.create( object, name, value ) для передачи названия канала для следующего срабатывания скрипта. Но так и не получилось. А с заголовками как я описал выше всё получилось.
WendyH
если не сложно, для http://www.ustream.tv/ можете сделать на lua?
Сделать то сделал, да только VLC не может нормально проигрывать HLS поток оттуда. Почему-то считает это ссылкой на плейлист и не считает его live вещанием. Из-за этого он просто получив первые куски видео проигрывает их как плейлист. С затыками и паузами между кусками.
Скрипт для кучи прикрепил, но пользоваться этим нормально пока невозможно.
Понимает ссылки вида http://www.ustream.tv/channel/animalplanetlive .
Но пока VLC не научится нормально проигрывать вот такие ссылки на вещания - http://iphone-streaming.ustream.tv/uhls … ylist.m3u8
то бесполезно.
Вроде проблема давняя, как я почитал в сети. И всякие streamlink и livestreamer'ы такие ссылки перерабатывают на ура. А вот VLC чёт подгоняет.
WendyH
спасибо
такие не играет
http://www.ustream.tv/decoraheagles
http://www.ustream.tv/channel/ccfl-live
m3u8 не отдается - Access forbidden, нужен токен
в streamlink, livestreamer, youtube-dl там пасеры на питоне, а я со "змениным" вобще никак (
Но пока VLC не научится нормально проигрывать вот такие ссылки на вещания
попробуйте vlc-3.0.0-rc2
Не нашёл примеров как в lua декодировать title такого вида:
"caption":"\u041c\u043e\u0441\u043a\u0432\u0430 \u0414\u043e\u0432\u0435\u0440\u0438\u0435"
Здесь видимо должен использоваться require ("dkjson")
https://raw.githubusercontent.com/video … dkjson.lua
PS
Можно ли использовать доп. библиотеки, которых нет в vlc по умолчанию, например luasocket ?
https://forum.videolan.org/viewtopic.ph … p;t=109033
Для станций с pcradio.ru скрипт pcradio.lua
открывает ссылки сайта:
https://pcradio.ru/radio/rock-fm
https://pcradio.ru/radio/keks-moskva
и т.п.
Не нашёл примеров как в lua декодировать title такого вида:
"caption":"\u041c\u043e\u0441\u043a\u0432\u0430 \u0414\u043e\u0432\u0435\u0440\u0438\u0435"
Здесь видимо должен использоваться require ("dkjson")
https://raw.githubusercontent.com/video … dkjson.luaPS
Можно ли использовать доп. библиотеки, которых нет в vlc по умолчанию, например luasocket ?
https://forum.videolan.org/viewtopic.ph … p;t=109033Для станций с pcradio.ru скрипт pcradio.lua
+ открыть спойлероткрывает ссылки сайта:
https://pcradio.ru/radio/rock-fm
https://pcradio.ru/radio/keks-moskva
и т.п.
Ну да, в приципе можно что-то типа такого:
local json = require("dkjson")
local obj, pos, err = json.decode("{\"caption\":\"\\u041c\\u043e\\u0441\\u043a\\u0432\\u0430 \\u0414\\u043e\\u0432\u0435\\u0440\\u0438\\u0435\"}") -- Returns: obj, pos, err (see dkjson docs)
vlc.msg.err("!!!Caption: "..obj.caption);
Только там по-хорошему нужно на ошибки проверять.
Использовать библиотеки, которых нет по-умолчанию - я пробовал и обламался. Но пробовал один раз и не сильно старался разобраться.
Пробовал пример отсюда сделать:
https://stackoverflow.com/questions/416 … ps-request
Всё нормально title декодируется и на ошибки не пришлось проверять, так как все каналы нормально отображаются.
local title = html:match("(.*)")
local json = require("dkjson")
local obj, pos, err = json.decode(title) -- Returns: obj, pos, err (see dkjson docs)
item = {}
item.path = url
item.title = obj.caption
item.options = { ":http-user-agent=VLC/2.2.8 LibVLC/2.2.8"}
return { item }
Сделал скрипт для десктопных free каналов spbtv по мотивам only_tv_org
Во вложениях сам скрипт spbtvonlineru.lua и плейлист, тех каналов которые им открываются VLC_spbtvonline.ru.m3u
Сделал скрипт для десктопных
спасибо , переделал свой, добавил выбор качества
Пытаюсь загрузит плейлист из xml файла c сайта, но пока ничего не вышло, так как его перехватывает какой-то xml парсер плеера.
Тогда решил скачать этот xml-лист с сайта, закинул на дропбокс и убрал расширение .xml
Теперь плейлист создаётся, но вылез другой косяк из-за большого размера больше 3500 станций. Распарсивается только 2986 штук, хотя уже выставил local html = vlc.read(5000000). Может есть какое-то ограничение по размеру листа? И можно это ограничение обойти?
Вот собственно сам скрипт
--Create playlist for pcradio
--https://dl.dropboxusercontent.com/s/l22et3cduwcuf2y/pcradio_ru
-- Probe function.
function probe()
if vlc.access ~= "http" and vlc.access ~= "https" then
return false
end
return vlc.path:match("dropboxusercontent%.com/s/")
and vlc.path:match("pcradio_")
end
-- Parse function.
function parse()
local html = vlc.read(5000000)
local title,url,img
playlist = {}
for w in string.gmatch(html, '<channel>(.-)</channel>') do
title = string.match(w,'<title>(.-)</title>')
url = string.match(w,'<url_hi>(.-)</url_hi>')
img = string.match(w,'<img>(.-)</img>')
url = string.gsub(url,'stream%.pcradio%.ru','stream.pcradio.biz')
title = string.gsub(title,',',' ')
local item = {}
item.path = url
item.title = title
item.description = title
item.arturl = img
item.options = { ":http-user-agent=pcradio"; ":http-referrer=https://pcradio.ru"}
table.insert(playlist, item)
end
return playlist
end
Пытаюсь загрузит плейлист из xml файла c сайта, но пока ничего не вышло, так как его перехватывает какой-то xml парсер плеера.
Тогда решил скачать этот xml-лист с сайта, закинул на дропбокс и убрал расширение .xml
Теперь плейлист создаётся, но вылез другой косяк из-за большого размера больше 3500 станций. Распарсивается только 2986 штук, хотя уже выставил local html = vlc.read(5000000). Может есть какое-то ограничение по размеру листа? И можно это ограничение обойти?
Хм, действительно, при vlc.read(5000000) у меня загружается только 2 097 152 байт.
Если разбить на две команды загрузки, примерно вот так:
local html = vlc.read(2000000)
local html2 = vlc.read(540096)
html = html..html2
vlc.msg.err("len of read="..tostring(html:len()))
То длина будет полной = 2 540 096
Похоже на какое-то ограничение длины буфера. Не знаю, не искал подобную настройку пока. Лучше всего для больших данных использовать тогда цикл загрузки.
local html = ""
while true do
data = vlc.read(10000)
if not data then break end
html = html..data
end
Тогда считывается всё и полностью.
Странно то, что у меня не получилось сделать так, как это делается в стандартных скриптах, которые идут с vlc, через realline.
local html = ""
while true do
line = vlc.readline()
if not line then break end
html = html..line
end
Почему-то считывает три строки. В них найдёт 4 станции. И всё. Оч странно.
Похоже на какое-то ограничение длины буфера. Не знаю, не искал подобную настройку пока. Лучше всего для больших данных использовать тогда цикл загрузки.
local html = "" while true do data = vlc.read(10000) if not data then break end html = html..data end
Тогда считывается всё и полностью.
Спасибо! Такой цикл работает как нужно.
Реально ли как-то в lua реализовать такие POST запросы?
curl "https://api.stream.smcdn.pl/api/secureToken.php" -H "Referer: http://www.eskago.pl/tv" --data "streamUri=eskatv-t/eskatv_720p"
curl "https://api.stream.smcdn.pl/api/secureToken.php" -H "Referer: http://www.eskago.pl/tv" --data "streamUri=vox2-p/stream1"
PS
Тут вроде есть описание по этому вопросу, но как реализовать пока ещё не въехал.
https://stackoverflow.com/questions/157 … top-events
Реально ли как-то в lua реализовать такие POST запросы?
Смотря где. В скриптах для playlist очень большие ограничения и там нет доступа к модулю vlc.net, в отличии скриптов-плагинов (Extensions) или скриптов-интерфейсов (intf). Последние, как я понял, можно использовать при запуске самого vlc, где в параметрах указывать значения config и какой intf-скрипт использовать.
Как делать POST запросы в скриптах playlist я так и не понял. Ответов в инете не нашёл, только если использовать самостоятельно добавленные модули в VLC, но у меня с ходу не получилось и я не пытался потом.
Кстати попробовал лист радио загружать как Service Discovery, т.е. скрипт нужно положить в папку sd. Обновляется лист из меню Интернет плейлиста, пример на картинке
К сожалению так и не удалось распарсивать xml прямо с сайта. Пришлось удалить некоторые теги, из-за которых выскакивали ошибки.
Вот собственно такой получился lua
function string.base64_decode(data)
local b = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
data = string.gsub(data, '[^'..b..'=]', '')
return (data:gsub('.', function(x)
if x == '=' then return '' end
local r,f='',(b:find(x)-1)
for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end
return r;
end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)
if #x ~= 8 then return '' end
local c=0
for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end
return string.char(c)
end))
end
lazily_loaded = false
function lazy_load()
if lazily_loaded then
return nil
end
require("simplexml")
lazily_loaded = true
end
function descriptor()
return {
title = "PC Radio"
}
end
function main()
lazy_load()
local tree = simplexml.parse_url(string.base64_decode("aHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy95d2F6MDQyYjgydmcyM3cvcGNyYWRpb19ydV8ueG1sP2RsPTE="))
for _, station in ipairs(tree.children) do
simplexml.add_name_maps(station)
local url = station.children_map.url_hi[1].children[1]
url = url:gsub("stream%.pcradio%.ru", "stream.pcradio.biz")
local title = station.children_map.title[1].children[1]
title = title:gsub("%-", " ")
vlc.sd.add_item({
path = url,
arturl = station.children_map.img[1].children[1],
title = title,
description = title,
options = { ":http-user-agent=pcradio"}
})
end
end
Несколько дней назад состоялся официальный релиз VLC 3.0.0.
К сожалению в этом VLC перестали в lua-скриптах добавляться в item.options {} значения headers типа:
item.options = { ":http-user-agent=Mozilla/5.0"; ":http-referrer="..vlc.access.."://"..vlc.path.."\r\n"..headers }
соответсnвенно подобные скрипты работающие в vlc 2.2.x, теперь не работают в vlc 3.0.0.
Непонятно или это было выпилено из обновленного vlc или теперь как-то по-другому реализовано?
Добрый день,прошу помощи ,если не сложно, для http://www.ontvtime.ru , http://kraski.tv/tv можете сделать lua? с низким качеством . Спасибо
Приветствую!
Нужна помощь в решении задачи для VLC. Сам справится не смог.
Мне нужно как-то сделать, что бы по нажатию на нужное сочетание кнопок - у меня или в файлик на диске или в clipboard сохранялось текущее время проигрывания файла.
Никак не могу понять как просто забирать от VLC текущий таймер просмотра, что бы его потом другими скриптами обрабатывать.
Поискал, нашел скрипты на lua для vlc имеено для этой задачи, вот:
https://addons.videolan.org/p/1154002/
https://addons.videolan.org/p/1154007/
но я не смог их запуститьу себя на последней версии vlc 3.0.7.1. как ни пытался ничего не вышло.
Можете пожалуйста помочь решить эту задачу и как-то сохранять текущее время?
P.S.
А вообще более общаяя задача для чего мне это нужно:
Я хочу, что бы когда я смотрю фильм на ноутбуке в спальне, я мог нажать сочетание кнопок и у меня с помощью другого самописного скипта на AutoHotkey, через расшаренную папку в домашней сети, на другом компьютере в другой комнате, на большом экране откылся этот же фильм точно с того же места где я остановил смотреть в спальне с ноута.
И что бы когда я перешел в другую комнату я просто нажал бы 1 кнопку и продолжил смотреть с того же места.
текущее время проигрывания файла
https://github.com/videolan/vlc/tree/master/share/lua
пробовали player.get_time() , player.get_position() ??
https://github.com/videolan/vlc/tree/master/share/lua
пробовали player.get_time() , player.get_position() ??
я просто не понимаю как запускать это скрипты и что бы они в clipboard или в файл записывали данные.. (
.С настройками сервера я не силен,но думаю не через скрипт,а в настройках нужно что-то менять.В статье прописаны настройки vlc......
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Неофициальный форум DLNA Home Media Server → Coding → Lua-скрипты для VLC