#!/usr/bin/env python3 import re, json, sys # Usage: # python3 convert_flussonic_to_spts.py /etc/flussonic/flussonic.conf > channels.json # # Notes: # - Ambil semua "stream { ... }" # - Ambil semua baris: input ; # - enable = false kalau ketemu "disabled;" atau "disabled true;" # - enable = true kalau ketemu "disabled false;" atau default true STREAM_RE = re.compile(r'^\s*stream\s+([^\s{]+)\s*\{\s*$', re.IGNORECASE) INPUT_RE = re.compile(r'^\s*input\s+([^;]+)\s*;\s*$', re.IGNORECASE) DIS_RE = re.compile(r'^\s*disabled(?:\s+(true|false))?\s*;\s*$', re.IGNORECASE) def main(path): with open(path, "r", encoding="utf-8", errors="ignore") as f: lines = f.readlines() channels = [] in_stream = False name = None inputs = [] enable = True def flush(): nonlocal name, inputs, enable if name and inputs: channels.append({ "type": "spts", "id": None, # isi nanti setelah semua kekumpul "input": inputs, "enable": enable, "name": name }) for line in lines: if not in_stream: m = STREAM_RE.match(line) if m: in_stream = True name = m.group(1) inputs = [] enable = True # default continue # inside stream block if line.strip() == "}": flush() in_stream = False name = None inputs = [] enable = True continue m_in = INPUT_RE.match(line) if m_in: url = m_in.group(1).strip() # kalau ada yang kebiasaan tulis "input udp://..." di json, kita normalin aja: url = url.replace("input ", "").strip() inputs.append(url) continue m_dis = DIS_RE.match(line) if m_dis: val = m_dis.group(1) if val is None: # "disabled;" berarti disabled true enable = False else: enable = (val.lower() == "false") continue # set id berurutan a001, a002, ... for i, ch in enumerate(channels, start=1): ch["id"] = f"a{i:03d}" print(json.dumps({"channels": channels}, indent=2)) if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python3 convert_flussonic_to_spts.py /path/to/flussonic.conf", file=sys.stderr) sys.exit(1) main(sys.argv[1])