IPTV - wilfonk が停止

(2025-07-18)

3 年ほど前にケーブルテレビを解約して、最近では IPTV でテレビを閲覧していました。

画質は悪いもののニュースや災害情報を知るには十分です。

ところが、2025 年 7 月 16 日頃から m3u8 ファイルの更新が止まってしまいました。おそらく全機能が完全に停止したと思われます。 復活するかどうかはわかりません。

新しい IPTV のサイトを探す

詳細は書きませんが、ネット検索して新しいサイトを探し出しました。

wilfonk よりかなり画質はいいのですが、割と頻繁にフリーズします。
そこで、録画して閲覧しようと考えました。

m3u8 ファイルが複雑

wilfonk では以下のような m3u8 ファイルでした。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:12
#EXT-X-MEDIA-SEQUENCE:2779101
#EXTINF:10.010000
JP/HD/bs101_HD-2779101.ts
#EXTINF:10.010000
JP/HD/bs101_HD-2779102.ts
#EXTINF:10.011000
JP/HD/bs101_HD-2779103.ts
#EXTINF:10.010000
JP/HD/bs101_HD-2779104.ts
#EXTINF:10.010000
JP/HD/bs101_HD-2779105.ts
#EXTINF:10.010000
JP/HD/bs101_HD-2779106.ts
#EXTINF:10.010000
JP/HD/bs101_HD-2779107.ts
#EXTINF:1.202000
JP/HD/bs101_HD-2779108.ts

きちんとソートされています。
こういう場合は、ダウンロードしたストリーミングファイルを merge するのはとても簡単です。

しかし、新しいサイトの m3u8 ファイルは

#EXTM3U
#EXT-X-STREAM-INF:CLOSED-CAPTIONS=NONE,RESOLUTION=1920x1080,FRAME-RATE=30.000,CODECS="avc1.640029,mp4a.40.2",AVERAGE-BANDWIDTH=2790000,BANDWIDTH=3490000
tracks-v1a1/mono.m3u8

これがプレイリストでしょうか?

例によって chatGPT にお願いしたところ、プレイリストのようなものを確認することはできました。

#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:190718
#EXT-X-PROGRAM-DATE-TIME:2025-04-26T01:33:02Z
#EXTINF:8.601,
2025/04/26/01/33/02-08601.ts
#EXTINF:9.997,
2025/04/26/01/33/10-09997.ts
#EXTINF:7.242,
2025/04/26/01/33/20-07242.ts
#EXTINF:9.521,
2025/04/26/01/33/28-09521.ts

wilfonk のようにきちんとソートされていません。
つまり、ts ファイル名はランダムになっており、ソートして merge すると前後がおかしくなってしまい動画としては役に立ちません。

python

でも、chatGPT は一応解決してくれました。

import os
import requests
from urllib.parse import urljoin
# === 固定の保存フォルダ ===
output_folder = "~/iptv/BS4K/ts"
os.makedirs(output_folder, exist_ok=True)
# === プレイリスト ===
master_url = "http://heno/index.m3u8"
# === マスタープレイリスト取得 ===
master_res = requests.get(master_url)
master_res.raise_for_status()
lines = master_res.text.strip().splitlines()
media_relative = next(line for line in lines if line and not line.startswith("#"))
media_url = urljoin(master_url, media_relative)
# === メディアプレイリスト取得 ===
media_res = requests.get(media_url)
media_res.raise_for_status()
media_lines = media_res.text.strip().splitlines()
# === list.txt 追記モード ===
list_path = os.path.join(output_folder, "list.txt")
with open(list_path, "a") as list_file:
for line in media_lines:
if line.startswith("#") or not line.strip():
continue
ts_url = urljoin(media_url, line)
ts_filename = os.path.basename(line)
ts_path = os.path.join(output_folder, ts_filename)
if os.path.exists(ts_path):
print(f"🟡 Skip (already exists): {ts_filename}")
continue
print(f"⬇️ Downloading: {ts_filename}")
ts_res = requests.get(ts_url)
ts_res.raise_for_status()
with open(ts_path, "wb") as f:
f.write(ts_res.content)
list_file.write(f"file '{ts_filename}'\n")

list.txt にプレイリストを追記していくようです。

そして、ts ファイルを ffmpeg で merge します。

#!/bin/bash
WORKDIR="./iptv/BS4K/ts"
cd "$WORKDIR" || exit 1
ffmpeg -f concat -safe 0 -i list.txt -c copy ../mp4/`date +%Y%m%d%H%M%S_`.mp4`

ところが、回線速度は十分なのに割と頻繁にフリーズします。

これは 4K の IPTV ですが、実際には 2K です。他のチャンネルももっと解像度は落ちますが割とフリーズします。

これではダメですね。

今更、ケーブルテレビの契約をする気はなく、テレビを見るのを本当にやめることになると思います。しかし、地上波くらいはネットで閲覧できてもおかしくないと思いますが。 少なくとも外国では閲覧できるようです。

今後は、地震とか大雨情報とかはテレビではなくネットで検索することにします。