Add stop/pause/resume functionality

This commit is contained in:
MrS0m30n3 2014-04-20 19:06:15 +03:00
parent 3a9d6790ad
commit 989c8a2830
4 changed files with 65 additions and 1 deletions

View File

@ -55,6 +55,7 @@ from .utils import (
write_string, write_string,
YoutubeDLHandler, YoutubeDLHandler,
prepend_extension, prepend_extension,
StopDownloads
) )
from .extractor import get_info_extractor, gen_extractors from .extractor import get_info_extractor, gen_extractors
from .downloader import get_suitable_downloader from .downloader import get_suitable_downloader
@ -186,6 +187,8 @@ class YoutubeDL(object):
self._ies = [] self._ies = []
self._ies_instances = {} self._ies_instances = {}
self._pps = [] self._pps = []
self._stop = False
self._pause = False
self._progress_hooks = [] self._progress_hooks = []
self._download_retcode = 0 self._download_retcode = 0
self._num_downloads = 0 self._num_downloads = 0
@ -980,6 +983,9 @@ class YoutubeDL(object):
fd = get_suitable_downloader(info)(self, self.params) fd = get_suitable_downloader(info)(self, self.params)
for ph in self._progress_hooks: for ph in self._progress_hooks:
fd.add_progress_hook(ph) fd.add_progress_hook(ph)
# Add stop, pause handlers
fd.add_stop_handler(self._stop_handler)
fd.add_pause_handler(self._pause_handler)
return fd.download(name, info) return fd.download(name, info)
if info_dict.get('requested_formats') is not None: if info_dict.get('requested_formats') is not None:
downloaded = [] downloaded = []
@ -1013,6 +1019,8 @@ class YoutubeDL(object):
except (ContentTooShortError, ) as err: except (ContentTooShortError, ) as err:
self.report_error('content too short (expected %s bytes and served %s)' % (err.expected, err.downloaded)) self.report_error('content too short (expected %s bytes and served %s)' % (err.expected, err.downloaded))
return return
except StopDownloads:
return
if success: if success:
try: try:
@ -1023,6 +1031,28 @@ class YoutubeDL(object):
self.record_download_archive(info_dict) self.record_download_archive(info_dict)
def _stop_handler(self):
""" Return self._stop status """
return self._stop
def _pause_handler(self):
""" Return self._pause status """
return self._pause
def stop(self):
""" Stop downloads """
if self._stop:
self._stop = False
else:
self._stop = True
def pause(self):
""" Pause/Resume downloads """
if self._pause:
self._pause = False
else:
self._pause = True
def download(self, url_list): def download(self, url_list):
"""Download a given list of URLs.""" """Download a given list of URLs."""
if (len(url_list) > 1 and if (len(url_list) > 1 and

View File

@ -8,6 +8,7 @@ from ..utils import (
encodeFilename, encodeFilename,
format_bytes, format_bytes,
timeconvert, timeconvert,
StopDownloads
) )
@ -49,6 +50,8 @@ class FileDownloader(object):
self.ydl = ydl self.ydl = ydl
self._progress_hooks = [] self._progress_hooks = []
self.params = params self.params = params
self._stop_handler = None
self._pause_handler = None
@staticmethod @staticmethod
def format_seconds(seconds): def format_seconds(seconds):
@ -155,7 +158,7 @@ class FileDownloader(object):
speed = float(byte_counter) / elapsed speed = float(byte_counter) / elapsed
if speed > rate_limit: if speed > rate_limit:
time.sleep((byte_counter - rate_limit * (now - start_time)) / rate_limit) time.sleep((byte_counter - rate_limit * (now - start_time)) / rate_limit)
def temp_name(self, filename): def temp_name(self, filename):
"""Returns a temporary filename for the given filename.""" """Returns a temporary filename for the given filename."""
if self.params.get('nopart', False) or filename == u'-' or \ if self.params.get('nopart', False) or filename == u'-' or \
@ -298,6 +301,28 @@ class FileDownloader(object):
for ph in self._progress_hooks: for ph in self._progress_hooks:
ph(status) ph(status)
def _stop(self):
""" Check stop handler """
if self._stop_handler is not None:
if self._stop_handler():
raise StopDownloads()
def _pause(self):
""" Check pause/resume handler """
if self._pause_handler is not None:
while self._pause_handler():
# Break if stop handler enable
if self._stop_handler(): break
time.sleep(1)
def add_stop_handler(self, shand):
""" shand gets checked. If True raise StopDownloads """
self._stop_handler = shand
def add_pause_handler(self, phand):
""" phand gets checked. If True pause downloads """
self._pause_handler = phand
def add_progress_hook(self, ph): def add_progress_hook(self, ph):
""" ph gets called on download progress, with a dictionary with the entries """ ph gets called on download progress, with a dictionary with the entries
* filename: The final filename * filename: The final filename

View File

@ -162,6 +162,12 @@ class HttpFD(FileDownloader):
'speed': speed, 'speed': speed,
}) })
# Check stop handler
self._stop()
# Check pause handler
self._pause()
# Apply rate limit # Apply rate limit
self.slow_down(start, byte_counter - resume_len) self.slow_down(start, byte_counter - resume_len)

View File

@ -655,6 +655,9 @@ class MaxDownloadsReached(Exception):
""" --max-downloads limit has been reached. """ """ --max-downloads limit has been reached. """
pass pass
class StopDownloads(Exception):
""" Stop Downloads """
pass
class UnavailableVideoError(Exception): class UnavailableVideoError(Exception):
"""Unavailable Format exception. """Unavailable Format exception.