1

Тема: Lua-скрипты для VLC

Тема lua. Тут можно просить помощи. Или делиться скриптами для VLC.

Sony Bravia KDL-32CX523

2

Re: 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.

Прикреплённые файлы сообщения

mediabay_tv.lua 651 b, скачивалось 213 раз, начиная с 2017.12.16

onelike_tv.lua 1.97 kb, скачивалось 218 раз, начиная с 2017.12.16

Sony Bravia KDL-32CX523

3

Re: Lua-скрипты для VLC

Да, здорово! Вы просто Гений.
К сожаление не все из прочитанного я понял, ибо далек от языка программирования.
Lua пишется только текстом, или для него имеется GUI?
Проверил 3 ваших скрипта, only-tv.org почему-то не работает, можете пожалуйста проверить?
А как быть с lua на Андроид приставке, есть решение для его воспроизведения?
И как обстоят дела с сайтами pokazz.net и viks.tv, можно пару примеров?
Благодарю за ваше участие в теме.

4

Re: Lua-скрипты для VLC

Да, с 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.

Dee_Jay пишет:

Lua пишется только текстом, или для него имеется GUI?

Только текстом. Если вы далеки от программирования, то просто пользуйтесь готовыми скриптами.
Но если на сайте у них там сильно что-то изменится, что эти скрипты могут перестать работать.
Если хотите всё сами автоматизировать - изучайте языки программирования.

P.S. Также добавил lua скрипт nasha_tema.lua от aleks123 для канала https://nasha-tema.tv/online/ (потерялось при переносе в эту тему).

Прикреплённые файлы сообщения

nasha_tema.lua 714 b, скачивалось 185 раз, начиная с 2017.12.16

only_tv_org.lua 2.15 kb, скачивалось 234 раза, начиная с 2017.12.16

pokazz_net.lua 1.72 kb, скачивалось 204 раза, начиная с 2017.12.16

viks_tv.lua 2.13 kb, скачивалось 215 раз, начиная с 2017.12.16

Sony Bravia KDL-32CX523

5

Re: Lua-скрипты для VLC

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
Sony Bravia KDL-32CX523

6

Re: Lua-скрипты для VLC

Спасибо, я уже сам нашёл тут https://forum.videolan.org/viewtopic.php?t=90796
И ещё в книжке Roberto Ierusalimschy - Programming in Lua

Samsung UE32F5300
Windows 7 64 bit

7

Re: Lua-скрипты для VLC

За ссылку на полезные функции - благодарность.
Подсмотрел там и проверил, оказывается в Lua можно расширять классы своими функциями, как в Phyton.
Т.е. расширить класс string и использовать у всех объектов этого типа.

function string.base64_decode(data)
    ... bla bla
end

local aaa = "SGVsbG8h"
aaa = aaa:base64_decode()
vlc.msg.err("aaa: "..aaa)

Для меня новость.

Sony Bravia KDL-32CX523

8 (2017.12.16 17:29:09 отредактировано aleks123)

Re: Lua-скрипты для VLC

Интересно как в 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;
Samsung UE32F5300
Windows 7 64 bit

9

Re: Lua-скрипты для VLC

Насчёт 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
Sony Bravia KDL-32CX523

10

Re: Lua-скрипты для VLC

WendyH
если не сложно, для http://www.ustream.tv/ можете сделать на lua?

11

Re: Lua-скрипты для VLC

Да с этим способом замечательно на выходе куки прикручиваются даже в одной строчке 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 добавлять.

Samsung UE32F5300
Windows 7 64 bit

12

Re: Lua-скрипты для VLC

aleks123 пишет:

А вот как прикрутить нужные хедеры вначале до парсинга страницы, так как для некоторых сайтов без нужных хедеров даже не зайдешь на страницу? Пока приходится через 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 ) для передачи названия канала для следующего срабатывания скрипта. Но так и не получилось. А с заголовками как я описал выше всё получилось.

Sony Bravia KDL-32CX523

13

Re: Lua-скрипты для VLC

tantal пишет:

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 чёт подгоняет.

Прикреплённые файлы сообщения

ustream.lua 758 b, скачивалось 183 раза, начиная с 2017.12.16

Sony Bravia KDL-32CX523
Спасибо сказали: tantal1

14 (2017.12.17 07:01:06 отредактировано tantal)

Re: Lua-скрипты для 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

15 (2017.12.23 21:21:06 отредактировано aleks123)

Re: Lua-скрипты для VLC

Не нашёл примеров как в 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
и т.п.

Samsung UE32F5300
Windows 7 64 bit

16

Re: Lua-скрипты для VLC

aleks123 пишет:

Не нашёл примеров как в 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
и т.п.

Ну да, в приципе можно что-то типа такого:

    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

Sony Bravia KDL-32CX523

17 (2017.12.24 00:52:54 отредактировано aleks123)

Re: Lua-скрипты для VLC

Всё нормально 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 }
Samsung UE32F5300
Windows 7 64 bit

18 (2017.12.30 20:15:31 отредактировано aleks123)

Re: Lua-скрипты для VLC

Сделал скрипт для десктопных free каналов spbtv по мотивам only_tv_org
Во вложениях сам скрипт spbtvonlineru.lua и плейлист, тех каналов которые им открываются VLC_spbtvonline.ru.m3u

Прикреплённые файлы сообщения

spbtvonlineru.lua 2.99 kb, скачивалось 237 раз, начиная с 2017.12.30

VLC_spbtvonline.ru.m3u 10.49 kb, скачивалось 253 раза, начиная с 2017.12.30

Samsung UE32F5300
Windows 7 64 bit
Спасибо сказали: tantal1

19 (2017.12.30 22:11:49 отредактировано tantal)

Re: Lua-скрипты для VLC

aleks123 пишет:

Сделал скрипт для десктопных

спасибо , переделал свой, добавил выбор качества

20

Re: Lua-скрипты для VLC

Пытаюсь загрузит плейлист из 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
Samsung UE32F5300
Windows 7 64 bit

21

Re: Lua-скрипты для VLC

aleks123 пишет:

Пытаюсь загрузит плейлист из 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 станции. И всё. Оч странно.

Sony Bravia KDL-32CX523

22 (2018.01.07 13:12:17 отредактировано aleks123)

Re: Lua-скрипты для VLC

WendyH пишет:

Похоже на какое-то ограничение длины буфера. Не знаю, не искал подобную настройку пока. Лучше всего для больших данных использовать тогда цикл загрузки.

    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

Samsung UE32F5300
Windows 7 64 bit

23

Re: Lua-скрипты для VLC

aleks123 пишет:

Реально ли как-то в lua реализовать такие POST запросы?

Смотря где. В скриптах для playlist очень большие ограничения и там нет доступа к модулю vlc.net, в отличии скриптов-плагинов (Extensions) или скриптов-интерфейсов (intf). Последние, как я понял, можно использовать при запуске самого vlc, где в параметрах указывать значения config и какой intf-скрипт использовать.
Как делать POST запросы в скриптах playlist я так и не понял. Ответов в инете не нашёл, только если использовать самостоятельно добавленные модули в VLC, но у меня с ходу не получилось и я не пытался потом.

Sony Bravia KDL-32CX523

24

Re: Lua-скрипты для 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
Samsung UE32F5300
Windows 7 64 bit

25

Re: Lua-скрипты для VLC

Несколько дней назад состоялся официальный релиз 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 или теперь как-то по-другому реализовано?

Samsung UE32F5300
Windows 7 64 bit