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
110
111
112
113
|
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 = 1, depth - 1 do
out[#out+1] = '{\\c&H999999&}[' ..
menus[i][menu_pos[i]]['category_name'] .. ']{\\c}'
end
for i = menu_top[depth], math.min(
menu_top[depth] + osd_lines - depth, #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}'
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 - depth 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()
|