Fixes remove stream tags per list
This commit is contained in:
@@ -277,7 +277,14 @@ class MediaDescriptorChangeSet():
|
|||||||
# media payload, keep metadata from the regular
|
# media payload, keep metadata from the regular
|
||||||
# source track unless the external/target side
|
# source track unless the external/target side
|
||||||
# overrides it explicitly.
|
# overrides it explicitly.
|
||||||
preservedTrackTags = removedTrackTags | unchangedTrackTags
|
preservedTrackTags = (
|
||||||
|
{
|
||||||
|
tagKey: tagValue
|
||||||
|
for tagKey, tagValue in removedTrackTags.items()
|
||||||
|
if tagKey not in self.__removeTrackKeys
|
||||||
|
}
|
||||||
|
| unchangedTrackTags
|
||||||
|
)
|
||||||
for tagKey, tagValue in preservedTrackTags.items():
|
for tagKey, tagValue in preservedTrackTags.items():
|
||||||
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
metadataTokens += [f"-metadata:s:{trackDescriptor.getType().indicator()}"
|
||||||
+ f":{trackDescriptor.getSubIndex()}",
|
+ f":{trackDescriptor.getSubIndex()}",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import tempfile
|
import tempfile
|
||||||
import unittest
|
import unittest
|
||||||
@@ -39,6 +40,11 @@ class SubtrackMappingBundleTests(unittest.TestCase):
|
|||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
self.tempdir.cleanup()
|
self.tempdir.cleanup()
|
||||||
|
|
||||||
|
def write_config(self, data: dict) -> None:
|
||||||
|
config_dir = self.home_dir / ".local" / "etc"
|
||||||
|
config_dir.mkdir(parents=True, exist_ok=True)
|
||||||
|
(config_dir / "ffx.json").write_text(json.dumps(data), encoding="utf-8")
|
||||||
|
|
||||||
def assertCompleted(self, completed):
|
def assertCompleted(self, completed):
|
||||||
if completed.returncode != 0:
|
if completed.returncode != 0:
|
||||||
self.fail(
|
self.fail(
|
||||||
@@ -218,6 +224,15 @@ class SubtrackMappingBundleTests(unittest.TestCase):
|
|||||||
|
|
||||||
def test_external_subtitle_file_replaces_payload_and_overrides_metadata(self):
|
def test_external_subtitle_file_replaces_payload_and_overrides_metadata(self):
|
||||||
source_filename = "substitute_s01e01.mkv"
|
source_filename = "substitute_s01e01.mkv"
|
||||||
|
self.write_config(
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"streams": {
|
||||||
|
"remove": ["BPS"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
source_path = create_source_fixture(
|
source_path = create_source_fixture(
|
||||||
self.workdir,
|
self.workdir,
|
||||||
source_filename,
|
source_filename,
|
||||||
@@ -229,6 +244,7 @@ class SubtrackMappingBundleTests(unittest.TestCase):
|
|||||||
identity="embedded-subtitle",
|
identity="embedded-subtitle",
|
||||||
language="eng",
|
language="eng",
|
||||||
title="Embedded Title",
|
title="Embedded Title",
|
||||||
|
extra_tags={"BPS": "remove-me", "EXTERNAL_KEEP": "keep-me"},
|
||||||
subtitle_lines=("embedded subtitle payload",),
|
subtitle_lines=("embedded subtitle payload",),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -273,6 +289,8 @@ class SubtrackMappingBundleTests(unittest.TestCase):
|
|||||||
self.assertEqual(get_tag(subtitle_stream, "language"), "deu")
|
self.assertEqual(get_tag(subtitle_stream, "language"), "deu")
|
||||||
self.assertEqual(get_tag(subtitle_stream, "title"), "Embedded Title")
|
self.assertEqual(get_tag(subtitle_stream, "title"), "Embedded Title")
|
||||||
self.assertEqual(get_tag(subtitle_stream, "THIS_IS"), "embedded-subtitle")
|
self.assertEqual(get_tag(subtitle_stream, "THIS_IS"), "embedded-subtitle")
|
||||||
|
self.assertEqual(get_tag(subtitle_stream, "EXTERNAL_KEEP"), "keep-me")
|
||||||
|
self.assertIsNone(get_tag(subtitle_stream, "BPS"))
|
||||||
|
|
||||||
extracted_subtitle = extract_first_subtitle_text(self.workdir, output_path)
|
extracted_subtitle = extract_first_subtitle_text(self.workdir, output_path)
|
||||||
self.assertIn("external subtitle payload", extracted_subtitle)
|
self.assertIn("external subtitle payload", extracted_subtitle)
|
||||||
|
|||||||
84
tests/unit/test_media_descriptor_change_set.py
Normal file
84
tests/unit/test_media_descriptor_change_set.py
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
|
||||||
|
SRC_ROOT = Path(__file__).resolve().parents[2] / "src"
|
||||||
|
|
||||||
|
if str(SRC_ROOT) not in sys.path:
|
||||||
|
sys.path.insert(0, str(SRC_ROOT))
|
||||||
|
|
||||||
|
|
||||||
|
from ffx.media_descriptor import MediaDescriptor # noqa: E402
|
||||||
|
from ffx.media_descriptor_change_set import MediaDescriptorChangeSet # noqa: E402
|
||||||
|
from ffx.track_descriptor import TrackDescriptor # noqa: E402
|
||||||
|
from ffx.track_type import TrackType # noqa: E402
|
||||||
|
from ffx.logging_utils import get_ffx_logger # noqa: E402
|
||||||
|
|
||||||
|
|
||||||
|
class StaticConfig:
|
||||||
|
def __init__(self, data: dict):
|
||||||
|
self._data = data
|
||||||
|
|
||||||
|
def getData(self):
|
||||||
|
return self._data
|
||||||
|
|
||||||
|
|
||||||
|
class MediaDescriptorChangeSetTests(unittest.TestCase):
|
||||||
|
def test_external_subtitle_preserves_source_only_tags_except_removed_keys(self):
|
||||||
|
context = {
|
||||||
|
"logger": get_ffx_logger(),
|
||||||
|
"config": StaticConfig(
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"streams": {
|
||||||
|
"remove": ["BPS"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
source_track = TrackDescriptor(
|
||||||
|
index=0,
|
||||||
|
source_index=0,
|
||||||
|
sub_index=0,
|
||||||
|
track_type=TrackType.SUBTITLE,
|
||||||
|
tags={
|
||||||
|
"language": "eng",
|
||||||
|
"title": "Embedded Title",
|
||||||
|
"THIS_IS": "embedded-subtitle",
|
||||||
|
"EXTERNAL_KEEP": "keep-me",
|
||||||
|
"BPS": "remove-me",
|
||||||
|
},
|
||||||
|
)
|
||||||
|
target_track = TrackDescriptor(
|
||||||
|
index=0,
|
||||||
|
source_index=0,
|
||||||
|
sub_index=0,
|
||||||
|
track_type=TrackType.SUBTITLE,
|
||||||
|
tags={"language": "deu"},
|
||||||
|
external_source_file="/tmp/external-subtitle.vtt",
|
||||||
|
)
|
||||||
|
|
||||||
|
change_set = MediaDescriptorChangeSet(
|
||||||
|
context,
|
||||||
|
MediaDescriptor(track_descriptors=[target_track]),
|
||||||
|
MediaDescriptor(track_descriptors=[source_track]),
|
||||||
|
)
|
||||||
|
|
||||||
|
metadata_tokens = change_set.generateMetadataTokens()
|
||||||
|
|
||||||
|
self.assertIn("-metadata:s:s:0", metadata_tokens)
|
||||||
|
self.assertIn("language=deu", metadata_tokens)
|
||||||
|
self.assertIn("title=Embedded Title", metadata_tokens)
|
||||||
|
self.assertIn("THIS_IS=embedded-subtitle", metadata_tokens)
|
||||||
|
self.assertIn("EXTERNAL_KEEP=keep-me", metadata_tokens)
|
||||||
|
self.assertNotIn("BPS=remove-me", metadata_tokens)
|
||||||
|
self.assertNotIn("BPS=", metadata_tokens)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user