--[[ 3sat-Mediathek(light) Vers.: 0.7 Copyright (C) 2016, bazi98 with many hints and code snippets from SatBaby, big thanks from my to him App Description: The program evaluates broadcasts from the 3Sat mediathek and provides videos for playing with the neutrino mediaplayer. License: GPL 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 St, Fifth Floor, Boston, MA 02110-1301, USA. Copyright (C) for the linked videos and for the 3sat-Logo by 3sat or the respective owners! ]] -- time time = (os.date ("%H%M")) local_unixtime = ( os.time() ) -- aktuelle Zeit als unixtime -- Abfragezeitraum period_x = ( os.time() - 3600*504) -- letzte_7_Tage = ( os.time() - 3600*168) -- letzte_10_Tage = ( os.time() - 3600*240) -- letzte_2_Wochen = ( os.time() - 3600*336) -- letzte_3_Wochen = ( os.time() - 3600*504) -- default, letzte 21 Tage -- letzte_4_Wochen = ( os.time() - 3600*672) function time_to_unix(_string) -- > local sub_date = item:match(".-vom (.-):") -- Sendungsdatum als d.m.Y = 02.12.2016 local xday, xmonth, xyear = _string:match("(%d+).(%d+).(%d+)") return os.time({day = xday, month = xmonth, year = xyear}) end -- Qualitätsstufe in welcher die Sendung angezeigt werden soll qual = 1 -- 1 = HD-Qualität = 1280x720px ( DSL > 6000 ) -- 2 = MD-Qualität = 1024x576px ( DSL > 2000 ) -- 3 = SD-Qualität = 852x480px ( DSL < 2000 ) -- Mindestlänge der Sendungen welche angezeigt werden sollen duration_minimum = 900 -- 1 = 1 Sekunde = alle Sendungen egal wie lang also inkl. Vorschauen, Clips ecta. , lange Ladezeit !!! -- 60 = 1 Minute -- 180 = 3 Minuten -- 300 = 5 Minuten -- 600 = 10 Minuten -- 900 = 15 Minuten -- 1200 = 20 Minuten -- Voreinstellung -- 1500 = 25 Minuten -- 1800 = 30 Minuten -- webm-Streamadressen in mp4-Streamadresse wandeln function conv_url(_string) if _string == nil then return _string end if qual < 2 then -- = qual = 1 = HD _string = string.gsub(_string,"http://podfiles.zdf.de/podcast/zdf_podcasts","https://nrodlzdf-a.akamaihd.net/none/zdf"); _string = string.gsub(_string,"1496k_p20v13.mp4","3296k_p15v13.mp4"); _string = string.gsub(_string,"776k_p17v13.webm","3328k_p36v13.mp4"); _string = string.gsub(_string,"776k_p17v12.webm","3328k_p36v12.mp4"); _string = string.gsub(_string,"776k_p17v11.webm","2256k_p14v11.mp4"); --- bei Sendungen mit 776k_p17v11.webm ist HD nicht verfügbar deshalb MD-Qualität _string = string.gsub(_string,".mp4.csmil/master.m3u8",".mp4.csmil/index_5_av.m3u8"); elseif qual > 2 then -- = qual = 3 = SD _string = string.gsub(_string,"776k_p17v13.webm","1496k_p13v13.mp4"); _string = string.gsub(_string,"776k_p17v12.webm","1496k_p13v12.mp4"); _string = string.gsub(_string,"776k_p17v11.webm","1456k_p13v11.mp4"); else -- = qual = 2 = MD _string = string.gsub(_string,"http://podfiles.zdf.de/podcast/zdf_podcasts","https://nrodlzdf-a.akamaihd.net/none/zdf"); _string = string.gsub(_string,"1496k_p20v13.mp4","2328k_p35v13.mp4"); _string = string.gsub(_string,"776k_p17v13.webm","2328k_p35v13.mp4"); _string = string.gsub(_string,"776k_p17v12.webm","2328k_p35v12.mp4"); _string = string.gsub(_string,"776k_p17v11.webm","2256k_p14v11.mp4"); _string = string.gsub(_string,".mp4.csmil/master.m3u8",".mp4.csmil/index_4_av.m3u8"); end return _string end --Objekte function script_path() local str = debug.getinfo(2, "S").source:sub(2) return str:match("(.*/)") end function init() n = neutrino(); p = {} func = {} pmid = 0 stream = 1 tmpPath = "/tmp" -- logo für helles neutrino Theme senderlogo_dunkel = decodeImage(" data:image/png;base64,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") -- logo für dunkeles neutrino Theme senderlogo_hell = decodeImage(" data:image/png;base64,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") end function add_stream(t,u,f,e,d,s) p[#p+1]={title=t,url=u,from=f,epg=e,description=d,sonst=s,access=stream} end function getdata(Url,outputfile) if Url == nil then return nil end if Curl == nil then Curl = curl.new() end local ret, data = Curl:download{url=Url,A="40tude_Dialog/2.0.8.1de",followRedir=true,o=outputfile } if ret == CURL.OK then return data else return nil end end -- datestring in Umlaute wandeln function date_str(_string) if _string == nil then return _string end _string = string.gsub(_string,"ganze Sendung","Sendung"); return _string end -- UTF8 in Umlaute wandeln function conv_str(_string) if _string == nil then return _string end _string = string.gsub(_string,'\\',''); _string = string.gsub(_string,"Ä","Ä"); _string = string.gsub(_string,"ä","ä"); _string = string.gsub(_string,"Ö","Ö"); _string = string.gsub(_string,"ö","ö"); _string = string.gsub(_string,"Ü","Ü"); _string = string.gsub(_string,"ü","ü"); _string = string.gsub(_string,"ß","ß"); _string = string.gsub(_string,"è","è"); _string = string.gsub(_string,"é","é"); _string = string.gsub(_string,"&","&"); _string = string.gsub(_string,"–","-"); _string = string.gsub(_string,"<","<"); _string = string.gsub(_string,">",">"); _string = string.gsub(_string,""",""); _string = string.gsub(_string,"'","'"); _string = string.gsub(_string,"Ä","Ä"); _string = string.gsub(_string,"ä","ä"); _string = string.gsub(_string,"Ö","Ö"); _string = string.gsub(_string,"ö","ö"); _string = string.gsub(_string,"Ü","Ü"); _string = string.gsub(_string,"ü","ü"); _string = string.gsub(_string,"ß","ß"); _string = string.gsub(_string,"u00df","ß"); _string = string.gsub(_string,"'","'"); _string = string.gsub(_string,"ą","ą"); _string = string.gsub(_string,";",""); _string = string.gsub(_string,"nano.-nano","nano"); _string = string.gsub(_string,"kulturzeit.-Kulturzeit","Kulturzeit"); _string = string.gsub(_string,"ajextra.-ausland","ausland"); _string = string.gsub(_string,"Interview: ",""); _string = string.gsub(_string,"master","index_1_av-p"); return _string end -- #################################################################### -- function from http://lua-users.org/wiki/BaseSixtyFour -- character table string local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -- decode function dec(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 -- #################################################################### function decodeImage(b64Image) local imgTyp = b64Image:match("data:image/(.-);base64,") local repData = "data:image/" .. imgTyp .. ";base64," local b64Data = string.gsub(b64Image, repData, ""); local tmpImg = os.tmpname() local retImg = tmpImg .. "." .. imgTyp local f = io.open(retImg, "w+") f:write(dec(b64Data)) f:close() os.remove(tmpImg) return retImg end -- Duration function sec_to_min(_string) local seconds = (_string) local nMins,nSecs = math.floor(seconds/60), math.fmod(seconds, 60) return ", " ..nMins.." Min." end function sec_to_sec(_string) local sec = (_string) local nSec = math.floor(sec / 1); return tonumber(nSecs) end --geo function regio(_string) if _string == nil then return _string end _string = string.gsub(_string,"dach","D-AT-CH"); _string = string.gsub(_string,"none","Ø"); return _string end function conv_qual(_string) if _string == nil then return _string end if qual < 2 then _string = string.gsub(_string,"http.-p17v13.webm",", HD"); _string = string.gsub(_string,"http.-p17v12.webm",", HD"); _string = string.gsub(_string,"http.-h264_q30.mp4",", HD"); _string = string.gsub(_string,"http.-p20v13.mp4",", HD"); _string = string.gsub(_string,"http.-v11.webm",", SD"); return _string else _string = string.gsub(_string,"http.-.webm",", SD"); return ", SD" end end function fill_playlist() --beginn 3sat.total local data = getdata('http://www.3sat.de/mediaplayer/rss/mediathek.xml',nil) if data then for item in data:gmatch('(.-)') do local title = item:match("(.-)") -- Sendungstitel local url = item:match('webm" url="(.-)" expression') -- URL local geo = item:match('url="http://nrodl.zdf.de/(.-)/3sat') -- "none" = kein Geoblocking local date = item:match(".-vom (.-):") -- Sendungsdatum -- local sub_date = item:match("ganze Sendung vom (.-):") -- Sendungsdatum als d.m.Y = 02.12.2016 local duration = item:match('.-%: (.-)") -- Sendungsbeschreibung -- if sub_date and description and url and title and ( time_to_unix(date) <= tonumber(local_unixtime) ) then -- if sub_date and description and url and title and ( time_to_unix(date) >= tonumber(period_x) ) then if ( tonumber(duration) >= duration_minimum ) and description and url and title and ( time_to_unix(date) >= tonumber(period_x) ) then add_stream(conv_str(title), conv_url(url), date_str(date) .. sec_to_min(duration) .. conv_qual(url) .. ", Geo.: " .. regio(geo) , conv_str(title),conv_str(description), date_str(date) .. sec_to_min(duration) .. conv_qual(url) .. ", Geo.: " .. regio(geo) ) end end end --3sat.total end --- > end of playlist -- epg-Fenster local epg = "" local title = "" function epgInfo (xres, yres, aspectRatio, framerate) local dx = 800; local dy = 500; local x = ((SCREEN['END_X'] - SCREEN['OFF_X']) - dx) / 2; local y = ((SCREEN['END_Y'] - SCREEN['OFF_Y']) - dy) / 2; local wh = cwindow.new{x=x, y=y, dx=dx, dy=dy, title="3sat", icon="info", has_shadow="true", show_footer="false"}; local ct = ctext.new{parent=wh, x=35, y=5, dx=780, dy=490, text = epg , font_text=FONT['MENU'], mode = "ALIGN_SCROLL | ALIGN_TOP"}; wh:paint() repeat msg, data = n:GetInput(500) if msg == RC.up or msg == RC.page_up then ct:scroll{dir="up"}; elseif msg == RC.down or msg == RC.page_down then ct:scroll{dir="down"}; end msg, data = n:GetInput(500) until msg == RC.ok or msg == RC.home or msg == RC.info ; wh:hide() end function set_pmid(id) pmid=tonumber(id); return MENU_RETURN["EXIT_ALL"]; end function select_playitem() --local m=menu.new{name="3sat-Mediathek", icon=""} -- only text --local m=menu.new{name="", icon=senderlogo_hell} -- only logo local m=menu.new{name="", icon=senderlogo_dunkel} -- only logo for i,r in ipairs(p) do m:addItem{type="forwarder", action="set_pmid", id=i, icon="streaming", name=r.title, hint=r.from, hint_icon="hint_reload"} end repeat pmid=0 m:exec() if pmid==0 then return end local vPlay = nil local url=func[p[pmid].access](p[pmid].url) if url~=nil then if vPlay == nil then vPlay = video.new() end if title == nil then title = p[pmid].title end if url then epg = p[pmid].title .. "\n\n" .. p[pmid].description .. "\n\nSendung vom: " ..p[pmid].sonst vPlay:setInfoFunc("epgInfo") vPlay:PlayFile("3sat",url,p[pmid].title,url); else print("Video URL not found") end end until false end --Main init() func={ [stream]=function (x) return x end, } fill_playlist() select_playitem() os.execute("rm /tmp/lua*.png");