1
0

feat:prefer

This commit is contained in:
guorong.zheng 2024-10-23 14:53:03 +08:00
parent c2a3edda4a
commit 61d1eafa6e
7 changed files with 259 additions and 13 deletions

@ -43,5 +43,5 @@ origin_type_prefer = hotel,multicast,subscribe,online_search
hotel_num = 10
multicast_num = 10
subscribe_num = 10
online_search_num = 10
online_search_num = 0
open_url_info = True

Binary file not shown.

After

(image error) Size: 534 B

@ -166,8 +166,8 @@ class DefaultUI:
self.ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
self.ipv_type_combo = ttk.Combobox(frame_default_channel_column2)
self.ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
self.ipv_type_combo["values"] = ("ipv4", "ipv6", "全部")
ipv_type = config.get("Settings", "ipv_type", fallback="全部")
self.ipv_type_combo["values"] = ("IPv4", "IPv6", "全部")
ipv_type = config.get("Settings", "ipv_type", fallback="全部").lower()
if ipv_type == "ipv4":
self.ipv_type_combo.current(0)
elif ipv_type == "ipv6":
@ -181,7 +181,9 @@ class DefaultUI:
frame_default_sort_column1 = tk.Frame(frame_default_sort)
frame_default_sort_column1.pack(side=tk.LEFT, fill=tk.Y)
frame_default_sort_column2 = tk.Frame(frame_default_sort)
frame_default_sort_column2.pack(side=tk.RIGHT, fill=tk.Y)
frame_default_sort_column2.pack(side=tk.LEFT, fill=tk.Y)
frame_default_sort_column3 = tk.Frame(frame_default_sort)
frame_default_sort_column3.pack(side=tk.RIGHT, fill=tk.Y)
self.open_keep_all_label = tk.Label(
frame_default_sort_column1, text="保留模式:", width=12
@ -196,12 +198,12 @@ class DefaultUI:
onvalue=True,
offvalue=False,
command=self.update_open_keep_all,
text="(保留所有检索结果,建议手动维护时开启)",
text="(非严格匹配)",
)
self.open_keep_all_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
self.open_sort_label = tk.Label(
frame_default_sort_column2, text="开启测速排序:", width=12
frame_default_sort_column2, text="测速排序:", width=12
)
self.open_sort_label.pack(side=tk.LEFT, padx=4, pady=8)
self.open_sort_var = tk.BooleanVar(
@ -216,6 +218,17 @@ class DefaultUI:
)
self.open_sort_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
self.sort_timeout_label = tk.Label(
frame_default_sort_column3, text="测速超时:", width=12
)
self.sort_timeout_label.pack(side=tk.LEFT, padx=4, pady=8)
self.sort_timeout_entry = tk.Entry(frame_default_sort_column3)
self.sort_timeout_entry.pack(side=tk.LEFT, padx=4, pady=8)
self.sort_timeout_entry.insert(
0, config.getint("Settings", "sort_timeout", fallback=5)
)
self.sort_timeout_entry.bind("<KeyRelease>", self.update_sort_timeout)
frame_default_sort_mode = tk.Frame(root)
frame_default_sort_mode.pack(fill=tk.X)
frame_default_sort_mode_column1 = tk.Frame(frame_default_sort_mode)
@ -337,25 +350,51 @@ class DefaultUI:
config.getfloat("Settings", "resolution_weight", fallback=0.5)
)
frame_default_open_update_time = tk.Frame(root)
frame_default_open_update_time.pack(fill=tk.X)
frame_default_open_update_info = tk.Frame(root)
frame_default_open_update_info.pack(fill=tk.X)
frame_default_open_update_info_column1 = tk.Frame(
frame_default_open_update_info
)
frame_default_open_update_info_column1.pack(side=tk.LEFT, fill=tk.Y)
frame_default_open_update_info_column2 = tk.Frame(
frame_default_open_update_info
)
frame_default_open_update_info_column2.pack(side=tk.RIGHT, fill=tk.Y)
self.open_update_time_label = tk.Label(
frame_default_open_update_time, text="显示更新时间:", width=12
frame_default_open_update_info_column1, text="显示更新时间:", width=12
)
self.open_update_time_label.pack(side=tk.LEFT, padx=4, pady=8)
self.open_update_time_var = tk.BooleanVar(
value=config.getboolean("Settings", "open_update_time", fallback=True)
)
self.open_update_time_checkbutton = ttk.Checkbutton(
frame_default_open_update_time,
frame_default_open_update_info_column1,
variable=self.open_update_time_var,
onvalue=True,
offvalue=False,
command=self.update_open_update_time,
text="(显示于结果文件首行, 作为首个频道分类显示)",
text="(结果顶部显示)",
)
self.open_update_time_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
self.open_url_info_label = tk.Label(
frame_default_open_update_info_column2, text="显示接口信息:", width=12
)
self.open_url_info_label.pack(side=tk.LEFT, padx=4, pady=8)
self.open_url_info_var = tk.BooleanVar(
value=config.getboolean("Settings", "open_url_info", fallback=True)
)
self.open_url_info_checkbutton = ttk.Checkbutton(
frame_default_open_update_info_column2,
variable=self.open_url_info_var,
onvalue=True,
offvalue=False,
command=self.update_open_url_info,
text="(需要播放器支持)",
)
self.open_url_info_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
frame_default_domain_blacklist = tk.Frame(root)
frame_default_domain_blacklist.pack(fill=tk.X)
@ -432,6 +471,9 @@ class DefaultUI:
def update_open_sort(self):
config.set("Settings", "open_sort", str(self.open_sort_var.get()))
def update_sort_timeout(self):
config.set("Settings", "sort_timeout", self.sort_timeout_entry.get())
def update_open_ffmpeg(self):
config.set("Settings", "open_ffmpeg", str(self.open_ffmpeg_var.get()))
@ -468,6 +510,9 @@ class DefaultUI:
def update_open_update_time(self):
config.set("Settings", "open_update_time", str(self.open_update_time_var.get()))
def update_open_url_info(self):
config.set("Settings", "open_url_info", str(self.open_url_info_var.get()))
def update_ipv_type(self, event):
config.set("Settings", "ipv_type", self.ipv_type_combo.get())
@ -504,6 +549,7 @@ class DefaultUI:
"final_file_button",
"open_keep_all_checkbutton",
"open_sort_checkbutton",
"sort_timeout_entry",
"open_ffmpeg_checkbutton",
"open_m3u_result_checkbutton",
"open_filter_resolution_checkbutton",
@ -512,6 +558,7 @@ class DefaultUI:
"response_time_weight_scale",
"resolution_weight_scale",
"open_update_time_checkbutton",
"open_url_info_checkbutton",
"ipv_type_combo",
"domain_blacklist_text",
"url_keywords_blacklist_text",

185
tkinter_ui/prefer.py Normal file

@ -0,0 +1,185 @@
import tkinter as tk
from tkinter import ttk
from utils.config import config
class PreferUI:
def init_ui(self, root=None):
"""
Init prefer UI
"""
origin_type_prefer = [
item.lower()
for item in config.get(
"Settings",
"origin_type_prefer",
fallback="hotel,multicast,subscribe,online_search",
).split(",")
]
config_options = [
{"label_text": f"结果来源优先{i+1}:", "combo_box_value": i}
for i in range(len(origin_type_prefer))
]
self.origin_type_prefer_options = []
for config_option in config_options:
option = ConfigOption(root, **config_option)
option.combo_box.bind(
"<<ComboboxSelected>>",
option.update_select,
)
option.entry.bind("<KeyRelease>", option.update_input)
self.origin_type_prefer_options.append(option)
frame_prefer_ipv_type = tk.Frame(root)
frame_prefer_ipv_type.pack(fill=tk.X)
self.prefer_ipv_type_label = tk.Label(
frame_prefer_ipv_type, text="结果协议优先:", width=12
)
self.prefer_ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
self.prefer_ipv_type_combo = ttk.Combobox(frame_prefer_ipv_type)
self.prefer_ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
self.prefer_ipv_type_combo["values"] = ("IPv4", "IPv6", "随机")
ipv_type_prefer = config.get(
"Settings", "ipv_type_prefer", fallback="IPv4"
).lower()
if ipv_type_prefer == "ipv4":
self.prefer_ipv_type_combo.current(0)
elif ipv_type_prefer == "ipv6":
self.prefer_ipv_type_combo.current(1)
else:
self.prefer_ipv_type_combo.current(2)
self.prefer_ipv_type_combo.bind(
"<<ComboboxSelected>>", self.update_ipv_type_prefer
)
self.ipv_type_input = []
for ipv_type in ["ipv4", "ipv6"]:
input = IpvNumInput(root, ipv_type)
input.entry.bind("<KeyRelease>", input.update_input)
self.ipv_type_input.append(input)
def update_ipv_type_prefer(self, event):
config.set(
"Settings",
"ipv_type_prefer",
self.prefer_ipv_type_combo.get(),
)
def change_entry_state(self, state):
for option in self.origin_type_prefer_options:
option.change_state(state)
self.prefer_ipv_type_combo.config(state=state)
for input in self.ipv_type_input:
input.change_state(state)
class IpvNumInput:
def __init__(self, master, ipv_type):
self.master = master
self.ipv_type = ipv_type
self.frame = tk.Frame(master)
self.frame.pack(fill=tk.X)
self.frame_column1 = tk.Frame(self.frame)
self.frame_column1.pack(side=tk.LEFT, fill=tk.Y)
self.frame_column2 = tk.Frame(self.frame)
self.frame_column2.pack(side=tk.RIGHT, fill=tk.Y)
ipv_type_text = "IPv4" if ipv_type == "ipv4" else "IPv6"
self.entry_label = tk.Label(
self.frame_column1, text=f"{ipv_type_text}数量:", width=12
)
self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
self.entry = tk.Entry(self.frame_column1)
self.entry.insert(
0,
config.getint(
"Settings",
f"{ipv_type}_num",
fallback=15,
),
)
self.entry.pack(side=tk.LEFT, padx=4, pady=8)
def update_input(self, event):
config.set(
"Settings",
f"{ self.ipv_type}_num",
self.entry.get(),
)
def change_state(self, state):
self.entry.config(state=state)
class ConfigOption:
def __init__(self, master, label_text, combo_box_value):
self.master = master
self.label_text = label_text
self.combo_box_value = combo_box_value
self.frame = tk.Frame(master)
self.frame.pack(fill=tk.X)
self.column1 = tk.Frame(self.frame)
self.column1.pack(side=tk.LEFT, fill=tk.Y)
self.column2 = tk.Frame(self.frame)
self.column2.pack(side=tk.RIGHT, fill=tk.Y)
self.label = tk.Label(self.column1, text=label_text, width=12)
self.label.pack(side=tk.LEFT, padx=4, pady=8)
self.combo_box = ttk.Combobox(self.column1)
self.origin_type_prefer_obj = {
"酒店源": "hotel",
"组播源": "multicast",
"订阅源": "subscribe",
"在线搜索": "online_search",
}
combo_box_values_name = list(self.origin_type_prefer_obj.keys())
self.combo_box["values"] = combo_box_values_name
self.combo_box.pack(side=tk.LEFT, padx=4, pady=8)
self.combo_box.current(combo_box_value)
self.entry_label = tk.Label(self.column2, text="数量:", width=12)
self.entry_label.pack(side=tk.LEFT, padx=4, pady=8)
self.entry = tk.Entry(self.column2)
self.entry.insert(
0,
config.getint(
"Settings",
f"{self.origin_type_prefer_obj[self.combo_box.get()]}_num",
fallback=10,
),
)
self.entry.pack(side=tk.LEFT, padx=4, pady=8)
def update_select(self, key):
origin_type_prefer_list = [
item.lower()
for item in config.get(
"Settings",
"origin_type_prefer",
fallback="hotel,multicast,subscribe,online_search",
).split(",")
]
origin_type_prefer_list[self.combo_box_value] = self.origin_type_prefer_obj[
self.combo_box.get()
]
config.set(
"Settings",
"origin_type_prefer",
(",").join(origin_type_prefer_list),
)
def update_input(self, event):
config.set(
"Settings",
f"{ self.origin_type_prefer_obj[self.combo_box.get()]}_num",
self.entry.get(),
)
def change_state(self, state):
self.combo_box.config(state=state)
self.entry.config(state=state)

@ -12,6 +12,7 @@ import threading
import webbrowser
from about import AboutUI
from default import DefaultUI
from prefer import PreferUI
from multicast import MulticastUI
from hotel import HotelUI
from subscribe import SubscribeUI
@ -28,6 +29,7 @@ class TkinterUI:
self.version = info.get("version", "")
self.about_ui = AboutUI()
self.default_ui = DefaultUI()
self.prefer_ui = PreferUI()
self.multicast_ui = MulticastUI()
self.hotel_ui = HotelUI()
self.subscribe_ui = SubscribeUI()
@ -84,6 +86,7 @@ class TkinterUI:
def change_state(self, state):
self.default_ui.change_entry_state(state=state)
self.prefer_ui.change_entry_state(state=state)
self.multicast_ui.change_entry_state(state=state)
self.hotel_ui.change_entry_state(state=state)
self.subscribe_ui.change_entry_state(state=state)
@ -148,6 +151,7 @@ class TkinterUI:
notebook.pack(fill="both", padx=10, pady=5)
frame_default = tk.ttk.Frame(notebook)
frame_prefer = tk.ttk.Frame(notebook)
frame_hotel = tk.ttk.Frame(notebook)
frame_multicast = tk.ttk.Frame(notebook)
frame_subscribe = tk.ttk.Frame(notebook)
@ -157,6 +161,10 @@ class TkinterUI:
resource_path("static/images/settings_icon.png")
).resize((16, 16))
settings_icon = ImageTk.PhotoImage(settings_icon_source)
prefer_icon_source = Image.open(
resource_path("static/images/prefer_icon.png")
).resize((16, 16))
prefer_icon = ImageTk.PhotoImage(prefer_icon_source)
hotel_icon_source = Image.open(
resource_path("static/images/hotel_icon.png")
).resize((16, 16))
@ -177,6 +185,7 @@ class TkinterUI:
notebook.add(
frame_default, text="通用设置", image=settings_icon, compound=tk.LEFT
)
notebook.add(frame_prefer, text="偏好设置", image=prefer_icon, compound=tk.LEFT)
notebook.add(frame_hotel, text="酒店源", image=hotel_icon, compound=tk.LEFT)
notebook.add(
frame_multicast, text="组播源", image=multicast_icon, compound=tk.LEFT
@ -192,12 +201,14 @@ class TkinterUI:
)
notebook.settings_icon = settings_icon
notebook.prefer_icon = prefer_icon
notebook.hotel_icon = hotel_icon
notebook.multicast_icon = multicast_icon
notebook.subscribe_icon = subscribe_icon
notebook.online_search_icon = online_search_icon
self.default_ui.init_ui(frame_default)
self.prefer_ui.init_ui(frame_prefer)
self.multicast_ui.init_ui(frame_multicast)
self.hotel_ui.init_ui(frame_hotel)
self.subscribe_ui.init_ui(frame_subscribe)

@ -1,7 +1,7 @@
# -*- mode: python ; coding: utf-8 -*-
a = Analysis(
['tkinter_ui.py', 'about.py', 'default.py', 'multicast.py', 'hotel.py', 'subscribe.py', 'online_search.py'],
['tkinter_ui.py', 'about.py', 'default.py', 'prefer.py', 'multicast.py', 'hotel.py', 'subscribe.py', 'online_search.py'],
pathex=[],
binaries=[],
datas=[
@ -20,6 +20,7 @@ a = Analysis(
('../static/images/online_search_icon.png', 'static/images'),
('about.py', '.'),
('default.py', '.'),
('prefer.py', '.'),
('multicast.py', '.'),
('hotel.py', '.'),
('subscribe.py', '.'),

@ -168,12 +168,14 @@ def get_total_urls_from_info_list(infoList):
if not origin or origin.lower() not in origin_type_prefer:
continue
if ipv_type_prefer == "ipv6" and "IPv6" in url:
if (("ipv6" in ipv_type_prefer) or "随机" in ipv_type_prefer) and "IPv6" in url:
categorized_urls[origin]["ipv6"].append(url)
else:
categorized_urls[origin]["ipv4"].append(url)
total_urls = []
if "随机" in ipv_type_prefer:
ipv_type_prefer = ["ipv4", "ipv6"]
for origin in origin_type_prefer:
for ipv_type in ipv_type_prefer:
total_urls.extend(