--get the argv values
	local script_name = argv[0];
	local file_name = table.concat(argv, " ");
	freeswitch.consoleLog("notice", "[streamfile] file_name: " .. file_name .. "\n");

--include config.lua
	require "resources.functions.config";

--load libraries
	local Database = require "resources.functions.database";
	local Settings = require "resources.functions.lazy_settings";
	local file     = require "resources.functions.file";
	local log      = require "resources.functions.log".streamfile;

--get the variables
	local domain_name = session:getVariable("domain_name");
	local domain_uuid = session:getVariable("domain_uuid");

--get the sounds dir, language, dialect and voice
	local sounds_dir = session:getVariable("sounds_dir");
	local default_language = session:getVariable("default_language") or 'en';
	local default_dialect = session:getVariable("default_dialect") or 'us';
	local default_voice = session:getVariable("default_voice") or 'callie';

--set the recordings directory
	local recordings_dir = recordings_dir .. "/" .. domain_name;

--parse file name
	local file_name_only = file_name:match("([^/]+)$");

--settings
	local dbh = Database.new('system');
	local settings = Settings.new(dbh, domain_name, domain_uuid);
	local storage_type = settings:get('recordings', 'storage_type', 'text') or '';

	if (not temp_dir) or (#temp_dir == 0) then
		temp_dir = settings:get('server', 'temp', 'dir') or '/tmp';
	end

	dbh:release()

--define the on_dtmf call back function
	-- luacheck: globals on_dtmf, ignore s arg
	function on_dtmf(s, type, obj, arg)
		if (type == "dtmf") then
			session:setVariable("dtmf_digits", obj['digit']);
			log.info("dtmf digit: " .. obj['digit'] .. ", duration: " .. obj['duration']);
			if (obj['digit'] == "*") then
				return("false"); --return to previous
			elseif (obj['digit'] == "0") then
				return("restart"); --start over
			elseif (obj['digit'] == "1") then
				return("volume:-1"); --volume down
			elseif (obj['digit'] == "3") then
				return("volume:+1"); -- volume up
			elseif (obj['digit'] == "4") then
				return("seek:-5000"); -- back
			elseif (obj['digit'] == "5") then
				return("pause"); -- pause toggle
			elseif (obj['digit'] == "6") then
				return("seek:+5000"); -- forward
			elseif (obj['digit'] == "7") then
				return("speed:-1"); -- increase playback
			elseif (obj['digit'] == "9") then
				return("speed:+1"); -- decrease playback
			end
		end
	end

--if base64, get from db, create temp file
	if (storage_type == "base64") then
		local full_path = recordings_dir .. "/" .. file_name_only
		if not file.exists(full_path) then
			local sql = "SELECT recording_base64 FROM v_recordings "
				.. "WHERE domain_uuid = '" .. domain_uuid .."'"
				.. "AND recording_filename = '".. file_name_only.. "' ";
			if (debug["sql"]) then
				log.notice("SQL: " .. sql);
			end

			local dbh = Database.new('system', 'base64/read');
			local recording_base64 = dbh:first_value(sql);
			dbh:release();

			if recording_base64 and #recording_base64 > 32 then
				file_name = full_path;
				file.write_base64(file_name, recording_base64);
			end
		else
			file_name = full_path;
		end
	end

--adjust file path
	if not file.exists(file_name) then
		file_name = file.exists(sounds_dir.."/"..default_language.."/"..default_dialect.."/"..default_voice.."/"..file_name_only)
			or file.exists(recordings_dir.."/"..file_name_only)
			or file_name
	end

--stream file if exists
	if (session:ready()) then
		session:answer();
		local slept = session:getVariable("slept");
		if (slept == nil or slept == "false") then
			log.notice("sleeping (1s)");
			session:sleep(1000);
			if (slept == "false") then
				session:setVariable("slept", "true");
			end
		end
		session:setInputCallback("on_dtmf", "");
		session:streamFile(file_name);
		session:unsetInputCallback();
	end

--if base64, remove temp file (increases responsiveness when files remain local)
	-- if (storage_type == "base64") then
	-- 	if (file.exists(file_name)) then
	-- 		file.remove(file_name);
	-- 	end
	-- end
