From a295d779ad44815ec7503c590800295f45134364 Mon Sep 17 00:00:00 2001 From: alxnull Date: Sun, 13 Oct 2019 18:00:48 +0200 Subject: [PATCH] Added --yes-overwrites option. --- README.md | 2 ++ youtube_dl/YoutubeDL.py | 19 ++++++++++++++++++- youtube_dl/__init__.py | 6 ++++++ youtube_dl/options.py | 4 ++++ 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f54a5240..c3a12764b 100644 --- a/README.md +++ b/README.md @@ -237,6 +237,8 @@ Alternatively, refer to the [developer instructions](#developer-instructions) fo characters, and avoid "&" and spaces in filenames -w, --no-overwrites Do not overwrite files + --yes-overwrites Overwrite all video and metadata files. + This option includes --no-continue. -c, --continue Force resume of partially downloaded files. By default, youtube-dl will resume downloads if possible. diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 19370f62b..f804c2f38 100755 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -166,6 +166,7 @@ class YoutubeDL(object): restrictfilenames: Do not allow "&" and spaces in file names ignoreerrors: Do not stop on download errors. force_generic_extractor: Force downloader to use the generic extractor + overwrites: Overwrite all video and metadata files. nooverwrites: Prevent overwriting files. playliststart: Playlist item to start at. playlistend: Playlist item to end at. @@ -631,6 +632,13 @@ class YoutubeDL(object): except UnicodeEncodeError: self.to_screen('[download] The file has already been downloaded') + def report_file_delete(self, file_name): + """Report that existing file will be deleted.""" + try: + self.to_screen('Deleting already existent file %s' % file_name) + except UnicodeEncodeError: + self.to_screen('Deleting already existent file') + def prepare_filename(self, info_dict): """Generate the output filename.""" try: @@ -1903,11 +1911,15 @@ class YoutubeDL(object): 'Requested formats are incompatible for merge and will be merged into mkv.') # Ensure filename always has a correct extension for successful merge filename = '%s.%s' % (filename_wo_ext, info_dict['ext']) - if os.path.exists(encodeFilename(filename)): + file_exists = os.path.exists(encodeFilename(filename)) + if not self.params.get('overwrites', False) and file_exists: self.to_screen( '[download] %s has already been downloaded and ' 'merged' % filename) else: + if file_exists: + self.report_file_delete(filename) + os.remove(encodeFilename(filename)) for f in requested_formats: new_info = dict(info_dict) new_info.update(f) @@ -1922,6 +1934,11 @@ class YoutubeDL(object): info_dict['__postprocessors'] = postprocessors info_dict['__files_to_merge'] = downloaded else: + # Delete existing file with --yes-overwrites + if self.params.get('overwrites', False): + if os.path.exists(encodeFilename(filename)): + self.report_file_delete(filename) + os.remove(encodeFilename(filename)) # Just a single file success = dl(filename, info_dict) except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 9a659fc65..42bbdfdb8 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -174,6 +174,11 @@ def _real_main(argv=None): opts.max_sleep_interval = opts.sleep_interval if opts.ap_mso and opts.ap_mso not in MSO_INFO: parser.error('Unsupported TV Provider, use --ap-list-mso to get a list of supported TV Providers') + if opts.overwrites: + if opts.nooverwrites: + parser.error('--yes-overwrites conflicts with --no-overwrites') + # --yes-overwrites implies --no-continue + opts.continue_dl = False def parse_retries(retries): if retries in ('inf', 'infinite'): @@ -347,6 +352,7 @@ def _real_main(argv=None): 'force_generic_extractor': opts.force_generic_extractor, 'ratelimit': opts.ratelimit, 'nooverwrites': opts.nooverwrites, + 'overwrites': opts.overwrites, 'retries': opts.retries, 'fragment_retries': opts.fragment_retries, 'skip_unavailable_fragments': opts.skip_unavailable_fragments, diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 8826b382c..a1289eb7e 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -717,6 +717,10 @@ def parseOpts(overrideArguments=None): '-w', '--no-overwrites', action='store_true', dest='nooverwrites', default=False, help='Do not overwrite files') + filesystem.add_option( + '--yes-overwrites', + action='store_true', dest='overwrites', default=False, + help='Overwrite all video and metadata files. This option includes --no-continue.') filesystem.add_option( '-c', '--continue', action='store_true', dest='continue_dl', default=True,