path = 'D:\\proj\\videoconvert\\video_pipeline.py' content = open(path, 'r', encoding='utf-8').read() old_func = '''def generate_playlist_txt( output_dir: str | Path, url_prefix: str = \"http://192.168.10.32:2088\", ) -> list[Path]: \"\"\"Scan output_dir for series folders, generate playlist txt files. For each series, scans episode subdirs for m3u8 files and generates: series_name + episode_name,url_prefix/series_folder/episode_folder/m3u8_file One txt per series, placed in output_dir/.\"\"\" output = Path(output_dir) if not output.is_dir(): return [] created: list[Path] = [] for series_dir in sorted(output.iterdir(), key=lambda f: natural_sort_key(f.name)): if not series_dir.is_dir(): continue lines: list[str] = [] episode_dirs = sorted( [d for d in series_dir.iterdir() if d.is_dir()], key=lambda d: natural_sort_key(d.name), ) for ep_dir in episode_dirs: m3u8_files = sorted(ep_dir.glob(\"*.m3u8\")) if not m3u8_files: continue m3u8_name = m3u8_files[0].name display_name = series_dir.name + ep_dir.name url = f\"{url_prefix}/{series_dir.name}/{ep_dir.name}/{m3u8_name}\" lines.append(f\"{display_name},{url}\\n\") if not lines: continue txt_path = output / f\"{series_dir.name}_playlist.txt\" txt_path.write_text(\"\".join(lines), encoding=\"utf-8\") created.append(txt_path) return created''' new_func = '''def generate_playlist_txt( output_dir: str | Path, url_prefix: str = \"http://192.168.10.32:2088\", ) -> list[Path]: \"\"\"Scan output_dir for series folders, generate playlist txt files. Supports both flat mode (m3u8 in series dir) and episode folder mode. One txt per series, placed in output_dir/.\"\"\" output = Path(output_dir) if not output.is_dir(): return [] created: list[Path] = [] for series_dir in sorted(output.iterdir(), key=lambda f: natural_sort_key(f.name)): if not series_dir.is_dir(): continue lines: list[str] = [] # Flat mode: m3u8 files directly in series dir flat_m3u8 = sorted(series_dir.glob(\"*.m3u8\"), key=lambda f: natural_sort_key(f.stem)) if flat_m3u8: for m3u8_file in flat_m3u8: ep_name = m3u8_file.stem display_name = series_dir.name + ep_name url = f\"{url_prefix}/{series_dir.name}/{m3u8_file.name}\" lines.append(f\"{display_name},{url}\\n\") else: # Episode folder mode: m3u8 files in subdirectories episode_dirs = sorted( [d for d in series_dir.iterdir() if d.is_dir()], key=lambda d: natural_sort_key(d.name), ) for ep_dir in episode_dirs: m3u8_files = sorted(ep_dir.glob(\"*.m3u8\")) if not m3u8_files: continue m3u8_name = m3u8_files[0].name display_name = series_dir.name + ep_dir.name url = f\"{url_prefix}/{series_dir.name}/{ep_dir.name}/{m3u8_name}\" lines.append(f\"{display_name},{url}\\n\") if not lines: continue txt_path = output / f\"{series_dir.name}_playlist.txt\" txt_path.write_text(\"\".join(lines), encoding=\"utf-8\") created.append(txt_path) return created''' if old_func in content: content = content.replace(old_func, new_func) open(path, 'w', encoding='utf-8').write(content) print('Replaced OK') else: print('Old function not found - checking around line 735') lines = content.split('\\n') for i in range(730, min(770, len(lines))): print(f'{i+1}: {repr(lines[i][:120])}')