File streamlink.patch of Package streamlink
diff -U 3 -H -d -r -N -- a/src/streamlink/session/options.py b/src/streamlink/session/options.py
--- a/src/streamlink/session/options.py 2025-06-08 19:50:29.000000000 +0200
+++ b/src/streamlink/session/options.py 2025-06-22 09:19:08.661523780 +0200
@@ -225,6 +225,22 @@
- ``str | None``
- ``None``
- Set the output format of muxed streams, e.g. ``"matroska"``
+ * - ffmpeg-dkey
+ - ``str | None``
+ - ``None``
+ - key
+ * - ffmpeg-dkeys
+ - ``str | None``
+ - ``None``
+ - key
+ * - ffmpeg-video-filter
+ - ``str | None``
+ - ``None``
+ - The video filter to use if transcoding video when muxing streams
+ * - ffmpeg-audio-filter
+ - ``str | None``
+ - ``None``
+ - The audio filter to use if transcoding video when muxing streams
* - ffmpeg-video-transcode
- ``str | None``
- ``None``
@@ -302,6 +318,10 @@
"ffmpeg-verbose-path": None,
"ffmpeg-loglevel": None,
"ffmpeg-fout": None,
+ "ffmpeg-dkey": None,
+ "ffmpeg-dkeys": None,
+ "ffmpeg-video-filter": None,
+ "ffmpeg-audio-filter": None,
"ffmpeg-video-transcode": None,
"ffmpeg-audio-transcode": None,
"ffmpeg-copyts": False,
diff -U 3 -H -d -r -N -- a/src/streamlink/stream/dash/dash.py b/src/streamlink/stream/dash/dash.py
--- a/src/streamlink/stream/dash/dash.py 2025-06-08 19:50:29.000000000 +0200
+++ b/src/streamlink/stream/dash/dash.py 2025-06-22 09:38:23.659175801 +0200
@@ -307,11 +307,11 @@
# Search for suitable video and audio representations
for aset in period_selection.adaptationSets:
- if aset.contentProtections:
- raise PluginError(f"{source} is protected by DRM")
+ # if aset.contentProtections:
+ # raise PluginError(f"{source} is protected by DRM")
for rep in aset.representations:
- if rep.contentProtections:
- raise PluginError(f"{source} is protected by DRM")
+ # if rep.contentProtections:
+ # raise PluginError(f"{source} is protected by DRM")
if rep.mimeType.startswith("video"):
video.append(rep)
elif rep.mimeType.startswith("audio"): # pragma: no branch
diff -U 3 -H -d -r -N -- a/src/streamlink/stream/ffmpegmux.py b/src/streamlink/stream/ffmpegmux.py
--- a/src/streamlink/stream/ffmpegmux.py 2025-06-08 19:50:29.000000000 +0200
+++ b/src/streamlink/stream/ffmpegmux.py 2025-06-22 09:35:28.813225820 +0200
@@ -184,12 +184,23 @@
loglevel = session.options.get("ffmpeg-loglevel") or options.pop("loglevel", self.DEFAULT_LOGLEVEL)
ofmt = session.options.get("ffmpeg-fout") or options.pop("format", self.DEFAULT_OUTPUT_FORMAT)
outpath = options.pop("outpath", "pipe:1")
- videocodec = session.options.get("ffmpeg-video-transcode") or options.pop("vcodec", self.DEFAULT_VIDEO_CODEC)
- audiocodec = session.options.get("ffmpeg-audio-transcode") or options.pop("acodec", self.DEFAULT_AUDIO_CODEC)
+ videofilter = session.options.get("ffmpeg-video-filter")
+ if videofilter:
+ videocodec = session.options.get("ffmpeg-video-transcode")
+ else:
+ videocodec = session.options.get("ffmpeg-video-transcode") or options.pop("vcodec", self.DEFAULT_VIDEO_CODEC)
+ audiofilter = session.options.get("ffmpeg-audio-filter")
+ if audiofilter:
+ audiocodec = session.options.get("ffmpeg-audio-transcode")
+ else:
+ audiocodec = session.options.get("ffmpeg-audio-transcode") or options.pop("acodec", self.DEFAULT_AUDIO_CODEC)
metadata = options.pop("metadata", {})
maps = options.pop("maps", [])
copyts = session.options.get("ffmpeg-copyts") or options.pop("copyts", False)
start_at_zero = session.options.get("ffmpeg-start-at-zero") or options.pop("start_at_zero", False)
+
+ dkey = session.options.get("ffmpeg-dkey") or options.pop("dkey", False)
+ dkeys = session.options.get("ffmpeg-dkeys") or options.pop("dkey", False)
self._cmd = [
self.command(session),
@@ -200,10 +211,21 @@
]
for np in self.pipes:
+ self._cmd.extend(['-thread_queue_size', '32768'])
+ if dkey:
+ self._cmd.extend(['-decryption_key', dkey])
+ if dkeys:
+ self._cmd.extend(['-decryption_keys', dkeys])
self._cmd.extend(["-i", str(np.path)])
- self._cmd.extend(["-c:v", videocodec])
- self._cmd.extend(["-c:a", audiocodec])
+ if videofilter:
+ self._cmd.extend(["-vf", videofilter])
+ if videocodec:
+ self._cmd.extend(["-c:v", videocodec])
+ if audiofilter:
+ self._cmd.extend(["-af", audiofilter])
+ if audiocodec:
+ self._cmd.extend(["-c:a", audiocodec])
for m in maps:
self._cmd.extend(["-map", str(m)])
diff -U 3 -H -d -r -N -- a/src/streamlink_cli/argparser.py b/src/streamlink_cli/argparser.py
--- a/src/streamlink_cli/argparser.py 2025-06-08 19:50:29.000000000 +0200
+++ b/src/streamlink_cli/argparser.py 2025-06-22 09:17:44.007255959 +0200
@@ -1207,6 +1207,34 @@
""",
)
transport_ffmpeg.add_argument(
+ "--ffmpeg-dkey",
+ type=str,
+ metavar="DKEY",
+ help="""
+ Set the decryption key
+ """
+ )
+ transport_ffmpeg.add_argument(
+ "--ffmpeg-dkeys",
+ type=str,
+ metavar="DKEYS",
+ help="""
+ Set the decryption keys with id
+ """
+ )
+ transport_ffmpeg.add_argument(
+ "--ffmpeg-video-filter",
+ help="""
+ Add video filter.
+ """,
+ )
+ transport_ffmpeg.add_argument(
+ "--ffmpeg-audio-filter",
+ help="""
+ Add audio filter.
+ """,
+ )
+ transport_ffmpeg.add_argument(
"--ffmpeg-video-transcode",
metavar="CODEC",
help="""
@@ -1475,6 +1503,10 @@
("ffmpeg_verbose_path", "ffmpeg-verbose-path", None),
("ffmpeg_loglevel", "ffmpeg-loglevel", None),
("ffmpeg_fout", "ffmpeg-fout", None),
+ ("ffmpeg_dkey", "ffmpeg-dkey", None),
+ ("ffmpeg_dkeys", "ffmpeg-dkeys", None),
+ ("ffmpeg_video_filter", "ffmpeg-video-filter", None),
+ ("ffmpeg_audio_filter", "ffmpeg-audio-filter", None),
("ffmpeg_video_transcode", "ffmpeg-video-transcode", None),
("ffmpeg_audio_transcode", "ffmpeg-audio-transcode", None),
("ffmpeg_copyts", "ffmpeg-copyts", None),