default.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. import tkinter as tk
  2. from utils.config import config
  3. from tkinter import ttk
  4. from tkinter import scrolledtext
  5. from tkinter import filedialog
  6. import os
  7. class DefaultUI:
  8. def init_ui(self, root):
  9. """
  10. Init default UI
  11. """
  12. frame_default_open_update = tk.Frame(root)
  13. frame_default_open_update.pack(fill=tk.X)
  14. frame_default_open_update_column1 = tk.Frame(frame_default_open_update)
  15. frame_default_open_update_column1.pack(side=tk.LEFT, fill=tk.Y)
  16. frame_default_open_update_column2 = tk.Frame(frame_default_open_update)
  17. frame_default_open_update_column2.pack(side=tk.RIGHT, fill=tk.Y)
  18. self.open_update_label = tk.Label(
  19. frame_default_open_update_column1, text="开启更新:", width=8
  20. )
  21. self.open_update_label.pack(side=tk.LEFT, padx=4, pady=8)
  22. self.open_update_var = tk.BooleanVar(
  23. value=config.getboolean("Settings", "open_update", fallback=True)
  24. )
  25. self.open_update_checkbutton = ttk.Checkbutton(
  26. frame_default_open_update_column1,
  27. variable=self.open_update_var,
  28. onvalue=True,
  29. offvalue=False,
  30. command=self.update_open_update,
  31. text="(关闭则只运行结果页面服务)",
  32. )
  33. self.open_update_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  34. self.open_use_old_result_label = tk.Label(
  35. frame_default_open_update_column2, text="使用历史结果:", width=12
  36. )
  37. self.open_use_old_result_label.pack(side=tk.LEFT, padx=4, pady=8)
  38. self.open_use_old_result_var = tk.BooleanVar(
  39. value=config.getboolean("Settings", "open_use_old_result", fallback=True)
  40. )
  41. self.open_use_old_result_checkbutton = ttk.Checkbutton(
  42. frame_default_open_update_column2,
  43. variable=self.open_use_old_result_var,
  44. onvalue=True,
  45. offvalue=False,
  46. command=self.update_open_use_old_result,
  47. text="(保留上次更新可用结果)",
  48. )
  49. self.open_use_old_result_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  50. frame_default_source_file = tk.Frame(root)
  51. frame_default_source_file.pack(fill=tk.X)
  52. frame_default_source_file_column1 = tk.Frame(frame_default_source_file)
  53. frame_default_source_file_column1.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
  54. frame_default_source_file_column2 = tk.Frame(frame_default_source_file)
  55. frame_default_source_file_column2.pack(side=tk.RIGHT, fill=tk.Y)
  56. self.source_file_label = tk.Label(
  57. frame_default_source_file_column1, text="模板文件:", width=8
  58. )
  59. self.source_file_entry = tk.Entry(frame_default_source_file_column1)
  60. self.source_file_label.pack(side=tk.LEFT, padx=4, pady=8)
  61. self.source_file_entry.pack(fill=tk.X, padx=4, expand=True)
  62. self.source_file_entry.insert(
  63. 0, config.get("Settings", "source_file", fallback="config/demo.txt")
  64. )
  65. self.source_file_button = tk.ttk.Button(
  66. frame_default_source_file_column2,
  67. text="选择文件",
  68. command=self.select_source_file,
  69. )
  70. self.source_file_button.pack(side=tk.LEFT, padx=4, pady=0)
  71. frame_default_final_file = tk.Frame(root)
  72. frame_default_final_file.pack(fill=tk.X)
  73. frame_default_final_file_column1 = tk.Frame(frame_default_final_file)
  74. frame_default_final_file_column1.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
  75. frame_default_final_file_column2 = tk.Frame(frame_default_final_file)
  76. frame_default_final_file_column2.pack(side=tk.RIGHT, fill=tk.Y)
  77. self.final_file_label = tk.Label(
  78. frame_default_final_file_column1, text="结果文件:", width=8
  79. )
  80. self.final_file_entry = tk.Entry(frame_default_final_file_column1)
  81. self.final_file_label.pack(side=tk.LEFT, padx=4, pady=8)
  82. self.final_file_entry.pack(fill=tk.X, padx=4, expand=True)
  83. self.final_file_entry.insert(
  84. 0, config.get("Settings", "final_file", fallback="output/result.txt")
  85. )
  86. self.final_file_button = tk.ttk.Button(
  87. frame_default_final_file_column2,
  88. text="选择文件",
  89. command=self.select_final_file,
  90. )
  91. self.final_file_button.pack(side=tk.LEFT, padx=4, pady=0)
  92. frame_default_mode = tk.Frame(root)
  93. frame_default_mode.pack(fill=tk.X)
  94. frame_default_mode_params_column1 = tk.Frame(frame_default_mode)
  95. frame_default_mode_params_column1.pack(side=tk.LEFT, fill=tk.Y)
  96. frame_default_mode_params_column2 = tk.Frame(frame_default_mode)
  97. frame_default_mode_params_column2.pack(side=tk.RIGHT, fill=tk.Y)
  98. self.open_driver_label = tk.Label(
  99. frame_default_mode_params_column1, text="浏览器模式:", width=12
  100. )
  101. self.open_driver_label.pack(side=tk.LEFT, padx=4, pady=8)
  102. self.open_driver_var = tk.BooleanVar(
  103. value=config.getboolean("Settings", "open_driver", fallback=True)
  104. )
  105. self.open_driver_checkbutton = ttk.Checkbutton(
  106. frame_default_mode_params_column1,
  107. variable=self.open_driver_var,
  108. onvalue=True,
  109. offvalue=False,
  110. command=self.update_open_driver,
  111. text="(若获取更新异常请开启)",
  112. )
  113. self.open_driver_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  114. self.open_proxy_label = tk.Label(
  115. frame_default_mode_params_column2, text="开启代理:", width=12
  116. )
  117. self.open_proxy_label.pack(side=tk.LEFT, padx=4, pady=8)
  118. self.open_proxy_var = tk.BooleanVar(
  119. value=config.getboolean("Settings", "open_proxy", fallback=False)
  120. )
  121. self.open_proxy_checkbutton = ttk.Checkbutton(
  122. frame_default_mode_params_column2,
  123. variable=self.open_proxy_var,
  124. onvalue=True,
  125. offvalue=False,
  126. command=self.update_open_proxy,
  127. text="(通过代理进行更新)",
  128. )
  129. self.open_proxy_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  130. frame_default_channel = tk.Frame(root)
  131. frame_default_channel.pack(fill=tk.X)
  132. frame_default_channel_column1 = tk.Frame(frame_default_channel)
  133. frame_default_channel_column1.pack(side=tk.LEFT, fill=tk.Y)
  134. frame_default_channel_column2 = tk.Frame(frame_default_channel)
  135. frame_default_channel_column2.pack(side=tk.RIGHT, fill=tk.Y)
  136. self.urls_limit_label = tk.Label(
  137. frame_default_channel_column1, text="频道接口数量:", width=12
  138. )
  139. self.urls_limit_label.pack(side=tk.LEFT, padx=4, pady=8)
  140. self.urls_limit_entry = tk.Entry(frame_default_channel_column1)
  141. self.urls_limit_entry.pack(side=tk.LEFT, padx=4, pady=8)
  142. self.urls_limit_entry.insert(
  143. 15, config.getint("Settings", "urls_limit", fallback=30)
  144. )
  145. self.urls_limit_entry.bind("<KeyRelease>", self.update_urls_limit)
  146. self.ipv_type_label = tk.Label(
  147. frame_default_channel_column2, text="接口协议类型:", width=12
  148. )
  149. self.ipv_type_label.pack(side=tk.LEFT, padx=4, pady=8)
  150. self.ipv_type_combo = ttk.Combobox(frame_default_channel_column2)
  151. self.ipv_type_combo.pack(side=tk.LEFT, padx=4, pady=8)
  152. self.ipv_type_combo["values"] = ("IPv4", "IPv6", "全部")
  153. ipv_type = config.get("Settings", "ipv_type", fallback="全部").lower()
  154. if ipv_type == "ipv4":
  155. self.ipv_type_combo.current(0)
  156. elif ipv_type == "ipv6":
  157. self.ipv_type_combo.current(1)
  158. else:
  159. self.ipv_type_combo.current(2)
  160. self.ipv_type_combo.bind("<<ComboboxSelected>>", self.update_ipv_type)
  161. frame_default_sort = tk.Frame(root)
  162. frame_default_sort.pack(fill=tk.X)
  163. frame_default_sort_column1 = tk.Frame(frame_default_sort)
  164. frame_default_sort_column1.pack(side=tk.LEFT, fill=tk.Y)
  165. frame_default_sort_column2 = tk.Frame(frame_default_sort)
  166. frame_default_sort_column2.pack(side=tk.LEFT, fill=tk.Y)
  167. frame_default_sort_column3 = tk.Frame(frame_default_sort)
  168. frame_default_sort_column3.pack(side=tk.RIGHT, fill=tk.Y)
  169. self.open_keep_all_label = tk.Label(
  170. frame_default_sort_column1, text="保留模式:", width=12
  171. )
  172. self.open_keep_all_label.pack(side=tk.LEFT, padx=4, pady=8)
  173. self.open_keep_all_var = tk.BooleanVar(
  174. value=config.getboolean("Settings", "open_keep_all", fallback=False)
  175. )
  176. self.open_keep_all_checkbutton = ttk.Checkbutton(
  177. frame_default_sort_column1,
  178. variable=self.open_keep_all_var,
  179. onvalue=True,
  180. offvalue=False,
  181. command=self.update_open_keep_all,
  182. text="(非严格匹配)",
  183. )
  184. self.open_keep_all_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  185. self.open_sort_label = tk.Label(
  186. frame_default_sort_column2, text="测速排序:", width=12
  187. )
  188. self.open_sort_label.pack(side=tk.LEFT, padx=4, pady=8)
  189. self.open_sort_var = tk.BooleanVar(
  190. value=config.getboolean("Settings", "open_sort", fallback=True)
  191. )
  192. self.open_sort_checkbutton = ttk.Checkbutton(
  193. frame_default_sort_column2,
  194. variable=self.open_sort_var,
  195. onvalue=True,
  196. offvalue=False,
  197. command=self.update_open_sort,
  198. )
  199. self.open_sort_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  200. self.sort_timeout_label = tk.Label(
  201. frame_default_sort_column3, text="测速超时:", width=12
  202. )
  203. self.sort_timeout_label.pack(side=tk.LEFT, padx=4, pady=8)
  204. self.sort_timeout_entry = tk.Entry(frame_default_sort_column3)
  205. self.sort_timeout_entry.pack(side=tk.LEFT, padx=4, pady=8)
  206. self.sort_timeout_entry.insert(
  207. 0, config.getint("Settings", "sort_timeout", fallback=5)
  208. )
  209. self.sort_timeout_entry.bind("<KeyRelease>", self.update_sort_timeout)
  210. frame_default_sort_mode = tk.Frame(root)
  211. frame_default_sort_mode.pack(fill=tk.X)
  212. frame_default_sort_mode_column1 = tk.Frame(frame_default_sort_mode)
  213. frame_default_sort_mode_column1.pack(side=tk.LEFT, fill=tk.Y)
  214. frame_default_sort_mode_column2 = tk.Frame(frame_default_sort_mode)
  215. frame_default_sort_mode_column2.pack(side=tk.RIGHT, fill=tk.Y)
  216. self.open_ffmpeg_label = tk.Label(
  217. frame_default_sort_mode_column1, text="FFmpeg测速:", width=12
  218. )
  219. self.open_ffmpeg_label.pack(side=tk.LEFT, padx=4, pady=8)
  220. self.open_ffmpeg_var = tk.BooleanVar(
  221. value=config.getboolean("Settings", "open_ffmpeg", fallback=True)
  222. )
  223. self.open_ffmpeg_checkbutton = ttk.Checkbutton(
  224. frame_default_sort_mode_column1,
  225. variable=self.open_ffmpeg_var,
  226. onvalue=True,
  227. offvalue=False,
  228. command=self.update_open_ffmpeg,
  229. text="(需要手动安装)",
  230. )
  231. self.open_ffmpeg_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  232. self.open_m3u_result_label = tk.Label(
  233. frame_default_sort_mode_column2, text="M3U转换:", width=12
  234. )
  235. self.open_m3u_result_label.pack(side=tk.LEFT, padx=4, pady=8)
  236. self.open_m3u_result_var = tk.BooleanVar(
  237. value=config.getboolean("Settings", "open_m3u_result", fallback=True)
  238. )
  239. self.open_m3u_result_checkbutton = ttk.Checkbutton(
  240. frame_default_sort_mode_column2,
  241. variable=self.open_m3u_result_var,
  242. onvalue=True,
  243. offvalue=False,
  244. command=self.update_open_m3u_result,
  245. text="(支持频道图标)",
  246. )
  247. self.open_m3u_result_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  248. frame_default_resolution_params = tk.Frame(root)
  249. frame_default_resolution_params.pack(fill=tk.X)
  250. frame_default_resolution_params_column1 = tk.Frame(
  251. frame_default_resolution_params
  252. )
  253. frame_default_resolution_params_column1.pack(side=tk.LEFT, fill=tk.Y)
  254. frame_default_resolution_params_column2 = tk.Frame(
  255. frame_default_resolution_params
  256. )
  257. frame_default_resolution_params_column2.pack(side=tk.RIGHT, fill=tk.Y)
  258. self.open_filter_resolution_label = tk.Label(
  259. frame_default_resolution_params_column1, text="分辨率过滤:", width=12
  260. )
  261. self.open_filter_resolution_label.pack(side=tk.LEFT, padx=4, pady=8)
  262. self.open_filter_resolution_var = tk.BooleanVar(
  263. value=config.getboolean("Settings", "open_filter_resolution", fallback=True)
  264. )
  265. self.open_filter_resolution_checkbutton = ttk.Checkbutton(
  266. frame_default_resolution_params_column1,
  267. variable=self.open_filter_resolution_var,
  268. onvalue=True,
  269. offvalue=False,
  270. command=self.update_open_filter_resolution,
  271. text="(低于最小分辨率将被过滤)",
  272. )
  273. self.open_filter_resolution_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  274. self.min_resolution_label = tk.Label(
  275. frame_default_resolution_params_column2, text="最小分辨率:", width=12
  276. )
  277. self.min_resolution_label.pack(side=tk.LEFT, padx=4, pady=8)
  278. self.min_resolution_entry = tk.Entry(frame_default_resolution_params_column2)
  279. self.min_resolution_entry.pack(side=tk.LEFT, padx=4, pady=8)
  280. self.min_resolution_entry.insert(
  281. 0, config.get("Settings", "min_resolution", fallback="1920x1080")
  282. )
  283. self.min_resolution_entry.bind("<KeyRelease>", self.update_min_resolution)
  284. frame_default_sort_params = tk.Frame(root)
  285. frame_default_sort_params.pack(fill=tk.X)
  286. frame_default_sort_params_column1 = tk.Frame(frame_default_sort_params)
  287. frame_default_sort_params_column1.pack(side=tk.LEFT, fill=tk.Y)
  288. frame_default_sort_params_column2 = tk.Frame(frame_default_sort_params)
  289. frame_default_sort_params_column2.pack(side=tk.RIGHT, fill=tk.Y)
  290. self.response_time_weight_label = tk.Label(
  291. frame_default_sort_params_column1, text="响应时间权重:", width=12
  292. )
  293. self.response_time_weight_label.pack(side=tk.LEFT, padx=4, pady=8)
  294. self.response_time_weight_scale = tk.Scale(
  295. frame_default_sort_params_column1,
  296. from_=0,
  297. to=1,
  298. orient=tk.HORIZONTAL,
  299. resolution=0.1,
  300. command=self.update_response_time_weight,
  301. )
  302. self.response_time_weight_scale.pack(side=tk.LEFT, padx=4, pady=8)
  303. self.response_time_weight_scale.set(
  304. config.getfloat("Settings", "response_time_weight", fallback=0.5)
  305. )
  306. self.resolution_weight_label = tk.Label(
  307. frame_default_sort_params_column2, text="分辨率权重:", width=12
  308. )
  309. self.resolution_weight_label.pack(side=tk.LEFT, padx=4, pady=8)
  310. self.resolution_weight_scale = tk.Scale(
  311. frame_default_sort_params_column2,
  312. from_=0,
  313. to=1,
  314. orient=tk.HORIZONTAL,
  315. resolution=0.1,
  316. command=self.update_resolution_weight,
  317. )
  318. self.resolution_weight_scale.pack(side=tk.LEFT, padx=4, pady=8)
  319. self.resolution_weight_scale.set(
  320. config.getfloat("Settings", "resolution_weight", fallback=0.5)
  321. )
  322. frame_default_open_update_info = tk.Frame(root)
  323. frame_default_open_update_info.pack(fill=tk.X)
  324. frame_default_open_update_info_column1 = tk.Frame(
  325. frame_default_open_update_info
  326. )
  327. frame_default_open_update_info_column1.pack(side=tk.LEFT, fill=tk.Y)
  328. frame_default_open_update_info_column2 = tk.Frame(
  329. frame_default_open_update_info
  330. )
  331. frame_default_open_update_info_column2.pack(side=tk.RIGHT, fill=tk.Y)
  332. self.open_update_time_label = tk.Label(
  333. frame_default_open_update_info_column1, text="显示更新时间:", width=12
  334. )
  335. self.open_update_time_label.pack(side=tk.LEFT, padx=4, pady=8)
  336. self.open_update_time_var = tk.BooleanVar(
  337. value=config.getboolean("Settings", "open_update_time", fallback=True)
  338. )
  339. self.open_update_time_checkbutton = ttk.Checkbutton(
  340. frame_default_open_update_info_column1,
  341. variable=self.open_update_time_var,
  342. onvalue=True,
  343. offvalue=False,
  344. command=self.update_open_update_time,
  345. text="(结果顶部显示)",
  346. )
  347. self.open_update_time_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  348. self.open_url_info_label = tk.Label(
  349. frame_default_open_update_info_column2, text="显示接口信息:", width=12
  350. )
  351. self.open_url_info_label.pack(side=tk.LEFT, padx=4, pady=8)
  352. self.open_url_info_var = tk.BooleanVar(
  353. value=config.getboolean("Settings", "open_url_info", fallback=True)
  354. )
  355. self.open_url_info_checkbutton = ttk.Checkbutton(
  356. frame_default_open_update_info_column2,
  357. variable=self.open_url_info_var,
  358. onvalue=True,
  359. offvalue=False,
  360. command=self.update_open_url_info,
  361. text="(需要播放器支持)",
  362. )
  363. self.open_url_info_checkbutton.pack(side=tk.LEFT, padx=4, pady=8)
  364. frame_default_domain_blacklist = tk.Frame(root)
  365. frame_default_domain_blacklist.pack(fill=tk.X)
  366. self.domain_blacklist_label = tk.Label(
  367. frame_default_domain_blacklist, text="域名黑名单:", width=12
  368. )
  369. self.domain_blacklist_label.pack(side=tk.LEFT, padx=4, pady=8)
  370. self.domain_blacklist_text = scrolledtext.ScrolledText(
  371. frame_default_domain_blacklist, height=2
  372. )
  373. self.domain_blacklist_text.pack(
  374. side=tk.LEFT, padx=4, pady=8, expand=True, fill=tk.BOTH
  375. )
  376. self.domain_blacklist_text.insert(
  377. tk.END, config.get("Settings", "domain_blacklist", fallback="")
  378. )
  379. self.domain_blacklist_text.bind("<KeyRelease>", self.update_domain_blacklist)
  380. frame_default_url_keywords_blacklist = tk.Frame(root)
  381. frame_default_url_keywords_blacklist.pack(fill=tk.X)
  382. self.url_keywords_blacklist_label = tk.Label(
  383. frame_default_url_keywords_blacklist, text="关键字黑名单:", width=12
  384. )
  385. self.url_keywords_blacklist_label.pack(side=tk.LEFT, padx=4, pady=8)
  386. self.url_keywords_blacklist_text = scrolledtext.ScrolledText(
  387. frame_default_url_keywords_blacklist, height=2
  388. )
  389. self.url_keywords_blacklist_text.pack(
  390. side=tk.LEFT, padx=4, pady=8, expand=True, fill=tk.BOTH
  391. )
  392. self.url_keywords_blacklist_text.insert(
  393. tk.END, config.get("Settings", "url_keywords_blacklist", fallback="")
  394. )
  395. self.url_keywords_blacklist_text.bind(
  396. "<KeyRelease>", self.update_url_keywords_blacklist
  397. )
  398. def update_open_update(self):
  399. config.set("Settings", "open_update", str(self.open_update_var.get()))
  400. def update_open_use_old_result(self):
  401. config.set(
  402. "Settings", "open_use_old_result", str(self.open_use_old_result_var.get())
  403. )
  404. def select_source_file(self):
  405. filepath = filedialog.askopenfilename(
  406. initialdir=os.getcwd(), title="选择模板文件", filetypes=[("txt", "*.txt")]
  407. )
  408. if filepath:
  409. self.source_file_entry.delete(0, tk.END)
  410. self.source_file_entry.insert(0, filepath)
  411. config.set("Settings", "source_file", filepath)
  412. def select_final_file(self):
  413. filepath = filedialog.askopenfilename(
  414. initialdir=os.getcwd(), title="选择结果文件", filetypes=[("txt", "*.txt")]
  415. )
  416. if filepath:
  417. self.final_file_entry.delete(0, tk.END)
  418. self.final_file_entry.insert(0, filepath)
  419. config.set("Settings", "final_file", filepath)
  420. def update_open_driver(self):
  421. config.set("Settings", "open_driver", str(self.open_driver_var.get()))
  422. def update_open_proxy(self):
  423. config.set("Settings", "open_proxy", str(self.open_proxy_var.get()))
  424. def update_open_keep_all(self):
  425. config.set("Settings", "open_keep_all", str(self.open_keep_all_var.get()))
  426. def update_open_sort(self):
  427. config.set("Settings", "open_sort", str(self.open_sort_var.get()))
  428. def update_sort_timeout(self):
  429. config.set("Settings", "sort_timeout", self.sort_timeout_entry.get())
  430. def update_open_ffmpeg(self):
  431. config.set("Settings", "open_ffmpeg", str(self.open_ffmpeg_var.get()))
  432. def update_open_m3u_result(self):
  433. config.set("Settings", "open_m3u_result", str(self.open_m3u_result_var.get()))
  434. def update_open_filter_resolution(self):
  435. config.set(
  436. "Settings",
  437. "open_filter_resolution",
  438. str(self.open_filter_resolution_var.get()),
  439. )
  440. def update_min_resolution(self, event):
  441. config.set("Settings", "min_resolution", self.min_resolution_entry.get())
  442. def update_urls_limit(self, event):
  443. config.set("Settings", "urls_limit", self.urls_limit_entry.get())
  444. def update_response_time_weight(self, event):
  445. weight1 = self.response_time_weight_scale.get()
  446. weight2 = 1 - weight1
  447. self.resolution_weight_scale.set(weight2)
  448. config.set("Settings", "response_time_weight", str(weight1))
  449. config.set("Settings", "resolution_weight", str(weight2))
  450. def update_resolution_weight(self, event):
  451. weight1 = self.resolution_weight_scale.get()
  452. weight2 = 1 - weight1
  453. self.response_time_weight_scale.set(weight2)
  454. config.set("Settings", "resolution_weight", str(weight1))
  455. config.set("Settings", "response_time_weight", str(weight2))
  456. def update_open_update_time(self):
  457. config.set("Settings", "open_update_time", str(self.open_update_time_var.get()))
  458. def update_open_url_info(self):
  459. config.set("Settings", "open_url_info", str(self.open_url_info_var.get()))
  460. def update_ipv_type(self, event):
  461. config.set("Settings", "ipv_type", self.ipv_type_combo.get())
  462. def update_url_keywords_blacklist(self, event):
  463. config.set(
  464. "Settings",
  465. "url_keywords_blacklist",
  466. self.url_keywords_blacklist_text.get(1.0, tk.END),
  467. )
  468. def update_domain_blacklist(self, event):
  469. config.set(
  470. "Settings",
  471. "domain_blacklist",
  472. self.domain_blacklist_text.get(1.0, tk.END),
  473. )
  474. def update_url_keywords_blacklist(self, event):
  475. config.set(
  476. "Settings",
  477. "url_keywords_blacklist",
  478. self.url_keywords_blacklist_text.get(1.0, tk.END),
  479. )
  480. def change_entry_state(self, state):
  481. for entry in [
  482. "open_update_checkbutton",
  483. "open_use_old_result_checkbutton",
  484. "open_driver_checkbutton",
  485. "open_proxy_checkbutton",
  486. "source_file_entry",
  487. "source_file_button",
  488. "final_file_entry",
  489. "final_file_button",
  490. "open_keep_all_checkbutton",
  491. "open_sort_checkbutton",
  492. "sort_timeout_entry",
  493. "open_ffmpeg_checkbutton",
  494. "open_m3u_result_checkbutton",
  495. "open_filter_resolution_checkbutton",
  496. "min_resolution_entry",
  497. "urls_limit_entry",
  498. "response_time_weight_scale",
  499. "resolution_weight_scale",
  500. "open_update_time_checkbutton",
  501. "open_url_info_checkbutton",
  502. "ipv_type_combo",
  503. "domain_blacklist_text",
  504. "url_keywords_blacklist_text",
  505. ]:
  506. getattr(self, entry).config(state=state)