[downloader/fragment] use a general file to store fragment download context

This commit is contained in:
Remita Amine 2017-04-19 18:34:25 +01:00
parent 481ef51e23
commit ea0c2f219c
2 changed files with 15 additions and 7 deletions

View File

@ -187,6 +187,9 @@ def undo_temp_name(self, filename):
return filename[:-len('.part')] return filename[:-len('.part')]
return filename return filename
def ytdl_filename(self, filename):
return filename + '.ytdl'
def try_rename(self, old_filename, new_filename): def try_rename(self, old_filename, new_filename):
try: try:
if old_filename == new_filename: if old_filename == new_filename:

View File

@ -3,6 +3,7 @@
import os import os
import time import time
import io import io
import json
from .common import FileDownloader from .common import FileDownloader
from .http import HttpFD from .http import HttpFD
@ -63,8 +64,10 @@ def _download_fragment(self, ctx, frag_url, info_dict, headers=None):
def _append_fragment(self, ctx, frag_content): def _append_fragment(self, ctx, frag_content):
ctx['dest_stream'].write(frag_content) ctx['dest_stream'].write(frag_content)
if not (ctx.get('live') or ctx['tmpfilename'] == '-'): if not (ctx.get('live') or ctx['tmpfilename'] == '-'):
frag_index_stream, _ = sanitize_open(ctx['tmpfilename'] + '.fragindex', 'w') frag_index_stream, _ = sanitize_open(self.ytdl_filename(ctx['filename']), 'w')
frag_index_stream.write(compat_str(ctx['frag_index'])) frag_index_stream.write(json.dumps({
'frag_index': ctx['frag_index']
}))
frag_index_stream.close() frag_index_stream.close()
def _prepare_frag_download(self, ctx): def _prepare_frag_download(self, ctx):
@ -94,9 +97,10 @@ def _prepare_frag_download(self, ctx):
if os.path.isfile(encodeFilename(tmpfilename)): if os.path.isfile(encodeFilename(tmpfilename)):
open_mode = 'ab' open_mode = 'ab'
resume_len = os.path.getsize(encodeFilename(tmpfilename)) resume_len = os.path.getsize(encodeFilename(tmpfilename))
if os.path.isfile(encodeFilename(tmpfilename + '.fragindex')): ytdl_filename = encodeFilename(self.ytdl_filename(ctx['filename']))
frag_index_stream, _ = sanitize_open(tmpfilename + '.fragindex', 'r') if os.path.isfile(ytdl_filename):
frag_index = int(frag_index_stream.read()) frag_index_stream, _ = sanitize_open(ytdl_filename, 'r')
frag_index = json.loads(frag_index_stream.read())['frag_index']
frag_index_stream.close() frag_index_stream.close()
dest_stream, tmpfilename = sanitize_open(tmpfilename, open_mode) dest_stream, tmpfilename = sanitize_open(tmpfilename, open_mode)
@ -167,8 +171,9 @@ def frag_progress_hook(s):
def _finish_frag_download(self, ctx): def _finish_frag_download(self, ctx):
ctx['dest_stream'].close() ctx['dest_stream'].close()
if os.path.isfile(encodeFilename(ctx['tmpfilename'] + '.fragindex')): ytdl_filename = encodeFilename(self.ytdl_filename(ctx['filename']))
os.remove(encodeFilename(ctx['tmpfilename'] + '.fragindex')) if os.path.isfile(ytdl_filename):
os.remove(ytdl_filename)
elapsed = time.time() - ctx['started'] elapsed = time.time() - ctx['started']
self.try_rename(ctx['tmpfilename'], ctx['filename']) self.try_rename(ctx['tmpfilename'], ctx['filename'])
fsize = os.path.getsize(encodeFilename(ctx['filename'])) fsize = os.path.getsize(encodeFilename(ctx['filename']))