[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 @@ class FileDownloader(object):
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 @@ from __future__ import division, unicode_literals
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 @@ class FragmentFD(FileDownloader):
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 @@ class FragmentFD(FileDownloader):
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 @@ class FragmentFD(FileDownloader):
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']))