rclone-api 1.4.4__tar.gz → 1.4.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rclone_api-1.4.4 → rclone_api-1.4.6}/PKG-INFO +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.6}/pyproject.toml +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/detail/copy_file_parts.py +15 -2
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/http_server.py +41 -27
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/PKG-INFO +1 -1
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.aiderignore +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/lint.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_macos.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_ubuntu.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.github/workflows/push_win.yml +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.gitignore +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.pylintrc +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/launch.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/settings.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/.vscode/tasks.json +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/LICENSE +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/MANIFEST.in +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/README.md +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/clean +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/install +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/lint +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/requirements.testing.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/setup.cfg +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/setup.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/__init__.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/assets/example.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cli.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/analyze.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/copy_large_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/list_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/cmd/save_to_db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/completed_process.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/config.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/convert.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/__init__.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/db/models.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/deprecated.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/detail/walk.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/diff.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/dir.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/dir_listing.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/exec.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/experimental/flags.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/experimental/flags_base.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_item.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_part.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/file_stream.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/filelist.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/group_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/log.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/mount.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/process.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/rclone_impl.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/remote.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/rpath.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/api.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/basic_ops.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/chunk_task.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/create.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/file_info.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/finished_piece.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/upload_info.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/multipart/upload_state.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/s3_multipart_uploader.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/types.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/s3/upload_file_multipart.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/scan_missing_folders.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/types.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api/util.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/SOURCES.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/dependency_links.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/entry_points.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/requires.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/src/rclone_api.egg-info/top_level.txt +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/test +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/archive/test_paramiko.py.disabled +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_cmd_list_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_bytes.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_file_resumable_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_copy_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_db.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_diff.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_file_item.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_group_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_is_synced.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_ls.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_ls_stream_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_mount.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_mount_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_obscure.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_rclone_config.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_read_write_text.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_remote_control.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_remotes.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_s3.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_scan_missing_folders.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_serve_http.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_size_files.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_size_suffix.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tests/test_walk.py +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/tox.ini +0 -0
- {rclone_api-1.4.4 → rclone_api-1.4.6}/upload_package.sh +0 -0
@@ -9,6 +9,7 @@ from dataclasses import dataclass
|
|
9
9
|
from datetime import datetime
|
10
10
|
from pathlib import Path
|
11
11
|
|
12
|
+
from rclone_api import rclone_verbose
|
12
13
|
from rclone_api.dir_listing import DirListing
|
13
14
|
from rclone_api.http_server import HttpServer
|
14
15
|
from rclone_api.rclone_impl import RcloneImpl
|
@@ -18,6 +19,8 @@ from rclone_api.types import (
|
|
18
19
|
SizeSuffix,
|
19
20
|
)
|
20
21
|
|
22
|
+
rclone_verbose(True)
|
23
|
+
|
21
24
|
|
22
25
|
@dataclass
|
23
26
|
class UploadPart:
|
@@ -46,6 +49,11 @@ def upload_task(self: RcloneImpl, upload_part: UploadPart) -> UploadPart:
|
|
46
49
|
try:
|
47
50
|
if upload_part.exception is not None:
|
48
51
|
return upload_part
|
52
|
+
# print(f"Uploading {upload_part.chunk} to {upload_part.dst_part}")
|
53
|
+
msg = "\n#########################################\n"
|
54
|
+
msg += f"# Uploading {upload_part.chunk} to {upload_part.dst_part}\n"
|
55
|
+
msg += "#########################################\n"
|
56
|
+
print
|
49
57
|
self.copy_to(upload_part.chunk.as_posix(), upload_part.dst_part)
|
50
58
|
return upload_part
|
51
59
|
except Exception as e:
|
@@ -285,6 +293,10 @@ def copy_file_parts(
|
|
285
293
|
all_numbers_already_done: set[int] = set(
|
286
294
|
info_json.fetch_all_finished_part_numbers()
|
287
295
|
)
|
296
|
+
|
297
|
+
first_part_number = part_infos[0].part_number
|
298
|
+
last_part_number = part_infos[-1].part_number
|
299
|
+
|
288
300
|
print(f"all_numbers_already_done: {sorted(list(all_numbers_already_done))}")
|
289
301
|
|
290
302
|
filtered_part_infos: list[PartInfo] = []
|
@@ -301,8 +313,9 @@ def copy_file_parts(
|
|
301
313
|
chunk_size = SizeSuffix(part_infos[0].range.end - part_infos[0].range.start)
|
302
314
|
|
303
315
|
info_json.chunksize = chunk_size
|
304
|
-
|
305
|
-
info_json.
|
316
|
+
|
317
|
+
info_json.first_part = first_part_number
|
318
|
+
info_json.last_part = last_part_number
|
306
319
|
info_json.save()
|
307
320
|
|
308
321
|
# We are now validated
|
@@ -3,6 +3,7 @@ Unit test file for testing rclone mount functionality.
|
|
3
3
|
"""
|
4
4
|
|
5
5
|
import tempfile
|
6
|
+
import time
|
6
7
|
import warnings
|
7
8
|
from concurrent.futures import Future, ThreadPoolExecutor
|
8
9
|
from pathlib import Path
|
@@ -63,33 +64,46 @@ class HttpServer:
|
|
63
64
|
self, path: str, dst: Path, range: Range | None = None
|
64
65
|
) -> Path | Exception:
|
65
66
|
"""Get bytes from the server."""
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
67
|
+
|
68
|
+
def task() -> Path | Exception:
|
69
|
+
|
70
|
+
if not dst.parent.exists():
|
71
|
+
dst.parent.mkdir(parents=True, exist_ok=True)
|
72
|
+
headers: dict[str, str] = {}
|
73
|
+
if range:
|
74
|
+
headers.update(range.to_header())
|
75
|
+
url = self._get_file_url(path)
|
76
|
+
try:
|
77
|
+
with httpx.stream(
|
78
|
+
"GET", url, headers=headers, timeout=_TIMEOUT
|
79
|
+
) as response:
|
80
|
+
response.raise_for_status()
|
81
|
+
with open(dst, "wb") as file:
|
82
|
+
for chunk in response.iter_bytes(chunk_size=8192):
|
83
|
+
if chunk:
|
84
|
+
file.write(chunk)
|
85
|
+
else:
|
86
|
+
assert response.is_closed
|
87
|
+
# print(f"Downloaded bytes {start}-{end} to {dst}")
|
88
|
+
if range:
|
89
|
+
print(f"Downloaded bytes {range.start}-{range.end} to {dst}")
|
90
|
+
else:
|
91
|
+
size = dst.stat().st_size
|
92
|
+
print(f"Downloaded {size} bytes to {dst}")
|
93
|
+
return dst
|
94
|
+
except Exception as e:
|
95
|
+
warnings.warn(f"Failed to download {url} to {dst}: {e}")
|
96
|
+
return e
|
97
|
+
|
98
|
+
retries = 3
|
99
|
+
for i in _range(retries):
|
100
|
+
out = task()
|
101
|
+
if not isinstance(out, Exception):
|
102
|
+
return out
|
103
|
+
warnings.warn(f"Failed to download {path} to {dst}: {out}, retrying ({i})")
|
104
|
+
time.sleep(10)
|
105
|
+
else:
|
106
|
+
return Exception(f"Failed to download {path} to {dst}")
|
93
107
|
|
94
108
|
def download_multi_threaded(
|
95
109
|
self,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|