projects
/
youtube-dl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
7dd6ab4
)
[downloader/fragment] Restart download if .ytdl file is corrupt (closes #16312)
author
Sergey M․
<dstftw@gmail.com>
Sat, 28 Apr 2018 17:33:31 +0000
(
00:33
+0700)
committer
Sergey M․
<dstftw@gmail.com>
Sat, 28 Apr 2018 17:33:31 +0000
(
00:33
+0700)
youtube_dl/downloader/fragment.py
patch
|
blob
|
history
diff --git
a/youtube_dl/downloader/fragment.py
b/youtube_dl/downloader/fragment.py
index 927c7e491655f950bb1a1c316fcd7911b4b3f2fe..917f6dc019a475139b2f8360a13b617e2c29a7ce 100644
(file)
--- a/
youtube_dl/downloader/fragment.py
+++ b/
youtube_dl/downloader/fragment.py
@@
-74,9
+74,14
@@
class FragmentFD(FileDownloader):
return not ctx['live'] and not ctx['tmpfilename'] == '-'
def _read_ytdl_file(self, ctx):
return not ctx['live'] and not ctx['tmpfilename'] == '-'
def _read_ytdl_file(self, ctx):
+ assert 'ytdl_corrupt' not in ctx
stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'r')
stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'r')
- ctx['fragment_index'] = json.loads(stream.read())['downloader']['current_fragment']['index']
- stream.close()
+ try:
+ ctx['fragment_index'] = json.loads(stream.read())['downloader']['current_fragment']['index']
+ except Exception:
+ ctx['ytdl_corrupt'] = True
+ finally:
+ stream.close()
def _write_ytdl_file(self, ctx):
frag_index_stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'w')
def _write_ytdl_file(self, ctx):
frag_index_stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'w')
@@
-158,11
+163,17
@@
class FragmentFD(FileDownloader):
if self.__do_ytdl_file(ctx):
if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))):
self._read_ytdl_file(ctx)
if self.__do_ytdl_file(ctx):
if os.path.isfile(encodeFilename(self.ytdl_filename(ctx['filename']))):
self._read_ytdl_file(ctx)
- if ctx['fragment_index'] > 0 and resume_len == 0:
+ is_corrupt = ctx.get('ytdl_corrupt') is True
+ is_inconsistent = ctx['fragment_index'] > 0 and resume_len == 0
+ if is_corrupt or is_inconsistent:
+ message = (
+ '.ytdl file is corrupt' if is_corrupt else
+ 'Inconsistent state of incomplete fragment download')
self.report_warning(
self.report_warning(
- 'Inconsistent state of incomplete fragment download. '
- 'Restarting from the beginning...')
+ '%s. Restarting from the beginning...' % message)
ctx['fragment_index'] = resume_len = 0
ctx['fragment_index'] = resume_len = 0
+ if 'ytdl_corrupt' in ctx:
+ del ctx['ytdl_corrupt']
self._write_ytdl_file(ctx)
else:
self._write_ytdl_file(ctx)
self._write_ytdl_file(ctx)
else:
self._write_ytdl_file(ctx)