caption="Add locale to NI-Image" -- --------------------------------------------------------------------------- n = neutrino() locales = {} chooser = nil infobox = nil tmp_dir = "/tmp/add-locale.data" user_agent = "\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0\"" wget_cmd = "wget -q -U " .. user_agent .. " -O " remote_dir = "http://neutrino-images.de/neutrino-images/locale" locale_dir = "/var/tuxbox/locale" icons_dir = "/var/tuxbox/icons" -- --------------------------------------------------------------------------- function trim(s) return (s:gsub("^%s*(.-)%s*$", "%1")) end function capitalize(s) return (s:gsub("^%l", string.upper)) end function file_exists(name) local f = io.open(name, "r") if f ~= nil then io.close(f) return true else return false end end function delay(timeout) local timeout = timeout or 2 local i = 0 repeat i = i + 1 msg, data = n:GetInput(500) until msg == RC.ok or msg == RC.home or i == (timeout * 2) end function cleanup() os.execute("rm -rf " .. tmp_dir) end function init() cleanup() os.execute("mkdir -p " .. tmp_dir) local tmp_data = tmp_dir .. "/index.html" os.execute(wget_cmd .. tmp_data .. " '" .. remote_dir .. "'"); local fp = io.open(tmp_data, "r") if fp == nil then error("Error opening file '" .. tmp_data .. "'.") end for line in fp:lines() do local match = string.find(line, "") if match ~= nil then match = line:gsub("^.*\"(.-).locale\".*$", "%1") table.insert(locales, match) end end fp:close() os.execute("mkdir -p " .. locale_dir) os.execute("mkdir -p " .. icons_dir) end function is_used(locale) local ret = false local conf = io.open("/var/tuxbox/config/neutrino.conf", "r") if conf then for line in conf:lines() do local key, val = line:match("^([^=#]+)=([^\n]*)") if (key) then if key == "language" then if (val == locale) then ret = true end end end end conf:close() end return ret end function get_icon(locale) local icon = "dummy" if file_exists(icons_dir .. "/" .. locale .. ".png") then icon = locale end return icon end function paint_infobox(locale, text) hide_menu() local dx = n:scale2Res(450) local dy = n:scale2Res(150) local x = SCREEN.OFF_X + (((SCREEN.END_X - SCREEN.OFF_X) - dx) / 2) local y = SCREEN.OFF_Y + (((SCREEN.END_Y - SCREEN.OFF_Y) - dy) / 2) infobox = cwindow.new{x=x, y=y, dx=dx, dy=dy, title=capitalize(locale), icon=get_icon(locale), has_shadow=true, show_footer=true} local t = ctext.new { parent=infobox, x=n:scale2Res(10), y=n:scale2Res(10), dx=dx-n:scale2Res(2*10), dy=dy-infobox:headerHeight()-n:scale2Res(2*10), text=text, font_text=FONT.MENU, mode="ALIGN_CENTER" } infobox:paint() end function hide_infobox() if infobox ~= nil then infobox:hide() infobox = nil end end function update(locale) paint_infobox(locale, "Updating" .. " \"" .. locale .. "\"") download(locale) delay(2) hide_infobox() return MENU_RETURN.EXIT end function install(locale) paint_infobox(locale, "Installing" .. " \"" .. locale .. "\"") download(locale) delay(2) hide_infobox() return MENU_RETURN.EXIT end function remove(locale) paint_infobox(locale, "Removing" .. " \"" .. locale .. "\"") delete(locale) delay(2) hide_infobox() return MENU_RETURN.EXIT end function download(locale) local ll = locale_dir .. "/" .. locale .. ".locale" local lr = remote_dir .. "/" .. locale .. ".locale" os.execute(wget_cmd .. ll .. " '" .. lr .. "'"); if not file_exists(ll) then showhint("Error", "Download failed: " .. locale .. ".locale", "error") return MENU_RETURN.EXIT end local il = icons_dir .. "/" .. locale .. ".png" local ir = remote_dir .. "/" .. locale .. ".png" os.execute(wget_cmd .. il .. " '" .. ir .. "'"); if not file_exists(il) then showhint("Error", "Download failed: " .. locale .. ".png", "error") return MENU_RETURN.EXIT end end function delete(locale) local ll = locale_dir .. "/" .. locale .. ".locale" if file_exists(ll) then assert(os.remove(ll), "Error removing file '" .. ll .. "'.") end local il = icons_dir .. "/" .. locale .. ".png" if file_exists(il) then assert(os.remove(il), "Error removing file '" .. il .. "'.") end end function w_chooser(locale) hide_menu() local dx = n:scale2Res(450) local dy = n:scale2Res(150) local x = SCREEN.OFF_X + (((SCREEN.END_X - SCREEN.OFF_X) - dx) / 2) local y = SCREEN.OFF_Y + (((SCREEN.END_Y - SCREEN.OFF_Y) - dy) / 2) local chooser = cwindow.new{x=x, y=y, dx=dx, dy=dy, title=capitalize(locale), icon=get_icon(locale), has_shadow=true, show_footer=true, btnRed="Remove", btnGreen="Update"} ctext.new { parent=chooser, x=n:scale2Res(10), y=n:scale2Res(10), dx=dx-n:scale2Res(2*10), dy=dy-chooser:headerHeight()-n:scale2Res(2*10), text="Remove or update ?", font_text=FONT.MENU, mode="ALIGN_CENTER" } chooser:paint() repeat msg, data = n:GetInput(500) if (msg == RC.red) then remove(locale) msg = RC.home; elseif (msg == RC.ok) or (msg == RC.green) then update(locale) msg = RC.home; end until msg == RC.home or msg == RC.setup; chooser:hide() chooser = nil if msg == RC.setup then repaint_menu = false return MENU_RETURN.EXIT_ALL end return MENU_RETURN.EXIT end function showhint(caption, text, icon, timeout) local caption = caption or "Info" local text = text or "" local icon = icon or "information" local h = hintbox.new{caption=caption, text=text, icon=icon} h:paint() delay(5) h:hide() end function paint_menu() m = menu.new{name=caption, icon="language"} m:addKey{directkey=RC.setup, id="setup", action="exit_menu"} m:addItem{type="separator"} m:addItem{type="forwarder", id="home", action="exit_menu", name="Back", icon="home", directkey=RC.home, hint="Return to previous menu", hint_icon="hint_back"}; m:addItem{type="separatorline"} for index, locale in pairs(locales) do if file_exists(locale_dir .. "/" .. locale .. ".locale") then install_or_update = "update" action_function = "update" if not is_used(locale) then action_function = "w_chooser" end else install_or_update = "install" action_function = "install" end m:addItem{ type="forwarder", action=action_function, id=locale, icon=get_icon(locale), name=capitalize(locale), value=capitalize(install_or_update), hint=capitalize(install_or_update) .." the language \"" .. capitalize(locale) .. "\"", hint_icon="hint_language" } end m:exec() end function hide_menu() if m ~= nil then m:hide() end end function exit_menu(id) repaint_menu = false if id == "setup" then return MENU_RETURN.EXIT_ALL end return MENU_RETURN.EXIT end -- --------------------------------------------------------------------------- init() repaint_menu = true while repaint_menu do paint_menu() end cleanup()