summaryrefslogtreecommitdiffstats
path: root/.local/bin/srt-lines-matching
diff options
context:
space:
mode:
Diffstat (limited to '.local/bin/srt-lines-matching')
-rwxr-xr-x.local/bin/srt-lines-matching85
1 files changed, 85 insertions, 0 deletions
diff --git a/.local/bin/srt-lines-matching b/.local/bin/srt-lines-matching
new file mode 100755
index 0000000..accabb1
--- /dev/null
+++ b/.local/bin/srt-lines-matching
@@ -0,0 +1,85 @@
+#!/usr/local/bin/python3
+
+"""Filter subtitles that match or don't match a particular pattern."""
+
+import importlib
+import srt_tools.utils
+import logging
+
+log = logging.getLogger(__name__)
+
+
+def strip_to_matching_lines_only(subtitles, imports, func_str, invert, per_sub):
+ for import_name in imports:
+ real_import = importlib.import_module(import_name)
+ globals()[import_name] = real_import
+
+ raw_func = eval(func_str) # pylint: disable-msg=eval-used
+
+ if invert:
+ func = lambda line: not raw_func(line)
+ else:
+ func = raw_func
+
+ for subtitle in subtitles:
+ if per_sub:
+ if not func(subtitle.content):
+ subtitle.content = ""
+ else:
+ subtitle.content = "\n".join(
+ line for line in subtitle.content.splitlines() if func(line)
+ )
+
+ yield subtitle
+
+
+def parse_args():
+ examples = {
+ "Only include Chinese lines": "srt lines-matching -m hanzidentifier -f hanzidentifier.has_chinese",
+ "Exclude all lines which only contain numbers": "srt lines-matching -v -f 'lambda x: x.isdigit()'",
+ }
+ parser = srt_tools.utils.basic_parser(description=__doc__, examples=examples)
+ parser.add_argument(
+ "-f", "--func", help="a function to use to match lines", required=True
+ )
+ parser.add_argument(
+ "-m",
+ "--module",
+ help="modules to import in the function context",
+ action="append",
+ default=[],
+ )
+ parser.add_argument(
+ "-s",
+ "--per-subtitle",
+ help="match the content of each subtitle, not each line",
+ action="store_true",
+ )
+ parser.add_argument(
+ "-v",
+ "--invert",
+ help="invert matching -- only match lines returning False",
+ action="store_true",
+ )
+ return parser.parse_args()
+
+
+def main():
+ args = parse_args()
+ logging.basicConfig(level=args.log_level)
+ srt_tools.utils.set_basic_args(args)
+ matching_subtitles_only = strip_to_matching_lines_only(
+ args.input, args.module, args.func, args.invert, args.per_subtitle
+ )
+ output = srt_tools.utils.compose_suggest_on_fail(
+ matching_subtitles_only, strict=args.strict
+ )
+
+ try:
+ args.output.write(output)
+ except (UnicodeEncodeError, TypeError): # Python 2 fallback
+ args.output.write(output.encode(args.encoding))
+
+
+if __name__ == "__main__": # pragma: no cover
+ main()