mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
优化下载逻辑,待测试
This commit is contained in:
parent
4407a0daa1
commit
5423976bb2
@ -121,23 +121,15 @@ class Clicker(object):
|
|||||||
return self.at(count=times)
|
return self.at(count=times)
|
||||||
|
|
||||||
def to_download(self, save_path=None, rename=None, suffix=None, new_tab=False, by_js=False, timeout=None):
|
def to_download(self, save_path=None, rename=None, suffix=None, new_tab=False, by_js=False, timeout=None):
|
||||||
tmp_save_path = None
|
|
||||||
if not self._ele.tab._browser._dl_mgr._running:
|
if not self._ele.tab._browser._dl_mgr._running:
|
||||||
self._ele.tab._browser.set.download_path('.')
|
self._ele.tab._browser.set.download_path('.')
|
||||||
|
|
||||||
if self._ele.tab._type.endswith('Page'):
|
if self._ele.tab._type.endswith('Page'):
|
||||||
obj = browser = self._ele.tab._browser
|
obj = browser = self._ele.owner._browser
|
||||||
tid = 'browser'
|
tid = 'browser'
|
||||||
# t_settings = TabDownloadSettings(self._ele.owner.tab_id)
|
|
||||||
# b_settings = TabDownloadSettings('browser')
|
|
||||||
# b_settings.rename = t_settings.rename
|
|
||||||
# b_settings.suffix = t_settings.suffix
|
|
||||||
# t_settings.rename = None
|
|
||||||
# t_settings.suffix = None
|
|
||||||
tmp_save_path = str(Path(save_path).absolute()) if save_path else self._ele.owner._tab.download_path
|
|
||||||
|
|
||||||
elif new_tab:
|
elif new_tab:
|
||||||
obj = browser = self._ele.tab._browser
|
obj = browser = self._ele.owner._browser
|
||||||
tid = 'browser'
|
tid = 'browser'
|
||||||
t_settings = TabDownloadSettings(self._ele.owner.tab_id)
|
t_settings = TabDownloadSettings(self._ele.owner.tab_id)
|
||||||
b_settings = TabDownloadSettings('browser')
|
b_settings = TabDownloadSettings('browser')
|
||||||
@ -145,15 +137,17 @@ class Clicker(object):
|
|||||||
b_settings.suffix = t_settings.suffix
|
b_settings.suffix = t_settings.suffix
|
||||||
t_settings.rename = None
|
t_settings.rename = None
|
||||||
t_settings.suffix = None
|
t_settings.suffix = None
|
||||||
tmp_save_path = str(Path(save_path).absolute()) if save_path else self._ele.owner._tab.download_path
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
obj = self._ele.owner._tab
|
obj = self._ele.owner._tab
|
||||||
browser = obj.browser
|
browser = obj.browser
|
||||||
tid = obj.tab_id
|
tid = obj.tab_id
|
||||||
if save_path:
|
|
||||||
tmp_save_path = str(Path(save_path).absolute())
|
|
||||||
|
|
||||||
|
if save_path:
|
||||||
|
tmp_path = obj.download_path
|
||||||
|
obj.set.download_path(save_path)
|
||||||
|
else:
|
||||||
|
tmp_path = None
|
||||||
if rename or suffix:
|
if rename or suffix:
|
||||||
obj.set.download_file_name(rename, suffix)
|
obj.set.download_file_name(rename, suffix)
|
||||||
if timeout is None:
|
if timeout is None:
|
||||||
@ -163,12 +157,11 @@ class Clicker(object):
|
|||||||
self.left(by_js=by_js)
|
self.left(by_js=by_js)
|
||||||
m = wait_mission(browser, tid, timeout)
|
m = wait_mission(browser, tid, timeout)
|
||||||
|
|
||||||
if m:
|
if tmp_path:
|
||||||
if tmp_save_path:
|
obj.set.download_path(tmp_path)
|
||||||
m.path = tmp_save_path
|
if m and new_tab:
|
||||||
if new_tab:
|
|
||||||
self._ele.owner.browser._dl_mgr._tab_missions.setdefault(self._ele.owner.tab_id, []).append(m)
|
self._ele.owner.browser._dl_mgr._tab_missions.setdefault(self._ele.owner.tab_id, []).append(m)
|
||||||
m.from_tab = self._ele.owner
|
m.from_tab = self._ele.owner.tab_id
|
||||||
return m
|
return m
|
||||||
|
|
||||||
def to_upload(self, file_paths, by_js=False):
|
def to_upload(self, file_paths, by_js=False):
|
||||||
|
@ -27,6 +27,7 @@ class DownloadManager(object):
|
|||||||
self._missions = {} # {guid: DownloadMission}
|
self._missions = {} # {guid: DownloadMission}
|
||||||
self._tab_missions = {} # {tab_id: [DownloadMission, ...]}
|
self._tab_missions = {} # {tab_id: [DownloadMission, ...]}
|
||||||
self._flags = {} # {tab_id: [bool, DownloadMission]}
|
self._flags = {} # {tab_id: [bool, DownloadMission]}
|
||||||
|
self._tmp_path = '.'
|
||||||
|
|
||||||
self._running = False
|
self._running = False
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ class DownloadManager(object):
|
|||||||
self._browser._driver.set_callback('Browser.downloadWillBegin', self._onDownloadWillBegin)
|
self._browser._driver.set_callback('Browser.downloadWillBegin', self._onDownloadWillBegin)
|
||||||
r = self._browser._run_cdp('Browser.setDownloadBehavior', downloadPath=self._browser._download_path,
|
r = self._browser._run_cdp('Browser.setDownloadBehavior', downloadPath=self._browser._download_path,
|
||||||
behavior='allowAndName', eventsEnabled=True)
|
behavior='allowAndName', eventsEnabled=True)
|
||||||
|
self._tmp_path = self._browser._download_path
|
||||||
if 'error' in r:
|
if 'error' in r:
|
||||||
print('浏览器版本太低无法使用下载管理功能。')
|
print('浏览器版本太低无法使用下载管理功能。')
|
||||||
self._running = True
|
self._running = True
|
||||||
@ -126,14 +128,17 @@ class DownloadManager(object):
|
|||||||
name = kwargs['suggestedFilename']
|
name = kwargs['suggestedFilename']
|
||||||
|
|
||||||
skip = False
|
skip = False
|
||||||
|
overwrite = None # 存在且重命名
|
||||||
goal_path = Path(settings.path) / name
|
goal_path = Path(settings.path) / name
|
||||||
if goal_path.exists():
|
if goal_path.exists():
|
||||||
if settings.when_file_exists == 'skip':
|
if settings.when_file_exists == 'skip':
|
||||||
skip = True
|
skip = True
|
||||||
elif settings.when_file_exists == 'overwrite':
|
elif settings.when_file_exists == 'overwrite':
|
||||||
goal_path.unlink()
|
overwrite = True # 存在且覆盖
|
||||||
|
else: # 不存在
|
||||||
|
overwrite = False
|
||||||
|
|
||||||
m = DownloadMission(self, tab_id, guid, settings.path, name, kwargs['url'], self._browser.download_path)
|
m = DownloadMission(self, tab_id, guid, settings.path, name, kwargs['url'], self._tmp_path, overwrite)
|
||||||
self._missions[guid] = m
|
self._missions[guid] = m
|
||||||
|
|
||||||
if self.get_flag(tab) is False: # 取消该任务
|
if self.get_flag(tab) is False: # 取消该任务
|
||||||
@ -155,13 +160,16 @@ class DownloadManager(object):
|
|||||||
|
|
||||||
elif kwargs['state'] == 'completed':
|
elif kwargs['state'] == 'completed':
|
||||||
if mission.state == 'skipped':
|
if mission.state == 'skipped':
|
||||||
Path(f'{mission.save_path}{sep}{mission.id}').unlink(True)
|
Path(f'{mission.tmp_path}{sep}{mission.id}').unlink(True)
|
||||||
self.set_done(mission, 'skipped')
|
self.set_done(mission, 'skipped')
|
||||||
return
|
return
|
||||||
mission.received_bytes = kwargs['receivedBytes']
|
mission.received_bytes = kwargs['receivedBytes']
|
||||||
mission.total_bytes = kwargs['totalBytes']
|
mission.total_bytes = kwargs['totalBytes']
|
||||||
form_path = f'{mission.save_path}{sep}{mission.id}'
|
form_path = f'{mission.tmp_path}{sep}{mission.id}'
|
||||||
to_path = str(get_usable_path(f'{mission.path}{sep}{mission.name}'))
|
if mission._overwrite is None:
|
||||||
|
to_path = str(get_usable_path(f'{mission.folder}{sep}{mission.name}'))
|
||||||
|
else:
|
||||||
|
to_path = f'{mission.folder}{sep}{mission.name}'
|
||||||
not_moved = True
|
not_moved = True
|
||||||
for _ in range(10):
|
for _ in range(10):
|
||||||
try:
|
try:
|
||||||
@ -204,19 +212,20 @@ class TabDownloadSettings(object):
|
|||||||
|
|
||||||
|
|
||||||
class DownloadMission(object):
|
class DownloadMission(object):
|
||||||
def __init__(self, mgr, tab_id, _id, path, name, url, save_path):
|
def __init__(self, mgr, tab_id, _id, folder, name, url, tmp_path, overwrite):
|
||||||
self._mgr = mgr
|
self._mgr = mgr
|
||||||
self.url = url
|
self.url = url
|
||||||
self.tab_id = tab_id
|
self.tab_id = tab_id
|
||||||
self.from_tab = None
|
self.from_tab = None
|
||||||
self.id = _id
|
self.id = _id
|
||||||
self.path = path
|
self.folder = folder
|
||||||
self.name = name
|
self.name = name
|
||||||
self.state = 'running'
|
self.state = 'running'
|
||||||
self.total_bytes = None
|
self.total_bytes = None
|
||||||
self.received_bytes = 0
|
self.received_bytes = 0
|
||||||
self.final_path = None
|
self.final_path = None
|
||||||
self.save_path = save_path
|
self.tmp_path = tmp_path
|
||||||
|
self._overwrite = overwrite
|
||||||
self._is_done = False
|
self._is_done = False
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -240,7 +249,7 @@ class DownloadMission(object):
|
|||||||
while self.name is None and perf_counter() < end_time:
|
while self.name is None and perf_counter() < end_time:
|
||||||
sleep(0.01)
|
sleep(0.01)
|
||||||
print(f'文件名:{self.name}')
|
print(f'文件名:{self.name}')
|
||||||
print(f'目标路径:{self.path}')
|
print(f'目录路径:{self.folder}')
|
||||||
|
|
||||||
if timeout is None:
|
if timeout is None:
|
||||||
while not self.is_done:
|
while not self.is_done:
|
||||||
@ -260,11 +269,16 @@ class DownloadMission(object):
|
|||||||
|
|
||||||
if show:
|
if show:
|
||||||
if self.state == 'completed':
|
if self.state == 'completed':
|
||||||
|
if self._overwrite is None:
|
||||||
|
print(f'完成并重命名 {self.final_path}')
|
||||||
|
elif self._overwrite is False:
|
||||||
print(f'下载完成 {self.final_path}')
|
print(f'下载完成 {self.final_path}')
|
||||||
|
else:
|
||||||
|
print(f'已覆盖 {self.final_path}')
|
||||||
elif self.state == 'canceled':
|
elif self.state == 'canceled':
|
||||||
print(f'下载取消')
|
print(f'下载取消')
|
||||||
elif self.state == 'skipped':
|
elif self.state == 'skipped':
|
||||||
print(f'已跳过')
|
print(f'已跳过 {self.folder}{sep}{self.name}')
|
||||||
print()
|
print()
|
||||||
|
|
||||||
return self.final_path if self.final_path else False
|
return self.final_path if self.final_path else False
|
||||||
|
@ -19,6 +19,7 @@ class DownloadManager(object):
|
|||||||
_tab_missions: dict = ...
|
_tab_missions: dict = ...
|
||||||
_flags: dict = ...
|
_flags: dict = ...
|
||||||
_running: bool = ...
|
_running: bool = ...
|
||||||
|
_tmp_path: str = ...
|
||||||
|
|
||||||
def __init__(self, browser: Chromium):
|
def __init__(self, browser: Chromium):
|
||||||
"""
|
"""
|
||||||
@ -145,31 +146,34 @@ class DownloadMission(object):
|
|||||||
_mgr: DownloadManager = ...
|
_mgr: DownloadManager = ...
|
||||||
url: str = ...
|
url: str = ...
|
||||||
id: str = ...
|
id: str = ...
|
||||||
path: str = ...
|
folder: str = ...
|
||||||
name: str = ...
|
name: str = ...
|
||||||
state: str = ...
|
state: str = ...
|
||||||
total_bytes: Optional[int] = ...
|
total_bytes: Optional[int] = ...
|
||||||
received_bytes: int = ...
|
received_bytes: int = ...
|
||||||
final_path: Optional[str] = ...
|
final_path: Optional[str] = ...
|
||||||
save_path: str = ...
|
tmp_path: str = ...
|
||||||
|
_overwrite: bool = ...
|
||||||
_is_done: bool = ...
|
_is_done: bool = ...
|
||||||
|
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
mgr: DownloadManager,
|
mgr: DownloadManager,
|
||||||
tab_id: str,
|
tab_id: str,
|
||||||
_id: str,
|
_id: str,
|
||||||
path: str,
|
folder: str,
|
||||||
name: str,
|
name: str,
|
||||||
url: str,
|
url: str,
|
||||||
save_path: str):
|
tmp_path: str,
|
||||||
|
overwrite:bool):
|
||||||
"""
|
"""
|
||||||
:param mgr: BrowserDownloadManager对象
|
:param mgr: BrowserDownloadManager对象
|
||||||
:param tab_id: 标签页id
|
:param tab_id: 标签页id
|
||||||
:param _id: 任务id
|
:param _id: 任务id
|
||||||
:param path: 最终保存路径
|
:param folder: 最终保存文件夹路径
|
||||||
:param name: 文件名
|
:param name: 文件名
|
||||||
:param url: url
|
:param url: url
|
||||||
:param save_path: 下载临时路径
|
:param tmp_path: 下载临时路径
|
||||||
|
:param overwrite: 是否已存在同名文件,None表示重命名
|
||||||
"""
|
"""
|
||||||
...
|
...
|
||||||
|
|
||||||
|
@ -271,9 +271,11 @@ class ChromiumPageSetter(TabSetter):
|
|||||||
self._owner._DownloadKit.set.save_path(path)
|
self._owner._DownloadKit.set.save_path(path)
|
||||||
|
|
||||||
def download_file_name(self, name=None, suffix=None):
|
def download_file_name(self, name=None, suffix=None):
|
||||||
# super().download_file_name(name=name, suffix=suffix)
|
|
||||||
self._owner.browser.set.download_file_name(name, suffix)
|
self._owner.browser.set.download_file_name(name, suffix)
|
||||||
|
|
||||||
|
def when_download_file_exists(self, mode):
|
||||||
|
self._owner.browser.set.when_download_file_exists(mode)
|
||||||
|
|
||||||
|
|
||||||
class WebPageSetter(ChromiumPageSetter):
|
class WebPageSetter(ChromiumPageSetter):
|
||||||
def __init__(self, owner):
|
def __init__(self, owner):
|
||||||
|
@ -24,7 +24,7 @@ def from_selenium(driver):
|
|||||||
address, port = driver.caps.get('goog:chromeOptions', {}).get('debuggerAddress', ':').split(':')
|
address, port = driver.caps.get('goog:chromeOptions', {}).get('debuggerAddress', ':').split(':')
|
||||||
if not address:
|
if not address:
|
||||||
raise RuntimeError('获取失败。')
|
raise RuntimeError('获取失败。')
|
||||||
co = ChromiumOptions().set_local_port(f'{address}:{port}')
|
co = ChromiumOptions().set_local_port(port)
|
||||||
co._ua_set = True
|
co._ua_set = True
|
||||||
return Chromium(co)
|
return Chromium(co)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user