From cf9cf79da271e8826f6f8e5a37da9558e3a0cf78 Mon Sep 17 00:00:00 2001 From: Augusto Gunsch Date: Sun, 14 Nov 2021 20:32:35 -0300 Subject: [PATCH] Fix Windows compatibility + bugs --- README.md | 12 ++++----- setup.cfg | 2 +- src/fsub/fsub.py | 63 +++++++++++++++++++++++++++++++++--------------- 3 files changed, 50 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 8e979ee..387a55d 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ pip install fsub # Usage ``` -usage: fsub [-h] [-c] [-s MS] [-n] [-f FILE] file [file ...] +usage: fsub.py [-h] [-c] [-s MS] [-n] [-f FILE] file [file ...] Fix, edit and clean SubRip (.srt) files. @@ -18,20 +18,20 @@ positional arguments: optional arguments: -h, --help show this help message and exit - -c, --clean remove subtitles matching regular expressions listed in - ~/.config/fsubrc (this is the default behavior if no other flag is - passed) + -c, --clean remove subtitles matching regular expressions listed in the config + file (this is the default behavior if no other flag is passed) -s MS, --shift MS shift all subtitles by MS milliseconds, which may be positive or negative -n, --no-html strip HTML tags from subtitles content -f FILE, --config-file FILE - overwrite the default config file (~/.config/fsubrc) + overwrite the default config file (Unix: $HOME/.config/fsubrc, + Windows: %APPDATA%\fsubrc) ``` # Features - Fixes subtitle numbering - Converts files to UTF-8 encoding - Validates file structure -- May remove subtitles containing lines that match any regular expression listed in the config file (by default `~/.config/fsubrc`) +- May remove subtitles containing lines that match any regular expression listed in the config file (by default on Unix: `$HOME/.config/fsubrc`; on Windows: `%APPDATA%\fsubrc`) - May shift the time of all subtitles - May strip HTML diff --git a/setup.cfg b/setup.cfg index d9f2cbf..b9c0d3c 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = fsub -version = 0.0.5 +version = 0.1.0 author = Augusto Lenz Gunsch author_email = augustogunsch@tutanota.com description = CLI SubRip editor diff --git a/src/fsub/fsub.py b/src/fsub/fsub.py index 167f47b..8ada7c2 100755 --- a/src/fsub/fsub.py +++ b/src/fsub/fsub.py @@ -26,6 +26,7 @@ import argparse import re import chardet import os +import pathlib class Time: @@ -91,24 +92,17 @@ class Subtitle: return False def __repr__(self): - return '{}{}{} --> {}{}{}'.format( - self.number, os.linesep, + return '{}\n{} --> {}\n{}'.format( + self.number, self.time_start, self.time_end, - os.linesep, os.linesep.join(self.content) + '\n'.join(self.content) ) -def clean(subs, cfg): - # Read expressions in ~/.config/fsubrc - if not cfg: - cfg = open(os.getenv('HOME') + '/.config/fsubrc', 'r') - lines = re.split(r'\r?\n', cfg.read().strip()) - expressions = list(map(re.compile, lines)) - cfg.close() - +def clean(subs, expressions): # Cancel if no expression if len(expressions) == 0: - return + return subs # Remove lines matching any expression for regexp in expressions: @@ -126,10 +120,10 @@ def shift(subs, ms): def strip_html(subs): for sub in subs: for i in range(0, len(sub.content)): - sub.content[i] = re.sub('<.+>', '', sub.content[i]) + sub.content[i] = re.sub('<.+?>', '', sub.content[i]) -def process_file(args, file): +def process_file(args, file, expressions): # Read the input file contents = file.read() file.close() @@ -163,7 +157,7 @@ def process_file(args, file): # Clean if --clean is passed if args.clean: - subs_objs = clean(subs_objs, args.config_file) + subs_objs = clean(subs_objs, expressions) # Shift if --shift is passed if args.shift: @@ -180,15 +174,41 @@ def process_file(args, file): i += 1 # Join Subtitle objects back to a string - contents = (os.linesep + os.linesep).join(map(repr, subs_objs)) + contents = '\n\n'.join(map(repr, subs_objs)) # Write output output = open(file.name, 'w', encoding='utf-8') output.write(contents) - output.write(os.linesep) + output.write('\n') output.close() +def read_expressions(args): + if args.clean: + cfg = args.config_file + + # Open default config file if not specified + if not args.config_file: + home = pathlib.Path.home() + try: + if type(home) is pathlib.PosixPath: + cfg = open(str(home) + '/.config/fsubrc', 'r') + elif type(home) is pathlib.WindowsPath: + cfg = open(os.getenv('APPDATA') + r'\fsubrc', 'r') + else: + print('Unsupported operating system', file=sys.stderr) + sys.exit(1) + except FileNotFoundError: + return [] + + # Read expressions + lines = re.split(r'\r?\n', cfg.read().strip()) + expressions = list(map(re.compile, lines)) + cfg.close() + return expressions + return [] + + def main(): parser = argparse.ArgumentParser( description='Fix, edit and clean SubRip (.srt) files.', @@ -198,7 +218,7 @@ def main(): parser.add_argument( '-c', '--clean', help='remove subtitles matching regular expressions ' + - 'listed in ~/.config/fsubrc (this is the default ' + + 'listed in the config file (this is the default ' + 'behavior if no other flag is passed)', action='store_true' ) @@ -220,7 +240,8 @@ def main(): parser.add_argument( '-f', '--config-file', - help='overwrite the default config file (~/.config/fsubrc)', + help='overwrite the default config file (Unix: $HOME/.config/fsubrc,' + + r' Windows: %%APPDATA%%\fsubrc)', metavar='FILE', action='store', type=argparse.FileType('r') @@ -252,8 +273,10 @@ def main(): file=sys.stderr) sys.exit(1) + expressions = read_expressions(args) + for file in args.files: - process_file(args, file) + process_file(args, file, expressions) if __name__ == '__main__':