diff --git a/app/core/media/ffmpeg_builders/__init__.py b/app/core/media/ffmpeg_builders/__init__.py index b043ea40..1b2483e7 100644 --- a/app/core/media/ffmpeg_builders/__init__.py +++ b/app/core/media/ffmpeg_builders/__init__.py @@ -1,7 +1,14 @@ from typing import Any from .audio import AACCommandBuilder, M4ACommandBuilder, MP3CommandBuilder, WAVCommandBuilder, WMACommandBuilder -from .video import FLVCommandBuilder, MKVCommandBuilder, MOVCommandBuilder, MP4CommandBuilder, TSCommandBuilder +from .video import ( + FLVCommandBuilder, + MKVCommandBuilder, + MOVCommandBuilder, + MP4CommandBuilder, + NUTCommandBuilder, + TSCommandBuilder, +) def create_builder(format_type: str, *args: Any, **kwargs: Any) -> Any: @@ -18,6 +25,7 @@ def create_builder(format_type: str, *args: Any, **kwargs: Any) -> Any: "mkv": MKVCommandBuilder, "mp4": MP4CommandBuilder, "ts": TSCommandBuilder, + "nut": NUTCommandBuilder, "flv": FLVCommandBuilder, "mov": MOVCommandBuilder, "mp3": MP3CommandBuilder, diff --git a/app/core/media/ffmpeg_builders/video/__init__.py b/app/core/media/ffmpeg_builders/video/__init__.py index 67340742..85d80408 100644 --- a/app/core/media/ffmpeg_builders/video/__init__.py +++ b/app/core/media/ffmpeg_builders/video/__init__.py @@ -2,4 +2,5 @@ from .mkv import MKVCommandBuilder from .mov import MOVCommandBuilder from .mp4 import MP4CommandBuilder +from .nut import NUTCommandBuilder from .ts import TSCommandBuilder diff --git a/app/core/media/ffmpeg_builders/video/nut.py b/app/core/media/ffmpeg_builders/video/nut.py new file mode 100644 index 00000000..c5912cae --- /dev/null +++ b/app/core/media/ffmpeg_builders/video/nut.py @@ -0,0 +1,32 @@ +from ..base import FFmpegCommandBuilder + + +class NUTCommandBuilder(FFmpegCommandBuilder): + def build_command(self) -> list[str]: + command = self._get_basic_ffmpeg_command() + if self.segment_record: + additional_commands = [ + "-c:v", "copy", + "-c:a", "copy", + "-map", "0", + "-f", "segment", + "-segment_time", str(self.segment_time), + "-segment_format", "nut", + "-reset_timestamps", "1", + "-muxdelay", "0", + "-muxpreload", "0", + self.full_path, + ] + else: + additional_commands = [ + "-c:v", "copy", + "-c:a", "copy", + "-map", "0", + "-f", "nut", + "-muxdelay", "0", + "-muxpreload", "0", + self.full_path, + ] + + command.extend(additional_commands) + return command diff --git a/app/models/media/video_format_model.py b/app/models/media/video_format_model.py index 5479584e..6e419839 100644 --- a/app/models/media/video_format_model.py +++ b/app/models/media/video_format_model.py @@ -4,6 +4,7 @@ class VideoFormat: FLV = "FLV" MKV = "MKV" MOV = "MOV" + NUT = "NUT" @classmethod def get_formats(cls): diff --git a/app/utils/utils.py b/app/utils/utils.py index b08053c3..3bab4033 100644 --- a/app/utils/utils.py +++ b/app/utils/utils.py @@ -254,7 +254,7 @@ def get_startup_info(system_type: str | None = None): def is_valid_video_file(source: str) -> bool: - video_extensions = ['.mp4', '.mov', '.mkv', '.ts', '.flv', '.mp3', '.m4a', '.wav', '.aac', '.wma'] + video_extensions = ['.mp4', '.mov', '.mkv', '.nut', '.ts', '.flv', '.mp3', '.m4a', '.wav', '.aac', '.wma'] return Path(source).suffix.lower() in video_extensions