You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
231 lines
8.2 KiB
231 lines
8.2 KiB
--[[
|
|
|
|
Copyright © 2012 VideoLAN and AUTHORS
|
|
|
|
Authors: François Revol <revol at free dot fr>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
|
--]]
|
|
|
|
function descriptor()
|
|
return { title="Assemblée Nationale" }
|
|
end
|
|
|
|
|
|
-- TODO: get correct names and arturl from current agenda
|
|
|
|
-- web entry point:
|
|
-- http://www.assemblee-nationale.tv/direct.html?flux=7#
|
|
|
|
-- advertised command line:
|
|
-- vlc --rtsp-tcp rtsp://wowg.tdf-cdn.com/5638/live
|
|
|
|
-- references & interesting URLs:
|
|
-- http://www.assemblee-nationale.tv/js/direct.js
|
|
-- http://www.assemblee-nationale.tv/ahp/scripts/
|
|
-- arturl http://www.assemblee-nationale.tv/live/images/live1.jpg
|
|
-- seems wrong though, actually depends on agenda
|
|
|
|
-- 2013-02-02: it seems they changed some urls...
|
|
-- rtsp://wowg.tdf-cdn.com/5638/live
|
|
-- http://chkg.tdf-cdn.com/5707/stream1.m3u8
|
|
-- we should probably probe those but I'm lazy
|
|
-- the live feeds list has changed too:
|
|
-- http://www.assemblee-nationale.tv/live/live.txt?rnd=
|
|
|
|
function main()
|
|
-- disregard live checks and list all possible feeds
|
|
local show_all = false
|
|
--local name_prefix = "Assemblée Nationale"
|
|
local name_prefix = "DirectAN"
|
|
-- enable protocol-specific streams
|
|
-- rtmp isn't well supported yet...
|
|
local do_rtmp = false
|
|
local do_rtsp = true
|
|
local do_iphone = true
|
|
-- number of probed possible streams
|
|
local nb_streams = 0
|
|
-- base URI for each protocol
|
|
-- XXX: should be probed as in the js code...
|
|
local iphone_base = "http://chkg.tdf-cdn.com/"
|
|
-- from http://www.assemblee-nationale.tv/json/data.json
|
|
-- XXX: maybe parse this file directly?
|
|
local rtmp_base = "rtmp://172.25.13.10/live/"
|
|
local rtsp_base = "rtsp://wowg.tdf-cdn.com/"
|
|
-- RTMP application names, probed from JS file (XXX: use data.json instead?)
|
|
-- latest js has a list for other protocols as well
|
|
local rtmp_names = {}
|
|
local app_names = {}
|
|
local http_names = {}
|
|
local rtsp_names = {}
|
|
local hls_names = {}
|
|
local idx
|
|
-- live status of each stream
|
|
local live_streams = {}
|
|
|
|
-- fetch the main JS file
|
|
fd, msg = vlc.stream( "http://www.assemblee-nationale.tv/js/direct.js" )
|
|
if not fd then
|
|
vlc.msg.warn(msg)
|
|
return nil
|
|
end
|
|
|
|
local duration, artist, name, arturl
|
|
|
|
line = fd:readline()
|
|
while line ~= nil do
|
|
if( string.find( line, "var NB_FLUX = " ) ) then
|
|
_, _, str = string.find( line, "var NB_FLUX = ([0-9]+);" )
|
|
nb_streams = tonumber(str)
|
|
elseif( string.find( line, "var urlSdp = \"rtsp%://" ) ) then
|
|
_, _, path = string.find( line, "var urlSdp = \"([^\"]+)\"" )
|
|
rtsp_base = path
|
|
elseif( string.find( line, "urlIPhone = \"" ) ) then
|
|
_, _, path = string.find( line, "\"([^\"]+)\"" )
|
|
iphone_base = path
|
|
end
|
|
line = fd:readline()
|
|
end
|
|
|
|
-- fetch the streams JS file
|
|
fd, msg = vlc.stream( "http://www.assemblee-nationale.tv/ahp/scripts/streams.js" )
|
|
if not fd then
|
|
vlc.msg.warn(msg)
|
|
return nil
|
|
end
|
|
|
|
line = fd:readline()
|
|
while line ~= nil do
|
|
if( string.find( line, "var streamNames = new Array" ) ) then
|
|
_, _, str = string.find( line, "Array%( (.*)%);" )
|
|
repeat
|
|
_, len, s = string.find( str, "\"([^\"]+)\"" )
|
|
str = string.sub(str, len + 2)
|
|
table.insert( rtmp_names, s )
|
|
until string.len(str) == 0
|
|
-- vlc.msg.warn(table.concat(rtmp_names,","))
|
|
elseif( string.find( line, "var appNames = new Array" ) ) then
|
|
_, _, str = string.find( line, "Array%( (.*)%);" )
|
|
repeat
|
|
_, len, s = string.find( str, "\"([^\"]+)\"" )
|
|
str = string.sub(str, len + 2)
|
|
table.insert( app_names, s )
|
|
until string.len(str) == 0
|
|
-- vlc.msg.warn(table.concat(app_names,","))
|
|
elseif( string.find( line, "var streamNamesHttp = new Array" ) ) then
|
|
_, _, str = string.find( line, "Array%( (.*)%);" )
|
|
repeat
|
|
_, len, s = string.find( str, "\"([^\"]+)\"" )
|
|
str = string.sub(str, len + 2)
|
|
table.insert( http_names, s )
|
|
until string.len(str) == 0
|
|
-- vlc.msg.warn(table.concat(http_names,","))
|
|
elseif( string.find( line, "var streamNamesRtsp = new Array" ) ) then
|
|
_, _, str = string.find( line, "Array%( (.*)%);" )
|
|
repeat
|
|
_, len, s = string.find( str, "\"([^\"]+)\"" )
|
|
str = string.sub(str, len + 2)
|
|
table.insert( rtsp_names, s )
|
|
until string.len(str) == 0
|
|
-- vlc.msg.warn(table.concat(rtsp_names,","))
|
|
elseif( string.find( line, "var streamNamesHls = new Array" ) ) then
|
|
_, _, str = string.find( line, "Array%( (.*)%);" )
|
|
repeat
|
|
_, len, s = string.find( str, "\"([^\"]+)\"" )
|
|
str = string.sub(str, len + 2)
|
|
table.insert( hls_names, s )
|
|
until string.len(str) == 0
|
|
-- vlc.msg.warn(table.concat(hls_names,","))
|
|
end
|
|
line = fd:readline()
|
|
end
|
|
|
|
if not rtmp_base then
|
|
vlc.msg.warn("Unable to locate rmsp base url")
|
|
end
|
|
if not rtsp_base then
|
|
vlc.msg.warn("Unable to locate rtsp base url")
|
|
end
|
|
if not iphone_base then
|
|
vlc.msg.warn("Unable to locate iphone base url")
|
|
end
|
|
|
|
-- fetch the current live status
|
|
-- XXX: disable live checks if show_all?
|
|
fd, msg = vlc.stream( "http://www.assemblee-nationale.tv/live/live.txt?rnd=" .. os.time() )
|
|
if not fd then
|
|
vlc.msg.warn(msg)
|
|
return nil
|
|
end
|
|
|
|
line = fd:readline()
|
|
while line ~= nil do
|
|
local stream = tonumber(line)
|
|
if stream ~= nil then
|
|
live_streams[stream] = 1
|
|
vlc.msg.dbg("live: " .. tostring(stream))
|
|
end
|
|
line = fd:readline()
|
|
end
|
|
|
|
-- build playlist
|
|
for idx=1,nb_streams,1 do
|
|
-- we have a live stream
|
|
local is_live = live_streams[idx] ~= nil
|
|
-- default art for this feed; agenda can have an alternate one
|
|
local arturl = "http://www.assemblee-nationale.tv/live/images/live" .. idx .. ".jpg"
|
|
local line
|
|
|
|
if is_live or show_all then
|
|
|
|
-- add rtsp streams
|
|
if do_rtsp then
|
|
local options={"deinterlace=1", "rtsp-tcp=1"}
|
|
local path
|
|
path = rtsp_base .. rtsp_names[idx] .. "/live"
|
|
vlc.sd.add_item( {path=path,
|
|
duration=duration,
|
|
artist=artist,
|
|
title=name_prefix .. " " .. idx .. " (rtsp)",
|
|
arturl=arturl,
|
|
options=options} )
|
|
end
|
|
|
|
-- add rtmp
|
|
if do_rtmp then
|
|
local options={"deinterlace=1"}
|
|
local path = rtmp_base .. rtmp_names[idx]
|
|
vlc.sd.add_item( {path=path,
|
|
duration=duration,
|
|
artist=artist,
|
|
title=name_prefix .. " " .. idx .. " (rtmp)",
|
|
arturl=arturl,
|
|
options=options} )
|
|
end
|
|
|
|
-- add iphone (m3u8) streams, VLC doesn't like them much yet
|
|
if do_iphone then
|
|
local options={"deinterlace=1"}
|
|
local path = iphone_base .. hls_names[idx] .. '/stream1.m3u8'
|
|
vlc.sd.add_item( {path=path,
|
|
duration=duration,
|
|
artist=artist,
|
|
title=name_prefix .. " " .. idx .. " (iphone)",
|
|
arturl=arturl,
|
|
options=options} )
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|