]> jfr.im git - yt-dlp.git/commitdiff
Use `os.replace` where applicable (#793)
authorPaul Wrubel <redacted>
Fri, 27 Aug 2021 02:27:20 +0000 (21:27 -0500)
committerGitHub <redacted>
Fri, 27 Aug 2021 02:27:20 +0000 (07:57 +0530)
When using
```py
os.remove(encodeFilename(filename))
os.rename(encodeFilename(temp_filename), encodeFilename(filename))
```
the `os.remove` need not be atomic and so can be executed arbitrarily compared to the immediately following rename call. It is better to use `os.replace` instead

Authored by: paulwrubel

.gitignore
yt_dlp/downloader/common.py
yt_dlp/postprocessor/embedthumbnail.py
yt_dlp/postprocessor/ffmpeg.py
yt_dlp/postprocessor/sponskrub.py

index 7ed34448a19817381f161d794cb2d4e9be4e4317..619d6ba98a62b56c5ac88a3854d112092de1add0 100644 (file)
@@ -19,6 +19,8 @@ cookies.txt
 *.wav
 *.ape
 *.mkv
+*.flac
+*.avi
 *.swf
 *.part
 *.part-*
index f5f6393a62b746b8810b90b9406b8ddbcf124a07..ce914bd4a28a07ed3786228d5f4fad04b4f8c4b9 100644 (file)
@@ -207,12 +207,9 @@ def try_rename(self, old_filename, new_filename):
         if old_filename == new_filename:
             return
         try:
-            if self.params.get('overwrites', False):
-                if os.path.isfile(encodeFilename(new_filename)):
-                    os.remove(encodeFilename(new_filename))
-            os.rename(encodeFilename(old_filename), encodeFilename(new_filename))
+            os.replace(old_filename, new_filename)
         except (IOError, OSError) as err:
-            self.report_error('unable to rename file: %s' % error_to_compat_str(err))
+            self.report_error(f'unable to rename file: {err}')
 
     def try_utime(self, filename, last_modified_hdr):
         """Try to set the last-modified time of the given file."""
index 7008f4d4dbfb5d155b795df8f956979d9d474b6c..3139a6338824ac9562e1a0f35be0cfc64f2f6cf1 100644 (file)
@@ -222,8 +222,7 @@ def run(self, info):
             raise EmbedThumbnailPPError('Supported filetypes for thumbnail embedding are: mp3, mkv/mka, ogg/opus/flac, m4a/mp4/mov')
 
         if success and temp_filename != filename:
-            os.remove(encodeFilename(filename))
-            os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+            os.replace(temp_filename, filename)
 
         self.try_utime(filename, mtime, mtime)
 
index be6cc9f096a8bca62694daf3e6655ce64d14706f..b66a0b44525658ec7305d788c07b7db316e3784c 100644 (file)
@@ -520,8 +520,7 @@ def run(self, information):
         temp_filename = prepend_extension(filename, 'temp')
         self.to_screen('Embedding subtitles in "%s"' % filename)
         self.run_ffmpeg_multiple_files(input_files, temp_filename, opts)
-        os.remove(encodeFilename(filename))
-        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+        os.replace(temp_filename, filename)
 
         files_to_delete = [] if self._already_have_subtitle else sub_filenames
         return files_to_delete, information
@@ -628,8 +627,7 @@ def ffmpeg_escape(text):
             itertools.chain(self._options(info['ext']), *options))
         if chapters:
             os.remove(metadata_filename)
-        os.remove(encodeFilename(filename))
-        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+        os.replace(temp_filename, filename)
         return [], info
 
 
@@ -673,8 +671,7 @@ def _fixup(self, msg, filename, options):
         self.to_screen(f'{msg} of "{filename}"')
         self.run_ffmpeg(filename, temp_filename, options)
 
-        os.remove(encodeFilename(filename))
-        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+        os.replace(temp_filename, filename)
 
 
 class FFmpegFixupStretchedPP(FFmpegFixupPostProcessor):
@@ -866,9 +863,7 @@ def fixup_webp(self, info, idx=-1):
             if thumbnail_ext != 'webp' and self.is_webp(thumbnail_filename):
                 self.to_screen('Correcting thumbnail "%s" extension to webp' % thumbnail_filename)
                 webp_filename = replace_extension(thumbnail_filename, 'webp')
-                if os.path.exists(webp_filename):
-                    os.remove(webp_filename)
-                os.rename(encodeFilename(thumbnail_filename), encodeFilename(webp_filename))
+                os.replace(thumbnail_filename, webp_filename)
                 info['thumbnails'][idx]['filepath'] = webp_filename
                 info['__files_to_move'][webp_filename] = replace_extension(
                     info['__files_to_move'].pop(thumbnail_filename), 'webp')
index 73b6b4a20ec4e9db0f2ccc884d0236ae2d6550e0..588f0ae1257d4db704c2917bfb135ec386841b37 100644 (file)
@@ -84,8 +84,7 @@ def run(self, information):
         stdout = process_communicate_or_kill(p)[0]
 
         if p.returncode == 0:
-            os.remove(encodeFilename(filename))
-            os.rename(encodeFilename(temp_filename), encodeFilename(filename))
+            os.replace(temp_filename, filename)
             self.to_screen('Sponsor sections have been %s' % ('removed' if self.cutout else 'marked'))
         elif p.returncode == 3:
             self.to_screen('No segments in the SponsorBlock database')