summaryrefslogtreecommitdiff
path: root/main.lua
blob: 25d53f897792a9f7326ba19302884a0cf633d1cd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
local utils = require('mp.utils')

local script_dir = mp.get_script_directory()
local stream_prefix = mp.get_opt('iptv_menu.stream_prefix')

function load_json_file(path)
	local f = io.open(script_dir .. '/' .. path, 'r')
	local data = f:read('*all')
	f:close()
	return utils.parse_json(data)
end

local osd = mp.create_osd_overlay('ass-events')
local osd_lines = 23

local categories = load_json_file('categories.json')
local streams = load_json_file('streams.json')

local depth = 1
local menus = {categories}
local menu_top = {1}
local menu_pos = {1}

function update_osd()
	local out = {}
	for i = menu_top[depth], math.min(
			menu_top[depth] + osd_lines - 1, #menus[depth]) do
		local key = (depth == 1 and 'category_name' or 'name')
		local str = menus[depth][i][key]
		if i == menu_pos[depth] then
			str = '{\\c&HFF00&}* ' .. str .. '{\\c&HFFFFFF&}'
		end
		out[#out+1] = str
	end

	osd.data = '{\\q2}' .. table.concat(out, '\\N')
	osd:update()
end

function handle_up()
	if menu_pos[depth] <= 1 then
		return
	end

	menu_pos[depth] = menu_pos[depth] - 1
	if menu_pos[depth] < menu_top[depth] then
		menu_top[depth] = menu_top[depth] - 1
	end

	update_osd()
end

function handle_down()
	if menu_pos[depth] >= #menus[depth] then
		return
	end

	menu_pos[depth] = menu_pos[depth] + 1
	if menu_pos[depth] > menu_top[depth] + osd_lines - 1 then
		menu_top[depth] = menu_top[depth] + 1
	end

	update_osd()
end

function select_category()
	local cat = categories[menu_pos[depth]]
	local menu = {}
	for _, v in ipairs(streams) do
		if v['category_id'] == cat['category_id'] then
			menu[#menu+1] = v
		end
	end

	depth = depth + 1
	menus[depth] = menu
	menu_top[depth] = 1
	menu_pos[depth] = 1

	update_osd()
end

function select_stream()
	local url = stream_prefix .. menus[depth][menu_pos[depth]]['stream_id']
	mp.commandv('loadfile', url)
end

function handle_enter()
	if depth == 1 then
		select_category()
	else
		select_stream()
	end
end

function handle_backspace()
	if depth > 1 then
		depth = depth - 1
	end

	update_osd()
end

mp.add_forced_key_binding('UP', 'up', handle_up, {repeatable=true})
mp.add_forced_key_binding('DOWN', 'down', handle_down, {repeatable=true})
mp.add_forced_key_binding('ENTER', 'enter', handle_enter)
mp.add_forced_key_binding('BS', 'backspace', handle_backspace)

update_osd()