
module('EdemTV_pls', package.seeall) 
local https = require "ssl.https"
local socket = 	require "socket"
local ssl = require "ssl"	
https.USERAGENT = "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; MRIE9; rv:11.0) like Gecko"

local msgcolor = 0x0FE23
--local logfile = m_simpleTV.MainScriptDir .. 'user\\TVSources\\LuaDebug.txt'
--debug_in_file('*debug*\n',logfile,true)

----------------------------------------
------ Мои настройки -------------------
local IpChange = false   -- подменяем адрес на ip используемый на странице сайта
local RtmpSet = false    -- меняем ссылку для воспроизведения через rtmp
local ArmenSkip = false   -- пропускаем армянские каналы
----------------------------------------
function GetSettings()
    local scrap_settings
	scrap_settings ={
	name	 		='EdemTV',     			  -- Имя источника
	sortname 		='',					  -- имя для сортировки (если не указано, берется name) 
	scraper 		='EdemTV_pls.lua',		  -- * Путь и название скрапера (будет автоматически присвоено)  
	m3u     		='out_edem.m3u',	      -- Путь и название m3u
	logo     		='..\\Channel\\logo\\Icons\\Edem.png',  --  путь и файл лого относительно папки work 
	TypeSourse		=1,					  	  -- * Тип источника: 0 - внутренний, 1 - внешний (будет автоматически присвоено 1)
	TypeCoding		=1,						  -- Кодировка M3U (0 - ANSI, 1 - UTF8, 2 - UNICODE)          
	DeleteM3U		=0,						  -- Удалять m3u по завершению обработки (1 - включено, 0 - выключено) 
	RefreshButton   =1,						  -- Обновлять по кнопке "Обновить плей-лист" (1 - включено, 0 - выключено) 
	AutoBuild		=0,						  -- Автообновление (1 - включено, 0 - выключено)             
	AutoBuildDay	={0,0,0,0,0,0,0},		  -- Дни недели автообновления {вс,пн,вт,ср,чт,пт,сб}  
	LastStart		=0,						  -- Последняя успешная загрузка                      
	-----------------------------------------------------------------------------------------------
	TVS				={					 	  -- Ветка настроек для загрузки в базу TVSources (1 - включено, 0 - выключено)
		add			=1,						  -- Загружать в базу TVSources (1 - включено, 0 - выключено)              
		FilterCH	=1,						  -- Фильтровать названия каналов (1 - включено, 0 - выключено)    
		FilterGR	=1,						  -- Фильтровать названия групп каналов (1 - включено, 0 - выключено) 
		GetGroup	=1,						  -- Наследовать группу (1 - включено, 0 - выключено)                
		LogoTVG		=1},					  -- Наследовать логотип и программу передач (1 - включено, 0 - выключено) 
	------------------------------------------------------------------------------------------------
	STV				={						  -- Ветка настроек для загрузки в базу SimpleTV    
		add			=1,						  -- Загружать в базу SimpleTV (1 - включено, 0 - выключено) 
		ExtFilter	=1,						  -- Создавать внешний фильтр (1 - включено, 0 - выключено)  
		FilterCH	=1,						  -- Фильтровать названия каналов (1 - включено, 0 - выключено) 
		FilterGR	=1,						  -- Фильтровать названия групп (1 - включено, 0 - выключено)   
		GetGroup	=1,						  -- Учитывать группы из M3U  (1 - включено, 0 - выключено)    
		HDGroup		=1,						  -- HD каналы отдельной группой  (1 - включено, 0 - выключено) Зависит от скрапера 
		AutoSearch	=1,						  -- Искать логотип и программу передач (1 - включено, 0 - выключено) 
		AutoNumber	=1,						  -- Автонумерация каналов (1 - включено, 0 - выключено)          
		NumberM3U	=0,						  -- Учитывать номера из M3U (1 - включено, 0 - выключено) 
		GetSettings	=1,						  -- Учитывать настройки из M3U (1 - включено, 0 - выключено)   
		NotDeleteCH =0,						  -- Не удалять отсутствующие каналы при обновлении (1 - включено, 0 - выключено) 
		TypeSkip	=1,						  -- Если канал существует в базе: 0 - пропускать, 1 - обновлять, 2 - загружать как новый
		TypeFind	=0}						  -- ^^^^^^^^^^ проверять совпадение по: 0 - названию канала, 1 - адресу канала  
	}                                                                                                                                          
	return scrap_settings
end
--------------------------------------------------------------------------
function GetVersion()
	return 1, 'UTF-8'
end
--------------------------------------------------------------------------

-----------------------------------------------------------------------------------------
function GetLogin()
 
	local err, login, pass
	local error_text, pm = pcall(require,'pm')	
	
	if  package.loaded.pm then 	
		err, login, pass = pm.GetTestPassword('edemtv','EdemTV')
    end
    if not package.loaded.pm or err~=true or login==nil or login=='' or pass==nil or pass=='' then      
	  m_simpleTV.OSD.ShowMessage_UTF8("Для работы Edem.tv требуется ввод логина и пароля \nв Password manager с [ID=edemtv]",0x00FFFF,10)
	  m_simpleTV.Common.Wait(2000)
	  return 
	end

	return login,pass
end
-----------------------------------------------------------
function EdemTVLoginAndUrl()
	local login,pass = GetLogin()	
	if login==nil or login=='' or pass==nil or pass=='' then 
	   --tvs_core.tvs_debug('GetLogin() bad')
		return false 
	end

    local options = { "no_ticket","no_sslv2", "no_sslv3","no_session_resumption_on_renegotiation",
                      "allow_unsafe_legacy_renegotiation", "cryptopro_tlsext_bug"}
	
---FORCE SSL DO HANDSNAKE-----------
	local params = {
	   mode = "client",
	   protocol = "tlsv1",
	   verify = "none",
	   options = options 
	}			
	local conn = socket.tcp()
	conn:settimeout(15)
	conn:setoption('reuseaddr',true)
	conn:setoption('tcp-nodelay',true)
	conn:connect("edem.tv", 443)
	conn = ssl.wrap(conn, params)
	conn:dohandshake()
	conn:send( "GET / HTTP/1.0\n\n" )
	local str = conn:receive("*l") or ''
    m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv....',msgcolor,5)

--------------------------------------

	login = string.gsub(login,'%@','%%40')

	local request_body = 'email='.. login .. '&password=' .. pass
	
	--local UserAgent = "Mozilla/5.0 (Windows NT 6.3; rv:37.0) Gecko/20100101 Firefox/37.0"
	local link = "https://edem.tv:443/account/login"	
	local location, cookie = "",""
	local res, code, headers, status
	local resp = {}
    
	res, code, headers, status = https.request ({
							method = 'POST',
							url = link ,
							headers = { 
							  Host = "edem.tv", 
							  ["Content-Type"] = "application/x-www-form-urlencoded",
							  ["Content-Length"] = string.len(request_body), 
							  Connection = "keep-alive",
							}, 
							source = ltn12.source.string(request_body),
							sink = ltn12.sink.table(resp),
							protocol = "tlsv1",
							verify = "none",
							options = options 
						})
    
	if not (code==302 or code==301) or not res then 
	    local err
	    if code==200 then 
	      err = "Edem.tv scraper: can't login."
	    else
	      err = "Edem.tv scraper: site not available, please repeat later. \n"..code
	    end  
	   	m_simpleTV.OSD.ShowMessage_UTF8(err,255,5)
        tvs_core.tvs_debug(err)	
        m_simpleTV.Common.Wait(2000)
		return false 
	end
      
	if type(headers) == "table" then
	  for k, v in pairs(headers) do
	    if k and k=="location"   then location = v end
	    if k and k=="set-cookie" then cookie = v:match('path=/, ?(.+path=/)')  end
	  end
	end    
	resp = {}	
	res, code, headers, status = https.request{
				    method = 'GET',
					url = location,
					headers = { 
					  Host = "edem.tv",
					  ["Cookie"] = cookie,
					  ["Content-Type"] = "application/x-www-form-urlencoded",
					  ["Content-Length"] = string.len(request_body), 
					  Connection = "keep-alive",
					},   
					source = ltn12.source.string(request_body),
					sink = ltn12.sink.table(resp),
					protocol = "tlsv1",
					verify = "none",
					options = options
			} 
	
	conn:close()
	
	if not (code==200) or not res then 
   		m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv scraper GET error: ' .. code,255,5)
        tvs_core.tvs_debug('Edem.tv scraper GET error: ' .. code)	
		return false 
	end
	
	out = table.concat(resp) 
	--out = res
    local url = out:match('(https://edem.tv/playlists/uplist/.+/edem_pl.m3u8)') 
	
	if  not url then
	   m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv scraper: not found playlist direct link.',255,5)
	   m_simpleTV.Common.Wait(2000)
	end
	    
	return url, cookie
end
-----------------------------------------------------------
local function DownloadM3U8(url)
    local resp = {}
  	local res, code, headers, status = https.request{
				url = url, 
				sink = ltn12.sink.table(resp) 
			} 
	if not (code==200) or not res then 
   		m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv download error: ' .. code .. '\nUrl='..url ,255,5)
        tvs_core.tvs_debug('Edem.tv download error: ' .. code .. '\nUrl='..url)	
		return false 
	end	
		
    local str = table.concat(resp)
    str = str:gsub('\r','')
    
	m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv .m3u8 download',msgcolor,5)	
	m_simpleTV.Common.Wait(300)
	
	--debug_in_file(str,logfile)

	return  str
end
---------------------------------
local function GetWebIP(cookie)
   local resp ={}
   local 	res, code, headers, status = https.request{
			    method = 'GET',
				url = 'https://edem.tv/channel/view/3',
				headers = { Cookie = cookie	},   
				sink = ltn12.sink.table(resp) 
			} 
	if not (code==200) or not res then 
   		m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv scraper WEB error: ' .. code,255,5)
        tvs_core.tvs_debug('Edem.tv scraper WEB error: ' .. code)	
		return 
	end
	
	out = table.concat(resp) 
    local ip, key = out:match('file:.-http://(.-)/iptv/(.-)/') 
    
    return ip, key
end
-----------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------  
function GetList(UpdateID,m3u_file)
 if UpdateID == nil then return end
 if m3u_file == nil then return end
 if TVSources_var.tmp.source[UpdateID] == nil then return end
 local Source=TVSources_var.tmp.source[UpdateID]  -- Наследуем настройки источника, чтобы не таскать

	tvs_core.tvs_debug("Scraper for "..Source.name.." begin.") 	
	m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv...',msgcolor,5)
	local url, cookie
	if Source.m3u:find('^http.+edem%.tv') then 
	   	url, cookie = Source.m3u, ""
	else
	   	url, cookie = EdemTVLoginAndUrl()
		if not url then return end
		m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv login ok.',msgcolor,5)
	end
    if false then   --old version of download
				local file_name = m_simpleTV.Common.DownloadFileInTmp(url, "tmp_edem.m3u8", false)
				if not file_name then 
				   m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv file download error.\n URL='..(url or ''),msgcolor,5)
				   return 
				end
				m_simpleTV.Common.Wait(500)
				m_simpleTV.OSD.ShowMessage_UTF8('Edem.tv .m3u8 download ok.\n',msgcolor,5)
				
				local handle = io.open (file_name , "r")
				str = handle:read("*all")
				handle:close()
	end			
	str = DownloadM3U8(url)
	if not str then return end	
---------------- Подменяем IP, если нужно (берем с сайта, там меньше нагрузка, но хуже качество)------------
 if IpChange==true or RtmpSet==true then
	local ip, key = GetWebIP(cookie)
	if ip and key then 
	   host = str:match('//(.-)/iptv/') 
	   if IpChange==true then str = str:gsub(host,ip) end
	   if RtmpSet==true then
	      str = str:gsub('http://'..host..'/iptv/'..key,'rtmp://'..(IpChange and ip or host)..'/iptv')
	      str = str:gsub('/index.m3u8','?key='..key)
	   end   
	end
 end	
---------------- получаем таблицу из ответа --------------------------------------------
    local t_pls = tvs_core.GetPlsAsTable(str)    	
    for k,v in pairs(t_pls) do
        if ArmenSkip==true and v.group=="Հայկական" then v.skip = true end
	-- 	debug_in_file('Group='..(v.group or '')..'\nName=' .. (v.name or '')..'\nAddres=' .. (v.address or '')..'\n', logfile)
	end 
---------------- обрабатываем таблицу общими фильтрами  ---------

    local m3ustr = tvs_core.ProcessFilterTable(UpdateID,Source,t_pls)      
	--debug_in_file(m3ustr, logfile)
	
	tvs_core.tvs_debug("Scraper for "..Source.name..": filtered 'm3u' info push into file "..m3u_file)

	local handle = io.open (m3u_file, "w+")   -- m3u_file - не меняем название, из него грузится потом вся инфа
	if handle == nil then return nil end
	handle:write (m3ustr)
	handle:close ()
	
	tvs_core.tvs_debug("Scraper for "..Source.name.." end: return 'ok'.")

	return 'ok'

------------------------------------------------------------------------------------------------------------------

end 

