diff --git a/youtube_dlc/YoutubeDL.py b/youtube_dlc/YoutubeDL.py index 1e2070f8c..d2d100850 100644 --- a/youtube_dlc/YoutubeDL.py +++ b/youtube_dlc/YoutubeDL.py @@ -113,6 +113,43 @@ from .version import __version__ if compat_os_name == 'nt': import ctypes +class ArchiveTree(object): + def __init__(self, line): + self.left = None + self.right = None + self.line = line + + def at_insert(self, line): + print("at_insert: ", line) + if self.line: + if line < self.line: + if self.left is None: + self.left = ArchiveTree(line) + else: + self.left.at_insert(line) + elif line > self.line: + if self.right is None: + self.right = ArchiveTree(line) + else: + self.right.at_insert(line) + else: + self.line = line + + def at_exist(self, line): + print("at_exist: ", line) + if self.line is None: + return False + if line < self.line: + if self.left is None: + return False + return self.left.at_exist(line) + elif line > self.line: + if self.right is None: + return False + return self.right.at_exist(line) + else: + return True + class YoutubeDL(object): """YoutubeDL class. @@ -359,6 +396,21 @@ class YoutubeDL(object): } self.params.update(params) self.cache = Cache(self) + self.archive = ArchiveTree(None) + + """Preload the archive, if any is specified""" + def preload_download_archive(self): + fn = self.params.get('download_archive') + if fn is None: + return False + try: + with locked_file(fn, 'r', encoding='utf-8') as archive_file: + for line in archive_file: + self.archive.at_insert(line.strip()) + except IOError as ioe: + if ioe.errno != errno.ENOENT: + raise + return True def check_deprecated(param, option, suggestion): if self.params.get(param) is not None: @@ -367,6 +419,8 @@ class YoutubeDL(object): return True return False + preload_download_archive(self) + if check_deprecated('cn_verification_proxy', '--cn-verification-proxy', '--geo-verification-proxy'): if self.params.get('geo_verification_proxy') is None: self.params['geo_verification_proxy'] = self.params['cn_verification_proxy'] @@ -722,7 +776,7 @@ class YoutubeDL(object): return None def _match_entry(self, info_dict, incomplete): - """ Returns None iff the file should be downloaded """ + """ Returns None if the file should be downloaded """ video_title = info_dict.get('title', info_dict.get('id', 'video')) if 'title' in info_dict: @@ -2142,15 +2196,7 @@ class YoutubeDL(object): if not vid_id: return False # Incomplete video information - try: - with locked_file(fn, 'r', encoding='utf-8') as archive_file: - for line in archive_file: - if line.strip() == vid_id: - return True - except IOError as ioe: - if ioe.errno != errno.ENOENT: - raise - return False + return self.archive.at_exist(vid_id) def record_download_archive(self, info_dict): fn = self.params.get('download_archive') @@ -2160,6 +2206,7 @@ class YoutubeDL(object): assert vid_id with locked_file(fn, 'a', encoding='utf-8') as archive_file: archive_file.write(vid_id + '\n') + self.archive.at_insert(vid_id) @staticmethod def format_resolution(format, default='unknown'):