diff --git a/app.py b/app.py index 41a9be5b..212371c6 100644 --- a/app.py +++ b/app.py @@ -37,7 +37,7 @@ def robust_download(url, ua, max_retries=3): if attempt == max_retries - 1: print(f"❌ 无法下载: {url}. 错误: {str(e)}") return None - print(f"正在重试 {url} (第 {attempt+1} 次)") + print(f"正在重试 {url} (第 {attempt + 1} 次)") def process_channel(line): if any(f'group-title="{g}"' in line for g in DELETE_GROUPS): @@ -56,9 +56,9 @@ def process_channel(line): for char in DELETE_CHARS: line = line.replace(char, "") - + line = re.sub(r'cctv-?', 'CCTV', line, flags=re.IGNORECASE) - + return line def parse_m3u(content): @@ -96,21 +96,24 @@ def generate_m3u_output(channels): return "\n".join(output) def generate_txt_output(channels): - """ - Generates a plain text output for the given channels. - Each channel will be written in the format: "Channel Name: URL". - """ - output_lines = [] + group_dict = defaultdict(list) for channel in channels: - # Extract channel name from metadata - if match := re.search(r'tvg-name="([^"]+)"', channel["meta"]): - channel_name = match.group(1) + if match_name := re.search(r'tvg-name="([^"]+)"', channel["meta"]): + channel_name = match_name.group(1) else: channel_name = "Unknown Channel" - - # Append formatted line to output - output_lines.append(f"{channel_name}: {channel['url']}") - + if match_group := re.search(r'group-title="([^"]+)"', channel["meta"]): + group_name = match_group.group(1) + else: + group_name = "Unknown Group" + group_dict[group_name].append(f"{channel_name}: {channel['url']}") + + output_lines = [] + for group, channel_list in group_dict.items(): + output_lines.append(f"{group}:") + for channel in channel_list: + output_lines.append(f" {channel}") + output_lines.append("") return "\n".join(output_lines) def save_file(content, filename): @@ -129,21 +132,20 @@ def save_file(content, filename): def main(): all_channels = [] - + print("开始下载和处理数据源...") for source in M3U_SOURCES: content = robust_download(source["url"], source["ua"]) if not content: print(f"[×] {source['name']} 无法处理,跳过") continue - + channels = parse_m3u(content) processed = [] for ch in channels: - # 修复: 检查 "meta" 键是否存在 - if "meta" in ch and (cleaned_meta := process_channel(ch["meta"])): + if cleaned_meta := process_channel(ch["meta"]): processed.append({"meta": cleaned_meta, "url": ch["url"]}) - + all_channels.extend(processed) print(f"[✓] {source['name']} 处理完成 ({len(processed)} 频道)") @@ -157,8 +159,9 @@ def main(): txt_content = generate_txt_output(all_channels) save_file(txt_content, "live.txt") - + print(f"\n处理完成!有效频道总数: {len(all_channels)}") if __name__ == "__main__": main() +