Skip to content

Commit 606b528

Browse files
authored
Merge pull request Guovin#441 from Guovin/dev
Dev
2 parents ec0b170 + dfa747b commit 606b528

File tree

9 files changed

+357
-107
lines changed

9 files changed

+357
-107
lines changed

config/config.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@ origin_type_prefer = hotel,multicast,subscribe,online_search
4343
hotel_num = 10
4444
multicast_num = 10
4545
subscribe_num = 10
46-
online_search_num = 10
46+
online_search_num = 0
4747
open_url_info = True

docs/config.md

+47-47
Large diffs are not rendered by default.

docs/config_en.md

+47-47
Large diffs are not rendered by default.

static/images/prefer_icon.png

534 Bytes
Loading

tkinter_ui/default.py

+57-10
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ def init_ui(self, root):
166166
self.ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
167167
self.ipv_type_combo = ttk.Combobox(frame_default_channel_column2)
168168
self.ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
169-
self.ipv_type_combo["values"] = ("ipv4", "ipv6", "全部")
170-
ipv_type = config.get("Settings", "ipv_type", fallback="全部")
169+
self.ipv_type_combo["values"] = ("IPv4", "IPv6", "全部")
170+
ipv_type = config.get("Settings", "ipv_type", fallback="全部").lower()
171171
if ipv_type == "ipv4":
172172
self.ipv_type_combo.current(0)
173173
elif ipv_type == "ipv6":
@@ -181,7 +181,9 @@ def init_ui(self, root):
181181
frame_default_sort_column1 = tk.Frame(frame_default_sort)
182182
frame_default_sort_column1.pack(side=tk.LEFT, fill=tk.Y)
183183
frame_default_sort_column2 = tk.Frame(frame_default_sort)
184-
frame_default_sort_column2.pack(side=tk.RIGHT, fill=tk.Y)
184+
frame_default_sort_column2.pack(side=tk.LEFT, fill=tk.Y)
185+
frame_default_sort_column3 = tk.Frame(frame_default_sort)
186+
frame_default_sort_column3.pack(side=tk.RIGHT, fill=tk.Y)
185187

186188
self.open_keep_all_label = tk.Label(
187189
frame_default_sort_column1, text="保留模式:", width=12
@@ -196,12 +198,12 @@ def init_ui(self, root):
196198
onvalue=True,
197199
offvalue=False,
198200
command=self.update_open_keep_all,
199-
text="(保留所有检索结果,建议手动维护时开启)",
201+
text="(非严格匹配)",
200202
)
201203
self.open_keep_all_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
202204

203205
self.open_sort_label = tk.Label(
204-
frame_default_sort_column2, text="开启测速排序:", width=12
206+
frame_default_sort_column2, text="测速排序:", width=12
205207
)
206208
self.open_sort_label.pack(side=tk.LEFT, padx=4, pady=8)
207209
self.open_sort_var = tk.BooleanVar(
@@ -216,6 +218,17 @@ def init_ui(self, root):
216218
)
217219
self.open_sort_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
218220

221+
self.sort_timeout_label = tk.Label(
222+
frame_default_sort_column3, text="测速超时:", width=12
223+
)
224+
self.sort_timeout_label.pack(side=tk.LEFT, padx=4, pady=8)
225+
self.sort_timeout_entry = tk.Entry(frame_default_sort_column3)
226+
self.sort_timeout_entry.pack(side=tk.LEFT, padx=4, pady=8)
227+
self.sort_timeout_entry.insert(
228+
0, config.getint("Settings", "sort_timeout", fallback=5)
229+
)
230+
self.sort_timeout_entry.bind("<KeyRelease>", self.update_sort_timeout)
231+
219232
frame_default_sort_mode = tk.Frame(root)
220233
frame_default_sort_mode.pack(fill=tk.X)
221234
frame_default_sort_mode_column1 = tk.Frame(frame_default_sort_mode)
@@ -337,25 +350,51 @@ def init_ui(self, root):
337350
config.getfloat("Settings", "resolution_weight", fallback=0.5)
338351
)
339352

340-
frame_default_open_update_time = tk.Frame(root)
341-
frame_default_open_update_time.pack(fill=tk.X)
353+
frame_default_open_update_info = tk.Frame(root)
354+
frame_default_open_update_info.pack(fill=tk.X)
355+
frame_default_open_update_info_column1 = tk.Frame(
356+
frame_default_open_update_info
357+
)
358+
frame_default_open_update_info_column1.pack(side=tk.LEFT, fill=tk.Y)
359+
frame_default_open_update_info_column2 = tk.Frame(
360+
frame_default_open_update_info
361+
)
362+
frame_default_open_update_info_column2.pack(side=tk.RIGHT, fill=tk.Y)
363+
342364
self.open_update_time_label = tk.Label(
343-
frame_default_open_update_time, text="显示更新时间:", width=12
365+
frame_default_open_update_info_column1, text="显示更新时间:", width=12
344366
)
345367
self.open_update_time_label.pack(side=tk.LEFT, padx=4, pady=8)
346368
self.open_update_time_var = tk.BooleanVar(
347369
value=config.getboolean("Settings", "open_update_time", fallback=True)
348370
)
349371
self.open_update_time_checkbutton = ttk.Checkbutton(
350-
frame_default_open_update_time,
372+
frame_default_open_update_info_column1,
351373
variable=self.open_update_time_var,
352374
onvalue=True,
353375
offvalue=False,
354376
command=self.update_open_update_time,
355-
text="(显示于结果文件首行, 作为首个频道分类显示)",
377+
text="(结果顶部显示)",
356378
)
357379
self.open_update_time_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
358380

381+
self.open_url_info_label = tk.Label(
382+
frame_default_open_update_info_column2, text="显示接口信息:", width=12
383+
)
384+
self.open_url_info_label.pack(side=tk.LEFT, padx=4, pady=8)
385+
self.open_url_info_var = tk.BooleanVar(
386+
value=config.getboolean("Settings", "open_url_info", fallback=True)
387+
)
388+
self.open_url_info_checkbutton = ttk.Checkbutton(
389+
frame_default_open_update_info_column2,
390+
variable=self.open_url_info_var,
391+
onvalue=True,
392+
offvalue=False,
393+
command=self.update_open_url_info,
394+
text="(需要播放器支持)",
395+
)
396+
self.open_url_info_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
397+
359398
frame_default_domain_blacklist = tk.Frame(root)
360399
frame_default_domain_blacklist.pack(fill=tk.X)
361400

@@ -432,6 +471,9 @@ def update_open_keep_all(self):
432471
def update_open_sort(self):
433472
config.set("Settings", "open_sort", str(self.open_sort_var.get()))
434473

474+
def update_sort_timeout(self):
475+
config.set("Settings", "sort_timeout", self.sort_timeout_entry.get())
476+
435477
def update_open_ffmpeg(self):
436478
config.set("Settings", "open_ffmpeg", str(self.open_ffmpeg_var.get()))
437479

@@ -468,6 +510,9 @@ def update_resolution_weight(self, event):
468510
def update_open_update_time(self):
469511
config.set("Settings", "open_update_time", str(self.open_update_time_var.get()))
470512

513+
def update_open_url_info(self):
514+
config.set("Settings", "open_url_info", str(self.open_url_info_var.get()))
515+
471516
def update_ipv_type(self, event):
472517
config.set("Settings", "ipv_type", self.ipv_type_combo.get())
473518

@@ -504,6 +549,7 @@ def change_entry_state(self, state):
504549
"final_file_button",
505550
"open_keep_all_checkbutton",
506551
"open_sort_checkbutton",
552+
"sort_timeout_entry",
507553
"open_ffmpeg_checkbutton",
508554
"open_m3u_result_checkbutton",
509555
"open_filter_resolution_checkbutton",
@@ -512,6 +558,7 @@ def change_entry_state(self, state):
512558
"response_time_weight_scale",
513559
"resolution_weight_scale",
514560
"open_update_time_checkbutton",
561+
"open_url_info_checkbutton",
515562
"ipv_type_combo",
516563
"domain_blacklist_text",
517564
"url_keywords_blacklist_text",

tkinter_ui/prefer.py

+185
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
import tkinter as tk
2+
from tkinter import ttk
3+
from utils.config import config
4+
5+
6+
class PreferUI:
7+
def init_ui(self, root=None):
8+
"""
9+
Init prefer UI
10+
"""
11+
origin_type_prefer = [
12+
item.lower()
13+
for item in config.get(
14+
"Settings",
15+
"origin_type_prefer",
16+
fallback="hotel,multicast,subscribe,online_search",
17+
).split(",")
18+
]
19+
config_options = [
20+
{"label_text": f"结果来源优先{i+1}:", "combo_box_value": i}
21+
for i in range(len(origin_type_prefer))
22+
]
23+
self.origin_type_prefer_options = []
24+
for config_option in config_options:
25+
option = ConfigOption(root, **config_option)
26+
option.combo_box.bind(
27+
"<<ComboboxSelected>>",
28+
option.update_select,
29+
)
30+
option.entry.bind("<KeyRelease>", option.update_input)
31+
self.origin_type_prefer_options.append(option)
32+
33+
frame_prefer_ipv_type = tk.Frame(root)
34+
frame_prefer_ipv_type.pack(fill=tk.X)
35+
self.prefer_ipv_type_label = tk.Label(
36+
frame_prefer_ipv_type, text="结果协议优先:", width=12
37+
)
38+
self.prefer_ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
39+
self.prefer_ipv_type_combo = ttk.Combobox(frame_prefer_ipv_type)
40+
self.prefer_ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
41+
self.prefer_ipv_type_combo["values"] = ("IPv4", "IPv6", "随机")
42+
ipv_type_prefer = config.get(
43+
"Settings", "ipv_type_prefer", fallback="IPv4"
44+
).lower()
45+
if ipv_type_prefer == "ipv4":
46+
self.prefer_ipv_type_combo.current(0)
47+
elif ipv_type_prefer == "ipv6":
48+
self.prefer_ipv_type_combo.current(1)
49+
else:
50+
self.prefer_ipv_type_combo.current(2)
51+
self.prefer_ipv_type_combo.bind(
52+
"<<ComboboxSelected>>", self.update_ipv_type_prefer
53+
)
54+
self.ipv_type_input = []
55+
for ipv_type in ["ipv4", "ipv6"]:
56+
input = IpvNumInput(root, ipv_type)
57+
input.entry.bind("<KeyRelease>", input.update_input)
58+
self.ipv_type_input.append(input)
59+
60+
def update_ipv_type_prefer(self, event):
61+
config.set(
62+
"Settings",
63+
"ipv_type_prefer",
64+
self.prefer_ipv_type_combo.get(),
65+
)
66+
67+
def change_entry_state(self, state):
68+
for option in self.origin_type_prefer_options:
69+
option.change_state(state)
70+
self.prefer_ipv_type_combo.config(state=state)
71+
for input in self.ipv_type_input:
72+
input.change_state(state)
73+
74+
75+
class IpvNumInput:
76+
def __init__(self, master, ipv_type):
77+
self.master = master
78+
self.ipv_type = ipv_type
79+
self.frame = tk.Frame(master)
80+
self.frame.pack(fill=tk.X)
81+
self.frame_column1 = tk.Frame(self.frame)
82+
self.frame_column1.pack(side=tk.LEFT, fill=tk.Y)
83+
self.frame_column2 = tk.Frame(self.frame)
84+
self.frame_column2.pack(side=tk.RIGHT, fill=tk.Y)
85+
86+
ipv_type_text = "IPv4" if ipv_type == "ipv4" else "IPv6"
87+
self.entry_label = tk.Label(
88+
self.frame_column1, text=f"{ipv_type_text}数量:", width=12
89+
)
90+
self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
91+
92+
self.entry = tk.Entry(self.frame_column1)
93+
self.entry.insert(
94+
0,
95+
config.getint(
96+
"Settings",
97+
f"{ipv_type}_num",
98+
fallback=15,
99+
),
100+
)
101+
self.entry.pack(side=tk.LEFT, padx=4, pady=8)
102+
103+
def update_input(self, event):
104+
config.set(
105+
"Settings",
106+
f"{ self.ipv_type}_num",
107+
self.entry.get(),
108+
)
109+
110+
def change_state(self, state):
111+
self.entry.config(state=state)
112+
113+
114+
class ConfigOption:
115+
def __init__(self, master, label_text, combo_box_value):
116+
self.master = master
117+
self.label_text = label_text
118+
self.combo_box_value = combo_box_value
119+
120+
self.frame = tk.Frame(master)
121+
self.frame.pack(fill=tk.X)
122+
123+
self.column1 = tk.Frame(self.frame)
124+
self.column1.pack(side=tk.LEFT, fill=tk.Y)
125+
126+
self.column2 = tk.Frame(self.frame)
127+
self.column2.pack(side=tk.RIGHT, fill=tk.Y)
128+
129+
self.label = tk.Label(self.column1, text=label_text, width=12)
130+
self.label.pack(side=tk.LEFT, padx=4, pady=8)
131+
132+
self.combo_box = ttk.Combobox(self.column1)
133+
self.origin_type_prefer_obj = {
134+
"酒店源": "hotel",
135+
"组播源": "multicast",
136+
"订阅源": "subscribe",
137+
"在线搜索": "online_search",
138+
}
139+
combo_box_values_name = list(self.origin_type_prefer_obj.keys())
140+
self.combo_box["values"] = combo_box_values_name
141+
self.combo_box.pack(side=tk.LEFT, padx=4, pady=8)
142+
self.combo_box.current(combo_box_value)
143+
144+
self.entry_label = tk.Label(self.column2, text="数量:", width=12)
145+
self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
146+
147+
self.entry = tk.Entry(self.column2)
148+
self.entry.insert(
149+
0,
150+
config.getint(
151+
"Settings",
152+
f"{self.origin_type_prefer_obj[self.combo_box.get()]}_num",
153+
fallback=10,
154+
),
155+
)
156+
self.entry.pack(side=tk.LEFT, padx=4, pady=8)
157+
158+
def update_select(self, key):
159+
origin_type_prefer_list = [
160+
item.lower()
161+
for item in config.get(
162+
"Settings",
163+
"origin_type_prefer",
164+
fallback="hotel,multicast,subscribe,online_search",
165+
).split(",")
166+
]
167+
origin_type_prefer_list[self.combo_box_value] = self.origin_type_prefer_obj[
168+
self.combo_box.get()
169+
]
170+
config.set(
171+
"Settings",
172+
"origin_type_prefer",
173+
(",").join(origin_type_prefer_list),
174+
)
175+
176+
def update_input(self, event):
177+
config.set(
178+
"Settings",
179+
f"{ self.origin_type_prefer_obj[self.combo_box.get()]}_num",
180+
self.entry.get(),
181+
)
182+
183+
def change_state(self, state):
184+
self.combo_box.config(state=state)
185+
self.entry.config(state=state)

0 commit comments

Comments
 (0)