---------------------------------------
------ Шаблон для скрапера. 
------ Можно использовать как готовый скрапер, достаточно установить 3 параметра.
------ Можно использовать для написания своих скраперов для обработки сайтов.
------ Перед использованием устанавливаем настройки (3 пункта): 
---------------------------------------
module('TTelik_pls', package.seeall)  -- 1. название модуля должно совпадать с названием этого файла !
                                        --    (только без расширения ".lua")
local my_file_name = "http://torrent-telik.com/channels/torrent-tv.json"         -- 2. здесь указываем путь к файлу 
                                        --    (http,ftp или название файла xxxx.m3u в папке \TVSources\m3u\)
local my_src_name  = "TTelik"             -- 3. название источника (латиница или кириллица)
----------------------------------------
------ после того как скрапер подготовлен, поместите его в папку \TVSources\AutoSetup\
------ источник занесется в TVSources вместе с настройками. 
------ если снова поместить скрапер в \AutoSetup\ настройки не затираются (!) ,
------ т.к. занесение настоек происходит только в новый источник...
----------------------------------------

--------------------------------------------------------------------------
-- Локальный фильтр для переименования каналов. Заполнять не обязательно.
-- Если встретиться первое название, то оно заменяется на второе
--------------------------------------------------------------------------
local filter={       
{'НТРК \"ИРТА\"','НТРК "ИРТА"'},
{"",""},
}
-------------------------------------------------------------------------
local function ProcessFilterTableLocal(t) -- применяем локальный фильтр
	if not type(t)=='table' then return end
	for i = 1, #t do
	    for _,ff in ipairs(filter) do   
	      if (type(ff)=='table' and t[i].name==ff[1]) then 
	        t[i].name = ff[2]
	      end
	    end
	end 
    return t
end

--------------------------------------------------------------------------
function GetSettings()

    local scrap_settings
	scrap_settings ={
	name	 		= my_src_name,   -- Имя источника                
	sortname 		='',			 -- имя для сортировки (если не указано, берется name)               
	scraper 		='',		     -- * Путь и название скрапера (будет автоматически присвоено)     
	m3u     		='out_'..my_src_name..'.m3u', --  название m3u         
	logo     		='..\\Channel\\logo\\Icons\\ttelik.png', --  путь и файл лого относительно папки work 
	TypeSourse		=1,				 -- * Тип источника: 0 - внутренний, 1 - внешний (будет автоматически присвоено 1)  
	TypeCoding		=1,				 -- Кодировка M3U (0 - ANSI, 1 - UTF8, 2 - UNICODE)         
	DeleteM3U		=1,				 -- Удалять 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
--------------------------------------------------------------------------
local groups = {
[0]="Разное",[1]="Детские",[2]="Музыка",[3]="Фильмы",[4]="Спорт",[5]="Общие",[6]="Познавательные",[7]="Новостные",
[8]="Развлекательные",[9]="Для взрослых",[10]="Мужские",[11]="Региональные",[12]="Религиозные"
}

function GetPlsAsTable(str)
 local i=1
 local t_pls={}
 for line in  str:gmatch('({.-})')  do	
     if line and line:find('"name":') then
		t_pls[i] ={}
    	t_pls[i].name = line:match('"name":"(.-)"') or ''
        local cat = tonumber(line:match('"cat":"(.-)"')) or 0
		t_pls[i].group = groups[cat]
		t_pls[i].address = 'acestream://' .. ( line:match('"url":"(.-)"') or ''  )
		t_pls[i].skip = false                                   	
    	print(t_pls[i].name, t_pls[i].group, t_pls[i].address)
    	i=i+1  
     end 	
 end 
 return t_pls
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(Source.name..' -> ',0xffff00,5)

---------------- скачивание файла -----------------------------
	local fpath, file_name = tvs_core.tvs_GetFile(my_file_name)	
	if not fpath or not file_name then return end
		
---------------- читаем весь файл -----------------------------
    local tmp_file = fpath .. file_name
    tvs_core.tvs_debug(" m3u filename: "..tmp_file) 
    local f = assert(io.open(tmp_file, "r"))
	if f == nil then return end
    local str = f:read("*all")
    f:close()    
		
	str = str:gsub('%\\"',"'")
---------------- получаем таблицу  -----------------------------
    --local t_pls = tvs_core.GetPlsAsTable(str)     	-- m3u
    local t_pls = GetPlsAsTable(str)                 -- json
---------------- проходим локальным фильтром ------------------
    t_pls = ProcessFilterTableLocal(t_pls)
---------------- обрабатываем таблицу общими фильтрами  --------

    local m3ustr = tvs_core.ProcessFilterTable(UpdateID,Source,t_pls)      
	
	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 

