def _extract_psch_and_pkey(m3u8_text): """Return (psch_version, pkey) from #EXT-X-MOUFLON:PSCH line if present.""" for line in m3u8_text.splitlines(): l = line.strip() if not l: continue if l.upper().startswith('#EXT-X-MOUFLON:PSCH'): parts = l.split(':', 3) version = parts[2].lower() if len(parts) > 2 else '' pkey = parts[3] if len(parts) > 3 else '' return version, pkey return '', ''
def _extract_psch_and_pkey(m3u8_text): """Return (psch_version, pkey) from #EXT-X-MOUFLON:PSCH line if present.""" last_version = '' last_pkey = '' for line in m3u8_text.splitlines(): l = line.strip() if not l: continue if l.upper().startswith('#EXT-X-MOUFLON:PSCH'): parts = l.split(':', 3) version = parts[2].lower() if len(parts) > 2 else '' pkey = parts[3] if len(parts) > 3 else '' last_version = version last_pkey = pkey return last_version, last_pkey
import os, re, sys from collections import OrderedDict def extract_base_before_date(name_with_ext: str) -> str: name = os.path.splitext(os.path.basename(name_with_ext))[0] m = re.search(r'\d{4}[-_.]\d{2}[-_.]\d{2}', name) if m: return name[:m.start()].strip('-_. ') return name def normalize_key(s: str) -> str: return re.sub(r'[\W_]+', '', s).lower() def build_from_links(links_path: str, mp4_folder: str = None): # если mp4-folder указан, собрать возможные display-имена оттуда (приоритет) mp4_display = {} if mp4_folder and os.path.isdir(mp4_folder): for fn in sorted(os.listdir(mp4_folder)): if fn.lower().endswith('.mp4'): base = extract_base_before_date(fn) key = normalize_key(base) if key not in mp4_display: mp4_display[key] = base data = OrderedDict() with open(links_path, 'r', encoding='utf-8') as f: for raw in f: line = raw.strip() if not line: continue m = re.search(r'\[img\](.*?)\[\/img\]', line, re.IGNORECASE) if not m: continue url = m.group(1).strip() filename = os.path.basename(url) base = extract_base_before_date(filename) key = normalize_key(base) if key not in data: display = mp4_display.get(key, base) data[key] = {'display': display, 'links': []} data[key]['links'].append(f"[img]{url}[/img]") return data def write_post2(data_odict: OrderedDict, output_path: str): total_nicks = len(data_odict) lines = [] lines.append(f"[spoiler={total_nicks} nicknames]") lines.append("") singles = [] multis = [] for key, v in data_odict.items(): if len(v['links']) <= 1: singles.append(v) else: multis.append(v) # одиночные — по 3 в строку for i in range(0, len(singles), 3): group = singles[i:i+3] names_line = " _________ ".join(f"[b]{e['display']}[/b]" for e in group) lines.append(names_line) # ссылки: для каждого ника — свои ссылки (обычно 1) links_line = " ".join(" ".join(e['links']) for e in group) lines.append(links_line) lines.append("") # пустая строка между блоками lines.append("") # в примере между блоками две пустые строки for e in multis: lines.append(f"[b]{e['display']}[/b]") lines.append(" ".join(e['links'])) lines.append("") lines.append("") lines.append("-------") lines.append("") lines.append("[/spoiler]") with open(output_path, 'w', encoding='utf-8') as f: f.write("\n".join(lines)) print(f"Wrote {output_path}") if __name__ == "__main__": folder = sys.argv[1] if len(sys.argv) > 1 else "." links_file = os.path.join(folder, "links.txt") if not os.path.exists(links_file): print("Не найден links.txt в", folder) sys.exit(1) data = build_from_links(links_file, mp4_folder=folder) out_path = os.path.join(folder, "post2.txt") write_post2(data, out_path)
Вчера, 19:37
Вчера, 17:59
Вчера, 08:54
Вчера, 02:47
Вчера, 01:02
6 марта 2026 22:43
6 марта 2026 11:33
6 марта 2026 11:24
6 марта 2026 11:19
6 марта 2026 00:12
5 марта 2026 17:31
5 марта 2026 13:39
5 марта 2026 10:25
5 марта 2026 05:46
25 февраля 2026 18:39
19 февраля 2026 20:48
16 февраля 2026 15:27
14 февраля 2026 16:33
5 февраля 2026 01:07
3 февраля 2026 18:18
20 января 2026 21:11
20 января 2026 16:37
20 января 2026 10:47
19 января 2026 00:38
15 января 2026 22:17
15 января 2026 18:49
14 января 2026 02:49
12 января 2026 23:18
4 января 2026 09:47
3 января 2026 14:32
30 декабря 2025 03:05
26 декабря 2025 21:29
22 декабря 2025 21:38
13 декабря 2025 14:51
11 декабря 2025 19:56
4 декабря 2025 03:37
3 декабря 2025 16:48
2 декабря 2025 15:12
1 декабря 2025 12:23
30 ноября 2025 03:07
28 ноября 2025 14:44
27 ноября 2025 08:24
25 ноября 2025 11:09
25 ноября 2025 10:53